ZGlmZiAtLWdpdCBhL2NwdS9pMzg2L3NjNTIwL3NjNTIwX3BjaS5jIGIvY3B1L2kzODYvc2M1MjAvc2M1MjBfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiODM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9pMzg2L3NjNTIwL3NjNTIwX3BjaS5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiA8ZGFuaWVsQG9taWNyb24uc2U+LgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIHN0dWZmIHNwZWNpZmljIGZvciB0aGUgc2M1MjAsIGJ1dCBpbmRlcGVuZGVudCBvZiBpbXBsZW1lbnRhdGlvbiAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8YXNtL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgorCitzdGF0aWMgc3RydWN0IHsKKwl1OCBwcmlvcml0eTsKKwl1MTYgbGV2ZWxfcmVnOworCXU4IGxldmVsX2JpdDsKK30gc2M1MjBfaXJxW10gPSB7CisJeyBTQzUyMF9JUlEwLCAgU0M1MjBfTVBJQ01PREUsICAweDAxIH0sCisJeyBTQzUyMF9JUlExLCAgU0M1MjBfTVBJQ01PREUsICAweDAyIH0sCisJeyBTQzUyMF9JUlEyLCAgU0M1MjBfU0wxUElDTU9ERSwgMHgwMiB9LAorCXsgU0M1MjBfSVJRMywgIFNDNTIwX01QSUNNT0RFLCAgMHgwOCB9LAorCXsgU0M1MjBfSVJRNCwgIFNDNTIwX01QSUNNT0RFLCAgMHgxMCB9LAorCXsgU0M1MjBfSVJRNSwgIFNDNTIwX01QSUNNT0RFLCAgMHgyMCB9LAorCXsgU0M1MjBfSVJRNiwgIFNDNTIwX01QSUNNT0RFLCAgMHg0MCB9LAorCXsgU0M1MjBfSVJRNywgIFNDNTIwX01QSUNNT0RFLCAgMHg4MCB9LAorCisJeyBTQzUyMF9JUlE4LCAgU0M1MjBfU0wxUElDTU9ERSwgMHgwMSB9LAorCXsgU0M1MjBfSVJROSwgIFNDNTIwX1NMMVBJQ01PREUsIDB4MDIgfSwKKwl7IFNDNTIwX0lSUTEwLCBTQzUyMF9TTDFQSUNNT0RFLCAweDA0IH0sCisJeyBTQzUyMF9JUlExMSwgU0M1MjBfU0wxUElDTU9ERSwgMHgwOCB9LAorCXsgU0M1MjBfSVJRMTIsIFNDNTIwX1NMMVBJQ01PREUsIDB4MTAgfSwKKwl7IFNDNTIwX0lSUTEzLCBTQzUyMF9TTDFQSUNNT0RFLCAweDIwIH0sCisJeyBTQzUyMF9JUlExNCwgU0M1MjBfU0wxUElDTU9ERSwgMHg0MCB9LAorCXsgU0M1MjBfSVJRMTUsIFNDNTIwX1NMMVBJQ01PREUsIDB4ODAgfQorfTsKKworCisvKiBUaGUgaW50ZXJydXB0IHVzZWQgZm9yIFBDSSBJTlRBLUlOVEQgICovCitpbnQgc2M1MjBfcGNpX2ludHNbMTVdID0geworCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEKK307CisKKy8qIHV0aWxpdHkgZnVuY3Rpb24gdG8gY29uZmlndXJlIGEgcGNpIGludGVycnVwdCAqLworaW50IHBjaV9zYzUyMF9zZXRfaXJxKGludCBwY2lfcGluLCBpbnQgaXJxKQoreworCWludCBpOworCisjIGlmIDEKKwlwcmludGYoInNldF9pcnEoKTogbWFwIElOVCVjIHRvIElSUSVkXG4iLCBwY2lfcGluICsgJ0EnLCBpcnEpOworI2VuZGlmCisJaWYgKGlycSA8IDAgfHwgaXJxID4gMTUpIHsKKwkJcmV0dXJuIC0xOyAvKiBpbGxlZ2FsIGlycSAqLworCX0KKworCWlmIChwY2lfcGluIDwgMCB8fCBwY2lfcGluID4gMTUpIHsKKwkJcmV0dXJuIC0xOyAvKiBpbGxlZ2FsIHBjaSBpbnQgcGluICovCisJfQorCisJLyogZmlyc3QgZGlzYWJsZSBhbnkgbm9uLXBjaSBpbnRlcnJ1cHQgc291cmNlIHRoYXQgdXNlCisJICogdGhpcyBsZXZlbCAqLworCWZvciAoaT1TQzUyMF9HUFRNUjBNQVA7aTw9U0M1MjBfR1AxMElNQVA7aSsrKSB7CisJCWlmIChpPj1TQzUyMF9QQ0lJTlRBTUFQJiZpPD1TQzUyMF9QQ0lJTlRETUFQKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocmVhZF9tbWNyX2J5dGUoaSkgPT0gc2M1MjBfaXJxW2lycV0ucHJpb3JpdHkpIHsKKwkJCXdyaXRlX21tY3JfYnl0ZShpLCBTQzUyMF9JUlFfRElTQUJMRUQpOworCQl9CisJfQorCisJLyogU2V0IHRoZSB0cmlnZ2VyIHRvIGxldmVsICovCisJd3JpdGVfbW1jcl9ieXRlKHNjNTIwX2lycVtpcnFdLmxldmVsX3JlZywKKwkJCXJlYWRfbW1jcl9ieXRlKHNjNTIwX2lycVtpcnFdLmxldmVsX3JlZykgfCBzYzUyMF9pcnFbaXJxXS5sZXZlbF9iaXQpOworCisKKwlpZiAocGNpX3BpbiA8IDQpIHsKKwkJLyogUENJIElOVEEtSU5URCAqLworCQkvKiByb3V0ZSB0aGUgaW50ZXJydXB0ICovCisJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRBTUFQICsgcGNpX3Bpbiwgc2M1MjBfaXJxW2lycV0ucHJpb3JpdHkpOworCisKKwl9IGVsc2UgeworCQkvKiBHUElSUTAtR1BJUlExMCB1c2VkIGZvciBhZGRpdGlvbmFsIFBDSSBJTlRTICovCisJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDBJTUFQICsgcGNpX3BpbiAtIDQsIHNjNTIwX2lycVtpcnFdLnByaW9yaXR5KTsKKworCQkvKiBhbHNvIHNldCB0aGUgcG9sYXJpdHkgaW4gdGhpcyBjYXNlICovCisJCXdyaXRlX21tY3Jfd29yZChTQzUyMF9JTlRQSU5QT0wsCisJCQkJcmVhZF9tbWNyX3dvcmQoU0M1MjBfSU5UUElOUE9MKSB8ICgxIDw8IChwY2lfcGluLTQpKSk7CisKKwl9CisKKwkvKiByZWdpc3RlciB0aGUgcGluICovCisJc2M1MjBfcGNpX2ludHNbcGNpX3Bpbl0gPSBpcnE7CisKKworCXJldHVybiAwOyAvKiBPSyAqLworfQorCit2b2lkIHBjaV9zYzUyMF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwlob3NlLT5maXJzdF9idXNubyA9IDA7CisJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7CisKKwkvKiBTeXN0ZW0gbWVtb3J5IHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCisJCSAgICAgICBTQzUyMF9QQ0lfTUVNT1JZX0JVUywKKwkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfUEhZUywKKwkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisJLyogUENJIG1lbW9yeSBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAxLAorCQkgICAgICAgU0M1MjBfUENJX01FTV9CVVMsCisJCSAgICAgICBTQzUyMF9QQ0lfTUVNX1BIWVMsCisJCSAgICAgICBTQzUyMF9QQ0lfTUVNX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkvKiBJU0EvUENJIG1lbW9yeSBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAorCQkgICAgICAgU0M1MjBfSVNBX01FTV9CVVMsCisJCSAgICAgICBTQzUyMF9JU0FfTUVNX1BIWVMsCisJCSAgICAgICBTQzUyMF9JU0FfTUVNX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkvKiBQQ0kgSS9PIHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDMsCisJCSAgICAgICBTQzUyMF9QQ0lfSU9fQlVTLAorCQkgICAgICAgU0M1MjBfUENJX0lPX1BIWVMsCisJCSAgICAgICBTQzUyMF9QQ0lfSU9fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJLyogSVNBL1BDSSBJL08gc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgNCwKKwkJICAgICAgIFNDNTIwX0lTQV9JT19CVVMsCisJCSAgICAgICBTQzUyMF9JU0FfSU9fUEhZUywKKwkJICAgICAgIFNDNTIwX0lTQV9JT19TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwlob3NlLT5yZWdpb25fY291bnQgPSA1OworCisJcGNpX3NldHVwX3R5cGUxKGhvc2UsCisJCQlTQzUyMF9SRUdfQUREUiwKKwkJCVNDNTIwX1JFR19EQVRBKTsKKworCXBjaV9yZWdpc3Rlcl9ob3NlKGhvc2UpOworCisJaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oaG9zZSk7CisKKwkvKiBlbmFibGUgdGFyZ2V0IG1lbW9yeSBhY2Nlc2VzIG9uIGhvc3QgYnJpZ2UgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoMCwgUENJX0NPTU1BTkQsCisJCQkgICAgICBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVIpOworCit9Cg==