ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJ2b2ljZS92b2ljZS5jIGIvYXAvbGliL2xpYnZvaWNlL3ZvaWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2YzJlYQotLS0gL2Rldi9udWxsCisrKyBiL2FwL2xpYi9saWJ2b2ljZS92b2ljZS5jCkBAIC0wLDAgKzEsMzE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKiCw5sioy/nT0CAoQykyMDE1LCDW0NDLzajRtrnJt93T0M/euavLvqGjDQorKiogDQorKiogzsS8/sP7s8Y6ICAgICB2b2ljZS5jDQorKiogzsS8/rHqyrY6ICAgICANCisqKiDE2sjd1arSqjogICAgDQorKiogyrnTw7e9t6g6ICAgICANCisqKiANCisqKiDQ3rjEyNXG2iAgICAgICAgsOaxvrrFICAgICAg0N64xLHqvMcgICAgICAgINDeuMTIyyAgICAgICAgICDQ3rjExNrI3Q0KKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorKiogMjAxOS8wOS8yNSAgICAgVjEuMCAgICAgICAgQ3JlYXRlICAgICAgICAgIHh4cSAgICAgICAgtLS9qA0KKyoqIA0KKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDx1bmlzdGQuaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKw0KKyNpbmNsdWRlIDxzdGRpbnQuaD4NCisjaW5jbHVkZSA8bGludXgvdm9sdGVfZHJ2Lmg+DQorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPg0KKyNpbmNsdWRlIDxmY250bC5oPg0KKyNpbmNsdWRlIDx0aW55YWxzYS9hdWRpb19taXhlcl9jdHJsLmg+DQorDQorI2RlZmluZSBWT0lDRV9ERVZfTkFNRSAiL2Rldi92b2ljZV9kZXZpY2UiDQorDQorDQorDQordHlwZWRlZiBzdHJ1Y3Qgew0KKwlpbnQgZmQ7DQorCXVuc2lnbmVkIGludCBzdGF0ZTsgLy8gMCBjbG9zZTsxIG9wZW4NCisJVF9Wb2ljZV9QYXJhIHZwYXJhOw0KK30gVF92b2ljZUluZm87DQorDQorVF92b2ljZUluZm8gKnZvaWNlaW5mbyA9IE5VTEw7DQorDQorc3RhdGljIGludCBzbGljX2ZsYWcgPSAwOw0KK3N0YXRpYyBpbnQgc2xpY19mbGFnX2FscmVhZHkgPSAwOy8vIDAgbm90IGdldCAsMSBhbHJlYWR5IGdldA0KKw0KK3N0cnVjdCBwY20gICp2b2x0ZV9wY21fdm9pY2Vfb3V0ID0gTlVMTDsNCitzdHJ1Y3QgcGNtICAqdm9sdGVfcGNtX3ZvaWNlX2luID0gTlVMTDsNCisNCisjaWYgMA0KKw0KKw0KK1RfVm9pY2VfUGFyYSBnc21od3BhcmEgPSB7DQorCTgwMDAsICAvLzgwMDA7MTYwMDANCisJMCwgLy8vLyAwIGdzbTsxIHRkOzIgd2NkbWE7MyBsdGUNCisJMC8vMCBoYXJkd2FyZSBkc3A7MSBzb2Z0IGFtciBsaWINCit9Ow0KKw0KK1RfVm9pY2VfUGFyYSB0ZG5iaHdwYXJhID0gew0KKwk4MDAwLCAgLy84MDAwOzE2MDAwDQorCTEsIC8vLy8gMCBnc207MSB0ZDsyIHdjZG1hOzMgbHRlDQorCTAsLy8wIGFtci1uYjsxIGFtci13Yg0KKwkwLy8wIGhhcmR3YXJlIGRzcDsxIHNvZnQgYW1yIGxpYg0KK307DQorDQorVF9Wb2ljZV9QYXJhIHRkbmJzZnBhcmEgPSB7DQorCTgwMDAsICAvLzgwMDA7MTYwMDANCisJMSwgLy8vLyAwIGdzbTsxIHRkOzIgd2NkbWE7MyBsdGUNCisJMCwvLzAgYW1yLW5iOzEgYW1yLXdiDQorCTEvLzAgaGFyZHdhcmUgZHNwOzEgc29mdCBhbXIgbGliDQorfTsNCisNCitUX1ZvaWNlX1BhcmEgdGR3YnNmcGFyYSA9IHsNCisJODAwMCwgIC8vODAwMDsxNjAwMA0KKwkxLCAvLy8vIDAgZ3NtOzEgdGQ7MiB3Y2RtYTszIGx0ZQ0KKwkxLC8vMCBhbXItbmI7MSBhbXItd2INCisJMS8vMCBoYXJkd2FyZSBkc3A7MSBzb2Z0IGFtciBsaWINCit9Ow0KKw0KKw0KKyNlbmRpZg0KKy8vc3RhdGljIHZvbGF0aWxlIGludCB2b2ljZWluZm8uZmQgPSAwOw0KKw0KKw0KK2ludCB2b2ljZV9vcGVuKFRfVm9pY2VfUGFyYSAqcGFyYSkNCit7DQorCWludCByZXQgPSAwOw0KKwlpZiAoIXBhcmEpIHsNCisNCisJCXByaW50Zigidm9pY2U6IG9wZW4gcGFyYSBpcyBOVUxMLlxuIik7DQorDQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisJdm9pY2VpbmZvID0gY2FsbG9jKDEsIHNpemVvZihUX3ZvaWNlSW5mbykpOw0KKwlpZiAoIXZvaWNlaW5mbykgew0KKw0KKwkJcHJpbnRmKCJ2b2ljZTogb3BlbiBjYWxsb2MgZmFpbCFcbiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCXZvaWNlaW5mby0+dnBhcmEgPSAqcGFyYTsNCisNCisJdm9pY2VpbmZvLT5mZCA9IG9wZW4oVk9JQ0VfREVWX05BTUUsIE9fUkRPTkxZKTsNCisJaWYgKHZvaWNlaW5mby0+ZmQgPCAwKSB7DQorCQlwcmludGYoInZvaWNlIGxpYjogb3BlbiB2b2ljZSBkZXZpY2UgZXJyb3IuXG4iKTsNCisJCWZyZWUodm9pY2VpbmZvKTsNCisJCXJldHVybiAtMTsNCisNCisJfQ0KKw0KKw0KKwlyZXQgPSBpb2N0bCh2b2ljZWluZm8tPmZkLCBWT0lDRV9JT0NUTF9TVEFSVCwgcGFyYSk7DQorCWlmIChyZXQpIHsNCisJCXByaW50Zigidm9pY2UgbGliOiB2b2ljZSBzdGFydCBmZD0lZCxyZXQ9JWQuXG4iLCB2b2ljZWluZm8tPmZkLCByZXQpOw0KKwkJZ290byBlcnI7DQorCX0NCisJcHJpbnRmKCJ2b2ljZSBvcGVuIGVuZCAhXG4iKTsNCisNCisJcmV0dXJuIDA7DQorDQorZXJyOg0KKwljbG9zZSh2b2ljZWluZm8tPmZkKTsNCisJZnJlZSh2b2ljZWluZm8pOw0KKwlwcmludGYoInZvaWNlIG9wZW4gZXJyIGVuZCAhXG4iKTsNCisJcmV0dXJuIC0xOw0KKw0KKw0KK30NCisNCisNCitpbnQgdm9pY2VfY2xvc2UoVF9Wb2ljZV9QYXJhICpwYXJhKQ0KK3sNCisJaW50IHJldCA9IDA7DQorDQorCWlmICghdm9pY2VpbmZvKSB7DQorDQorCQlwcmludGYoInZvaWNlOiBjbG9zZSB2b2ljZWluZm8gaXMgTlVsbCFcbiIpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisNCisJcmV0ID0gaW9jdGwodm9pY2VpbmZvLT5mZCwgVk9JQ0VfSU9DVExfU1RPUCwgcGFyYSk7DQorDQorCWlmIChyZXQpIHsNCisJCXByaW50Zigidm9pY2UgbGliOiB2b2ljZSBzdG9wIGZkPSVkLHJldD0lZC5cbiIsIHZvaWNlaW5mby0+ZmQsIHJldCk7DQorCX0NCisNCisJaWYgKHZvaWNlaW5mby0+ZmQgPj0gMCkgew0KKwkJY2xvc2Uodm9pY2VpbmZvLT5mZCk7DQorCX0NCisJdm9pY2VpbmZvLT5mZCA9IC0xOw0KKw0KKwlmcmVlKHZvaWNlaW5mbyk7DQorCXZvaWNlaW5mbyA9IE5VTEw7DQorDQorCXByaW50Zigidm9pY2UgY2xvc2UgZW5kICFcbiIpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQoraW50IHZvaWNlX1ZwbG9vcChpbnQgKnBhdGgpDQorew0KKwlpbnQgcmV0ID0gMDsNCisJaW50IGZkID0gLTE7DQorCXByaW50Zigidm9pY2VfVnBsb29wOiAgc3RhcnQgcGF0aD0lZCFcbiIsKnBhdGgpOw0KKwlmZCA9IG9wZW4oVk9JQ0VfREVWX05BTUUsIE9fUkRPTkxZKTsNCisJaWYgKGZkIDwgMCkgew0KKwkJcHJpbnRmKCJ2b2ljZV9WcGxvb3A6IG9wZW4gdm9pY2UgZGV2aWNlIGVycm9yLlxuIik7DQorCQlyZXR1cm4gIC0xOw0KKwl9DQorCXJldCA9IGlvY3RsKGZkLCBWT0lDRV9JT0NUTF9WUExPT1AsIHBhdGgpOw0KKwlpZiAocmV0KSB7DQorCQlwcmludGYoInZvaWNlX1ZwbG9vcDogIHJldD0lZCxwYXRoPSVwLlxuIiwgcmV0LCBwYXRoKTsNCisJCWNsb3NlKGZkKTsNCisJCXJldHVybiAgLTE7DQorCX0NCisJY2xvc2UoZmQpOw0KKwlyZXR1cm4gMDsNCisNCit9DQorDQoraW50IHZvaWNlX0dldFNsaWNGbGFnKHZvaWQpDQorew0KKwlpbnQgcmV0ID0gMDsNCisJaW50IGZkID0gLTE7DQorCWludCBmbGFnID0gMDsNCisJcHJpbnRmKCJ2b2ljZV9HZXRTbGljRmxhZzogIHN0YXJ0IVxuIik7DQorCWZkID0gb3BlbihWT0lDRV9ERVZfTkFNRSwgT19SRE9OTFkpOw0KKwlpZiAoZmQgPCAwKSB7DQorCQlwcmludGYoInZvaWNlX0dldFNsaWNGbGFnOiBvcGVuIHZvaWNlIGRldmljZSBlcnJvci5cbiIpOw0KKwkJcmV0dXJuICAtMTsNCisJfQ0KKwlyZXQgPSBpb2N0bChmZCwgVk9JQ0VfSU9DVExfR0VUX1NMSUNfVVNFX0ZMQUcsICZmbGFnKTsNCisJaWYgKHJldCkgew0KKwkJcHJpbnRmKCJ2b2ljZV9HZXRTbGljRmxhZzogIHJldD0lZCxmbGFnPSVkLlxuIiwgcmV0LCBmbGFnKTsNCisJCWNsb3NlKGZkKTsNCisJCXJldHVybiAgLTE7DQorCX0NCisJY2xvc2UoZmQpOw0KKwlzbGljX2ZsYWdfYWxyZWFkeSA9IDE7DQorCXJldHVybiBmbGFnOw0KKw0KK30NCisNCitpbnQgekRydlZvbHRlX1ByZU9wZW4oVF9aRHJ2Vm9sdGVfQ2ZnICpjZmdQYXJhbSkNCit7DQorDQorDQorCXN0cnVjdCBtaXhlciAqdm9pY2VfbWl4ZXIgPSBOVUxMOw0KKwlzdHJ1Y3QgcGNtX2NvbmZpZyBjb25maWdfdm9pY2UgPSB7MH07DQorCXByaW50ZigiIHZvaWNlIGxpYiB6RHJ2Vm9sdGVfUHJlT3BlbiFcbiIpOw0KKw0KKwlpZiAoc2xpY19mbGFnX2FscmVhZHkgPT0gMSkgew0KKwkJcHJpbnRmKCIgdm9pY2UgIHNsaWMgZmxhZyBhbHJlYWR5IGdldCwgc2xpY19mbGFnPSVkIVxuIiwgc2xpY19mbGFnKTsNCisJCWlmIChzbGljX2ZsYWcgPT0gMSkgew0KKwkJCXJldHVybiAwOw0KKwkJfQ0KKw0KKwl9IGVsc2Ugew0KKwkJc2xpY19mbGFnID0gdm9pY2VfR2V0U2xpY0ZsYWcoKTsNCisJCXByaW50ZigiIHZvaWNlICBzbGljIGZsYWcgIGdldCwgc2xpY19mbGFnPSVkIVxuIiwgc2xpY19mbGFnKTsNCisJCWlmIChzbGljX2ZsYWcgPT0gMSkgew0KKwkJCXJldHVybiAwOw0KKwkJfQ0KKwl9DQorDQorDQorCS8vb3BlbiBtaXhlciBkZXYgZm9yIGNvZGVjIGNvbnRyb2wNCisJdm9pY2VfbWl4ZXIgPSBtaXhlcl9vcGVuKDApOw0KKwlpZiAoIXZvaWNlX21peGVyKSB7DQorCQlwcmludGYoInp0ZSB2b2ljZV9taXhlciBvcGVuIGZhaWxlZCFcbiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCS8vY29uZmlnIG1peGVyIGRldg0KKwltaXhfc2V0X3ZvaWNlX3BhdGgodm9pY2VfbWl4ZXIsIFRfT1VUUFVUX1NQRUFLRVIpOw0KKwltaXhfc2V0X3ZvaWNlX3ZvbCh2b2ljZV9taXhlciwgVF9WT0lDRV9WT0xfM19MRVZFTCk7DQorDQorCS8vY2xvc2UgbWl4ZXINCisJbWl4ZXJfY2xvc2Uodm9pY2VfbWl4ZXIpOw0KKwl2b2ljZV9taXhlciA9IE5VTEw7DQorDQorCS8vb3BlbiBwY20gZGV2IGZvciBkYXRhIHRyYW5mDQorCWNvbmZpZ192b2ljZS5jaGFubmVscyA9IGNmZ1BhcmFtLT5jaGFubmVsX2NvdW50Ow0KKwljb25maWdfdm9pY2UucmF0ZSA9IGNmZ1BhcmFtLT5jbG9ja19yYXRlOw0KKwkvL2J1ZmZlciBudW0NCisJY29uZmlnX3ZvaWNlLnBlcmlvZF9jb3VudCA9IDM7DQorCS8vYnVmZmVyIHNpemUNCisJY29uZmlnX3ZvaWNlLnBlcmlvZF9zaXplID0gY2ZnUGFyYW0tPnNhbXBsZXNfcGVyX2ZyYW1lICogIGNmZ1BhcmFtLT5iaXRzX3Blcl9zYW1wbGUgLyA4Ow0KKwkvLzE2LWJpdCBzaWduZWQNCisJY29uZmlnX3ZvaWNlLmZvcm1hdCA9IFBDTV9GT1JNQVRfUzE2X0xFOw0KKw0KKwkvL2NhcmQgMCBkZXYgMQ0KKwkvLzIzRyBjYXJkIDAgZGV2IDINCisJdm9sdGVfcGNtX3ZvaWNlX291dCA9IHBjbV9vcGVuKDAsIDEsIFBDTV9PVVQsICZjb25maWdfdm9pY2UpOw0KKwlpZiAoIXBjbV9pc19yZWFkeSh2b2x0ZV9wY21fdm9pY2Vfb3V0KSkgew0KKwkJcHJpbnRmKCJ6dGUgdm9sdGVfcGNtX3ZvaWNlX291dCBvcGVuIGZhaWxlZCFcbiIpOw0KKwkJZ290byBlcnJfcmV0Ow0KKwl9DQorDQorCXZvbHRlX3BjbV92b2ljZV9pbiA9IHBjbV9vcGVuKDAsIDEsIFBDTV9JTiwgJmNvbmZpZ192b2ljZSk7DQorCWlmICghcGNtX2lzX3JlYWR5KHZvbHRlX3BjbV92b2ljZV9pbikpIHsNCisJCXByaW50ZigienRlIHZvbHRlX3BjbV92b2ljZV9pbiBvcGVuIGZhaWxlZCFcbiIpOw0KKwkJZ290byBlcnJfcmV0Ow0KKwl9DQorDQorCWlmICgwICE9IHBjbV9wcmVwYXJlKHZvbHRlX3BjbV92b2ljZV9vdXQpKSB7DQorCQlwcmludGYoInp0ZSB2b2x0ZV9wY21fdm9pY2Vfb3V0IHBjbV9wcmVwYXJlIGZhaWxlZCFcbiIpOw0KKwkJZ290byBlcnJfcmV0Ow0KKwl9DQorDQorCWlmICgwICE9IHBjbV9wcmVwYXJlKHZvbHRlX3BjbV92b2ljZV9pbikpIHsNCisJCXByaW50ZigienRlIHZvbHRlX3BjbV92b2ljZV9pbiBwY21fcHJlcGFyZSBmYWlsZWQhXG4iKTsNCisJCWdvdG8gZXJyX3JldDsNCisJfQ0KKwlyZXR1cm4gMDsNCitlcnJfcmV0Og0KKw0KKwlwY21fY2xvc2Uodm9sdGVfcGNtX3ZvaWNlX291dCk7DQorCXZvbHRlX3BjbV92b2ljZV9vdXQgPSBOVUxMOw0KKw0KKwlpZiAodm9sdGVfcGNtX3ZvaWNlX2luKSB7DQorCQlwY21fY2xvc2Uodm9sdGVfcGNtX3ZvaWNlX2luKTsNCisJCXZvbHRlX3BjbV92b2ljZV9pbiA9IE5VTEw7DQorCX0NCisJcmV0dXJuIC0xOw0KKw0KK30NCisNCit2b2lkIHpEcnZWb2x0ZV9QcmVDbG9zZSh2b2lkKQ0KK3sNCisNCisJcHJpbnRmKCIgdm9pY2UgbGliIHpEcnZWb2x0ZV9QcmVDbG9zZSFcbiIpOw0KKw0KKwlpZiAoc2xpY19mbGFnX2FscmVhZHkgPT0gMSkgew0KKwkJcHJpbnRmKCIgdm9pY2UgIHNsaWMgZmxhZyBhbHJlYWR5IGdldCwgc2xpY19mbGFnPSVkIVxuIiwgc2xpY19mbGFnKTsNCisJCWlmIChzbGljX2ZsYWcgPT0gMSkgew0KKwkJCXJldHVybiA7DQorCQl9DQorDQorCX0gZWxzZSB7DQorCQlzbGljX2ZsYWcgPSB2b2ljZV9HZXRTbGljRmxhZygpOw0KKwkJcHJpbnRmKCIgdm9pY2UgIHNsaWMgZmxhZyAgZ2V0LCBzbGljX2ZsYWc9JWQhXG4iLCBzbGljX2ZsYWcpOw0KKwkJaWYgKHNsaWNfZmxhZyA9PSAxKSB7DQorCQkJcmV0dXJuIDsNCisJCX0NCisJfQ0KKw0KKw0KKwlpZiAodm9sdGVfcGNtX3ZvaWNlX291dCkgew0KKwkJcGNtX2Nsb3NlKHZvbHRlX3BjbV92b2ljZV9vdXQpOw0KKwkJdm9sdGVfcGNtX3ZvaWNlX291dCA9IE5VTEw7DQorCX0NCisJaWYgKHZvbHRlX3BjbV92b2ljZV9pbikgew0KKwkJcGNtX2Nsb3NlKHZvbHRlX3BjbV92b2ljZV9pbik7DQorCQl2b2x0ZV9wY21fdm9pY2VfaW4gPSBOVUxMOw0KKwl9DQorfQ0KKw0KKw0KKw0KKw0KKw0K