[RFC PATCH v2 2/5] mpt: Add Smsdid and Smmpt supervisor domain core

Rahul Pathak <[email protected]> Mon, 27 Jul 2026 19:26:00 +0530
Newsgroups org.infradead.lists.opensbi
Message-ID <[email protected]>
SW50cm9kdWNlIHRoZSBzdXBlcnZpc29yZCBvbWFpbiBtZW1vcnktcHJvdGVjdGlvbiAoU21tcHQp
IHRhYmxlCm1hbmFnZW1lbnQgY29yZS4gVGhpcyBhZGRzIHRoZSBtb2RlIGFnbm9zdGljIGNvcmUg
bGF5ZXIgYW5kIHRoZQpwZXIgbW9kZSB0YWJsZSB3YWxrZXJzL2J1aWxkZXIuCgpBZGQgZGVmaW5l
cyBmb3IgdGhlIG1tcHQgQ1NSIGVuY29kaW5nLCBNUFRFIGJpdCBsYXlvdXQsIHBlcm1pc3Npb24g
ZmxhZ3MsCnN0cnVjdHVyZXMsIGZlbmNlIGhlbHBlcnMgYW5kIHRoZSBwdWJsaWMgaW50ZXJmYWNl
cy4KCkl0IGltcGxlbWVudHMgdGhlIFJWNjQgc3VwcG9ydGVkIG1vZGVzIChTbW1wdDQzLzUyLzY0
KSBhbmQKdGhlIFJWMzIgbW9kZSAoU21tcHQzNCksIGl0cyBNUFQgdGFibGUgc3VwcG9ydC4KCkFs
c28gaW1wbGVtZW50cyBtcHQgY29yZSB3aGljaCBpbnRlZ3JhdGVzIFNtbXB0IHdpdGggU0JJIGRv
bWFpbnMgYW5kCm90aGVyIGNvcmUgbGF5ZXJzLgoKU2lnbmVkLW9mZi1ieTogUmFodWwgUGF0aGFr
IDxyYWh1bC5wYXRoYWtAb3NzLnF1YWxjb21tLmNvbT4KLS0tCiBpbmNsdWRlL3NiaS9zYmlfbXB0
LmggIHwgMzM0ICsrKysrKysrKysrKysrCiBsaWIvc2JpL29iamVjdHMubWsgICAgIHwgICAyICsK
IGxpYi9zYmkvc2JpX21wdC5jICAgICAgfCA5MjYgKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysKIGxpYi9zYmkvc2JpX21wdF9tb2RlLmMgfCA5OTcgKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgMjI1OSBpbnNlcnRp
b25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9zYmkvc2JpX21wdC5oCiBjcmVhdGUg
bW9kZSAxMDA2NDQgbGliL3NiaS9zYmlfbXB0LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvc2Jp
L3NiaV9tcHRfbW9kZS5jCgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zYmkvc2JpX21wdC5oIGIvaW5j
bHVkZS9zYmkvc2JpX21wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi43
ZDE3YmQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2JpL3NiaV9tcHQuaApAQCAtMCww
ICsxLDMzNCBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0yLUNsYXVzZQorICoK
KyAqIENvcHlyaWdodCAoYykgMjAyNiBRdWFsY29tbSBJbmMuCisgKgorICogQXV0aG9yczogUmFo
dWwgUGF0aGFrIDxyYWh1bC5wYXRoYWtAb3NzLnF1YWxjb21tLmNvbT4KKyAqLworCisjaWZuZGVm
IF9fU0JJX01QVF9IX18KKyNkZWZpbmUgX19TQklfTVBUX0hfXworCisjaW5jbHVkZSA8c2JpL3Ni
aV90eXBlcy5oPgorI2luY2x1ZGUgPHNiaS9yaXNjdl9sb2Nrcy5oPgorI2luY2x1ZGUgPHNiaS9z
Ymlfc2NyYXRjaC5oPgorI2luY2x1ZGUgPHNiaS9zYmlfYml0bWFwLmg+CisjaW5jbHVkZSA8c2Jp
L3Jpc2N2X2FzbS5oPgorCitzdHJ1Y3Qgc2JpX2RvbWFpbjsKK3N0cnVjdCBzYmlfbXB0X2RvbWFp
bjsKK3N0cnVjdCBzYmlfbXB0X2N0cmw7CitzdHJ1Y3Qgc2JpX2RvbWFpbl9tZW1yZWdpb247CisK
Ky8qIENTUiBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU0JJX0NTUl9NTVBUCQkweDM4MgorI2RlZmlu
ZSBTQklfQ1NSX01TRENGRwkJMHg3NEUKKworLyogbW1wdCByZWdpc3RlciBmaWVsZCBkZWZpbml0
aW9ucyAqLworI2lmIF9fcmlzY3ZfeGxlbiA9PSA2NAorIyBkZWZpbmUgU0JJX01NUFRfTU9ERV9T
SElGVAk2MFVMCisjIGRlZmluZSBTQklfTU1QVF9NT0RFX01BU0sJKFVMKDB4RikgPDwgU0JJX01N
UFRfTU9ERV9TSElGVCkKKyMgZGVmaW5lIFNCSV9NTVBUX1NESURfU0hJRlQJNTJVTAorIyBkZWZp
bmUgU0JJX01NUFRfU0RJRF9NQVNLCShVTCgweDNGKSA8PCBTQklfTU1QVF9TRElEX1NISUZUKQor
IyBkZWZpbmUgU0JJX01NUFRfUFBOX01BU0sJVUwoMHgwMDAwMEZGRkZGRkZGRkZGKQorI2Vsc2UK
KyMgZGVmaW5lIFNCSV9NTVBUX01PREVfU0hJRlQJMzBVTAorIyBkZWZpbmUgU0JJX01NUFRfTU9E
RV9NQVNLCShVTCgweDMpIDw8IFNCSV9NTVBUX01PREVfU0hJRlQpCisjIGRlZmluZSBTQklfTU1Q
VF9TRElEX1NISUZUCTIyVUwKKyMgZGVmaW5lIFNCSV9NTVBUX1NESURfTUFTSwkoVUwoMHgzRikg
PDwgU0JJX01NUFRfU0RJRF9TSElGVCkKKyMgZGVmaW5lIFNCSV9NTVBUX1BQTl9NQVNLCVVMKDB4
M0ZGRkZGKQorI2VuZGlmCisKKyNkZWZpbmUgU0JJX01NUFRfTU9ERV9CQVJFCTBVTAorI2lmIF9f
cmlzY3ZfeGxlbiA9PSA2NAorIyBkZWZpbmUgU0JJX01NUFRfTU9ERV9TTU1QVDQzCTFVTAorIyBk
ZWZpbmUgU0JJX01NUFRfTU9ERV9TTU1QVDUyCTJVTAorIyBkZWZpbmUgU0JJX01NUFRfTU9ERV9T
TU1QVDY0CTNVTAorI2Vsc2UKKyMgZGVmaW5lIFNCSV9NTVBUX01PREVfU01NUFQzNAkxVUwKKyNl
bmRpZgorCisvKgorICogc2JpX21tcHRfZW5jb2RlKCkg4oCUIGFzc2VtYmxlIHRoZSBmdWxsIG1t
cHQgQ1NSIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2JpX21tcHRf
ZW5jb2RlKHUzMiBtb2RlLCB1MzIgc2RpZCwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgcHBuKQor
eworCXJldHVybiAoKCh1bnNpZ25lZCBsb25nKW1vZGUgPDwgU0JJX01NUFRfTU9ERV9TSElGVCkg
JiBTQklfTU1QVF9NT0RFX01BU0spIHwKKwkgICAgICAgKCgodW5zaWduZWQgbG9uZylzZGlkIDw8
IFNCSV9NTVBUX1NESURfU0hJRlQpICYgU0JJX01NUFRfU0RJRF9NQVNLKSB8CisJICAgICAgIChw
cG4gJiBTQklfTU1QVF9QUE5fTUFTSyk7Cit9CisKKy8qCisgKiBNUFRFIGJpdCBkZWZpbml0aW9u
cworICovCisjZGVmaW5lIFNCSV9NUFRFX1YJCSgxVUwgPDwgMCkKKyNkZWZpbmUgU0JJX01QVEVf
TAkJKDFVTCA8PCAxKQorI2RlZmluZSBTQklfTVBURV9OCQkoMVVMIDw8IDIpCisjZGVmaW5lIFNC
SV9NUFRFX1BQTl9TSElGVAkxMFUKKyNkZWZpbmUgU0JJX01QVF9QQUdFX1NISUZUCTEyVQorI2Rl
ZmluZSBTQklfTVBUX1BBR0VfU0laRQk0MDk2VUwKKyNkZWZpbmUgU0JJX01QVF9QQUdFX01BU0sJ
KFNCSV9NUFRfUEFHRV9TSVpFIC0gMVVMKQorI2RlZmluZSBTQklfTVBURV9YV1JfQkFTRQk4VQor
I2RlZmluZSBTQklfTVBURV9YV1JfV0lEVEgJM1UKKyNkZWZpbmUgU0JJX01QVEVfWFdSX01BU0sJ
N1VMCisKK3N0YXRpYyBpbmxpbmUgdTMyIHNiaV9tcHRlX3h3cl9zaGlmdCh1MzIgbikKK3sKKwly
ZXR1cm4gKFNCSV9NUFRFX1hXUl9CQVNFICsgbiAqIFNCSV9NUFRFX1hXUl9XSURUSCk7Cit9CisK
K3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzYmlfbXB0ZV9sZWFmX3NldF94d3IodW5zaWdu
ZWQgbG9uZyBtcHRlLAorCQkJCQkJICAgIHUzMiBuLCB1OCB4d3IpCit7CisJdTMyIHNoID0gc2Jp
X21wdGVfeHdyX3NoaWZ0KG4pOworCisJbXB0ZSAmPSB+KFNCSV9NUFRFX1hXUl9NQVNLIDw8IHNo
KTsKKwltcHRlIHw9ICh4d3IgJiBTQklfTVBURV9YV1JfTUFTSykgPDwgc2g7CisJcmV0dXJuIG1w
dGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzYmlfbXB0ZV9ub25sZWFmKHVu
c2lnbmVkIGxvbmcgdGFibGVfcGEpCit7CisJcmV0dXJuICgoKHRhYmxlX3BhID4+IFNCSV9NUFRf
UEFHRV9TSElGVCkgPDwgU0JJX01QVEVfUFBOX1NISUZUKQorCSAgICAgICB8IFNCSV9NUFRFX1Yp
OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2JpX21wdGVfbm9ubGVhZl90YWJs
ZV9wYSh1bnNpZ25lZCBsb25nIG1wdGUpCit7CisJcmV0dXJuICgobXB0ZSA+PiBTQklfTVBURV9Q
UE5fU0hJRlQpIDw8IFNCSV9NUFRfUEFHRV9TSElGVCk7Cit9CisKKy8qCisgKiBYV1IgcGVybWlz
c2lvbiBjb25zdGFudHMgKFhXUj0wMDAgbWVhbnMgbm8gYWNjZXNzKQorICovCisjZGVmaW5lIFNC
SV9NUFRfUEVSTV9OT05FCTBVCisjZGVmaW5lIFNCSV9NUFRfUEVSTV9SCQkxVQorI2RlZmluZSBT
QklfTVBUX1BFUk1fVwkJMlUKKyNkZWZpbmUgU0JJX01QVF9QRVJNX1gJCTRVCisjZGVmaW5lIFNC
SV9NUFRfUEVSTV9SVwkJKFNCSV9NUFRfUEVSTV9SIHwgU0JJX01QVF9QRVJNX1cpCisjZGVmaW5l
IFNCSV9NUFRfUEVSTV9SWAkJKFNCSV9NUFRfUEVSTV9SIHwgU0JJX01QVF9QRVJNX1gpCisjZGVm
aW5lIFNCSV9NUFRfUEVSTV9SV1gJKFNCSV9NUFRfUEVSTV9SIHwgU0JJX01QVF9QRVJNX1cgfCBT
QklfTVBUX1BFUk1fWCkKKworLyoKKyAqIFNESUQgY29uc3RhbnRzCisgKi8KKyNkZWZpbmUgU0JJ
X01QVF9TRElETUFYCQk2VQorI2RlZmluZSBTQklfTVBUX01BWF9ET01BSU5TCSgxVUwgPDwgU0JJ
X01QVF9TRElETUFYKQorI2RlZmluZSBTQklfTVBUX1NESURfSU5WQUxJRAlTQklfTVBUX01BWF9E
T01BSU5TCisKKy8qCisgKiBTQklfTVBUX01BWF9SRUdJT05TX0RPTUFJTjogTnVtYmVyIG9mIHJl
Z2lvbnMgYSBkb21haW4gbWF5IGhhdmUKKyAqIFVzZWQgZm9yIHRyYWNraW5nIG9mIHJlZ2lvbnMK
KyAqLworI2RlZmluZSBTQklfTVBUX01BWF9SRUdJT05TX0RPTUFJTiAgMzJVCisKKy8qCisgKiBT
TVNESUQgbWZlbmNlIGFuZCBtaW52YWwgcmF3IGVuY29kaW5ncworICoKKyAqIFItdHlwZSwgb3Bj
b2RlPVNZU1RFTSgweDczKSwgZnVuY3QzPTAsIHJkPXgwLCByczE9UEFERFIsIHJzMj1TRElECisg
KiBtZmVuY2UucGEgZnVuY3Q3PTB4MTkgLT4gMHgzMjAwMDA3MyB3aGVyZSByczE9cnMyPXgwCisg
KiBtaW52YWwucGEgZnVuY3Q3PTB4MWIgLT4gMHgzNjAwMDA3MyB3aGVyZSByczE9cnMyPXgwCisg
KgorICogLmluc24gciBvcGNvZGUsIGZ1bmMzLCBmdW5jNywgcmQsIHJzMSwgcnMyCisgKi8KKyNk
ZWZpbmUgU0JJX01QVF9NRkVOQ0VfUEEocnMxLCByczIpCSIuaW5zbiByIDB4NzMsIDAsIDB4MTks
IHgwLCAiIHJzMSAiLCAiIHJzMgorCisjZGVmaW5lIFNCSV9NUFRfTUlOVkFMX1BBKHJzMSwgcnMy
KQkiLmluc24gciAweDczLCAwLCAweDFiLCB4MCwgIiByczEgIiwgIiByczIKKworLyoKKyAqIEZl
bmNlIGFuZCBpbnZhbGlkYXRpb24gaGVscGVycworICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2Jp
X21wdF9mZW5jZV9hbGwodm9pZCkKK3sKKwlfX2FzbV9fIHZvbGF0aWxlKFNCSV9NUFRfTUZFTkNF
X1BBKCJ4MCIsICJ4MCIpIDo6OiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBz
YmlfbXB0X2ZlbmNlX3NkaWQodTMyIHNkaWQpCit7CisJdW5zaWduZWQgbG9uZyBzID0gKHVuc2ln
bmVkIGxvbmcpc2RpZCAmIChTQklfTVBUX01BWF9ET01BSU5TIC0gMVVMKTsKKworCV9fYXNtX18g
dm9sYXRpbGUoU0JJX01QVF9NRkVOQ0VfUEEoIngwIiwgIiUwIikgOjogInIiKHMpIDogIm1lbW9y
eSIpOworfQorCisvKgorICogcnMxPXBhZGRyIGFuZCByczI9eDAKKyAqLworc3RhdGljIGlubGlu
ZSB2b2lkIHNiaV9tcHRfbWZlbmNlX2FkZHIodW5zaWduZWQgbG9uZyBwYWRkcikKK3sKKwlfX2Fz
bV9fIHZvbGF0aWxlKFNCSV9NUFRfTUZFTkNFX1BBKCIlMCIsICJ4MCIpIDo6ICJyIihwYWRkcikg
OiAibWVtb3J5Iik7Cit9CisKKy8qCisgKiByczE9cGFkZHIgYW5kIHJzMj1zZGlkCisgKi8KK3N0
YXRpYyBpbmxpbmUgdm9pZCBzYmlfbXB0X21mZW5jZV9wYSh1bnNpZ25lZCBsb25nIHBhZGRyLCB1
MzIgc2RpZCkKK3sKKwl1bnNpZ25lZCBsb25nIHMgPSAodW5zaWduZWQgbG9uZylzZGlkICYgKFNC
SV9NUFRfTUFYX0RPTUFJTlMgLSAxVUwpOworCisJX19hc21fXyB2b2xhdGlsZShTQklfTVBUX01G
RU5DRV9QQSgiJTAiLCAiJTEiKQorCQkJIDo6ICJyIihwYWRkciksICJyIihzKSA6ICJtZW1vcnki
KTsKK30KKworLyoKKyAqIHJzMT0wIGFuZCByczI9MAorICovCitzdGF0aWMgaW5saW5lIHZvaWQg
c2JpX21wdF9taW52YWxfYWxsKHZvaWQpCit7CisJLyogUHJpb3Igc3RvcmVzIGdsb2JhbGx5IHZp
c2libGUgYmVmb3JlIGludmFsaWRhdGlvbiAqLworCV9fYXNtX18gdm9sYXRpbGUoInNmZW5jZS53
LmludmFsIiA6OjogIm1lbW9yeSIpOworCV9fYXNtX18gdm9sYXRpbGUoU0JJX01QVF9NSU5WQUxf
UEEoIngwIiwgIngwIikgOjo6ICJtZW1vcnkiKTsKKwkvKiBJbnZhbGlkYXRpb24gY29tcGxldGVz
IGJlZm9yZSBzdWJzZXF1ZW50IGltcGxpY2l0IGFjY2Vzc2VzICovCisJX19hc21fXyB2b2xhdGls
ZSgic2ZlbmNlLmludmFsLmlyIiA6OjogIm1lbW9yeSIpOworfQorCisvKgorICogcnMxPXBhZGRy
IGFuZCByczI9c2RpZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2JpX21wdF9taW52YWxfc2Rp
ZCh1bnNpZ25lZCBsb25nIHBhLCB1MzIgc2RpZCkKK3sKKwl1bnNpZ25lZCBsb25nIHMgPSAodW5z
aWduZWQgbG9uZylzZGlkICYgKFNCSV9NUFRfTUFYX0RPTUFJTlMgLSAxVUwpOworCisJX19hc21f
XyB2b2xhdGlsZSgic2ZlbmNlLncuaW52YWwiIDo6OiAibWVtb3J5Iik7CisJX19hc21fXyB2b2xh
dGlsZShTQklfTVBUX01JTlZBTF9QQSgiJTAiLCAiJTEiKQorCQkJIDo6ICJyIihwYSksICJyIihz
KSA6ICJtZW1vcnkiKTsKKwlfX2FzbV9fIHZvbGF0aWxlKCJzZmVuY2UuaW52YWwuaXIiIDo6OiAi
bWVtb3J5Iik7Cit9CisKKy8qCisgKiBDb3JlIGRhdGEgc3RydWN0dXJlcworICovCitzdHJ1Y3Qg
c2JpX21wdF9yZWdpb24geworCXVuc2lnbmVkIGxvbmcJcGE7CisJdW5zaWduZWQgbG9uZwlzaXpl
OworCXU4CQl4d3I7CisJLyogcmVnaW9uIGlzIGxvY2tlZCBhbmQgZGVueSBtb2RpZmljYXRpb24g
dmlhIGFkZC9yZW1vdmVfcmVnaW9uICovCisJYm9vbAkJbG9ja2VkOworCS8qIG1hcHBlZCBpbnRv
IG1vcmUgdGhhbiBvbmUgZG9tYWluICovCisJYm9vbAkJc2hhcmVkOworfTsKKworLyoKKyAqIHN0
cnVjdCBzYmlfbXB0X21vZGUg4oCUIFNNTVBUIG1vZGUgZGVzY3JpcHRpb24uCisgKi8KK3N0cnVj
dCBzYmlfbXB0X21vZGUgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJdTMyCQltb2RlX3ZhbDsKKwor
CS8qIEFzc2VtYmxlIHRoZSBNTVBUIENTUiB2YWx1ZSAqLworCXVuc2lnbmVkIGxvbmcJKCplbmNv
ZGVfbW1wdCkodW5zaWduZWQgbG9uZyBwcG4sIHUzMiBzZGlkKTsKKworCS8qIG1hcCBhIHJhbmdl
IGluIE1QVCB0YWJsZSAqLworCWludAkJKCptYXBfcmFuZ2UpKHN0cnVjdCBzYmlfbXB0X2RvbWFp
biAqZG9tLAorCQkJdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCB4d3Ip
OworCisJLyogbnVtYmVyIGJ5dGVzIGZvciByb290IHRhYmxlIGFsbG9jYXRpb24gKi8KKwl1bnNp
Z25lZCBsb25nCSgqcm9vdF90YWJsZV9zaXplKSh2b2lkKTsKKworCS8qIHJlcXVpcmVkIHJvb3Qg
dGFibGUgcGh5c2ljYWwgYWRkcmVzcyBhbGlnbm1lbnQgKi8KKwl1bnNpZ25lZCBsb25nCSgqcm9v
dF90YWJsZV9hbGlnbikodm9pZCk7CisKKwkvKiBjaGVjayBpZiBbcGEscGErc2l6ZV0gZml0cyBp
biBzbW1wdCBtb2RlIHN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlICovCisJYm9vbAkJKCpwYV9pbl9y
YW5nZSkodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworCS8qIG1hcCBm
dWxsIHJhbmdlIG9mIGFkZHJlc3Mgc3BhY2Ugd2hpY2ggaXMgc3VwcG9ydGVkIGJ5IHRoZSBtb2Rl
ICovCisJaW50CQkoKm1hcF9mdWxsX3JhbmdlKShzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwg
dTggeHdyKTsKKworCS8qIHJlYWQgdGhlIHh3ciBmb3IgYSBQQSAqLworCXU4CQkoKmdldF94d3Ip
KHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1bnNpZ25lZCBsb25nIHBhKTsKK307CisKK3N0
cnVjdCBzYmlfbXB0X2RvbWFpbiB7CisJdTMyCQkJc2RpZDsKKwlib29sCQkJdmFsaWQ7CisJdW5z
aWduZWQgbG9uZwkJcm9vdF9wYTsKKwlzdHJ1Y3Qgc2JpX21wdF9tb2RlCSptb2RlOworCXN0cnVj
dCBzYmlfZG9tYWluCSpzYmlfZG9tOworCXVuc2lnbmVkIGludAkJbnJlZ2lvbnM7CisJc3RydWN0
IHNiaV9tcHRfcmVnaW9uCXJlZ2lvbnNbU0JJX01QVF9NQVhfUkVHSU9OU19ET01BSU5dOworCXNw
aW5sb2NrX3QJCWxvY2s7Cit9OworCisvKgorICogc3RydWN0IHNiaV9tcHRfY3RybCDigJQgUkRT
TSBNUFQgc3RhdGUKKyAqLworc3RydWN0IHNiaV9tcHRfY3RybCB7CisJYm9vbAkJCXJlYWR5Owor
CXN0cnVjdCBzYmlfbXB0X21vZGUJKm1vZGU7CisJLyogZGV0ZWN0ZWQgc2RpZGxlbiBmcm9tIG1t
cHQgcHJvYmUgKi8KKwl1MzIJCQlzZGlkX2xlbjsKKwkvKiAyXnNkaWRfbGVuIOKAlCBydW50aW1l
IGxpbWl0IGZvciBhbGwgZG9tYWluIG9wZXJhdGlvbnMgKi8KKwl1MzIJCQltYXhfZG9tYWluczsK
Kwl1bnNpZ25lZCBsb25nCQlmd19wYTsKKwl1bnNpZ25lZCBsb25nCQlmd19zaXplOworCXN0cnVj
dCBzYmlfbXB0X2RvbWFpbglkb21haW5zW1NCSV9NUFRfTUFYX0RPTUFJTlNdOworCXUzMgkJCW5k
b21haW47CisJLyogc2RpZCBvZmZzZXQgaW4gc2NyYXRjaCAqLworCXVuc2lnbmVkIGxvbmcJCXNk
aWRfb2Zmc2V0OworCS8qIGJpdG1hcCB0byB0cmFjayBhc3NpZ25lZC9mcmVlIFNESUQgKGJpdCBO
IHNldCA9IFNESUQgTiBmcmVlKSAqLworCURFQ0xBUkVfQklUTUFQKHNkaWRfYml0bWFwLCBTQklf
TVBUX01BWF9ET01BSU5TKTsKK307CisKK3N0cnVjdCBzYmlfbXB0X2N0cmwgKnNiaV9tcHRfY3Ry
bF9nZXQodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdTMyIHNiaV9tcHRfdGhpc2hhcnRfc2RpZCh2
b2lkKQoreworCXN0cnVjdCBzYmlfbXB0X2N0cmwgKmN0cmwgPSBzYmlfbXB0X2N0cmxfZ2V0KCk7
CisJdTMyICpwOworCisJaWYgKCFjdHJsLT5yZWFkeSB8fCAhY3RybC0+c2RpZF9vZmZzZXQpCisJ
CXJldHVybiAodTMyKVNCSV9NUFRfU0RJRF9JTlZBTElEOworCXAgPSBzYmlfc2NyYXRjaF9vZmZz
ZXRfcHRyKHNiaV9zY3JhdGNoX3RoaXNoYXJ0X3B0cigpLAorCQkJCSAgIGN0cmwtPnNkaWRfb2Zm
c2V0KTsKKwlyZXR1cm4gKnA7Cit9CisKKy8qCisgKiBEb21haW4gY3JlYXRpb24gY29uZmlnCisg
KgorICogc2JpX2RvbSBhbmQgcmVnaW9ucyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICogd2hl
biBhIHN1cGVydmlzb3IgZG9tYWluIGlzIGJhY2tlZCBieSBhIFNCSSBkb21haW4KKyAqIHRoZW4g
dGhlIHJlZ2lvbnMgbGlzdCBhbmQgYWNjZXNzIHBlcm1pc3Npb25zIGFyZSBkZXJpdmVkCisgKiBm
cm9tIHRoZSBTQkkgZG9tYWluIHN0cnVjdHVyZXMuCisgKi8KK3N0cnVjdCBzYmlfbXB0X2RvbWFp
bl9jb25maWcgeworCS8qIFNCSSBkb21haW4gd2hvc2UgUy9VIG1lbXJlZ2lvbnMgYXJlIG1hcHBl
ZC4gKi8KKwlzdHJ1Y3Qgc2JpX2RvbWFpbgkqc2JpX2RvbTsKKwkvKiBwZXJtaXNzaW9uIGZvciBy
ZWdpb25zIGluaGVyaXRlZCBmcm9tIHNiaV9kb20gKi8KKwl1OAkJCXh3cjsKKwkvKiBwcm90ZWN0
IGZpcm13YXJlIHJlZ2lvbnMgZm9yIHRoZSBkb21haW4gKi8KKwlib29sCQkJZndfcHJvdGVjdDsK
KwkvKgorCSAqIGV4cGxpY2l0IHJlZ2lvbiBsaXN0IG1hcHBlZCBpbiBNUFQgdGFibGUuCisJICog
TlVMTCB3aGVuIHNiaV9kb20gY292ZXJzIGV2ZXJ5dGhpbmcKKwkgKi8KKwlzdHJ1Y3Qgc2JpX21w
dF9yZWdpb24JKnJlZ2lvbnM7CisJdTMyCQkJbnJlZ2lvbnM7Cit9OworCitpbnQgc2JpX21wdF9p
bml0KHZvaWQpOworCitpbnQgc2JpX21wdF9kb21haW5fY3JlYXRlKGNvbnN0IHN0cnVjdCBzYmlf
bXB0X2RvbWFpbl9jb25maWcgKmNmZywgdTMyICpvdXRfc2RpZCk7CisKK2ludCBzYmlfbXB0X2Rv
bWFpbl9hZGRfcmVnaW9uKHUzMiBzZGlkLCB1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25n
IHNpemUsIHU4IHh3cik7CisKK2ludCBzYmlfbXB0X2RvbWFpbl9yZW1vdmVfcmVnaW9uKHUzMiBz
ZGlkLCB1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHNpemUpOworCitpbnQgc2JpX21w
dF9zaGFyZV9yZWdpb24odTMyIHNyY19zZGlkLCB1MzIgZHN0X3NkaWQsIHVuc2lnbmVkIGxvbmcg
cGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdTggZHN0X3h3cik7CisKK2ludCBzYmlfbXB0X3Vuc2hh
cmVfcmVnaW9uKHUzMiBzZGlkLCB1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHNpemUp
OworCitpbnQgc2JpX21wdF9oYXJ0X2FjdGl2YXRlKHUzMiBzZGlkKTsKKworaW50IHNiaV9tcHRf
aGFydF9hY3RpdmF0ZV9mb3JfZG9tYWluKHN0cnVjdCBzYmlfZG9tYWluICpzYmlfZG9tKTsKKwor
c3RydWN0IHNiaV9tcHRfZG9tYWluICpzYmlfbXB0X2RvbWFpbl9nZXQodTMyIHNkaWQpOworCit1
bnNpZ25lZCBsb25nIHNiaV9tcHRfcG9vbF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2ln
bmVkIGxvbmcgYWxpZ24pOworCit2b2lkIHNiaV9tcHRfc2RpZF9mcmVlKHUzMiBzZGlkKTsKKwor
aW50IHNiaV9tcHRfcXVlcnlfYWNjZXNzKHUzMiBzZGlkLCB1bnNpZ25lZCBsb25nIHBhLCB1OCAq
b3V0X3h3cik7CisKK3ZvaWQgc2JpX21wdF9kdW1wKHZvaWQpOworCisjZW5kaWYgLyogX19TQklf
TVBUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbGliL3NiaS9vYmplY3RzLm1rIGIvbGliL3NiaS9vYmpl
Y3RzLm1rCmluZGV4IGMyOWM4ODhmLi4zYjNjM2VhMyAxMDA2NDQKLS0tIGEvbGliL3NiaS9vYmpl
Y3RzLm1rCisrKyBiL2xpYi9zYmkvb2JqZWN0cy5tawpAQCAtMTA4LDMgKzEwOCw1IEBAIGxpYnNi
aS1vYmpzLXkgKz0gc2JpX2V4cGVjdGVkX3RyYXAubwogbGlic2JpLW9ianMteSArPSBzYmlfY3Bw
Yy5vCiBsaWJzYmktb2Jqcy0kKENDX1NVUFBPUlRfVkVDVE9SKSArPSBzYmlfdmVjdG9yLm8KIGxp
YnNiaS1vYmpzLXkgKz0gc2JpX2ZwLm8KK2xpYnNiaS1vYmpzLXkgKz0gc2JpX21wdC5vCitsaWJz
Ymktb2Jqcy15ICs9IHNiaV9tcHRfbW9kZS5vCmRpZmYgLS1naXQgYS9saWIvc2JpL3NiaV9tcHQu
YyBiL2xpYi9zYmkvc2JpX21wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
Li4zMDZmODJkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zYmkvc2JpX21wdC5jCkBAIC0wLDAg
KzEsOTI2IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTItQ2xhdXNlCisgKgor
ICogQ29weXJpZ2h0IChjKSAyMDI2IFF1YWxjb21tIEluYy4KKyAqCisgKiBBdXRob3JzOiBSYWh1
bCBQYXRoYWsgPHJhaHVsLnBhdGhha0Bvc3MucXVhbGNvbW0uY29tPgorICovCisKKyNpbmNsdWRl
IDxzYmkvc2JpX21wdC5oPgorI2luY2x1ZGUgPHNiaS9zYmlfZG9tYWluLmg+CisjaW5jbHVkZSA8
c2JpL3NiaV9lcnJvci5oPgorI2luY2x1ZGUgPHNiaS9zYmlfaGFydC5oPgorI2luY2x1ZGUgPHNi
aS9zYmlfaGVhcC5oPgorI2luY2x1ZGUgPHNiaS9zYmlfc2NyYXRjaC5oPgorI2luY2x1ZGUgPHNi
aS9zYmlfc3RyaW5nLmg+CisjaW5jbHVkZSA8c2JpL3NiaV9jb25zb2xlLmg+CisjaW5jbHVkZSA8
c2JpL3Jpc2N2X2xvY2tzLmg+CisjaW5jbHVkZSA8c2JpL3Jpc2N2X2FzbS5oPgorCitzdGF0aWMg
c3RydWN0IHNiaV9tcHRfY3RybCBtcHRfY3RybDsKKworc3RydWN0IHNiaV9tcHRfY3RybCAqc2Jp
X21wdF9jdHJsX2dldCh2b2lkKQoreworCXJldHVybiAmbXB0X2N0cmw7Cit9CisKK3N0cnVjdCBz
YmlfbXB0X2RvbWFpbiAqc2JpX21wdF9kb21haW5fZ2V0KHUzMiBzZGlkKQoreworCXN0cnVjdCBz
YmlfbXB0X2RvbWFpbiAqc2Q7CisKKwlpZiAoc2RpZCA+PSBtcHRfY3RybC5tYXhfZG9tYWlucykK
KwkJcmV0dXJuIE5VTEw7CisKKwlzZCA9IG1wdF9jdHJsLmRvbWFpbnNbc2RpZF0udmFsaWQgPyAm
bXB0X2N0cmwuZG9tYWluc1tzZGlkXSA6IE5VTEw7CisKKwlyZXR1cm4gc2Q7Cit9CisKKy8qIE1l
bW9yeSBhbGxvY2F0b3IgZm9yIE1QVCB0YWJsZXMgZnJvbSBoZWFwICovCit1bnNpZ25lZCBsb25n
IHNiaV9tcHRfcG9vbF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxp
Z24pCit7CisJdW5zaWduZWQgbG9uZyBwdHIgPSAodW5zaWduZWQgbG9uZylzYmlfYWxpZ25lZF9h
bGxvYyhhbGlnbiwgc2l6ZSk7CisKKwlpZiAoIXB0cikgeworCQlzYmlfcHJpbnRmKCJzYmlfbXB0
OiBhbGxvYyBmYWlsZWQgKHNpemU9MHglbHggYWxpZ249MHglbHgpXG4iLAorCQkJICAgc2l6ZSwg
YWxpZ24pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBNUFQgdGFibGVzIG11c3QgYmUgemVyb2Vk
IHRvIG1hcmsgdGhlbSBpbnZhbGlkIChtcHRlLlYgPSAwKSAqLworCXNiaV9tZW1zZXQoKHZvaWQg
KilwdHIsIDAsIHNpemUpOworCisJcmV0dXJuIHB0cjsKK30KKworLyogQ2hlY2sgaWYgdHdvIHJl
Z2lvbnMgb3ZlcmxhcCAqLworc3RhdGljIGJvb2wgcmVnaW9uc19vdmVybGFwKHVuc2lnbmVkIGxv
bmcgcGExLCB1bnNpZ25lZCBsb25nIHNpemUxLAorCQkJICAgdW5zaWduZWQgbG9uZyBwYTIsIHVu
c2lnbmVkIGxvbmcgc2l6ZTIpCit7CisJcmV0dXJuIChwYTEgPCBwYTIgKyBzaXplMikgJiYgKHBh
MiA8IHBhMSArIHNpemUxKTsKK30KKworLyogQ2hlY2sgaWYgYSByZWdpb24gaXMgY29tcGxldGVs
eSBjb250YWluZWQgaW5zaWRlIGFub3RoZXIgcmVnaW9uICovCitzdGF0aWMgYm9vbCByZWdpb25f
Y29udGFpbmVkKHVuc2lnbmVkIGxvbmcgY2hpbGRfcGEsIHVuc2lnbmVkIGxvbmcgY2hpbGRfc2l6
ZSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHBhcmVudF9wYSwgdW5zaWduZWQgbG9uZyBwYXJlbnRf
c2l6ZSkKK3sKKwlyZXR1cm4gKGNoaWxkX3BhID49IHBhcmVudF9wYSkgJiYKKwkgICAgICAgKGNo
aWxkX3BhICsgY2hpbGRfc2l6ZSA8PSBwYXJlbnRfcGEgKyBwYXJlbnRfc2l6ZSk7Cit9CisKKy8q
CisgKiBDaGVjayBpZiBhIHJlZ2lvbiBbcGEsIHBhK3NpemVdIG92ZXJsYXBzIHdpdGggYW55IG1h
cHBlZAorICogcmVnaW9uIHdoaWNoIGlzIGxvY2tlZAorICovCitzdGF0aWMgYm9vbCByZWdpb25f
b3ZlcmxhcHNfbG9ja2VkKGNvbnN0IHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAg
IHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQg
aTsKKworCWZvciAoaSA9IDA7IGkgPCBkb20tPm5yZWdpb25zOyBpKyspCisJCWlmIChkb20tPnJl
Z2lvbnNbaV0ubG9ja2VkICYmCisJCSAgICByZWdpb25zX292ZXJsYXAocGEsIHNpemUsIGRvbS0+
cmVnaW9uc1tpXS5wYSwgZG9tLT5yZWdpb25zW2ldLnNpemUpKQorCQkJcmV0dXJuIHRydWU7CisJ
cmV0dXJuIGZhbHNlOworfQorCisvKiBQcm9iZSBTRElETEVOIGZyb20gdGhlIG1tcHQgQ1NSLiAq
Lworc3RhdGljIHUzMiBwcm9iZV9zZGlkbGVuKHUzMiBtb2RlX3ZhbCkKK3sKKwl1bnNpZ25lZCBs
b25nIHNhdmVkLCBzZGlkX3ZhbDsKKwl1MzIgc2RpZGxlbiA9IDA7CisKKwlzYXZlZCA9IGNzcl9y
ZWFkKFNCSV9DU1JfTU1QVCk7CisKKwkvKiBQcm9ncmFtIGEgbGVnYWwgbm9uLUJhcmUgTU9ERSB3
aXRoIGFsbC1vbmVzIGluIHRoZSBTRElEIGZpZWxkICovCisJY3NyX3dyaXRlKFNCSV9DU1JfTU1Q
VCwKKwkJICAoKCh1bnNpZ25lZCBsb25nKW1vZGVfdmFsIDw8IFNCSV9NTVBUX01PREVfU0hJRlQp
ICYgU0JJX01NUFRfTU9ERV9NQVNLKSB8CisJCSAgU0JJX01NUFRfU0RJRF9NQVNLKTsKKworCXNk
aWRfdmFsID0gKGNzcl9yZWFkKFNCSV9DU1JfTU1QVCkgJiBTQklfTU1QVF9TRElEX01BU0spID4+
IFNCSV9NTVBUX1NESURfU0hJRlQ7CisKKwl3aGlsZSAoc2RpZF92YWwpIHsKKwkJc2RpZGxlbiAr
PSAxOworCQlzZGlkX3ZhbCA+Pj0gMTsKKwl9CisKKwlpZiAoc2RpZGxlbiA+IFNCSV9NUFRfU0RJ
RE1BWCkKKwkJc2RpZGxlbiA9IFNCSV9NUFRfU0RJRE1BWDsKKworCWNzcl93cml0ZShTQklfQ1NS
X01NUFQsIHNhdmVkKTsKKworCXJldHVybiBzZGlkbGVuOworfQorCisjaWYgX19yaXNjdl94bGVu
ID09IDY0CitleHRlcm4gc3RydWN0IHNiaV9tcHRfbW9kZSBzbW1wdDQzX21vZGU7CitleHRlcm4g
c3RydWN0IHNiaV9tcHRfbW9kZSBzbW1wdDUyX21vZGU7CitleHRlcm4gc3RydWN0IHNiaV9tcHRf
bW9kZSBzbW1wdDY0X21vZGU7CisjZWxzZQorZXh0ZXJuIHN0cnVjdCBzYmlfbXB0X21vZGUgc21t
cHQzNF9tb2RlOworI2VuZGlmCisKK3N0YXRpYyBib29sIHByb2JlX21vZGUodTMyIG1vZGVfdmFs
KQoreworCXUzMiBtOworCWNzcl93cml0ZShTQklfQ1NSX01NUFQsCisJCSAgKCh1bnNpZ25lZCBs
b25nKW1vZGVfdmFsIDw8IFNCSV9NTVBUX01PREVfU0hJRlQpICYgU0JJX01NUFRfTU9ERV9NQVNL
KTsKKworCW0gPSAoY3NyX3JlYWQoU0JJX0NTUl9NTVBUKSAmIFNCSV9NTVBUX01PREVfTUFTSykg
Pj4gU0JJX01NUFRfTU9ERV9TSElGVDsKKworCXJldHVybiAobSA9PSBtb2RlX3ZhbCk7Cit9CisK
KworLyoKKyAqIFByb2JlIFNNTVBUIG1vZGUgYW5kIGluaXRpYWxpemUgdGhlIHJlbGF0ZWQgbW9k
ZSBvcHMKKyAqCisgKiBEZWxpYmVyYXRlbHkgcHJlZmVyIGNvdmVyYWdlIG92ZXIgbGF0ZW5jeSwg
YmVjYXVzZSBsYXRlbmN5IGNhbiBiZQorICogaW1wcm92ZWQgYnkgdGhlIE1QVCBjYWNoZSB3aGlj
aCBoYXJkd2FyZSBtYXkgaW1wbGVtZW50IGJ1dCB0aGUKKyAqIGNvdmVyYWdlIGlzIG5vdC4gU28g
cGljayB0aGUgd2lkZXN0IG1vZGUgd2hpY2ggaXMgc3VwcG9ydGVkIGJ5IHRoZQorICogaGFyZHdh
cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2JpX21wdF9tb2RlICppbml0X21wdF9tb2RlKHUzMiAq
b3V0X21vZGVfdmFsKQoreworCXVuc2lnbmVkIGxvbmcgc2F2ZWQgPSBjc3JfcmVhZChTQklfQ1NS
X01NUFQpOworCXN0cnVjdCBzYmlfbXB0X21vZGUgKnMgPSBOVUxMOworCXUzMiBtb2RlX3ZhbCA9
IDA7CisKKyNpZiBfX3Jpc2N2X3hsZW4gPT0gNjQKKwlpZiAocHJvYmVfbW9kZShTQklfTU1QVF9N
T0RFX1NNTVBUNjQpKSB7CisJCXMgPSAmc21tcHQ2NF9tb2RlOworCQltb2RlX3ZhbCA9IFNCSV9N
TVBUX01PREVfU01NUFQ2NDsKKwl9IGVsc2UgaWYgKHByb2JlX21vZGUoU0JJX01NUFRfTU9ERV9T
TU1QVDUyKSkgeworCQlzID0gJnNtbXB0NTJfbW9kZTsKKwkJbW9kZV92YWwgPSBTQklfTU1QVF9N
T0RFX1NNTVBUNTI7CisJfSBlbHNlIGlmIChwcm9iZV9tb2RlKFNCSV9NTVBUX01PREVfU01NUFQ0
MykpIHsKKwkJcyA9ICZzbW1wdDQzX21vZGU7CisJCW1vZGVfdmFsID0gU0JJX01NUFRfTU9ERV9T
TU1QVDQzOworCX0KKyNlbHNlCisJaWYgKHByb2JlX21vZGUoU0JJX01NUFRfTU9ERV9TTU1QVDM0
KSkgeworCQlzID0gJnNtbXB0MzRfbW9kZTsKKwkJbW9kZV92YWwgPSBTQklfTU1QVF9NT0RFX1NN
TVBUMzQ7CisJfQorI2VuZGlmCisKKwljc3Jfd3JpdGUoU0JJX0NTUl9NTVBULCBzYXZlZCk7CisK
KwlpZiAob3V0X21vZGVfdmFsKQorCQkqb3V0X21vZGVfdmFsID0gbW9kZV92YWw7CisKKwlyZXR1
cm4gczsKK30KKworLyoKKyAqIG1wdF9tYXBfcmFuZ2VfcGVybSgpOiBNYXBzIFtwYSwgcGErc2l6
ZV0gcmVnaW9uIGludG8gc3VwZXJ2aXNvciBkb21haW4gTVBUIHRhYmxlCisgKiB3aXRoIGl0cyBh
Y2Nlc3MgcGVybWlzc2lvbnMoeHdyKS4KKyAqCisgKiBsb2NrZWQ9dHJ1ZTogbWVhbnMgZW50cnkg
aXMgaW1tdXRhYmxlIGFuZCBpdCBjYW5ub3QgYmUgbW9kaWZpZWQuIFVzZWQgZm9yCisgKiBmaXJt
d2FyZSBkZW55LWFsbCBhbmQgb3RoZXIgc3VjaCByZWdpb25zIGZvciBwZXJtYW5lbmV0IGFjY2Vz
cyBwb2xpY3kuCisgKgorICogbG9ja2VkPWZhbHNlOiByZWdpb24gZW50cnkgaXMgbW9kaWZpYWJs
ZSBhdCBydW50aW1lIHZpYSBhZGQvcmVtb3ZlX3JlZ2lvbi4KKyAqIFVzZWQgZm9yIFMvVS1tb2Rl
IGFjY2Vzc2libGUgZG9tYWluIHJlZ2lvbnMuCisgKi8KKworc3RhdGljIGludCBtcHRfbWFwX3Jh
bmdlX3Blcm0oc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sIHN0cnVjdCBzYmlfbXB0X21vZGUg
KnNjaCwKKwkJCSAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCB4d3Is
IGJvb2wgbG9ja2VkKQoreworCWludCByYzsKKwlib29sIGZpcnN0X2luX3JhbmdlOworCisJaWYg
KCFzaXplKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IGludmFsaWQgc2l6ZSBmb3IgcmFuZ2Ug
MHglbHhcbiIsIHBhKTsKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisJfQorCisJaWYgKChwYSAmIFNC
SV9NUFRfUEFHRV9NQVNLKSB8fCAoc2l6ZSAmIFNCSV9NUFRfUEFHRV9NQVNLKSkgeworCQlzYmlf
cHJpbnRmKCJzYmlfbXB0OiB1bmFsaWduZWQgcmFuZ2UgMHglbHgrMHglbHhcbiIsIHBhLCBzaXpl
KTsKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisJfQorCisJaWYgKCFzY2gtPnBhX2luX3JhbmdlKHBh
LCBzaXplKSkgeworCQkvKgorCQkgKiBBIHJlZ2lvbiB0aGF0IHBhX2luX3JhbmdlKCkgcmV0dXJu
cyBmYWxzZSBmYWxscyBpbnRvIG9uZSBvZiB0d28KKwkJICogZGlmZmVyZW50IGNhc2VzIC0gUEEg
d2hpY2ggaXMgb3V0IG9mIHJhbmdlIGZyb20gdGhlIG1hcHBhYmxlCisJCSAqIHJhbmdlIG9mIHRo
YXQgbW9kZSBhbmQgc2Vjb25kIGlzIFBBIGlzIGluIHJhbmdlIGJ1dCB0aGUgZW5kCisJCSAqIChw
YSArIHNpemUpIGlzIGNyb3NzaW5nIHRoZSBtYXBwYWJsZSByYW5nZS4KKwkJICoKKwkJICogRGlz
dGluZ3Vpc2ggdGhlIHR3byBieSBwcm9iaW5nIHBhX2luX3JhbmdlKCkgZm9yIGp1c3QKKwkJICog
dGhlIGZpcnN0IHBhZ2UgaW4gdGhhdCBiaWcgcmFuZ2UgYW5kIGlmIGV2ZW4gdGhlIGZpcnN0IHBh
Z2UKKwkJICogaXMgb3V0IG9mIHJhbmdlIGl0IGlzIHRoZSBmaXJzdCBjYXNlIGFuZCBpZiB0aGUg
YmFzZSBpcyBpbgorCQkgKiByYW5nZSBidXQgdGhlIHdob2xlIHJlZ2lvbiBpcyBub3QsIGl0IGlz
IGNhc2UgbGF0ZXIuCisJCSAqLworCQlmaXJzdF9pbl9yYW5nZSA9IHNjaC0+cGFfaW5fcmFuZ2Uo
cGEsIFNCSV9NUFRfUEFHRV9TSVpFKTsKKworCQlpZiAobG9ja2VkKSB7CisJCQlzYmlfcHJpbnRm
KCJzYmlfbXB0OiBsb2NrZWQgcmVnaW9uIDB4JWx4KzB4JWx4IG91dCBvZiBtb2RlIHJhbmdlXG4i
LAorCQkJCSAgIHBhLCBzaXplKTsKKwkJCXJldHVybiBTQklfRUlOVkFMOworCQl9CisKKwkJLyog
UmVnaW9uIHdpdGggUEEgd2hpY2ggcGFydGlhbGx5IGNyb3Nzb3ZlciB0aGUgbWFwcGFibGUgc3Bh
Y2UgKi8KKwkJaWYgKGZpcnN0X2luX3JhbmdlKSB7CisJCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBm
YXRhbCByZWdpb24gMHglbHgrMHglbHggY3Jvc3NvdmVyIgorCQkJCSAgICIgbW9kZSAnJXMnIGNl
aWxpbmc7IGhpZ2ggcGFydCBtYXkgYWxpYXMiCisJCQkJICAgIiB3aXRoIGxvdyBNUFRFIGVudHJp
ZXMg4oCUIG5vdCBtYXBwaW5nIHRoaXMgcmVnaW9uXG4iLAorCQkJCSAgIHBhLCBzaXplLCBzY2gt
Pm5hbWUpOworCQkJcmV0dXJuIFNCSV9FSU5WQUw7CisJCX0KKworCQkvKiBSZWdpb24gd2hpY2gg
aXMgZW50aXJlbHkgYWJvdmUgdGhlIGNlaWxpbmcg4oCUIHVucmVhY2hhYmxlICovCisJCXNiaV9w
cmludGYoInNiaV9tcHQ6IHNraXAgb3V0LW9mLXJhbmdlIDB4JWx4KzB4JWx4IgorCQkJICAgIiAo
ZW50aXJlbHkgYWJvdmUgJyVzJyBjZWlsaW5nOyBubyBNUFQgZW50cnksXG4iLAorCQkJICAgcGEs
IHNpemUsIHNjaC0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJjID0gc2NoLT5tYXBfcmFu
Z2UoZG9tLCBwYSwgc2l6ZSwgeHdyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChk
b20tPm5yZWdpb25zID49IFNCSV9NUFRfTUFYX1JFR0lPTlNfRE9NQUlOKQorCQlyZXR1cm4gU0JJ
X0VOT01FTTsKKworCWRvbS0+cmVnaW9uc1tkb20tPm5yZWdpb25zXS5wYSA9IHBhOworCWRvbS0+
cmVnaW9uc1tkb20tPm5yZWdpb25zXS5zaXplID0gc2l6ZTsKKwlkb20tPnJlZ2lvbnNbZG9tLT5u
cmVnaW9uc10ueHdyID0geHdyOworCWRvbS0+cmVnaW9uc1tkb20tPm5yZWdpb25zXS5sb2NrZWQg
PSBsb2NrZWQ7CisJZG9tLT5yZWdpb25zW2RvbS0+bnJlZ2lvbnNdLnNoYXJlZCA9IGZhbHNlOwor
CWRvbS0+bnJlZ2lvbnMrKzsKKworCXJldHVybiAwOworfQorCisvKgorICogbXB0X3h3cl9mcm9t
X21lbXJlZ2lvbigpOiBkZXJpdmUgYW4gTVBURSBYV1IgZW5jb2RpbmcgZnJvbSBhIFNCSSBkb21h
aW4KKyAqIG1lbXJlZ2lvbidzIFMvVSBhY2Nlc3MgZmxhZ3MsIGNsYW1wZWQgYnkgY2FwLgorICoK
KyAqIGNhcCBpcyBhbiB1cHBlciBib3VuZCB0aGUgY2FsbGVyIG1heSBpbXBvc2UuIEEgcmVnaW9u
IGZyb20gU0JJIGRvbWFpbgorICogbWF5IGhhdmUgbW9yZSBwZXJtaXNzaXZlIGFjY2VzcyBwZXJt
aXNzaW9ucyB3aGljaCBhbiBzdXBlcnZpc29yIGRvbWFpbgorICogbWF5IHdhbnQgdG8gcmVzdGlj
dCBhbmQgY2FwIHRoZW0uCisgKi8KK3N0YXRpYyB1OCBtcHRfeHdyX2Zyb21fbWVtcmVnaW9uKGNv
bnN0IHN0cnVjdCBzYmlfZG9tYWluX21lbXJlZ2lvbiAqbXIsCisJCQkJIHU4IGNhcCkKK3sKKwl1
OCB4d3IgPSBTQklfTVBUX1BFUk1fTk9ORTsKKworCWlmIChtci0+ZmxhZ3MgJiBTQklfRE9NQUlO
X01FTVJFR0lPTl9TVV9SRUFEQUJMRSkKKwkJeHdyIHw9IFNCSV9NUFRfUEVSTV9SOworCWlmICht
ci0+ZmxhZ3MgJiBTQklfRE9NQUlOX01FTVJFR0lPTl9TVV9XUklUQUJMRSkKKwkJeHdyIHw9IFNC
SV9NUFRfUEVSTV9XOworCWlmIChtci0+ZmxhZ3MgJiBTQklfRE9NQUlOX01FTVJFR0lPTl9TVV9F
WEVDVVRBQkxFKQorCQl4d3IgfD0gU0JJX01QVF9QRVJNX1g7CisKKwl4d3IgJj0gY2FwOworCisJ
LyogWFdSIGVuY29kaW5ncyAwYjAxMCAoVykgYW5kIDBiMTEwIChXWCkgYXJlIHJlc2VydmVkICov
CisJaWYgKCh4d3IgJiBTQklfTVBUX1BFUk1fVykgJiYgISh4d3IgJiBTQklfTVBUX1BFUk1fUikp
IHsKKwkJc2JpX3ByaW50Zigic2JpX21wdDogcmVnaW9uIDB4JWx4OiBXIHdpdGhvdXQgUiBpcyBh
IHJlc2VydmVkIgorCQkJICAgIiBYV1IgZW5jb2Rpbmcg4oCUIGRlbnlpbmcgcmVnaW9uXG4iLCBt
ci0+YmFzZSk7CisJCXJldHVybiBTQklfTVBUX1BFUk1fTk9ORTsKKwl9CisKKwlyZXR1cm4geHdy
OworfQorCisvKgorICogc2JpX21wdF9kb21haW5fY3JlYXRlKCk6IENyZWF0ZSBhIFN1cGVydmlz
b3IgRG9tYWluCisgKi8KK2ludCBzYmlfbXB0X2RvbWFpbl9jcmVhdGUoY29uc3Qgc3RydWN0IHNi
aV9tcHRfZG9tYWluX2NvbmZpZyAqY2ZnLAorCQkJICAgdTMyICpvdXRfc2RpZCkKK3sKKwlpbnQg
cmM7CisJdTMyIHNkaWQsIGk7CisJdW5zaWduZWQgbG9uZyByb290X3BhOworCXN0cnVjdCBzYmlf
bXB0X21vZGUgKnNjaDsKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbTsKKwljb25zdCBzdHJ1
Y3Qgc2JpX2RvbWFpbl9tZW1yZWdpb24gKm1yOworCXN0cnVjdCBzYmlfbXB0X2N0cmwgKmN0cmwg
PSAmbXB0X2N0cmw7CisJdTggYmFzZV94d3IgPSBTQklfTVBUX1BFUk1fTk9ORTsKKworCWlmICgh
Y3RybC0+cmVhZHkpCisJCXJldHVybiBTQklfRU5PREVWOworCisJaWYgKGNmZy0+c2JpX2RvbSAm
JiBjZmctPm5yZWdpb25zKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IHNiaV9kb20gYW5kIGV4
cGxpY2l0IHJlZ2lvbnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVxuIik7CisJCXJldHVybiBTQklf
RUlOVkFMOworCX0KKworCS8qCisJICogc2RpZF9iaXRtYXAgZW1wdHkgbWVhbnMgZXZlcnkgYXZh
aWxhYmxlIFNESUQgaXMKKwkgKiBjdXJyZW50bHkgaW4gdXNlIGFuZCBubyBkb21haW4gY2FuIGJl
IGNyZWF0ZWQuCisJICovCisJaWYgKGJpdG1hcF9lbXB0eShjdHJsLT5zZGlkX2JpdG1hcCwgY3Ry
bC0+bWF4X2RvbWFpbnMpKQorCQlyZXR1cm4gU0JJX0VOT01FTTsKKworCXNjaCA9IGN0cmwtPm1v
ZGU7CisKKwlyb290X3BhID0gc2JpX21wdF9wb29sX2FsbG9jKHNjaC0+cm9vdF90YWJsZV9zaXpl
KCksCisJCQkJICAgICBzY2gtPnJvb3RfdGFibGVfYWxpZ24oKSk7CisJaWYgKCFyb290X3BhKSB7
CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IE9PTSByb290IHRhYmxlXG4iKTsKKwkJcmV0dXJuIFNC
SV9FTk9NRU07CisJfQorCisJLyoKKwkgKiBSb290IE1QVCBtZW1vcnkgYWxsb2NhdGVkIOKAlCB0
YWtlIFNESUQgZnJvbSBiaXRtYXAgZm9yIHJvb3Qgc3VwZXJ2aXNvcgorCSAqIGRvbWFpbgorCSAq
LworCWZvciAoc2RpZCA9IDA7IHNkaWQgPCBjdHJsLT5tYXhfZG9tYWluczsgc2RpZCsrKQorCQlp
ZiAoYml0bWFwX3Rlc3QoY3RybC0+c2RpZF9iaXRtYXAsIHNkaWQpKQorCQkJYnJlYWs7CisJYml0
bWFwX2NsZWFyKGN0cmwtPnNkaWRfYml0bWFwLCBzZGlkLCAxKTsKKworCWRvbSA9ICZjdHJsLT5k
b21haW5zW3NkaWRdOworCVNQSU5fTE9DS19JTklUKGRvbS0+bG9jayk7CisKKwlkb20tPnNkaWQg
PSBzZGlkOworCWRvbS0+dmFsaWQgPSB0cnVlOworCWRvbS0+cm9vdF9wYSA9IHJvb3RfcGE7CisJ
ZG9tLT5tb2RlID0gc2NoOworCWRvbS0+c2JpX2RvbSA9IGNmZy0+c2JpX2RvbTsKKwlkb20tPm5y
ZWdpb25zID0gMDsKKworCWlmIChjZmctPnNiaV9kb20pIHsKKwkJLyoKKwkJICogU2ltaWxhciB0
byBTQkkgZG9tYWluLCBjcmVhdGUgYSBiYXNlbGluZSB3aGljaAorCQkgKiBtYXBzIHdob2xlIG1h
cHBhYmxlIGFkZHJlc3Mgc3BhY2UgYnkgYSBtb2RlIGFuZCBtYXJrIGl0CisJCSAqIHdpdGggWFdS
IHBlcm1pc3Npb25zLiBMYXRlciBzZWxlY3RpdmVseSByZXN0cmljdCB0aGUKKwkJICogcGVybWlz
c2lvbnMgaW4gYW5vdGhlciBwYXNzLgorCQkgKi8KKwkJc2JpX2RvbWFpbl9mb3JfZWFjaF9tZW1y
ZWdpb24oY2ZnLT5zYmlfZG9tLCBtcikgeworCQkJaWYgKG1yLT5vcmRlciA8IHNpemVvZih1bnNp
Z25lZCBsb25nKSAqIDgpCisJCQkJY29udGludWU7CisKKwkJCWlmICghKG1yLT5mbGFncyAmIFNC
SV9ET01BSU5fTUVNUkVHSU9OX1NVX0FDQ0VTU19NQVNLKSkKKwkJCQljb250aW51ZTsKKworCQkJ
YmFzZV94d3IgPSBtcHRfeHdyX2Zyb21fbWVtcmVnaW9uKG1yLCBjZmctPnh3cik7CisJCQlyYyA9
IHNjaC0+bWFwX2Z1bGxfcmFuZ2UoZG9tLCBiYXNlX3h3cik7CisJCQlpZiAocmMpCisJCQkJZ290
byBmYWlsOworCisJCQlpZiAoZG9tLT5ucmVnaW9ucyA8IFNCSV9NUFRfTUFYX1JFR0lPTlNfRE9N
QUlOKSB7CisJCQkJc3RydWN0IHNiaV9tcHRfcmVnaW9uICpyID0gJmRvbS0+cmVnaW9uc1tkb20t
Pm5yZWdpb25zKytdOworCQkJCXItPnBhID0gMDsKKwkJCQlyLT5zaXplID0gfjBVTCAmIH5TQklf
TVBUX1BBR0VfTUFTSzsKKwkJCQlyLT54d3IgPSBiYXNlX3h3cjsKKwkJCQlyLT5sb2NrZWQgPSBm
YWxzZTsKKwkJCQlyLT5zaGFyZWQgPSBmYWxzZTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwor
CQkvKgorCQkgKiBBbm90aGVyIHBhc3MgdG8gbWFwIGV2ZXJ5IG90aGVyIHJlZ2lvbiB3aGljaCBo
YXMgaXRzIG93bgorCQkgKiBwZXJtaXNzaW9ucyBkZXJpdmVkIGZyb20gdGhlIG1lbXJlZ2lvbidz
IFMvVSBmbGFncy4KKwkJICovCisJCXNiaV9kb21haW5fZm9yX2VhY2hfbWVtcmVnaW9uKGNmZy0+
c2JpX2RvbSwgbXIpIHsKKwkJCWlmIChtci0+b3JkZXIgPj0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcp
ICogOCkKKwkJCQljb250aW51ZTsKKworCQkJcmMgPSBtcHRfbWFwX3JhbmdlX3Blcm0oZG9tLCBz
Y2gsIG1yLT5iYXNlLCBCSVQobXItPm9yZGVyKSwKKwkJCQkJCW1wdF94d3JfZnJvbV9tZW1yZWdp
b24obXIsIGNmZy0+eHdyKSwgZmFsc2UpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gZmFpbDsKKwkJ
fQorCX0KKworCS8qIE1hcCBleHBsaWNpdCByZWdpb25zIHdoaWNoIGFyZSBub3QgcGFydCBvZiBh
bnkgU0JJIGRvbWFpbiAqLworCWZvciAoaSA9IDA7IGkgPCBjZmctPm5yZWdpb25zOyBpKyspIHsK
KwkJcmMgPSBtcHRfbWFwX3JhbmdlX3Blcm0oZG9tLCBzY2gsIGNmZy0+cmVnaW9uc1tpXS5wYSwg
Y2ZnLT5yZWdpb25zW2ldLnNpemUsCisJCQkJCWNmZy0+cmVnaW9uc1tpXS54d3IsIGZhbHNlKTsK
KwkJaWYgKHJjKQorCQkJZ290byBmYWlsOworCX0KKworCS8qCisJICogTWFwIGZpcm13YXJlIHJl
Z2lvbiB3aXRoIG5vIHBlcm1pc3Npb24gd2l0aCBhbmQgbWFyayBhcyBsb2NrZWQKKwkgKi8KKwlp
ZiAoY2ZnLT5md19wcm90ZWN0KSB7CisJCXJjID0gbXB0X21hcF9yYW5nZV9wZXJtKGRvbSwgc2No
LCBjdHJsLT5md19wYSwgY3RybC0+Zndfc2l6ZSwKKwkJCQkJU0JJX01QVF9QRVJNX05PTkUsIHRy
dWUpOworCQlpZiAocmMpIHsKKwkJCXNiaV9wcmludGYoInNiaV9tcHQ6IGNhbm5vdCBwcm90ZWN0
IGZpcm13YXJlIgorCQkJCSAgICIgcmM9JWRcbiIsIHJjKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQor
CX0KKworCWN0cmwtPm5kb21haW4rKzsKKwlpZiAob3V0X3NkaWQpCisJCSpvdXRfc2RpZCA9IHNk
aWQ7CisKKwlzYmlfbXB0X2ZlbmNlX3NkaWQoc2RpZCk7CisKKwkvKiBUbyBiZSByZW1vdmVkICov
CisJc2JpX3ByaW50Zigic2JpX21wdDogU0RJRCAldSByb290PTB4JWx4IG1vZGU9JXMgZG9tPSVz
XG4iLAorCQkgICBzZGlkLCByb290X3BhLCBzY2gtPm5hbWUsIGNmZy0+c2JpX2RvbSA/IGNmZy0+
c2JpX2RvbS0+bmFtZSA6ICIobm9uZSkiKTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwliaXRtYXBf
c2V0KGN0cmwtPnNkaWRfYml0bWFwLCAoaW50KXNkaWQsIDEpOworCWRvbS0+dmFsaWQgPSBmYWxz
ZTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBzYmlfbXB0X2RvbWFpbl9hZGRfcmVnaW9uKCk6
IE1hcCBhIHJlZ2lvbiBpbiBhIE1QVCB0YWJsZQorICovCitpbnQgc2JpX21wdF9kb21haW5fYWRk
X3JlZ2lvbih1MzIgc2RpZCwgdW5zaWduZWQgbG9uZyBwYSwKKwkJCSAgICAgICB1bnNpZ25lZCBs
b25nIHNpemUsIHU4IHh3cikKK3sKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbTsKKwlzdHJ1
Y3Qgc2JpX21wdF9yZWdpb24gKnI7CisJaW50IHJjOworCisJaWYgKCFtcHRfY3RybC5yZWFkeSkK
KwkJcmV0dXJuIFNCSV9FTk9ERVY7CisJaWYgKCFzaXplIHx8IChwYSAmIFNCSV9NUFRfUEFHRV9N
QVNLKSB8fCAoc2l6ZSAmIFNCSV9NUFRfUEFHRV9NQVNLKSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7
CisKKwlkb20gPSBzYmlfbXB0X2RvbWFpbl9nZXQoc2RpZCk7CisJaWYgKCFkb20pCisJCXJldHVy
biBTQklfRUlOVkFMOworCisJaWYgKHJlZ2lvbl9vdmVybGFwc19sb2NrZWQoZG9tLCBwYSwgc2l6
ZSkpIHsKKwkJc2JpX3ByaW50Zigic2JpX21wdDogMHglbHgrMHglbHggb3ZlcmxhcHMgbG9ja2Vk
IgorCQkJICAgIiAoU0RJRCAldSlcbiIsIHBhLCBzaXplLCBzZGlkKTsKKwkJcmV0dXJuIFNCSV9F
SU5WQUw7CisJfQorCisJaWYgKCFkb20tPm1vZGUtPnBhX2luX3JhbmdlKHBhLCBzaXplKSkgewor
CQkvKgorCQkgKiBBIHJlZ2lvbiB0aGF0IHBhX2luX3JhbmdlKCkgcmVqZWN0cyBmYWxscyBpbnRv
IG9uZSBvZiB0d28KKwkJICogZGlmZmVyZW50IGNhc2VzIC0gUEEgd2hpY2ggaXMgb3V0IG9mIHJh
bmdlIGZyb20gdGhlIG1hcHBhYmxlCisJCSAqIHJhbmdlIG9mIHRoYXQgbW9kZSBhbmQgc2Vjb25k
IGlzIFBBIGlzIGluIHJhbmdlIGJ1dCB0aGUgZW5kCisJCSAqIChQQSArIFNJWkUpIGlzIGNyb3Nz
aW5nIHRoZSBtYXBwYWJsZSByYW5nZS4KKwkJICoKKwkJICogRGlzdGluZ3Vpc2ggdGhlIHR3byBi
eSBwcm9iaW5nIHBhX2luX3JhbmdlKCkgZm9yIGp1c3QKKwkJICogdGhlIGJhc2UgcGFnZSBhbmQg
aWYgZXZlbiB0aGUgYmFzZSBpcyBvdXQgb2YgcmFuZ2UgaXQgaXMKKwkJICogdGhlIGZpcnN0IGNh
c2UgYW5kIGlmIHRoZSBiYXNlIGlzIGluIHJhbmdlIGJ1dCB0aGUgd2hvbGUKKwkJICogcmVnaW9u
IGlzIG5vdCwgaXQgaXMgY2FzZSBsYXRlci4KKwkJICovCisJCWlmIChkb20tPm1vZGUtPnBhX2lu
X3JhbmdlKHBhLCBTQklfTVBUX1BBR0VfU0laRSkpCisJCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiAw
eCVseCsweCVseCBjcm9zc292ZXIgbW9kZSAnJXMnIgorCQkJCSAgICIgY2VpbGluZyAoU0RJRCAl
dSkg4oCUIGhpZ2ggcGFydCB3b3VsZCBhbGlhczsiCisJCQkJICAgIiByZWplY3RlZFxuIiwKKwkJ
CQkgICBwYSwgc2l6ZSwgZG9tLT5tb2RlLT5uYW1lLCBzZGlkKTsKKwkJZWxzZQorCQkJc2JpX3By
aW50Zigic2JpX21wdDogMHglbHgrMHglbHggb3V0IG9mIHJhbmdlIgorCQkJCSAgICIgKFNESUQg
JXUpXG4iLCBwYSwgc2l6ZSwgc2RpZCk7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCXNw
aW5fbG9jaygmZG9tLT5sb2NrKTsKKwlyYyA9IGRvbS0+bW9kZS0+bWFwX3JhbmdlKGRvbSwgcGEs
IHNpemUsIHh3cik7CisJc3Bpbl91bmxvY2soJmRvbS0+bG9jayk7CisKKwlpZiAoIXJjKSB7CisJ
CWlmIChkb20tPm5yZWdpb25zIDwgU0JJX01QVF9NQVhfUkVHSU9OU19ET01BSU4pIHsKKwkJCXIg
PSAmZG9tLT5yZWdpb25zW2RvbS0+bnJlZ2lvbnMrK107CisJCQlyLT5wYSA9IHBhOworCQkJci0+
c2l6ZSA9IHNpemU7CisJCQlyLT54d3IgPSB4d3I7CisJCQlyLT5sb2NrZWQgPSBmYWxzZTsKKwkJ
CXItPnNoYXJlZCA9IGZhbHNlOworCQl9CisKKwkJc2JpX21wdF9mZW5jZV9zZGlkKHNkaWQpOwor
CX0KKworCXJldHVybiByYzsKK30KKworLyoKKyAqIHNiaV9tcHRfZG9tYWluX3JlbW92ZV9yZWdp
b24oKTogVW5tYXAgYSByZWdpb24gZnJvbSB0aGUgTVBUIHRhYmxlCisgKi8KK2ludCBzYmlfbXB0
X2RvbWFpbl9yZW1vdmVfcmVnaW9uKHUzMiBzZGlkLCB1bnNpZ25lZCBsb25nIHBhLAorCQkJCSAg
dW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCByYzsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1
Y3Qgc2JpX21wdF9kb21haW4gKmRvbTsKKwlzdHJ1Y3Qgc2JpX21wdF9yZWdpb24gKnI7CisKKwlp
ZiAoIW1wdF9jdHJsLnJlYWR5KQorCQlyZXR1cm4gU0JJX0VOT0RFVjsKKworCWlmICghc2l6ZSB8
fCAocGEgJiBTQklfTVBUX1BBR0VfTUFTSykgfHwgKHNpemUgJiBTQklfTVBUX1BBR0VfTUFTSykp
CisJCXJldHVybiBTQklfRUlOVkFMOworCisJZG9tID0gc2JpX21wdF9kb21haW5fZ2V0KHNkaWQp
OworCWlmICghZG9tKQorCQlyZXR1cm4gU0JJX0VJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBk
b20tPm5yZWdpb25zOyBpKyspIHsKKwkJciA9ICZkb20tPnJlZ2lvbnNbaV07CisKKwkJaWYgKHIt
PmxvY2tlZCAmJiByZWdpb25fY29udGFpbmVkKHBhLCBzaXplLCByLT5wYSwgci0+c2l6ZSkpCisJ
CQlyZXR1cm4gU0JJX0VERU5JRUQ7CisJCS8qCisJCSAqIFNoYXJlZCByZWdpb25zIG11c3QgYmUg
cmVtb3ZlZCB2aWEgc2JpX21wdF91bnNoYXJlX3JlZ2lvbigpCisJCSAqIGJlY2F1c2UgdGhhdCBm
dW5jdGlvbiBwcmV2ZW50cyBvbmUgZG9tYWluIHJldm9raW5nIGEgcmVnaW9uCisJCSAqIHRoYXQg
YW5vdGhlciBkb21haW4gc3RpbGwgaGFzIG1hcHBlZC4KKwkJICovCisJCWlmIChyLT5zaGFyZWQg
JiYgci0+cGEgPT0gcGEgJiYgci0+c2l6ZSA9PSBzaXplKQorCQkJcmV0dXJuIFNCSV9FREVOSUVE
OworCX0KKworCXNwaW5fbG9jaygmZG9tLT5sb2NrKTsKKwlyYyA9IGRvbS0+bW9kZS0+bWFwX3Jh
bmdlKGRvbSwgcGEsIHNpemUsIFNCSV9NUFRfUEVSTV9OT05FKTsKKwlzcGluX3VubG9jaygmZG9t
LT5sb2NrKTsKKworCWlmICghcmMpCisJCXNiaV9tcHRfZmVuY2Vfc2RpZChzZGlkKTsKKworCXJl
dHVybiByYzsKK30KKworLyoKKyAqIFNoYXJlZCBtZW1vcnkgcmVnaW9ucworICoKKyAqIHNiaV9t
cHRfc2hhcmVfcmVnaW9uKCkg4oCUIG1hcCBhIHJlZ2lvbiBpbnRvIGEgc2Vjb25kIGRvbWFpbi4K
KyAqCisgKiBCb3RoIGRvbWFpbnMgTVBUIHRhYmxlcyBhcmUgdXBkYXRlZCBpbmRlcGVuZGVudGx5
IOKAlCBlYWNoIGhhcyBpdHMKKyAqIG93biByb290L2lubmVyL2xlYWYgdGFibGUgdHJlZS4gVGhl
IHNhbWUgUEEgcmFuZ2UgY2FuIGhhdmUgZGlmZmVyZW50CisgKiBYV1IgcGVybWlzc2lvbnMgaW4g
ZGlmZmVyZW50IGRvbWFpbnMuCisgKgorICovCisKK2ludCBzYmlfbXB0X3NoYXJlX3JlZ2lvbih1
MzIgc3JjX3NkaWQsIHUzMiBkc3Rfc2RpZCwKKwkJCSAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWdu
ZWQgbG9uZyBzaXplLAorCQkJICB1OCBkc3RfeHdyKQoreworCXVuc2lnbmVkIGludCBpOworCWlu
dCByYzsKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKnNyY19kb20sICpkc3RfZG9tOworCisJaWYg
KCFtcHRfY3RybC5yZWFkeSkKKwkJcmV0dXJuIFNCSV9FTk9ERVY7CisKKwlpZiAoIXNpemUgfHwg
KHBhICYgU0JJX01QVF9QQUdFX01BU0spIHx8IChzaXplICYgU0JJX01QVF9QQUdFX01BU0spKQor
CQlyZXR1cm4gU0JJX0VJTlZBTDsKKworCWlmIChzcmNfc2RpZCA9PSBkc3Rfc2RpZCkKKwkJcmV0
dXJuIFNCSV9FSU5WQUw7CisKKwlzcmNfZG9tID0gc2JpX21wdF9kb21haW5fZ2V0KHNyY19zZGlk
KTsKKwlkc3RfZG9tID0gc2JpX21wdF9kb21haW5fZ2V0KGRzdF9zZGlkKTsKKwlpZiAoIXNyY19k
b20gfHwgIWRzdF9kb20pCisJCXJldHVybiBTQklfRUlOVkFMOworCisJaWYgKHJlZ2lvbl9vdmVy
bGFwc19sb2NrZWQoZHN0X2RvbSwgcGEsIHNpemUpKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6
IHNoYXJlIDB4JWx4KzB4JWx4IG92ZXJsYXBzIGxvY2tlZCByZWdpb24gaW4gU0RJRCAldVxuIiwK
KwkJCSAgIHBhLCBzaXplLCBkc3Rfc2RpZCk7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKwor
CS8qIFJlamVjdCByZXNlcnZlZCB4d3IgcGVybWlzc2lvbnM6IDBiMDEwIGFuZCAwYjExMCAoVyB3
aXRob3V0IFIpICovCisJaWYgKChkc3RfeHdyICYgU0JJX01QVF9QRVJNX1cpICYmICEoZHN0X3h3
ciAmIFNCSV9NUFRfUEVSTV9SKSkgeworCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBzaGFyZSAweCVs
eCsweCVseDogVyB3aXRob3V0IFIgaXMgYSByZXNlcnZlZCBYV1IgZW5jb2RpbmdcbiIsCisJCQkg
ICBwYSwgc2l6ZSk7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCWlmIChkc3RfZG9tLT5u
cmVnaW9ucyA+PSBTQklfTVBUX01BWF9SRUdJT05TX0RPTUFJTikgeworCQlzYmlfcHJpbnRmKCJz
YmlfbXB0OiBzaGFyZTogU0RJRCAldSByZWdpb24gdGFibGUgZnVsbFxuIiwgZHN0X3NkaWQpOwor
CQlyZXR1cm4gU0JJX0VOT01FTTsKKwl9CisKKwlzcGluX2xvY2soJmRzdF9kb20tPmxvY2spOwor
CXJjID0gZHN0X2RvbS0+bW9kZS0+bWFwX3JhbmdlKGRzdF9kb20sIHBhLCBzaXplLCBkc3RfeHdy
KTsKKwlzcGluX3VubG9jaygmZHN0X2RvbS0+bG9jayk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7
CisKKwlkc3RfZG9tLT5yZWdpb25zW2RzdF9kb20tPm5yZWdpb25zXS5wYSA9IHBhOworCWRzdF9k
b20tPnJlZ2lvbnNbZHN0X2RvbS0+bnJlZ2lvbnNdLnNpemUgPSBzaXplOworCWRzdF9kb20tPnJl
Z2lvbnNbZHN0X2RvbS0+bnJlZ2lvbnNdLnh3ciA9IGRzdF94d3I7CisJZHN0X2RvbS0+cmVnaW9u
c1tkc3RfZG9tLT5ucmVnaW9uc10ubG9ja2VkID0gZmFsc2U7CisJZHN0X2RvbS0+cmVnaW9uc1tk
c3RfZG9tLT5ucmVnaW9uc10uc2hhcmVkID0gdHJ1ZTsKKwlkc3RfZG9tLT5ucmVnaW9ucysrOwor
CisJZm9yIChpID0gMDsgaSA8IHNyY19kb20tPm5yZWdpb25zOyBpKyspIHsKKwkJaWYgKHNyY19k
b20tPnJlZ2lvbnNbaV0ucGEgPT0gcGEgJiYKKwkJICAgIHNyY19kb20tPnJlZ2lvbnNbaV0uc2l6
ZSA9PSBzaXplKSB7CisJCQlzcmNfZG9tLT5yZWdpb25zW2ldLnNoYXJlZCA9IHRydWU7CisJCQli
cmVhazsKKwkJfQorCX0KKworCXNiaV9tcHRfZmVuY2Vfc2RpZChzcmNfc2RpZCk7CisJc2JpX21w
dF9mZW5jZV9zZGlkKGRzdF9zZGlkKTsKKworCXNiaV9wcmludGYoInNiaV9tcHQ6IHNoYXJlZCAw
eCVseCsweCVseCBTRElEICV1IOKGkiBTRElEICV1IHh3cj0ldVxuIiwKKwkJICAgcGEsIHNpemUs
IHNyY19zZGlkLCBkc3Rfc2RpZCwgZHN0X3h3cik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAq
IHNiaV9tcHRfdW5zaGFyZV9yZWdpb24oKSDigJQgVW5tYXAgYSBzaGFyZWQgcmVnaW9uIGZyb20g
YSBkb21haW4uCisgKgorICogVGhlIG90aGVyIGRvbWFpbiByZW1haW5zIHVuYWZmZWN0ZWQganVz
dCB0aGUgc2hhcmVkIGZsYWcgZ2V0cyByZW1vdmVkCisgKiBmb3IgdGhhdCByZWdpb24gZnJvbSBi
b3RoIHRoZSBkb21haW5zLgorICovCitpbnQgc2JpX21wdF91bnNoYXJlX3JlZ2lvbih1MzIgc2Rp
ZCwgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXUzMiBzOworCWlu
dCByYzsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwg
KnBlZXI7CisKKwlpZiAoIW1wdF9jdHJsLnJlYWR5KQorCQlyZXR1cm4gU0JJX0VOT0RFVjsKKwor
CWlmICghc2l6ZSB8fCAocGEgJiBTQklfTVBUX1BBR0VfTUFTSykgfHwgKHNpemUgJiBTQklfTVBU
X1BBR0VfTUFTSykpCisJCXJldHVybiBTQklfRUlOVkFMOworCisJZG9tID0gc2JpX21wdF9kb21h
aW5fZ2V0KHNkaWQpOworCWlmICghZG9tKQorCQlyZXR1cm4gU0JJX0VJTlZBTDsKKworCWZvciAo
aSA9IDA7IGkgPCBkb20tPm5yZWdpb25zOyBpKyspIHsKKwkJaWYgKGRvbS0+cmVnaW9uc1tpXS5w
YSA9PSBwYSAmJgorCQkgICAgZG9tLT5yZWdpb25zW2ldLnNpemUgPT0gc2l6ZSAmJgorCQkgICAg
ZG9tLT5yZWdpb25zW2ldLnNoYXJlZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBkb20tPm5y
ZWdpb25zKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IHVuc2hhcmUgMHglbHgrMHglbHggbm90
IGZvdW5kIGluIFNESUQgJXVcbiIsCisJCQkgICBwYSwgc2l6ZSwgc2RpZCk7CisJCXJldHVybiBT
QklfRUlOVkFMOworCX0KKworCXNwaW5fbG9jaygmZG9tLT5sb2NrKTsKKwlyYyA9IGRvbS0+bW9k
ZS0+bWFwX3JhbmdlKGRvbSwgcGEsIHNpemUsIFNCSV9NUFRfUEVSTV9OT05FKTsKKwlzcGluX3Vu
bG9jaygmZG9tLT5sb2NrKTsKKworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJZG9tLT5ucmVn
aW9ucyAtPSAxOworCWRvbS0+cmVnaW9uc1tpXSA9IGRvbS0+cmVnaW9uc1tkb20tPm5yZWdpb25z
XTsKKworCS8qIENsZWFyIHRoZSBzaGFyZWQgZmxhZyBvbiBhbnkgb3RoZXIgZG9tYWluIHRoYXQg
aGFzIHRoaXMgUEEgcmVnaW9uIHNoYXJlZC4qLworCWZvciAocyA9IDA7IHMgPCBtcHRfY3RybC5t
YXhfZG9tYWluczsgcysrKSB7CisJCXBlZXIgPSBzYmlfbXB0X2RvbWFpbl9nZXQocyk7CisJCWlm
ICghcGVlciB8fCBwZWVyID09IGRvbSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaiA9IDA7IGog
PCBwZWVyLT5ucmVnaW9uczsgaisrKQorCQkJaWYgKHBlZXItPnJlZ2lvbnNbal0ucGEgPT0gcGEg
JiYgcGVlci0+cmVnaW9uc1tqXS5zaXplID09IHNpemUpCisJCQkJcGVlci0+cmVnaW9uc1tqXS5z
aGFyZWQgPSBmYWxzZTsKKwl9CisKKwlzYmlfbXB0X2ZlbmNlX3NkaWQoc2RpZCk7CisKKwlyZXR1
cm4gMDsKK30KKworLyoKKyAqIERpc2FibGUgU01NUFQgb24gaGFydAorICovCit2b2lkIHNiaV9t
cHRfaGFydF9kZWFjdGl2YXRlKHZvaWQpCit7CisJLyoKKwkgKiBtbXB0IGlzIGluYWN0aXZlIGlu
IE0tbW9kZSBwZXIgc3BlYywgc28gbm8gQ1NSIHdyaXRlCisJICogaXMgbmVlZGVkLgorCSAqLwor
fQorCisvKgorICogRW5hYmxlIFNNTVBUIG9uIGhhcnQKKyAqLworaW50IHNiaV9tcHRfaGFydF9h
Y3RpdmF0ZSh1MzIgc2RpZCkKK3sKKwl1MzIgKnA7CisJdW5zaWduZWQgbG9uZyBwcG47CisJc3Ry
dWN0IHNiaV9tcHRfZG9tYWluICpkb207CisKKwlpZiAoIW1wdF9jdHJsLnJlYWR5KQorCQlyZXR1
cm4gU0JJX0VOT0RFVjsKKworCWRvbSA9IHNiaV9tcHRfZG9tYWluX2dldChzZGlkKTsKKwlpZiAo
IWRvbSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisKKwlwcG4gPSBkb20tPnJvb3RfcGEgPj4gU0JJ
X01QVF9QQUdFX1NISUZUOworCWNzcl93cml0ZShTQklfQ1NSX01NUFQsIGRvbS0+bW9kZS0+ZW5j
b2RlX21tcHQocHBuLCBzZGlkKSk7CisJc2JpX21wdF9mZW5jZV9zZGlkKHNkaWQpOworCisJaWYg
KG1wdF9jdHJsLnNkaWRfb2Zmc2V0KSB7CisJCXAgPSBzYmlfc2NyYXRjaF9vZmZzZXRfcHRyKHNi
aV9zY3JhdGNoX3RoaXNoYXJ0X3B0cigpLCBtcHRfY3RybC5zZGlkX29mZnNldCk7CisJCSpwID0g
c2RpZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFjdGl2YXRlIFNNTVBUIGZvciBh
bGwgaGFydHMgd2hpY2ggYXJlIGFzc29jaWF0ZWQgd2l0aCBhbiBsaW5rZWQKKyAqIFNCSSBkb21h
aW4gaW4gYW4gc3VwZXJ2aXNvciBkb21haW4uCisgKi8KK2ludCBzYmlfbXB0X2hhcnRfYWN0aXZh
dGVfZm9yX2RvbWFpbihzdHJ1Y3Qgc2JpX2RvbWFpbiAqc2JpX2RvbSkKK3sKKwl1MzIgczsKKwor
CWlmICghbXB0X2N0cmwucmVhZHkpCisJCXJldHVybiBTQklfRU5PREVWOworCWlmICghc2JpX2Rv
bSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisKKwkvKgorCSAqIFNlYXJjaCBhbGwgc3VwZXJ2aXNv
ciBkb21haW5zIGZvciBhc3NvY2lhdGVkIHNiaV9kb20gYW5kCisJICogYWN0aXZhdGUgaGFydHMg
Zm9yIHRoYXQgc3VwZXJ2aXNvciBkb21haW4KKwkgKi8KKwlmb3IgKHMgPSAwOyBzIDwgbXB0X2N0
cmwubWF4X2RvbWFpbnM7IHMrKykgeworCQlpZiAobXB0X2N0cmwuZG9tYWluc1tzXS52YWxpZCAm
JiBtcHRfY3RybC5kb21haW5zW3NdLnNiaV9kb20gPT0gc2JpX2RvbSkKKwkJCXJldHVybiBzYmlf
bXB0X2hhcnRfYWN0aXZhdGUocyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzYmlf
bXB0X3NkaWRfZnJlZSgpOiBSZXR1cm5zIFNESUQgdG8gdGhlIGZyZWUgcG9vbCBhZnRlciBkb21h
aW4gZGVzdHJveS4KKyAqLwordm9pZCBzYmlfbXB0X3NkaWRfZnJlZSh1MzIgc2RpZCkKK3sKKwlp
ZiAoIW1wdF9jdHJsLnJlYWR5IHx8IHNkaWQgPj0gbXB0X2N0cmwubWF4X2RvbWFpbnMpCisJCXJl
dHVybjsKKwliaXRtYXBfc2V0KG1wdF9jdHJsLnNkaWRfYml0bWFwLCAoaW50KXNkaWQsIDEpOwor
CW1wdF9jdHJsLmRvbWFpbnNbc2RpZF0udmFsaWQgPSBmYWxzZTsKK30KKworLyoKKyAqIHNiaV9t
cHRfcXVlcnlfYWNjZXNzKCk6IFJldHVybnMgdGhlIFhXUiBmb3IgYSBQQSBpbiBzdXBlcnZpc29y
IGRvbWFpbihzZGlkKS4KKyAqLworaW50IHNiaV9tcHRfcXVlcnlfYWNjZXNzKHUzMiBzZGlkLCB1
bnNpZ25lZCBsb25nIHBhLCB1OCAqb3V0X3h3cikKK3sKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4g
KmRvbTsKKworCWlmICghbXB0X2N0cmwucmVhZHkpCisJCXJldHVybiBTQklfRU5PREVWOworCisJ
aWYgKCFvdXRfeHdyKQorCQlyZXR1cm4gU0JJX0VJTlZBTDsKKworCWRvbSA9IHNiaV9tcHRfZG9t
YWluX2dldChzZGlkKTsKKwlpZiAoIWRvbSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisKKwlpZiAo
IWRvbS0+bW9kZS0+cGFfaW5fcmFuZ2UocGEsIFNCSV9NUFRfUEFHRV9TSVpFKSkgeworCQkqb3V0
X3h3ciA9IFNCSV9NUFRfUEVSTV9OT05FOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2so
JmRvbS0+bG9jayk7CisJKm91dF94d3IgPSBkb20tPm1vZGUtPmdldF94d3IoZG9tLCBwYSk7CisJ
c3Bpbl91bmxvY2soJmRvbS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNiaV9t
cHRfaW5pdCgpOiBJbml0aWFsaXplIE1QVCBzdHJ1Y3R1cmVzCisgKi8KK2ludCBzYmlfbXB0X2lu
aXQodm9pZCkKK3sKKwl1MzIgKnA7CisJdTMyIG1vZGVfdmFsOworCXVuc2lnbmVkIGxvbmcgZndf
ZW5kOworCXN0cnVjdCBzYmlfc2NyYXRjaCAqczsKKwlzdHJ1Y3Qgc2JpX3NjcmF0Y2ggKnNjcmF0
Y2ggPSBzYmlfc2NyYXRjaF90aGlzaGFydF9wdHIoKTsKKwl1bnNpZ25lZCBsb25nIGZ3X3BhID0g
c2NyYXRjaC0+Zndfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBmd19zaXplID0gc2NyYXRjaC0+Zndf
c2l6ZTsKKworCWlmIChtcHRfY3RybC5yZWFkeSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXNiaV9o
YXJ0X2hhc19leHRlbnNpb24oc2NyYXRjaCwgU0JJX0hBUlRfRVhUX1NNU0RJRCkpIHsKKwkJc2Jp
X3ByaW50Zigic2JpX21wdDogU21zZGlkIGV4dGVuc2lvbiBhYnNlbnRcbiIpOworCQlyZXR1cm4g
U0JJX0VOT0RFVjsKKwl9CisKKwlpZiAoIXNiaV9oYXJ0X2hhc19leHRlbnNpb24oc2NyYXRjaCwg
U0JJX0hBUlRfRVhUX1NNTVBUKSkgeworCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBTbW1wdCBleHRl
bnNpb24gYWJzZW50XG4iKTsKKwkJcmV0dXJuIFNCSV9FTk9ERVY7CisJfQorCisJbXB0X2N0cmwu
bW9kZSA9IGluaXRfbXB0X21vZGUoJm1vZGVfdmFsKTsKKwlpZiAoIW1wdF9jdHJsLm1vZGUpIHsK
KwkJc2JpX3ByaW50Zigic2JpX21wdDogV0FSTCBwcm9iZSBmb3VuZCBubyBtb2RlXG4iKTsKKwkJ
cmV0dXJuIFNCSV9FTk9ERVY7CisJfQorCisJLyoKKwkgKiBTRElETEVOIG11c3QgYmUgcHJvYmVk
IHdpdGggYSBsZWdhbCBub24tQmFyZSBNT0RFIHByb2dyYW1tZWQsCisJICogcHJvYmUgc2RpZGxl
biBtdXN0IGJlIGRvbmUgb25seSBhZnRlciB0aGUgcHJvYmluZyB0aGUgbW9kZS4KKwkgKi8KKwlt
cHRfY3RybC5zZGlkX2xlbiA9IHByb2JlX3NkaWRsZW4obW9kZV92YWwpOworCWlmICghbXB0X2N0
cmwuc2RpZF9sZW4pIHsKKwkJc2JpX3ByaW50Zigic2JpX21wdDogU0RJRExFTj0wIOKAlCBTRElE
IGZpZWxkIG5vdCBpbXBsZW1lbnRlZFxuIik7CisJCXJldHVybiBTQklfRU5PREVWOworCX0KKwor
CW1wdF9jdHJsLm1heF9kb21haW5zID0gMVVMIDw8IG1wdF9jdHJsLnNkaWRfbGVuOworCisJLyoK
KwkgKiBJbml0aWFsaXNlIFNESUQgYml0bWFwCisJICogc2V0IGJpdHMgMC4uKG1heF9kb21haW5z
LTEpIGFzIDEgbWFya2luZyB0aG9zZSBTRElEcyBmcmVlLgorCSAqLworCWJpdG1hcF9maWxsKG1w
dF9jdHJsLnNkaWRfYml0bWFwLCBtcHRfY3RybC5tYXhfZG9tYWlucyk7CisKKwkvKiBSb3VuZCBm
d19wYSBhbmQgZndfc2l6ZSB0byBwYWdlIGJvdW5kYXJpZXMgYmVmb3JlIHN0b3JpbmcuICovCisJ
ZndfZW5kID0gKGZ3X3BhICsgZndfc2l6ZSArIFNCSV9NUFRfUEFHRV9TSVpFIC0gMVVMKSAmIH5T
QklfTVBUX1BBR0VfTUFTSzsKKwltcHRfY3RybC5md19wYSA9IGZ3X3BhICYgflNCSV9NUFRfUEFH
RV9NQVNLOworCW1wdF9jdHJsLmZ3X3NpemUgPSBmd19lbmQgLSBtcHRfY3RybC5md19wYTsKKwor
CisJLyogUGVyLWhhcnQgU0RJRCBzY3JhdGNoIHNsb3Qg4oCUIGluaXRpYWxpc2UgYWxsIGhhcnRz
IHRvIElOVkFMSUQgKi8KKwltcHRfY3RybC5zZGlkX29mZnNldCA9IHNiaV9zY3JhdGNoX2FsbG9j
X29mZnNldChzaXplb2YodTMyKSk7CisJaWYgKCFtcHRfY3RybC5zZGlkX29mZnNldCkgeworCQlz
YmlfcHJpbnRmKCJzYmlfbXB0OiBzY3JhdGNoIGFsbG9jIGZvciBTRElEIGZhaWxlZFxuIik7CisJ
fQorCWVsc2UgeworCQlzYmlfZm9yX2VhY2hfaGFydGluZGV4KGkpIHsKKwkJCXMgPSBzYmlfaGFy
dGluZGV4X3RvX3NjcmF0Y2goaSk7CisJCQlpZiAocykgeworCQkJCXAgPSBzYmlfc2NyYXRjaF9v
ZmZzZXRfcHRyKHMsIG1wdF9jdHJsLnNkaWRfb2Zmc2V0KTsKKwkJCQkqcCA9IFNCSV9NUFRfU0RJ
RF9JTlZBTElEOworCQkJfQorCQl9CisJfQorCisJbXB0X2N0cmwucmVhZHkgPSB0cnVlOworCisJ
cmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWJ1ZyBkdW1wCisgKi8KK3ZvaWQgc2JpX21wdF9kdW1w
KHZvaWQpCit7CisJdTMyIHM7CisJdW5zaWduZWQgaW50IHI7CisJY29uc3Qgc3RydWN0IHNiaV9t
cHRfZG9tYWluICpkOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgY2F0Y2hhbGxfc2l6ZSA9IH4wVUwg
JiB+U0JJX01QVF9QQUdFX01BU0s7CisKKwlpZiAoIW1wdF9jdHJsLnJlYWR5KSB7CisJCXNiaV9w
cmludGYoInNiaV9tcHQ6IG5vdCBpbml0aWFsaXNlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlz
YmlfcHJpbnRmKCJzYmlfbXB0OiBtb2RlPSUtMTBzIFNESURMRU49JXUgbWF4X2RvbWFpbnM9JXVc
biIsIG1wdF9jdHJsLm1vZGUtPm5hbWUsCisJCSAgIG1wdF9jdHJsLnNkaWRfbGVuLCBtcHRfY3Ry
bC5tYXhfZG9tYWlucyk7CisJc2JpX3ByaW50Zigicm9vdF9zaXplPTB4JWx4IHJvb3RfYWxpZ249
MHglbHhcbiIsCisJCSAgIG1wdF9jdHJsLm1vZGUtPnJvb3RfdGFibGVfc2l6ZSgpLCBtcHRfY3Ry
bC5tb2RlLT5yb290X3RhYmxlX2FsaWduKCkpOworCXNiaV9wcmludGYoImZ3IDB4JTAxNmx4KzB4
JWx4ICBwb29sPWdsb2JhbCBoZWFwXG4iLAorCQkgICBtcHRfY3RybC5md19wYSwgbXB0X2N0cmwu
Zndfc2l6ZSk7CisJZm9yIChzID0gMDsgcyA8IG1wdF9jdHJsLm1heF9kb21haW5zOyBzKyspIHsK
KwkJYm9vbCBoYXNfYmFzZWxpbmUgPSBmYWxzZTsKKwkJdTggICBiYXNlbGluZV94d3IgPSBTQklf
TVBUX1BFUk1fTk9ORTsKKworCQlkID0gJm1wdF9jdHJsLmRvbWFpbnNbc107CisJCWlmICghZC0+
dmFsaWQpCisJCQljb250aW51ZTsKKwkJc2JpX3ByaW50ZigiU0RJRCAlMnUgcm9vdD0weCUwMTZs
eCByZWdpb25zPSV1IGRvbT0lc1xuIiwKKwkJCSAgIGQtPnNkaWQsIGQtPnJvb3RfcGEsIGQtPm5y
ZWdpb25zLCBkLT5zYmlfZG9tID8gZC0+c2JpX2RvbS0+bmFtZSA6ICIobm9uZSkiKTsKKwkJZm9y
IChyID0gMDsgciA8IGQtPm5yZWdpb25zOyByKyspIHsKKworCQkJaWYgKGQtPnJlZ2lvbnNbcl0u
cGEgPT0gMCAmJgorCQkJICAgIGQtPnJlZ2lvbnNbcl0uc2l6ZSA9PSBjYXRjaGFsbF9zaXplKSB7
CisJCQkJaGFzX2Jhc2VsaW5lID0gdHJ1ZTsKKwkJCQliYXNlbGluZV94d3IgPSBkLT5yZWdpb25z
W3JdLnh3cjsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc2JpX3ByaW50ZigiUy1Eb21haW4l
dSBSZWdpb24lMDJ1ICAgICAgICAgIDogMHglMDE2bHgrMHglLTE2bHg6IHh3cj0ldSAoJWMlYyVj
KSVzJXNcbiIsCisJCQkgICBkLT5zZGlkLCByLCBkLT5yZWdpb25zW3JdLnBhLAorCQkJICAgZC0+
cmVnaW9uc1tyXS5zaXplLAorCQkJICAgZC0+cmVnaW9uc1tyXS54d3IsCisJCQkgICAoZC0+cmVn
aW9uc1tyXS54d3IgJiBTQklfTVBUX1BFUk1fUikgPyAnUicgOiAnLScsCisJCQkgICAoZC0+cmVn
aW9uc1tyXS54d3IgJiBTQklfTVBUX1BFUk1fVykgPyAnVycgOiAnLScsCisJCQkgICAoZC0+cmVn
aW9uc1tyXS54d3IgJiBTQklfTVBUX1BFUk1fWCkgPyAnWCcgOiAnLScsCisJCQkgICBkLT5yZWdp
b25zW3JdLmxvY2tlZCA/ICIgW0xPQ0tFRF0iIDogIiIsCisJCQkgICBkLT5yZWdpb25zW3JdLnNo
YXJlZCA/ICIgW1NIQVJFRF0iIDogIiIpOworCQl9CisKKwkJaWYgKGhhc19iYXNlbGluZSkgewor
CQkJc2JpX3ByaW50ZigiUy1Eb21haW4ldSBEZWZhdWx0ICAgICAgICAgICA6ICUtMzdzOiB4d3I9
JXUgKCVjJWMlYykgICBbYmFzZWxpbmUsIG92ZXJsYXkgYnkgcmVnaW9ucyBhYm92ZV1cbiIsCisJ
CQkJICAgZC0+c2RpZCwgIlJlc3Qgb2YgdGhlIGFkZHJlc3Mgc3BhY2UiLAorCQkJCSAgIGJhc2Vs
aW5lX3h3ciwKKwkJCQkgICAoYmFzZWxpbmVfeHdyICYgU0JJX01QVF9QRVJNX1IpID8gJ1InIDog
Jy0nLAorCQkJCSAgIChiYXNlbGluZV94d3IgJiBTQklfTVBUX1BFUk1fVykgPyAnVycgOiAnLScs
CisJCQkJICAgKGJhc2VsaW5lX3h3ciAmIFNCSV9NUFRfUEVSTV9YKSA/ICdYJyA6ICctJyk7CisJ
CX0KKwkJZWxzZSB7CisJCQlzYmlfcHJpbnRmKCJTLURvbWFpbiV1ICAgICAgICAgICA6IHh3cj0w
ICgtLS0pICAgW25vIGJhc2VsaW5lIOKAlCB1bm1hcHBlZCBQQXMgZGVuaWVkXVxuIiwKKwkJCQkg
ICBkLT5zZGlkKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9zYmkvc2JpX21wdF9tb2Rl
LmMgYi9saWIvc2JpL3NiaV9tcHRfbW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwLi44YmFmODNhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zYmkvc2JpX21wdF9tb2Rl
LmMKQEAgLTAsMCArMSw5OTcgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMi1D
bGF1c2UKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjYgUXVhbGNvbW0gSW5jLgorICoKKyAqIEF1
dGhvcnM6IFJhaHVsIFBhdGhhayA8cmFodWwucGF0aGFrQG9zcy5xdWFsY29tbS5jb20+CisgKi8K
KworI2luY2x1ZGUgPHNiaS9zYmlfbXB0Lmg+CisjaW5jbHVkZSA8c2JpL3NiaV9lcnJvci5oPgor
I2luY2x1ZGUgPHNiaS9zYmlfc3RyaW5nLmg+CisjaW5jbHVkZSA8c2JpL3NiaV9jb25zb2xlLmg+
CisKKyNpZiBfX3Jpc2N2X3hsZW4gPT0gNjQKKworLyoKKyAqIFNtbXB0NDMgIOKAlCAgNDMtYml0
IHN1cGVydmlzb3IgcGh5c2ljYWwgYWRkcmVzcyAoU1BBKQorICogKy0tLS0tLS0tLSstLS0tLS0t
LS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLSsKKyAqIHwgIHBuWzJdICB8ICBwblsxXSAg
fCAgcG5bMF0gIHwgICAgcGkgICB8IG9mZnNldCB8CisgKiB8IFs0MjozNF0gfCBbMzM6MjVdIHwg
WzI0OjE2XSB8IFsxNToxMl0gfCBbMTE6MF0gfAorICogfCAgICA5YiAgIHwgICAgOWIgICB8ICAg
IDliICAgfCAgICA0YiAgIHwgIDEyYiAgIHwKKyAqICstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0t
LS0tLSstLS0tLS0tLS0rLS0tLS0tLS0rCisgKgorICogU21tcHQ1MiAg4oCUICA1Mi1iaXQgc3Vw
ZXJ2aXNvciBwaHlzaWNhbCBhZGRyZXNzIChTUEEpCisgKiArLS0tLS0tLS0tKy0tLS0tLS0tLSst
LS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLSsKKyAqIHwgIHBuWzNdICB8ICBw
blsyXSAgfCAgcG5bMV0gIHwgIHBuWzBdICB8ICAgIHBpICAgfCBvZmZzZXQgfAorICogfCBbNTE6
NDNdIHwgWzQyOjM0XSB8IFszMzoyNV0gfCBbMjQ6MTZdIHwgWzE1OjEyXSB8IFsxMTowXSB8Cisg
KiB8ICAgIDliICAgfCAgICA5YiAgIHwgICAgOWIgICB8ICAgIDliICAgfCAgICA0YiAgIHwgIDEy
YiAgIHwKKyAqICstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0t
LS0tKy0tLS0tLS0tKworICoKKyAqIFNtbXB0NjQgIOKAlCAgNjQtYml0IHN1cGVydmlzb3IgcGh5
c2ljYWwgYWRkcmVzcyAoU1BBKQorICogKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0t
LS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tKworICogfCAgcG5bNF0gIHwgIHBu
WzNdICB8ICBwblsyXSAgfCAgcG5bMV0gIHwgIHBuWzBdICB8ICAgIHBpICAgfCBvZmZzZXQgfAor
ICogfCBbNjM6NTJdIHwgWzUxOjQzXSB8IFs0MjozNF0gfCBbMzM6MjVdIHwgWzI0OjE2XSB8IFsx
NToxMl0gfCBbMTE6MF0gfAorICogfCAgIDEyYiAgIHwgICAgOWIgICB8ICAgIDliICAgfCAgICA5
YiAgIHwgICAgOWIgICB8ICAgIDRiICAgfCAgMTJiICAgfAorICogKy0tLS0tLS0tLSstLS0tLS0t
LS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tKworICoK
KyAqLworCisvKiBJbm50ZXIgZW50cmllcyBhcmUgTVBURXMgbm90IGluIHJvb3QgTVBUIHBhZ2Ug
Ki8KKyNkZWZpbmUgUlY2NF9JTk5FUl9FTlRSSUVTCQk1MTJVCisjZGVmaW5lIFJWNjRfTVBURV9T
SVpFCQkJOFVMCisjZGVmaW5lIFJWNjRfVEFCTEVfU0laRQkJCShSVjY0X0lOTkVSX0VOVFJJRVMg
KiBSVjY0X01QVEVfU0laRSkKKworLyogU21tcHQ2NCByb290OiA0MDk2IGVudHJpZXMgw5cgOEIg
PSAzMktCLCAzMktCIGFsaWduZWQgKi8KKyNkZWZpbmUgUlY2NF9ST09UX1NNTVBUNjRfRU5UUklF
Uwk0MDk2VQorI2RlZmluZSBSVjY0X1JPT1RfU01NUFQ2NF9TSVpFCQkoUlY2NF9ST09UX1NNTVBU
NjRfRU5UUklFUyAqIFJWNjRfTVBURV9TSVpFKQorCisjZGVmaW5lIFJWNjRfTlVNUEdJTlJBTkdF
CQk0VQorI2RlZmluZSBSVjY0X1BBR0VTX1BFUl9NUFRFCQkoMVUgPDwgUlY2NF9OVU1QR0lOUkFO
R0UpCisjZGVmaW5lIFJWNjRfUEFHRVNfUEVSX01QVEVfTUFTSwkoUlY2NF9QQUdFU19QRVJfTVBU
RSAtIDFVKQorI2RlZmluZSBSVjY0X0lOTkVSX1BOX0JJVFMJCTlVCisKKy8qIEJ5dGVzIGNvdmVy
ZWQgYnkgb25lIGNvbXBsZXRlIGxlYWYgdGFibGUgPSBwYWdlc19wZXJfbGVhZiDDlyBQQUdFX1NJ
WkUgKi8KKyNkZWZpbmUgUlY2NF9MRUFGX1JBTkdFCQkJKFJWNjRfUEFHRVNfUEVSX01QVEUgKiBT
QklfTVBUX1BBR0VfU0laRSkKKworLyoKKyAqIE5BUE9UIEc9NCBmb3IgU21tcHQ0MywgU21tcHQ1
MiBhbmQgU21tcHQ2NAorICoKKyAqIEc9NCBtZWFucyAyXihHKzEpPTMyIGNvbnRpZ3VvdXMgbGVh
ZiBtcHRlIHdoaWNoIGZvcm0gYSBOQVBPVCBncm91cC4KKyAqIEVhY2ggUlY2NCBsZWFmIE1QVEUg
Y292ZXJzIDY0S2lCIHNvIG9uZSBOQVBPVCBncm91cCBjb3ZlcnMgMk1pQi4KKyAqCisgKiBBbGwg
b3RoZXIgRyB2YWx1ZXMgYXBhcnQgZnJvbSA0IGFyZSByZXNlcnZlZC4KKyAqLworI2RlZmluZSBS
VjY0X05BUE9UX0cJCQk0VQorI2RlZmluZSBSVjY0X05BUE9UX0dfU0hJRlQJCTEyVQorI2RlZmlu
ZSBSVjY0X05BUE9UX01QVEVfQ09VTlQJCSgxVSA8PCAoUlY2NF9OQVBPVF9HICsgMSkpCisjZGVm
aW5lIFJWNjRfTkFQT1RfU0laRQkJCSgodW5zaWduZWQgbG9uZylSVjY0X05BUE9UX01QVEVfQ09V
TlQgKiBSVjY0X0xFQUZfUkFOR0UpCisjZGVmaW5lIFJWNjRfTkFQT1RfUE4wX0FMSUdOCQlSVjY0
X05BUE9UX01QVEVfQ09VTlQKKworLyoKKyAqIFN3aXRoIHRvIGRpc2FibGUgTkFQT1QgY29tcGFj
dGlvbiBvZiBNUFRFIGVudHJpZXMgd2hpbGUgd3JpdGluZy4KKyAqLworI2RlZmluZSBSVjY0X05B
UE9UX0RJU0FCTEUJMAorCisvKgorICogU3VwZXJ2aXNvciBQaHlzdWNhbCBhZGRyZXNzIGZpZWxk
cyBleHRyYWN0aW9uCisgKi8KKworLyoKKyAqIHJ2NjRfdGFibGVfaWR4KCkg4oCUIGV4dHJhY3Qg
cG5bbGV2ZWxdIGZyb20gYSBTUEEuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJ2NjRfdGFibGVf
aWR4KHVuc2lnbmVkIGxvbmcgcGEsIHUzMiBsZXZlbCwKKwkJCSAgY29uc3Qgc3RydWN0IHNiaV9t
cHRfbW9kZSAqc2NoKQoreworCXUzMiBzaGlmdCA9IDE2ICsgbGV2ZWwgKiA5OworCXUzMiBtYXNr
ID0gKHNjaC0+bW9kZV92YWwgPT0gU0JJX01NUFRfTU9ERV9TTU1QVDY0ICYmIGxldmVsID09IDQp
ID8gMHhGRkYgOiAweDFGRjsKKworCXJldHVybiAoKHBhID4+IHNoaWZ0KSAmIG1hc2spOworfQor
CisvKgorICogcnY2NF90dXBsZV9pZHhfc2hpZnQoKSDigJQgWFdSIHR1cGxlIGluZGV4IHNoaWZ0
IGF0IGxldmVsIGkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJ2NjRfdHVwbGVfaWR4X3NoaWZ0
KHUzMiBsZXZlbCkKK3sKKwlyZXR1cm4gKFNCSV9NUFRfUEFHRV9TSElGVCArIGxldmVsICogUlY2
NF9JTk5FUl9QTl9CSVRTKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcnY2NF90dXBsZV9pZHgo
dW5zaWduZWQgbG9uZyBwYSwgdTMyIGxldmVsKQoreworCXJldHVybiAoKHBhID4+IHJ2NjRfdHVw
bGVfaWR4X3NoaWZ0KGxldmVsKSkgJiBSVjY0X1BBR0VTX1BFUl9NUFRFX01BU0spOworfQorCisv
KgorICogcnY2NF9tcHRlX3JhbmdlKCkg4oCUIGJ5dGVzIGNvdmVyZWQgYnkgb25lIE1QVEUgYXQg
bGV2ZWwgTC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJ2NjRfbXB0ZV9yYW5n
ZSh1MzIgbGV2ZWwpCit7CisJcmV0dXJuIFJWNjRfTEVBRl9SQU5HRSA8PCAobGV2ZWwgKiBSVjY0
X0lOTkVSX1BOX0JJVFMpOworfQorCisvKgorICogUlY2NCBNUFRFIFJlYWQvV3JpdGUgZnVuY3Rp
b25zCisgKi8KKworc3RhdGljIGlubGluZSB1NjQgcnY2NF9yZWFkX21wdGUodW5zaWduZWQgbG9u
ZyBwYSkKK3sKKwlyZXR1cm4gKih2b2xhdGlsZSB1NjQgKilwYTsKK30KKworc3RhdGljIGlubGlu
ZSB2b2lkIHJ2NjRfd3JpdGVfbXB0ZSh1bnNpZ25lZCBsb25nIHBhLCB1NjQgdikKK3sKKwkqKHZv
bGF0aWxlIHU2NCAqKXBhID0gdjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJ2
NjRfbXB0ZV9wYSh1bnNpZ25lZCBsb25nIHRhYmxlX3BhLCB1MzIgaWR4KQoreworCXJldHVybiAo
dGFibGVfcGEgKyBpZHggKiBSVjY0X01QVEVfU0laRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5z
aWduZWQgbG9uZyBydjY0X25leHRfdGFibGVfcGEodTY0IG1wdGUpCit7CisJcmV0dXJuICh1bnNp
Z25lZCBsb25nKSgodTY0KShtcHRlID4+IFNCSV9NUFRFX1BQTl9TSElGVCkgPDwgU0JJX01QVF9Q
QUdFX1NISUZUKTsKK30KKworLyoKKyAqIEdlbmVyYXRlIE5hcG90IExlYWYgTVBURQorICoKKyAq
IENvbnN0cnVjdHMgb25lIE1QVEUgdmFsdWUgdXNlZCBmb3IgYWxsCisgKiBSVjY0X05BUE9UX01Q
VEVfQ09VTlQgZW50cmllcyBpbiBhIE5BUE9UIGdyb3VwLgorICoKKyAqIEFsbCBNUFRFcyBpbiB0
aGUgZ3JvdXAgYXJlIGlkZW50aWNhbAorICovCitzdGF0aWMgaW5saW5lIHU2NCBydjY0X25hcG90
X2xlYWZfbXB0ZSh1OCB4d3IpCit7CisJdTY0IG1wdGUgPSBTQklfTVBURV9WIHwgU0JJX01QVEVf
TCB8IFNCSV9NUFRFX047CisKKwltcHRlID0gc2JpX21wdGVfbGVhZl9zZXRfeHdyKG1wdGUsIDAs
IHh3cik7CisJbXB0ZSB8PSAoKHU2NClSVjY0X05BUE9UX0cgPDwgUlY2NF9OQVBPVF9HX1NISUZU
KTsKKworCXJldHVybiBtcHRlOworfQorCisvKgorICogcnY2NF9uYXBvdF9sZWFmX3h3cigpIOKA
lCByZWNvdmVyIHRoZSB1bmlmb3JtIFhXUiBmcm9tIGEgTkFQT1QgbGVhZi4KKyAqLworc3RhdGlj
IGlubGluZSB1OCBydjY0X25hcG90X2xlYWZfeHdyKHU2NCBtcHRlKQoreworCXJldHVybiAoKG1w
dGUgPj4gU0JJX01QVEVfWFdSX0JBU0UpICYgU0JJX01QVEVfWFdSX01BU0spOworfQorCisvKgor
ICogcnY2NF9uYXBvdF9kZW1vdGUoKSDigJQgQ29udmVydCBhIE5hcG90IE1QVEUgZ3JvdXAgaW50
byBSVjY0X05BUE9UX01QVEVfQ09VTlQKKyAqIG5vcm1hbChOb24tTmFwb3QpIE1QVEUgY2Fycnlp
bmcgdGhlIFNBTUUgcGVybWlzc2lvbi4KKyAqCisgKiBsZWFmX21wdGVfcGEgaXMgYW55IGxlYWYg
bXB0ZSBwYSBmcm9tIHRoZSBOYXBvdCBncm91cAorICovCitzdGF0aWMgdm9pZCBydjY0X25hcG90
X2RlbW90ZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwKKwkJCSAgICAgIHVuc2lnbmVkIGxv
bmcgbGVhZl9tcHRlX3BhLCB1bnNpZ25lZCBsb25nIHBhKQoreworCXU4IHh3cjsKKwl1MzIgcG4w
LCBwZywgaTsKKwl1NjQgbGVhZjsKKwl1bnNpZ25lZCBsb25nIGdycF9iYXNlOworCisJeHdyID0g
cnY2NF9uYXBvdF9sZWFmX3h3cihydjY0X3JlYWRfbXB0ZShsZWFmX21wdGVfcGEpKTsKKwlwbjAg
PSBydjY0X3RhYmxlX2lkeChwYSwgMCwgZG9tLT5tb2RlKTsKKwlncnBfYmFzZSA9IGxlYWZfbXB0
ZV9wYSAtIChwbjAgJiAoUlY2NF9OQVBPVF9NUFRFX0NPVU5UIC0gMSkpICogUlY2NF9NUFRFX1NJ
WkU7CisJbGVhZiA9IFNCSV9NUFRFX1YgfCBTQklfTVBURV9MOworCisJZm9yIChwZyA9IDA7IHBn
IDwgUlY2NF9QQUdFU19QRVJfTVBURTsgcGcrKykKKwkJbGVhZiA9IHNiaV9tcHRlX2xlYWZfc2V0
X3h3cihsZWFmLCBwZywgeHdyKTsKKworCWZvciAoaSA9IDA7IGkgPCBSVjY0X05BUE9UX01QVEVf
Q09VTlQ7IGkrKykKKwkJcnY2NF93cml0ZV9tcHRlKGdycF9iYXNlICsgaSAqIFJWNjRfTVBURV9T
SVpFLCBsZWFmKTsKK30KKworLyoKKyAqIE1QVCB0YWJsZSBiZXN0LWxldmVsIHNlbGVjdGlvbgor
ICoKKyAqIFJldHVybnMgdGhlIGhpZ2hlc3QgbGV2ZWwgYXQgd2hpY2ggdGhlIHJhbmdlIFtwYSwg
cGErc2l6ZV0gY2FuIGJlCisgKiBjb3ZlcmVkIGJ5IGEgc2luZ2xlIGxlYWYgTVBURS4gTGV2ZWwg
MCBpcyBhbHdheXMgdmFsaWQgYmVjYXVzZSB0aGF0cworICogdGhlIGxhc3QgcmVzb3J0LgorICov
CitzdGF0aWMgdTMyIHJ2NjRfYmVzdF9sZXZlbCh1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBs
b25nIHNpemUsCisJCQkgICB1MzIgdG9wX2xldmVsKQoreworCXUzMiBsdmw7CisJdW5zaWduZWQg
bG9uZyByYW5nZTsKKworCWZvciAobHZsID0gdG9wX2xldmVsOyBsdmwgPj0gMTsgbHZsLS0pIHsK
KwkJcmFuZ2UgPSBydjY0X21wdGVfcmFuZ2UobHZsKTsKKworCQlpZiAoc2l6ZSA+PSByYW5nZSAm
JiAocGEgJiAocmFuZ2UgLSAxKSkgPT0gMCkKKwkJCXJldHVybiBsdmw7CisJfQorCXJldHVybiAw
OworfQorCisvKgorICogR2VuZXJpYyBOLWxldmVsIHdhbGsgd2l0aCBsYXp5IHRhYmxlIGFsbG9j
YXRpb24KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnY2NF9zcGxpdF9sZWFmKHVuc2lnbmVk
IGxvbmcgcGFyZW50X2VwKQoreworCXU2NCBwYXJlbnQgPSBydjY0X3JlYWRfbXB0ZShwYXJlbnRf
ZXApOworCXVuc2lnbmVkIGxvbmcgc3ViOworCXUzMiBqLCBwZywgc2g7CisJdTggeHdyOworCXU2
NCBjaGlsZDsKKworCXN1YiA9IHNiaV9tcHRfcG9vbF9hbGxvYyhSVjY0X1RBQkxFX1NJWkUsIFNC
SV9NUFRfUEFHRV9TSVpFKTsKKwlpZiAoIXN1YikKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGogPSAw
OyBqIDwgUlY2NF9JTk5FUl9FTlRSSUVTOyBqKyspIHsKKwkJc2ggPSBzYmlfbXB0ZV94d3Jfc2hp
ZnQoaiA+PiA1KTsKKwkJeHdyID0gKCgodW5zaWduZWQgbG9uZylwYXJlbnQgPj4gc2gpICYgU0JJ
X01QVEVfWFdSX01BU0spOworCQljaGlsZCA9IFNCSV9NUFRFX1YgfCBTQklfTVBURV9MOyAvKiBO
PTAgdW5pZm9ybSBsZWFmICovCisKKwkJZm9yIChwZyA9IDA7IHBnIDwgUlY2NF9QQUdFU19QRVJf
TVBURTsgcGcrKykKKwkJCWNoaWxkID0gc2JpX21wdGVfbGVhZl9zZXRfeHdyKGNoaWxkLCBwZywg
eHdyKTsKKworCQlydjY0X3dyaXRlX21wdGUoc3ViICsgaiAqIFJWNjRfTVBURV9TSVpFLCBjaGls
ZCk7CisJfQorCisJLyogcGFyZW50IGxlYWYgLT4gbm9uLWxlYWYgcG9pbnRlciB0byBNUFQgc3Vi
IHRhYmxlLiAqLworCXJ2NjRfd3JpdGVfbXB0ZShwYXJlbnRfZXAsIHNiaV9tcHRlX25vbmxlYWYo
c3ViKSk7CisKKwlyZXR1cm4gc3ViOworfQorCisvKgorICogV2FsayBhIE1QVCB0YWJsZSBhbmQg
cmV0dXJuIE1QVEUgUEEgYW5kIGl0cyBzdWl0YWJsZSBsZXZlbAorICovCitzdGF0aWMgdW5zaWdu
ZWQgbG9uZyBydjY0X3dhbGtfYWxsb2Moc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sCisJCQkJ
ICAgICB1bnNpZ25lZCBsb25nIHBhLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJ
CSAgICAgdTMyICpvdXRfbGV2ZWwsCisJCQkJICAgICB1MzIgdG9wX2xldmVsKQoreworCXUzMiBs
dmwsIGlkeDsKKwl1NjQgbXB0ZTsKKwl1bnNpZ25lZCBsb25nIGVwLCBzdWIsIG5ld19wYTsKKwlj
b25zdCBzdHJ1Y3Qgc2JpX21wdF9tb2RlICpzY2ggPSBkb20tPm1vZGU7CisJdW5zaWduZWQgbG9u
ZyB0YWJsZV9wYSA9IGRvbS0+cm9vdF9wYTsKKwl1MzIgYmVzdF9sdmwgPSBydjY0X2Jlc3RfbGV2
ZWwocGEsIHNpemUsIHRvcF9sZXZlbCk7CisKKworCWZvciAobHZsID0gdG9wX2xldmVsOyBsdmwg
Pj0gMTsgbHZsLS0pIHsKKwkJaWR4ID0gcnY2NF90YWJsZV9pZHgocGEsIGx2bCwgc2NoKTsKKwkJ
ZXAgPSBydjY0X21wdGVfcGEodGFibGVfcGEsIGlkeCk7CisJCW1wdGUgPSBydjY0X3JlYWRfbXB0
ZShlcCk7CisKKwkJaWYgKG1wdGUgJiBTQklfTVBURV9MKSB7CisJCQlpZiAobHZsID4gYmVzdF9s
dmwpIHsKKwkJCQlzdWIgPSBydjY0X3NwbGl0X2xlYWYoZXApOworCQkJCWlmICghc3ViKQorCQkJ
CQlyZXR1cm4gMDsKKworCQkJCXRhYmxlX3BhID0gc3ViOworCQkJCWNvbnRpbnVlOworCQkJfQor
CisJCQkqb3V0X2xldmVsID0gbHZsOworCQkJcmV0dXJuIGVwOworCQl9CisKKwkJaWYgKCEobXB0
ZSAmIFNCSV9NUFRFX1YpKSB7CisJCQlpZiAobHZsIDw9IGJlc3RfbHZsKSB7CisJCQkJKm91dF9s
ZXZlbCA9IGx2bDsKKwkJCQlyZXR1cm4gZXA7CisJCQl9CisJCQkvKiBBbGxvY2F0ZSBpbm5lciB0
YWJsZSAoYWx3YXlzIDRLaUIsIGFsbCBsZXZlbHMsIGFsbCBtb2RlcykgKi8KKwkJCW5ld19wYSA9
IHNiaV9tcHRfcG9vbF9hbGxvYyhSVjY0X1RBQkxFX1NJWkUsCisJCQkJCQkgICAgU0JJX01QVF9Q
QUdFX1NJWkUpOworCQkJaWYgKCFuZXdfcGEpCisJCQkJcmV0dXJuIDA7CisKKwkJCXJ2NjRfd3Jp
dGVfbXB0ZShlcCwgKHU2NClzYmlfbXB0ZV9ub25sZWFmKG5ld19wYSkpOworCQkJdGFibGVfcGEg
PSBuZXdfcGE7CisJCX0KKwkJZWxzZSB7CisJCQl0YWJsZV9wYSA9IHJ2NjRfbmV4dF90YWJsZV9w
YShtcHRlKTsKKwkJfQorCX0KKworCSpvdXRfbGV2ZWwgPSAwOworCisJcmV0dXJuIHJ2NjRfbXB0
ZV9wYSh0YWJsZV9wYSwgcnY2NF90YWJsZV9pZHgocGEsIDAsIHNjaCkpOworfQorCisvKgorICog
R2VuZXJpYyBtYXBfcmFuZ2Ug4oCUIHNoYXJlZCBieSBTbW1wdDQzLCBTbW1wdDUyLCBTbW1wdDY0
CisgKgorICogTWFwcyBhIHJhbmdlIFtwYSwgcGErc2l6ZV0gaW4gdGhlIE1QVCB0YWJsZQorICov
CitzdGF0aWMgaW50IF9fcnY2NF9tYXBfcmFuZ2Uoc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20s
CisJCQkgICAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICAgIHU4
IHh3ciwgdTMyIHRvcF9sZXZlbCkKK3sKKwl1bnNpZ25lZCBsb25nIGN1ciA9IHBhOworCXVuc2ln
bmVkIGxvbmcgZW5kID0gcGEgKyBzaXplOworCXVuc2lnbmVkIGxvbmcgbGVhZl9tcHRlX3BhLCBt
cHRlX3JhbmdlLCBtcHRlX2Jhc2UsIG1wdGVfZW5kLCBiYXRjaF9lbmQ7CisJdTMyIGxldmVsLCBw
bjAsIGksIHBnX2ZpcnN0LCBwZ19sYXN0LCBwZzsKKwl1NjQgbmFwb3QsIG1wdGU7CisKKwl3aGls
ZSAoY3VyIDwgZW5kKSB7CisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSByZWdpb24gcXVhbGlmaWVz
IGZvciBOQVBPVCByYW5nZSBhbmQgdGhlCisJCSAqIHJlZ2lvbiBpcyBjb250YWluZWQKKwkJICov
CisJCWlmICgoY3VyICYgKFJWNjRfTkFQT1RfU0laRSAtIDEpKSA9PSAwICYmCisJCQkJY3VyICsg
UlY2NF9OQVBPVF9TSVpFID4gY3VyICYmCisJCQkJY3VyICsgUlY2NF9OQVBPVF9TSVpFIDw9IGVu
ZCkgeworCQkJbGVhZl9tcHRlX3BhID0gcnY2NF93YWxrX2FsbG9jKGRvbSwgY3VyLCBlbmQgLSBj
dXIsICZsZXZlbCwgdG9wX2xldmVsKTsKKwkJCWlmICghbGVhZl9tcHRlX3BhKQorCQkJCXJldHVy
biBTQklfRU5PTUVNOworCisJCQlwbjAgPSBydjY0X3RhYmxlX2lkeChjdXIsIDAsIGRvbS0+bW9k
ZSk7CisKKwkJCWlmICghUlY2NF9OQVBPVF9ESVNBQkxFICYmIGxldmVsID09IDAgJiYgKHBuMCAm
IChSVjY0X05BUE9UX1BOMF9BTElHTiAtIDEpKSA9PSAwKSB7CisJCQkJbmFwb3QgPSBydjY0X25h
cG90X2xlYWZfbXB0ZSh4d3IpOworCisJCQkJZm9yIChpID0gMDsgaSA8IFJWNjRfTkFQT1RfTVBU
RV9DT1VOVDsgaSsrKQorCQkJCQlydjY0X3dyaXRlX21wdGUobGVhZl9tcHRlX3BhICsgaSAqIFJW
NjRfTVBURV9TSVpFLCBuYXBvdCk7CisKKwkJCQljdXIgKz0gUlY2NF9OQVBPVF9TSVpFOworCQkJ
CWNvbnRpbnVlOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJbGVhZl9tcHRlX3BhID0gcnY2NF93
YWxrX2FsbG9jKGRvbSwgY3VyLCBlbmQgLSBjdXIsICZsZXZlbCwgdG9wX2xldmVsKTsKKwkJCWlm
ICghbGVhZl9tcHRlX3BhKQorCQkJCXJldHVybiBTQklfRU5PTUVNOworCQl9CisKKwkJLyogTm9y
bWFsIHBhdGggKi8KKwkJbXB0ZV9yYW5nZSA9IHJ2NjRfbXB0ZV9yYW5nZShsZXZlbCk7CisJCXBn
X2ZpcnN0ID0gcnY2NF90dXBsZV9pZHgoY3VyLCBsZXZlbCk7CisJCW1wdGVfYmFzZSA9IGN1ciAm
IH4obXB0ZV9yYW5nZSAtIDEpOworCisJCW1wdGVfZW5kID0gbXB0ZV9iYXNlICsgbXB0ZV9yYW5n
ZTsKKwkJaWYgKG1wdGVfZW5kIDwgbXB0ZV9iYXNlKQorCQkJbXB0ZV9lbmQgPSB+MFVMOworCisJ
CWJhdGNoX2VuZCA9IChlbmQgPCBtcHRlX2VuZCkgPyBlbmQgOiBtcHRlX2VuZDsKKwkJcGdfbGFz
dCA9IHJ2NjRfdHVwbGVfaWR4KGJhdGNoX2VuZCAtIFNCSV9NUFRfUEFHRV9TSVpFLCBsZXZlbCk7
CisKKwkJLyoKKwkJKiBJZiB0aGlzIGxldmVsLTAgTVBURSBpcyBhIE5hcG90IG1lbWJlciwgZXhw
YW5kIHRoZQorCQkqIHdob2xlIG5hdHVyYWxseS1hbGlnbmVkIGdyb3VwIHRvIHBsYWluIGxlYXZl
cyBhbmQgd3JpdGUgc2FtZQorCQkqIHBlcm1pc3Npb25zIHh3cgorCQkqLworCQltcHRlID0gcnY2
NF9yZWFkX21wdGUobGVhZl9tcHRlX3BhKTsKKwkJaWYgKGxldmVsID09IDAgJiYgKG1wdGUgJiAo
dTY0KVNCSV9NUFRFX04pKSB7CisJCQlydjY0X25hcG90X2RlbW90ZShkb20sIGxlYWZfbXB0ZV9w
YSwgY3VyKTsKKwkJCXNiaV9tcHRfZmVuY2Vfc2RpZChkb20tPnNkaWQpOworCQkJbXB0ZSA9IHJ2
NjRfcmVhZF9tcHRlKGxlYWZfbXB0ZV9wYSk7CisJCX0KKworCQlpZiAoIShtcHRlICYgKHU2NCko
U0JJX01QVEVfViB8IFNCSV9NUFRFX0wpKSkKKwkJCW1wdGUgPSAodTY0KShTQklfTVBURV9WIHwg
U0JJX01QVEVfTCk7CisKKwkJZm9yIChwZyA9IHBnX2ZpcnN0OyBwZyA8PSBwZ19sYXN0OyBwZysr
KQorCQkJbXB0ZSA9IHNiaV9tcHRlX2xlYWZfc2V0X3h3cihtcHRlLCBwZywgeHdyKTsKKworCQly
djY0X3dyaXRlX21wdGUobGVhZl9tcHRlX3BhLCBtcHRlKTsKKworCQljdXIgPSBiYXRjaF9lbmQ7
CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXItbW9kZSBtbXB0IGVuY29kaW5nCisg
Ki8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQ0M19lbmNvZGVfbW1wdCh1bnNpZ25lZCBs
b25nIHBwbiwgdTMyIHNkaWQpCit7CisJcmV0dXJuIHNiaV9tbXB0X2VuY29kZShTQklfTU1QVF9N
T0RFX1NNTVBUNDMsIHNkaWQsIHBwbik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNtbXB0
NTJfZW5jb2RlX21tcHQodW5zaWduZWQgbG9uZyBwcG4sIHUzMiBzZGlkKQoreworCXJldHVybiBz
YmlfbW1wdF9lbmNvZGUoU0JJX01NUFRfTU9ERV9TTU1QVDUyLCBzZGlkLCBwcG4pOworfQorCitz
dGF0aWMgdW5zaWduZWQgbG9uZyBzbW1wdDY0X2VuY29kZV9tbXB0KHVuc2lnbmVkIGxvbmcgcHBu
LCB1MzIgc2RpZCkKK3sKKwlyZXR1cm4gc2JpX21tcHRfZW5jb2RlKFNCSV9NTVBUX01PREVfU01N
UFQ2NCwgc2RpZCwgcHBuKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQ0M19yb290
X3RhYmxlX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gUlY2NF9UQUJMRV9TSVpFOworfQorCitzdGF0
aWMgdW5zaWduZWQgbG9uZyBzbW1wdDQzX3Jvb3RfdGFibGVfYWxpZ24odm9pZCkKK3sKKwlyZXR1
cm4gU0JJX01QVF9QQUdFX1NJWkU7Cit9CisKK3N0YXRpYyBib29sIHNtbXB0NDNfcGFfaW5fcmFu
Z2UodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxv
bmcgcGFfbWF4ID0gMVVMIDw8IDQzOworCisJcmV0dXJuIChwYSA8IHBhX21heCAmJiBzaXplIDw9
IHBhX21heCAtIHBhKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQ1Ml9yb290X3Rh
YmxlX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gUlY2NF9UQUJMRV9TSVpFOworfQorCitzdGF0aWMg
dW5zaWduZWQgbG9uZyBzbW1wdDUyX3Jvb3RfdGFibGVfYWxpZ24odm9pZCkKK3sKKwlyZXR1cm4g
U0JJX01QVF9QQUdFX1NJWkU7Cit9CisKK3N0YXRpYyBib29sIHNtbXB0NTJfcGFfaW5fcmFuZ2Uo
dW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcg
cGFfbWF4ID0gMVVMIDw8IDUyOworCisJcmV0dXJuIChwYSA8IHBhX21heCAmJiBzaXplIDw9IHBh
X21heCAtIHBhKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQ2NF9yb290X3RhYmxl
X3NpemUodm9pZCkKK3sKKwlyZXR1cm4gUlY2NF9ST09UX1NNTVBUNjRfU0laRTsKK30KKworc3Rh
dGljIHVuc2lnbmVkIGxvbmcgc21tcHQ2NF9yb290X3RhYmxlX2FsaWduKHZvaWQpCit7CisJcmV0
dXJuIFJWNjRfUk9PVF9TTU1QVDY0X1NJWkU7Cit9CisKK3N0YXRpYyBib29sIHNtbXB0NjRfcGFf
aW5fcmFuZ2UodW5zaWduZWQgbG9uZyBwYSwKKwkJCQl1bnNpZ25lZCBsb25nIHNpemUpCit7CisJ
LyoKKwkgKiBTbW1wdDY0IGNvdmVycyB0aGUgZnVsbCA2NC1iaXQgUEEgc3BhY2UuCisJICovCisJ
cmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBQZXItbW9kZSBtYXBfcmFuZ2Ugd3JhcHBlcnMKKyAq
CisgKiBTbW1wdDQzOgorICogUm9vdCBsZXZlbCAyLCA5LWJpdCwgIDUxMiBlbnRyaWVzLCAgNEtp
QiByb290IE1QVCBzaXplCisgKgorICogU21tcHQ1MjoKKyAqIFJvb3QgbGV2ZWwgMywgOS1iaXQs
ICA1MTIgZW50cmllcywgIDRLaUIgcm9vdCBNUFQgc2l6ZQorICoKKyAqIFNtbXB0NjQ6CisgKiBS
b290IGxldmVsIDQsIDEyLWJpdCwgNDA5NiBlbnRyaWVzLCAzMktpQiByb290IE1QVCBzaXplCisg
Ki8KKworc3RhdGljIGludCBzbW1wdDQzX21hcF9yYW5nZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4g
KmRvbSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCB4
d3IpCit7CisJcmV0dXJuIF9fcnY2NF9tYXBfcmFuZ2UoZG9tLCBwYSwgc2l6ZSwgeHdyLCAyKTsK
K30KKworc3RhdGljIGludCBzbW1wdDUyX21hcF9yYW5nZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4g
KmRvbSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCB4
d3IpCit7CisJcmV0dXJuIF9fcnY2NF9tYXBfcmFuZ2UoZG9tLCBwYSwgc2l6ZSwgeHdyLCAzKTsK
K30KKworc3RhdGljIGludCBzbW1wdDY0X21hcF9yYW5nZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4g
KmRvbSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCB4
d3IpCit7CisJcmV0dXJuIF9fcnY2NF9tYXBfcmFuZ2UoZG9tLCBwYSwgc2l6ZSwgeHdyLCA0KTsK
K30KKworLyoKKyAqIF9fcnY2NF9tYXBfZnVsbF9yYW5nZSgpIOKAlCBXcml0ZSBldmVyeSBNUFRF
IGF0IFJvb3QgTVBUCisgKgorICogV3JpdGVzIHh3ciBpbnRvIGV2ZXJ5IHJvb3QgdGFibGUgTVBU
RSBkaXJlY3RseSBhcyBhIGxlYWYKKyAqIHN1cGVycGFnZSBjb3ZlcmluZyB0aGUgbW9kZSBlbnRp
cmUgYWRkcmVzc2FibGUgUEEgcmFuZ2UuCisgKiBObyBpbnRlcm1pZGlhdGUgTVBUIHRhYmxlcyBh
bGxvY2F0ZWQganVzdCBhbGwgbGVhZiBNUFRFcyBhdAorICogcm9vdCBsZXZlbC4KKyAqLworCitz
dGF0aWMgaW50IF9fcnY2NF9tYXBfZnVsbF9yYW5nZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRv
bSwgdTggeHdyLAorCQkJCSB1bnNpZ25lZCBsb25nIHJvb3RfZW50cmllcykKK3sKKwl1MzIgcGc7
CisJdW5zaWduZWQgbG9uZyBpOworCXU2NCBtcHRlID0gU0JJX01QVEVfViB8IFNCSV9NUFRFX0w7
CisKKwlmb3IgKHBnID0gMDsgcGcgPCBSVjY0X1BBR0VTX1BFUl9NUFRFOyBwZysrKQorCQltcHRl
ID0gc2JpX21wdGVfbGVhZl9zZXRfeHdyKG1wdGUsIHBnLCB4d3IpOworCisJZm9yIChpID0gMDsg
aSA8IHJvb3RfZW50cmllczsgaSsrKQorCQlydjY0X3dyaXRlX21wdGUocnY2NF9tcHRlX3BhKGRv
bS0+cm9vdF9wYSwgaSksIG1wdGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21t
cHQ0M19tYXBfZnVsbF9yYW5nZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwgdTggeHdyKQor
eworCXJldHVybiBfX3J2NjRfbWFwX2Z1bGxfcmFuZ2UoZG9tLCB4d3IsIFJWNjRfSU5ORVJfRU5U
UklFUyk7Cit9CisKK3N0YXRpYyBpbnQgc21tcHQ1Ml9tYXBfZnVsbF9yYW5nZShzdHJ1Y3Qgc2Jp
X21wdF9kb21haW4gKmRvbSwgdTggeHdyKQoreworCXJldHVybiBfX3J2NjRfbWFwX2Z1bGxfcmFu
Z2UoZG9tLCB4d3IsIFJWNjRfSU5ORVJfRU5UUklFUyk7Cit9CisKK3N0YXRpYyBpbnQgc21tcHQ2
NF9tYXBfZnVsbF9yYW5nZShzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwgdTggeHdyKQorewor
CXJldHVybiBfX3J2NjRfbWFwX2Z1bGxfcmFuZ2UoZG9tLCB4d3IsIFJWNjRfUk9PVF9TTU1QVDY0
X0VOVFJJRVMpOworfQorCisvKgorICogR2V0IHRoZSBhY2Nlc3MgcGVybWlzc2lvbnMoeHdyKSBv
ZiBhIFBBCisgKi8KK3N0YXRpYyB1OCBfX3J2NjRfZ2V0X3h3cihzdHJ1Y3Qgc2JpX21wdF9kb21h
aW4gKmRvbSwgdW5zaWduZWQgbG9uZyBwYSwKKwkJCSB1MzIgdG9wX2xldmVsKQoreworCWNvbnN0
IHN0cnVjdCBzYmlfbXB0X21vZGUgKnNjaCA9IGRvbS0+bW9kZTsKKwl1bnNpZ25lZCBsb25nIHRh
YmxlX3BhID0gZG9tLT5yb290X3BhOworCXUzMiBsZXZlbCwgaWR4LCBwaTsKKwl1NjQgbXB0ZTsK
KworCWZvciAobGV2ZWwgPSB0b3BfbGV2ZWw7IDsgbGV2ZWwtLSkgeworCQlpZHggPSBydjY0X3Rh
YmxlX2lkeChwYSwgbGV2ZWwsIHNjaCk7CisJCW1wdGUgPSBydjY0X3JlYWRfbXB0ZShydjY0X21w
dGVfcGEodGFibGVfcGEsIGlkeCkpOworCisJCWlmICghKG1wdGUgJiBTQklfTVBURV9WKSkKKwkJ
CXJldHVybiBTQklfTVBUX1BFUk1fTk9ORTsKKworCQlpZiAoIShtcHRlICYgU0JJX01QVEVfTCkg
JiYgKG1wdGUgJiBTQklfTVBURV9OKSkKKwkJCXJldHVybiBTQklfTVBUX1BFUk1fTk9ORTsKKwor
CQlpZiAobXB0ZSAmIFNCSV9NUFRFX0wpIHsKKwkJCWlmIChtcHRlICYgU0JJX01QVEVfTikKKwkJ
CQlyZXR1cm4gcnY2NF9uYXBvdF9sZWFmX3h3cihtcHRlKTsKKworCQkJcGkgPSBydjY0X3R1cGxl
X2lkeChwYSwgbGV2ZWwpOworCisJCQlyZXR1cm4gKG1wdGUgPj4gc2JpX21wdGVfeHdyX3NoaWZ0
KHBpKSkgJiBTQklfTVBURV9YV1JfTUFTSzsKKwkJfQorCisJCWlmIChsZXZlbCA9PSAwKQorCQkJ
cmV0dXJuIFNCSV9NUFRfUEVSTV9OT05FOworCisJCXRhYmxlX3BhID0gcnY2NF9uZXh0X3RhYmxl
X3BhKG1wdGUpOworCX0KKworCXJldHVybiBTQklfTVBUX1BFUk1fTk9ORTsKK30KKworc3RhdGlj
IHU4IHNtbXB0NDNfZ2V0X3h3cihzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwgdW5zaWduZWQg
bG9uZyBwYSkKK3sKKwlyZXR1cm4gX19ydjY0X2dldF94d3IoZG9tLCBwYSwgMik7Cit9CisKK3N0
YXRpYyB1OCBzbW1wdDUyX2dldF94d3Ioc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sIHVuc2ln
bmVkIGxvbmcgcGEpCit7CisJcmV0dXJuIF9fcnY2NF9nZXRfeHdyKGRvbSwgcGEsIDMpOworfQor
CitzdGF0aWMgdTggc21tcHQ2NF9nZXRfeHdyKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1
bnNpZ25lZCBsb25nIHBhKQoreworCXJldHVybiBfX3J2NjRfZ2V0X3h3cihkb20sIHBhLCA0KTsK
K30KKworc3RydWN0IHNiaV9tcHRfbW9kZSBzbW1wdDQzX21vZGUgPSB7CisJLm5hbWUJCQk9ICJT
bW1wdDQzIiwKKwkubW9kZV92YWwJCT0gU0JJX01NUFRfTU9ERV9TTU1QVDQzLAorCS5lbmNvZGVf
bW1wdAkJPSBzbW1wdDQzX2VuY29kZV9tbXB0LAorCS5tYXBfcmFuZ2UJCT0gc21tcHQ0M19tYXBf
cmFuZ2UsCisJLnJvb3RfdGFibGVfc2l6ZQk9IHNtbXB0NDNfcm9vdF90YWJsZV9zaXplLAorCS5y
b290X3RhYmxlX2FsaWduCT0gc21tcHQ0M19yb290X3RhYmxlX2FsaWduLAorCS5wYV9pbl9yYW5n
ZQkJPSBzbW1wdDQzX3BhX2luX3JhbmdlLAorCS5tYXBfZnVsbF9yYW5nZQkJPSBzbW1wdDQzX21h
cF9mdWxsX3JhbmdlLAorCS5nZXRfeHdyCQk9IHNtbXB0NDNfZ2V0X3h3ciwKK307CisKK3N0cnVj
dCBzYmlfbXB0X21vZGUgc21tcHQ1Ml9tb2RlID0geworCS5uYW1lCQkJPSAiU21tcHQ1MiIsCisJ
Lm1vZGVfdmFsCQk9IFNCSV9NTVBUX01PREVfU01NUFQ1MiwKKwkuZW5jb2RlX21tcHQJCT0gc21t
cHQ1Ml9lbmNvZGVfbW1wdCwKKwkubWFwX3JhbmdlCQk9IHNtbXB0NTJfbWFwX3JhbmdlLAorCS5y
b290X3RhYmxlX3NpemUJPSBzbW1wdDUyX3Jvb3RfdGFibGVfc2l6ZSwKKwkucm9vdF90YWJsZV9h
bGlnbgk9IHNtbXB0NTJfcm9vdF90YWJsZV9hbGlnbiwKKwkucGFfaW5fcmFuZ2UJCT0gc21tcHQ1
Ml9wYV9pbl9yYW5nZSwKKwkubWFwX2Z1bGxfcmFuZ2UJCT0gc21tcHQ1Ml9tYXBfZnVsbF9yYW5n
ZSwKKwkuZ2V0X3h3cgkJPSBzbW1wdDUyX2dldF94d3IsCit9OworCitzdHJ1Y3Qgc2JpX21wdF9t
b2RlIHNtbXB0NjRfbW9kZSA9IHsKKwkubmFtZQkJCT0gIlNtbXB0NjQiLAorCS5tb2RlX3ZhbAkJ
PSBTQklfTU1QVF9NT0RFX1NNTVBUNjQsCisJLmVuY29kZV9tbXB0CQk9IHNtbXB0NjRfZW5jb2Rl
X21tcHQsCisJLm1hcF9yYW5nZQkJPSBzbW1wdDY0X21hcF9yYW5nZSwKKwkucm9vdF90YWJsZV9z
aXplCT0gc21tcHQ2NF9yb290X3RhYmxlX3NpemUsCisJLnJvb3RfdGFibGVfYWxpZ24JPSBzbW1w
dDY0X3Jvb3RfdGFibGVfYWxpZ24sCisJLnBhX2luX3JhbmdlCQk9IHNtbXB0NjRfcGFfaW5fcmFu
Z2UsCisJLm1hcF9mdWxsX3JhbmdlCQk9IHNtbXB0NjRfbWFwX2Z1bGxfcmFuZ2UsCisJLmdldF94
d3IJCT0gc21tcHQ2NF9nZXRfeHdyLAorfTsKKworI2Vsc2UgLyogX19yaXNjdl94bGVuID09IDY0
ICovCisKKy8qCisgKiBTbW1wdDM0IChSVjMyKSAg4oCUICAzNC1iaXQgc3VwZXJ2aXNvciBwaHlz
aWNhbCBhZGRyZXNzIChTUEEpCisgKgorICogKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0t
Ky0tLS0tLS0tKworICogfCAgcG5bMV0gIHwgIHBuWzBdICB8ICAgIHBpICAgfCBvZmZzZXQgfAor
ICogfCBbMzM6MjVdIHwgWzI0OjE1XSB8IFsxNDoxMl0gfCBbMTE6MF0gfAorICogfCAgICA5YiAg
IHwgICAxMGIgICB8ICAgIDNiICAgfCAgMTJiICAgfAorICogKy0tLS0tLS0tLSstLS0tLS0tLS0r
LS0tLS0tLS0tKy0tLS0tLS0tKworICoKKyAqLworCisjZGVmaW5lIFJWMzJfTVBURV9TSVpFCQkJ
NFVMCisjZGVmaW5lIFJWMzJfUk9PVF9FTlRSSUVTCQk1MTJVCisjZGVmaW5lIFJWMzJfTEVBRl9F
TlRSSUVTCQkxMDI0VQorI2RlZmluZSBSVjMyX1JPT1RfU0laRQkJCShSVjMyX1JPT1RfRU5UUklF
UyAqIFJWMzJfTVBURV9TSVpFKQorI2RlZmluZSBSVjMyX0xFQUZfU0laRQkJCShSVjMyX0xFQUZf
RU5UUklFUyAqIFJWMzJfTVBURV9TSVpFKQorCisvKiBwbiBmaWVsZCB3aWR0aHMgKi8KKyNkZWZp
bmUgUlYzMl9QTjFfQklUUwkJCTlVCisjZGVmaW5lIFJWMzJfUE4wX0JJVFMJCQkxMFUKKworI2Rl
ZmluZSBSVjMyX05VTVBHSU5SQU5HRQkJM1UKKyNkZWZpbmUgUlYzMl9QQUdFU19QRVJfTVBURQkJ
KDFVIDw8IFJWMzJfTlVNUEdJTlJBTkdFKQorI2RlZmluZSBSVjMyX1BBR0VTX1BFUl9NUFRFX01B
U0sJKFJWMzJfUEFHRVNfUEVSX01QVEUgLSAxKQorCisvKiBSYW5nZSBjb3ZlcmVkIGJ5IG9uZSBN
UFRFIGF0IGVhY2ggbGV2ZWwgKi8KKyNkZWZpbmUgUlYzMl9MRUFGX1JBTkdFCQkJKFJWMzJfUEFH
RVNfUEVSX01QVEUgKiBTQklfTVBUX1BBR0VfU0laRSkKKyNkZWZpbmUgUlYzMl9ST09UX1JBTkdF
CQkJKFJWMzJfTEVBRl9SQU5HRSA8PCBSVjMyX1BOMF9CSVRTKQorCisvKiBOQVBPVCBjb25zdGFu
dHMgKEc9NikgKi8KKyNkZWZpbmUgUlYzMl9OQVBPVF9HCQkJNlUKKyNkZWZpbmUgUlYzMl9OQVBP
VF9HX1NISUZUCQkxMlUKKyNkZWZpbmUgUlYzMl9OQVBPVF9DT1VOVAkJKDFVIDw8IChSVjMyX05B
UE9UX0cgKyAxKSkKKyNkZWZpbmUgUlYzMl9OQVBPVF9TSVpFCQkJKFJWMzJfTkFQT1RfQ09VTlQg
KiBSVjMyX0xFQUZfUkFOR0UpCisjZGVmaW5lIFJWMzJfTkFQT1RfUE4wX0FMSUdOCQlSVjMyX05B
UE9UX0NPVU5UCisKKy8qCisgKiBTd2l0aCB0byBkaXNhYmxlIE5BUE9UIGNvbXBhY3Rpb24gb2Yg
TVBURSBlbnRyaWVzIHdoaWxlIHdyaXRpbmcuCisgKi8KKyNkZWZpbmUgUlYzMl9OQVBPVF9ESVNB
QkxFCTAKKworLyoKKyAqIHJ2MzJfcG4xX3RhYmxlX2lkeCgpIOKAlCBleHRyYWN0IHBuWzFdIGZy
b20gYSBTUEEuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJ2MzJfcG4xX3RhYmxlX2lkeCh1bnNp
Z25lZCBsb25nIHBhKQoreworCXJldHVybiAoKHBhID4+IDI1KSAmIDB4MUZGVSk7Cit9CisKKy8q
CisgKiBydjMyX3BuMF90YWJsZV9pZHgoKSDigJQgZXh0cmFjdCBwblswXSBmcm9tIGEgU1BBLgor
ICovCitzdGF0aWMgaW5saW5lIHUzMiBydjMyX3BuMF90YWJsZV9pZHgodW5zaWduZWQgbG9uZyBw
YSkKK3sKKwlyZXR1cm4gKChwYSA+PiAxNSkgJiAweDNGRlUpOworfQorCitzdGF0aWMgaW5saW5l
IHUzMiBydjMyX3R1cGxlX2lkeF9zaGlmdCh1MzIgbGV2ZWwpCit7CisJcmV0dXJuIChsZXZlbCA9
PSAwKSA/IFNCSV9NUFRfUEFHRV9TSElGVCA6IFNCSV9NUFRfUEFHRV9TSElGVCArIFJWMzJfUE4w
X0JJVFM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJ2MzJfdHVwbGVfaWR4KHVuc2lnbmVkIGxv
bmcgcGEsIHUzMiBsZXZlbCkKK3sKKwlyZXR1cm4gKChwYSA+PiBydjMyX3R1cGxlX2lkeF9zaGlm
dChsZXZlbCkpICYgUlYzMl9QQUdFU19QRVJfTVBURV9NQVNLKTsKK30KKworLyoKKyAqIEJ5dGVz
IGNvdmVyZWQgYnkgb25lIE1QVEUgYXQgdGhlIGdpdmVuIGxldmVsCisgKi8KK3N0YXRpYyBpbmxp
bmUgdW5zaWduZWQgbG9uZyBydjMyX21wdGVfcmFuZ2UodTMyIGxldmVsKQoreworCXJldHVybiAo
bGV2ZWwgPT0gMCkgPyBSVjMyX0xFQUZfUkFOR0UgOiBSVjMyX1JPT1RfUkFOR0U7Cit9CisKKy8q
CisgKiBSVjMyIE1QVEUgUmVhZC9Xcml0ZSBmdW5jdGlvbnMKKyAqLworc3RhdGljIGlubGluZSB1
MzIgcnYzMl9yZWFkX21wdGUodW5zaWduZWQgbG9uZyBwYSkKK3sKKwlyZXR1cm4gKih2b2xhdGls
ZSB1MzIgKilwYTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ2MzJfd3JpdGVfbXB0ZSh1bnNp
Z25lZCBsb25nIHBhLCB1MzIgdikKK3sKKwkqKHZvbGF0aWxlIHUzMiAqKXBhID0gdjsKK30KKwor
c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJ2MzJfbXB0ZV9wYSh1bnNpZ25lZCBsb25nIHRh
YmxlX3BhLCB1MzIgaWR4KQoreworCXJldHVybiAodGFibGVfcGEgKyBpZHggKiBSVjMyX01QVEVf
U0laRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBydjMyX25leHRfdGFibGVf
cGEodTMyIG1wdGUpCit7CisJcmV0dXJuICgobXB0ZSA+PiBTQklfTVBURV9QUE5fU0hJRlQpIDw8
IFNCSV9NUFRfUEFHRV9TSElGVCk7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBOYXBvdCBMZWFmIE1Q
VEUKKyAqCisgKiBDb25zdHJ1Y3RzIG9uZSBNUFRFIHZhbHVlIHVzZWQgZm9yIGFsbCBSVjMyX05B
UE9UX0NPVU5UIGVudHJpZXMKKyAqIGluIGEgTkFQT1QgZ3JvdXAuCisgKgorICogQWxsIE1QVEVz
IGluIHRoZSBncm91cCBhcmUgaWRlbnRpY2FsCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJ2MzJf
bmFwb3RfbGVhZih1OCB4d3IpCit7CisJdTMyIG1wdGUgPSBTQklfTVBURV9WIHwgU0JJX01QVEVf
TCB8IFNCSV9NUFRFX047CisKKwltcHRlID0gc2JpX21wdGVfbGVhZl9zZXRfeHdyKG1wdGUsIDAs
IHh3cik7CisJbXB0ZSB8PSAoKHUzMilSVjMyX05BUE9UX0cgPDwgUlYzMl9OQVBPVF9HX1NISUZU
KTsKKworCXJldHVybiBtcHRlOworfQorCisvKgorICogR2V0IHRoZSB4d3IgZnJvbSBhIE5hcG90
IGxlYWYuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTggcnYzMl9uYXBvdF94d3IodTMyIG1wdGUpCit7
CisJcmV0dXJuICgobXB0ZSA+PiBTQklfTVBURV9YV1JfQkFTRSkgJiBTQklfTVBURV9YV1JfTUFT
Syk7Cit9CisKKy8qCisgKiBydjMyX25hcG90X2RlbW90ZSgpIOKAlCBDb252ZXJ0IGEgTmFwb3Qg
TVBURSBncm91cCBpbnRvIFJWNjRfTkFQT1RfTVBURV9DT1VOVAorICogbm9ybWFsKE5vbi1OYXBv
dCkgTVBURSBjYXJyeWluZyB0aGUgU0FNRSBwZXJtaXNzaW9uLgorICoKKyAqIGxlYWZfbXB0ZV9w
YSBpcyBhbnkgb2YgdGhlIGdyb3VwIE1QVEUgUEEKKyAqLworc3RhdGljIHZvaWQgcnYzMl9uYXBv
dF9kZW1vdGUoc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sCisJCQkgICAgICB1bnNpZ25lZCBs
b25nIGxlYWZfbXB0ZV9wYSwgdW5zaWduZWQgbG9uZyBwYSkKK3sKKwl1MzIgcGcsIGxlYWYsIGk7
CisJdW5zaWduZWQgbG9uZyBncnBfYmFzZTsKKwl1OCB4d3IgPSBydjMyX25hcG90X3h3cihydjMy
X3JlYWRfbXB0ZShsZWFmX21wdGVfcGEpKTsKKwl1MzIgcG4wID0gcnYzMl9wbjBfdGFibGVfaWR4
KHBhKTsKKworCWdycF9iYXNlID0gbGVhZl9tcHRlX3BhIC0gKHBuMCAmIChSVjMyX05BUE9UX0NP
VU5UIC0gMSkpICogUlYzMl9NUFRFX1NJWkU7CisKKwlsZWFmID0gKFNCSV9NUFRFX1YgfCBTQklf
TVBURV9MKTsgLyogTj0wICovCisKKwlmb3IgKHBnID0gMDsgcGcgPCBSVjMyX1BBR0VTX1BFUl9N
UFRFOyBwZysrKQorCQlsZWFmID0gc2JpX21wdGVfbGVhZl9zZXRfeHdyKGxlYWYsIHBnLCB4d3Ip
OworCisJZm9yIChpID0gMDsgaSA8IFJWMzJfTkFQT1RfQ09VTlQ7IGkrKykKKwkJcnYzMl93cml0
ZV9tcHRlKGdycF9iYXNlICsgaSAqIFJWMzJfTVBURV9TSVpFLCBsZWFmKTsKK30KKworc3RhdGlj
IGlubGluZSB1MzIgcnYzMl9iZXN0X2xldmVsKHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxv
bmcgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA+PSBSVjMyX1JPT1RfUkFOR0UgJiYgKHBhICYgKFJWMzJf
Uk9PVF9SQU5HRSAtIDEpKSA9PSAwKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisv
KgorICogTVBUIFdhbGsgZm9yIFJWMzIgU21tcHQ0MworICoKKyAqIFJldHVybnMgdGhlIFBBIG9m
IHRoZSBNUFRFIGNvdmVyaW5nIHBhCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ2MzJfd2Fs
a19hbGxvYyhzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwKKwkJCQkgICAgIHVuc2lnbmVkIGxv
bmcgcGEsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJICAgICB1MzIgKm91dF9s
ZXZlbCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3RfZXAgPSBydjMyX21wdGVfcGEoZG9tLT5yb290
X3BhLCBydjMyX3BuMV90YWJsZV9pZHgocGEpKTsKKwl1MzIgcm9vdF9tcHRlID0gcnYzMl9yZWFk
X21wdGUocm9vdF9lcCk7CisJdTMyIGJlc3QgPSBydjMyX2Jlc3RfbGV2ZWwocGEsIHNpemUpOwor
CXVuc2lnbmVkIGxvbmcgbGVhZl9wYTsKKworCWlmIChyb290X21wdGUgJiAodTMyKVNCSV9NUFRF
X0wpIHsKKwkJLyogRXhpc3Rpbmcgcm9vdC1sZXZlbCBsZWFmICovCisJCSpvdXRfbGV2ZWwgPSAx
OworCQlyZXR1cm4gcm9vdF9lcDsKKwl9CisKKwlpZiAoIShyb290X21wdGUgJiAodTMyKVNCSV9N
UFRFX1YpICYmIGJlc3QgPT0gMSkgeworCQkvKiBuZXcgZW50cnksIHJhbmdlIGZpdHMgYXQgcm9v
dCBsZXZlbCBzbyBza2lwIGxlYWYgYWxsb2NhdGlvbiAqLworCQkqb3V0X2xldmVsID0gMTsKKwkJ
cmV0dXJuIHJvb3RfZXA7CisJfQorCisJaWYgKCEocm9vdF9tcHRlICYgKHUzMilTQklfTVBURV9W
KSkgeworCQkvKiBBbGxvY2F0ZSBsZWFmIHRhYmxlIGZyb20gZ2xvYmFsIGhlYXAgKi8KKwkJbGVh
Zl9wYSA9IHNiaV9tcHRfcG9vbF9hbGxvYyhSVjMyX0xFQUZfU0laRSwKKwkJCQkJICAgICBTQklf
TVBUX1BBR0VfU0laRSk7CisJCWlmICghbGVhZl9wYSkKKwkJCXJldHVybiAwOworCisJCXJ2MzJf
d3JpdGVfbXB0ZShyb290X2VwLCBzYmlfbXB0ZV9ub25sZWFmKGxlYWZfcGEpKTsKKwkJKm91dF9s
ZXZlbCA9IDA7CisKKwkJcmV0dXJuIHJ2MzJfbXB0ZV9wYShsZWFmX3BhLCBydjMyX3BuMF90YWJs
ZV9pZHgocGEpKTsKKwl9CisKKwkvKiBWYWxpZCBub24tbGVhZjogZm9sbG93IFBQTiB0byBleGlz
dGluZyBsZWFmIHRhYmxlICovCisJKm91dF9sZXZlbCA9IDA7CisKKwlyZXR1cm4gcnYzMl9tcHRl
X3BhKHJ2MzJfbmV4dF90YWJsZV9wYShydjMyX3JlYWRfbXB0ZShyb290X2VwKSksIHJ2MzJfcG4w
X3RhYmxlX2lkeChwYSkpOworfQorCisvKgorICogc21tcHQzNF9tYXBfcmFuZ2UoKTogTWFwcyBh
IHJhbmdlIFtwYSwgcGErc2l6ZV0gaW4gdGhlIE1QVCB0YWJsZQorICovCisKK3N0YXRpYyBpbnQg
c21tcHQzNF9tYXBfcmFuZ2Uoc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sCisJCQkgICAgIHVu
c2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdTggeHdyKQoreworCXVuc2lnbmVk
IGxvbmcgY3VyID0gcGE7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBwYSArIHNpemU7CisJdW5zaWdu
ZWQgbG9uZyBsZWFmX21wdGVfcGE7CisJdW5zaWduZWQgbG9uZyBtcHRlX3JhbmdlLCBtcHRlX2Jh
c2UsIG1wdGVfZW5kLCBiYXRjaF9lbmQ7CisJdTMyIGxldmVsLCBwZ19maXJzdCwgcGdfbGFzdCwg
cGcsIGk7CisJdTMyIG1wdGUsIG5hcG90OworCisJd2hpbGUgKGN1ciA8IGVuZCkgeworCQkvKgor
CQkgKiBDaGVjayBpZiB0aGUgcmVnaW9uIHF1YWxpZmllcyBmb3IgTkFQT1QgcmFuZ2UgYW5kIHRo
ZQorCQkgKiByZWdpb24gaXMgY29udGFpbmVkCisJCSAqLworCQlpZiAoKGN1ciAmIChSVjMyX05B
UE9UX1NJWkUgLSAxKSkgPT0gMCAmJgorCQkJY3VyICsgUlYzMl9OQVBPVF9TSVpFID4gY3VyICYm
CisJCQljdXIgKyBSVjMyX05BUE9UX1NJWkUgPD0gZW5kKSB7CisJCQlsZWFmX21wdGVfcGEgPSBy
djMyX3dhbGtfYWxsb2MoZG9tLCBjdXIsIGVuZCAtIGN1ciwgJmxldmVsKTsKKwkJCWlmICghbGVh
Zl9tcHRlX3BhKQorCQkJCXJldHVybiBTQklfRU5PTUVNOworCisJCQlpZiAoIVJWMzJfTkFQT1Rf
RElTQUJMRSAmJiBsZXZlbCA9PSAwICYmIChydjMyX3BuMF90YWJsZV9pZHgoY3VyKSAmIChSVjMy
X05BUE9UX1BOMF9BTElHTiAtIDEpKSA9PSAwKSB7CisJCQkJbmFwb3QgPSBydjMyX25hcG90X2xl
YWYoeHdyKTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBSVjMyX05BUE9UX0NPVU5UOyBpKyspCisJ
CQkJCXJ2MzJfd3JpdGVfbXB0ZShsZWFmX21wdGVfcGEgKyBpICogUlYzMl9NUFRFX1NJWkUsIG5h
cG90KTsKKworCQkJCWN1ciArPSBSVjMyX05BUE9UX1NJWkU7CisKKwkJCQljb250aW51ZTsKKwkJ
CX0KKwkJfSBlbHNlIHsKKwkJCWxlYWZfbXB0ZV9wYSA9IHJ2MzJfd2Fsa19hbGxvYyhkb20sIGN1
ciwgZW5kIC0gY3VyLCAmbGV2ZWwpOworCQkJaWYgKCFsZWFmX21wdGVfcGEpCisJCQkJcmV0dXJu
IFNCSV9FTk9NRU07CisJCX0KKworCQkvKiBOb3JtYWwgcGF0aCAqLworCQltcHRlX3JhbmdlID0g
cnYzMl9tcHRlX3JhbmdlKGxldmVsKTsKKwkJcGdfZmlyc3QgPSBydjMyX3R1cGxlX2lkeChjdXIs
IGxldmVsKTsKKwkJbXB0ZV9iYXNlID0gY3VyICYgfihtcHRlX3JhbmdlIC0gMVVMKTsKKwkJbXB0
ZV9lbmQgPSBtcHRlX2Jhc2UgKyBtcHRlX3JhbmdlOworCQliYXRjaF9lbmQgPSAoZW5kIDwgbXB0
ZV9lbmQpID8gZW5kIDogbXB0ZV9lbmQ7CisJCXBnX2xhc3QgPSBydjMyX3R1cGxlX2lkeChiYXRj
aF9lbmQgLSBTQklfTVBUX1BBR0VfU0laRSwgbGV2ZWwpOworCisJCS8qCisJCSogSWYgdGhpcyBs
ZXZlbC0wIE1QVEUgaXMgYSBOYXBvdCBtZW1iZXIsIGV4cGFuZCB0aGUKKwkJKiB3aG9sZSBuYXR1
cmFsbHktYWxpZ25lZCBncm91cCB0byBwbGFpbiBsZWF2ZXMgYW5kIHdyaXRlIHNhbWUKKwkJKiBw
ZXJtaXNzaW9ucyB4d3IKKwkJKi8KKwkJbXB0ZSA9IHJ2MzJfcmVhZF9tcHRlKGxlYWZfbXB0ZV9w
YSk7CisJCWlmIChsZXZlbCA9PSAwICYmIChtcHRlICYgKHUzMilTQklfTVBURV9OKSkgeworCQkJ
cnYzMl9uYXBvdF9kZW1vdGUoZG9tLCBsZWFmX21wdGVfcGEsIGN1cik7CisJCQlzYmlfbXB0X2Zl
bmNlX3NkaWQoZG9tLT5zZGlkKTsKKwkJCW1wdGUgPSBydjMyX3JlYWRfbXB0ZShsZWFmX21wdGVf
cGEpOworCQl9CisJCWlmICghKG1wdGUgJiAodTMyKShTQklfTVBURV9WIHwgU0JJX01QVEVfTCkp
KQorCQkJbXB0ZSA9IFNCSV9NUFRFX1YgfCBTQklfTVBURV9MOworCisJCWZvciAocGcgPSBwZ19m
aXJzdDsgcGcgPD0gcGdfbGFzdDsgcGcrKykKKwkJCW1wdGUgPSBzYmlfbXB0ZV9sZWFmX3NldF94
d3IobXB0ZSwgcGcsIHh3cik7CisKKwkJcnYzMl93cml0ZV9tcHRlKGxlYWZfbXB0ZV9wYSwgbXB0
ZSk7CisJCWN1ciA9IGJhdGNoX2VuZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1t
cHQgZW5jb2RpbmcKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQzNF9lbmNvZGVfbW1w
dCh1bnNpZ25lZCBsb25nIHBwbiwgdTMyIHNkaWQpCit7CisJcmV0dXJuIHNiaV9tbXB0X2VuY29k
ZShTQklfTU1QVF9NT0RFX1NNTVBUMzQsIHNkaWQsIHBwbik7Cit9CisKK3N0YXRpYyB1bnNpZ25l
ZCBsb25nIHNtbXB0MzRfcm9vdF90YWJsZV9zaXplKHZvaWQpCit7CisJcmV0dXJuIFJWMzJfUk9P
VF9TSVpFOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbW1wdDM0X3Jvb3RfdGFibGVfYWxp
Z24odm9pZCkKK3sKKwlyZXR1cm4gU0JJX01QVF9QQUdFX1NJWkU7Cit9CisKK3N0YXRpYyBib29s
IHNtbXB0MzRfcGFfaW5fcmFuZ2UodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXpl
KQoreworCS8qCisJICogUmV0dXJuIHRydWUgc2luY2UgMSA8PCAzNCB3aWwgYmUgVUIKKwkgKiBp
biBSVjMyIGNhc2UgYW5kIGFueXdheXMgdmFyaWFibGVzIGFyZSBsaW1pdGVkIGJ5IFJWMzIKKwkg
KiBhcmNoaXRlY3R1cmFsIHdpZHRoCisJICovCisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAq
IHNtbXB0MzRfbWFwX2Z1bGxfcmFuZ2UoKSDigJQgV3JpdGUgZXZlcnkgTVBURSBhdCBSb290IE1Q
VAorICoKKyAqIFdyaXRlcyB4d3IgaW50byBldmVyeSByb290IHRhYmxlIE1QVEUgZGlyZWN0bHkg
YXMgYSBsZWFmCisgKiBzdXBlcnBhZ2UgY292ZXJpbmcgdGhlIG1vZGUgZW50aXJlIGFkZHJlc3Nh
YmxlIFBBIHJhbmdlLgorICogTm8gaW50ZXJtaWRpYXRlIE1QVCB0YWJsZXMgYWxsb2NhdGVkIGp1
c3QgYWxsIGxlYWYgTVBURXMgYXQKKyAqIHJvb3QgbGV2ZWwuCisgKi8KKworc3RhdGljIGludCBz
bW1wdDM0X21hcF9mdWxsX3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1OCB4d3Ip
Cit7CisJdTMyIG1wdGUgPSBTQklfTVBURV9WIHwgU0JJX01QVEVfTDsKKwl1MzIgcGcsIGk7CisK
Kwlmb3IgKHBnID0gMDsgcGcgPCBSVjMyX1BBR0VTX1BFUl9NUFRFOyBwZysrKQorCQltcHRlID0g
c2JpX21wdGVfbGVhZl9zZXRfeHdyKG1wdGUsIHBnLCB4d3IpOworCisJZm9yIChpID0gMDsgaSA8
IFJWMzJfUk9PVF9FTlRSSUVTOyBpKyspCisJCXJ2MzJfd3JpdGVfbXB0ZShydjMyX21wdGVfcGEo
ZG9tLT5yb290X3BhLCBpKSwgbXB0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBh
Y2Nlc3MgcGVybWlzc2lvbnMoeHdyKSBvZiBhIFBBICovCitzdGF0aWMgdTggc21tcHQzNF9nZXRf
eHdyKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1bnNpZ25lZCBsb25nIHBhKQoreworCXUz
MiBtcHRlLCBwaTsKKwl1bnNpZ25lZCBsb25nIHRhYmxlX3BhID0gZG9tLT5yb290X3BhOworCisJ
bXB0ZSA9IHJ2MzJfcmVhZF9tcHRlKHJ2MzJfbXB0ZV9wYSh0YWJsZV9wYSwgcnYzMl9wbjFfdGFi
bGVfaWR4KHBhKSkpOworCisJaWYgKCEobXB0ZSAmIFNCSV9NUFRFX1YpKQorCQlyZXR1cm4gU0JJ
X01QVF9QRVJNX05PTkU7CisKKwlpZiAoIShtcHRlICYgU0JJX01QVEVfTCkgJiYgKG1wdGUgJiBT
QklfTVBURV9OKSkKKwkJcmV0dXJuIFNCSV9NUFRfUEVSTV9OT05FOworCisJaWYgKG1wdGUgJiBT
QklfTVBURV9MKSB7CisJCWlmIChtcHRlICYgU0JJX01QVEVfTikKKwkJCXJldHVybiBydjMyX25h
cG90X3h3cihtcHRlKTsKKworCQlwaSA9IHJ2MzJfdHVwbGVfaWR4KHBhLCAxKTsKKwkJcmV0dXJu
IChtcHRlID4+IHNiaV9tcHRlX3h3cl9zaGlmdChwaSkpICYgU0JJX01QVEVfWFdSX01BU0s7CisJ
fQorCisJdGFibGVfcGEgPSBydjMyX25leHRfdGFibGVfcGEobXB0ZSk7CisJbXB0ZSA9IHJ2MzJf
cmVhZF9tcHRlKHJ2MzJfbXB0ZV9wYSh0YWJsZV9wYSwgcnYzMl9wbjBfdGFibGVfaWR4KHBhKSkp
OworCisJaWYgKCEobXB0ZSAmIFNCSV9NUFRFX1YpIHx8ICEobXB0ZSAmIFNCSV9NUFRFX0wpKQor
CQlyZXR1cm4gU0JJX01QVF9QRVJNX05PTkU7CisKKwlpZiAobXB0ZSAmIFNCSV9NUFRFX04pCisJ
CXJldHVybiBydjMyX25hcG90X3h3cihtcHRlKTsKKworCXBpID0gcnYzMl90dXBsZV9pZHgocGEs
IDApOworCisJcmV0dXJuICgobXB0ZSA+PiBzYmlfbXB0ZV94d3Jfc2hpZnQocGkpKSAmIFNCSV9N
UFRFX1hXUl9NQVNLKTsKK30KKworc3RydWN0IHNiaV9tcHRfbW9kZSBzbW1wdDM0X21vZGUgPSB7
CisJLm5hbWUgPSAiU21tcHQzNCIsCisJLm1vZGVfdmFsID0gU0JJX01NUFRfTU9ERV9TTU1QVDM0
LAorCS5lbmNvZGVfbW1wdCA9IHNtbXB0MzRfZW5jb2RlX21tcHQsCisJLm1hcF9yYW5nZSA9IHNt
bXB0MzRfbWFwX3JhbmdlLAorCS5yb290X3RhYmxlX3NpemUgPSBzbW1wdDM0X3Jvb3RfdGFibGVf
c2l6ZSwKKwkucm9vdF90YWJsZV9hbGlnbiA9IHNtbXB0MzRfcm9vdF90YWJsZV9hbGlnbiwKKwku
cGFfaW5fcmFuZ2UgPSBzbW1wdDM0X3BhX2luX3JhbmdlLAorCS5tYXBfZnVsbF9yYW5nZSA9IHNt
bXB0MzRfbWFwX2Z1bGxfcmFuZ2UsCisJLmdldF94d3IgPSBzbW1wdDM0X2dldF94d3IsCit9Owor
CisjZW5kaWYgLyogX19yaXNjdl94bGVuID09IDMyICovCi0tIAoyLjUxLjAKCgotLSAKb3BlbnNi
aSBtYWlsaW5nIGxpc3QKb3BlbnNiaUBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5p
bmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vb3BlbnNiaQo=