LyoqDQogKiBAZmlsZSB2b2ljZV9hcGkuYw0KICogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIHRoZSBwdWJsaWMgQVBJcyBvZiBsaWJ2b2ljZS4NCiAqDQogKiBDb3B5cmlnaHQgKEMpIDIwMjMgU2FuZWNoaXBzIFRlY2hub2xvZ3kgQ28uLCBMdGQuDQogKiBAYXV0aG9yIA0KICogDQogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMNCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiCjqLHY0aGjukdQTHYyIExpY2VuY2WjqQ0KICoNCiAqLw0KDQoNCg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQoNCiNpbmNsdWRlIDxzdGRpbnQuaD4NCi8vI2luY2x1ZGUgInZvbHRlX2Rydi5oIg0KI2luY2x1ZGUgPGxpbnV4L3ZvbHRlX2Rydi5oPg0KDQojaW5jbHVkZSA8c3lzL2lvY3RsLmg+DQojaW5jbHVkZSA8ZmNudGwuaD4NCiNpbmNsdWRlIDx0aW55YWxzYS9hdWRpb19taXhlcl9jdHJsLmg+DQojaW5jbHVkZSAidm9pY2VfbGliLmgiDQoNCiNkZWZpbmUgVk9DSUVfU05EX0NBUkRfTlVNIDANCg0KDQpleHRlcm4gaW50IG1peF9zZXRfdm9pY2Vfdm9sKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCB2b2x1bWUpOw0KZXh0ZXJuIGludCBtaXhfZ2V0X3ZvaWNlX3ZvbChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKnZvbHVtZSk7DQpleHRlcm4gaW50IG1peF9zZXRfdHhfdm9pY2Vfdm9sKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCB2b2x1bWUpOw0KZXh0ZXJuIGludCBtaXhfZ2V0X3R4X3ZvaWNlX3ZvbChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKnZvbHVtZSk7DQpleHRlcm4gaW50IG1peF9zZXRfdm9pY2VfbXV0ZShzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBib29sIGVuYWJsZSk7DQpleHRlcm4gaW50IG1peF9nZXRfdm9pY2VfbXV0ZShzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKmVuYWJsZSk7DQpleHRlcm4gaW50IG1peF9zZXRfcnhfdm9pY2VfbXV0ZShzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBib29sIGVuYWJsZSk7DQpleHRlcm4gaW50IG1peF9nZXRfcnhfdm9pY2VfbXV0ZShzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgKmVuYWJsZSk7DQpleHRlcm4gaW50IG1peF9zZXRfdm9pY2VfcGF0aChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBpbnQgcGF0aCk7DQpleHRlcm4gaW50IG1peF9zZXRfdnBfcGF0aChzdHJ1Y3QgbWl4ZXIgKm1peGVyLCBjaGFyIHBhdGgpOw0KZXh0ZXJuIGludCBtaXhfZ2V0X3ZwX3BhdGgoc3RydWN0IG1peGVyICptaXhlciwgaW50ICpwYXRoKTsNCmV4dGVybiBpbnQgbWl4X2dldF92b2ljZV9wYXRoKHN0cnVjdCBtaXhlciAqbWl4ZXIsIGludCAqcGF0aCk7DQoNCg0KCQ0KI2RlZmluZSBWT0NJRV9TTkRfQ0FSRF9OVU0gMA0KCQ0KCQ0KCQ0KLy/orr7nva52b2ljZemfs+mikeiuvuWkh+aooeW8jyBkZXZfbW9kZe+8mmhhbmRzZXQsc3BlYWtlcixoZWFkc2V0CTAg6KGo56S65oiQ5Yqf77w/5YW25a6D6KGo56S65pyJ6ZSZ6K8/DQppbnQgc2V0X3ZvaWNlX2RldmljZV9tb2RlKGludCBkZXZfbW9kZSkNCnsNCg0KCXN0cnVjdCBtaXhlciAqdm9pY2VfbWl4ZXIgPSBOVUxMOw0KCXByaW50ZigiJXM6IHN0YXJ0IGRldl9tb2RlPSVkIVxuIixfX2Z1bmNfXywgZGV2X21vZGUpOw0KDQoJaWYgKChkZXZfbW9kZSA8IFRfT1VUUFVUX0hBTkRTRVQgKSB8fChkZXZfbW9kZSA+PSBUX09VVFBVVF9NQVgpKXsNCgkJcHJpbnRmKCIlczogZGV2X21vZGUgbm90IHN1cHBvcnQsIGRldl9tb2RlPSVkIVxuIixfX2Z1bmNfXywgZGV2X21vZGUpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9zZXRfdm9pY2VfcGF0aCh2b2ljZV9taXhlciwgZGV2X21vZGUpOw0KDQoJLy9jbG9zZSBtaXhlcg0KCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgl2b2ljZV9taXhlciA9IE5VTEw7DQoNCg0KCXJldHVybiAwOw0KCQ0KCQ0KfQ0KDQoNCg0KaW50IHNjX2F1ZGlvX3NldF92b2ljZV9kZXZpY2VfbW9kZShpbnQgZGV2X21vZGUpDQp7DQoNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCglwcmludGYoIiVzOiBzdGFydCBkZXZfbW9kZT0lZCFcbiIsX19mdW5jX18sIGRldl9tb2RlKTsNCg0KCWlmICgoZGV2X21vZGUgPCBUX09VVFBVVF9IQU5EU0VUICkgfHwoZGV2X21vZGUgPj0gVF9PVVRQVVRfTUFYKSl7DQoJCXByaW50ZigiJXM6IGRldl9tb2RlIG5vdCBzdXBwb3J0LCBkZXZfbW9kZT0lZCFcbiIsX19mdW5jX18sIGRldl9tb2RlKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vb3BlbiBtaXhlciBkZXYgZm9yICBjb250cm9sDQoJdm9pY2VfbWl4ZXIgPSBtaXhlcl9vcGVuKFZPQ0lFX1NORF9DQVJEX05VTSk7DQoJaWYgKCF2b2ljZV9taXhlcikgew0KCQlwcmludGYoInZvaWNlX21peGVyIG9wZW4gZmFpbGVkIVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQojaWZkZWYgX0FMU0FfQ09ERUNfSU5fQ0FQDQoJbWl4X3NldF92cF9wYXRoKHZvaWNlX21peGVyLGRldl9tb2RlKTsNCg0KI2Vsc2UNCgkvL2NvbmZpZyBtaXhlciBkZXYNCgltaXhfc2V0X3ZvaWNlX3BhdGgodm9pY2VfbWl4ZXIsIGRldl9tb2RlKTsNCiNlbmRpZg0KDQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsNCg0KDQoJcmV0dXJuIDA7DQoJDQoJDQp9DQoNCg0KaW50IHNjX2F1ZGlvX2dldF92b2ljZV9kZXZpY2VfbW9kZShpbnQgKnBfZGV2X21vZGUpDQp7DQogICAgaW50IHJldCA9IDA7DQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoJcHJpbnRmKCIlczogc3RhcnQhXG4iLF9fZnVuY19fKTsNCg0KCS8vb3BlbiBtaXhlciBkZXYgZm9yICBjb250cm9sDQoJdm9pY2VfbWl4ZXIgPSBtaXhlcl9vcGVuKFZPQ0lFX1NORF9DQVJEX05VTSk7DQoJaWYgKCF2b2ljZV9taXhlcikgew0KCQlwcmludGYoInZvaWNlX21peGVyIG9wZW4gZmFpbGVkIVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL2NvbmZpZyBtaXhlciBkZXYNCgltaXhfZ2V0X3ZwX3BhdGgodm9pY2VfbWl4ZXIsIHBfZGV2X21vZGUpOw0KDQoJDQoJaWYoKCpwX2Rldl9tb2RlIDwgVF9PVVRQVVRfSEFORFNFVCApIHx8KCpwX2Rldl9tb2RlID49IFRfT1VUUFVUX01BWCkpew0KCQlwcmludGYoIiVzOiBkZXZfbW9kZSBub3Qgc3VwcG9ydCwgKnBfZGV2X21vZGU9JWQhXG4iLF9fZnVuY19fLCAqcF9kZXZfbW9kZSk7DQoJCXJldCA9IC0xOw0KCX0NCglwcmludGYoIiVzOiBzdGFydCAqcF9kZXZfbW9kZT0lZCFcbiIsX19mdW5jX18sICpwX2Rldl9tb2RlKTsNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoJcmV0dXJuIHJldDsNCgkNCn0NCg0KDQppbnQgc2NfYXVkaW9fc2V0X3J4X3ZvaWNlX3ZvbChpbnQgdm9sKQ0Kew0KCXN0cnVjdCBtaXhlciAqdm9pY2VfbWl4ZXIgPSBOVUxMOw0KCXByaW50ZigiJXM6IHN0YXJ0IHZvbD0lZCFcbiIsX19mdW5jX18sIHZvbCk7DQoNCglpZiAoKHZvbCA8IDAgKSB8fCh2b2wgPiAxMSkpew0KCQlwcmludGYoIiVzOiB2b2wgbm90IHN1cHBvcnQsIHZvbD0lZCFcbiIsX19mdW5jX18sIHZvbCk7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJbWl4X3NldF92b2ljZV92b2wodm9pY2VfbWl4ZXIsIHZvbCk7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsNCg0KDQoJcmV0dXJuIDA7DQoNCg0KCQ0KCQ0KfQ0KDQoNCg0KaW50IHNjX2F1ZGlvX2dldF9yeF92b2ljZV92b2woaW50ICAgICAqIHBfdm9sKQ0Kew0KICAgIGludCByZXQgPSAwOw0KCXN0cnVjdCBtaXhlciAqdm9pY2VfbWl4ZXIgPSBOVUxMOw0KDQoJcHJpbnRmKCIlczogc3RhcnQhXG4iLF9fZnVuY19fKTsNCg0KCS8vb3BlbiBtaXhlciBkZXYgZm9yICBjb250cm9sDQoJdm9pY2VfbWl4ZXIgPSBtaXhlcl9vcGVuKFZPQ0lFX1NORF9DQVJEX05VTSk7DQoJaWYgKCF2b2ljZV9taXhlcikgew0KCQlwcmludGYoInZvaWNlX21peGVyIG9wZW4gZmFpbGVkIVxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL2NvbmZpZyBtaXhlciBkZXYNCgltaXhfZ2V0X3ZvaWNlX3ZvbCh2b2ljZV9taXhlciwgcF92b2wpOw0KCQ0KDQoJaWYgKCgqcF92b2wgPCAwICkgfHwoKnBfdm9sID4gMTEpKXsNCgkJcHJpbnRmKCIlczogdm9sIG5vdCBzdXBwb3J0LCAqcF92b2w9JWQhXG4iLF9fZnVuY19fLCAqcF92b2wpOw0KCQlyZXQgPSAtMTsNCgl9DQoJcHJpbnRmKCIlczogICpwX3ZvbD0lZCFcbiIsX19mdW5jX18sICpwX3ZvbCk7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsNCg0KDQoJcmV0dXJuIHJldDsNCg0KCQ0KCQ0KfQ0KDQoNCg0KaW50IHNjX2F1ZGlvX3NldF90eF92b2ljZV92b2woaW50IHZvbCkNCnsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCglwcmludGYoIiVzOiBzdGFydCB2b2w9JWQhXG4iLF9fZnVuY19fLCB2b2wpOw0KDQoJaWYgKCh2b2wgPCAwICkgfHwodm9sID4gMTEpKXsNCgkJcHJpbnRmKCIlczogdm9sIG5vdCBzdXBwb3J0LCB2b2w9JWQhXG4iLF9fZnVuY19fLCB2b2wpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9zZXRfdHhfdm9pY2Vfdm9sKHZvaWNlX21peGVyLCB2b2wpOw0KDQoJLy9jbG9zZSBtaXhlcg0KCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgl2b2ljZV9taXhlciA9IE5VTEw7DQoNCg0KCXJldHVybiAwOw0KCQ0KCQ0KfQ0KDQoNCg0KaW50IHNjX2F1ZGlvX2dldF90eF92b2ljZV92b2woaW50ICAqcF92b2wpDQp7DQogICAgaW50IHJldCA9IDA7DQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoJcHJpbnRmKCIlczogc3RhcnQhXG4iLF9fZnVuY19fKTsNCg0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9nZXRfdHhfdm9pY2Vfdm9sKHZvaWNlX21peGVyLCBwX3ZvbCk7DQoJDQoNCglpZigoKnBfdm9sIDwgMCApIHx8KCpwX3ZvbCA+IDUpKXsNCgkJcHJpbnRmKCIlczogdm9sIG5vdCBzdXBwb3J0LCAqcF92b2w9JWQhXG4iLF9fZnVuY19fLCAqcF92b2wpOw0KCQlyZXQgPSAtMTsNCgl9DQoJcHJpbnRmKCIlczogICpwX3ZvbD0lZCFcbiIsX19mdW5jX18sICpwX3ZvbCk7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsJDQogICAgcmV0dXJuIHJldDsJDQp9DQoNCg0KDQppbnQgc2NfYXVkaW9fc2V0X3R4X3ZvaWNlX211dGVfc3RhdGUoaW50IG11dGUgICAgICAgICApDQp7DQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoJcHJpbnRmKCIlczogc3RhcnQgbXV0ZT0lZCFcbiIsX19mdW5jX18sIG11dGUpOw0KDQoJaWYoKG11dGUgIT0gMCApICYmKG11dGUgIT0gMSkpIHsNCgkJcHJpbnRmKCIlczogbXV0ZSBub3Qgc3VwcG9ydCwgbXV0ZT0lZCFcbiIsX19mdW5jX18sIG11dGUpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9zZXRfdm9pY2VfbXV0ZSh2b2ljZV9taXhlciwgbXV0ZSk7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsNCiAgICByZXR1cm4gMDsJDQoJDQp9DQoNCmludCBzY19hdWRpb19nZXRfdHhfdm9pY2VfbXV0ZV9zdGF0ZShpbnQgKnBfbXV0ZSkNCnsNCiAgICBpbnQgcmV0ID0gMDsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCg0KCXByaW50ZigiJXM6IHN0YXJ0IVxuIixfX2Z1bmNfXyk7DQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJbWl4X2dldF92b2ljZV9tdXRlKHZvaWNlX21peGVyLCBwX211dGUpOw0KCQ0KDQoJaWYoKCpwX211dGUgIT0gMCApICYmKCpwX211dGUgIT0gMSkpIHsNCgkJcHJpbnRmKCIlczogKnBfbXV0ZSBub3Qgc3VwcG9ydCwgKnBfbXV0ZT0lZCFcbiIsX19mdW5jX18sICpwX211dGUpOw0KCQkJDQoJCXJldCA9IC0xOw0KCX0NCglwcmludGYoIiVzOiAgKnBfbXV0ZT0lZCFcbiIsX19mdW5jX18sICpwX211dGUpOw0KDQoJLy9jbG9zZSBtaXhlcg0KCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCgl2b2ljZV9taXhlciA9IE5VTEw7CQ0KDQogICAgcmV0dXJuIHJldDsNCn0NCg0KDQoNCg0KDQoNCg0KaW50IHNjX2F1ZGlvX3NldF9yeF92b2ljZV9tdXRlX3N0YXRlKGludCBtdXRlKSANCnsNCglzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCglwcmludGYoIiVzOiBzdGFydCBtdXRlPSVkIVxuIixfX2Z1bmNfXywgbXV0ZSk7DQoNCglpZigobXV0ZSAhPSAwICkgJiYobXV0ZSAhPSAxKSkgew0KCQlwcmludGYoIiVzOiBtdXRlIG5vdCBzdXBwb3J0LCBtdXRlPSVkIVxuIixfX2Z1bmNfXywgbXV0ZSk7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvL29wZW4gbWl4ZXIgZGV2IGZvciAgY29udHJvbA0KCXZvaWNlX21peGVyID0gbWl4ZXJfb3BlbihWT0NJRV9TTkRfQ0FSRF9OVU0pOw0KCWlmICghdm9pY2VfbWl4ZXIpIHsNCgkJcHJpbnRmKCJ2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLy9jb25maWcgbWl4ZXIgZGV2DQoJbWl4X3NldF9yeF92b2ljZV9tdXRlKHZvaWNlX21peGVyLCBtdXRlKTsNCg0KCS8vY2xvc2UgbWl4ZXINCgltaXhlcl9jbG9zZSh2b2ljZV9taXhlcik7DQoJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KICAgIHJldHVybiAwOwkNCgkNCn0NCg0KDQppbnQgc2NfYXVkaW9fZ2V0X3J4X3ZvaWNlX211dGVfc3RhdGUoaW50ICpwX211dGUpDQp7DQogICAgaW50IHJldCA9IDA7DQoJc3RydWN0IG1peGVyICp2b2ljZV9taXhlciA9IE5VTEw7DQoNCglwcmludGYoIiVzOiBzdGFydCFcbiIsX19mdW5jX18pOw0KDQoJLy9vcGVuIG1peGVyIGRldiBmb3IgIGNvbnRyb2wNCgl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oVk9DSUVfU05EX0NBUkRfTlVNKTsNCglpZiAoIXZvaWNlX21peGVyKSB7DQoJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8vY29uZmlnIG1peGVyIGRldg0KCW1peF9nZXRfcnhfdm9pY2VfbXV0ZSh2b2ljZV9taXhlciwgcF9tdXRlKTsNCgkNCglpZigoKnBfbXV0ZSAhPSAwICkgJiYoKnBfbXV0ZSAhPSAxKSkgew0KDQoJCXByaW50ZigiJXM6ICpwX211dGUgbm90IHN1cHBvcnQsICpwX211dGU9JWQhXG4iLF9fZnVuY19fLCAqcF9tdXRlKTsNCgkJcmV0ID0gLTE7DQoJfQ0KCXByaW50ZigiJXM6ICAqcF9tdXRlPSVkIVxuIixfX2Z1bmNfXywgKnBfbXV0ZSk7DQoNCgkvL2Nsb3NlIG1peGVyDQoJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KCXZvaWNlX21peGVyID0gTlVMTDsJDQoNCiAgICByZXR1cm4gcmV0Ow0KDQp9DQoNCmludCBzY19hdWRpb19zZXRfbG9vcGJhY2tfZW5hYmxlX3N0YXRlKGludCBlbmFibGUpDQp7DQogICAgcmV0dXJuIDA7DQp9DQoNCmludCBzY19hdWRpb19nZXRfbG9vcGJhY2tfZW5hYmxlX3N0YXRlKGludCAqcF9lbmFibGUpDQp7DQogICAgcmV0dXJuIDA7DQp9DQoNCg==