ZGlmZiAtLWdpdCBhL2Jvb3QvY29tbW9uL3NyYy9sb2FkZXIvZHJpdmVycy9iYnQuYyBiL2Jvb3QvY29tbW9uL3NyYy9sb2FkZXIvZHJpdmVycy9iYnQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YzM0OTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9vdC9jb21tb24vc3JjL2xvYWRlci9kcml2ZXJzL2JidC5jCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDE2IFpYSUMgSW5jLgorICovCisgICAKKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGJidC5oPgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImZsYXNoLmgiCisKKworc3RhdGljIHVpbnQ4X3QgYmxvY2tfYmFkX3RhYmxlW0JCVF9TSVpFXT17MH07CisKKworc3RhdGljIHVpbnQ4X3QgYmJ0X3BhdHRlcm5bXSA9IHsnQicsICdiJywgJ3QnLCAnMCcgfTsKK3N0YXRpYyB1aW50OF90IG1pcnJvcl9wYXR0ZXJuW10gPSB7JzEnLCAndCcsICdiJywgJ0InIH07CisKK3N0YXRpYyBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgYmJ0X21haW5fZGVzY3IgPSB7CisJLm9mZnMgPQk0LAorCS5sZW4gPSA0LAorCS52ZXJvZmZzID0gMjAsCisJLm1heGJsb2NrcyA9IDE2LAorCS5wYXR0ZXJuID0gYmJ0X3BhdHRlcm4sCit9OworCitzdGF0aWMgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyIGJidF9taXJyb3JfZGVzY3IgPSB7CisJLm9mZnMgPQk0LAorCS5sZW4gPSA0LAorCS52ZXJvZmZzID0gMjAsCisJLm1heGJsb2NrcyA9IDE2LAorCS5wYXR0ZXJuID0gbWlycm9yX3BhdHRlcm4sCit9OworCitzdGF0aWMgaW50IG5hbmRfY2hlY2tfcGF0dGVybih1aW50OF90ICpidWYsc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCkKK3sKKwlpbnQgaTsKKwl1aW50OF90ICpwID0gYnVmOworCXAgKz0gdGQtPm9mZnM7CisKKwkvKiBDb21wYXJlIHRoZSBwYXR0ZXJuICovCisJZm9yIChpID0gMDsgaSA8IHRkLT5sZW47IGkrKykgCisgICAgeworCQlpZiAocFtpXSAhPSB0ZC0+cGF0dGVybltpXSkKKwkJCXJldHVybiAtMTsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmFuZF9jcmVhdF9yYW1fYmJ0KCB2b2lkICkKK3sKKwl1aW50MzJfdCBpID0gMDsKKwl1aW50MzJfdCBvZmYgPSAwOworCXVpbnQzMl90IG9vYl9zaXplID0gZmxhc2gub29iX3NpemU7CisJdWludDMyX3QgYmxvY2tfc2l6ZSA9IGZsYXNoLmJsb2NrX3NpemU7CisJdWludDhfdCBvb2JbMjU2XTsgICAvKiDV4sDvtqjS5dfutPO1xE9PQiBTSVpFICovCisjaWZkZWYgQ09ORklHX1pYMjk3NTIwVjNFX01ETF9BQgorCXVpbnQzMl90IGJsb2NrX251bXMgPSA3MjsKKyNlbHNlCisJdWludDMyX3QgYmxvY2tfbnVtcyA9IDE3OworI2VuZGlmCisKKwlmb3IoIGk9MDsgaTxibG9ja19udW1zOyBpKysgKQorCXsKKwkJZmxhc2gucmVhZF9vb2IoJm9vYlswXSwgb2ZmLCBvb2Jfc2l6ZSk7CisJCWlmKG9vYlswXSAhPSAweGZmKSAgICAgICAgICAgICAgICAgICAgICAvKiBiYWQgYmxvY2sgKi8KKwkJCWJsb2NrX2JhZF90YWJsZVtpXSA9IEJBRF9CTE9DSzsKKwkJZWxzZSAKKwkJCWJsb2NrX2JhZF90YWJsZVtpXSA9IDB4MDsKKworCQlvZmYgKz0gYmxvY2tfc2l6ZTsKKwl9Cit9CisKKworaW50IG5hbmRfc2VhcmNoX2JidChzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKnRkKQoreworCisJaW50ICBzdGFydGJsb2NrLCBibG9jazsKKwlpbnQgYmxvY2t0b3BhZ2UgPSBmbGFzaC5ibG9ja19zaXplX3NoaWZ0IC0gZmxhc2gucGFnZV9zaXplX3NoaWZ0OworCQorCXVpbnQ4X3Qgb29iX2J1ZmZlclsyNTZdPXsweEZGfTsKKyAgICB1aW50MzJfdCBvZmZzID0gMDsKKworCS8qIFNlYXJjaCBkaXJlY3Rpb24gZG93biAtPiB0b3AgKi8KKwkgc3RhcnRibG9jayA9IGZsYXNoLmJsb2NrX251bSAtMTsKKwkKKwl0ZC0+cGFnZT0gLTE7CisJLyogU2NhbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzICovCisJZm9yIChibG9jayA9IDA7IGJsb2NrIDwgdGQtPm1heGJsb2NrczsgYmxvY2srKykgCisgICAgeworCisJCWludCBhY3RibG9jayA9IHN0YXJ0YmxvY2sgLWJsb2NrOworCQlvZmZzID0gYWN0YmxvY2sgPDwgZmxhc2guYmxvY2tfc2l6ZV9zaGlmdDsKKworCQkvKiBSZWFkIGZpcnN0IHBhZ2UgKi8KKwkJZmxhc2gucmVhZF9vb2Iob29iX2J1ZmZlciwgb2ZmcywgZmxhc2gub29iX3NpemUpOworCQlpZiAoIW5hbmRfY2hlY2tfcGF0dGVybihvb2JfYnVmZmVyLHRkKSkgCisgICAgICAgIHsKKwkJCXRkLT5wYWdlID0gYWN0YmxvY2sgPDwgYmxvY2t0b3BhZ2U7CisJCQl0ZC0+dmVyc2lvbj0gb29iX2J1ZmZlclt0ZC0+dmVyb2Zmc107CisJCQkKKwkJCWJyZWFrOworCQl9CisJfQorCQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX2JidChzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgICp0ZCxpbnQgbnVtKQoreworCWludCBiaXRzPTI7CisJCisJaW50IHJlcywgaSwgaiwgYWN0ID0gMDsKKwlpbnQgdG90bGVuOworCWludCBmcm9tOworCXVpbnQ4X3QgbXNrID0gKHVpbnQ4X3QpICgoMSA8PCBiaXRzKSAtIDEpOworCXRvdGxlbiA9IChudW0gKiBiaXRzKSA+PiAzOworICAgIGZyb20gPSh0ZC0+cGFnZSk8PChmbGFzaC5wYWdlX3NpemVfc2hpZnQpOworCWNoYXIqIGJ1ZjsKKwkKKworCXJlcyA9IGZsYXNoLnJlYWRfcGFnZV9yYXcoQ0ZHX1RFTVBfQUREUiwgZnJvbSk7CisJaWYgKHJlcyA8IDApIAorICAgIHsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwlidWYgPShjaGFyKikgQ0ZHX1RFTVBfQUREUjsKKwkKKworCS8qIEFuYWx5c2UgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCB0b3RsZW47IGkrKykgCisgICAgeworCQl1aW50OF90IGRhdCA9IGJ1ZltpXTsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGogKz0gYml0cywgYWN0ICs9IDIpIAorICAgICAgICB7CisJCQl1aW50OF90IHRtcCA9IChkYXQgPj4gaikgJiBtc2s7CisJCQlpZiAodG1wID09IG1zaykKKwkJCXsKKwkJCSAgICBibG9ja19iYWRfdGFibGVbKGFjdCA+PiAxKV09IDBYMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlibG9ja19iYWRfdGFibGVbKGFjdCA+PiAxKV09IEJBRF9CTE9DSzsKKwkJCX0KKwkgICAgfSAgCisgICAgIH0KKwkKKwkgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIG5hbmRfaW5pdF9iYnRfZGVzY3Ioc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCwgCisgICAgICAgIAkJCQkJICAgIAkgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICptZCkKK3sKKwlzd2l0Y2goZmxhc2gubWFudWZfaWQpCisJeworCQljYXNlIE5BTkRfTUZSX1BBUkFHT046CisJCQlpZihmbGFzaC5kZXZpY2VfaWQgIT0gTkFORF9ERVZJRF9GREFOV0VJXzFHKQorCQkJeworCQkJCXRkLT5vZmZzID0gQkJUX0lORk9fT09CX09GRlNFVF9QQVJBR09OOworCQkJCW1kLT5vZmZzID0gQkJUX0lORk9fT09CX09GRlNFVF9QQVJBR09OOworCQkJCXRkLT52ZXJvZmZzID0gQkJUX0lORk9fT09CX1ZFUl9PRkZTRVRfUEFSQUdPTjsKKwkJCQltZC0+dmVyb2ZmcyA9IEJCVF9JTkZPX09PQl9WRVJfT0ZGU0VUX1BBUkFHT047CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBOQU5EX01GUl9IRVlBTkdURUs6CisJCQl0ZC0+b2ZmcyA9IEJCVF9JTkZPX09PQl9PRkZTRVRfSEVZQU5HVEVLOworCQkJbWQtPm9mZnMgPSBCQlRfSU5GT19PT0JfT0ZGU0VUX0hFWUFOR1RFSzsKKwkJCXRkLT52ZXJvZmZzID0gQkJUX0lORk9fT09CX1ZFUl9PRkZTRVRfSEVZQU5HVEVLOyAJCisJCQltZC0+dmVyb2ZmcyA9QkJUX0lORk9fT09CX1ZFUl9PRkZTRVRfSEVZQU5HVEVLOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IAorCQkJYnJlYWs7CisJfQorfQorCitpbnQgbmFuZF9jcmVhdF9iYnQoIHZvaWQgKQoreyAgCisgICAgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCA9ICZiYnRfbWFpbl9kZXNjcjsKKwlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKm1kID0gJmJidF9taXJyb3JfZGVzY3I7CisKKwluYW5kX2luaXRfYmJ0X2Rlc2NyKHRkLCBtZCk7CisJCisgICAgLy8gMi4wIHNlYXJjaCBtYWluIGJidAorCW5hbmRfc2VhcmNoX2JidCh0ZCk7CisJLy8gMi4xIHNlYXJjaCBtaXJyb3IgYmJ0CisJbmFuZF9zZWFyY2hfYmJ0KG1kKTsKKworCWlmKHRkLT5wYWdlPT0tMSYmbWQtPnBhZ2UgPT0tMSkKKwl7CisJCS8qIGlmIGZhaWxlZCBmb3VuZCBiYnQsIHdlIGNyZWF0ZSBhIHJhbSBiYnQgKi8KKwkJbmFuZF9jcmVhdF9yYW1fYmJ0KCk7CisJICAgIHJldHVybiAwOworCX0KKworCS8vIDMuMCByZWFkIGFuZCBhbmFseXplIGJidAorCWlmKHRkLT5wYWdlPT0tMSkKKwl7CisJCW5hbmRfcmVhZF9iYnQobWQsQkJUX1NJWkUpOwkKKwl9CisJZWxzZQorCXsKKwkJaWYobWQtPnBhZ2UgPT0gLTEpCisJCXsKKwkJCW5hbmRfcmVhZF9iYnQodGQsQkJUX1NJWkUpOwkKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKHRkLT52ZXJzaW9uID49IG1kLT52ZXJzaW9uKQorCQkJeworCQkJCW5hbmRfcmVhZF9iYnQodGQsQkJUX1NJWkUpOwkKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQluYW5kX3JlYWRfYmJ0KG1kLEJCVF9TSVpFKTsJCisJCQl9CisJCX0KKwl9CisJcHJpbnRmKCJiYnQgb2suXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgICAKKyAqIERlc2NyaXB0aW9uOiAKKyAqIFBhcmFtZXRlcnM6CisgKgkgSW5wdXQ6CisgKgorICoJIE91dHB1dDoKKyAqCisgKiBSZXR1cm5zOgorICoKKyAqCisgKiBPdGhlcnM6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBuYW5kX2Jsb2NrX2lzYmFkKHVpbnQzMl90IG9mZnNldCkKK3sKKyAgICB1aW50MzJfdCBibG9ja19vZmZzZXQgPSBvZmZzZXQgPj4gKGZsYXNoLmJsb2NrX3NpemVfc2hpZnQpOworICAgIHJldHVybiBibG9ja19iYWRfdGFibGVbYmxvY2tfb2Zmc2V0XTsKK30KKworCisK