ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJmbGFncy9mbGFnc19hcGkuYyBiL2FwL2xpYi9saWJmbGFncy9mbGFnc19hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMGM5ZmYzCi0tLSAvZGV2L251bGwKKysrIGIvYXAvbGliL2xpYmZsYWdzL2ZsYWdzX2FwaS5jCkBAIC0wLDAgKzEsMTExMSBAQAorLyoqDQorICogQGZpbGUgZmxhZ3NfYXBpLmMNCisgKiBAYnJpZWYgZmxhZ3O31sf4vdO/2sq1z9YNCisgKg0KKyAqIENvcHlyaWdodCAoQykgMjAyMyBTYW5lY2hpcHMgVGVjaG5vbG9neSBDby4sIEx0ZC4NCisgKiBAYXV0aG9yIA0KKyAqIA0KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMNCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4go6ix2NGho7pHUEx2MiBMaWNlbmNlo6kNCisgKg0KKyAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlIGhlYWRlciBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8dW5pc3RkLmg+DQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKyNpbmNsdWRlIDxlcnJuby5oPg0KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4NCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4NCisjaW5jbHVkZSA8ZmNudGwuaD4NCisjaW5jbHVkZSA8bXRkL210ZC1hYmkuaD4NCisNCisjaW5jbHVkZSAicHViX2ZsYWdzLmgiDQorDQorI2luY2x1ZGUgImZsYWdzX2xvZy5oIg0KKyNpbmNsdWRlICJmbGFnc19hcGkuaCINCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNybyBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjZGVmaW5lIE1BWF9QQVRIX0xFTiAoMjU2KQ0KKw0KKyNkZWZpbmUgUEFSVElUSU9OX05BTUVfRkxBR1MgImZsYWdzIg0KKw0KKyNkZWZpbmUgRkxBR1NfSU5JVF9WQUxJRF9CTE9DS1NfTlVNCSg4KQ0KKw0KKyNkZWZpbmUgR09PRF9CTE9DSyAoMCkNCisjZGVmaW5lIEJBRF9CTE9DSyAoMSkNCisNCisjZGVmaW5lIEZJTEVfUEFUSF9QUk9DX0NNRExJTkUgIi9wcm9jL2NtZGxpbmUiDQorDQorI2RlZmluZSBQUk9DX0NNRExJTkVfU1lTVEVNX0FfRkxBRyAgICJzeXN0ZW09c3lzdGVtX2EiDQorI2RlZmluZSBQUk9DX0NNRExJTkVfU1lTVEVNX0JfRkxBRyAgICJzeXN0ZW09c3lzdGVtX2IiDQorDQorI2RlZmluZSBTWVNURU1fSU5ERVhfVU5LTk9XTiAoLTEpDQorI2RlZmluZSBTWVNURU1fSU5ERVhfMSAoMSkNCisjZGVmaW5lIFNZU1RFTV9JTkRFWF8yICgyKQ0KKw0KKyNkZWZpbmUgQ1JDX0xFX0JJVFMgNjQNCisjZGVmaW5lIENSQzMyX1BPTFlfTEUgMHhlZGI4ODMyMA0KKyNkZWZpbmUgTEVfVEFCTEVfUk9XUyAoQ1JDX0xFX0JJVFMvOCkNCisjZGVmaW5lIExFX1RBQkxFX1NJWkUgMjU2DQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIHVuc2lnbmVkIGludCBtdGRfdG90YWxzaXplOwkJCQkvLyBtdGQgZGV2aWNlIHRvdGFsIHNpemUNCisgICAgdW5zaWduZWQgaW50IG10ZF9wYWdlcGVyYmxvY2s7CQkJLy8gbXRkIGRldmljZSBwYWdlIHBlciBibG9jaw0KKyAgICB1bnNpZ25lZCBpbnQgbXRkX2Jsb2Nrc2l6ZTsJCQkJLy8gbXRkIGRldmljZSBibG9jayBzaXplDQorICAgIHVuc2lnbmVkIGludCBtdGRfcGFnZXNpemU7CQkJCS8vIG10ZCBkZXZpY2UgcGFnZSBzaXplDQorICAgIHVuc2lnbmVkIGludCBtdGRfb29ic2l6ZTsJCQkJLy8gbXRkIGRldmljZSBvb2Igc2l6ZQ0KKyAgICBpbnQgcGFydGlfZmlsZV9kZXNjOwkJCQkJLy8gcGFydGl0aW9uIHVwZGF0ZSBmaWxlIGRlc2NyaXB0aW9uDQorfSBwYXJ0aXRpb25fbXRkX2luZm9fdDsNCisNCisNCit0eXBlZGVmIGVudW0NCit7DQorICAgIERFVklDRV9NVEQgPSAwLA0KKyAgICBERVZJQ0VfWkZUTCA9IDEsDQorICAgIERFVklDRV9NVERfQkxPQ0ssDQorfSBkZXZpY2VfdHlwZV90Ow0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoJCQkJCQkgICBMb2NhbCB2YXJpYWJsZSBkZWZpbml0aW9ucwkJCQkJCSAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoJCQkJCQkgIEdsb2JhbCB2YXJpYWJsZSBkZWZpbml0aW9ucwkJCQkJCSAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3JjMzJ0YWJsZV9sZVtMRV9UQUJMRV9ST1dTXVsyNTZdOw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogCQkJCQkgICBMb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMJCQkJCQkJICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIHZvaWQgY3JjMzJpbml0X2xlX2dlbmVyaWMoY29uc3QgdW5zaWduZWQgaW50IHBvbHlub21pYWwsIHVuc2lnbmVkIGludCAoKnRhYilbMjU2XSk7DQorc3RhdGljIHVuc2lnbmVkIGludCBjcmMzMl9ib2R5KHVuc2lnbmVkIGludCBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgdW5zaWduZWQgaW50ICgqdGFiKVsyNTZdKTsNCitzdGF0aWMgdW5zaWduZWQgaW50IGNyYzMyX2xlX2dlbmVyaWModW5zaWduZWQgaW50IGNyYywgdW5zaWduZWQgY2hhciBjb25zdCAqcCwgc2l6ZV90IGxlbiwgY29uc3QgdW5zaWduZWQgaW50ICgqdGFiKVsyNTZdKTsNCisNCitzdGF0aWMgaW50IG10ZF9nZXQoY29uc3QgY2hhciAqaV9wYXJ0aV9uYW1lLCBkZXZpY2VfdHlwZV90IGRldmljZV90eXBlLCBjaGFyICpvX210ZF9wYXRoLCB1bnNpZ25lZCBpbnQgb19tdGRfcGF0aF9sZW4pOw0KK3N0YXRpYyBpbnQgd3JpdGVfZmxhZ3NfaW5mbyhwYXJ0aXRpb25fbXRkX2luZm9fdCAqcF9tdGRfaW5mbywgaW50IGluZGV4LCB1bnNpZ25lZCBjaGFyICpjb250ZW50LCBpbnQgbGVuKTsNCisNCitzdGF0aWMgaW50IGdldF9mbGFnc19pbmZvKFRfRkxBR1NfSU5GTyAqcF9tYWluLCBpbnQgKnBfbWFpbl9pbmRleCwgVF9GTEFHU19JTkZPICpwX2JhY2t1cCwgaW50ICpwX2JhY2t1cF9pbmRleCk7DQorc3RhdGljIGludCBzZXRfZmxhZ3NfaW5mbyhUX0ZMQUdTX0lORk8gKnBfZmxhZ3NfaW5mbywgaW50ICpwX21haW5faW5kZXgsIGludCAqcF9iYWNrdXBfaW5kZXgpOw0KKw0KK3N0YXRpYyB2b2lkIGNvcHlfZmxhZ3NfaW5mbyhUX0ZMQUdTX0lORk8gKmRzdCwgVF9GTEFHU19JTkZPICpzcmMpOw0KKw0KK3N0YXRpYyBpbnQgZ2V0X2N1cnJlbnRfc3lzdGVtKCk7DQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiAJCQkJCSBMb2NhbCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgCQkJCQkJICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIHZvaWQgY3JjMzJpbml0X2xlX2dlbmVyaWMoY29uc3QgdW5zaWduZWQgaW50IHBvbHlub21pYWwsIHVuc2lnbmVkIGludCAoKnRhYilbMjU2XSkNCit7DQorCXVuc2lnbmVkIGksIGo7DQorCXVuc2lnbmVkIGludCBjcmMgPSAxOw0KKw0KKwl0YWJbMF1bMF0gPSAwOw0KKw0KKwlmb3IgKGkgPSBMRV9UQUJMRV9TSVpFID4+IDE7IGk7IGkgPj49IDEpIHsNCisJCWNyYyA9IChjcmMgPj4gMSkgXiAoKGNyYyAmIDEpID8gcG9seW5vbWlhbCA6IDApOw0KKwkJZm9yIChqID0gMDsgaiA8IExFX1RBQkxFX1NJWkU7IGogKz0gMiAqIGkpDQorCQkJdGFiWzBdW2kgKyBqXSA9IGNyYyBeIHRhYlswXVtqXTsNCisJfQ0KKwlmb3IgKGkgPSAwOyBpIDwgTEVfVEFCTEVfU0laRTsgaSsrKSB7DQorCQljcmMgPSB0YWJbMF1baV07DQorCQlmb3IgKGogPSAxOyBqIDwgTEVfVEFCTEVfUk9XUzsgaisrKSB7DQorCQkJY3JjID0gdGFiWzBdW2NyYyAmIDB4ZmZdIF4gKGNyYyA+PiA4KTsNCisJCQl0YWJbal1baV0gPSBjcmM7DQorCQl9DQorCX0NCit9DQorDQorDQorc3RhdGljIHVuc2lnbmVkIGludCBjcmMzMl9ib2R5KHVuc2lnbmVkIGludCBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgdW5zaWduZWQgaW50ICgqdGFiKVsyNTZdKQ0KK3sNCisjZGVmaW5lIERPX0NSQyh4KSBjcmMgPSB0MFsoY3JjIF4gKHgpKSAmIDI1NV0gXiAoY3JjID4+IDgpDQorI2RlZmluZSBET19DUkM0ICh0M1socSkgJiAyNTVdIF4gdDJbKHEgPj4gOCkgJiAyNTVdIF4gXA0KKwkJICAgdDFbKHEgPj4gMTYpICYgMjU1XSBeIHQwWyhxID4+IDI0KSAmIDI1NV0pDQorI2RlZmluZSBET19DUkM4ICh0N1socSkgJiAyNTVdIF4gdDZbKHEgPj4gOCkgJiAyNTVdIF4gXA0KKwkJICAgdDVbKHEgPj4gMTYpICYgMjU1XSBeIHQ0WyhxID4+IDI0KSAmIDI1NV0pDQorDQorCWNvbnN0IHVuc2lnbmVkIGludCAqYjsNCisJc2l6ZV90ICAgIHJlbV9sZW47DQorDQorCWNvbnN0IHVuc2lnbmVkIGludCAqdDA9dGFiWzBdLCAqdDE9dGFiWzFdLCAqdDI9dGFiWzJdLCAqdDM9dGFiWzNdOw0KKwljb25zdCB1bnNpZ25lZCBpbnQgKnQ0ID0gdGFiWzRdLCAqdDUgPSB0YWJbNV0sICp0NiA9IHRhYls2XSwgKnQ3ID0gdGFiWzddOw0KKwl1bnNpZ25lZCBpbnQgcTsNCisJDQorCWlmICgobG9uZylidWYgJiAzICYmIGxlbikNCisJew0KKwkJZG8NCisJCXsNCisJCQlET19DUkMoKmJ1ZisrKTsNCisJCX0gd2hpbGUgKCgtLWxlbikgJiYgKChsb25nKWJ1ZikmMyk7DQorCX0NCisJDQorCXJlbV9sZW4gPSBsZW4gJiA3Ow0KKwlsZW4gPSBsZW4gPj4gMzsNCisJYiA9IChjb25zdCB1bnNpZ25lZCBpbnQgKilidWY7DQorCQ0KKwlmb3IgKC0tYjsgbGVuOyAtLWxlbikNCisJew0KKwkJcSA9IGNyYyBeICorK2I7DQorCQljcmMgPSBET19DUkM4Ow0KKwkJcSA9ICorK2I7DQorCQljcmMgXj0gRE9fQ1JDNDsNCisJfQ0KKwkNCisJbGVuID0gcmVtX2xlbjsNCisJaWYgKGxlbikNCisJew0KKwkJdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopKGIgKyAxKSAtIDE7DQorCQlkbw0KKwkJew0KKwkJCURPX0NSQygqKytwKTsgLyogdXNlIHByZSBpbmNyZW1lbnQgZm9yIHNwZWVkICovDQorCQl9IHdoaWxlICgtLWxlbik7DQorCX0NCisJDQorCXJldHVybiBjcmM7DQorI3VuZGVmIERPX0NSQw0KKyN1bmRlZiBET19DUkM0DQorI3VuZGVmIERPX0NSQzgNCit9DQorDQorDQorc3RhdGljIHVuc2lnbmVkIGludCBjcmMzMl9sZV9nZW5lcmljKHVuc2lnbmVkIGludCBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsIHNpemVfdCBsZW4sIGNvbnN0IHVuc2lnbmVkIGludCAoKnRhYilbMjU2XSkNCit7DQorCWNyYyA9IGNyYzMyX2JvZHkoY3JjLCBwLCBsZW4sIHRhYik7DQorCXJldHVybiBjcmM7DQorfQ0KKw0KKw0KK3N0YXRpYyBpbnQgbXRkX2dldChjb25zdCBjaGFyICppX3BhcnRpX25hbWUsIGRldmljZV90eXBlX3QgZGV2aWNlX3R5cGUsIGNoYXIgKm9fbXRkX3BhdGgsIHVuc2lnbmVkIGludCBvX210ZF9wYXRoX2xlbikNCit7DQorICAgIEZJTEUgKmZwX210ZCA9IDA7DQorICAgIGNoYXIgYnVmWzEyOF07DQorICAgIGNoYXIgKmxpbmVfc3RyOw0KKw0KKyAgICBpZiAoIW9fbXRkX3BhdGhfbGVuKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgZnBfbXRkID0gZm9wZW4oIi9wcm9jL210ZCIsICJyKyIpOw0KKyAgICBpZiAoTlVMTCA9PSBmcF9tdGQpDQorICAgIHsNCisgICAgICAgIGZsYWdzX2Vycigib3BlbiBmaWxlIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgLy8gcHJpbnRmKCJbbGlibXRkXTogcGFydGl0aW9uIG5hbWU6JXNcbiIsIGlfcGFydGlfbmFtZSk7DQorDQorICAgIHdoaWxlICgxKQ0KKyAgICB7DQorICAgICAgICBpbnQgbWF0Y2hlcyA9IDA7DQorICAgICAgICBjaGFyIG10ZG5hbWVbNjRdID0gezB9Ow0KKyAgICAgICAgaW50IG10ZG51bSA9IDA7DQorICAgICAgICB1bnNpZ25lZCBpbnQgbXRkc2l6ZSwgbXRkZXJhc2VzaXplOw0KKyAgICAgICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOw0KKyAgICAgICAgbGluZV9zdHIgPSBmZ2V0cyhidWYsIHNpemVvZihidWYpIC0gMSwgZnBfbXRkKTsNCisNCisgICAgICAgIGlmIChOVUxMID09IGxpbmVfc3RyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZsYWdzX2VycigiZ2V0IGluZm8gZnJvbSBtdGQgZXJyb3I6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgICAgICBmY2xvc2UoZnBfbXRkKTsNCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgICAgICAvLyBtdGQ1OiAwMDEwMDAwMCAwMDAyMDAwMCAiZm90YWZsYWciDQorICAgICAgICBtYXRjaGVzID0gc3NjYW5mKGJ1ZiwgIm10ZCVkOiAleCAleCBcIiU2M1teXCJdIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgJm10ZG51bSwgJm10ZHNpemUsICZtdGRlcmFzZXNpemUsIG10ZG5hbWUpOw0KKyAgICAgICAgbXRkbmFtZVs2M10gPSAnXDAnOw0KKw0KKyAgICAgICAgaWYgKChtYXRjaGVzID09IDQpICYmIChzdHJjbXAobXRkbmFtZSwgaV9wYXJ0aV9uYW1lKSA9PSAwKSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBtZW1zZXQob19tdGRfcGF0aCwgMCwgb19tdGRfcGF0aF9sZW4pOw0KKyAgICAgICAgICAgIGlmIChkZXZpY2VfdHlwZSA9PSBERVZJQ0VfTVREX0JMT0NLKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc25wcmludGYob19tdGRfcGF0aCwgb19tdGRfcGF0aF9sZW4sICIvZGV2L210ZGJsb2NrJWQiLCBtdGRudW0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmIChkZXZpY2VfdHlwZSA9PSBERVZJQ0VfTVREKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgc25wcmludGYob19tdGRfcGF0aCwgb19tdGRfcGF0aF9sZW4sICIvZGV2L210ZCVkIiwgbXRkbnVtKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAoZGV2aWNlX3R5cGUgPT0gREVWSUNFX1pGVEwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBzbnByaW50ZihvX210ZF9wYXRoLCBvX210ZF9wYXRoX2xlbiwgIi9kZXYvemZ0bCVkIiwgbXRkbnVtKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZmxhZ3NfZXJyKCJ1bmtub3duIGRldmljZSB0eXBlICVkIiwgZGV2aWNlX3R5cGUpOw0KKyAgICAgICAgICAgICAgICBmY2xvc2UoZnBfbXRkKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAvLyBwcmludGYoIltsaWJtdGRdOiBvX210ZF9wYXRoPVslc11cbiIsIG9fbXRkX3BhdGgpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGZjbG9zZShmcF9tdGQpOw0KKyAgICByZXR1cm4gMDsNCit9DQorDQorDQorc3RhdGljIGludCB3cml0ZV9mbGFnc19pbmZvKHBhcnRpdGlvbl9tdGRfaW5mb190ICpwX210ZF9pbmZvLCBpbnQgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnQsIGludCBsZW4pDQorew0KKyAgICBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyIGVyYXNlX2luZm87DQorICAgIGludCB3cml0ZV9sZW4gPSAwOw0KKyAgICBsb25nIGxvbmcgIG9mZnMgPSAwOw0KKw0KKyAgICBlcmFzZV9pbmZvLnN0YXJ0ID0gaW5kZXggKiBwX210ZF9pbmZvLT5tdGRfYmxvY2tzaXplOw0KKyAgICBlcmFzZV9pbmZvLmxlbmd0aCA9IHBfbXRkX2luZm8tPm10ZF9ibG9ja3NpemU7DQorDQorICAgIG9mZnMgPSAobG9uZyBsb25nKWluZGV4ICogcF9tdGRfaW5mby0+bXRkX2Jsb2Nrc2l6ZTsNCisNCisgICAgaWYgKGlvY3RsKHBfbXRkX2luZm8tPnBhcnRpX2ZpbGVfZGVzYywgV1JJVEVFTkFCTEUsIDApICE9IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2VycigiZmFpbGVkIHRvIGVuYWJsZSBtdGQgd3JpdGVhYmxlLCBlcnJubz0lZCwgc3RyZXJyb3I9JXMiLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCisJCQ0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorDQorICAgIGlmIChpb2N0bChwX210ZF9pbmZvLT5wYXJ0aV9maWxlX2Rlc2MsIE1FTUdFVEJBREJMT0NLLCAmb2ZmcykgIT0gMCkNCisgICAgew0KKyAgICAgICAgZmxhZ3NfZXJyKCJpb2N0bCBbTUVNR0VUQkFEQkxPQ0tdIGJsb2NrOiAlZCwgY2hhbmdlIHRvIGJlIGJhZCBibG9jaywgZXJybm89JWQsIHN0cmVycm9yPVslc10iLCBpbmRleCwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorCQkNCisgICAgICAgIHJldHVybiBCQURfQkxPQ0s7DQorICAgIH0NCisNCisgICAgaWYgKGlvY3RsKHBfbXRkX2luZm8tPnBhcnRpX2ZpbGVfZGVzYywgTUVNRVJBU0UsICZlcmFzZV9pbmZvKSA8IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2VycigiaW9jdGwgW01FTUVSQVNFXSBibG9jazogJWQgZmFpbCwgZXJybm89JWQsIHN0cmVycm9yPVslc10iLCBpbmRleCwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorCQkNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBpZiAoaW9jdGwocF9tdGRfaW5mby0+cGFydGlfZmlsZV9kZXNjLCBNRU1HRVRCQURCTE9DSywgJm9mZnMpICE9IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2VycigiaW9jdGwgW01FTUdFVEJBREJMT0NLXSBibG9jazolZCAsIGNoYW5nZSB0byBiZSBiYWQgYmxvY2ssIGVycm5vPSVkLCBzdHJlcnJvcj1bJXNdIiwgaW5kZXgsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KKwkJDQorICAgICAgICByZXR1cm4gQkFEX0JMT0NLOw0KKyAgICB9DQorDQorICAgIGlmIChsc2VlayhwX210ZF9pbmZvLT5wYXJ0aV9maWxlX2Rlc2MsIGluZGV4ICogcF9tdGRfaW5mby0+bXRkX2Jsb2Nrc2l6ZSwgU0VFS19TRVQpIDwgMCkNCisgICAgew0KKyAgICAgICAgZmxhZ3NfZXJyKCJsc2VlayBmYWlsLCBlcnJubz0lZCwgc3RyZXJyb3I9WyVzXSIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KKwkJDQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgd3JpdGVfbGVuID0gd3JpdGUocF9tdGRfaW5mby0+cGFydGlfZmlsZV9kZXNjLCBjb250ZW50LCBwX210ZF9pbmZvLT5tdGRfYmxvY2tzaXplKTsNCisNCisgICAgaWYgKHdyaXRlX2xlbiAhPSBwX210ZF9pbmZvLT5tdGRfYmxvY2tzaXplKQ0KKyAgICB7DQorICAgICAgICBmbGFnc19lcnIoIndyaXRlIGZsYXNoIGZhaWwsIGVycm5vPSVkLCBzdHJlcnJvcj1bJXNdIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorCQkNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBpZiAoaW9jdGwocF9tdGRfaW5mby0+cGFydGlfZmlsZV9kZXNjLCBXUklURURJU0FCTEUsIDApICE9IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2VycigiZmFpbGVkIHRvIGRpc2FibGUgbXRkIHdyaXRlYWJsZSwgZXJybm89JWQsIHN0cmVycm9yPSVzIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorICAgIH0NCisJDQorICAgIHJldHVybiAwOw0KK30NCisNCisNCitzdGF0aWMgaW50IGdldF9mbGFnc19pbmZvKFRfRkxBR1NfSU5GTyAqcF9tYWluLCBpbnQgKnBfbWFpbl9pbmRleCwgVF9GTEFHU19JTkZPICpwX2JhY2t1cCwgaW50ICpwX2JhY2t1cF9pbmRleCkNCit7DQorICAgIGludCByZXQgPSAtMTsNCisgICAgaW50IGZkX2RzdCA9IC0xOw0KKyAgICBjaGFyIG10ZF9wYXRoW01BWF9QQVRIX0xFTl0gPSB7MH07DQorICAgIHN0cnVjdCBtdGRfaW5mb191c2VyIG1lbWluZm8gPSB7MH07DQorICAgIHBhcnRpdGlvbl9tdGRfaW5mb190IG10ZF9pbmZvID0gezB9Ow0KKyAgICBpbnQgaW5kZXggID0gMDsNCisgICAgaW50IGJsb2NrX251bSA9IDA7DQorICAgIGludCBnb29kX2luZGV4ID0gMDsNCisgICAgaW50IHJlYWRfbGVuICA9IDA7DQorDQorICAgIGxvbmcgbG9uZyBvZmZzID0gMDsNCisNCisgICAgaW50IGJsb2NrX2ZsYWcgPSBHT09EX0JMT0NLOw0KKw0KKyAgICByZXQgPSBtdGRfZ2V0KFBBUlRJVElPTl9OQU1FX0ZMQUdTLCBERVZJQ0VfTVRELCBtdGRfcGF0aCwgTUFYX1BBVEhfTEVOKTsNCisgICAgaWYgKHJldCA8IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2VycigicGFydGl0aW9uIFslc10gbm90IGZpbmQiLCBQQVJUSVRJT05fTkFNRV9GTEFHUyk7DQorICAgICAgICBnb3RvIGVycm9yOw0KKyAgICB9DQorDQorICAgIGlmICgoZmRfZHN0ID0gb3BlbihtdGRfcGF0aCwgT19SRFdSIHwgT19TWU5DKSkgPCAwKQ0KKyAgICB7DQorICAgICAgICBmbGFnc19lcnIoIm9wZW4gZmxhc2ggZXJyb3IsIGVycm5vPSVkLCBzdHJlcnJvcj1bJXNdIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorICAgICAgICBnb3RvIGVycm9yOw0KKyAgICB9DQorCQ0KKyAgICBtdGRfaW5mby5wYXJ0aV9maWxlX2Rlc2MgPSBmZF9kc3Q7DQorDQorICAgIGlmIChpb2N0bChmZF9kc3QsIE1FTUdFVElORk8sICZtZW1pbmZvKSAhPSAwKQ0KKyAgICB7DQorICAgICAgICBmbGFnc19lcnIoImdldCBmbGFzaCBpbmZvIGVycm9yLCBlcnJubz0lZCwgc3RyZXJyb3I9WyVzXSIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KKyAgICAgICAgZ290byBlcnJvcl9jbG9zZTsNCisgICAgfQ0KKw0KKyAgICBtdGRfaW5mby5tdGRfYmxvY2tzaXplCQk9IG1lbWluZm8uZXJhc2VzaXplOw0KKyAgICBtdGRfaW5mby5tdGRfb29ic2l6ZQkJPSBtZW1pbmZvLm9vYnNpemU7DQorICAgIG10ZF9pbmZvLm10ZF9wYWdlcGVyYmxvY2sgCT0gbWVtaW5mby5lcmFzZXNpemUgLyBtZW1pbmZvLndyaXRlc2l6ZTsNCisgICAgbXRkX2luZm8ubXRkX3BhZ2VzaXplIAkJPSBtZW1pbmZvLndyaXRlc2l6ZTsNCisgICAgbXRkX2luZm8ubXRkX3RvdGFsc2l6ZQkJPSBtZW1pbmZvLnNpemU7DQorDQorICAgIGJsb2NrX251bSA9IG10ZF9pbmZvLm10ZF90b3RhbHNpemUgLyBtdGRfaW5mby5tdGRfYmxvY2tzaXplOw0KKw0KKyAgICBmb3IgKGluZGV4ID0gMDsgKGdvb2RfaW5kZXggPCAyICYmIGluZGV4IDwgYmxvY2tfbnVtKTsgaW5kZXgrKykNCisgICAgew0KKw0KKyAgICAgICAgb2ZmcyA9IGluZGV4ICogbXRkX2luZm8ubXRkX2Jsb2Nrc2l6ZTsNCisgICAgICAgIGlmIChpb2N0bChtdGRfaW5mby5wYXJ0aV9maWxlX2Rlc2MsIE1FTUdFVEJBREJMT0NLLCAmb2ZmcykgPT0gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBibG9ja19mbGFnID0gR09PRF9CTE9DSzsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBmbGFnc19lcnIoImZsYWdzIGJsb2NrIFslZF0gaXMgYmFkLCBlcnJubz0lZCwgc3RyZXJyb3I9WyVzXSIsIGluZGV4LCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgICAgICBibG9ja19mbGFnID0gIEJBRF9CTE9DSzsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChibG9ja19mbGFnID09IEdPT0RfQkxPQ0spDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGxzZWVrKG10ZF9pbmZvLnBhcnRpX2ZpbGVfZGVzYywgaW5kZXggKiBtdGRfaW5mby5tdGRfYmxvY2tzaXplLCBTRUVLX1NFVCkgPCAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZmxhZ3NfZXJyKCJsc2VlayBlcnJvciwgZXJybm89JWQsIHN0cmVycm9yPVslc10iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9jbG9zZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKGdvb2RfaW5kZXggPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJlYWRfbGVuID0gcmVhZChtdGRfaW5mby5wYXJ0aV9maWxlX2Rlc2MsICh1bnNpZ25lZCBjaGFyKilwX21haW4sIHNpemVvZihUX0ZMQUdTX0lORk8pKTsNCisgICAgICAgICAgICAgICAgKnBfbWFpbl9pbmRleCA9IGluZGV4Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmIChnb29kX2luZGV4ID09IDEpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICByZWFkX2xlbiA9IHJlYWQobXRkX2luZm8ucGFydGlfZmlsZV9kZXNjLCAodW5zaWduZWQgY2hhciopcF9iYWNrdXAsIHNpemVvZihUX0ZMQUdTX0lORk8pKTsNCisgICAgICAgICAgICAgICAgKnBfYmFja3VwX2luZGV4ID0gaW5kZXg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAocmVhZF9sZW4gPCBzaXplb2YoVF9GTEFHU19JTkZPKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGZsYWdzX2VycigicmVhZCBsZW4gKCVkKSA8IG5lZWQgbGVuICglZCkiLCByZWFkX2xlbiwgc2l6ZW9mKFRfRkxBR1NfSU5GTykpOw0KKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2Nsb3NlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBnb29kX2luZGV4Kys7DQorICAgICAgICB9DQorDQorICAgIH0NCisNCisgICAgY2xvc2UoZmRfZHN0KTsNCisNCisgICAgcmV0dXJuIDA7DQorDQorZXJyb3JfY2xvc2U6DQorICAgIGNsb3NlKGZkX2RzdCk7DQorDQorZXJyb3I6DQorICAgIHJldHVybiAtMTsNCit9DQorDQorDQorc3RhdGljIGludCBzZXRfZmxhZ3NfaW5mbyhUX0ZMQUdTX0lORk8gKnBfZmxhZ3NfaW5mbywgaW50ICpwX21haW5faW5kZXgsIGludCAqcF9iYWNrdXBfaW5kZXgpDQorew0KKyAgICBpbnQgcmV0ID0gLTE7DQorICAgIGludCBmZF9kc3QgPSAtMTsNCisgICAgY2hhciBtdGRfcGF0aFtNQVhfUEFUSF9MRU5dID0gezB9Ow0KKyAgICBzdHJ1Y3QgbXRkX2luZm9fdXNlciBtZW1pbmZvID0gezB9Ow0KKyAgICBwYXJ0aXRpb25fbXRkX2luZm9fdCBtdGRfaW5mbyA9IHswfTsNCisNCisgICAgdW5zaWduZWQgY2hhciAqcmVhbF93cml0ZV9jb250ZW50ID0gTlVMTDsNCisNCisgICAgaW50IGluZGV4ICA9IDA7DQorICAgIGludCBibG9ja19udW0gPSAwOw0KKyAgICBpbnQgbWFpbl9pbmRleCA9ICpwX21haW5faW5kZXg7DQorICAgIGludCBiYWNrX2luZGV4ID0gKnBfYmFja3VwX2luZGV4Ow0KKw0KKyAgICByZXQgPSBtdGRfZ2V0KFBBUlRJVElPTl9OQU1FX0ZMQUdTLCBERVZJQ0VfTVRELCBtdGRfcGF0aCwgTUFYX1BBVEhfTEVOKTsNCisgICAgaWYgKHJldCA8IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2VycigicGFydGl0aW9uIFslc10gbm90IGZvdW5kIiwgUEFSVElUSU9OX05BTUVfRkxBR1MpOw0KKwkJDQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgaWYgKChmZF9kc3QgPSBvcGVuKG10ZF9wYXRoLCBPX1JEV1IgfCBPX1NZTkMpKSA8IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2Vycigib3BlbiBmbGFzaCBlcnJvciwgZXJybm89JWQsIHN0cmVycm9yPVslc10iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBpZiAoaW9jdGwoZmRfZHN0LCBNRU1HRVRJTkZPLCAmbWVtaW5mbykgIT0gMCkNCisgICAgew0KKyAgICAgICAgZmxhZ3NfZXJyKCJnZXQgZmxhc2ggaW5mbyBlcnJvciwgZXJybm89JWQsIHN0cmVycm9yPVslc10iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCisgICAgICAgIGdvdG8gZXJyb3I7DQorICAgIH0NCisNCisgICAgbXRkX2luZm8ucGFydGlfZmlsZV9kZXNjIAk9IGZkX2RzdDsNCisgICAgbXRkX2luZm8ubXRkX2Jsb2Nrc2l6ZQkJPSBtZW1pbmZvLmVyYXNlc2l6ZTsNCisgICAgbXRkX2luZm8ubXRkX29vYnNpemUJCT0gbWVtaW5mby5vb2JzaXplOw0KKyAgICBtdGRfaW5mby5tdGRfcGFnZXBlcmJsb2NrIAk9IG1lbWluZm8uZXJhc2VzaXplIC8gbWVtaW5mby53cml0ZXNpemU7DQorICAgIG10ZF9pbmZvLm10ZF9wYWdlc2l6ZSAJCT0gbWVtaW5mby53cml0ZXNpemU7DQorICAgIG10ZF9pbmZvLm10ZF90b3RhbHNpemUJCT0gbWVtaW5mby5zaXplOw0KKw0KKyAgICBibG9ja19udW0gPSBtdGRfaW5mby5tdGRfdG90YWxzaXplIC8gbXRkX2luZm8ubXRkX2Jsb2Nrc2l6ZTsNCisNCisgICAgcmVhbF93cml0ZV9jb250ZW50ID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MobXRkX2luZm8ubXRkX2Jsb2Nrc2l6ZSk7DQorICAgIGlmIChOVUxMID09IHJlYWxfd3JpdGVfY29udGVudCkNCisgICAgew0KKyAgICAgICAgZmxhZ3NfZXJyKCJtYWxsb2MgYmxvY2sgZmFpbCIpOw0KKyAgICAgICAgZ290byBlcnJvcjsNCisgICAgfQ0KKw0KKyAgICBtZW1zZXQocmVhbF93cml0ZV9jb250ZW50LCAweEZGLCBtdGRfaW5mby5tdGRfYmxvY2tzaXplKTsNCisgICAgbWVtY3B5KHJlYWxfd3JpdGVfY29udGVudCwgKGNoYXIgKilwX2ZsYWdzX2luZm8sIHNpemVvZihUX0ZMQUdTX0lORk8pKTsNCisJDQorICAgIGZsYWdzX2xvZygiYmVnaW4gdG8gd3JpdGUgbWFpbiBmbGFncyIpOw0KKw0KKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBibG9ja19udW07IGluZGV4KyspDQorICAgIHsNCisgICAgICAgIGlmIChpbmRleCA9PSBiYWNrX2luZGV4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0ID0gd3JpdGVfZmxhZ3NfaW5mbygmbXRkX2luZm8sIGluZGV4LCByZWFsX3dyaXRlX2NvbnRlbnQsIG10ZF9pbmZvLm10ZF9ibG9ja3NpemUpOw0KKyAgICAgICAgaWYgKHJldCA9PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vINC0s8m5pqOszcuz9qOssqK4/NDCtdrSu7/pzrvWww0KKyAgICAgICAgICAgIGZsYWdzX2xvZygibWFpbiBmbGFncyBsb2NhdGlvbjogWyVkXS0+WyVkXSIsIG1haW5faW5kZXgsIGluZGV4KTsNCisgICAgICAgICAgICBtYWluX2luZGV4ID0gaW5kZXg7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIGlmIChyZXQgPT0gQkFEX0JMT0NLKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vINP2tb27tb/po6zP8rrzzPjSu7/pDQorICAgICAgICAgICAgZmxhZ3NfbG9nKCJmbGFncyBibG9jayBpbmRleCBbJWRdIGlzIGJhZCIsIGluZGV4KTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBmbGFnc19lcnIoIndyaXRlIG1haW4gZmxhZ3MgZmFpbCIpOw0KKyAgICAgICAgICAgIG1haW5faW5kZXggPSAtMTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBmbGFnc19sb2coImJlZ2luIHRvIHdyaXRlIGJhY2t1cCBmbGFncyIpOw0KKw0KKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBibG9ja19udW07IGluZGV4KyspDQorICAgIHsNCisgICAgICAgIGlmIChpbmRleCA9PSBtYWluX2luZGV4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZmxhZ3NfbG9nKCJ3cml0ZSBiYWNrdXAgdG8gWyVkXSBibG9jayIsIGluZGV4KTsNCisgICAgICAgIHJldCA9IHdyaXRlX2ZsYWdzX2luZm8oJm10ZF9pbmZvLCBpbmRleCwgcmVhbF93cml0ZV9jb250ZW50LCBtdGRfaW5mby5tdGRfYmxvY2tzaXplKTsNCisgICAgICAgIGlmIChyZXQgPT0gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyDQtLPJuaajrM3Ls/ajrLKiuPzQwrXa0ru/6c671sMNCisgICAgICAgICAgICBmbGFnc19sb2coImJhY2t1cCBmbGFncyBsb2NhdGlvbjogWyVkXS0+WyVkXSIsIGJhY2tfaW5kZXgsIGluZGV4KTsNCisgICAgICAgICAgICBiYWNrX2luZGV4ID0gaW5kZXg7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIGlmIChyZXQgPT0gQkFEX0JMT0NLKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vINP2tb27tb/po6zP8rrzzPjSu7/pDQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgZmxhZ3NfZXJyKCJ3cml0ZSBiYWNrdXAgZmxhZ3MgZmFpbCIpOw0KKyAgICAgICAgICAgIGJhY2tfaW5kZXggPSAtMTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBpZiAobWFpbl9pbmRleCA9PSAtMSAmJiBiYWNrX2luZGV4ID09IC0xKQ0KKyAgICB7DQorICAgICAgICBnb3RvIGVycm9yOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgcmV0ID0gMDsNCisgICAgICAgIGdvdG8gZW5kOw0KKyAgICB9DQorDQorZXJyb3I6DQorICAgIHJldCA9IC0xOw0KKw0KK2VuZDoNCisgICAgY2xvc2UoZmRfZHN0KTsNCisJDQorCWlmKE5VTEwgIT0gcmVhbF93cml0ZV9jb250ZW50KQ0KKwl7DQorCQlmcmVlKHJlYWxfd3JpdGVfY29udGVudCk7DQorCQlyZWFsX3dyaXRlX2NvbnRlbnQgPSBOVUxMOw0KKwl9DQorCQ0KKyAgICByZXR1cm4gcmV0Ow0KK30NCisNCisNCitzdGF0aWMgdm9pZCBjb3B5X2ZsYWdzX2luZm8oVF9GTEFHU19JTkZPICpkc3QsIFRfRkxBR1NfSU5GTyAqc3JjKQ0KK3sNCisJbWVtY3B5KGRzdCwgc3JjLCBzaXplb2YoVF9GTEFHU19JTkZPKSk7DQorDQorCXJldHVybjsNCit9DQorDQorDQorc3RhdGljIGludCBnZXRfY3VycmVudF9zeXN0ZW0oKQ0KK3sNCisgICAgY2hhciBidWZbMTAyNF0gPSB7MH07DQorDQorICAgIGNoYXIgKnBhcmEgPSBOVUxMOw0KKyAgICBpbnQgbWF0Y2hlcyA9IDA7DQorDQorICAgIEZJTEUgKmZkX2NtZCA9IE5VTEw7DQorICAgIGNoYXIgKmxpbmVfc3RyID0gTlVMTDsNCisNCisgICAgaW50IGN1cnJlbnRfc3lzdGVtID0gLTE7DQorDQorDQorICAgIGZkX2NtZCA9IGZvcGVuKEZJTEVfUEFUSF9QUk9DX0NNRExJTkUsICJyIik7DQorICAgIGlmICghZmRfY21kKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoIk9wZW4gZmlsZSAlcyBlcnJvciwgZXJyb3I6JXMiLCBGSUxFX1BBVEhfUFJPQ19DTURMSU5FLCBzdHJlcnJvcihlcnJubykpOw0KKyAgICAgICAgcmV0dXJuIFNZU1RFTV9JTkRFWF9VTktOT1dOOw0KKyAgICB9DQorDQorICAgIHdoaWxlICghZmVvZihmZF9jbWQpKQ0KKyAgICB7DQorICAgICAgICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7DQorICAgICAgICBsaW5lX3N0ciA9IGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZkX2NtZCk7DQorDQorICAgICAgICBpZiAoTlVMTCA9PSBsaW5lX3N0cikNCisgICAgICAgIHsNCisgICAgICAgICAgICBwcmludGYoImdldCBpbmZvIGZyb20gL3Byb2MvY21kbGluZSBlcnJvcjolcyIsIHN0cmVycm9yKGVycm5vKSk7DQorICAgICAgICAgICAgZ290byBlbmQ7DQorICAgICAgICB9DQorDQorICAgICAgICBwcmludGYoImJ1ZmY6JXMiLCBidWYpOw0KKw0KKyAgICAgICAgcGFyYSA9IHN0cnRvayhidWYsICIgIik7DQorICAgICAgICB3aGlsZSAocGFyYSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBwcmludGYoInBhcmE6JXMiLCBwYXJhKTsNCisgICAgICAgICAgICBpZiAoc3RybmNtcChwYXJhLCBQUk9DX0NNRExJTkVfU1lTVEVNX0FfRkxBRywgc3RybGVuKFBST0NfQ01ETElORV9TWVNURU1fQV9GTEFHKSkgPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGN1cnJlbnRfc3lzdGVtID0gU1lTVEVNX0lOREVYXzE7DQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKHBhcmEsIFBST0NfQ01ETElORV9TWVNURU1fQl9GTEFHLCBzdHJsZW4oUFJPQ19DTURMSU5FX1NZU1RFTV9CX0ZMQUcpKSA9PSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgY3VycmVudF9zeXN0ZW0gPSBTWVNURU1fSU5ERVhfMjsNCisgICAgICAgICAgICAgICAgZ290byBlbmQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vOg0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwYXJhID0gc3RydG9rKE5VTEwsICIgIik7DQorICAgICAgICB9DQorICAgIH0NCisNCitlbmQ6DQorICAgIGlmIChmZF9jbWQpDQorICAgIHsNCisgICAgICAgIGZjbG9zZShmZF9jbWQpOw0KKyAgICB9DQorCQ0KKyAgICByZXR1cm4gY3VycmVudF9zeXN0ZW07DQorfQ0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogCQkJCQkgR2xvYmFsIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucwkJCQkJCSAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK2ludCBmbGFnc19pbml0KCkNCit7DQorCVRfRkxBR1NfSU5GTyBmbGFnc19pbmZvID0gezB9Ow0KKwlpbnQgbWFpbl9pbmRleCA9IDA7DQorCWludCBiYWNrX2luZGV4ID0gMTsNCisJaW50IHJldCA9IC0xOw0KKwlpbnQgZmRfZHN0ID0gLTE7DQorCWNoYXIgbXRkX3BhdGhbTUFYX1BBVEhfTEVOXSA9IHswfTsNCisJc3RydWN0IG10ZF9pbmZvX3VzZXIgbWVtaW5mbyA9IHswfTsNCisJcGFydGl0aW9uX210ZF9pbmZvX3QgbXRkX2luZm8gPSB7MH07DQorDQorCXVuc2lnbmVkIGNoYXIgKnJlYWxfd3JpdGVfY29udGVudCA9IE5VTEw7DQorCVRfRkxBR1NfSU5GTyAqcF93cml0ZSA9IE5VTEw7DQorDQorCWludCBpbmRleCAgPSAwOw0KKwlpbnQgYmxvY2tfbnVtID0gMDsNCisJaW50IGFscmVhZHlfd3JpdGUgPSAwOw0KKwkNCisJdW5zaWduZWQgaW50IGNyY18zMiA9IDA7DQorCXVuc2lnbmVkIGludCBjcmNfMzJfMSA9IDA7DQorDQorICAgIGZsYWdzX2luZm8ubWFnaWNfc3RhcnQgPSBGTEFHU19NQUdJQzsNCisJDQorICAgIGZsYWdzX2luZm8uYm9vdF9mb3RhX2ZsYWcuYm9vdF90byA9IERVQUxfU1lTVEVNOw0KKyAgICBmbGFnc19pbmZvLmJvb3RfZm90YV9mbGFnLmZvdGFfc3RhdHVzID0gMDsNCisgICAgZmxhZ3NfaW5mby5ib290X2ZvdGFfZmxhZy5zeXN0ZW0uc3RhdHVzID0gRFVBTFNZU1RFTV9TVEFUVVNfQk9PVEFCTEU7DQorICAgIGZsYWdzX2luZm8uYm9vdF9mb3RhX2ZsYWcuc3lzdGVtLnRyeV9jbnQgPSAwOw0KKyAgICBmbGFnc19pbmZvLmJvb3RfZm90YV9mbGFnLnN5c3RlbTIuc3RhdHVzID0gRFVBTFNZU1RFTV9TVEFUVVNfQk9PVEFCTEU7DQorICAgIGZsYWdzX2luZm8uYm9vdF9mb3RhX2ZsYWcuc3lzdGVtMi50cnlfY250ID0gMDsNCisNCisgICAgZmxhZ3NfaW5mby5ib290X2Vudi5kdWFsc3lzX3R5cGUgPSBEVUFMU1lTVEVNX0FCOw0KKw0KKwlmbGFnc19pbmZvLnViaWZzX3N0YXR1cy5mc19zdGF0dXMgPSAwOw0KKwkNCisgICAgZmxhZ3NfaW5mby5tYWdpY19lbmQgPSBGTEFHU19NQUdJQzsNCisNCisJY3JjMzJpbml0X2xlKCk7DQorCWNyY18zMiA9IGNyYzMyX2xlKDAsICh1bnNpZ25lZCBjaGFyIGNvbnN0ICopKCZmbGFnc19pbmZvKSwgNTEyKTsNCisJZmxhZ3NfbG9nKCJpbml0IGNyY18zMj0ldSIsIGNyY18zMik7DQorDQorCWZsYWdzX2luZm8uY3JjMzIgPSBjcmNfMzI7DQorCQ0KKwljcmMzMmluaXRfbGUoKTsNCisJY3JjXzMyXzEgPSBjcmMzMl9sZSgwLCAodW5zaWduZWQgY2hhciBjb25zdCAqKSgmZmxhZ3NfaW5mbyksIHNpemVvZihmbGFnc19pbmZvKSk7DQorCWZsYWdzX2xvZygiaW5pdCBjcmNfMzJfMT0ldSIsIGNyY18zMl8xKTsNCisNCisJZmxhZ3NfaW5mby5jcmMzMl8xID0gY3JjXzMyXzE7DQorDQorCXJldCA9IG10ZF9nZXQoUEFSVElUSU9OX05BTUVfRkxBR1MsIERFVklDRV9NVEQsIG10ZF9wYXRoLCBNQVhfUEFUSF9MRU4pOw0KKwlpZiAocmV0IDwgMCkNCisJew0KKwkJZmxhZ3NfZXJyKCJwYXJ0aXRpb24gWyVzXSBub3QgZm91bmQiLCBQQVJUSVRJT05fTkFNRV9GTEFHUyk7DQorCQkNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlpZiAoKGZkX2RzdCA9IG9wZW4obXRkX3BhdGgsIE9fUkRXUiB8IE9fU1lOQykpIDwgMCkNCisJew0KKwkJZmxhZ3NfZXJyKCJvcGVuIGZsYXNoIGVycm9yLCBlcnJubz0lZCwgc3RyZXJyb3I9WyVzXSIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KKwkJDQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisJaWYgKGlvY3RsKGZkX2RzdCwgTUVNR0VUSU5GTywgJm1lbWluZm8pICE9IDApDQorCXsNCisJCWZsYWdzX2VycigiZ2V0IGZsYXNoIGluZm8gZXJyb3IsIGVycm5vPSVkLCBzdHJlcnJvcj1bJXNdIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorCQkNCisJCWdvdG8gZXJyb3I7DQorCX0NCisNCisJbXRkX2luZm8ucGFydGlfZmlsZV9kZXNjIAk9IGZkX2RzdDsNCisJbXRkX2luZm8ubXRkX2Jsb2Nrc2l6ZQkJPSBtZW1pbmZvLmVyYXNlc2l6ZTsNCisJbXRkX2luZm8ubXRkX29vYnNpemUJCT0gbWVtaW5mby5vb2JzaXplOw0KKwltdGRfaW5mby5tdGRfcGFnZXBlcmJsb2NrCT0gbWVtaW5mby5lcmFzZXNpemUgLyBtZW1pbmZvLndyaXRlc2l6ZTsNCisJbXRkX2luZm8ubXRkX3BhZ2VzaXplCQk9IG1lbWluZm8ud3JpdGVzaXplOw0KKwltdGRfaW5mby5tdGRfdG90YWxzaXplCQk9IG1lbWluZm8uc2l6ZTsNCisNCisJYmxvY2tfbnVtID0gbXRkX2luZm8ubXRkX3RvdGFsc2l6ZSAvIG10ZF9pbmZvLm10ZF9ibG9ja3NpemU7DQorDQorCXJlYWxfd3JpdGVfY29udGVudCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKG10ZF9pbmZvLm10ZF9ibG9ja3NpemUpOw0KKwlpZiAoTlVMTCA9PSByZWFsX3dyaXRlX2NvbnRlbnQpDQorCXsNCisJCWZsYWdzX2VycigibWFsbG9jIGZvciBibG9jayBmYWlsIik7DQorCQkNCisJCWdvdG8gZXJyb3I7DQorCX0NCisNCisJbWVtc2V0KHJlYWxfd3JpdGVfY29udGVudCwgMHhGRiwgbXRkX2luZm8ubXRkX2Jsb2Nrc2l6ZSk7DQorCW1lbWNweShyZWFsX3dyaXRlX2NvbnRlbnQsIChjaGFyICopKCZmbGFnc19pbmZvKSwgc2l6ZW9mKFRfRkxBR1NfSU5GTykpOw0KKw0KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBibG9ja19udW07IGluZGV4KyspDQorCXsNCisJCWlmIChhbHJlYWR5X3dyaXRlID49IEZMQUdTX0lOSVRfVkFMSURfQkxPQ0tTX05VTSkNCisJCXsNCisJCQlicmVhazsNCisJCX0NCisNCisJCXJldCA9IHdyaXRlX2ZsYWdzX2luZm8oJm10ZF9pbmZvLCBpbmRleCwgcmVhbF93cml0ZV9jb250ZW50LCBtdGRfaW5mby5tdGRfYmxvY2tzaXplKTsNCisJCWlmIChyZXQgPT0gMCkNCisJCXsNCisJCQlhbHJlYWR5X3dyaXRlKys7DQorCQkJZmxhZ3NfbG9nKCJ3cml0ZSBpbml0IHZhbGlkIGJsb2NrIG51bTogJWQiLCBhbHJlYWR5X3dyaXRlKTsNCisJCQkNCisJCQljb250aW51ZTsNCisJCX0NCisJCWVsc2UgaWYgKEJBRF9CTE9DSyA9PSByZXQpDQorCQl7DQorCQkJY29udGludWU7DQorCQl9DQorCX0NCisNCisJaWYgKGFscmVhZHlfd3JpdGUgPj0gMikNCisJew0KKwkJZmxhZ3NfbG9nKCJpbml0IHN5c3RlbSBzdGF0dXMgc3VjY2VzcywgYWxyZWFkIHdyaXRlIGJsb2NrOiAlZCIsIGFscmVhZHlfd3JpdGUpOw0KKwkJcmV0ID0gMDsNCisJfQ0KKwllbHNlDQorCXsNCisJCWZsYWdzX2xvZygiaW5pdCBzeXN0ZW0gc3RhdHVzIGZhaWwsIGFscmVhZCB3cml0ZSBibG9jazogJWQiLCBhbHJlYWR5X3dyaXRlKTsNCisJCXJldCA9IC0xOw0KKwl9DQorDQorCWdvdG8gZW5kOw0KKw0KK2Vycm9yOg0KKwlyZXQgPSAtMTsNCisNCitlbmQ6DQorCWNsb3NlKGZkX2RzdCk7DQorCQ0KKwlpZihOVUxMICE9IHJlYWxfd3JpdGVfY29udGVudCkNCisJew0KKwkJZnJlZShyZWFsX3dyaXRlX2NvbnRlbnQpOw0KKwkJcmVhbF93cml0ZV9jb250ZW50ID0gTlVMTDsNCisJfQ0KKwkNCisJcmV0dXJuIHJldDsNCit9DQorDQorDQoraW50IGZsYWdzX2dldChUX0ZMQUdTX0lORk8gKnBfZmxhZ3NfaW5mbykNCit7DQorICAgIFRfRkxBR1NfSU5GTyBtYWluX2ZsYWcgPSB7MH07DQorICAgIFRfRkxBR1NfSU5GTyBiYWNrdXBfZmxhZyA9IHswfTsNCisJVF9GTEFHU19JTkZPIHBfZmxhZ3NfaW5mb190bXAgPSB7MH07DQorCWNoYXIgZGVsdGFfRltJTUdfTkFNRV9MRU5dID0gezB9Ow0KKw0KKyAgICBpbnQgbWFpbl9pbmRleCA9IDA7DQorICAgIGludCBiYWNrdXBfaW5kZXggPSAxOw0KKw0KKwl1bnNpZ25lZCBpbnQgY3JjMzJfbWFpbiA9IDA7DQorCXVuc2lnbmVkIGludCBjcmMzMl9iYWNrdXAgPSAwOw0KKwkNCisJdW5zaWduZWQgaW50IGNyYzMyX2xlX21haW4gPSAwOw0KKwl1bnNpZ25lZCBpbnQgY3JjMzJfbGVfYmFja3VwID0gMDsNCisNCisJaWYgKE5VTEwgPT0gcF9mbGFnc19pbmZvKQ0KKwl7DQorCQlmbGFnc19lcnIoImludmFsaWQgcGFyYW0gTlVMTCIpOw0KKwkJDQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisgICAgaWYgKGdldF9mbGFnc19pbmZvKCZtYWluX2ZsYWcsICZtYWluX2luZGV4LCAmYmFja3VwX2ZsYWcsICZiYWNrdXBfaW5kZXgpICE9IDApDQorICAgIHsNCisgICAgCWZsYWdzX2VycigiZ2V0IGZsYWdzIGluZm8gZmFpbCIpOw0KKwkJDQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisJDQorCWZsYWdzX2xvZygibWFpbl9mbGFnIGNyYzMyPSV1LCBjcmMzMl8xPSV1IiwgbWFpbl9mbGFnLmNyYzMyLCBtYWluX2ZsYWcuY3JjMzJfMSk7DQorCWZsYWdzX2xvZygiYmFja3VwX2ZsYWcgY3JjMzI9JXUsIGNyYzMyXzE9JXUiLCBiYWNrdXBfZmxhZy5jcmMzMiwgYmFja3VwX2ZsYWcuY3JjMzJfMSk7DQorDQorCW1lbXNldChkZWx0YV9GLCAweEZGLCBJTUdfTkFNRV9MRU4pOw0KKw0KKwlpZiAoKDAgPT0gbWVtY21wKG1haW5fZmxhZy5pbWdfc2l6ZVswXS5uYW1lLCBkZWx0YV9GLCBJTUdfTkFNRV9MRU4pKSAmJiAoMCA9PSBtZW1jbXAoYmFja3VwX2ZsYWcuaW1nX3NpemVbMF0ubmFtZSwgZGVsdGFfRiwgSU1HX05BTUVfTEVOKSkpDQorCXsNCisJCW1lbWNweSgmcF9mbGFnc19pbmZvX3RtcCwgJm1haW5fZmxhZywgc2l6ZW9mKFRfRkxBR1NfSU5GTykpOw0KKwkJbWVtc2V0KHBfZmxhZ3NfaW5mb190bXAuaW1nX3NpemVbMF0ubmFtZSwgMCwgc2l6ZW9mKFRfRkxBR1NfSU5GTyktNTEyKTsNCisNCisJCWNyYzMyaW5pdF9sZSgpOw0KKwkJcF9mbGFnc19pbmZvX3RtcC5jcmMzMl8xID0gY3JjMzJfbGUoMCwgKHVuc2lnbmVkIGNoYXIgY29uc3QgKikoJnBfZmxhZ3NfaW5mb190bXApLCBzaXplb2YoVF9GTEFHU19JTkZPKSk7DQorCQlmbGFnc19sb2coImZpeCBvbGQsIHNldCBjcmMzMl8xPSV1IiwgcF9mbGFnc19pbmZvX3RtcC5jcmMzMl8xKTsNCisJCQ0KKwkJaWYgKHNldF9mbGFnc19pbmZvKCZwX2ZsYWdzX2luZm9fdG1wLCAmbWFpbl9pbmRleCwgJmJhY2t1cF9pbmRleCkgIT0gMCkNCisJCXsNCisJCQlmbGFnc19lcnIoImZpeCBvbGQsIHNldCBmbGFncyBpbmZvIGZhaWwiKTsNCisJCQlyZXR1cm4gLTE7DQorCQl9DQorCQkNCisJCWNvcHlfZmxhZ3NfaW5mbyhwX2ZsYWdzX2luZm8sICZtYWluX2ZsYWcpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisNCisJY3JjMzJfbWFpbiA9IG1haW5fZmxhZy5jcmMzMl8xOw0KKwljcmMzMl9iYWNrdXAgPSBiYWNrdXBfZmxhZy5jcmMzMl8xOw0KKw0KKwltYWluX2ZsYWcuY3JjMzJfMSA9IDA7DQorCWJhY2t1cF9mbGFnLmNyYzMyXzEgPSAwOw0KKwkNCisJY3JjMzJpbml0X2xlKCk7DQorCQ0KKwljcmMzMl9sZV9tYWluID0gY3JjMzJfbGUoMCwgKHVuc2lnbmVkIGNoYXIgY29uc3QgKikoJm1haW5fZmxhZyksIHNpemVvZihtYWluX2ZsYWcpKTsNCisJZmxhZ3NfbG9nKCJjcmMzMl9sZV9tYWluIGNyYzMyPSV1IiwgY3JjMzJfbGVfbWFpbik7DQorCQ0KKwljcmMzMl9sZV9iYWNrdXAgPSBjcmMzMl9sZSgwLCAodW5zaWduZWQgY2hhciBjb25zdCAqKSgmYmFja3VwX2ZsYWcpLCBzaXplb2YoYmFja3VwX2ZsYWcpKTsNCisJZmxhZ3NfbG9nKCJjcmMzMl9sZV9iYWNrdXAgY3JjMzI9JXUiLCBjcmMzMl9sZV9iYWNrdXApOw0KKw0KKyAgICBpZiAoY3JjMzJfbWFpbiA9PSBjcmMzMl9sZV9tYWluKQ0KKyAgICB7DQorICAgICAgICBjb3B5X2ZsYWdzX2luZm8ocF9mbGFnc19pbmZvLCAmbWFpbl9mbGFnKTsNCisJCQ0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisJDQorICAgIGlmIChjcmMzMl9iYWNrdXAgPT0gY3JjMzJfbGVfYmFja3VwKQ0KKyAgICB7DQorICAgICAgICBjb3B5X2ZsYWdzX2luZm8ocF9mbGFnc19pbmZvLCAmYmFja3VwX2ZsYWcpOw0KKwkJDQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBmbGFnc19lcnIoImRvIG5vdCBmaW5kIHZhbGlkIGZsYWdzIGluZm8iKTsNCisJDQorICAgIHJldHVybiAtMTsNCit9DQorDQorDQoraW50IGZsYWdzX3NldChUX0ZMQUdTX0lORk8gKnBfZmxhZ3NfaW5mbykNCit7DQorCVRfRkxBR1NfSU5GTyBtYWluX2ZsYWcgPSB7MH07DQorICAgIFRfRkxBR1NfSU5GTyBiYWNrdXBfZmxhZyA9IHswfTsNCisgICAgaW50IG1haW5faW5kZXggPSAwOw0KKyAgICBpbnQgYmFja3VwX2luZGV4ID0gMTsNCisJDQorCWlmIChOVUxMID09IHBfZmxhZ3NfaW5mbykNCisJew0KKwkJZmxhZ3NfZXJyKCJpbnZhbGlkIHBhcmFtIE5VTEwiKTsNCisJCQ0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCWlmICgoRkxBR1NfTUFHSUMgIT0gcF9mbGFnc19pbmZvLT5tYWdpY19zdGFydCkgfHwgKEZMQUdTX01BR0lDICE9IHBfZmxhZ3NfaW5mby0+bWFnaWNfZW5kKSkNCisJew0KKwkJZmxhZ3NfZXJyKCJpbnZhbGlkIG1hZ2ljIik7DQorCQkNCisJCXJldHVybiAtMTsNCisJfQ0KKwkNCisgICAgaWYgKGdldF9mbGFnc19pbmZvKCZtYWluX2ZsYWcsICZtYWluX2luZGV4LCAmYmFja3VwX2ZsYWcsICZiYWNrdXBfaW5kZXgpICE9IDApDQorICAgIHsNCisgICAgCWZsYWdzX2VycigiZ2V0IGZsYWdzIGluZm8gZmFpbCIpOw0KKwkJDQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisJY3JjMzJpbml0X2xlKCk7DQorCXBfZmxhZ3NfaW5mby0+Y3JjMzIgPSAwOw0KKwlwX2ZsYWdzX2luZm8tPmNyYzMyID0gY3JjMzJfbGUoMCwgKHVuc2lnbmVkIGNoYXIgY29uc3QgKilwX2ZsYWdzX2luZm8sIDUxMik7DQorCWZsYWdzX2xvZygic2V0IGNyYzMyPSV1IiwgcF9mbGFnc19pbmZvLT5jcmMzMik7DQorCQ0KKwljcmMzMmluaXRfbGUoKTsNCisJcF9mbGFnc19pbmZvLT5jcmMzMl8xID0gMDsNCisJcF9mbGFnc19pbmZvLT5jcmMzMl8xID0gY3JjMzJfbGUoMCwgKHVuc2lnbmVkIGNoYXIgY29uc3QgKilwX2ZsYWdzX2luZm8sIHNpemVvZihUX0ZMQUdTX0lORk8pKTsNCisJZmxhZ3NfbG9nKCJzZXQgY3JjMzJfMT0ldSIsIHBfZmxhZ3NfaW5mby0+Y3JjMzJfMSk7DQorDQorICAgIGlmIChzZXRfZmxhZ3NfaW5mbyhwX2ZsYWdzX2luZm8sICZtYWluX2luZGV4LCAmYmFja3VwX2luZGV4KSAhPSAwKQ0KKyAgICB7DQorICAgICAgICBmbGFnc19lcnIoInNldCB1YmlmcyBzdGF0dXMgZmFpbCIpOw0KKwkJDQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KKw0KK2ludCBmbGFnc19nZXRfdWJpZnNfc3RhdHVzKFRfVUJJRlNfU1RBVFVTICpwX3ViaWZzX3N0YXR1cykNCit7DQorCVRfRkxBR1NfSU5GTyBwX2ZsYWdzX2luZm8gPSB7MH07DQorCQ0KKwlpZiAoTlVMTCA9PSBwX3ViaWZzX3N0YXR1cykNCisJew0KKwkJZmxhZ3NfZXJyKCJpbnZhbGlkIHBhcmFtIE5VTEwiKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlpZiAoMCA9PSBmbGFnc19nZXQoJnBfZmxhZ3NfaW5mbykpDQorCXsNCisJCXBfdWJpZnNfc3RhdHVzLT5mc19zdGF0dXMgPSBwX2ZsYWdzX2luZm8udWJpZnNfc3RhdHVzLmZzX3N0YXR1czsNCisJCXN0cm5jcHkocF91Ymlmc19zdGF0dXMtPmZzX210ZF9uYW1lLCBwX2ZsYWdzX2luZm8udWJpZnNfc3RhdHVzLmZzX210ZF9uYW1lLCBzaXplb2YocF91Ymlmc19zdGF0dXMtPmZzX210ZF9uYW1lKSk7DQorCQlzdHJuY3B5KHBfdWJpZnNfc3RhdHVzLT5mc191Ymlfdm9sX25hbWUsIHBfZmxhZ3NfaW5mby51Ymlmc19zdGF0dXMuZnNfdWJpX3ZvbF9uYW1lLCBzaXplb2YocF91Ymlmc19zdGF0dXMtPmZzX3ViaV92b2xfbmFtZSkpOw0KKwkJDQorCQlyZXR1cm4gMDsNCisJfQ0KKwllbHNlDQorCXsNCisJICAgIGZsYWdzX2VycigiZG8gbm90IGZpbmQgdmFsaWQgZmxhZ3MgaW5mbyIpOw0KKwkgICAgcmV0dXJuIC0xOw0KKwl9DQorfQ0KKw0KKw0KK2ludCBmbGFnc19zZXRfdWJpZnNfc3RhdHVzKFRfVUJJRlNfU1RBVFVTICpwX3ViaWZzX3N0YXR1cykNCit7DQorCVRfRkxBR1NfSU5GTyBwX2ZsYWdzX2luZm8gPSB7MH07DQorCQ0KKwlpZiAoTlVMTCA9PSBwX3ViaWZzX3N0YXR1cykNCisJew0KKwkJZmxhZ3NfZXJyKCJpbnZhbGlkIHBhcmFtIE5VTEwiKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlpZiAoMCAhPSBmbGFnc19nZXQoJnBfZmxhZ3NfaW5mbykpDQorCXsNCisJCWZsYWdzX2VycigiZ2V0IHViaWZzIHN0YXR1cyBpbnZhbGlkIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisJDQorCW1lbWNweSgmKHBfZmxhZ3NfaW5mby51Ymlmc19zdGF0dXMpLCBwX3ViaWZzX3N0YXR1cywgc2l6ZW9mKFRfVUJJRlNfU1RBVFVTKSk7DQorDQorCWlmICgwICE9IGZsYWdzX3NldCgmcF9mbGFnc19pbmZvKSkNCisJew0KKwkJZmxhZ3NfZXJyKCJzZXQgdWJpZnMgc3RhdHVzIGZhaWwiKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwkNCisgICAgcmV0dXJuIDA7DQorfQ0KKw0KKw0KK3Vuc2lnbmVkIGludCBmbGFnc19nZXRfbnZyb2ZsYWcodm9pZCkNCit7DQorCVRfRkxBR1NfSU5GTyB0X2ZsYWcgPSB7MH07DQorDQorCWlmIChmbGFnc19nZXQoJnRfZmxhZykgIT0gMCkNCisJCXJldHVybiBOVlJPX0lOVkFMSUQ7DQorCXJldHVybiB0X2ZsYWcubnZyb19mbGFnOw0KK30NCisNCisNCitpbnQgZmxhZ3Nfc2V0X252cm9mbGFnKHVuc2lnbmVkIGludCBmbGFnKQ0KK3sNCisJVF9GTEFHU19JTkZPIHRfZmxhZyA9IHswfTsNCisNCisJaWYgKGZsYWdzX2dldCgmdF9mbGFnKSAhPSAwKQ0KKwkJcmV0dXJuIC0xOw0KKwlpZiAodF9mbGFnLm52cm9fZmxhZyA9PSBmbGFnKQ0KKwkJcmV0dXJuIDA7DQorCWlmIChmbGFnID09IE5WUk9fUkVTVE9SSU5HKQ0KKwl7DQorCQlpZiAodF9mbGFnLm52cm9fZmxhZyAhPSBOVlJPX0JBQ0tFRF9VUCkNCisJCXsNCisJCQlwcmludGYoIltlcnJvcl1mbGFncyBudnJvIG9ubHkgTlZST19CQUNLRURfVVAgc3dpdGNoIHRvIE5WUk9fUkVTVE9SSU5HXG4iKTsNCisJCQlyZXR1cm4gLTE7DQorCQl9DQorCX0NCisJdF9mbGFnLm52cm9fZmxhZyA9IGZsYWc7DQorDQorCXJldHVybiBmbGFnc19zZXQoJnRfZmxhZyk7DQorfQ0KKw0KKw0KK2ludCBmbGFnc19nZXRfY3VycmVudF9zeXN0ZW0oKQ0KK3sNCisgICAgaW50IGN1cnJlbnQgPSBnZXRfY3VycmVudF9zeXN0ZW0oKTsNCisJDQorICAgIGlmIChjdXJyZW50ID09IDEpDQorICAgIHsNCisgICAgICAgIHJldHVybiBEVUFMX1NZU1RFTTsNCisgICAgfQ0KKyAgICBlbHNlIGlmIChjdXJyZW50ID09IDIpDQorICAgIHsNCisgICAgICAgIHJldHVybiBEVUFMX1NZU1RFTTI7DQorICAgIH0NCisNCisgICAgcmV0dXJuIC0xOw0KK30NCisNCisNCisvKiC0y0FQSb3208PT2rX3suKjrNX9yr20+sLrsru/ycq508MgKi8NCitpbnQgZmxhZ3NfZ2V0X25vY3JjKFRfRkxBR1NfSU5GTyAqcF9mbGFnc19pbmZvKQ0KK3sNCisgICAgVF9GTEFHU19JTkZPIG1haW5fZmxhZyA9IHswfTsNCisgICAgVF9GTEFHU19JTkZPIGJhY2t1cF9mbGFnID0gezB9Ow0KKyAgICBpbnQgbWFpbl9pbmRleCA9IDA7DQorICAgIGludCBiYWNrdXBfaW5kZXggPSAxOw0KKw0KKwlpZiAoTlVMTCA9PSBwX2ZsYWdzX2luZm8pDQorCXsNCisJCWZsYWdzX2VycigiaW52YWxpZCBwYXJhbSBOVUxMIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisgICAgaWYgKGdldF9mbGFnc19pbmZvKCZtYWluX2ZsYWcsICZtYWluX2luZGV4LCAmYmFja3VwX2ZsYWcsICZiYWNrdXBfaW5kZXgpICE9IDApDQorICAgIHsNCisgICAgCWZsYWdzX2VycigiZ2V0IGZsYWdzIGluZm8gZmFpbCIpOw0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorCQ0KKwlpZiAoMCAhPSBtZW1jbXAoJm1haW5fZmxhZywgJmJhY2t1cF9mbGFnLCBzaXplb2YoVF9GTEFHU19JTkZPKSkpDQorCXsNCisJICAgIGZsYWdzX2VycigibWFpbiBmbGFnIGFuZCBiYWNrdXAgZmxhZyBhcmUgZGlmZmVyZW50Iik7DQorICAgICAgICByZXR1cm4gLTE7DQorCX0NCisJDQorCWNvcHlfZmxhZ3NfaW5mbyhwX2ZsYWdzX2luZm8sICZtYWluX2ZsYWcpOw0KKwlwX2ZsYWdzX2luZm8tPmNyYzMyID0gbWFpbl9mbGFnLmNyYzMyOw0KKw0KKyAgICByZXR1cm4gMDsNCit9DQorDQorDQorLyogtMtBUEm99tPD09q197Lio6zV/cq9tPrC67K7v8nKudPDICovDQoraW50IGZsYWdzX3NldF9ub2NyYyhUX0ZMQUdTX0lORk8gKnBfZmxhZ3NfaW5mbykNCit7DQorCVRfRkxBR1NfSU5GTyBtYWluX2ZsYWcgPSB7MH07DQorICAgIFRfRkxBR1NfSU5GTyBiYWNrdXBfZmxhZyA9IHswfTsNCisgICAgaW50IG1haW5faW5kZXggPSAwOw0KKyAgICBpbnQgYmFja3VwX2luZGV4ID0gMTsNCisJDQorCWlmIChOVUxMID09IHBfZmxhZ3NfaW5mbykNCisJew0KKwkJZmxhZ3NfZXJyKCJpbnZhbGlkIHBhcmFtIE5VTEwiKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlpZiAoKEZMQUdTX01BR0lDICE9IHBfZmxhZ3NfaW5mby0+bWFnaWNfc3RhcnQpIHx8IChGTEFHU19NQUdJQyAhPSBwX2ZsYWdzX2luZm8tPm1hZ2ljX2VuZCkpDQorCXsNCisJCWZsYWdzX2VycigiaW52YWxpZCBtYWdpYyIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorCQ0KKyAgICBpZiAoZ2V0X2ZsYWdzX2luZm8oJm1haW5fZmxhZywgJm1haW5faW5kZXgsICZiYWNrdXBfZmxhZywgJmJhY2t1cF9pbmRleCkgIT0gMCkNCisgICAgew0KKyAgICAJZmxhZ3NfZXJyKCJnZXQgZmxhZ3MgaW5mbyBmYWlsIik7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgaWYgKHNldF9mbGFnc19pbmZvKHBfZmxhZ3NfaW5mbywgJm1haW5faW5kZXgsICZiYWNrdXBfaW5kZXgpICE9IDApDQorICAgIHsNCisgICAgICAgIGZsYWdzX2Vycigic2V0IHViaWZzIHN0YXR1cyBmYWlsIik7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KKw0KK3ZvaWQgY3JjMzJpbml0X2xlKHZvaWQpDQorew0KKwljcmMzMmluaXRfbGVfZ2VuZXJpYyhDUkMzMl9QT0xZX0xFLCBjcmMzMnRhYmxlX2xlKTsNCit9DQorDQorDQordW5zaWduZWQgaW50IGNyYzMyX2xlKHVuc2lnbmVkIGludCBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsIHNpemVfdCBsZW4pDQorew0KKwlyZXR1cm4gY3JjMzJfbGVfZ2VuZXJpYyhjcmMsIHAsIGxlbiwgKGNvbnN0IHVuc2lnbmVkIGludCAoKilbMjU2XSljcmMzMnRhYmxlX2xlKTsNCit9DQorDQo=