ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJmbGFncy9mbGFnc19hcGkuYyBiL2FwL2xpYi9saWJmbGFncy9mbGFnc19hcGkuYwppbmRleCAxNTFiNWIzLi5jYTUyZmMyIDEwMDc1NQotLS0gYS9hcC9saWIvbGliZmxhZ3MvZmxhZ3NfYXBpLmMKKysrIGIvYXAvbGliL2xpYmZsYWdzL2ZsYWdzX2FwaS5jCkBAIC01Miw2ICs1MiwxMSBAQAogI2RlZmluZSBTWVNURU1fSU5ERVhfMSAoMSkNCiAjZGVmaW5lIFNZU1RFTV9JTkRFWF8yICgyKQ0KIA0KKyNkZWZpbmUgQ1JDX0xFX0JJVFMgNjQNCisjZGVmaW5lIENSQzMyX1BPTFlfTEUgMHhlZGI4ODMyMA0KKyNkZWZpbmUgTEVfVEFCTEVfUk9XUyAoQ1JDX0xFX0JJVFMvOCkNCisjZGVmaW5lIExFX1RBQkxFX1NJWkUgMjU2DQorDQogDQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KQEAgLTgzLDExICs4OCwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKgkJCQkJCSAgR2xvYmFsIHZhcmlhYmxlIGRlZmluaXRpb25zCQkJCQkJICAgKg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIHVuc2lnbmVkIGludCBjcmMzMnRhYmxlX2xlW0xFX1RBQkxFX1JPV1NdWzI1Nl07DQogDQogDQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiAJCQkJCSAgIExvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwkJCQkJCQkgICAqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitzdGF0aWMgdm9pZCBjcmMzMmluaXRfbGVfZ2VuZXJpYyhjb25zdCB1bnNpZ25lZCBpbnQgcG9seW5vbWlhbCwgdW5zaWduZWQgaW50ICgqdGFiKVsyNTZdKTsNCitzdGF0aWMgdW5zaWduZWQgaW50IGNyYzMyX2JvZHkodW5zaWduZWQgaW50IGNyYywgdW5zaWduZWQgY2hhciBjb25zdCAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCB1bnNpZ25lZCBpbnQgKCp0YWIpWzI1Nl0pOw0KK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3JjMzJfbGVfZ2VuZXJpYyh1bnNpZ25lZCBpbnQgY3JjLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpwLCBzaXplX3QgbGVuLCBjb25zdCB1bnNpZ25lZCBpbnQgKCp0YWIpWzI1Nl0pOw0KKw0KIHN0YXRpYyBpbnQgbXRkX2dldChjb25zdCBjaGFyICppX3BhcnRpX25hbWUsIGRldmljZV90eXBlX3QgZGV2aWNlX3R5cGUsIGNoYXIgKm9fbXRkX3BhdGgsIHVuc2lnbmVkIGludCBvX210ZF9wYXRoX2xlbik7DQogc3RhdGljIGludCB3cml0ZV9mbGFnc19pbmZvKHBhcnRpdGlvbl9tdGRfaW5mb190ICpwX210ZF9pbmZvLCBpbnQgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnQsIGludCBsZW4pOw0KIA0KQEAgLTEwMiw2ICsxMTIsODcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICogCQkJCQkgTG9jYWwgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIAkJCQkJCSAgICoNCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3N0YXRpYyB2b2lkIGNyYzMyaW5pdF9sZV9nZW5lcmljKGNvbnN0IHVuc2lnbmVkIGludCBwb2x5bm9taWFsLCB1bnNpZ25lZCBpbnQgKCp0YWIpWzI1Nl0pDQorew0KKwl1bnNpZ25lZCBpLCBqOw0KKwl1bnNpZ25lZCBpbnQgY3JjID0gMTsNCisNCisJdGFiWzBdWzBdID0gMDsNCisNCisJZm9yIChpID0gTEVfVEFCTEVfU0laRSA+PiAxOyBpOyBpID4+PSAxKSB7DQorCQljcmMgPSAoY3JjID4+IDEpIF4gKChjcmMgJiAxKSA/IHBvbHlub21pYWwgOiAwKTsNCisJCWZvciAoaiA9IDA7IGogPCBMRV9UQUJMRV9TSVpFOyBqICs9IDIgKiBpKQ0KKwkJCXRhYlswXVtpICsgal0gPSBjcmMgXiB0YWJbMF1bal07DQorCX0NCisJZm9yIChpID0gMDsgaSA8IExFX1RBQkxFX1NJWkU7IGkrKykgew0KKwkJY3JjID0gdGFiWzBdW2ldOw0KKwkJZm9yIChqID0gMTsgaiA8IExFX1RBQkxFX1JPV1M7IGorKykgew0KKwkJCWNyYyA9IHRhYlswXVtjcmMgJiAweGZmXSBeIChjcmMgPj4gOCk7DQorCQkJdGFiW2pdW2ldID0gY3JjOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3JjMzJfYm9keSh1bnNpZ25lZCBpbnQgY3JjLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpidWYsIHNpemVfdCBsZW4sIGNvbnN0IHVuc2lnbmVkIGludCAoKnRhYilbMjU2XSkNCit7DQorI2RlZmluZSBET19DUkMoeCkgY3JjID0gdDBbKGNyYyBeICh4KSkgJiAyNTVdIF4gKGNyYyA+PiA4KQ0KKyNkZWZpbmUgRE9fQ1JDNCAodDNbKHEpICYgMjU1XSBeIHQyWyhxID4+IDgpICYgMjU1XSBeIFwNCisJCSAgIHQxWyhxID4+IDE2KSAmIDI1NV0gXiB0MFsocSA+PiAyNCkgJiAyNTVdKQ0KKyNkZWZpbmUgRE9fQ1JDOCAodDdbKHEpICYgMjU1XSBeIHQ2WyhxID4+IDgpICYgMjU1XSBeIFwNCisJCSAgIHQ1WyhxID4+IDE2KSAmIDI1NV0gXiB0NFsocSA+PiAyNCkgJiAyNTVdKQ0KKw0KKwljb25zdCB1bnNpZ25lZCBpbnQgKmI7DQorCXNpemVfdCAgICByZW1fbGVuOw0KKw0KKwljb25zdCB1bnNpZ25lZCBpbnQgKnQwPXRhYlswXSwgKnQxPXRhYlsxXSwgKnQyPXRhYlsyXSwgKnQzPXRhYlszXTsNCisJY29uc3QgdW5zaWduZWQgaW50ICp0NCA9IHRhYls0XSwgKnQ1ID0gdGFiWzVdLCAqdDYgPSB0YWJbNl0sICp0NyA9IHRhYls3XTsNCisJdW5zaWduZWQgaW50IHE7DQorCQ0KKwlpZiAoKGxvbmcpYnVmICYgMyAmJiBsZW4pDQorCXsNCisJCWRvDQorCQl7DQorCQkJRE9fQ1JDKCpidWYrKyk7DQorCQl9IHdoaWxlICgoLS1sZW4pICYmICgobG9uZylidWYpJjMpOw0KKwl9DQorCQ0KKwlyZW1fbGVuID0gbGVuICYgNzsNCisJbGVuID0gbGVuID4+IDM7DQorCWIgPSAoY29uc3QgdW5zaWduZWQgaW50ICopYnVmOw0KKwkNCisJZm9yICgtLWI7IGxlbjsgLS1sZW4pDQorCXsNCisJCXEgPSBjcmMgXiAqKytiOw0KKwkJY3JjID0gRE9fQ1JDODsNCisJCXEgPSAqKytiOw0KKwkJY3JjIF49IERPX0NSQzQ7DQorCX0NCisJDQorCWxlbiA9IHJlbV9sZW47DQorCWlmIChsZW4pDQorCXsNCisJCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKShiICsgMSkgLSAxOw0KKwkJZG8NCisJCXsNCisJCQlET19DUkMoKisrcCk7IC8qIHVzZSBwcmUgaW5jcmVtZW50IGZvciBzcGVlZCAqLw0KKwkJfSB3aGlsZSAoLS1sZW4pOw0KKwl9DQorCQ0KKwlyZXR1cm4gY3JjOw0KKyN1bmRlZiBET19DUkMNCisjdW5kZWYgRE9fQ1JDNA0KKyN1bmRlZiBET19DUkM4DQorfQ0KKw0KKw0KK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3JjMzJfbGVfZ2VuZXJpYyh1bnNpZ25lZCBpbnQgY3JjLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpwLCBzaXplX3QgbGVuLCBjb25zdCB1bnNpZ25lZCBpbnQgKCp0YWIpWzI1Nl0pDQorew0KKwljcmMgPSBjcmMzMl9ib2R5KGNyYywgcCwgbGVuLCB0YWIpOw0KKwlyZXR1cm4gY3JjOw0KK30NCisNCisNCiBzdGF0aWMgaW50IG10ZF9nZXQoY29uc3QgY2hhciAqaV9wYXJ0aV9uYW1lLCBkZXZpY2VfdHlwZV90IGRldmljZV90eXBlLCBjaGFyICpvX210ZF9wYXRoLCB1bnNpZ25lZCBpbnQgb19tdGRfcGF0aF9sZW4pDQogew0KICAgICBGSUxFICpmcF9tdGQgPSAwOw0KQEAgLTQ4NCwyNiArNTc1LDcgQEAKIA0KIHN0YXRpYyB2b2lkIGNvcHlfZmxhZ3NfaW5mbyhUX0ZMQUdTX0lORk8gKmRzdCwgVF9GTEFHU19JTkZPICpzcmMpDQogew0KLQlkc3QtPm1hZ2ljX3N0YXJ0ID0gc3JjLT5tYWdpY19zdGFydDsNCi0JDQotICAgIGRzdC0+Ym9vdF9mb3RhX2ZsYWcuYm9vdF90byA9IHNyYy0+Ym9vdF9mb3RhX2ZsYWcuYm9vdF90bzsNCi0gICAgZHN0LT5ib290X2ZvdGFfZmxhZy5mb3RhX3N0YXR1cyA9IHNyYy0+Ym9vdF9mb3RhX2ZsYWcuZm90YV9zdGF0dXM7DQotICAgIGRzdC0+Ym9vdF9mb3RhX2ZsYWcuc3lzdGVtLnN0YXR1cyA9IHNyYy0+Ym9vdF9mb3RhX2ZsYWcuc3lzdGVtLnN0YXR1czsNCi0gICAgZHN0LT5ib290X2ZvdGFfZmxhZy5zeXN0ZW0udHJ5X2NudCA9IHNyYy0+Ym9vdF9mb3RhX2ZsYWcuc3lzdGVtLnRyeV9jbnQ7DQotICAgIGRzdC0+Ym9vdF9mb3RhX2ZsYWcuc3lzdGVtMi5zdGF0dXMgPSBzcmMtPmJvb3RfZm90YV9mbGFnLnN5c3RlbTIuc3RhdHVzOw0KLSAgICBkc3QtPmJvb3RfZm90YV9mbGFnLnN5c3RlbTIudHJ5X2NudCA9IHNyYy0+Ym9vdF9mb3RhX2ZsYWcuc3lzdGVtMi50cnlfY250Ow0KLQkNCi0gICAgZHN0LT5ib290X2Vudi5kdWFsc3lzX3R5cGUgPSBzcmMtPmJvb3RfZW52LmR1YWxzeXNfdHlwZTsNCi0Jc3RybmNweShkc3QtPmJvb3RfZW52LnN5c3RlbV9ib290X2Vudiwgc3JjLT5ib290X2Vudi5zeXN0ZW1fYm9vdF9lbnYsIHNpemVvZihkc3QtPmJvb3RfZW52LnN5c3RlbV9ib290X2VudikpOw0KLQlzdHJuY3B5KGRzdC0+Ym9vdF9lbnYuc3lzdGVtMl9ib290X2Vudiwgc3JjLT5ib290X2Vudi5zeXN0ZW0yX2Jvb3RfZW52LCBzaXplb2YoZHN0LT5ib290X2Vudi5zeXN0ZW0yX2Jvb3RfZW52KSk7DQotDQotCWRzdC0+dWJpZnNfc3RhdHVzLmZzX3N0YXR1cyA9IHNyYy0+dWJpZnNfc3RhdHVzLmZzX3N0YXR1czsNCi0Jc3RybmNweShkc3QtPnViaWZzX3N0YXR1cy5mc19tdGRfbmFtZSwgc3JjLT51Ymlmc19zdGF0dXMuZnNfbXRkX25hbWUsIHNpemVvZihkc3QtPnViaWZzX3N0YXR1cy5mc19tdGRfbmFtZSkpOw0KLQlzdHJuY3B5KGRzdC0+dWJpZnNfc3RhdHVzLmZzX3ViaV92b2xfbmFtZSwgc3JjLT51Ymlmc19zdGF0dXMuZnNfdWJpX3ZvbF9uYW1lLCBzaXplb2YoZHN0LT51Ymlmc19zdGF0dXMuZnNfdWJpX3ZvbF9uYW1lKSk7DQotDQotCWRzdC0+bnZyb19mbGFnID0gc3JjLT5udnJvX2ZsYWc7DQotDQotCWRzdC0+bWFnaWNfZW5kID0gc3JjLT5tYWdpY19lbmQ7DQorCW1lbWNweShkc3QsIHNyYywgc2l6ZW9mKFRfRkxBR1NfSU5GTykpOw0KIA0KIAlyZXR1cm47DQogfQ0KQEAgLTUyNSw3ICs1OTcsNyBAQAogICAgIGZkX2NtZCA9IGZvcGVuKEZJTEVfUEFUSF9QUk9DX0NNRExJTkUsICJyIik7DQogICAgIGlmICghZmRfY21kKQ0KICAgICB7DQotICAgICAgICBmbGFnc19lcnIoIm9wZW4gZmlsZSAlcyBlcnJvciwgZXJyb3I6JXMiLCBGSUxFX1BBVEhfUFJPQ19DTURMSU5FLCBzdHJlcnJvcihlcnJubykpOw0KKyAgICAgICAgcHJpbnRmKCJPcGVuIGZpbGUgJXMgZXJyb3IsIGVycm9yOiVzIiwgRklMRV9QQVRIX1BST0NfQ01ETElORSwgc3RyZXJyb3IoZXJybm8pKTsNCiAgICAgICAgIHJldHVybiBTWVNURU1fSU5ERVhfVU5LTk9XTjsNCiAgICAgfQ0KIA0KQEAgLTUzNiwxNiArNjA4LDE2IEBACiANCiAgICAgICAgIGlmIChOVUxMID09IGxpbmVfc3RyKQ0KICAgICAgICAgew0KLSAgICAgICAgICAgIGZsYWdzX2VycigiZ2V0IGluZm8gZnJvbSAvcHJvYy9jbWRsaW5lIGVycm9yOiVzIiwgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgICAgICBwcmludGYoImdldCBpbmZvIGZyb20gL3Byb2MvY21kbGluZSBlcnJvcjolcyIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgICAgICAgICAgZ290byBlbmQ7DQogICAgICAgICB9DQogDQotICAgICAgICBmbGFnc19sb2coImJ1ZmY6JXMiLCBidWYpOw0KKyAgICAgICAgcHJpbnRmKCJidWZmOiVzIiwgYnVmKTsNCiANCiAgICAgICAgIHBhcmEgPSBzdHJ0b2soYnVmLCAiICIpOw0KICAgICAgICAgd2hpbGUgKHBhcmEpDQogICAgICAgICB7DQotICAgICAgICAgICAgZmxhZ3NfbG9nKCJwYXJhOiVzIiwgcGFyYSk7DQorICAgICAgICAgICAgcHJpbnRmKCJwYXJhOiVzIiwgcGFyYSk7DQogICAgICAgICAgICAgaWYgKHN0cm5jbXAocGFyYSwgUFJPQ19DTURMSU5FX1NZU1RFTV9BX0ZMQUcsIHN0cmxlbihQUk9DX0NNRExJTkVfU1lTVEVNX0FfRkxBRykpID09IDApDQogICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICBjdXJyZW50X3N5c3RlbSA9IFNZU1RFTV9JTkRFWF8xOw0KQEAgLTU5NSw2ICs2NjcsOCBAQAogCWludCBibG9ja19udW0gPSAwOw0KIAlpbnQgYWxyZWFkeV93cml0ZSA9IDA7DQogCQ0KKwl1bnNpZ25lZCBpbnQgY3JjXzMyID0gMDsNCisJDQogICAgIGZsYWdzX2luZm8ubWFnaWNfc3RhcnQgPSBGTEFHU19NQUdJQzsNCiAJDQogICAgIGZsYWdzX2luZm8uYm9vdF9mb3RhX2ZsYWcuYm9vdF90byA9IERVQUxfU1lTVEVNOw0KQEAgLTYxMCw2ICs2ODQsMTIgQEAKIAkNCiAgICAgZmxhZ3NfaW5mby5tYWdpY19lbmQgPSBGTEFHU19NQUdJQzsNCiANCisJY3JjMzJpbml0X2xlKCk7DQorCWNyY18zMiA9IGNyYzMyX2xlKDAsICh1bnNpZ25lZCBjaGFyIGNvbnN0ICopKCZmbGFnc19pbmZvKSwgc2l6ZW9mKGZsYWdzX2luZm8pKTsNCisJZmxhZ3NfbG9nKCJpbml0IGNyY18zMj0ldSIsIGNyY18zMik7DQorDQorCWZsYWdzX2luZm8uY3JjMzIgPSBjcmNfMzI7DQorDQogCXJldCA9IG10ZF9nZXQoUEFSVElUSU9OX05BTUVfRkxBR1MsIERFVklDRV9NVEQsIG10ZF9wYXRoLCBNQVhfUEFUSF9MRU4pOw0KIAlpZiAocmV0IDwgMCkNCiAJew0KQEAgLTcwNiw5ICs3ODYsMTcgQEAKIHsNCiAgICAgVF9GTEFHU19JTkZPIG1haW5fZmxhZyA9IHswfTsNCiAgICAgVF9GTEFHU19JTkZPIGJhY2t1cF9mbGFnID0gezB9Ow0KKwlUX0ZMQUdTX0lORk8gcF9mbGFnc19pbmZvX3RtcCA9IHswfTsNCisNCiAgICAgaW50IG1haW5faW5kZXggPSAwOw0KICAgICBpbnQgYmFja3VwX2luZGV4ID0gMTsNCiANCisJdW5zaWduZWQgaW50IGNyYzMyX21haW4gPSAwOw0KKwl1bnNpZ25lZCBpbnQgY3JjMzJfYmFja3VwID0gMDsNCisJDQorCXVuc2lnbmVkIGludCBjcmMzMl9sZV9tYWluID0gMDsNCisJdW5zaWduZWQgaW50IGNyYzMyX2xlX2JhY2t1cCA9IDA7DQorDQogCWlmIChOVUxMID09IHBfZmxhZ3NfaW5mbykNCiAJew0KIAkJZmxhZ3NfZXJyKCJpbnZhbGlkIHBhcmFtIE5VTEwiKTsNCkBAIC03MjIsMTUgKzgxMCw1NiBAQAogCQkNCiAgICAgICAgIHJldHVybiAtMTsNCiAgICAgfQ0KKwkNCisJZmxhZ3NfbG9nKCJtYWluX2ZsYWcgY3JjMzI9JXUiLCBtYWluX2ZsYWcuY3JjMzIpOw0KKwlmbGFnc19sb2coImJhY2t1cF9mbGFnIGNyYzMyPSV1IiwgYmFja3VwX2ZsYWcuY3JjMzIpOw0KKwkNCisJaWYgKCgwID09IG1haW5fZmxhZy5jcmMzMikgJiYgKDAgPT0gYmFja3VwX2ZsYWcuY3JjMzIpKQ0KKwl7DQorCQlpZiAoKEZMQUdTX01BR0lDID09IG1haW5fZmxhZy5tYWdpY19zdGFydCkgJiYgKEZMQUdTX01BR0lDID09IG1haW5fZmxhZy5tYWdpY19lbmQpKQ0KKwkJew0KKwkJCWlmICgoRkxBR1NfTUFHSUMgPT0gYmFja3VwX2ZsYWcubWFnaWNfc3RhcnQpICYmIChGTEFHU19NQUdJQyA9PSBiYWNrdXBfZmxhZy5tYWdpY19lbmQpKQ0KKwkJCXsNCisJCQkJbWVtY3B5KCZwX2ZsYWdzX2luZm9fdG1wLCAmbWFpbl9mbGFnLCBzaXplb2YoVF9GTEFHU19JTkZPKSk7DQorCQkJCWNyYzMyaW5pdF9sZSgpOw0KKwkJCQlwX2ZsYWdzX2luZm9fdG1wLmNyYzMyID0gMDsNCisJCQkJcF9mbGFnc19pbmZvX3RtcC5jcmMzMiA9IGNyYzMyX2xlKDAsICh1bnNpZ25lZCBjaGFyIGNvbnN0ICopKCZwX2ZsYWdzX2luZm9fdG1wKSwgc2l6ZW9mKFRfRkxBR1NfSU5GTykpOw0KKwkJCQlmbGFnc19sb2coIm9sZCB2ZXJzaW9uLCBzZXQgY3JjMzI9JXUiLCBwX2ZsYWdzX2luZm9fdG1wLmNyYzMyKTsNCisJCQkJDQorCQkJCWlmIChzZXRfZmxhZ3NfaW5mbygmcF9mbGFnc19pbmZvX3RtcCwgJm1haW5faW5kZXgsICZiYWNrdXBfaW5kZXgpICE9IDApDQorCQkJCXsNCisJCQkJCWZsYWdzX2Vycigib2xkIHZlcnNpb24sIHNldCBmbGFncyBpbmZvIGZhaWwiKTsNCisJCQkJCXJldHVybiAtMTsNCisJCQkJfQ0KKwkJCQkNCisJCQkJY29weV9mbGFnc19pbmZvKHBfZmxhZ3NfaW5mbywgJm1haW5fZmxhZyk7DQorCQkJCXJldHVybiAwOw0KKwkJCX0NCisJCX0NCisJfQ0KIA0KLSAgICBpZiAoKEZMQUdTX01BR0lDID09IG1haW5fZmxhZy5tYWdpY19zdGFydCkgJiYgKEZMQUdTX01BR0lDID09IG1haW5fZmxhZy5tYWdpY19lbmQpKQ0KKwljcmMzMl9tYWluID0gbWFpbl9mbGFnLmNyYzMyOw0KKwljcmMzMl9iYWNrdXAgPSBiYWNrdXBfZmxhZy5jcmMzMjsNCisNCisJbWFpbl9mbGFnLmNyYzMyID0gMDsNCisJYmFja3VwX2ZsYWcuY3JjMzIgPSAwOw0KKwkNCisJY3JjMzJpbml0X2xlKCk7DQorCQ0KKwljcmMzMl9sZV9tYWluID0gY3JjMzJfbGUoMCwgKHVuc2lnbmVkIGNoYXIgY29uc3QgKikoJm1haW5fZmxhZyksIHNpemVvZihtYWluX2ZsYWcpKTsNCisJZmxhZ3NfbG9nKCJjcmMzMl9sZV9tYWluIGNyYzMyPSV1IiwgY3JjMzJfbGVfbWFpbik7DQorCQ0KKwljcmMzMl9sZV9iYWNrdXAgPSBjcmMzMl9sZSgwLCAodW5zaWduZWQgY2hhciBjb25zdCAqKSgmYmFja3VwX2ZsYWcpLCBzaXplb2YoYmFja3VwX2ZsYWcpKTsNCisJZmxhZ3NfbG9nKCJjcmMzMl9sZV9iYWNrdXAgY3JjMzI9JXUiLCBjcmMzMl9sZV9iYWNrdXApOw0KKw0KKyAgICBpZiAoY3JjMzJfbWFpbiA9PSBjcmMzMl9sZV9tYWluKQ0KICAgICB7DQogICAgICAgICBjb3B5X2ZsYWdzX2luZm8ocF9mbGFnc19pbmZvLCAmbWFpbl9mbGFnKTsNCiAJCQ0KICAgICAgICAgcmV0dXJuIDA7DQogICAgIH0NCiAJDQotICAgIGlmICgoRkxBR1NfTUFHSUMgPT0gYmFja3VwX2ZsYWcubWFnaWNfc3RhcnQpICYmIChGTEFHU19NQUdJQyA9PSBiYWNrdXBfZmxhZy5tYWdpY19lbmQpKQ0KKyAgICBpZiAoY3JjMzJfYmFja3VwID09IGNyYzMyX2xlX2JhY2t1cCkNCiAgICAgew0KICAgICAgICAgY29weV9mbGFnc19pbmZvKHBfZmxhZ3NfaW5mbywgJmJhY2t1cF9mbGFnKTsNCiAJCQ0KQEAgLTc3MSw2ICs5MDAsMTEgQEAKICAgICAgICAgcmV0dXJuIC0xOw0KICAgICB9DQogDQorCWNyYzMyaW5pdF9sZSgpOw0KKwlwX2ZsYWdzX2luZm8tPmNyYzMyID0gMDsNCisJcF9mbGFnc19pbmZvLT5jcmMzMiA9IGNyYzMyX2xlKDAsICh1bnNpZ25lZCBjaGFyIGNvbnN0ICopcF9mbGFnc19pbmZvLCBzaXplb2YoVF9GTEFHU19JTkZPKSk7DQorCWZsYWdzX2xvZygic2V0IGNyYzMyPSV1IiwgcF9mbGFnc19pbmZvLT5jcmMzMik7DQorDQogICAgIGlmIChzZXRfZmxhZ3NfaW5mbyhwX2ZsYWdzX2luZm8sICZtYWluX2luZGV4LCAmYmFja3VwX2luZGV4KSAhPSAwKQ0KICAgICB7DQogICAgICAgICBmbGFnc19lcnIoInNldCB1YmlmcyBzdGF0dXMgZmFpbCIpOw0KQEAgLTc4NCw5OSArOTE4LDU4IEBACiANCiBpbnQgZmxhZ3NfZ2V0X3ViaWZzX3N0YXR1cyhUX1VCSUZTX1NUQVRVUyAqcF91Ymlmc19zdGF0dXMpDQogew0KLSAgICBUX0ZMQUdTX0lORk8gbWFpbl9mbGFnID0gezB9Ow0KLSAgICBUX0ZMQUdTX0lORk8gYmFja3VwX2ZsYWcgPSB7MH07DQotICAgIGludCBtYWluX2luZGV4ID0gMDsNCi0gICAgaW50IGJhY2t1cF9pbmRleCA9IDE7DQorCVRfRkxBR1NfSU5GTyBwX2ZsYWdzX2luZm8gPSB7MH07DQogCQ0KIAlpZiAoTlVMTCA9PSBwX3ViaWZzX3N0YXR1cykNCiAJew0KIAkJZmxhZ3NfZXJyKCJpbnZhbGlkIHBhcmFtIE5VTEwiKTsNCi0JCQ0KIAkJcmV0dXJuIC0xOw0KIAl9DQogDQotICAgIGlmIChnZXRfZmxhZ3NfaW5mbygmbWFpbl9mbGFnLCAmbWFpbl9pbmRleCwgJmJhY2t1cF9mbGFnLCAmYmFja3VwX2luZGV4KSAhPSAwKQ0KLSAgICB7DQotICAgIAlmbGFnc19lcnIoImdldCBmbGFncyBpbmZvIGZhaWwiKTsNCisJaWYgKDAgPT0gZmxhZ3NfZ2V0KCZwX2ZsYWdzX2luZm8pKQ0KKwl7DQorCQlwX3ViaWZzX3N0YXR1cy0+ZnNfc3RhdHVzID0gcF9mbGFnc19pbmZvLnViaWZzX3N0YXR1cy5mc19zdGF0dXM7DQorCQlzdHJuY3B5KHBfdWJpZnNfc3RhdHVzLT5mc19tdGRfbmFtZSwgcF9mbGFnc19pbmZvLnViaWZzX3N0YXR1cy5mc19tdGRfbmFtZSwgc2l6ZW9mKHBfdWJpZnNfc3RhdHVzLT5mc19tdGRfbmFtZSkpOw0KKwkJc3RybmNweShwX3ViaWZzX3N0YXR1cy0+ZnNfdWJpX3ZvbF9uYW1lLCBwX2ZsYWdzX2luZm8udWJpZnNfc3RhdHVzLmZzX3ViaV92b2xfbmFtZSwgc2l6ZW9mKHBfdWJpZnNfc3RhdHVzLT5mc191Ymlfdm9sX25hbWUpKTsNCiAJCQ0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotCQ0KLSAgICBpZiAoKEZMQUdTX01BR0lDID09IG1haW5fZmxhZy5tYWdpY19zdGFydCkgJiYgKEZMQUdTX01BR0lDID09IG1haW5fZmxhZy5tYWdpY19lbmQpKQ0KLSAgICB7DQotCQlwX3ViaWZzX3N0YXR1cy0+ZnNfc3RhdHVzID0gbWFpbl9mbGFnLnViaWZzX3N0YXR1cy5mc19zdGF0dXM7DQotCQlzdHJuY3B5KHBfdWJpZnNfc3RhdHVzLT5mc19tdGRfbmFtZSwgbWFpbl9mbGFnLnViaWZzX3N0YXR1cy5mc19tdGRfbmFtZSwgc2l6ZW9mKHBfdWJpZnNfc3RhdHVzLT5mc19tdGRfbmFtZSkpOw0KLQkJc3RybmNweShwX3ViaWZzX3N0YXR1cy0+ZnNfdWJpX3ZvbF9uYW1lLCBtYWluX2ZsYWcudWJpZnNfc3RhdHVzLmZzX3ViaV92b2xfbmFtZSwgc2l6ZW9mKHBfdWJpZnNfc3RhdHVzLT5mc191Ymlfdm9sX25hbWUpKTsNCi0JCQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0JCQkNCi0gICAgaWYgKChGTEFHU19NQUdJQyA9PSBiYWNrdXBfZmxhZy5tYWdpY19zdGFydCkgJiYgKEZMQUdTX01BR0lDID09IGJhY2t1cF9mbGFnLm1hZ2ljX2VuZCkpDQotICAgIHsNCi0JCXBfdWJpZnNfc3RhdHVzLT5mc19zdGF0dXMgPSBiYWNrdXBfZmxhZy51Ymlmc19zdGF0dXMuZnNfc3RhdHVzOw0KLQkJc3RybmNweShwX3ViaWZzX3N0YXR1cy0+ZnNfbXRkX25hbWUsIGJhY2t1cF9mbGFnLnViaWZzX3N0YXR1cy5mc19tdGRfbmFtZSwgc2l6ZW9mKHBfdWJpZnNfc3RhdHVzLT5mc19tdGRfbmFtZSkpOw0KLQkJc3RybmNweShwX3ViaWZzX3N0YXR1cy0+ZnNfdWJpX3ZvbF9uYW1lLCBiYWNrdXBfZmxhZy51Ymlmc19zdGF0dXMuZnNfdWJpX3ZvbF9uYW1lLCBzaXplb2YocF91Ymlmc19zdGF0dXMtPmZzX3ViaV92b2xfbmFtZSkpOw0KLQkJDQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICBmbGFnc19lcnIoImRvIG5vdCBmaW5kIHZhbGlkIGZsYWdzIGluZm8iKTsNCi0JDQotICAgIHJldHVybiAtMTsNCisJCXJldHVybiAwOw0KKwl9DQorCWVsc2UNCisJew0KKwkgICAgZmxhZ3NfZXJyKCJkbyBub3QgZmluZCB2YWxpZCBmbGFncyBpbmZvIik7DQorCSAgICByZXR1cm4gLTE7DQorCX0NCiB9DQogDQogDQogaW50IGZsYWdzX3NldF91Ymlmc19zdGF0dXMoVF9VQklGU19TVEFUVVMgKnBfdWJpZnNfc3RhdHVzKQ0KIHsNCi0gICAgVF9GTEFHU19JTkZPIG1haW5fZmxhZyA9IHswfTsNCi0gICAgVF9GTEFHU19JTkZPIGJhY2t1cF9mbGFnID0gezB9Ow0KLSAgICBpbnQgbWFpbl9pbmRleCA9IDA7DQotICAgIGludCBiYWNrdXBfaW5kZXggPSAxOw0KKwlUX0ZMQUdTX0lORk8gcF9mbGFnc19pbmZvID0gezB9Ow0KIAkNCi0gICAgVF9GTEFHU19JTkZPICpmbGFnc19pbmZvID0gTlVMTDsNCi0NCiAJaWYgKE5VTEwgPT0gcF91Ymlmc19zdGF0dXMpDQogCXsNCiAJCWZsYWdzX2VycigiaW52YWxpZCBwYXJhbSBOVUxMIik7DQotCQkNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlpZiAoMCAhPSBmbGFnc19nZXQoJnBfZmxhZ3NfaW5mbykpDQorCXsNCisJCWZsYWdzX2VycigiZ2V0IHViaWZzIHN0YXR1cyBpbnZhbGlkIik7DQogCQlyZXR1cm4gLTE7DQogCX0NCiAJDQotICAgIGlmIChnZXRfZmxhZ3NfaW5mbygmbWFpbl9mbGFnLCAmbWFpbl9pbmRleCwgJmJhY2t1cF9mbGFnLCAmYmFja3VwX2luZGV4KSAhPSAwKQ0KLSAgICB7DQotICAgIAlmbGFnc19lcnIoImdldCBmbGFncyBpbmZvIGZhaWwiKTsNCi0JCQ0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQorCW1lbWNweSgmKHBfZmxhZ3NfaW5mby51Ymlmc19zdGF0dXMpLCBwX3ViaWZzX3N0YXR1cywgc2l6ZW9mKFRfVUJJRlNfU1RBVFVTKSk7DQogDQotICAgIGlmICgoRkxBR1NfTUFHSUMgPT0gbWFpbl9mbGFnLm1hZ2ljX3N0YXJ0KSAmJiAoRkxBR1NfTUFHSUMgPT0gbWFpbl9mbGFnLm1hZ2ljX2VuZCkpDQotICAgIHsNCi0gICAgICAgIGZsYWdzX2luZm8gPSAmbWFpbl9mbGFnOw0KLSAgICB9DQotICAgIGVsc2UgaWYgKChGTEFHU19NQUdJQyA9PSBiYWNrdXBfZmxhZy5tYWdpY19zdGFydCkgJiYgKEZMQUdTX01BR0lDID09IGJhY2t1cF9mbGFnLm1hZ2ljX2VuZCkpDQotICAgIHsNCi0gICAgICAgIGZsYWdzX2luZm8gPSAmYmFja3VwX2ZsYWc7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBmbGFnc19lcnIoImdldCB1YmlmcyBzdGF0dXMgaW52YWxpZCIpOw0KLQkJDQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0NCi0JbWVtY3B5KCYoZmxhZ3NfaW5mby0+dWJpZnNfc3RhdHVzKSwgcF91Ymlmc19zdGF0dXMsIHNpemVvZihUX1VCSUZTX1NUQVRVUykpOw0KLQ0KLSAgICBpZiAoc2V0X2ZsYWdzX2luZm8oZmxhZ3NfaW5mbywgJm1haW5faW5kZXgsICZiYWNrdXBfaW5kZXgpICE9IDApDQotICAgIHsNCi0gICAgICAgIGZsYWdzX2Vycigic2V0IHViaWZzIHN0YXR1cyBmYWlsIik7DQotCQkNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KKwlpZiAoMCAhPSBmbGFnc19zZXQoJnBfZmxhZ3NfaW5mbykpDQorCXsNCisJCWZsYWdzX2Vycigic2V0IHViaWZzIHN0YXR1cyBmYWlsIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisJDQogICAgIHJldHVybiAwOw0KIH0NCiANCisNCiB1bnNpZ25lZCBpbnQgZmxhZ3NfZ2V0X252cm9mbGFnKHZvaWQpDQogew0KIAlUX0ZMQUdTX0lORk8gdF9mbGFnID0gezB9Ow0KQEAgLTg4Niw2ICs5NzksNyBAQAogCXJldHVybiB0X2ZsYWcubnZyb19mbGFnOw0KIH0NCiANCisNCiBpbnQgZmxhZ3Nfc2V0X252cm9mbGFnKHVuc2lnbmVkIGludCBmbGFnKQ0KIHsNCiAJVF9GTEFHU19JTkZPIHRfZmxhZyA9IHswfTsNCkBAIC05MDcsNiArMTAwMSw3IEBACiAJcmV0dXJuIGZsYWdzX3NldCgmdF9mbGFnKTsNCiB9DQogDQorDQogaW50IGZsYWdzX2dldF9jdXJyZW50X3N5c3RlbSgpDQogew0KICAgICBpbnQgY3VycmVudCA9IGdldF9jdXJyZW50X3N5c3RlbSgpOw0KQEAgLTkyMywzICsxMDE4LDg0IEBACiAgICAgcmV0dXJuIC0xOw0KIH0NCiANCisNCisvKiC0y0FQSb3208PT2rX3suKjrNX9yr20+sLrsru/ycq508MgKi8NCitpbnQgZmxhZ3NfZ2V0X25vY3JjKFRfRkxBR1NfSU5GTyAqcF9mbGFnc19pbmZvKQ0KK3sNCisgICAgVF9GTEFHU19JTkZPIG1haW5fZmxhZyA9IHswfTsNCisgICAgVF9GTEFHU19JTkZPIGJhY2t1cF9mbGFnID0gezB9Ow0KKyAgICBpbnQgbWFpbl9pbmRleCA9IDA7DQorICAgIGludCBiYWNrdXBfaW5kZXggPSAxOw0KKw0KKwlpZiAoTlVMTCA9PSBwX2ZsYWdzX2luZm8pDQorCXsNCisJCWZsYWdzX2VycigiaW52YWxpZCBwYXJhbSBOVUxMIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisgICAgaWYgKGdldF9mbGFnc19pbmZvKCZtYWluX2ZsYWcsICZtYWluX2luZGV4LCAmYmFja3VwX2ZsYWcsICZiYWNrdXBfaW5kZXgpICE9IDApDQorICAgIHsNCisgICAgCWZsYWdzX2VycigiZ2V0IGZsYWdzIGluZm8gZmFpbCIpOw0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorCQ0KKwlpZiAoMCAhPSBtZW1jbXAoJm1haW5fZmxhZywgJmJhY2t1cF9mbGFnLCBzaXplb2YoVF9GTEFHU19JTkZPKSkpDQorCXsNCisJICAgIGZsYWdzX2VycigibWFpbiBmbGFnIGFuZCBiYWNrdXAgZmxhZyBhcmUgZGlmZmVyZW50Iik7DQorICAgICAgICByZXR1cm4gLTE7DQorCX0NCisJDQorCWNvcHlfZmxhZ3NfaW5mbyhwX2ZsYWdzX2luZm8sICZtYWluX2ZsYWcpOw0KKwlwX2ZsYWdzX2luZm8tPmNyYzMyID0gbWFpbl9mbGFnLmNyYzMyOw0KKw0KKyAgICByZXR1cm4gMDsNCit9DQorDQorDQorLyogtMtBUEm99tPD09q197Lio6zV/cq9tPrC67K7v8nKudPDICovDQoraW50IGZsYWdzX3NldF9ub2NyYyhUX0ZMQUdTX0lORk8gKnBfZmxhZ3NfaW5mbykNCit7DQorCVRfRkxBR1NfSU5GTyBtYWluX2ZsYWcgPSB7MH07DQorICAgIFRfRkxBR1NfSU5GTyBiYWNrdXBfZmxhZyA9IHswfTsNCisgICAgaW50IG1haW5faW5kZXggPSAwOw0KKyAgICBpbnQgYmFja3VwX2luZGV4ID0gMTsNCisJDQorCWlmIChOVUxMID09IHBfZmxhZ3NfaW5mbykNCisJew0KKwkJZmxhZ3NfZXJyKCJpbnZhbGlkIHBhcmFtIE5VTEwiKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlpZiAoKEZMQUdTX01BR0lDICE9IHBfZmxhZ3NfaW5mby0+bWFnaWNfc3RhcnQpIHx8IChGTEFHU19NQUdJQyAhPSBwX2ZsYWdzX2luZm8tPm1hZ2ljX2VuZCkpDQorCXsNCisJCWZsYWdzX2VycigiaW52YWxpZCBtYWdpYyIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorCQ0KKyAgICBpZiAoZ2V0X2ZsYWdzX2luZm8oJm1haW5fZmxhZywgJm1haW5faW5kZXgsICZiYWNrdXBfZmxhZywgJmJhY2t1cF9pbmRleCkgIT0gMCkNCisgICAgew0KKyAgICAJZmxhZ3NfZXJyKCJnZXQgZmxhZ3MgaW5mbyBmYWlsIik7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgaWYgKHNldF9mbGFnc19pbmZvKHBfZmxhZ3NfaW5mbywgJm1haW5faW5kZXgsICZiYWNrdXBfaW5kZXgpICE9IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2Vycigic2V0IHViaWZzIHN0YXR1cyBmYWlsIik7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KKw0KK3ZvaWQgY3JjMzJpbml0X2xlKHZvaWQpDQorew0KKwljcmMzMmluaXRfbGVfZ2VuZXJpYyhDUkMzMl9QT0xZX0xFLCBjcmMzMnRhYmxlX2xlKTsNCit9DQorDQorDQordW5zaWduZWQgaW50IGNyYzMyX2xlKHVuc2lnbmVkIGludCBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsIHNpemVfdCBsZW4pDQorew0KKwlyZXR1cm4gY3JjMzJfbGVfZ2VuZXJpYyhjcmMsIHAsIGxlbiwgKGNvbnN0IHVuc2lnbmVkIGludCAoKilbMjU2XSljcmMzMnRhYmxlX2xlKTsNCit9DQorDQo=