Ci8qCiAqIElCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRGV2aWNlIERyaXZlcgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogKgogKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogKgogKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgoKLyogRHJpdmVyIGlkZW50aWZpY2F0aW9uICovCiNkZWZpbmUgRFJJVkVSX05BTUUJImlibWFzbSIKI2RlZmluZSBEUklWRVJfVkVSU0lPTiAgIjEuMCIKI2RlZmluZSBEUklWRVJfQVVUSE9SICAgIk1heCBBc2JvY2sgPG1hc2JvY2tAdXMuaWJtLmNvbT4sIFZlcm5vbiBNYXVlcnkgPHZlcm51eEB1cy5pYm0uY29tPiIKI2RlZmluZSBEUklWRVJfREVTQyAgICAgIklCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRHJpdmVyIgoKI2RlZmluZSBlcnIobXNnKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIG1zZyAiXG4iLCBEUklWRVJfTkFNRSkKI2RlZmluZSBpbmZvKG1zZykgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgbXNnICJcbiIsIERSSVZFUl9OQU1FKQoKZXh0ZXJuIGludCBpYm1hc21fZGVidWc7CiNkZWZpbmUgZGJnKFNUUiwgQVJHUy4uLikJCQkJCVwKCWRvIHsJCQkJCQkJXAoJCWlmIChpYm1hc21fZGVidWcpCQkJCVwKCQkJcHJpbnRrKEtFUk5fREVCVUcgU1RSICwgIyNBUkdTKTsJXAoJfSB3aGlsZSAoMCkKCnN0YXRpYyBpbmxpbmUgY2hhciAqZ2V0X3RpbWVzdGFtcChjaGFyICpidWYpCnsKCXN0cnVjdCB0aW1ldmFsIG5vdzsKCWRvX2dldHRpbWVvZmRheSgmbm93KTsKCXNwcmludGYoYnVmLCAiJWx1LiVsdSIsIG5vdy50dl9zZWMsIG5vdy50dl91c2VjKTsKCXJldHVybiBidWY7Cn0KCiNkZWZpbmUgSUJNQVNNX0NNRF9QRU5ESU5HCTAJCiNkZWZpbmUgSUJNQVNNX0NNRF9DT01QTEVURQkxCQojZGVmaW5lIElCTUFTTV9DTURfRkFJTEVECTIKCiNkZWZpbmUgSUJNQVNNX0NNRF9USU1FT1VUX05PUk1BTAk0NQojZGVmaW5lIElCTUFTTV9DTURfVElNRU9VVF9FWFRSQQkyNDAKCiNkZWZpbmUgSUJNQVNNX0NNRF9NQVhfQlVGRkVSX1NJWkUJMHg4MDAwCgojZGVmaW5lIFJFVkVSU0VfSEVBUlRCRUFUX1RJTUVPVVQJMTIwCgojZGVmaW5lIEhFQVJUQkVBVF9CVUZGRVJfU0laRQkJMHg0MDAKCiNpZmRlZiBJQTY0CiNkZWZpbmUgSUJNQVNNX0RSSVZFUl9WUEQgIkxpbjY0IDYuMDggICAgICAiCiNlbHNlCiNkZWZpbmUgSUJNQVNNX0RSSVZFUl9WUEQgIkxpbjMyIDYuMDggICAgICAiCiNlbmRpZgoKI2RlZmluZSBTWVNURU1fU1RBVEVfT1NfVVAgICAgICA1CiNkZWZpbmUgU1lTVEVNX1NUQVRFX09TX0RPV04gICAgNAoKI2RlZmluZSBJQk1BU01fTkFNRV9TSVpFCTE2CgojZGVmaW5lIElCTUFTTV9OVU1fRVZFTlRTCTEwCiNkZWZpbmUgSUJNQVNNX0VWRU5UX01BWF9TSVpFCTIwNDh1CgoKc3RydWN0IGNvbW1hbmQgewoJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZV9ub2RlOwoJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKCXVuc2lnbmVkIGNoYXIJCSpidWZmZXI7CglzaXplX3QJCQlidWZmZXJfc2l6ZTsKCWludAkJCXN0YXR1czsKCXN0cnVjdCBrb2JqZWN0CQlrb2JqOwoJc3BpbmxvY2tfdAkJKmxvY2s7Cn07CiNkZWZpbmUgdG9fY29tbWFuZChjKSBjb250YWluZXJfb2YoYywgc3RydWN0IGNvbW1hbmQsIGtvYmopCgpzdGF0aWMgaW5saW5lIHZvaWQgY29tbWFuZF9wdXQoc3RydWN0IGNvbW1hbmQgKmNtZCkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZShjbWQtPmxvY2ssIGZsYWdzKTsKICAgICAgICBrb2JqZWN0X3B1dCgmY21kLT5rb2JqKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY21kLT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjb21tYW5kX2dldChzdHJ1Y3QgY29tbWFuZCAqY21kKQp7CiAgICAgICAga29iamVjdF9nZXQoJmNtZC0+a29iaik7Cn0KCgpzdHJ1Y3QgaWJtYXNtX2V2ZW50IHsKCXVuc2lnbmVkIGludAlzZXJpYWxfbnVtYmVyOwoJdW5zaWduZWQgaW50CWRhdGFfc2l6ZTsKCXVuc2lnbmVkIGNoYXIJZGF0YVtJQk1BU01fRVZFTlRfTUFYX1NJWkVdOwp9OwoKc3RydWN0IGV2ZW50X2J1ZmZlciB7CglzdHJ1Y3QgaWJtYXNtX2V2ZW50CWV2ZW50c1tJQk1BU01fTlVNX0VWRU5UU107Cgl1bnNpZ25lZCBpbnQJCW5leHRfc2VyaWFsX251bWJlcjsKCXVuc2lnbmVkIGludAkJbmV4dF9pbmRleDsKCXN0cnVjdCBsaXN0X2hlYWQJcmVhZGVyczsKfTsKCnN0cnVjdCBldmVudF9yZWFkZXIgewoJaW50CQkJY2FuY2VsbGVkOwoJdW5zaWduZWQgaW50CQluZXh0X3NlcmlhbF9udW1iZXI7Cgl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwoJc3RydWN0IGxpc3RfaGVhZAlub2RlOwoJdW5zaWduZWQgaW50CQlkYXRhX3NpemU7Cgl1bnNpZ25lZCBjaGFyCQlkYXRhW0lCTUFTTV9FVkVOVF9NQVhfU0laRV07Cn07CgpzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgewoJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKCXVuc2lnbmVkIGludAkJc3RvcHBlZDsKfTsKCnN0cnVjdCBpYm1hc21fcmVtb3RlIHsKCXN0cnVjdCBpbnB1dF9kZXYga2V5YmRfZGV2OwoJc3RydWN0IGlucHV0X2RldiBtb3VzZV9kZXY7Cn07CgpzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgewoJc3RydWN0IGxpc3RfaGVhZAlub2RlOwoJc3BpbmxvY2tfdAkJbG9jazsKCXZvaWQgX19pb21lbQkJKmJhc2VfYWRkcmVzczsKCXVuc2lnbmVkIGludAkJaXJxOwoJc3RydWN0IGNvbW1hbmQJCSpjdXJyZW50X2NvbW1hbmQ7CglzdHJ1Y3QgY29tbWFuZAkJKmhlYXJ0YmVhdDsKCXN0cnVjdCBsaXN0X2hlYWQJY29tbWFuZF9xdWV1ZTsKCXN0cnVjdCBldmVudF9idWZmZXIJKmV2ZW50X2J1ZmZlcjsKCWNoYXIJCQlkaXJuYW1lW0lCTUFTTV9OQU1FX1NJWkVdOwoJY2hhcgkJCWRldm5hbWVbSUJNQVNNX05BTUVfU0laRV07Cgl1bnNpZ25lZCBpbnQJCW51bWJlcjsKCXN0cnVjdCBpYm1hc21fcmVtb3RlCSpyZW1vdGU7CglpbnQJCQlzZXJpYWxfbGluZTsKCXN0cnVjdCBkZXZpY2UJCSpkZXY7Cn07CgovKiBjb21tYW5kIHByb2Nlc3NpbmcgKi8KZXh0ZXJuIHN0cnVjdCBjb21tYW5kICppYm1hc21fbmV3X2NvbW1hbmQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc2l6ZV90IGJ1ZmZlcl9zaXplKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX2V4ZWNfY29tbWFuZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgY29tbWFuZCAqY21kKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3dhaXRfZm9yX3Jlc3BvbnNlKHN0cnVjdCBjb21tYW5kICpjbWQsIGludCB0aW1lb3V0KTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfY29tbWFuZF9yZXNwb25zZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCB2b2lkICpyZXNwb25zZSwgIHNpemVfdCBzaXplKTsKCi8qIGV2ZW50IHByb2Nlc3NpbmcgKi8KZXh0ZXJuIGludCBpYm1hc21fZXZlbnRfYnVmZmVyX2luaXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiB2b2lkIGlibWFzbV9ldmVudF9idWZmZXJfZXhpdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgIHVuc2lnbmVkIGludCBkYXRhX3NpemUpOwpleHRlcm4gdm9pZCBpYm1hc21fZXZlbnRfcmVhZGVyX3JlZ2lzdGVyKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CmV4dGVybiB2b2lkIGlibWFzbV9ldmVudF9yZWFkZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwpleHRlcm4gaW50IGlibWFzbV9nZXRfbmV4dF9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwpleHRlcm4gdm9pZCBpYm1hc21fY2FuY2VsX25leHRfZXZlbnQoc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKCi8qIGhlYXJ0YmVhdCAtIGZyb20gU1AgdG8gT1MgKi8KZXh0ZXJuIHZvaWQgaWJtYXNtX3JlZ2lzdGVyX3BhbmljX25vdGlmaWVyKHZvaWQpOwpleHRlcm4gdm9pZCBpYm1hc21fdW5yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKTsKZXh0ZXJuIGludCBpYm1hc21faGVhcnRiZWF0X2luaXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiB2b2lkIGlibWFzbV9oZWFydGJlYXRfZXhpdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsICB2b2lkICptZXNzYWdlLCBzaXplX3Qgc2l6ZSk7CgovKiByZXZlcnNlIGhlYXJ0YmVhdCAtIGZyb20gT1MgdG8gU1AgKi8KZXh0ZXJuIHZvaWQgaWJtYXNtX2luaXRfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwpleHRlcm4gaW50IGlibWFzbV9zdGFydF9yZXZlcnNlX2hlYXJ0YmVhdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgKnJoYik7CmV4dGVybiB2b2lkIGlibWFzbV9zdG9wX3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKCi8qIGRvdCBjb21tYW5kcyAqLwpleHRlcm4gdm9pZCBpYm1hc21fcmVjZWl2ZV9tZXNzYWdlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKmRhdGEsIGludCBkYXRhX3NpemUpOwpleHRlcm4gaW50IGlibWFzbV9zZW5kX2RyaXZlcl92cGQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiBpbnQgaWJtYXNtX3NlbmRfb3Nfc3RhdGUoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgaW50IG9zX3N0YXRlKTsKCi8qIGxvdyBsZXZlbCBtZXNzYWdlIHByb2Nlc3NpbmcgKi8KZXh0ZXJuIGludCBpYm1hc21fc2VuZF9pMm9fbWVzc2FnZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIGlycXJldHVybl90IGlibWFzbV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CgovKiByZW1vdGUgY29uc29sZSAqLwpleHRlcm4gdm9pZCBpYm1hc21faGFuZGxlX21vdXNlX2ludGVycnVwdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CmV4dGVybiBpbnQgaWJtYXNtX2luaXRfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX2ZyZWVfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKCi8qIGZpbGUgc3lzdGVtICovCmV4dGVybiBpbnQgaWJtYXNtZnNfcmVnaXN0ZXIodm9pZCk7CmV4dGVybiB2b2lkIGlibWFzbWZzX3VucmVnaXN0ZXIodm9pZCk7CmV4dGVybiB2b2lkIGlibWFzbWZzX2FkZF9zcChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKCi8qIHVhcnQgKi8KI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MApleHRlcm4gdm9pZCBpYm1hc21fcmVnaXN0ZXJfdWFydChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3VucmVnaXN0ZXJfdWFydChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKI2Vsc2UKI2RlZmluZSBpYm1hc21fcmVnaXN0ZXJfdWFydChzcCkJZG8geyB9IHdoaWxlKDApCiNkZWZpbmUgaWJtYXNtX3VucmVnaXN0ZXJfdWFydChzcCkJZG8geyB9IHdoaWxlKDApCiNlbmRpZgo=