LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGRlZmluZXMgaGFuZGxpbmcgcm91dGluZXMgZm9yIHRoZSBwcml2YXRlIElPQ1RMcwogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBTT0ZUV0FSRSBMSUNFTlNFCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAogKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCiAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCiAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIERpc2NsYWltZXIKICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQogKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgogKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAogKiBEQU1BR0UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBpbmNsdWRlIGZpbGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlIDx3bF92ZXJzaW9uLmg+CgojaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgoKI2luY2x1ZGUgPGRlYnVnLmg+CiNpbmNsdWRlIDxoY2YuaD4KI2luY2x1ZGUgPGhjZmRlZi5oPgoKI2luY2x1ZGUgPHdsX2lmLmg+CiNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgojaW5jbHVkZSA8d2xfZW5jLmg+CiNpbmNsdWRlIDx3bF9tYWluLmg+CiNpbmNsdWRlIDx3bF9wcml2Lmg+CiNpbmNsdWRlIDx3bF91dGlsLmg+CiNpbmNsdWRlIDx3bF9uZXRkZXYuaD4KCmludCB3dmxhbl91aWxfY29ubmVjdCggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKaW50IHd2bGFuX3VpbF9kaXNjb25uZWN0KCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwppbnQgd3ZsYW5fdWlsX2FjdGlvbiggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKaW50IHd2bGFuX3VpbF9ibG9jayggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKaW50IHd2bGFuX3VpbF91bmJsb2NrKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwppbnQgd3ZsYW5fdWlsX3NlbmRfZGlhZ19tc2coIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CmludCB3dmxhbl91aWxfcHV0X2luZm8oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CmludCB3dmxhbl91aWxfZ2V0X2luZm8oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CgppbnQgY2ZnX2RyaXZlcl9pbmZvKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwppbnQgY2ZnX2RyaXZlcl9pZGVudGl0eSggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBnbG9iYWwgdmFyaWFibGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZiBEQkcKZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CiNlbmRpZiAgLy8gREJHCgoKCgovKiBJZiBVU0VfVUlMIGlzIG5vdCBkZWZpbmVkLCB0aGVuIG5vbmUgb2YgdGhlIFVJTCBJbnRlcmZhY2UgY29kZSBiZWxvdyB3aWxsCiAgIGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZCAqLwojaWZkZWYgVVNFX1VJTAoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd3ZsYW5fdWlsKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIGZvciB0aGUgVUlMIGludGVyZmFjZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3dmxhbl91aWwoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50IGlvY3RsX3JldCA9IDA7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoJREJHX0ZVTkMoICJ3dmxhbl91aWwiICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCglzd2l0Y2goIHVycS0+Y29tbWFuZCApIHsKCSAgY2FzZSBVSUxfRlVOX0NPTk5FQ1Q6CgkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1VJTCAtLSBXVkxBTjJfVUlMX0NPTk5FQ1RcbiIpOwoJCWlvY3RsX3JldCA9IHd2bGFuX3VpbF9jb25uZWN0KCB1cnEsIGxwICk7CgkJYnJlYWs7CgkgIGNhc2UgVUlMX0ZVTl9ESVNDT05ORUNUOgoJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUwgLS0gV1ZMQU4yX1VJTF9ESVNDT05ORUNUXG4iKTsKCQlpb2N0bF9yZXQgPSB3dmxhbl91aWxfZGlzY29ubmVjdCggdXJxLCBscCApOwoJCWJyZWFrOwoJICBjYXNlIFVJTF9GVU5fQUNUSU9OOgoJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUwgLS0gV1ZMQU4yX1VJTF9BQ1RJT05cbiIgKTsKCQlpb2N0bF9yZXQgPSB3dmxhbl91aWxfYWN0aW9uKCB1cnEsIGxwICk7CgkJYnJlYWs7CgkgIGNhc2UgVUlMX0ZVTl9TRU5EX0RJQUdfTVNHOgoJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUwgLS0gV1ZMQU4yX1VJTF9TRU5EX0RJQUdfTVNHXG4iKTsKCQlpb2N0bF9yZXQgPSB3dmxhbl91aWxfc2VuZF9kaWFnX21zZyggdXJxLCBscCApOwoJCWJyZWFrOwoJICBjYXNlIFVJTF9GVU5fR0VUX0lORk86CgkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1VJTCAtLSBXVkxBTjJfVUlMX0dFVF9JTkZPXG4iKTsKCQlpb2N0bF9yZXQgPSB3dmxhbl91aWxfZ2V0X2luZm8oIHVycSwgbHAgKTsKCQlicmVhazsKCSAgY2FzZSBVSUxfRlVOX1BVVF9JTkZPOgoJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUwgLS0gV1ZMQU4yX1VJTF9QVVRfSU5GT1xuIik7CgkJaW9jdGxfcmV0ID0gd3ZsYW5fdWlsX3B1dF9pbmZvKCB1cnEsIGxwICk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUwgLS0gVU5TVVBQT1JURUQgVUlMIENPREU6IDB4JVgiLCB1cnEtPmNvbW1hbmQgKTsKCQlpb2N0bF9yZXQgPSAtRU9QTk9UU1VQUDsKCQlicmVhazsKCX0KCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIGlvY3RsX3JldDsKfSAvLyB3dmxhbl91aWwKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXd2bGFuX3VpbF9jb25uZWN0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENvbm5lY3QgdG8gdGhlIFVJTCBpbiBvcmRlciB0byBtYWtlIGEgcmVxdWVzdC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgVUlMX1NVQ0NFU1MKICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHd2bGFuX3VpbF9jb25uZWN0KCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKCWludCByZXN1bHQgPSAwOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglEQkdfRlVOQyggInd2bGFuX3VpbF9jb25uZWN0IiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoKCWlmKCAhKCBscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0NPTk5FQ1RFRCApKSB7CgkJbHAtPmZsYWdzIHw9IFdWTEFOMl9VSUxfQ09OTkVDVEVEOwoJCXVycS0+aGNmQ3R4ID0gJiggbHAtPmhjZkN0eCApOwoJCXVycS0+cmVzdWx0ID0gVUlMX1NVQ0NFU1M7Cgl9IGVsc2UgewoJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiVUlMX0VSUl9JTl9VU0VcbiIgKTsKCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfSU5fVVNFOwoJfQoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIHJlc3VsdDsKfSAvLyB3dmxhbl91aWxfY29ubmVjdAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd3ZsYW5fdWlsX2Rpc2Nvbm5lY3QoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgRGlzb25uZWN0IGZyb20gdGhlIFVJTCBhZnRlciBhIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBVSUxfU1VDQ0VTUwogKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd3ZsYW5fdWlsX2Rpc2Nvbm5lY3QoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50IHJlc3VsdCA9IDA7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCURCR19GVU5DKCAid3ZsYW5fdWlsX2Rpc2Nvbm5lY3QiICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCgoJaWYoIHVycS0+aGNmQ3R4ID09ICYoIGxwLT5oY2ZDdHggKSkgewoJCWlmIChscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0NPTk5FQ1RFRCkgewoJCQlscC0+ZmxhZ3MgJj0gfldWTEFOMl9VSUxfQ09OTkVDVEVEOwoJCQkvKgoJCQlpZiAobHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZKSB7CgkJCQlscC0+ZmxhZ3MgJj0gfldWTEFOMl9VSUxfQlVTWTsKCQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGxwLT5kZXYpOwoJCQl9CgkJCSovCgkJfQoKCQl1cnEtPmhjZkN0eCA9IE5VTEw7CgkJdXJxLT5yZXN1bHQgPSBVSUxfU1VDQ0VTUzsKCX0gZWxzZSB7CgkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9XUk9OR19JRkJcbiIgKTsKCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfV1JPTkdfSUZCOwoJfQoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIHJlc3VsdDsKfSAvLyB3dmxhbl91aWxfZGlzY29ubmVjdAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd3ZsYW5fdWlsX2FjdGlvbigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBIYW5kbGVyIGZvciB0aGUgVUlMX0FDVF94eHggc3ViY29kZXMgYXNzb2NpYXRlZCB3aXRoIFVJTF9GVU5fQUNUSU9OCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIFVJTF9TVUNDRVNTCiAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3dmxhbl91aWxfYWN0aW9uKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKCWludCAgICAgcmVzdWx0ID0gMDsKCWx0dl90ICAgKmx0djsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJREJHX0ZVTkMoICJ3dmxhbl91aWxfYWN0aW9uIiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoKCWlmKCB1cnEtPmhjZkN0eCA9PSAmKCBscC0+aGNmQ3R4ICkpIHsKCQkvKiBNYWtlIHN1cmUgdGhlcmUncyBhbiBMVFYgaW4gdGhlIHJlcXVlc3QgYnVmZmVyICovCgkJbHR2ID0gKGx0dl90ICopdXJxLT5kYXRhOwoJCWlmKCBsdHYgIT0gTlVMTCApIHsKCQkJLyogU3dpdGNoIG9uIHRoZSBUeXBlIGZpZWxkIG9mIHRoZSBMVFYgY29udGFpbmVkIGluIHRoZSByZXF1ZXN0CgkJCSAgIGJ1ZmZlciAqLwoJCQlzd2l0Y2goIGx0di0+dHlwICkgewoJCQljYXNlIFVJTF9BQ1RfQkxPQ0s6CgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJVSUxfQUNUX0JMT0NLXG4iICk7CgkJCQlyZXN1bHQgPSB3dmxhbl91aWxfYmxvY2soIHVycSwgbHAgKTsKCQkJCWJyZWFrOwoJCQljYXNlIFVJTF9BQ1RfVU5CTE9DSzoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlVJTF9BQ1RfVU5CTE9DS1xuIiApOwoJCQkJcmVzdWx0ID0gd3ZsYW5fdWlsX3VuYmxvY2soIHVycSwgbHAgKTsKCQkJCWJyZWFrOwoJCQljYXNlIFVJTF9BQ1RfU0NBTjoKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlVJTF9BQ1RfU0NBTlxuIiApOwoJCQkJdXJxLT5yZXN1bHQgPSBoY2ZfYWN0aW9uKCAmKCBscC0+aGNmQ3R4ICksIE1ERF9BQ1RfU0NBTiApOwoJCQkJYnJlYWs7CgkJCWNhc2UgVUlMX0FDVF9BUFBMWToKCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlVJTF9BQ1RfQVBQTFlcbiIgKTsKCQkJCXVycS0+cmVzdWx0ID0gd2xfYXBwbHkoIGxwICk7CgkJCQlicmVhazsKCQkJY2FzZSBVSUxfQUNUX1JFU0VUOgoJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiVUlMX0FDVF9SRVNFVFxuIiApOwoJCQkJdXJxLT5yZXN1bHQgPSB3bF9nbyggbHAgKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJVbmtub3duIGFjdGlvbiBjb2RlOiAweCV4XG4iLCBsdHYtPnR5cCApOwoJCQkJYnJlYWs7CgkJCX0KCQl9IGVsc2UgewoJCQlEQkdfRVJST1IoIERiZ0luZm8sICJCYWQgTFRWIGZvciB0aGlzIGFjdGlvblxuIiApOwoJCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOwoJCX0KCX0gZWxzZSB7CgkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9XUk9OR19JRkJcbiIgKTsKCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfV1JPTkdfSUZCOwoJfQoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIHJlc3VsdDsKfSAvLyB3dmxhbl91aWxfYWN0aW9uCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3dmxhbl91aWxfYmxvY2soKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgU2V0cyBhIGJsb2NrIGluIHRoZSBkcml2ZXIgdG8gcHJldmVudCBhY2Nlc3MgdG8gdGhlIGNhcmQgYnkgb3RoZXIKICogIHByb2Nlc3Nlcy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgVUlMX1NVQ0NFU1MKICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmludCB3dmxhbl91aWxfYmxvY2soIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50IHJlc3VsdCA9IDA7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCURCR19GVU5DKCAid3ZsYW5fdWlsX2Jsb2NrIiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJaWYoIHVycS0+aGNmQ3R4ID09ICYoIGxwLT5oY2ZDdHggKSkgewoJCWlmKCBjYXBhYmxlKCBDQVBfTkVUX0FETUlOICkpIHsKCQkJbHAtPmZsYWdzIHw9IFdWTEFOMl9VSUxfQlVTWTsKCQkJbmV0aWZfc3RvcF9xdWV1ZShscC0+ZGV2KTsKCQkJV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7CgkJCXVycS0+cmVzdWx0ID0gVUlMX1NVQ0NFU1M7CgkJfSBlbHNlIHsKCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiRVBFUk1cbiIgKTsKCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKCQkJcmVzdWx0ID0gLUVQRVJNOwoJCX0KCX0gZWxzZSB7CgkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9XUk9OR19JRkJcbiIgKTsKCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfV1JPTkdfSUZCOwoJfQoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIHJlc3VsdDsKfSAvLyB3dmxhbl91aWxfYmxvY2sKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXd2bGFuX3VpbF91bmJsb2NrKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFVuYmxvY2tzIHRoZSBkcml2ZXIgdG8gcmVzdG9yZSBhY2Nlc3MgdG8gdGhlIGNhcmQgYnkgb3RoZXIgcHJvY2Vzc2VzLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBVSUxfU1VDQ0VTUwogKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd3ZsYW5fdWlsX3VuYmxvY2soIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50IHJlc3VsdCA9IDA7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCURCR19GVU5DKCAid3ZsYW5fdWlsX3VuYmxvY2siICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCglpZiggdXJxLT5oY2ZDdHggPT0gJiggbHAtPmhjZkN0eCApKSB7CgkJaWYoIGNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgewoJCQlpZiAobHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZKSB7CgkJCQlscC0+ZmxhZ3MgJj0gfldWTEFOMl9VSUxfQlVTWTsKCQkJCW5ldGlmX3dha2VfcXVldWUobHAtPmRldik7CgkJCQlXTF9XRFNfTkVUSUZfV0FLRV9RVUVVRSggbHAgKTsKCQkJfQoJCX0gZWxzZSB7CgkJCURCR19FUlJPUiggRGJnSW5mbywgIkVQRVJNXG4iICk7CgkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CgkJCXJlc3VsdCA9IC1FUEVSTTsKCQl9Cgl9IGVsc2UgewoJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfV1JPTkdfSUZCXG4iICk7CgkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX1dST05HX0lGQjsKCX0KCglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybiByZXN1bHQ7Cn0gLy8gd3ZsYW5fdWlsX3VuYmxvY2sKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXd2bGFuX3VpbF9zZW5kX2RpYWdfbXNnKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFNlbmRzIGEgZGlhZ25vc3RpYyBtZXNzYWdlIHRvIHRoZSBjYXJkLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBVSUxfU1VDQ0VTUwogKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd3ZsYW5fdWlsX3NlbmRfZGlhZ19tc2coIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50ICAgICAgICAgcmVzdWx0ID0gMDsKCURFU0NfU1RSQ1QgIERlc2NwWzFdOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglEQkdfRlVOQyggInd2bGFuX3VpbF9zZW5kX2RpYWdfbXNnIiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJaWYoIHVycS0+aGNmQ3R4ID09ICYoIGxwLT5oY2ZDdHggKSkgewoJCWlmKCBjYXBhYmxlKCBDQVBfTkVUX0FETUlOICkpIHsKCQkJaWYgKCh1cnEtPmRhdGEgIT0gTlVMTCkgJiYgKHVycS0+bGVuICE9IDApKSB7CgkJCQlpZiAobHAtPmhjZkN0eC5JRkJfUnNjSW5kICE9IDApIHsKCQkJCQl1X2NoYXIgKmRhdGE7CgoJCQkJCS8vIFZlcmlmeSB0aGUgdXNlciBidWZmZXIKCQkJCQlyZXN1bHQgPSB2ZXJpZnlfYXJlYShWRVJJRllfUkVBRCwgdXJxLT5kYXRhLCB1cnEtPmxlbik7CgkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7CgkJCQkJCURCR19FUlJPUiggRGJnSW5mbywgInZlcmlmeV9hcmVhIGZhaWxlZCwgcmVzdWx0OiAlZFxuIiwgcmVzdWx0ICk7CgkJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CgkJCQkJCURCR19MRUFWRSggRGJnSW5mbyApOwoJCQkJCQlyZXR1cm4gcmVzdWx0OwoJCQkJCX0KCgkJCQkJZGF0YSA9IGttYWxsb2ModXJxLT5sZW4sIEdGUF9LRVJORUwpOwoJCQkJCWlmIChkYXRhICE9IE5VTEwpIHsKCQkJCQkJbWVtc2V0KCBEZXNjcCwgMCwgc2l6ZW9mKCBERVNDX1NUUkNUICkpOwoJCQkJCQltZW1jcHkoIGRhdGEsIHVycS0+ZGF0YSwgdXJxLT5sZW4gKTsKCgkJCQkJCURlc2NwWzBdLmJ1Zl9hZGRyICAgICAgID0gKHdjaV9idWZwKWRhdGE7CgkJCQkJCURlc2NwWzBdLkJVRl9DTlQgICAgICAgID0gdXJxLT5sZW47CgkJCQkJCURlc2NwWzBdLm5leHRfZGVzY19hZGRyID0gMDsgICAgLy8gdGVybWluYXRlIGxpc3QKCgkJCQkJCWhjZl9zZW5kX21zZyggJihscC0+aGNmQ3R4KSwgICZEZXNjcFswXSwgSENGX1BPUlRfMCApOwoJCQkJCQlrZnJlZSggZGF0YSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCURCR19FUlJPUiggRGJnSW5mbywgIkVOT01FTVxuIiApOwoJCQkJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOwoJCQkJCQlyZXN1bHQgPSAtRU5PTUVNOwoJCQkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKCQkJCQkJcmV0dXJuIHJlc3VsdDsKCQkJCQl9CgoJCQkJfSBlbHNlIHsKCQkJCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfQlVTWTsKCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOwoJCQl9CgkJfSBlbHNlIHsKCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiRVBFUk1cbiIgKTsKCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKCQkJcmVzdWx0ID0gLUVQRVJNOwoJCX0KCX0gZWxzZSB7CgkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9XUk9OR19JRkJcbiIgKTsKCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfV1JPTkdfSUZCOwoJfQoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIHJlc3VsdDsKfSAvLyB3dmxhbl91aWxfc2VuZF9kaWFnX21zZwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXd2bGFuX3VpbF9wdXRfaW5mbygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBTZW5kcyBhIHNwZWNpZmljIFJJRCBkaXJlY3RseSB0byB0aGUgZHJpdmVyIHRvIHNldCBjb25maWd1cmF0aW9uIGluZm8uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIFVJTF9TVUNDRVNTCiAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3dmxhbl91aWxfcHV0X2luZm8oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewoJaW50ICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKCWx0dl90ICAgICAgICAgICAgICAgICAgICpwTHR2OwoJYm9vbF90ICAgICAgICAgICAgICAgICAgbHR2QWxsb2NhdGVkID0gRkFMU0U7CglFTkNTVFJDVCAgICAgICAgICAgICAgICBzRW5jcnlwdGlvbjsKCiNpZmRlZiBVU0VfV0RTCgloY2ZfMTYgICAgICAgICAgICAgICAgICBoY2ZQb3J0ICA9IEhDRl9QT1JUXzA7CiNlbmRpZiAgLyogVVNFX1dEUyAqLwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJREJHX0ZVTkMoICJ3dmxhbl91aWxfcHV0X2luZm8iICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCgoJaWYoIHVycS0+aGNmQ3R4ID09ICYoIGxwLT5oY2ZDdHggKSkgewoJCWlmKCBjYXBhYmxlKCBDQVBfTkVUX0FETUlOICkpIHsKCQkJaWYoKCB1cnEtPmRhdGEgIT0gTlVMTCApICYmICggdXJxLT5sZW4gIT0gMCApKSB7CgkJCQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGF0IGxlYXN0IGEgY29tbWFuZCBhbmQgbGVuZ3RoIHRvIHNlbmQuICovCgkJCQlpZiggdXJxLT5sZW4gPCAoIHNpemVvZiggaGNmXzE2ICkgKiAyICkpIHsKCQkJCQl1cnEtPmxlbiA9IHNpemVvZiggbHAtPmx0dlJlY29yZCApOwoJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9MRU47CgkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiTm8gTGVuZ3RoL1R5cGUgaW4gTFRWISEhXG4iICk7CgkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9MRU5cbiIgKTsKCQkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKCQkJCQlyZXR1cm4gcmVzdWx0OwoJCQkJfQoKCQkJCS8qIFZlcmlmeSB0aGUgdXNlciBidWZmZXIgKi8KCQkJCXJlc3VsdCA9IHZlcmlmeV9hcmVhKCBWRVJJRllfUkVBRCwgdXJxLT5kYXRhLCB1cnEtPmxlbiApOwoJCQkJaWYoIHJlc3VsdCAhPSAwICkgewoJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CgkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAidmVyaWZ5X2FyZWEoKSwgVkVSSUZZX1JFQUQgRkFJTEVEXG4iICk7CgkJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CgkJCQkJcmV0dXJuIHJlc3VsdDsKCQkJCX0KCgkJCQkvKiBHZXQgb25seSB0aGUgY29tbWFuZCBhbmQgbGVuZ3RoIGluZm9ybWF0aW9uLiAqLwoJCQkJY29weV9mcm9tX3VzZXIoICYoIGxwLT5sdHZSZWNvcmQgKSwgdXJxLT5kYXRhLCBzaXplb2YoIGhjZl8xNiApICogMiApOwoKCQkJCS8qIE1ha2Ugc3VyZSB0aGUgaW5jb21pbmcgTFRWIHJlY29yZCBsZW5ndGggaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlCgkJCQkgICBJT0NUTCBsZW5ndGggKi8KCQkJCWlmKCgoIGxwLT5sdHZSZWNvcmQubGVuICsgMSApICogc2l6ZW9mKCBoY2ZfMTYgKSkgPiB1cnEtPmxlbiApIHsKCQkJCQl1cnEtPmxlbiA9IHNpemVvZiggbHAtPmx0dlJlY29yZCApOwoJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9MRU47CgkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9MRU5cbiIgKTsKCQkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKCQkJCQlyZXR1cm4gcmVzdWx0OwoJCQkJfQoKCQkJCS8qIElmIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiBvdXIgbG9jYWwKCQkJCSAgIExUViByZWNvcmQsIHRyeSB0byBhbGxvY2F0ZSBpdCBmcm9tIHRoZSBrZXJuZWwgc3RhY2suCgkJCQkgICBPdGhlcndpc2UsIHdlIGp1c3QgdXNlIG91ciBsb2NhbCBMVFYgcmVjb3JkLiAqLwoJCQkJaWYoIHVycS0+bGVuID4gc2l6ZW9mKCBscC0+bHR2UmVjb3JkICkpIHsKCQkJCQlwTHR2ID0ga21hbGxvYyh1cnEtPmxlbiwgR0ZQX0tFUk5FTCk7CgkJCQkJaWYgKHBMdHYgIT0gTlVMTCkgewoJCQkJCQlsdHZBbGxvY2F0ZWQgPSBUUlVFOwoJCQkJCX0gZWxzZSB7CgkJCQkJCURCR19FUlJPUiggRGJnSW5mbywgIkFsbG9jIEZBSUxFRFxuIiApOwoJCQkJCQl1cnEtPmxlbiA9IHNpemVvZiggbHAtPmx0dlJlY29yZCApOwoJCQkJCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOwoJCQkJCQlyZXN1bHQgPSAtRU5PTUVNOwoJCQkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKCQkJCQkJcmV0dXJuIHJlc3VsdDsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCXBMdHYgPSAmKCBscC0+bHR2UmVjb3JkICk7CgkJCQl9CgoJCQkJLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSB1c2VyJ3MgYnVmZmVyIGludG8gdGhlIGxvY2FsIExUVgoJCQkJICAgcmVjb3JkIGRhdGEgYXJlYS4gKi8KCQkJCWNvcHlfZnJvbV91c2VyKCBwTHR2LCB1cnEtPmRhdGEsIHVycS0+bGVuICk7CgoKCQkJCS8qIFdlIG5lZWQgdG8gc25vb3AgdGhlIGNvbW1hbmRzIHRvIHNlZSBpZiB0aGVyZSBpcyBhbnl0aGluZyB3ZQoJCQkJICAgbmVlZCB0byBzdG9yZSBmb3IgdGhlIHB1cnBvc2VzIG9mIGEgcmVzZXQgb3Igc3RhcnQvc3RvcAoJCQkJICAgc2VxdWVuY2UuIFBlcmZvcm0gZW5kaWFuIHRyYW5zbGF0aW9uIGFzIG5lZWRlZCAqLwoJCQkJc3dpdGNoKCBwTHR2LT50eXAgKSB7CgkJCQljYXNlIENGR19DTkZfUE9SVF9UWVBFOgoJCQkJCWxwLT5Qb3J0VHlwZSAgICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfQ05GX09XTl9NQUNfQUREUjoKCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMgKi8KCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0NORl9PV05fQ0hBTk5FTDoKCQkJCQlscC0+Q2hhbm5lbCAgICAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQlicmVhazsKCQkJCS8qIENGR19DTkZfT1dOX1NTSUQgY3VycmVudGx5IHNhbWUgYXMgQ05GX0RFU0lSRURfU1NJRC4gRG8gd2UKCQkJCSAgIG5lZWQgc2VwYXJhdGUgc3RvcmFnZSBmb3IgdGhpcz8gKi8KCQkJCS8vY2FzZSBDRkdfQ05GX09XTl9TU0lEOgoJCQkJY2FzZSBDRkdfQ05GX09XTl9BVElNX1dJTkRPVzoKCQkJCQlscC0+YXRpbVdpbmRvdyAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0NORl9TWVNURU1fU0NBTEU6CgkJCQkJbHAtPkRpc3RhbmNlQmV0d2VlbkFQcyAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoKCQkJCWNhc2UgQ0ZHX0NORl9NQVhfREFUQV9MRU46CgkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZAoJCQkJCSAgIG9uIHRoaXMgKi8KCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0NORl9QTV9FTkFCTEVEOgoJCQkJCWxwLT5QTUVuYWJsZWQgICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfQ05GX01DQVNUX1JYOgoJCQkJCWxwLT5NdWx0aWNhc3RSZWNlaXZlICAgID0gcEx0di0+dS51MTZbMF07CgkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0NORl9NQVhfU0xFRVBfRFVSQVRJT046CgkJCQkJbHAtPk1heFNsZWVwRHVyYXRpb24gICAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfQ05GX0hPTERPVkVSX0RVUkFUSU9OOgoJCQkJCWxwLT5ob2xkb3ZlckR1cmF0aW9uICAgID0gcEx0di0+dS51MTZbMF07CgkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0NORl9PV05fTkFNRToKCQkJCQltZW1zZXQoIGxwLT5TdGF0aW9uTmFtZSwgMCwgc2l6ZW9mKCBscC0+U3RhdGlvbk5hbWUgKSk7CgkJCQkJbWVtY3B5KCAodm9pZCAqKWxwLT5TdGF0aW9uTmFtZSwgKHZvaWQgKikmcEx0di0+dS51OFsyXSwgKHNpemVfdClwTHR2LT51LnUxNlswXSk7CgkJCQkJcEx0di0+dS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0NORl9MT0FEX0JBTEFOQ0lORzoKCQkJCQlscC0+bG9hZEJhbGFuY2luZyAgICAgICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19DTkZfTUVESVVNX0RJU1RSSUJVVElPTjoKCQkJCQlscC0+bWVkaXVtRGlzdHJpYnV0aW9uICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJYnJlYWs7CiNpZmRlZiBXQVJQCgkJCQljYXNlIENGR19DTkZfVFhfUE9XX0xWTDoKCQkJCQlscC0+dHhQb3dMZXZlbCAgICAgICAgICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJYnJlYWs7CgkJCQkvL2Nhc2UgQ0ZHX0NORl9TSE9SVF9SRVRSWV9MSU1JVDogICAgLy8gU2hvcnQgUmV0cnkgTGltaXQKCQkJCS8vY2FzZSAweEZDMzM6ICAgIC8vIExvbmcgUmV0cnkgTGltaXQKCQkJCWNhc2UgQ0ZHX1NVUFBPUlRFRF9SQVRFX1NFVF9DTlRMOiAgICAgICAgLy8gU3VwcG9ydGVkIFJhdGUgU2V0IENvbnRyb2wKCQkJCQlscC0+c3JzY1swXSAgICAgICAgICAgICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCWxwLT5zcnNjWzFdICAgICAgICAgICAgID0gcEx0di0+dS51MTZbMV07CgkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQlwTHR2LT51LnUxNlsxXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlsxXSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfQkFTSUNfUkFURV9TRVRfQ05UTDogICAgICAgIC8vIEJhc2ljIFJhdGUgU2V0IENvbnRyb2wKCQkJCQlscC0+YnJzY1swXSAgICAgICAgICAgICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCWxwLT5icnNjWzFdICAgICAgICAgICAgID0gcEx0di0+dS51MTZbMV07CgkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQlwTHR2LT51LnUxNlsxXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlsxXSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfQ05GX0NPTk5FQ1RJT05fQ05UTDoKCQkJCQlscC0+Y29ubmVjdGlvbkNvbnRyb2wgICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJYnJlYWs7CgkJCQkvL2Nhc2UgQ0ZHX1BST0JFX0RBVEFfUkFURToKI2VuZGlmICAvLyBIRVJNRVMyNQoKI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKCgkJCQljYXNlIENGR19DTkZfT1dOX0RUSU1fUEVSSU9EOgoJCQkJCWxwLT5EVElNUGVyaW9kICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWJyZWFrOwojaWZkZWYgV0FSUAoJCQkJY2FzZSBDRkdfQ05GX09XTl9CRUFDT05fSU5URVJWQUw6ICAgICAgICAvLyBPd24gQmVhY29uIEludGVydmFsCgkJCQkJbHAtPm93bkJlYWNvbkludGVydmFsICAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWJyZWFrOwojZW5kaWYgLy8gV0FSUAoJCQkJY2FzZSBDRkdfQ09FWElTVEVOU0VfQkVIQVZJT1VSOiAgICAgICAgIC8vIENvZXhpc3RlbmNlIGJlaGF2aW9yCgkJCQkJbHAtPmNvZXhpc3RlbmNlICAgICAgICAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWJyZWFrOwojaWZkZWYgVVNFX1dEUwoJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSMToKCQkJCQltZW1jcHkoICZscC0+d2RzX3BvcnRbMF0ud2RzQWRkcmVzcywgJnBMdHYtPnUudThbMF0sIEVUSF9BTEVOICk7CgkJCQkJaGNmUG9ydCA9IEhDRl9QT1JUXzE7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19DTkZfV0RTX0FERFIyOgoJCQkJCW1lbWNweSggJmxwLT53ZHNfcG9ydFsxXS53ZHNBZGRyZXNzLCAmcEx0di0+dS51OFswXSwgRVRIX0FMRU4gKTsKCQkJCQloY2ZQb3J0ID0gSENGX1BPUlRfMjsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjM6CgkJCQkJbWVtY3B5KCAmbHAtPndkc19wb3J0WzJdLndkc0FkZHJlc3MsICZwTHR2LT51LnU4WzBdLCBFVEhfQUxFTiApOwoJCQkJCWhjZlBvcnQgPSBIQ0ZfUE9SVF8zOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSNDoKCQkJCQltZW1jcHkoICZscC0+d2RzX3BvcnRbM10ud2RzQWRkcmVzcywgJnBMdHYtPnUudThbMF0sIEVUSF9BTEVOICk7CgkJCQkJaGNmUG9ydCA9IEhDRl9QT1JUXzQ7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19DTkZfV0RTX0FERFI1OgoJCQkJCW1lbWNweSggJmxwLT53ZHNfcG9ydFs0XS53ZHNBZGRyZXNzLCAmcEx0di0+dS51OFswXSwgRVRIX0FMRU4gKTsKCQkJCQloY2ZQb3J0ID0gSENGX1BPUlRfNTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjY6CgkJCQkJbWVtY3B5KCAmbHAtPndkc19wb3J0WzVdLndkc0FkZHJlc3MsICZwTHR2LT51LnU4WzBdLCBFVEhfQUxFTiApOwoJCQkJCWhjZlBvcnQgPSBIQ0ZfUE9SVF82OwoJCQkJCWJyZWFrOwojZW5kaWYgIC8qIFVTRV9XRFMgKi8KCgkJCQljYXNlIENGR19DTkZfTUNBU1RfUE1fQlVGOgoJCQkJCWxwLT5tdWx0aWNhc3RQTUJ1ZmZlcmluZyAgICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfQ05GX1JFSkVDVF9BTlk6CgkJCQkJbHAtPlJlamVjdEFueSAgID0gcEx0di0+dS51MTZbMF07CgkJCQkJcEx0di0+dS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJYnJlYWs7CiNlbmRpZgoKCQkJCWNhc2UgQ0ZHX0NORl9FTkNSWVBUSU9OOgoJCQkJCWxwLT5FbmFibGVFbmNyeXB0aW9uICAgID0gcEx0di0+dS51MTZbMF07CgkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0NORl9BVVRIRU5USUNBVElPTjoKCQkJCQlscC0+YXV0aGVudGljYXRpb24gID0gcEx0di0+dS51MTZbMF07CgkJCQkJcEx0di0+dS51MTZbMF0gICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWJyZWFrOwojaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAoJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAoKCQkJCS8vY2FzZSBDRkdfQ05GX0VYQ0xfVU5FTkNSWVBURUQ6CgkJCQkJLy9scC0+RXhjbHVkZVVuZW5jcnlwdGVkICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCS8vcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQkvL2JyZWFrOwoJCQkJY2FzZSBDRkdfQ05GX01DQVNUX1JBVEU6CgkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19DTkZfSU5UUkFfQlNTX1JFTEFZOgoJCQkJCWxwLT5pbnRyYUJTU1JlbGF5ICAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJYnJlYWs7CiNlbmRpZgoKCQkJCWNhc2UgQ0ZHX0NORl9NSUNST19XQVZFOgoJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLwoJCQkJCWJyZWFrOwoJCQkJLy9jYXNlIENGR19DTkZfTE9BRF9CQUxBTkNJTkc6CgkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCgkJCQkJLy9icmVhazsKCQkJCS8vY2FzZSBDRkdfQ05GX01FRElVTV9ESVNUUklCVVRJT046CgkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCgkJCQkJLy9icmVhazsKCQkJCS8vY2FzZSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSRVNTOgoJCQkJCS8vIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcwoJCQkJCS8vYnJlYWs7CgkJCQkvL2Nhc2UgQ0ZHX0NORl9DT1VOVFJZX0lORk86CgkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCgkJCQkJLy9icmVhazsKCQkJCWNhc2UgQ0ZHX0NORl9PV05fU1NJRDoKCQkJCS8vY2FzZSBDTkZfREVTSVJFRF9TU0lEOgoJCQkJY2FzZSBDRkdfREVTSVJFRF9TU0lEOgoJCQkJCW1lbXNldCggbHAtPk5ldHdvcmtOYW1lLCAwLCBzaXplb2YoIGxwLT5OZXR3b3JrTmFtZSApKTsKCQkJCQltZW1jcHkoICh2b2lkICopbHAtPk5ldHdvcmtOYW1lLCAodm9pZCAqKSZwTHR2LT51LnU4WzJdLCAoc2l6ZV90KXBMdHYtPnUudTE2WzBdICk7CgkJCQkJcEx0di0+dS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCgkJCQkJLyogdGFrZSBjYXJlIG9mIHRoZSBzcGVjaWFsIG5ldHdvcmsgbmFtZSAiQU5ZIiBjYXNlICovCgkJCQkJaWYoKCBzdHJsZW4oICZwTHR2LT51LnU4WzJdICAgICAgICApID09IDAgKSB8fAoJCQkJCSAgICggc3RyY21wKCAmcEx0di0+dS51OFsyXSwgIkFOWSIgKSA9PSAwICkgfHwKCQkJCQkgICAoIHN0cmNtcCggJnBMdHYtPnUudThbMl0sICJhbnkiICkgPT0gMCApKSB7CgkJCQkJCS8qIHNldCB0aGUgU1NJRF9TVFJDVCBsbGVuIGZpZWxkICh1MTZbMF0pIHRvIHplcm8sIGFuZCB0aGUKCQkJCQkJZWZmZWN0dWFsbHkgbnVsbCB0aGUgc3RyaW5nIHU4WzJdICovCgkJCQkJCXBMdHYtPnUudTE2WzBdID0gMDsKCQkJCQkJcEx0di0+dS51OFsyXSAgPSAwOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0dST1VQX0FERFI6CgkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19DUkVBVEVfSUJTUzoKCQkJCQlscC0+Q3JlYXRlSUJTUyAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX1JUU19USFJIOgoJCQkJCWxwLT5SVFNUaHJlc2hvbGQgICAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19UWF9SQVRFX0NOVEw6CgkJCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gICAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlscC0+VHhSYXRlQ29udHJvbFsxXSAgICA9IHBMdHYtPnUudTE2WzFdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJcEx0di0+dS51MTZbMV0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMV0gKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX1BST01JU0NVT1VTX01PREU6CgkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCgkJCQkJYnJlYWs7CgkJCQkvL2Nhc2UgQ0ZHX1dBS0VfT05fTEFOOgoJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLwoJCQkJCS8vYnJlYWs7CiNpZiAxIC8vOz8gI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAoJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAoJCQkJY2FzZSBDRkdfUlRTX1RIUkgwOgoJCQkJCWxwLT5SVFNUaHJlc2hvbGQgICAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19UWF9SQVRFX0NOVEwwOgovLzs/bm8gaWRlYSB3aGF0IHRoaXMgc2hvdWxkIGJlLCBnZXQgZ29pbmcgc28gY29tbWVudCBpdCBvdXQJCQkJCWxwLT5UeFJhdGVDb250cm9sICAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJYnJlYWs7CiNpZmRlZiBVU0VfV0RTCgkJCQljYXNlIENGR19SVFNfVEhSSDE6CgkJCQkJbHAtPndkc19wb3J0WzBdLnJ0c1RocmVzaG9sZCAgICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX1JUU19USFJIMjoKCQkJCQlscC0+d2RzX3BvcnRbMV0ucnRzVGhyZXNob2xkICAgID0gcEx0di0+dS51MTZbMF07CgkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF8yOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfUlRTX1RIUkgzOgoJCQkJCWxwLT53ZHNfcG9ydFsyXS5ydHNUaHJlc2hvbGQgICAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzM7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19SVFNfVEhSSDQ6CgkJCQkJbHAtPndkc19wb3J0WzNdLnJ0c1RocmVzaG9sZCAgICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfNDsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX1JUU19USFJINToKCQkJCQlscC0+d2RzX3BvcnRbNF0ucnRzVGhyZXNob2xkICAgID0gcEx0di0+dS51MTZbMF07CgkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF81OwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfUlRTX1RIUkg2OgoJCQkJCWxwLT53ZHNfcG9ydFs1XS5ydHNUaHJlc2hvbGQgICAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzY7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19UWF9SQVRFX0NOVEwxOgoJCQkJCWxwLT53ZHNfcG9ydFswXS50eFJhdGVDbnRsICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzE7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19UWF9SQVRFX0NOVEwyOgoJCQkJCWxwLT53ZHNfcG9ydFsxXS50eFJhdGVDbnRsICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzI7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19UWF9SQVRFX0NOVEwzOgoJCQkJCWxwLT53ZHNfcG9ydFsyXS50eFJhdGVDbnRsICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzM7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19UWF9SQVRFX0NOVEw0OgoJCQkJCWxwLT53ZHNfcG9ydFszXS50eFJhdGVDbnRsICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzQ7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19UWF9SQVRFX0NOVEw1OgoJCQkJCWxwLT53ZHNfcG9ydFs0XS50eFJhdGVDbnRsICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzU7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19UWF9SQVRFX0NOVEw2OgoJCQkJCWxwLT53ZHNfcG9ydFs1XS50eFJhdGVDbnRsICA9IHBMdHYtPnUudTE2WzBdOwoJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzY7CgkJCQkJYnJlYWs7CiNlbmRpZiAgLyogVVNFX1dEUyAqLwojZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLwoKCQkJCWNhc2UgQ0ZHX0RFRkFVTFRfS0VZUzoKCQkJCQl7CgkJCQkJCUNGR19ERUZBVUxUX0tFWVNfU1RSQ1QgKnBLZXlzID0gKENGR19ERUZBVUxUX0tFWVNfU1RSQ1QgKilwTHR2OwoKCQkJCQkJcEtleXMtPmtleVswXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXMtPmtleVswXS5sZW4gKTsKCQkJCQkJcEtleXMtPmtleVsxXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXMtPmtleVsxXS5sZW4gKTsKCQkJCQkJcEtleXMtPmtleVsyXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXMtPmtleVsyXS5sZW4gKTsKCQkJCQkJcEtleXMtPmtleVszXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXMtPmtleVszXS5sZW4gKTsKCgkJCQkJCW1lbWNweSggKHZvaWQgKikmKGxwLT5EZWZhdWx0S2V5cyksICh2b2lkICopcEtleXMsCgkJCQkJCQkJc2l6ZW9mKCBDRkdfREVGQVVMVF9LRVlTX1NUUkNUICkpOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX1RYX0tFWV9JRDoKCQkJCQlscC0+VHJhbnNtaXRLZXlJRCAgID0gcEx0di0+dS51MTZbMF07CgkJCQkJcEx0di0+dS51MTZbMF0gICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfU0NBTl9TU0lEOgoJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfVElDS19USU1FOgoJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLwoJCQkJCWJyZWFrOwoJCQkJLyogdGhlc2UgUklEUyBhcmUgSW5mbyBSSURzLCBhbmQgc2hvdWxkIHRoZXkgYmUgYWxsb3dlZCBmb3IgcHV0cz8/PyAqLwoJCQkJY2FzZSBDRkdfTUFYX0xPQURfVElNRToKCQkJCWNhc2UgQ0ZHX0RMX0JVRjoKCQkJCS8vY2FzZSBDRkdfSFNJX1NVUF9SQU5HRToKCQkJCWNhc2UgQ0ZHX05JQ19TRVJJQUxfTlVNQkVSOgoJCQkJY2FzZSBDRkdfTklDX0lERU5USVRZOgoJCQkJY2FzZSBDRkdfTklDX01GSV9TVVBfUkFOR0U6CgkJCQljYXNlIENGR19OSUNfQ0ZJX1NVUF9SQU5HRToKCQkJCWNhc2UgQ0ZHX05JQ19URU1QX1RZUEU6CgkJCQljYXNlIENGR19OSUNfUFJPRklMRToKCQkJCWNhc2UgQ0ZHX0ZXX0lERU5USVRZOgoJCQkJY2FzZSBDRkdfRldfU1VQX1JBTkdFOgoJCQkJY2FzZSBDRkdfTUZJX0FDVF9SQU5HRVNfU1RBOgoJCQkJY2FzZSBDRkdfQ0ZJX0FDVF9SQU5HRVNfU1RBOgoJCQkJY2FzZSBDRkdfUE9SVF9TVEFUOgoJCQkJY2FzZSBDRkdfQ1VSX1NTSUQ6CgkJCQljYXNlIENGR19DVVJfQlNTSUQ6CgkJCQljYXNlIENGR19DT01NU19RVUFMSVRZOgoJCQkJY2FzZSBDRkdfQ1VSX1RYX1JBVEU6CgkJCQljYXNlIENGR19DVVJfQkVBQ09OX0lOVEVSVkFMOgoJCQkJY2FzZSBDRkdfQ1VSX1NDQUxFX1RIUkg6CgkJCQljYXNlIENGR19QUk9UT0NPTF9SU1BfVElNRToKCQkJCWNhc2UgQ0ZHX0NVUl9TSE9SVF9SRVRSWV9MSU1JVDoKCQkJCWNhc2UgQ0ZHX0NVUl9MT05HX1JFVFJZX0xJTUlUOgoJCQkJY2FzZSBDRkdfTUFYX1RYX0xJRkVUSU1FOgoJCQkJY2FzZSBDRkdfTUFYX1JYX0xJRkVUSU1FOgoJCQkJY2FzZSBDRkdfQ0ZfUE9MTEFCTEU6CgkJCQljYXNlIENGR19BVVRIRU5USUNBVElPTl9BTEdPUklUSE1TOgoJCQkJY2FzZSBDRkdfUFJJVkFDWV9PUFRfSU1QTEVNRU5URUQ6CgkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfUkVNT1RFX1JBVEVTOgoJCQkJLy9jYXNlIENGR19DVVJSRU5UX1VTRURfUkFURVM6CgkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfU1lTVEVNX1NDQUxFOgoJCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEUxOgoJCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEUyOgoJCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEUzOgoJCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEU0OgoJCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEU1OgoJCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEU2OgoJCQkJY2FzZSBDRkdfTklDX01BQ19BRERSOgoJCQkJY2FzZSBDRkdfUENGX0lORk86CgkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfQ09VTlRSWV9JTkZPOgoJCQkJY2FzZSBDRkdfUEhZX1RZUEU6CgkJCQljYXNlIENGR19DVVJfQ0hBTk5FTDoKCQkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9QT1dFUl9TVEFURToKCQkJCS8vY2FzZSBDRkdfQ0NBTU9ERToKCQkJCWNhc2UgQ0ZHX1NVUFBPUlRFRF9EQVRBX1JBVEVTOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfQVBfTU9ERToKLy87PwkJCQlscC0+RG93bmxvYWRGaXJtd2FyZSA9ICggcEx0di0+dS51MTZbMF0gKSArIDE7CgkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAic2V0IENGR19BUF9NT0RFIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiIgKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0VOQ1JZUFRfU1RSSU5HOgoJCQkJCS8qIFRPRE86IEVORElBTiBUUkFOU0xBVElPTiBIRVJFPz8/ICovCgkJCQkJbWVtc2V0KCBscC0+c3pFbmNyeXB0aW9uLCAwLCBzaXplb2YoIGxwLT5zekVuY3J5cHRpb24gKSk7CgkJCQkJbWVtY3B5KCAodm9pZCAqKWxwLT5zekVuY3J5cHRpb24sICAodm9pZCAqKSZwTHR2LT51LnU4WzBdLAoJCQkJCQkJKCBwTHR2LT5sZW4gKiBzaXplb2YoIGhjZl8xNiApKSApOwoJCQkJCXdsX3dlcF9kZWNvZGUoIENSWVBUX0NPREUsICZzRW5jcnlwdGlvbiwKCQkJCQkJCQkgICAgbHAtPnN6RW5jcnlwdGlvbiApOwoKCQkJCQkvKiB0aGUgTGludXggZHJpdmVyIGxpa2VzIHRvIHVzZSAxLTQgZm9yIHRoZSBrZXkgSURzLCBhbmQgdGhlbgoJCQkJCWNvbnZlcnQgdG8gMC0zIHdoZW4gc2VuZGluZyB0byB0aGUgY2FyZC4gIFRoZSBXaW5kb3dzIGNvZGUKCQkJCQliYXNlIHVzZWQgMC0zIGluIHRoZSBBUEkgRExMLCB3aGljaCB3YXMgcG9ydGVkIHRvIExpbnV4LiAgRm9yCgkJCQkJdGhlIHNha2Ugb2YgdGhlIHVzZXIgZXhwZXJpZW5jZSwgd2UgZGVjaWRlZCB0byBrZWVwIDAtMyBhcyB0aGUKCQkJCQludW1iZXJzIHVzZWQgaW4gdGhlIERMTDsgYW5kIHdpbGwgcGVyZm9ybSB0aGUgKzEgY29udmVyc2lvbiBoZXJlLgoJCQkJCVdlIGNvdWxkIGhhdmUgY29udmVydGVkICB0aGUgZW50aXJlIExpbnV4IGRyaXZlciwgYnV0IHRoaXMgaXMKCQkJCQlsZXNzIG9idHJ1c2l2ZS4gIFRoaXMgbWF5IGJlIGEgInRvZG8iIHRvIGNvbnZlcnQgdGhlIHdob2xlIGRyaXZlciAqLwoJCQkJCWxwLT5UcmFuc21pdEtleUlEICAgID0gc0VuY3J5cHRpb24ud1R4S2V5SUQgKyAxOwoJCQkJCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gc0VuY3J5cHRpb24ud0VuYWJsZWQ7CgoJCQkJCW1lbWNweSggJmxwLT5EZWZhdWx0S2V5cywgJnNFbmNyeXB0aW9uLkVuY1N0ciwKCQkJCQkJCXNpemVvZiggQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVCApKTsKCQkJCQlicmVhazsKCQkJCS8qY2FzZSBDRkdfQ09VTlRSWV9TVFJJTkc6CgkJCQkJbWVtc2V0KCBscC0+Y291bnRyeVN0cmluZywgMCwgc2l6ZW9mKCBscC0+Y291bnRyeVN0cmluZyApKTsKCQkJCQltZW1jcHkoICh2b2lkICopbHAtPmNvdW50cnlTdHJpbmcsICh2b2lkICopJnBMdHYtPnUudThbMl0sIChzaXplX3QpcEx0di0+dS51MTZbMF0pOwoJCQkJCWJyZWFrOwoJCQkJKi8KCgkJCQljYXNlIENGR19EUklWRVJfRU5BQkxFOgoJCQkJCWxwLT5kcml2ZXJFbmFibGUgICAgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19XT0xBU19FTkFCTEU6CgkJCQkJbHAtPndvbGFzRW5hYmxlID0gcEx0di0+dS51MTZbMF07CgkJCQkJcEx0di0+dS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19TRVRfV1BBX0FVVEhfS0VZX01HTVRfU1VJVEU6CgkJCQkJbHAtPkF1dGhLZXlNZ210U3VpdGUgPSBwTHR2LT51LnUxNlswXTsKCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0RJU0FTU09DSUFURV9BRERSOgoJCQkJCXBMdHYtPnUudTE2W0VUSF9BTEVOIC8gMl0gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbRVRIX0FMRU4gLyAyXSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVk6CgkJCQljYXNlIENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWToKCQkJCQkvKiBFbmRpYW4gY29udmVydCB0aGUgVHggS2V5IEluZm9ybWF0aW9uICovCgkJCQkJcEx0di0+dS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQ0ZHX0FERF9US0lQX01BUFBFRF9LRVk6CgkJCQkJYnJlYWs7CgkJCQljYXNlIENGR19SRU1PVkVfVEtJUF9NQVBQRURfS0VZOgoJCQkJCWJyZWFrOwoJCQkJLyogc29tZSBSSURzIGp1c3QgY2FuJ3QgYmUgcHV0ICovCgkJCQljYXNlIENGR19NQl9JTkZPOgoJCQkJY2FzZSBDRkdfSUZCOgoJCQkJZGVmYXVsdDoKCQkJCQlicmVhazsKCQkJCX0KCgkJCQkvKiBUaGlzIGNvZGUgd2lsbCBwcmV2ZW50IFN0YXRpYyBDb25maWd1cmF0aW9uIEVudGl0aWVzIGZyb20KCQkJCSAgIGJlaW5nIHNlbnQgdG8gdGhlIGNhcmQsIGFzIHRoZXkgcmVxdWlyZSBhIGNhbGwgdG8KCQkJCSAgIFVJTF9BQ1RfQVBQTFkgdG8gdGFrZSBlZmZlY3QuIER5bmFtaWMgRW50aXRpZXMgd2lsbCBiZSBzZW50CgkJCQkgICBpbW1lZGlhdGVseSAqLwoJCQkJc3dpdGNoKCBwTHR2LT50eXAgKSB7CgkJCQljYXNlIENGR19DTkZfUE9SVF9UWVBFOgoJCQkJY2FzZSBDRkdfQ05GX09XTl9NQUNfQUREUjoKCQkJCWNhc2UgQ0ZHX0NORl9PV05fQ0hBTk5FTDoKCQkJCWNhc2UgQ0ZHX0NORl9PV05fU1NJRDoKCQkJCWNhc2UgQ0ZHX0NORl9PV05fQVRJTV9XSU5ET1c6CgkJCQljYXNlIENGR19DTkZfU1lTVEVNX1NDQUxFOgoJCQkJY2FzZSBDRkdfQ05GX01BWF9EQVRBX0xFTjoKCQkJCWNhc2UgQ0ZHX0NORl9QTV9FTkFCTEVEOgoJCQkJY2FzZSBDRkdfQ05GX01DQVNUX1JYOgoJCQkJY2FzZSBDRkdfQ05GX01BWF9TTEVFUF9EVVJBVElPTjoKCQkJCWNhc2UgQ0ZHX0NORl9IT0xET1ZFUl9EVVJBVElPTjoKCQkJCWNhc2UgQ0ZHX0NORl9PV05fTkFNRToKCQkJCWNhc2UgQ0ZHX0NORl9MT0FEX0JBTEFOQ0lORzoKCQkJCWNhc2UgQ0ZHX0NORl9NRURJVU1fRElTVFJJQlVUSU9OOgojaWZkZWYgV0FSUAoJCQkJY2FzZSBDRkdfQ05GX1RYX1BPV19MVkw6CgkJCQljYXNlIENGR19DTkZfQ09OTkVDVElPTl9DTlRMOgoJCQkJLy9jYXNlIENGR19QUk9CRV9EQVRBX1JBVEU6CiNlbmRpZiAvLyBIRVJNRVMyNQojaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAoJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAoJCQkJY2FzZSBDRkdfQ05GX09XTl9EVElNX1BFUklPRDoKI2lmZGVmIFdBUlAKCQkJCWNhc2UgQ0ZHX0NORl9PV05fQkVBQ09OX0lOVEVSVkFMOiAgICAgICAgICAgICAgICAgICAgLy8gT3duIEJlYWNvbiBJbnRlcnZhbAojZW5kaWYgLy8gV0FSUAojaWZkZWYgVVNFX1dEUwoJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSMToKCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjI6CgkJCQljYXNlIENGR19DTkZfV0RTX0FERFIzOgoJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSNDoKCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjU6CgkJCQljYXNlIENGR19DTkZfV0RTX0FERFI2OgojZW5kaWYKCQkJCWNhc2UgQ0ZHX0NORl9NQ0FTVF9QTV9CVUY6CgkJCQljYXNlIENGR19DTkZfUkVKRUNUX0FOWToKI2VuZGlmCgoJCQkJY2FzZSBDRkdfQ05GX0VOQ1JZUFRJT046CgkJCQljYXNlIENGR19DTkZfQVVUSEVOVElDQVRJT046CiNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCgkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CgoJCQkJY2FzZSBDRkdfQ05GX0VYQ0xfVU5FTkNSWVBURUQ6CgkJCQljYXNlIENGR19DTkZfTUNBU1RfUkFURToKCQkJCWNhc2UgQ0ZHX0NORl9JTlRSQV9CU1NfUkVMQVk6CiNlbmRpZgoKCQkJCWNhc2UgQ0ZHX0NORl9NSUNST19XQVZFOgoJCQkJLy9jYXNlIENGR19DTkZfTE9BRF9CQUxBTkNJTkc6CgkJCQkvL2Nhc2UgQ0ZHX0NORl9NRURJVU1fRElTVFJJQlVUSU9OOgoJCQkJLy9jYXNlIENGR19DTkZfUlhfQUxMX0dST1VQX0FERFJFU1M6CgkJCQkvL2Nhc2UgQ0ZHX0NORl9DT1VOVFJZX0lORk86CgkJCQkvL2Nhc2UgQ0ZHX0NPVU5UUllfU1RSSU5HOgoJCQkJY2FzZSBDRkdfQVBfTU9ERToKCQkJCWNhc2UgQ0ZHX0VOQ1JZUFRfU1RSSU5HOgoJCQkJLy9jYXNlIENGR19EUklWRVJfRU5BQkxFOgoJCQkJY2FzZSBDRkdfV09MQVNfRU5BQkxFOgoJCQkJY2FzZSBDRkdfTUJfSU5GTzoKCQkJCWNhc2UgQ0ZHX0lGQjoKCQkJCQlicmVhazsKCQkJCS8qIERlYWwgd2l0aCB0aGlzIGR5bmFtaWMgTVNGIFJJRCwgYXMgaXQncyByZXF1aXJlZCBmb3IgV1BBICovCgkJCQljYXNlIENGR19EUklWRVJfRU5BQkxFOgoJCQkJCWlmKCBscC0+ZHJpdmVyRW5hYmxlICkgewoJCQkJCQkvL2hjZl9jbnRsX3BvcnQoICYoIGxwLT5oY2ZDdHggKSwKCQkJCQkJLy8gICAgICAgICAgICAgICBIQ0ZfUE9SVF9FTkFCTEUgfCBIQ0ZfUE9SVF8wICk7CgkJCQkJCS8vIC8vaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwKCQkJCQkJLy8gLy8gICAgICAgICBIQ0ZfUE9SVF9FTkFCTEUgfCBIQ0ZfUE9SVF8wICk7CgkJCQkJCS8vaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwgSENGX0NOVExfRU5BQkxFICk7CgkJCQkJCS8vIC8vaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwgSENGX0NOVExfQ09OTkVDVCApOwoKCQkJCQkJaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwgSENGX0NOVExfRU5BQkxFIHwgSENGX1BPUlRfMCApOwoJCQkJCQloY2ZfY250bCggJiggbHAtPmhjZkN0eCApLCBIQ0ZfQ05UTF9DT05ORUNUICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy9oY2ZfY250bF9wb3J0KCAmKCBscC0+aGNmQ3R4ICksCgkJCQkJCS8vICAgICAgICAgICAgICAgSENGX1BPUlRfRElTQUJMRSB8IEhDRl9QT1JUXzAgKTsKCQkJCQkJLy8gLy9oY2ZfY250bCggJiggbHAtPmhjZkN0eCApLAoJCQkJCQkvLyAvLyAgICAgICAgIEhDRl9QT1JUX0RJU0FCTEUgfCBIQ0ZfUE9SVF8wICk7CgkJCQkJCS8vaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwgSENGX0NOVExfRElTQUJMRSApOwoJCQkJCQkvLyAvL2hjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9DTlRMX0RJU0NPTk5FQ1QgKTsKCgkJCQkJCWhjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9DTlRMX0RJU0FCTEUgfCBIQ0ZfUE9SVF8wICk7CgkJCQkJCWhjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9DTlRMX0RJU0NPTk5FQ1QgKTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgogICAgCQkJCQl3bF9hY3RfaW50X29mZiggbHAgKTsKCQkJCQl1cnEtPnJlc3VsdCA9IGhjZl9wdXRfaW5mbygmKGxwLT5oY2ZDdHgpLCAoTFRWUCkgcEx0dik7CiAgICAJCQkJCXdsX2FjdF9pbnRfb24oIGxwICk7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYoIGx0dkFsbG9jYXRlZCApIHsKCQkJCQlrZnJlZSggcEx0diApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKCQkJfQoJCX0gZWxzZSB7CgkJCURCR19FUlJPUiggRGJnSW5mbywgIkVQRVJNXG4iICk7CgkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CgkJCXJlc3VsdCA9IC1FUEVSTTsKCQl9Cgl9IGVsc2UgewoJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfV1JPTkdfSUZCXG4iICk7CgkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX1dST05HX0lGQjsKCX0KCglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybiByZXN1bHQ7Cn0gLy8gd3ZsYW5fdWlsX3B1dF9pbmZvCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3dmxhbl91aWxfZ2V0X2luZm8oKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgU2VuZHMgYSBzcGVjaWZpYyBSSUQgZGlyZWN0bHkgdG8gdGhlIGRyaXZlciB0byByZXRyaWV2ZSBjb25maWd1cmF0aW9uCiAqICAgICAgaW5mby4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgVUlMX1NVQ0NFU1MKICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHd2bGFuX3VpbF9nZXRfaW5mbyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CglpbnQgcmVzdWx0ID0gMDsKCWludCBpOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCURCR19GVU5DKCAid3ZsYW5fdWlsX2dldF9pbmZvIiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoJaWYoIHVycS0+aGNmQ3R4ID09ICYoIGxwLT5oY2ZDdHggKSkgewoJCWlmKCggdXJxLT5kYXRhICE9IE5VTEwgKSAmJiAoIHVycS0+bGVuICE9IDAgKSkgewoJCQlsdHZfdCAgICAgICpwTHR2OwoJCQlib29sX3QgICAgICBsdHZBbGxvY2F0ZWQgPSBGQUxTRTsKCgkJCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYXQgbGVhc3QgYSBjb21tYW5kIGFuZCBsZW5ndGggKi8KCQkJaWYoIHVycS0+bGVuIDwgKCBzaXplb2YoIGhjZl8xNiApICogMiApKSB7CgkJCQl1cnEtPmxlbiA9IHNpemVvZiggbHAtPmx0dlJlY29yZCApOwoJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiTm8gTGVuZ3RoL1R5cGUgaW4gTFRWISEhXG4iICk7CgkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJVSUxfRVJSX0xFTlxuIiApOwoJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0xFTjsKCQkJCURCR19MRUFWRSggRGJnSW5mbyApOwoJCQkJcmV0dXJuIHJlc3VsdDsKCQkJfQoKCQkJLyogVmVyaWZ5IHRoZSB1c2VyJ3MgTFRWIHJlY29yZCBoZWFkZXIuICovCgkJCXJlc3VsdCA9IHZlcmlmeV9hcmVhKCBWRVJJRllfUkVBRCwgdXJxLT5kYXRhLCBzaXplb2YoIGhjZl8xNiApICogMiApOwoJCQlpZiggcmVzdWx0ICE9IDAgKSB7CgkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJ2ZXJpZnlfYXJlYSgpLCBWRVJJRllfUkVBRCBGQUlMRURcbiIgKTsKCQkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CgkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKCQkJCXJldHVybiByZXN1bHQ7CgkJCX0KCgkJCS8qIEdldCBvbmx5IHRoZSBjb21tYW5kIGFuZCBsZW5ndGggaW5mb3JtYXRpb24uICovCgkJCXJlc3VsdCA9IGNvcHlfZnJvbV91c2VyKCAmKCBscC0+bHR2UmVjb3JkICksIHVycS0+ZGF0YSwgc2l6ZW9mKCBoY2ZfMTYgKSAqIDIgKTsKCgkJCS8qIE1ha2Ugc3VyZSB0aGUgaW5jb21pbmcgTFRWIHJlY29yZCBsZW5ndGggaXMgd2l0aGluIHRoZSBib3VuZHMgb2YKCQkJICAgdGhlIElPQ1RMIGxlbmd0aC4gKi8KCQkJaWYoKCggbHAtPmx0dlJlY29yZC5sZW4gKyAxICkgKiBzaXplb2YoIGhjZl8xNiApKSA+IHVycS0+bGVuICkgewoJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiSW5jb21pbmcgTFRWIHRvbyBiaWdcbiIgKTsKCQkJCXVycS0+bGVuID0gc2l6ZW9mKCBscC0+bHR2UmVjb3JkICk7CgkJCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOwoJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CgkJCQlyZXR1cm4gcmVzdWx0OwoJCQl9CgoJCQkvKiBEZXRlcm1pbmUgaWYgaGNmX2dldF9pbmZvKCkgaXMgbmVlZGVkIG9yIG5vdCAqLwoJCQlzd2l0Y2ggKCBscC0+bHR2UmVjb3JkLnR5cCApIHsKCQkJY2FzZSBDRkdfTklDX0lERU5USVRZOgoJCQkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCAmbHAtPk5JQ0lkZW50aXR5LCBzaXplb2YoIGxwLT5OSUNJZGVudGl0eSApKTsKCQkJCWJyZWFrOwoJCQljYXNlIENGR19QUklfSURFTlRJVFk6CgkJCQltZW1jcHkoICZscC0+bHR2UmVjb3JkLnUudThbMF0sICZscC0+UHJpbWFyeUlkZW50aXR5LCBzaXplb2YoIGxwLT5QcmltYXJ5SWRlbnRpdHkgKSk7CgkJCQlicmVhazsKCQkJY2FzZSBDRkdfQVBfTU9ERToKCQkJCURCR19FUlJPUiggRGJnSW5mbywgInNldCBDRkdfQVBfTU9ERSBubyBsb25nZXIgc3VwcG9ydGVkLCBzbyBpcyBnZXQgdXNlZnVsID8/Pz9cbiIgKTsKCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPQoJCQkJCUNOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQOwoJCQkJYnJlYWs7CgkJCS8vY2FzZSBDRkdfRFJWX0lORk86CgkJCWNhc2UgQ0ZHX0VOQ1JZUFRfU1RSSU5HOgoJCQljYXNlIENGR19DT1VOVFJZX1NUUklORzoKCQkJY2FzZSBDRkdfRFJJVkVSX0VOQUJMRToKCQkJY2FzZSBDRkdfV09MQVNfRU5BQkxFOgoJCQkJLy8gVE9ETzogZGV0ZXJtaW5lIGlmIHdlJ3JlIGdvaW5nIHRvIHN1cHBvcnQgdGhlc2UKCQkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CgkJCQlicmVhazsKCQkJY2FzZSBDRkdfRFJWX0lORk86CgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJbnRlcmNlcHQgQ0ZHX0RSVl9JTkZPXG4iICk7CgkJCQlyZXN1bHQgPSBjZmdfZHJpdmVyX2luZm8oIHVycSwgbHAgKTsKCQkJCWJyZWFrOwoJCQljYXNlIENGR19EUlZfSURFTlRJVFk6CgkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJbnRlcmNlcHQgQ0ZHX0RSVl9JREVOVElUWVxuIiApOwoJCQkJcmVzdWx0ID0gY2ZnX2RyaXZlcl9pZGVudGl0eSggdXJxLCBscCApOwoJCQkJYnJlYWs7CgkJCWNhc2UgQ0ZHX0lGQjoKCQkJCS8qIElGQiBjYW4gYmUgYSBzZWN1cml0eSBob2xlICovCgkJCQlpZiggIWNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgewoJCQkJCXJlc3VsdCA9IC1FUEVSTTsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQkvKiBFbHNlIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCAqLwoKCQkJY2FzZSBDRkdfRldfSURFTlRJVFk6ICAgLy8gRm9yIEhlcm1lcy0xLCB0aGlzIGlzIGNhY2hlZAoJCQlkZWZhdWx0OgoKCQkJCS8qIFZlcmlmeSB0aGUgdXNlciBidWZmZXIgKi8KCQkJCXJlc3VsdCA9IHZlcmlmeV9hcmVhKCBWRVJJRllfV1JJVEUsIHVycS0+ZGF0YSwgdXJxLT5sZW4gKTsKCQkJCWlmKCByZXN1bHQgIT0gMCApIHsKCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJ2ZXJpZnlfYXJlYSgpLCBWRVJJRllfV1JJVEUgRkFJTEVEXG4iICk7CgkJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQkvKiBJZiB0aGUgcmVxdWVzdGVkIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2Ygb3VyIGxvY2FsCgkJCQkgICBMVFYgcmVjb3JkLCB0cnkgdG8gYWxsb2NhdGUgaXQgZnJvbSB0aGUga2VybmVsIHN0YWNrLgoJCQkJICAgT3RoZXJ3aXNlLCB3ZSBqdXN0IHVzZSBvdXIgbG9jYWwgTFRWIHJlY29yZC4gKi8KCQkJCWlmKCB1cnEtPmxlbiA+IHNpemVvZiggbHAtPmx0dlJlY29yZCApKSB7CgkJCQkJcEx0diA9IGttYWxsb2ModXJxLT5sZW4sIEdGUF9LRVJORUwpOwoJCQkJCWlmIChwTHR2ICE9IE5VTEwpIHsKCQkJCQkJbHR2QWxsb2NhdGVkID0gVFJVRTsKCgkJCQkJCS8qIENvcHkgdGhlIGNvbW1hbmQvbGVuZ3RoIGluZm9ybWF0aW9uIGludG8gdGhlIG5ldyBidWZmZXIuICovCgkJCQkJCW1lbWNweSggcEx0diwgJiggbHAtPmx0dlJlY29yZCApLCBzaXplb2YoIGhjZl8xNiApICogMiApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXVycS0+bGVuID0gc2l6ZW9mKCBscC0+bHR2UmVjb3JkICk7CgkJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9MRU47CgkJCQkJCURCR19FUlJPUiggRGJnSW5mbywgImttYWxsb2MgRkFJTEVEXG4iICk7CgkJCQkJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfTEVOXG4iICk7CgkJCQkJCXJlc3VsdCA9IC1FTk9NRU07CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJcEx0diA9ICYoIGxwLT5sdHZSZWNvcmQgKTsKCQkJCX0KCiAgICAJCQkJd2xfYWN0X2ludF9vZmYoIGxwICk7CgkJCQl1cnEtPnJlc3VsdCA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkgcEx0diApOwogICAgCQkJCXdsX2FjdF9pbnRfb24oIGxwICk7CgoJCQkJLy8gQ29weSB0aGUgTFRWIGludG8gdGhlIHVzZXIncyBidWZmZXIuCgkJCQkvL2NvcHlfdG9fdXNlciggdXJxLT5kYXRhLCBwTHR2LCB1cnEtPmxlbiApOwoKCQkJCS8vaWYoIGx0dkFsbG9jYXRlZCApCgkJCQkvL3sKCQkJCS8vICAgIGtmcmVlKCBwTHR2ICk7CgkJCQkvL30KCgkJCQkvL3VycS0+cmVzdWx0ID0gVUlMX1NVQ0NFU1M7CgkJCQlicmVhazsKCQkJfQoKCQkJLyogSGFuZGxlIGVuZGlhbiBjb252ZXJzaW9uIG9mIHNwZWNpYWwgZmllbGRzICovCgkJCXN3aXRjaCggbHAtPmx0dlJlY29yZC50eXAgKSB7CgkJCS8qIHNpbXBsZSBpbnQgZ2V0cyBqdXN0IG5lZWQgdGhlIGZpcnN0IGhjZl8xNiBieXRlIGZsaXBwZWQgKi8KCQkJY2FzZSBDRkdfQ05GX1BPUlRfVFlQRToKCQkJY2FzZSBDRkdfQ05GX09XTl9DSEFOTkVMOgoJCQljYXNlIENGR19DTkZfT1dOX0FUSU1fV0lORE9XOgoJCQljYXNlIENGR19DTkZfU1lTVEVNX1NDQUxFOgoJCQljYXNlIENGR19DTkZfTUFYX0RBVEFfTEVOOgoJCQljYXNlIENGR19DTkZfUE1fRU5BQkxFRDoKCQkJY2FzZSBDRkdfQ05GX01DQVNUX1JYOgoJCQljYXNlIENGR19DTkZfTUFYX1NMRUVQX0RVUkFUSU9OOgoJCQljYXNlIENGR19DTkZfSE9MRE9WRVJfRFVSQVRJT046CgkJCWNhc2UgQ0ZHX0NORl9PV05fRFRJTV9QRVJJT0Q6CgkJCWNhc2UgQ0ZHX0NORl9NQ0FTVF9QTV9CVUY6CgkJCWNhc2UgQ0ZHX0NORl9SRUpFQ1RfQU5ZOgoJCQljYXNlIENGR19DTkZfRU5DUllQVElPTjoKCQkJY2FzZSBDRkdfQ05GX0FVVEhFTlRJQ0FUSU9OOgoJCQljYXNlIENGR19DTkZfRVhDTF9VTkVOQ1JZUFRFRDoKCQkJY2FzZSBDRkdfQ05GX0lOVFJBX0JTU19SRUxBWToKCQkJY2FzZSBDRkdfQ05GX01JQ1JPX1dBVkU6CgkJCWNhc2UgQ0ZHX0NORl9MT0FEX0JBTEFOQ0lORzoKCQkJY2FzZSBDRkdfQ05GX01FRElVTV9ESVNUUklCVVRJT046CiNpZmRlZiBXQVJQCgkJCWNhc2UgQ0ZHX0NORl9UWF9QT1dfTFZMOgoJCQljYXNlIENGR19DTkZfQ09OTkVDVElPTl9DTlRMOgoJCQljYXNlIENGR19DTkZfT1dOX0JFQUNPTl9JTlRFUlZBTDogICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE93biBCZWFjb24gSW50ZXJ2YWwKCQkJY2FzZSBDRkdfQ09FWElTVEVOU0VfQkVIQVZJT1VSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb2V4aXN0ZW5jZSBCZWhhdmlvcgoJCQkvL2Nhc2UgQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUkVTUzoKI2VuZGlmIC8vIEhFUk1FUzI1CgkJCWNhc2UgQ0ZHX0NSRUFURV9JQlNTOgoJCQljYXNlIENGR19SVFNfVEhSSDoKCQkJY2FzZSBDRkdfUFJPTUlTQ1VPVVNfTU9ERToKCQkJLy9jYXNlIENGR19XQUtFX09OX0xBTjoKCQkJY2FzZSBDRkdfUlRTX1RIUkgwOgoJCQljYXNlIENGR19SVFNfVEhSSDE6CgkJCWNhc2UgQ0ZHX1JUU19USFJIMjoKCQkJY2FzZSBDRkdfUlRTX1RIUkgzOgoJCQljYXNlIENGR19SVFNfVEhSSDQ6CgkJCWNhc2UgQ0ZHX1JUU19USFJINToKCQkJY2FzZSBDRkdfUlRTX1RIUkg2OgoJCQljYXNlIENGR19UWF9SQVRFX0NOVEwwOgoJCQljYXNlIENGR19UWF9SQVRFX0NOVEwxOgoJCQljYXNlIENGR19UWF9SQVRFX0NOVEwyOgoJCQljYXNlIENGR19UWF9SQVRFX0NOVEwzOgoJCQljYXNlIENGR19UWF9SQVRFX0NOVEw0OgoJCQljYXNlIENGR19UWF9SQVRFX0NOVEw1OgoJCQljYXNlIENGR19UWF9SQVRFX0NOVEw2OgoJCQljYXNlIENGR19UWF9LRVlfSUQ6CgkJCWNhc2UgQ0ZHX1RJQ0tfVElNRToKCQkJY2FzZSBDRkdfTUFYX0xPQURfVElNRToKCQkJY2FzZSBDRkdfTklDX1RFTVBfVFlQRToKCQkJY2FzZSBDRkdfUE9SVF9TVEFUOgoJCQljYXNlIENGR19DVVJfVFhfUkFURToKCQkJY2FzZSBDRkdfQ1VSX0JFQUNPTl9JTlRFUlZBTDoKCQkJY2FzZSBDRkdfUFJPVE9DT0xfUlNQX1RJTUU6CgkJCWNhc2UgQ0ZHX0NVUl9TSE9SVF9SRVRSWV9MSU1JVDoKCQkJY2FzZSBDRkdfQ1VSX0xPTkdfUkVUUllfTElNSVQ6CgkJCWNhc2UgQ0ZHX01BWF9UWF9MSUZFVElNRToKCQkJY2FzZSBDRkdfTUFYX1JYX0xJRkVUSU1FOgoJCQljYXNlIENGR19DRl9QT0xMQUJMRToKCQkJY2FzZSBDRkdfUFJJVkFDWV9PUFRfSU1QTEVNRU5URUQ6CgkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9SRU1PVEVfUkFURVM6CgkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9VU0VEX1JBVEVTOgoJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfU1lTVEVNX1NDQUxFOgoJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTE6CgkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFMjoKCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEUzOgoJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTQ6CgkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFNToKCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEU2OgoJCQljYXNlIENGR19QSFlfVFlQRToKCQkJY2FzZSBDRkdfQ1VSX0NIQU5ORUw6CgkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9QT1dFUl9TVEFURToKCQkJLy9jYXNlIENGR19DQ0FNT0RFOgoJCQkvLyAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKTsKCQkJLy8gICAgYnJlYWs7CgkJCS8qIG5hbWUgc3RyaW5nIGdldHMganVzdCBuZWVkIHRoZSBmaXJzdCBoY2ZfMTYgYnl0ZSBmbGlwcGVkIChsZW5ndGggb2Ygc3RyaW5nKSAqLwoJCQljYXNlIENGR19DTkZfT1dOX1NTSUQ6CgkJCWNhc2UgQ0ZHX0NORl9PV05fTkFNRToKCQkJLy9jYXNlIENORl9ERVNJUkVEX1NTSUQ6CgkJCWNhc2UgQ0ZHX0RFU0lSRURfU1NJRDoKCQkJY2FzZSBDRkdfU0NBTl9TU0lEOgoJCQljYXNlIENGR19DVVJfU1NJRDoKCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOwoJCQkJYnJlYWs7CgkJCS8qIG5vbi1sZW5ndGggY291bnRlZCBzdHJpbmdzIG5lZWQgbm8gYnl0ZSBmbGlwcGluZyAqLwoJCQljYXNlIENGR19DTkZfT1dOX01BQ19BRERSOgoJCQkvKiB0aGlzIGNhc2UgaXMgbm8gbG9uZ2VyIHZhbGlkOiBDRkdfQ05GX1dEU19BRERSICovCgkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjE6CgkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjI6CgkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjM6CgkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjQ6CgkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjU6CgkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjY6CgkJCWNhc2UgQ0ZHX0dST1VQX0FERFI6CgkJCWNhc2UgQ0ZHX05JQ19TRVJJQUxfTlVNQkVSOgoJCQljYXNlIENGR19DVVJfQlNTSUQ6CgkJCWNhc2UgQ0ZHX05JQ19NQUNfQUREUjoKCQkJY2FzZSBDRkdfU1VQUE9SVEVEX0RBVEFfUkFURVM6ICAvKiBuZWVkIHRvIGVuc3VyZSB3ZSBjYW4gdHJlYXQgdGhpcyBhcyBhIHN0cmluZyAqLwoJCQkJYnJlYWs7CgkJCS8vY2FzZSBDRkdfQ05GX0NPVU5UUllfSU5GTzogICAgICAvKiBzcGVjaWFsIGNhc2UsIHNlZSBwYWdlIDc1ICBvZiAwMjI0ODYsIFJldiBDLiAqLwoJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfQ09VTlRSWV9JTkZPOiAgLyogc3BlY2lhbCBjYXNlLCBzZWUgcGFnZSAxMDEgb2YgMDIyNDg2LCBSZXYgQy4gKi8KCQkJLyoKCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOwoJCQkJbHAtPmx0dlJlY29yZC51LnUxNlszXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzNdICk7CgoJCQkJZm9yKCBpID0gNDsgaSA8IGxwLT5sdHZSZWNvcmQubGVuOyBpKysgKSB7CgkJCQkJbHAtPmx0dlJlY29yZC51LnUxNltpXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2W2ldICk7CgkJCQl9CgkJCQlicmVhazsKCQkJKi8KCgkJCWNhc2UgQ0ZHX0RFRkFVTFRfS0VZUzoKCQkJCXsKCQkJCQlDRkdfREVGQVVMVF9LRVlTX1NUUkNUICpwS2V5cyA9IChDRkdfREVGQVVMVF9LRVlTX1NUUkNUICopJmxwLT5sdHZSZWNvcmQudS51OFswXTsKCgkJCQkJcEtleXNbMF0ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIHBLZXlzWzBdLmxlbiApOwoJCQkJCXBLZXlzWzFdLmxlbiA9IENOVl9JTlRfVE9fTElUVExFKCBwS2V5c1sxXS5sZW4gKTsKCQkJCQlwS2V5c1syXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXNbMl0ubGVuICk7CgkJCQkJcEtleXNbM10ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIHBLZXlzWzNdLmxlbiApOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgQ0ZHX0NORl9NQ0FTVF9SQVRFOgoJCQljYXNlIENGR19UWF9SQVRFX0NOVEw6CgkJCWNhc2UgQ0ZHX1NVUFBPUlRFRF9SQVRFX1NFVF9DTlRMOiAgICAvLyBTdXBwb3J0ZWQgUmF0ZSBTZXQgQ29udHJvbAoJCQljYXNlIENGR19CQVNJQ19SQVRFX1NFVF9DTlRMOiAgICAvLyBCYXNpYyBSYXRlIFNldCBDb250cm9sCgkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKTsKCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlsxXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgQ0ZHX0RMX0JVRjoKCQkJY2FzZSBDRkdfTklDX0lERU5USVRZOgoJCQljYXNlIENGR19DT01NU19RVUFMSVRZOgoJCQljYXNlIENGR19QQ0ZfSU5GTzoKCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOwoJCQkJbHAtPmx0dlJlY29yZC51LnUxNlsxXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzFdICk7CgkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzJdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMl0gKTsKCQkJCWJyZWFrOwoJCQljYXNlIENGR19GV19JREVOVElUWToKCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOwoJCQkJbHAtPmx0dlJlY29yZC51LnUxNlsxXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzFdICk7CgkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzJdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMl0gKTsKCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbM10gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlszXSApOwoJCQkJYnJlYWs7CgkJCS8vY2FzZSBDRkdfSFNJX1NVUF9SQU5HRToKCQkJY2FzZSBDRkdfTklDX01GSV9TVVBfUkFOR0U6CgkJCWNhc2UgQ0ZHX05JQ19DRklfU1VQX1JBTkdFOgoJCQljYXNlIENGR19OSUNfUFJPRklMRToKCQkJY2FzZSBDRkdfRldfU1VQX1JBTkdFOgoJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzBdICk7CgkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzFdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMV0gKTsKCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMl0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlsyXSApOwoJCQkJbHAtPmx0dlJlY29yZC51LnUxNlszXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzNdICk7CgkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzRdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbNF0gKTsKCQkJCWJyZWFrOwoJCQljYXNlIENGR19NRklfQUNUX1JBTkdFU19TVEE6CgkJCWNhc2UgQ0ZHX0NGSV9BQ1RfUkFOR0VTX1NUQToKCQkJY2FzZSBDRkdfQ1VSX1NDQUxFX1RIUkg6CgkJCWNhc2UgQ0ZHX0FVVEhFTlRJQ0FUSU9OX0FMR09SSVRITVM6CgkJCQlmb3IoIGkgPSAwOyBpIDwgKCBscC0+bHR2UmVjb3JkLmxlbiAtIDEgKTsgaSsrICkgewoJCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbaV0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNltpXSApOwoJCQkJfQoJCQkJYnJlYWs7CgkJCS8qIGRvbmUgYXQgaW5pdCB0aW1lLCBhbmQgZW5kaWFuIGhhbmRsZWQgdGhlbiAqLwoJCQljYXNlIENGR19QUklfSURFTlRJVFk6CgkJCQlicmVhazsKCQkJY2FzZSBDRkdfTUJfSU5GTzoKCQkJCS8vd3ZsYW5FbmRpYW5UcmFuc2xhdGVNYWlsYm94KCBwTHR2ICk7CgkJCQlicmVhazsKCQkJLyogTVNGIGFuZCBIQ0YgUklEUyAqLwoJCQljYXNlIENGR19JRkI6CgkJCWNhc2UgQ0ZHX0RSVl9JTkZPOgoJCQljYXNlIENGR19BUF9NT0RFOgoJCQljYXNlIENGR19FTkNSWVBUX1NUUklORzoKCQkJY2FzZSBDRkdfQ09VTlRSWV9TVFJJTkc6CgkJCWNhc2UgQ0ZHX0RSSVZFUl9FTkFCTEU6CgkJCWNhc2UgQ0ZHX1dPTEFTX0VOQUJMRToKCQkJZGVmYXVsdDoKCQkJCWJyZWFrOwoJCQl9CgoJCQkvLyBDb3B5IHRoZSBMVFYgaW50byB0aGUgdXNlcidzIGJ1ZmZlci4KCQkJY29weV90b191c2VyKCB1cnEtPmRhdGEsICYoIGxwLT5sdHZSZWNvcmQgKSwgdXJxLT5sZW4gKTsKCgkJCWlmKCBsdHZBbGxvY2F0ZWQgKSB7CgkJCQlrZnJlZSggJiggbHAtPmx0dlJlY29yZCApKTsKCQkJfQoKCQkJdXJxLT5yZXN1bHQgPSBVSUxfU1VDQ0VTUzsKCQl9IGVsc2UgewoJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOwoJCX0KCX0gZWxzZSB7CgkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9XUk9OR19JRkJcbiIgKTsKCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfV1JPTkdfSUZCOwoJfQoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIHJlc3VsdDsKfSAvLyB3dmxhbl91aWxfZ2V0X2luZm8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgljZmdfZHJpdmVyX2luZm8oKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUmV0cmlldmVzIGRyaXZlciBpbmZvcm1hdGlvbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgVUlMX1NVQ0NFU1MKICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGNmZ19kcml2ZXJfaW5mbyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CglpbnQgcmVzdWx0ID0gMDsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJREJHX0ZVTkMoICJjZmdfZHJpdmVyX2luZm8iICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCgoJLyogTWFrZSBzdXJlIHRoYXQgdXNlciBidWZmZXIgY2FuIGhhbmRsZSB0aGUgZHJpdmVyIGluZm9ybWF0aW9uIGJ1ZmZlciAqLwoJaWYoIHVycS0+bGVuIDwgc2l6ZW9mKCBscC0+ZHJpdmVySW5mbyApKSB7CgkJdXJxLT5sZW4gPSBzaXplb2YoIGxwLT5kcml2ZXJJbmZvICk7CgkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0xFTjsKCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoKCS8qIFZlcmlmeSB0aGUgdXNlciBidWZmZXIuICovCglyZXN1bHQgPSB2ZXJpZnlfYXJlYSggVkVSSUZZX1dSSVRFLCB1cnEtPmRhdGEsIHNpemVvZiggbHAtPmRyaXZlckluZm8gKSk7CglpZiggcmVzdWx0ICE9IDAgKSB7CgkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoKCWxwLT5kcml2ZXJJbmZvLmNhcmRfc3RhdCA9IGxwLT5oY2ZDdHguSUZCX0NhcmRTdGF0OwoKCS8vIENvcHkgdGhlIGRyaXZlciBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyJ3MgYnVmZmVyLgoJdXJxLT5yZXN1bHQgPSBVSUxfU1VDQ0VTUzsKCWNvcHlfdG9fdXNlciggdXJxLT5kYXRhLCAmKCBscC0+ZHJpdmVySW5mbyApLCBzaXplb2YoIGxwLT5kcml2ZXJJbmZvICkpOwoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIHJlc3VsdDsKfSAvLyBjZmdfZHJpdmVyX2luZm8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCWNmZ19kcml2ZXJfaWRlbnRpdHkoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgUmV0cmlldmVzIElEIGluZm9ybWF0aW9uIGZyb20gdGhlIGNhcmQuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIFVJTF9TVUNDRVNTCiAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBjZmdfZHJpdmVyX2lkZW50aXR5KCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKCWludCByZXN1bHQgPSAwOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglEQkdfRlVOQyggInd2bGFuX2RyaXZlcl9pZGVudGl0eSIgKTsKCURCR19FTlRFUiggRGJnSW5mbyApOwoKCgkvKiBNYWtlIHN1cmUgdGhhdCB1c2VyIGJ1ZmZlciBjYW4gaGFuZGxlIHRoZSBkcml2ZXIgaWRlbnRpdHkgc3RydWN0dXJlLiAqLwoJaWYoIHVycS0+bGVuIDwgc2l6ZW9mKCBscC0+ZHJpdmVySWRlbnRpdHkgKSkgewoJCXVycS0+bGVuID0gc2l6ZW9mKCBscC0+ZHJpdmVySWRlbnRpdHkgKTsKCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOwoJCURCR19MRUFWRSggRGJnSW5mbyApOwoJCXJldHVybiByZXN1bHQ7Cgl9CgoJLyogVmVyaWZ5IHRoZSB1c2VyIGJ1ZmZlci4gKi8KCXJlc3VsdCA9IHZlcmlmeV9hcmVhKCBWRVJJRllfV1JJVEUsIHVycS0+ZGF0YSwgc2l6ZW9mKCBscC0+ZHJpdmVySWRlbnRpdHkgKSk7CglpZiggcmVzdWx0ICE9IDAgKSB7CgkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoKCS8qIENvcHkgdGhlIGRyaXZlciBpZGVudGl0eSBpbnRvIHRoZSB1c2VyJ3MgYnVmZmVyLiAqLwoJdXJxLT5yZXN1bHQgPSBVSUxfU1VDQ0VTUzsKCWNvcHlfdG9fdXNlciggdXJxLT5kYXRhLCAmKCBscC0+ZHJpdmVySWRlbnRpdHkgKSwgc2l6ZW9mKCBscC0+ZHJpdmVySWRlbnRpdHkgKSk7CgoJREJHX0xFQVZFKCBEYmdJbmZvICk7CglyZXR1cm4gcmVzdWx0Owp9IC8vIGNmZ19kcml2ZXJfaWRlbnRpdHkKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgojZW5kaWYgIC8qIFVTRV9VSUwgKi8KCgovKiBJZiBXSVJFTEVTU19FWFQgaXMgbm90IGRlZmluZWQsIHRoZW4gdGhlIGZ1bmN0aW9ucyB0aGF0IGZvbGxvdyB3aWxsIG5vdCBiZQogICBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuICovCi8qIE5PVEU6IEFyZSB0aGVzZSBzdGlsbCBldmVuIG5lZWRlZD8gKi8KI2lmZGVmIFdJUkVMRVNTX0VYVAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXd2bGFuX3NldF9uZXRuYW1lKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFNldCB0aGUgRVNTSUQgb2YgdGhlIGNhcmQuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHdycSAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3dmxhbl9zZXRfbmV0bmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAoJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCgkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKCQkgICAgICBjaGFyICpleHRyYSkKewogICAgICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwoJaW50IHJldCA9IDA7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCURCR19GVU5DKCAid3ZsYW5fc2V0X25ldG5hbWUiICk7CglEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICAgICAgd2xfbG9jayhscCwgJmZsYWdzKTsKCiAgICAgICAgbWVtc2V0KCBscC0+TmV0d29ya05hbWUsIDAsIHNpemVvZiggbHAtPk5ldHdvcmtOYW1lICkpOwogICAgICAgIG1lbWNweSggbHAtPk5ldHdvcmtOYW1lLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOwoKCS8qIENvbW1pdCB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzICovCgl3bF9hcHBseShscCk7CiAgICAgICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIHJldDsKfSAvLyB3dmxhbl9zZXRfbmV0bmFtZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd3ZsYW5fZ2V0X25ldG5hbWUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgR2V0IHRoZSBFU1NJRCBvZiB0aGUgY2FyZC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgd3JxIC0gYSBwb2ludGVyIHRvIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHd2bGFuX2dldF9uZXRuYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCgkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCSAgICAgIGNoYXIgKmV4dHJhKQp7CiAgICAgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOwogICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICAgICAgaW50ICAgICAgICAgcmV0ID0gMDsKICAgICAgICBpbnQgICAgICAgICBzdGF0dXMgPSAtMTsKICAgICAgICB3dk5hbWVfdCAgICpwTmFtZTsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgICAgIERCR19GVU5DKCAid3ZsYW5fZ2V0X25ldG5hbWUiICk7CiAgICAgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgICAgIHdsX2xvY2sobHAsICZmbGFncyk7CgogICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBuZXR3b3JrIG5hbWUgKi8KICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoIHNpemVvZiggKnBOYW1lICkgLyBzaXplb2YoIGhjZl8xNiApKTsKICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DVVJfU1NJRDsKCiAgICAgICAgc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgogICAgICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CiAgICAgICAgICAgICAgICBwTmFtZSA9ICh3dk5hbWVfdCAqKSYoIGxwLT5sdHZSZWNvcmQudS51MzIgKTsKCgkJbWVtc2V0KGV4dHJhLCAnXDAnLCBIQ0ZfTUFYX05BTUVfTEVOKTsKCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBOYW1lLT5sZW5ndGg7CgogICAgICAgICAgICAgICAgbWVtY3B5KGV4dHJhLCBwTmFtZS0+bmFtZSwgcE5hbWUtPmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7Cgl9CgogICAgICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKCiAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICAgICAgcmV0dXJuIHJldDsKfSAvLyB3dmxhbl9nZXRfbmV0bmFtZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd3ZsYW5fc2V0X3N0YXRpb25fbmlja25hbWUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgU2V0IHRoZSBjYXJkJ3Mgc3RhdGlvbiBuaWNrbmFtZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgd3JxIC0gYSBwb2ludGVyIHRvIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHd2bGFuX3NldF9zdGF0aW9uX25pY2tuYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCgkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAoJCSAgICAgIGNoYXIgKmV4dHJhKQp7CiAgICAgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOwogICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICAgICAgaW50ICAgICAgICAgcmV0ID0gMDsKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgICAgIERCR19GVU5DKCAid3ZsYW5fc2V0X3N0YXRpb25fbmlja25hbWUiICk7CiAgICAgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgICAgIHdsX2xvY2sobHAsICZmbGFncyk7CgogICAgICAgIG1lbXNldCggbHAtPlN0YXRpb25OYW1lLCAwLCBzaXplb2YoIGxwLT5TdGF0aW9uTmFtZSApKTsKCiAgICAgICAgbWVtY3B5KCBscC0+U3RhdGlvbk5hbWUsIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CgogICAgICAgIC8qIENvbW1pdCB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzICovCiAgICAgICAgd2xfYXBwbHkoIGxwICk7CiAgICAgICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwoKICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICAgICByZXR1cm4gcmV0Owp9IC8vIHd2bGFuX3NldF9zdGF0aW9uX25pY2tuYW1lCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3dmxhbl9nZXRfc3RhdGlvbl9uaWNrbmFtZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBHZXQgdGhlIGNhcmQncyBzdGF0aW9uIG5pY2tuYW1lLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICB3cnEgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd3ZsYW5fZ2V0X3N0YXRpb25fbmlja25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAoJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCgkJICAgICAgY2hhciAqZXh0cmEpCnsKICAgICAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CiAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCAgICAgICAgIHJldCA9IDA7CglpbnQgICAgICAgICBzdGF0dXMgPSAtMTsKCXd2TmFtZV90ICAgKnBOYW1lOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICAgICAgREJHX0ZVTkMoICJ3dmxhbl9nZXRfc3RhdGlvbl9uaWNrbmFtZSIgKTsKICAgICAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICAgICAgd2xfbG9jayggbHAsICZmbGFncyApOwoKICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlvbiBuYW1lICovCiAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKCBzaXplb2YoICpwTmFtZSApIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CiAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ05GX09XTl9OQU1FOwoKICAgICAgICBzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKCiAgICAgICAgaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKICAgICAgICAgICAgICAgIHBOYW1lID0gKHd2TmFtZV90ICopJiggbHAtPmx0dlJlY29yZC51LnUzMiApOwoKCQltZW1zZXQoZXh0cmEsICdcMCcsIEhDRl9NQVhfTkFNRV9MRU4pOwoJCXdycXUtPmRhdGEubGVuZ3RoID0gcE5hbWUtPmxlbmd0aDsKCQltZW1jcHkoZXh0cmEsIHBOYW1lLT5uYW1lLCBwTmFtZS0+bGVuZ3RoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKICAgICAgICB9CgogICAgICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKCi8vb3V0OgogICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIHJldDsKfSAvLyB3dmxhbl9nZXRfc3RhdGlvbl9uaWNrbmFtZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd3ZsYW5fc2V0X3BvcnR0eXBlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFNldCB0aGUgY2FyZCdzIHBvcnR0eXBlCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHdycSAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3dmxhbl9zZXRfcG9ydHR5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAoJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCgkJICAgICAgY2hhciAqZXh0cmEpCnsKICAgICAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CiAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICAgICAgICBpbnQgICAgIHJldCA9IDA7CgloY2ZfMTYgIHBvcnRUeXBlOwoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICAgICAgREJHX0ZVTkMoICJ3dmxhbl9zZXRfcG9ydHR5cGUiICk7CiAgICAgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgICAgIHdsX2xvY2sobHAsICZmbGFncyk7CgogICAgICAgIC8qIFZhbGlkYXRlIHRoZSBuZXcgdmFsdWUgKi8KICAgICAgICBwb3J0VHlwZSA9ICooKF9fdTMyICopZXh0cmEpOwoKICAgICAgICBpZiggISgoIHBvcnRUeXBlID09IDEgKSB8fCAoIHBvcnRUeXBlID09IDMgKSkpIHsKICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CgkJZ290byBvdXRfdW5sb2NrOwogICAgICAgIH0KCiAgICAgICAgbHAtPlBvcnRUeXBlID0gcG9ydFR5cGU7CgogICAgICAgIC8qIENvbW1pdCB0aGUgYWRhcHRlciBwYXJhbWV0ZXJzICovCiAgICAgICAgd2xfYXBwbHkoIGxwICk7CgpvdXRfdW5sb2NrOgogICAgICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKCi8vb3V0OgogICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgICAgIHJldHVybiByZXQ7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd3ZsYW5fZ2V0X3BvcnR0eXBlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEdldCB0aGUgY2FyZCdzIHBvcnR0eXBlCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHdycSAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3dmxhbl9nZXRfcG9ydHR5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAoJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCgkJICAgICAgY2hhciAqZXh0cmEpCnsKICAgICAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CiAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICAgICAgICBpbnQgICAgIHJldCA9IDA7CiAgICAgICAgaW50ICAgICBzdGF0dXMgPSAtMTsKICAgICAgICBoY2ZfMTYgICpwUG9ydFR5cGU7CiAgICAgICAgX191MzIgKnBEYXRhID0gKF9fdTMyICopZXh0cmE7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAgICAgICBEQkdfRlVOQyggInd2bGFuX2dldF9wb3J0dHlwZSIgKTsKICAgICAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICAgICAgd2xfbG9jayggbHAsICZmbGFncyApOwoKICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgcG9ydCB0eXBlICovCiAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKCBzaXplb2YoICpwUG9ydFR5cGUgKSAvIHNpemVvZiggaGNmXzE2ICkpOwogICAgICAgIGxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NORl9QT1JUX1RZUEU7CgogICAgICAgIHN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwoKICAgICAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewogICAgICAgICAgICAgICAgcFBvcnRUeXBlID0gKGhjZl8xNiAqKSYoIGxwLT5sdHZSZWNvcmQudS51MzIgKTsKCiAgICAgICAgICAgICAgICAqcERhdGEgPSBDTlZfTElUVExFX1RPX0lOVCggKnBQb3J0VHlwZSApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7Cgl9CgogICAgICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKCi8vb3V0OgogICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgICAgIHJldHVybiByZXQ7Cn0gLy8gd3ZsYW5fZ2V0X3BvcnR0eXBlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojZW5kaWYgIC8vIFdJUkVMRVNTX0VYVAoKCgoKI2lmZGVmIFVTRV9SVFMKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd3ZsYW5fcnRzKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIElPQ1RMIGhhbmRsZXIgZm9yIFJUUyBjb21tYW5kcwogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBycnEgLSBhIHBvaW50ZXIgdG8gdGhlIHJ0cyByZXF1ZXN0IGJ1ZmZlcgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHd2bGFuX3J0cyggc3RydWN0IHJ0c3JlcSAqcnJxLCBfX3UzMiBpb19iYXNlICkKewoJaW50IGlvY3RsX3JldCA9IDA7CgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCURCR19GVU5DKCAid3ZsYW5fcnRzIiApOwoJREJHX0VOVEVSKCBEYmdJbmZvICk7CgoKCURCR19QUklOVCggImlvX2Jhc2U6IDB4JTA4eFxuIiwgaW9fYmFzZSApOwoKCXN3aXRjaCggcnJxLT50eXAgKSB7CgkgIGNhc2UgV0xfSU9DVExfUlRTX1JFQUQ6CgkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1JUUyAtLSBXTF9JT0NUTF9SVFNfUkVBRFxuIik7CgkJcnJxLT5kYXRhWzBdID0gSU5fUE9SVF9XT1JEKCBpb19iYXNlICsgcnJxLT5yZWcgKTsKCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIgIHJlZyAweCUwNHggPT0+IDB4JTA0eFxuIiwgcnJxLT5yZWcsIENOVl9MSVRUTEVfVE9fU0hPUlQoIHJycS0+ZGF0YVswXSApICk7CgkJYnJlYWs7CgkgIGNhc2UgV0xfSU9DVExfUlRTX1dSSVRFOgoJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9SVFMgLS0gV0xfSU9DVExfUlRTX1dSSVRFXG4iKTsKCQlPVVRfUE9SVF9XT1JEKCBpb19iYXNlICsgcnJxLT5yZWcsIHJycS0+ZGF0YVswXSApOwoJCURCR19UUkFDRSggRGJnSW5mbywgIiAgcmVnIDB4JTA0eCA8PT0gMHglMDR4XG4iLCBycnEtPnJlZywgQ05WX0xJVFRMRV9UT19TSE9SVCggcnJxLT5kYXRhWzBdICkgKTsKCQlicmVhazsKCSAgY2FzZSBXTF9JT0NUTF9SVFNfQkFUQ0hfUkVBRDoKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfUlRTIC0tIFdMX0lPQ1RMX1JUU19CQVRDSF9SRUFEXG4iKTsKCQlJTl9QT1JUX1NUUklOR18xNiggaW9fYmFzZSArIHJycS0+cmVnLCBycnEtPmRhdGEsIHJycS0+bGVuICk7CgkJREJHX1RSQUNFKCBEYmdJbmZvLCAiICByZWcgMHglMDR4ID09PiAlZCBieXRlc1xuIiwgcnJxLT5yZWcsIHJycS0+bGVuICogc2l6ZW9mIChfX3UxNiApICk7CgkJYnJlYWs7CgkgIGNhc2UgV0xfSU9DVExfUlRTX0JBVENIX1dSSVRFOgoJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9SVFMgLS0gV0xfSU9DVExfUlRTX0JBVENIX1dSSVRFXG4iKTsKCQlPVVRfUE9SVF9TVFJJTkdfMTYoIGlvX2Jhc2UgKyBycnEtPnJlZywgcnJxLT5kYXRhLCBycnEtPmxlbiApOwoJCURCR19UUkFDRSggRGJnSW5mbywgIiAgcmVnIDB4JTA0eCA8PT0gJWQgYnl0ZXNcbiIsIHJycS0+cmVnLCBycnEtPmxlbiAqIHNpemVvZiAoX191MTYpICk7CgkJYnJlYWs7CglkZWZhdWx0OgoKCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfUlRTIC0tIFVOU1VQUE9SVEVEIFJUUyBDT0RFOiAweCVYIiwgcnJxLT50eXAgKTsKCQlpb2N0bF9yZXQgPSAtRU9QTk9UU1VQUDsKCQlicmVhazsKCX0KCglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybiBpb2N0bF9yZXQ7Cn0gLy8gd3ZsYW5fcnRzCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojZW5kaWYgIC8qIFVTRV9SVFMgKi8K