Ci8qCiAqIElCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRGV2aWNlIERyaXZlcgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogKgogKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogKgogKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCiAqCiAqLwoKLyogUmVtb3RlIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudCBoYW5kbGluZyBmdW5jdGlvbnMgKi8KCiNpbmNsdWRlICJpYm1hc20uaCIKI2luY2x1ZGUgInJlbW90ZS5oIgoKaW50IGlibWFzbV9pbml0X3JlbW90ZV9xdWV1ZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKQp7CglzdHJ1Y3QgcmVtb3RlX3F1ZXVlICpxID0gJnNwLT5yZW1vdGVfcXVldWU7CgoJZGlzYWJsZV9tb3VzZV9pbnRlcnJ1cHRzKHNwKTsKCglxLT5vcGVuID0gMDsKCXEtPnNpemUgPSAwOwoKCXEtPnN0YXJ0ID0ga21hbGxvYyhEUklWRVJfUkVNT1RFX1FVRVVFX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJlbW90ZV9ldmVudCksIEdGUF9LRVJORUwpOwogICAgICAgIGlmIChxLT5zdGFydCA9PSAwKQogICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CgoJcS0+ZW5kID0gcS0+c3RhcnQgKyBEUklWRVJfUkVNT1RFX1FVRVVFX1NJWkU7CglxLT5yZWFkZXIgPSBxLT5zdGFydDsKCXEtPndyaXRlciA9IHEtPnN0YXJ0OwoJcS0+c2l6ZSA9IERSSVZFUl9SRU1PVEVfUVVFVUVfU0laRTsKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnEtPndhaXQpOwoKCXJldHVybiAwOwp9Cgp2b2lkIGlibWFzbV9mcmVlX3JlbW90ZV9xdWV1ZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKQp7CglrZnJlZShzcC0+cmVtb3RlX3F1ZXVlLnN0YXJ0KTsKfQoKdm9pZCBpYm1hc21fYWR2YW5jZV9yZWFkZXIoc3RydWN0IHJlbW90ZV9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IG4pCnsKCXEtPnJlYWRlciArPSBuOwoJaWYgKHEtPnJlYWRlciA+PSBxLT5lbmQpCgkJcS0+cmVhZGVyIC09IHEtPnNpemU7Cn0KCnNpemVfdCBpYm1hc21fZXZlbnRzX2F2YWlsYWJsZShzdHJ1Y3QgcmVtb3RlX3F1ZXVlICpxKQp7Cglzc2l6ZV90IGRpZmYgPSBxLT53cml0ZXIgLSBxLT5yZWFkZXI7CiAKCXJldHVybiAoZGlmZiA+PSAwKSA/IGRpZmYgOiBxLT5lbmQgLSBxLT5yZWFkZXI7CQp9CgkKCnN0YXRpYyBpbnQgc3BhY2VfZnJlZShzdHJ1Y3QgcmVtb3RlX3F1ZXVlICpxKQp7CglpZiAocS0+cmVhZGVyID09IHEtPndyaXRlcikKCQlyZXR1cm4gcS0+c2l6ZSAtIDE7CgoJcmV0dXJuICggKHEtPnJlYWRlciArIHEtPnNpemUgLSBxLT53cml0ZXIpICUgcS0+c2l6ZSApIC0gMTsKfQoKc3RhdGljIHZvaWQgc2V0X21vdXNlX2V2ZW50KHN0cnVjdCByZW1vdGVfaW5wdXQgKmlucHV0LCBzdHJ1Y3QgbW91c2VfZXZlbnQgKm1vdXNlKQp7CglzdGF0aWMgY2hhciBsYXN0X2J1dHRvbnMgPSAwOwoKCW1vdXNlLT54ID0gaW5wdXQtPmRhdGEubW91c2UueDsKCW1vdXNlLT55ID0gaW5wdXQtPmRhdGEubW91c2UueTsKCglpZiAoaW5wdXQtPm1vdXNlX2J1dHRvbnMgPT0gUkVNT1RFX01PVVNFX0RPVUJMRV9DTElDSykgewoJCW1vdXNlLT5idXR0b25zID0gUkVNT1RFX01PVVNFX0RPVUJMRV9DTElDSzsKCQlsYXN0X2J1dHRvbnMgPSAwOwoJCXJldHVybjsKCX0KCW1vdXNlLT50cmFuc2l0aW9ucyA9IGxhc3RfYnV0dG9ucyBeIGlucHV0LT5tb3VzZV9idXR0b25zOwoJbW91c2UtPmJ1dHRvbnMgPSBpbnB1dC0+bW91c2VfYnV0dG9uczsKCglsYXN0X2J1dHRvbnMgPSBpbnB1dC0+bW91c2VfYnV0dG9uczsKfQoKc3RhdGljIHZvaWQgc2V0X2tleWJvYXJkX2V2ZW50KHN0cnVjdCByZW1vdGVfaW5wdXQgKmlucHV0LCBzdHJ1Y3Qga2V5Ym9hcmRfZXZlbnQgKmtleWJvYXJkKQp7CglrZXlib2FyZC0+a2V5X2NvZGUgPSBpbnB1dC0+ZGF0YS5rZXlib2FyZC5rZXlfY29kZTsKCWtleWJvYXJkLT5rZXlfZG93biA9IGlucHV0LT5kYXRhLmtleWJvYXJkLmtleV9kb3duOwp9CgpzdGF0aWMgaW50IGFkZF90b19kcml2ZXJfcXVldWUoc3RydWN0IHJlbW90ZV9xdWV1ZSAqcSwgc3RydWN0IHJlbW90ZV9pbnB1dCAqaW5wdXQpCnsKCXN0cnVjdCByZW1vdGVfZXZlbnQgKmV2ZW50ID0gcS0+d3JpdGVyOwoKCWlmIChzcGFjZV9mcmVlKHEpIDwgMSkgewoJCXJldHVybiAxOwoJfQoKCXN3aXRjaChpbnB1dC0+dHlwZSkgewoJY2FzZSAoSU5QVVRfVFlQRV9NT1VTRSk6CgkJZXZlbnQtPnR5cGUgPSBJTlBVVF9UWVBFX01PVVNFOwoJCXNldF9tb3VzZV9ldmVudChpbnB1dCwgJmV2ZW50LT5kYXRhLm1vdXNlKTsKCQlicmVhazsKCWNhc2UgKElOUFVUX1RZUEVfS0VZQk9BUkQpOgoJCWV2ZW50LT50eXBlID0gSU5QVVRfVFlQRV9LRVlCT0FSRDsKCQlzZXRfa2V5Ym9hcmRfZXZlbnQoaW5wdXQsICZldmVudC0+ZGF0YS5rZXlib2FyZCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAwOwoJfQoJZXZlbnQtPnR5cGUgPSBpbnB1dC0+dHlwZTsKCglxLT53cml0ZXIrKzsKCWlmIChxLT53cml0ZXIgPT0gcS0+ZW5kKQoJCXEtPndyaXRlciA9IHEtPnN0YXJ0OwoKCXJldHVybiAwOwp9CgkKCnZvaWQgaWJtYXNtX2hhbmRsZV9tb3VzZV9pbnRlcnJ1cHQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCkKewoJdW5zaWduZWQgbG9uZyByZWFkZXI7Cgl1bnNpZ25lZCBsb25nIHdyaXRlcjsKCXN0cnVjdCByZW1vdGVfaW5wdXQgaW5wdXQ7CgoJcmVhZGVyID0gZ2V0X3F1ZXVlX3JlYWRlcihzcCk7Cgl3cml0ZXIgPSBnZXRfcXVldWVfd3JpdGVyKHNwKTsKCgl3aGlsZSAocmVhZGVyICE9IHdyaXRlcikgewoJCW1lbWNweSgmaW5wdXQsICh2b2lkICopZ2V0X3F1ZXVlX2VudHJ5KHNwLCByZWFkZXIpLCBzaXplb2Yoc3RydWN0IHJlbW90ZV9pbnB1dCkpOwoKCQlpZiAoYWRkX3RvX2RyaXZlcl9xdWV1ZSgmc3AtPnJlbW90ZV9xdWV1ZSwgJmlucHV0KSkKCQkJYnJlYWs7CgoJCXJlYWRlciA9IGFkdmFuY2VfcXVldWVfcmVhZGVyKHNwLCByZWFkZXIpOwoJfQoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzcC0+cmVtb3RlX3F1ZXVlLndhaXQpOwp9Cg==