Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Sep 2016 19:16:53 +0000
From:      "sbruno (Sean Bruno)" <phabric-noreply@FreeBSD.org>
To:        freebsd-mips@freebsd.org
Subject:   [Differential] D2535: New, experimental PMAP implementation for MIPS64
Message-ID:  <8cfbda1353b73aeded57f1b1746022d2@localhost.localdomain>
In-Reply-To: <differential-rev-PHID-DREV-5xurf3bsmfb7qsmjczka-req@FreeBSD.org>
References:  <differential-rev-PHID-DREV-5xurf3bsmfb7qsmjczka-req@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--b1_8cfbda1353b73aeded57f1b1746022d2
Content-Type: text/plain; charset = "utf-8"
Content-Transfer-Encoding: base64

c2JydW5vIHVwZGF0ZWQgdGhpcyByZXZpc2lvbiB0byBEaWZmIDIwMzkxLgpzYnJ1bm8gYWRkZWQg
YSBjb21tZW50LgoKCiAgRml4IG1pcHMzMiBidWlsZC4KICAKICBCb290IHRlc3Qga2VybmVsL3dv
cmxkIHZpYSBNQUxUQSB1bmRlciBRRU1VIGlzIHN1Y2Nlc3NmdWwKClJFUE9TSVRPUlkKICByUyBG
cmVlQlNEIHNyYyByZXBvc2l0b3J5CgpDSEFOR0VTIFNJTkNFIExBU1QgVVBEQVRFCiAgaHR0cHM6
Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0QyNTM1P3ZzPTIwMzkwJmlkPTIwMzkxCgpSRVZJU0lPTiBE
RVRBSUwKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcvRDI1MzUKCkFGRkVDVEVEIEZJTEVT
CiAgbGliL2xpYmt2bS9rdm1fbWlwcy5oCiAgc3lzL2NvbmYvZmlsZXMubWlwcwogIHN5cy9jb25m
L29wdGlvbnMubWlwcwogIHN5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAogIHN5cy9taXBzL2luY2x1
ZGUvcG1hcC5oCiAgc3lzL21pcHMvaW5jbHVkZS9wdGUuaAogIHN5cy9taXBzL2luY2x1ZGUvdm1w
YXJhbS5oCiAgc3lzL21pcHMvbWlwcy9jcHUuYwogIHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMK
ICBzeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMKICBzeXMvbWlwcy9taXBzL21hY2hkZXAuYwogIHN5
cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5jCiAgc3lzL21pcHMvbWlwcy9wbWFwLmMKICBz
eXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMKICBzeXMvbWlwcy9taXBzL3N3dGNoLlMKICBzeXMv
bWlwcy9taXBzL3RsYi5jCiAgc3lzL21pcHMvbWlwcy90cmFwLmMKICBzeXMvbWlwcy9taXBzL3Vt
YV9tYWNoZGVwLmMKICBzeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYwogIHN5cy92bS92bV9nbHVl
LmMKCkVNQUlMIFBSRUZFUkVOQ0VTCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL3NldHRp
bmdzL3BhbmVsL2VtYWlscHJlZmVyZW5jZXMvCgpUbzogc2JydW5vLCBzc29uCkNjOiBzYnJ1bm8s
IHJ3YXRzb24sIGVtYXN0ZSwgaW1wLCBmcmVlYnNkLW1pcHMtbGlzdCwgZG5lbHNvbl8xOTAxX3lh
aG9vLmNvbSwgbWl6aGthX2dtYWlsLmNvbQo=

--b1_8cfbda1353b73aeded57f1b1746022d2
Content-Type: text/x-patch; charset=utf-8; name="D2535.20391.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="D2535.20391.patch"

ZGlmZiAtLWdpdCBhL3N5cy92bS92bV9nbHVlLmMgYi9zeXMvdm0vdm1fZ2x1ZS5jCi0tLSBhL3N5
cy92bS92bV9nbHVlLmMKKysrIGIvc3lzL3ZtL3ZtX2dsdWUuYwpAQCAtMzEyLDYgKzMxMiwxNjEg
QEAKICNkZWZpbmUgS1NUQUNLX01BWF9QQUdFUyAzMgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9f
bWlwc19fKQorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz
KQoreworCXZtX29mZnNldF90IGtzOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGFsaWduIHRoZSBr
c3RhY2sncyBtYXBwZWQgYWRkcmVzcyB0byBmaXQgd2l0aGluCisJICogYSBzaW5nbGUgVExCIGVu
dHJ5LgorCSAqLworCWlmICh2bWVtX3hhbGxvYyhrZXJuZWxfYXJlbmEsCisJICAgIChwYWdlcyAr
IEtTVEFDS19HVUFSRF9QQUdFUykgKiBQQUdFX1NJWkUsCisJICAgIEtTVEFDS19QQUdFX1NJWkUg
KiAyLCAwLCAwLCBWTUVNX0FERFJfTUlOLCBWTUVNX0FERFJfTUFYLAorCSAgICBNX0JFU1RGSVQg
fCBNX05PV0FJVCwgJmtzKSkgeworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoa3MpOwor
fQorCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKworI2RlZmluZQlLU1RBQ0tfT0JKVAkJT0JK
VF9QSFlTCisKK3N0YXRpYyBpbnQKK3ZtX2tzdGFja19wYWxsb2Modm1fb2JqZWN0X3Qga3NvYmos
IHZtX29mZnNldF90IGtzLCBpbnQgYWxsb2NmbGFncywgaW50IHBhZ2VzLAorICAgIHZtX3BhZ2Vf
dCBtYVtdKQoreworCXZtX3BhZ2VfdCBtLCBlbmRfbTsKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtz
b2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOwor
CVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9j
ZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3Ig
KGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworcmV0cnlsb29rdXA6CisJCWlmICgobSA9IHZtX3Bh
Z2VfbG9va3VwKGtzb2JqLCBpKSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAodm1fcGFnZV9i
dXNpZWQobSkpIHsKKwkJCS8qCisJCQkgKiBSZWZlcmVuY2UgdGhlIHBhZ2UgYmVmb3JlIHVubG9j
a2luZyBhbmQKKwkJCSAqIHNsZWVwaW5nIHNvIHRoYXQgdGhlIHBhZ2UgZGFlbW9uIGlzIGxlc3MK
KwkJCSAqIGxpa2VseSB0byByZWNsYWltIGl0LgorCQkJICovCisJCQl2bV9wYWdlX2FmbGFnX3Nl
dChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQl2bV9wYWdlX2xvY2sobSk7CisJCQlWTV9PQkpFQ1Rf
V1VOTE9DSyhrc29iaik7CisJCQl2bV9wYWdlX2J1c3lfc2xlZXAobSwgInBncmJ3dCIpOworCQkJ
Vk1fT0JKRUNUX1dMT0NLKGtzb2JqKTsKKwkJCWdvdG8gcmV0cnlsb29rdXA7CisJCX0gZWxzZSB7
CisJCQlpZiAoKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19XSVJFRCkgIT0gMCkgeworCQkJCXZtX3Bh
Z2VfbG9jayhtKTsKKwkJCQl2bV9wYWdlX3dpcmUobSk7CisJCQkJdm1fcGFnZV91bmxvY2sobSk7
CisJCQl9CisJCQltYVtpXSA9IG07CisJCX0KKwl9CisJaWYgKGkgPT0gcGFnZXMpCisJCXJldHVy
biAoaSk7CisKKwlLQVNTRVJUKChpID09IDApLCAoInZtX2tzdGFja19wYWxsb2M6IGtzb2JqIGFs
cmVhZHkgaGFzIGtzdGFjayBwYWdlcyIpKTsKKworCWZvciAoOzspIHsKKwkJbSA9IHZtX3BhZ2Vf
YWxsb2NfY29udGlnKGtzb2JqLCAwLCBhbGxvY2ZsYWdzLAorCQkgICAgYXRvcChLU1RBQ0tfUEFH
RV9TSVpFKSwgMHVsLCB+MHVsLCBLU1RBQ0tfUEFHRV9TSVpFICogMiwgMCwKKwkJICAgIFZNX01F
TUFUVFJfREVGQVVMVCk7CisJCWlmIChtICE9IE5VTEwpCisJCQlicmVhazsKKwkJVk1fT0JKRUNU
X1dVTkxPQ0soa3NvYmopOworCQlWTV9XQUlUOworCQlWTV9PQkpFQ1RfV0xPQ0soa3NvYmopOwor
CX0KKwllbmRfbSA9IG0gKyBhdG9wKEtTVEFDS19QQUdFX1NJWkUpOworCWZvciAoaSA9IDA7IG0g
PCBlbmRfbTsgbSsrKSB7CisJCW0tPnBpbmRleCA9ICh2bV9waW5kZXhfdClpOworCQlpZiAoKGFs
bG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kpICE9IDApCisJCQltLT52YWxpZCA9IFZNX1BBR0Vf
QklUU19BTEw7CisJCW1hW2ldID0gbTsKKwkJaSsrOworCX0KKwlyZXR1cm4gKGkpOworfQorCisj
ZWxzZSAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9C
SlRfREVGQVVMVAorCitzdGF0aWMgaW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtz
b2JqLCB2bV9vZmZzZXRfdCBrcywgaW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9w
YWdlX3QgbWFbXSkKK3sKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZt
X2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRf
V0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0Nf
Q0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7
IGkrKykgeworCQkvKgorCQkgKiBHZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1h
W2ldID0gdm1fcGFnZV9ncmFiKGtzb2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxh
Z3MgJiBWTV9BTExPQ19OT0JVU1kpCisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxM
OworCX0KKworCXJldHVybiAoaSk7Cit9CisjZW5kaWYgLyogISBLU1RBQ0tfTEFSR0VfUEFHRSAq
LworCisjZWxzZSAvKiAhIF9fbWlwc19fICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9CSlRf
REVGQVVMVAorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz
KQoreworCXZtX29mZnNldF90IGtzOworCisJa3MgPSBrdmFfYWxsb2MoKHBhZ2VzICsgS1NUQUNL
X0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7CisKKwlyZXR1cm4oa3MpOworfQorCitzdGF0aWMg
aW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtzb2JqLCB2bV9vZmZzZXRfdCBrcywg
aW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9wYWdlX3QgbWFbXSkKK3sKKwlpbnQg
aTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFs
aWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlh
bGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExP
Q19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQkvKgorCQkgKiBH
ZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1hW2ldID0gdm1fcGFnZV9ncmFiKGtz
b2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kp
CisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxMOworCX0KKworCXJldHVybiAoaSk7
Cit9CisjZW5kaWYgLyogISBfX21pcHNfXyAqLworCisKIC8qCiAgKiBDcmVhdGUgdGhlIGtlcm5l
bCBzdGFjayAoaW5jbHVkaW5nIHBjYiBmb3IgaTM4NikgZm9yIGEgbmV3IHRocmVhZC4KICAqIFRo
aXMgcm91dGluZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBmb3JrIHBlcmYgZm9yIGEgcHJvY2VzcyBh
bmQKQEAgLTMyMiw5ICs0NzcsOCBAQAogewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX29mZnNl
dF90IGtzOwotCXZtX3BhZ2VfdCBtLCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsKKwl2bV9wYWdlX3Qg
bWFbS1NUQUNLX01BWF9QQUdFU107CiAJc3RydWN0IGtzdGFja19jYWNoZV9lbnRyeSAqa3NfY2U7
Ci0JaW50IGk7CiAKIAkvKiBCb3VuZHMgY2hlY2sgKi8KIAlpZiAocGFnZXMgPD0gMSkKQEAgLTM1
MCwyNCArNTA0LDEyIEBACiAJLyoKIAkgKiBBbGxvY2F0ZSBhbiBvYmplY3QgZm9yIHRoZSBrc3Rh
Y2suCiAJICovCi0Ja3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoT0JKVF9ERUZBVUxULCBwYWdl
cyk7Ci0JCisJa3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoS1NUQUNLX09CSlQsIHBhZ2VzKTsK
KwogCS8qCiAJICogR2V0IGEga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhpcyB0aHJlYWQn
cyBrc3RhY2suCiAJICovCi0jaWYgZGVmaW5lZChfX21pcHNfXykKLQkvKgotCSAqIFdlIG5lZWQg
dG8gYWxpZ24gdGhlIGtzdGFjaydzIG1hcHBlZCBhZGRyZXNzIHRvIGZpdCB3aXRoaW4KLQkgKiBh
IHNpbmdsZSBUTEIgZW50cnkuCi0JICovCi0JaWYgKHZtZW1feGFsbG9jKGtlcm5lbF9hcmVuYSwg
KHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSwKLQkgICAgUEFHRV9TSVpF
ICogMiwgMCwgMCwgVk1FTV9BRERSX01JTiwgVk1FTV9BRERSX01BWCwKLQkgICAgTV9CRVNURklU
IHwgTV9OT1dBSVQsICZrcykpIHsKLQkJa3MgPSAwOwotCX0KLSNlbHNlCi0Ja3MgPSBrdmFfYWxs
b2MoKHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7Ci0jZW5kaWYKKwlr
cyA9IHZtX2tzdGFja192YWxsb2MocGFnZXMpOwogCWlmIChrcyA9PSAwKSB7CiAJCXByaW50Zigi
dm1fdGhyZWFkX25ldzoga3N0YWNrIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJdm1fb2JqZWN0
X2RlYWxsb2NhdGUoa3NvYmopOwpAQCAtMzg2LDIxICs1MjgsMTUgQEAKIAkgKiB3YW50IHRvIGRl
YWxsb2NhdGUgdGhlbS4KIAkgKi8KIAl0ZC0+dGRfa3N0YWNrX3BhZ2VzID0gcGFnZXM7Ci0JLyog
Ci0JICogRm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0YWNrLCBsaW5rIGluIGEgcmVhbCBwYWdlIG9m
IHJhbSBmb3IgZWFjaAotCSAqIHBhZ2Ugb2Ygc3RhY2suCi0JICovCisKIAlWTV9PQkpFQ1RfV0xP
Q0soa3NvYmopOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7Ci0JCS8qCi0JCSAqIEdl
dCBhIGtlcm5lbCBzdGFjayBwYWdlLgotCQkgKi8KLQkJbSA9IHZtX3BhZ2VfZ3JhYihrc29iaiwg
aSwgVk1fQUxMT0NfTk9CVVNZIHwKLQkJICAgIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX1dJ
UkVEKTsKLQkJbWFbaV0gPSBtOwotCQltLT52YWxpZCA9IFZNX1BBR0VfQklUU19BTEw7Ci0JfQor
CXBhZ2VzID0gdm1fa3N0YWNrX3BhbGxvYyhrc29iaiwga3MsIChWTV9BTExPQ19OT0JVU1kgfCBW
TV9BTExPQ19XSVJFRCksCisJICAgIHBhZ2VzLCBtYSk7CiAJVk1fT0JKRUNUX1dVTkxPQ0soa3Nv
YmopOworCWlmIChwYWdlcyA9PSAwKSB7CisJCXByaW50Zigidm1fdGhyZWFkX25ldzogdm1fa3N0
YWNrX3BhbGxvYygpIGZhaWxlZFxuIik7CisJCXJldHVybiAoMCk7CisJfQogCXBtYXBfcWVudGVy
KGtzLCBtYSwgcGFnZXMpOwogCXJldHVybiAoMSk7CiB9CkBAIC01NjgsMTQgKzcwNCwxNCBAQAog
ewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX3BhZ2VfdCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsK
LQlpbnQgcGFnZXM7CisJaW50IHBhZ2VzLCBydjsKIAogCXBhZ2VzID0gdGQtPnRkX2tzdGFja19w
YWdlczsKIAlrc29iaiA9IHRkLT50ZF9rc3RhY2tfb2JqOwogCVZNX09CSkVDVF9XTE9DSyhrc29i
aik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczsgaSsrKQotCQltYVtpXSA9IHZtX3BhZ2Vf
Z3JhYihrc29iaiwgaSwgVk1fQUxMT0NfTk9STUFMIHwKLQkJICAgIFZNX0FMTE9DX1dJUkVEKTsK
KwlydiA9IHZtX2tzdGFja19wYWxsb2Moa3NvYmosIHRkLT50ZF9rc3RhY2ssIChWTV9BTExPQ19O
T1JNQUwgfAorCSAgICBWTV9BTExPQ19XSVJFRCksIHBhZ2VzLCBtYSk7CisJS0FTU0VSVChydiAh
PSAwLCAoInZtX3RocmVhZF9zd2FwaW46IHZtX2tzdGFja19wYWxsb2MoKSBmYWlsZWQiKSk7CiAJ
Zm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczspIHsKIAkJaW50IGosIGEsIGNvdW50LCBydjsKIApk
aWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3Zt
X21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYworKysgYi9zeXMvbWlw
cy9taXBzL3ZtX21hY2hkZXAuYwpAQCAtMjUxLDE4ICsyNTEsMjggQEAKIGNwdV90aHJlYWRfc3dh
cGluKHN0cnVjdCB0aHJlYWQgKnRkKQogewogCXB0X2VudHJ5X3QgKnB0ZTsKLQlpbnQgaTsKIAog
CS8qCiAJICogVGhlIGtzdGFjayBtYXkgYmUgYXQgYSBkaWZmZXJlbnQgcGh5c2ljYWwgYWRkcmVz
cyBub3cuCiAJICogQ2FjaGUgdGhlIFBURXMgZm9yIHRoZSBLZXJuZWwgc3RhY2sgaW4gdGhlIG1h
Y2hpbmUgZGVwZW5kZW50CiAJICogcGFydCBvZiB0aGUgdGhyZWFkIHN0cnVjdCBzbyBjcHVfc3dp
dGNoKCkgY2FuIHF1aWNrbHkgbWFwIGluCiAJICogdGhlIHBjYiBzdHJ1Y3QgYW5kIGtlcm5lbCBz
dGFjay4KIAkgKi8KKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCS8qIEp1c3Qgb25lIGVudHJ5
IGZvciBvbmUgbGFyZ2Uga2VybmVsIHBhZ2UuICovCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3Bt
YXAsIHRkLT50ZF9rc3RhY2spOworCXRkLT50ZF9tZC5tZF91cHRlWzBdID0gKnB0ZSAmIH5UTEJM
T19TV0JJVFNfTUFTSzsKKwl0ZC0+dGRfbWQubWRfdXB0ZVsxXSA9IDE7CisKKyNlbHNlCisKKwlp
bnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCBLU1RBQ0tfUEFHRVM7IGkrKykgewogCQlwdGUgPSBw
bWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayArIGkgKiBQQUdFX1NJWkUpOwogCQl0
ZC0+dGRfbWQubWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CiAJfQorI2Vu
ZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIH0KIAogdm9pZApAQCAtMjc0LDE3ICsyODQs
MzEgQEAKIGNwdV90aHJlYWRfYWxsb2Moc3RydWN0IHRocmVhZCAqdGQpCiB7CiAJcHRfZW50cnlf
dCAqcHRlOwotCWludCBpOwogCi0JS0FTU0VSVCgodGQtPnRkX2tzdGFjayAmICgxIDw8IFBBR0Vf
U0hJRlQpKSA9PSAwLCAoImtlcm5lbCBzdGFjayBtdXN0IGJlIGFsaWduZWQuIikpOworCUtBU1NF
UlQoKHRkLT50ZF9rc3RhY2sgJiAoKEtTVEFDS19QQUdFX1NJWkUgKiAyKSAtIDEpICkgPT0gMCwK
KwkgICAgKCJrZXJuZWwgc3RhY2sgbXVzdCBiZSBhbGlnbmVkLiIpKTsKIAl0ZC0+dGRfcGNiID0g
KHN0cnVjdCBwY2IgKikodGQtPnRkX2tzdGFjayArCiAJICAgIHRkLT50ZF9rc3RhY2tfcGFnZXMg
KiBQQUdFX1NJWkUpIC0gMTsKIAl0ZC0+dGRfZnJhbWUgPSAmdGQtPnRkX3BjYi0+cGNiX3JlZ3M7
CiAKLQlmb3IgKGkgPSAwOyBpIDwgS1NUQUNLX1BBR0VTOyBpKyspIHsKLQkJcHRlID0gcG1hcF9w
dGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sgKyBpICogUEFHRV9TSVpFKTsKLQkJdGQtPnRk
X21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworI2lmZGVmIEtTVEFD
S19MQVJHRV9QQUdFCisJLyogSnVzdCBvbmUgZW50cnkgZm9yIG9uZSBsYXJnZSBrZXJuZWwgcGFn
ZS4gKi8KKwlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayk7CisJdGQt
PnRkX21kLm1kX3VwdGVbMF0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworCXRkLT50ZF9t
ZC5tZF91cHRlWzFdID0gMTsKKworI2Vsc2UKKworCXsKKwkJaW50IGk7CisKKwkJZm9yIChpID0g
MDsgaSA8IEtTVEFDS19QQUdFUzsgaSsrKSB7CisJCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h
cCwgdGQtPnRkX2tzdGFjayArIGkgKgorCQkJICAgIFBBR0VfU0laRSk7CisJCQl0ZC0+dGRfbWQu
bWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CisJCX0KIAl9CisjZW5kaWYg
LyogISBLU1RBQ0tfTEFSR0VfUEFHRSAqLwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9zeXMvbWlw
cy9taXBzL3VtYV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMKLS0tIGEv
c3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21pcHMvdW1hX21hY2hk
ZXAuYwpAQCAtNTIsNyArNTIsMTEgQEAKIAlwZmxhZ3MgPSBtYWxsb2Mydm1fZmxhZ3Mod2FpdCkg
fCBWTV9BTExPQ19XSVJFRDsKIAogCWZvciAoOzspIHsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAK
KwkJbSA9IHZtX3BhZ2VfYWxsb2MoTlVMTCwgMCwgcGZsYWdzIHwgVk1fQUxMT0NfTk9PQkopOwor
I2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIAkJbSA9IHZtX3BhZ2VfYWxsb2NfZnJlZWxp
c3QoVk1fRlJFRUxJU1RfRElSRUNULCBwZmxhZ3MpOworI2VuZGlmIC8qICEgTUlQUzY0X05FV19Q
TUFQICovCiAjaWZuZGVmIF9fbWlwc19uNjQKIAkJaWYgKG0gPT0gTlVMTCAmJiB2bV9wYWdlX3Jl
Y2xhaW1fY29udGlnKHBmbGFncywgMSwKIAkJICAgIDAsIE1JUFNfS1NFRzBfTEFSR0VTVF9QSFlT
LCBQQUdFX1NJWkUsIDApKQpAQCAtNjIsMTIgKzY2LDE4IEBACiAJCQlpZiAod2FpdCAmIE1fTk9X
QUlUKQogCQkJCXJldHVybiAoTlVMTCk7CiAJCQllbHNlCisjaWZkZWYgTUlQUzY0X05FV19QTUFQ
CisJCQkJcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKCk7CisjZWxzZSAvKiAhIE1JUFM2NF9O
RVdfUE1BUCAqLwogCQkJCVZNX1dBSVQ7CisjZW5kaWYgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8K
IAkJfSBlbHNlCiAJCQlicmVhazsKIAl9CiAKIAlwYSA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKwlp
ZiAoKHdhaXQgJiBNX05PRFVNUCkgPT0gMCkKKwkJZHVtcF9hZGRfcGFnZShwYSk7CiAJdmEgPSAo
dm9pZCAqKU1JUFNfUEhZU19UT19ESVJFQ1QocGEpOwogCWlmICgod2FpdCAmIE1fWkVSTykgJiYg
KG0tPmZsYWdzICYgUEdfWkVSTykgPT0gMCkKIAkJYnplcm8odmEsIFBBR0VfU0laRSk7CmRpZmYg
LS1naXQgYS9zeXMvbWlwcy9taXBzL3RyYXAuYyBiL3N5cy9taXBzL21pcHMvdHJhcC5jCi0tLSBh
L3N5cy9taXBzL21pcHMvdHJhcC5jCisrKyBiL3N5cy9taXBzL21pcHMvdHJhcC5jCkBAIC04MSw2
ICs4MSw3IEBACiAjaW5jbHVkZSA8bWFjaGluZS9taXBzX29wY29kZS5oPgogI2luY2x1ZGUgPG1h
Y2hpbmUvZnJhbWUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3JlZ251bS5oPgorI2luY2x1ZGUgPG1h
Y2hpbmUvdGxiLmg+CiAjaW5jbHVkZSA8bWFjaGluZS90bHMuaD4KIAogI2lmZGVmIEREQgpAQCAt
MjY0LDcgKzI2NSw3IEBACiAJInJlc2VydmVkIDIxIiwKIAkicmVzZXJ2ZWQgMjIiLAogCSJ3YXRj
aCIsCi0JInJlc2VydmVkIDI0IiwKKwkibWFjaGluZSBjaGVjayIsCiAJInJlc2VydmVkIDI1IiwK
IAkicmVzZXJ2ZWQgMjYiLAogCSJyZXNlcnZlZCAyNyIsCkBAIC02MzIsNiArNjMzLDMzIEBACiAj
ZW5kaWYKIAkJcGFuaWMoIk1DSEVDS1xuIik7CiAJCWJyZWFrOworCWNhc2UgVF9NQ0hFQ0sgKyBU
X1VTRVI6CisJCXsKKwkJCXVpbnQzMl90IHN0YXR1cyA9IG1pcHNfcmRfc3RhdHVzKCk7CisKKwkJ
CWlmIChzdGF0dXMgJiBNSVBTX1NSX1RTKSB7CisJCQkJLyoKKwkJCQkgKiBNYWNoaW5lIENoZWNr
IGV4Y2VwdGlvbiBjYXVzZWQgYnkgVExCCisJCQkJICogZGV0ZWN0aW5nIGEgbWF0Y2ggZm9yIG11
bHRpcGxlIGVudHJpZXMuCisJCQkJICoKKwkJCQkgKiBBdHRlbXB0IHRvIHJlY292ZXIgYnkgZmx1
c2hpbmcgdGhlIHVzZXIgVExCCisJCQkJICogYW5kIHJlc2V0dGluZyB0aGUgc3RhdHVzIGJpdC4K
KwkJCQkgKi8KKwkJCQlwcmludGYoIk1hY2hpbmUgQ2hlY2sgaW4gVXNlciAtIER1cCBUTEIgZW50
cnkuICIKKwkJCQkgICAgIlJlY292ZXJpbmcuLi5cbiIpOworCQkJCXBtYXAgPSAmcC0+cF92bXNw
YWNlLT52bV9wbWFwOworCQkJCXRsYl9pbnZhbGlkYXRlX2FsbF91c2VyKHBtYXApOworCQkJCW1p
cHNfd3Jfc3RhdHVzKHN0YXR1cyAmIH5NSVBTX1NSX1RTKTsKKworCQkJCXJldHVybiAodHJhcGZy
YW1lLT5wYyk7CisJCQl9IGVsc2UgeworI2lmZGVmIEREQgorCQkJCWtkYl90cmFwKHR5cGUsIDAs
IHRyYXBmcmFtZSk7CisjZW5kaWYKKwkJCQlwYW5pYygiTUNIRUNLXG4iKTsKKwkJCX0KKwkJfQor
CQlicmVhazsKIAljYXNlIFRfVExCX01PRDoKIAkJLyogY2hlY2sgZm9yIGtlcm5lbCBhZGRyZXNz
ICovCiAJCWlmIChLRVJOTEFORCh0cmFwZnJhbWUtPmJhZHZhZGRyKSkgewpAQCAtNjk0LDEwICs3
MjIsMjMgQEAKIAogCWNhc2UgVF9UTEJfTERfTUlTUyArIFRfVVNFUjoKIAkJZnR5cGUgPSBWTV9Q
Uk9UX1JFQUQ7Ci0JCWdvdG8gZG9mYXVsdDsKKwkJZ290byBjaGVja3JlZmJpdDsKIAogCWNhc2Ug
VF9UTEJfU1RfTUlTUyArIFRfVVNFUjoKIAkJZnR5cGUgPSBWTV9QUk9UX1dSSVRFOworCitjaGVj
a3JlZmJpdDoKKwkJLyoKKwkJICogV2FzIHRoaXMgdHJhcCBjYXVzZWQgYnkgdGhlIFBURV9WUiBi
aXQgbm90IGJlaW5nIHNldD8KKwkJICovCisJCWlmIChwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZCgm
cC0+cF92bXNwYWNlLT52bV9wbWFwLAorCQkgICAgdHJhcGZyYW1lLT5iYWR2YWRkcikgPT0gMCkg
eworCQkJaWYgKCF1c2VybW9kZSkgeworCQkJCXJldHVybiAodHJhcGZyYW1lLT5wYyk7CisJCQl9
CisJCQlnb3RvIG91dDsKKwkJfQorCiBkb2ZhdWx0OgogCQl7CiAJCQl2bV9vZmZzZXRfdCB2YTsK
QEAgLTE0MTEsOSArMTQ1MiwxNiBAQAogCXN0cnVjdCBwcm9jICpwID0gY3VycHJvYzsKIAogCXBk
ZXAgPSAoJihwLT5wX3Ztc3BhY2UtPnZtX3BtYXAucG1fc2VndGFiWyh2YSA+PiBTRUdTSElGVCkg
JiAoTlBERVBHIC0gMSldKSk7Ci0JaWYgKCpwZGVwKQotCQlwdGVwID0gcG1hcF9wdGUoJnAtPnBf
dm1zcGFjZS0+dm1fcG1hcCwgdmEpOwotCWVsc2UKKwlpZiAoKnBkZXApIHsKKyNpZiBWTV9OUkVT
RVJWTEVWRUwgPiAwCisJCXBkX2VudHJ5X3QgKnBkZSA9ICZwZGVwWyh2YSA+PiBQRFJTSElGVCkg
JiAoTlBERVBHIC0gMSldOworCisJCWlmIChwZGVfaXNfc3VwZXJwYWdlKHBkZSkpCisJCQlwdGVw
ID0gKHB0X2VudHJ5X3QgKilwZGU7CisJCWVsc2UKKyNlbmRpZiAvKiBWTV9OUkVTRVJWTEVWRUwg
PiAwICovCisJCQlwdGVwID0gcG1hcF9wdGUoJnAtPnBfdm1zcGFjZS0+dm1fcG1hcCwgdmEpOwor
CX0gZWxzZQogCQlwdGVwID0gKHB0X2VudHJ5X3QgKikwOwogCiAJKnBkZXBwID0gcGRlcDsKZGlm
ZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvdGxiLmMgYi9zeXMvbWlwcy9taXBzL3RsYi5jCi0tLSBh
L3N5cy9taXBzL21pcHMvdGxiLmMKKysrIGIvc3lzL21pcHMvbWlwcy90bGIuYwpAQCAtNDAsMTAg
KzQwLDE0IEBACiAjaW5jbHVkZSA8bWFjaGluZS9wdGUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3Rs
Yi5oPgogCisjaW5jbHVkZSAib3B0X3ZtLmgiCisKICNpZiBkZWZpbmVkKENQVV9DTk1JUFMpCiAj
ZGVmaW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTEyOAogI2VsaWYgZGVmaW5lZChDUFVfTkxNKQog
I2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkoMjA0OCArIDEyOCkKKyNlbGlmIGRlZmluZWQo
Q1BVX0NIRVJJKQorI2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkxNDQKICNlbHNlCiAjZGVm
aW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTY0CiAjZW5kaWYKQEAgLTEwMiwyMCArMTA2LDMxIEBA
CiB7CiAJcmVnaXN0ZXJfdCBhc2lkOwogCXJlZ2lzdGVyX3QgczsKKwl1aW50MzJfdCBwYWdlbWFz
azsKKwl1bnNpZ25lZCBsb25nIG1hc2ssIHNpemU7CiAKLQl2YSAmPSB+UEFHRV9NQVNLOworCUtB
U1NFUlQoKFRMQkxPX1BURV9UT19JRFgocHRlMCkgPT0gVExCTE9fUFRFX1RPX0lEWChwdGUxKSks
CisJICAgICgiJXM6IHB0ZTAgYW5kIHB0ZTEgcGFnZSBzaXplcyBkb24ndCBtYXRjaCIsIF9fZnVu
Y19fKSk7CisKKwkvKiBDb21wdXRlIHRoZSBwYWdlIG1hc2sgYW5kIHNpemUuICovCisJcGFnZW1h
c2sgPSBUTEJMT19QVEVfVE9fTUFTSyhwdGUwKTsKKwltYXNrID0gKHVuc2lnbmVkIGxvbmcpcGFn
ZW1hc2sgfCBQQUdFX01BU0s7IC8qIE9SIGl0IHdpdGggbG93ZXIgMTIgYml0cyAqLworCXNpemUg
PSBtYXNrICsgMTsKKworCXZhICY9IH5tYXNrOwogCiAJcyA9IGludHJfZGlzYWJsZSgpOwogCWFz
aWQgPSBtaXBzX3JkX2VudHJ5aGkoKSAmIFRMQkhJX0FTSURfTUFTSzsKIAogCW1pcHNfd3JfaW5k
ZXgoaSk7Ci0JbWlwc193cl9wYWdlbWFzaygwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKHBhZ2VtYXNr
KTsKIAltaXBzX3dyX2VudHJ5aGkoVExCSElfRU5UUlkodmEsIDApKTsKIAltaXBzX3dyX2VudHJ5
bG8wKHB0ZTApOwogCW1pcHNfd3JfZW50cnlsbzEocHRlMSk7CiAJdGxiX3dyaXRlX2luZGV4ZWQo
KTsKIAogCW1pcHNfd3JfZW50cnloaShhc2lkKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDApOwogCWlu
dHJfcmVzdG9yZShzKTsKIH0KIApAQCAtMTM3LDcgKzE1Miw2IEBACiAJaSA9IG1pcHNfcmRfaW5k
ZXgoKTsKIAlpZiAoaSA+PSAwKQogCQl0bGJfaW52YWxpZGF0ZV9vbmUoaSk7Ci0KIAltaXBzX3dy
X2VudHJ5aGkoYXNpZCk7CiAJaW50cl9yZXN0b3JlKHMpOwogfQpAQCAtMjk4LDI5ICszMTIsNTMg
QEAKIAlyZWdpc3Rlcl90IGFzaWQ7CiAJcmVnaXN0ZXJfdCBzOwogCWludCBpOworCXVpbnQzMl90
IHBhZ2VtYXNrOworCXVuc2lnbmVkIGxvbmcgbWFzaywgc2l6ZTsKKwlwdF9lbnRyeV90IHB0ZTAs
IHB0ZTE7CisKKwkvKiBDb21wdXRlIHRoZSBwYWdlIG1hc2sgYW5kIHNpemUuICovCisJcGFnZW1h
c2sgPSBUTEJMT19QVEVfVE9fTUFTSyhwdGUpOworCW1hc2sgPSAodW5zaWduZWQgbG9uZylwYWdl
bWFzayB8IFBBR0VfTUFTSzsgLyogT1IgaXQgd2l0aCBsb3dlciAxMiBiaXRzICovCisJc2l6ZSA9
IG1hc2sgKyAxOwogCi0JdmEgJj0gflBBR0VfTUFTSzsKKwl2YSAmPSB+bWFzazsKIAlwdGUgJj0g
flRMQkxPX1NXQklUU19NQVNLOwogCiAJcyA9IGludHJfZGlzYWJsZSgpOwogCWFzaWQgPSBtaXBz
X3JkX2VudHJ5aGkoKSAmIFRMQkhJX0FTSURfTUFTSzsKIAotCW1pcHNfd3JfcGFnZW1hc2soMCk7
CisJbWlwc193cl9wYWdlbWFzayhwYWdlbWFzayk7CiAJbWlwc193cl9lbnRyeWhpKFRMQkhJX0VO
VFJZKHZhLCBwbWFwX2FzaWQocG1hcCkpKTsKIAl0bGJfcHJvYmUoKTsKIAlpID0gbWlwc19yZF9p
bmRleCgpOwogCWlmIChpID49IDApIHsKIAkJdGxiX3JlYWQoKTsKKwkJcHRlMCA9IG1pcHNfcmRf
ZW50cnlsbzAoKTsKKwkJcHRlMSA9IG1pcHNfcmRfZW50cnlsbzEoKTsKKwkJS0FTU0VSVCgoVExC
TE9fUFRFX1RPX0lEWChwdGUpID09IFRMQkxPX1BURV9UT19JRFgocHRlMCkgJiYKKwkJICAgIFRM
QkxPX1BURV9UT19JRFgocHRlKSA9PSBUTEJMT19QVEVfVE9fSURYKHB0ZTEpKSwKKwkJCSgiJXM6
IHB0ZSwgcHRlMCBhbmQgcHRlMSBwYWdlIHNpemVzIGRvbid0IG1hdGNoIiwgX19mdW5jX18pKTsK
IAotCQlpZiAoKHZhICYgUEFHRV9TSVpFKSA9PSAwKSB7CisJCWlmICgodmEgJiBzaXplKSA9PSAw
KSB7CiAJCQltaXBzX3dyX2VudHJ5bG8wKHB0ZSk7CisJCQlpZiAocGFnZW1hc2sgJiB+UEFHRV9N
QVNLKSB7CisJCQkJLyogU3VwZXJwYWdlICovCisJCQkJcHRlMSA9IChwdGUxICYgfihQVEVfVlIg
fCBQVEVfRCkpIHwgKHB0ZSAmIChQVEVfVlIgfCBQVEVfRCkpOworCQkJCW1pcHNfd3JfZW50cnls
bzEocHRlMSk7CisJCQl9CiAJCX0gZWxzZSB7CiAJCQltaXBzX3dyX2VudHJ5bG8xKHB0ZSk7CisJ
CQlpZiAocGFnZW1hc2sgJiB+UEFHRV9NQVNLKSB7CisJCQkJLyogU3VwZXJwYWdlICovCisJCQkJ
cHRlMCA9IChwdGUwICYgfihQVEVfVlIgfCBQVEVfRCkpIHwgKHB0ZSAmIChQVEVfVlIgfCBQVEVf
RCkpOworCQkJCW1pcHNfd3JfZW50cnlsbzAocHRlMCk7CisJCQl9CiAJCX0KIAkJdGxiX3dyaXRl
X2luZGV4ZWQoKTsKIAl9CiAKIAltaXBzX3dyX2VudHJ5aGkoYXNpZCk7CisJbWlwc193cl9wYWdl
bWFzaygwKTsKIAlpbnRyX3Jlc3RvcmUocyk7CiB9CiAKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21p
cHMvc3d0Y2guUyBiL3N5cy9taXBzL21pcHMvc3d0Y2guUwotLS0gYS9zeXMvbWlwcy9taXBzL3N3
dGNoLlMKKysrIGIvc3lzL21pcHMvbWlwcy9zd3RjaC5TCkBAIC0zMTUsMzYgKzMxNSw5MSBAQAog
ICogTk9URTogVGhpcyBpcyBoYXJkIGNvZGVkIHRvIFVQQUdFUyA9PSAyLgogICogQWxzbywgdGhl
cmUgc2hvdWxkIGJlIG5vIFRMQiBmYXVsdHMgYXQgdGhpcyBwb2ludC4KICAqLwotCU1UQzAJdjAs
IE1JUFNfQ09QXzBfVExCX0hJCQkjIFZQTiA9IHZhCisJTVRDMAkJdjAsIE1JUFNfQ09QXzBfVExC
X0hJCSMgVlBOID0gdmEKIAlIQVpBUkRfREVMQVkKIAl0bGJwCQkJCQkjIHByb2JlIFZQTgogCUhB
WkFSRF9ERUxBWQotCW1mYzAJczAsIE1JUFNfQ09QXzBfVExCX0lOREVYCisJbWZjMAkJczAsIE1J
UFNfQ09QXzBfVExCX0lOREVYCiAJSEFaQVJEX0RFTEFZCiAKLQlQVFJfTEkJdDEsIE1JUFNfS1NF
RzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIgZW50cnkKLQlibHR6CXMwLCBlbnRyeTBzZXQKKwkj
IE1JUFNfS1NFRzBfU1RBUlQgKyAoMiAqIGluZGV4ICogUEFHRV9TSVpFKSAtPiBNSVBTX0NPUF8w
X1RMQl9ISQorCVBUUl9MSQkJdDEsIE1JUFNfS1NFRzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIg
ZW50cnkKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCWJsdHoJCXMwLCBpbnZhbF9ueHQxCisj
ZWxzZQorCWJsdHoJCXMwLCBlbnRyeTBzZXQKKyNlbmRpZgogCW5vcAotCXNsbAlzMCwgUEFHRV9T
SElGVCArIDEKLQlhZGR1CXQxLCBzMAotCU1UQzAJdDEsIE1JUFNfQ09QXzBfVExCX0hJCisJc2xs
CQlzMCwgUEFHRV9TSElGVCArIDEKKwlQVFJfQUREVQl0MSwgczAKKwlNVEMwCQl0MSwgTUlQU19D
T1BfMF9UTEJfSEkKIAlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzAKIAlQVEVfTVRD
MAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzEKKwlNVEMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9Q
R19NQVNLCiAJSEFaQVJEX0RFTEFZCiAJdGxid2kKIAlIQVpBUkRfREVMQVkKLQlNVEMwCXYwLCBN
SVBTX0NPUF8wX1RMQl9ISQkJIyBzZXQgVlBOIGFnYWluCisKKyNpZmRlZiBLU1RBQ0tfTEFSR0Vf
UEFHRQorLyoKKyAqIFdpdGggYSBLU1RBQ0tfUEFHRV9TSVpFIG9mIDE2SyBhbmQgUEFHRV9TSVpF
IG9mIDRLIGl0IGlzIHBvc3NpYmxlIHRoYXQKKyAqIGEgc2Vjb25kIFRMQiBlbnRyeSBpcyBjdXJy
ZW50bHkgbWFwcGluZyB0aGUga2VybmVsIHRocmVhZCBzdGFjayBhcyBhCisgKiByZWd1bGFyIDRL
IHNpemVkIHBhZ2UocykuIENoZWNrIGZvciB0aGlzIGNhc2UgYW5kLCBpZiBzbywgaW52YWxpZGF0
ZQorICogdGhhdCBUTEIgZW50cnkgYXMgd2VsbC4KKyAqLworI2lmIChQQUdFX1NJWkUgIT0gNDA5
NikgJiYgKEtTVEFDS19QQUdFX1NJWkUgIT0gMTYzODQpCisjZXJyb3IgUEFHRV9TSVpFIGlzIG5v
dCA0SyBvciBLU1RBQ0tfUEFHRV9TSVpFIGlzIG5vdCAxNksuCisjZW5kaWYKK2ludmFsX254dDE6
CisJbW92ZQkJdjEsIHYwCisJUFRSX0FERFUJdjEsIFBBR0VfU0laRSAqIDIKKwlNVEMwCQl2MSwg
TUlQU19DT1BfMF9UTEJfSEkJCSMgVlBOID0gdmEKKwlIQVpBUkRfREVMQVkKKwl0bGJwCQkJCQkJ
IyBwcm9iZSBWUE4KKwlIQVpBUkRfREVMQVkKKwltZmMwCQlzMCwgTUlQU19DT1BfMF9UTEJfSU5E
RVgKKwlIQVpBUkRfREVMQVkKKworCSMgTUlQU19LU0VHMF9TVEFSVCArICgyICogaW5kZXggKiBQ
QUdFX1NJWkUpIC0+IE1JUFNfQ09QXzBfVExCX0hJCisJUFRSX0xJCQl0MSwgTUlQU19LU0VHMF9T
VEFSVAkJIyBpbnZhbGlkYXRlIHRsYiBlbnRyeQorCWJsdHoJCXMwLCBlbnRyeTBzZXQKKwlub3AK
KwlzbGwJCXMwLCBQQUdFX1NISUZUICsgMQorCVBUUl9BRERVCXQxLCBzMAorCU1UQzAJCXQxLCBN
SVBTX0NPUF8wX1RMQl9ISQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMAorCVBU
RV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMQorCU1UQzAJCXplcm8sIE1JUFNfQ09QXzBf
VExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKwl0bGJ3aQorCUhBWkFSRF9ERUxBWQorI2VuZGlm
CS8qIEtTVEFDS19MQVJHRV9QQUdFICovCiAKIGVudHJ5MHNldDoKKwlNVEMwCQl2MCwgTUlQU19D
T1BfMF9UTEJfSEkJCSMgc2V0IFZQTiBhZ2FpbgorCUhBWkFSRF9ERUxBWQogLyogU01QISEgLSBX
b3JrcyBvbmx5IGZvciAgdW5zaGFyZWQgVExCIGNhc2UgLSBpLmUuIG5vIHYtY3B1cyAqLwotCW10
YzAJemVybywgTUlQU19DT1BfMF9UTEJfSU5ERVgJCSMgVExCIGVudHJ5ICMwCisJbXRjMAkJemVy
bywgTUlQU19DT1BfMF9UTEJfSU5ERVgJIyBUTEIgZW50cnkgIzAKIAlIQVpBUkRfREVMQVkKIAlQ
VEVfTVRDMAlhMSwgTUlQU19DT1BfMF9UTEJfTE8wCQkjIHVwdGVbMF0KIAlIQVpBUkRfREVMQVkK
IAlQVEVfTVRDMAlhMiwgTUlQU19DT1BfMF9UTEJfTE8xCQkjIHVwdGVbMV0KKyNpZmRlZiBLU1RB
Q0tfTEFSR0VfUEFHRQorCUhBWkFSRF9ERUxBWQorCWxpCQl0MSwgS1NUQUNLX1RMQk1BU0tfTUFT
SworCU1UQzAJCXQxLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCiAJSEFaQVJEX0RFTEFZCisjZWxz
ZQorCU1UQzAJCXplcm8sIE1JUFNfQ09QXzBfVExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKyNl
bmRpZgogCXRsYndpCQkJCQkjIHNldCBUTEIgZW50cnkgIzAKIAlIQVpBUkRfREVMQVkKKworI2lm
ZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJTVRDMAkJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFT
SworCUhBWkFSRF9ERUxBWQorI2VuZGlmCiAvKgogICogTm93IHJ1bm5pbmcgb24gbmV3IHUgc3Ry
dWN0LgogICovCmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMgYi9zeXMv
bWlwcy9taXBzL3BtYXBfbWlwczY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKLS0tIC9kZXYvbnVs
bAorKysgYi9zeXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMKQEAgLTAsMCArMSw1NTI0IEBACisv
KgorICogQ29weXJpZ2h0IChjKSAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2Fs
aWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQg
Sm9obiBTLiBEeXNvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykg
MTk5NCBEYXZpZCBHcmVlbm1hbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo
dCAoYykgMjAwMyBQZXRlciBXZW1tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp
Z2h0IChjKSAyMDA1LTIwMTAgQWxhbiBMLiBDb3ggPGFsY0Bjcy5yaWNlLmVkdT4KKyAqIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgU3RhY2V5IEQuIFNvbiA8c3Nv
bkAuLi4+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJp
dmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIHRoZSBTeXN0
ZW1zIFByb2dyYW1taW5nIEdyb3VwIG9mIHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggQ29tcHV0ZXIK
KyAqIFNjaWVuY2UgRGVwYXJ0bWVudCBhbmQgV2lsbGlhbSBKb2xpdHogb2YgVVVORVQgVGVjaG5v
bG9naWVzIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZl
cnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdh
cmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJV
VE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
CisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJZnJvbToJ
QCgjKXBtYXAuYwk3LjcgKEJlcmtlbGV5KQk1LzEyLzkxCisgKglmcm9tOiBzcmMvc3lzL2kzODYv
aTM4Ni9wbWFwLmMsdiAxLjI1MC4yLjggMjAwMC8xMS8yMSAwMDowOToxNCBwcworICoJSk5QUjog
cG1hcC5jLHYgMS4xMS4yLjEgMjAwNy8wOC8xNiAxMTo1MTowNiBnaXJpc2gKKyAqLworCisvKgor
ICoJTWFuYWdlcyBwaHlzaWNhbCBhZGRyZXNzIG1hcHMuCisgKgorICoJU2luY2UgdGhlIGluZm9y
bWF0aW9uIG1hbmFnZWQgYnkgdGhpcyBtb2R1bGUgaXMKKyAqCWFsc28gc3RvcmVkIGJ5IHRoZSBs
b2dpY2FsIGFkZHJlc3MgbWFwcGluZyBtb2R1bGUsCisgKgl0aGlzIG1vZHVsZSBtYXkgdGhyb3cg
YXdheSB2YWxpZCB2aXJ0dWFsLXRvLXBoeXNpY2FsCisgKgltYXBwaW5ncyBhdCBhbG1vc3QgYW55
IHRpbWUuICBIb3dldmVyLCBpbnZhbGlkYXRpb25zCisgKglvZiB2aXJ0dWFsLXRvLXBoeXNpY2Fs
IG1hcHBpbmdzIG11c3QgYmUgZG9uZSBhcworICoJcmVxdWVzdGVkLgorICoKKyAqCUluIG9yZGVy
IHRvIGNvcGUgd2l0aCBoYXJkd2FyZSBhcmNoaXRlY3R1cmVzIHdoaWNoCisgKgltYWtlIHZpcnR1
YWwtdG8tcGh5c2ljYWwgbWFwIGludmFsaWRhdGVzIGV4cGVuc2l2ZSwKKyAqCXRoaXMgbW9kdWxl
IG1heSBkZWxheSBpbnZhbGlkYXRlIG9yIHJlZHVjZWQgcHJvdGVjdGlvbgorICoJb3BlcmF0aW9u
cyB1bnRpbCBzdWNoIHRpbWUgYXMgdGhleSBhcmUgYWN0dWFsbHkKKyAqCW5lY2Vzc2FyeS4gIFRo
aXMgbW9kdWxlIGlzIGdpdmVuIGZ1bGwgaW5mb3JtYXRpb24gYXMKKyAqCXRvIHdoaWNoIHByb2Nl
c3NvcnMgYXJlIGN1cnJlbnRseSB1c2luZyB3aGljaCBtYXBzLAorICoJYW5kIHRvIHdoZW4gcGh5
c2ljYWwgbWFwcyBtdXN0IGJlIG1hZGUgY29ycmVjdC4KKyAqLworCisjaW5jbHVkZSA8c3lzL2Nk
ZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRlICJvcHRfZGRiLmgiCisj
aW5jbHVkZSAib3B0X3BtYXAuaCIKKyNpbmNsdWRlICJvcHRfdm0uaCIKKworI2luY2x1ZGUgPHN5
cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgorI2luY2x1ZGUgPHN5cy9rdHIuaD4K
KyNpbmNsdWRlIDxzeXMvbG9jay5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8
c3lzL21zZ2J1Zi5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2luY2x1ZGUgPHN5cy9wY3B1
Lmg+CisjaW5jbHVkZSA8c3lzL3Byb2MuaD4KKyNpbmNsdWRlIDxzeXMvcndsb2NrLmg+CisjaW5j
bHVkZSA8c3lzL3NjaGVkLmg+CisjaWZkZWYgU01QCisjaW5jbHVkZSA8c3lzL3NtcC5oPgorI2Vs
c2UKKyNpbmNsdWRlIDxzeXMvY3B1c2V0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc3lzY3Rs
Lmg+CisjaW5jbHVkZSA8c3lzL3ZtbWV0ZXIuaD4KKworI2lmZGVmIEREQgorI2luY2x1ZGUgPGRk
Yi9kZGIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dm0vdm0uaD4KKyNpbmNsdWRlIDx2bS92bV9w
YXJhbS5oPgorI2luY2x1ZGUgPHZtL3ZtX2tlcm4uaD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+
CisjaW5jbHVkZSA8dm0vdm1fbWFwLmg+CisjaW5jbHVkZSA8dm0vdm1fb2JqZWN0Lmg+CisjaW5j
bHVkZSA8dm0vdm1fZXh0ZXJuLmg+CisjaW5jbHVkZSA8dm0vdm1fcGFnZW91dC5oPgorI2luY2x1
ZGUgPHZtL3ZtX3BhZ2VyLmg+CisjaW5jbHVkZSA8dm0vdm1fcmFkaXguaD4KKyNpbmNsdWRlIDx2
bS92bV9yZXNlcnYuaD4KKyNpbmNsdWRlIDx2bS91bWEuaD4KKworI2luY2x1ZGUgPG1hY2hpbmUv
Y2FjaGUuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL21kX3Zhci5oPgorI2luY2x1ZGUgPG1hY2hpbmUv
dGxiLmg+CisKKyN1bmRlZiBQTUFQX0RFQlVHCisKKyNpZiAhZGVmaW5lZChESUFHTk9TVElDKQor
I2RlZmluZQlQTUFQX0lOTElORSBfX2lubGluZQorI2Vsc2UKKyNkZWZpbmUJUE1BUF9JTkxJTkUK
KyNlbmRpZgorCisvLyAjZGVmaW5lIFBWX1NUQVRTCisjaWZkZWYgUFZfU1RBVFMKKyNkZWZpbmUg
UFZfU1RBVCh4KQlkbyB7IHggOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUFZfU1RBVCh4
KQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZQlwYV9pbmRleChwYSkJKChwYSkg
Pj4gUERSU0hJRlQpCisjZGVmaW5lCXBhX3RvX3B2aChwYSkJKCZwdl90YWJsZVtwYV9pbmRleChw
YSldKQorCisjZGVmaW5lCU5QVl9MSVNUX0xPQ0tTCU1BWENQVQorCisjZGVmaW5lCVBIWVNfVE9f
UFZfTElTVF9MT0NLKHBhKQlcCisJCSgmcHZfbGlzdF9sb2Nrc1twYV9pbmRleChwYSkgJSBOUFZf
TElTVF9MT0NLU10pCisKKyNkZWZpbmUJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2tw
LCBwYSkJZG8gewlcCisJc3RydWN0IHJ3bG9jayAqKl9sb2NrcCA9IChsb2NrcCk7CQlcCisJc3Ry
dWN0IHJ3bG9jayAqX25ld19sb2NrOwkJCVwKKwkJCQkJCQlcCisJX25ld19sb2NrID0gUEhZU19U
T19QVl9MSVNUX0xPQ0socGEpOwkJXAorCWlmIChfbmV3X2xvY2sgIT0gKl9sb2NrcCkgewkJCVwK
KwkJaWYgKCpfbG9ja3AgIT0gTlVMTCkJCQlcCisJCQlyd193dW5sb2NrKCpfbG9ja3ApOwkJXAor
CQkqX2xvY2twID0gX25ld19sb2NrOwkJCVwKKwkJIHJ3X3dsb2NrKCpfbG9ja3ApOwkJCVwKKwl9
CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZN
X1BBR0UobG9ja3AsIG0pCVwKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBW
TV9QQUdFX1RPX1BIWVMobSkpCisKKyNkZWZpbmUJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9ja3Ap
CQlkbyB7CVwKKwlzdHJ1Y3Qgcndsb2NrICoqX2xvY2twID0gKGxvY2twKTsJCVwKKwkJCQkJCQlc
CisJaWYgKCpfbG9ja3AgIT0gTlVMTCkgewkJCQlcCisJCXJ3X3d1bmxvY2soKl9sb2NrcCk7CQkJ
XAorCQkqX2xvY2twID0gTlVMTDsJCQkJXAorCX0JCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVm
aW5lCVZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pCVwKKwkJUEhZU19UT19QVl9MSVNUX0xPQ0so
Vk1fUEFHRV9UT19QSFlTKG0pKQorCisvKgorICogR2V0IFBERXMgYW5kIFBURXMgZm9yIHVzZXIv
a2VybmVsIGFkZHJlc3Mgc3BhY2UKKyAqLworI2RlZmluZQlwbWFwX3NlZ19pbmRleCh2KQkoKCh2
KSA+PiBTRUdTSElGVCkgJiAoTlBERVBHIC0gMSkpCisjZGVmaW5lCXBtYXBfcGRlX2luZGV4KHYp
CSgoKHYpID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKSkKKyNkZWZpbmUJcG1hcF9wdGVfaW5k
ZXgodikJKCgodikgPj4gUEFHRV9TSElGVCkgJiAoTlBURVBHIC0gMSkpCisjZGVmaW5lCXBtYXBf
cGRlX3BpbmRleCh2KQkoKHYpID4+IFBEUlNISUZUKQorCisjZGVmaW5lCU5VUERFCQkJKE5QREVQ
RyAqIE5QREVQRykKKyNkZWZpbmUJTlVTRVJQR1RCTFMJCShOVVBERSArIE5QREVQRykKKworI2Rl
ZmluZQlpc19rZXJuZWxfcG1hcCh4KQkoKHgpID09IGtlcm5lbF9wbWFwKQorCitzdHJ1Y3QgcG1h
cCBrZXJuZWxfcG1hcF9zdG9yZTsKK3BkX2VudHJ5X3QgKmtlcm5lbF9zZWdtYXA7CisKK3ZtX29m
ZnNldF90IHZpcnR1YWxfYXZhaWw7CS8qIFZBIG9mIGZpcnN0IGF2YWlsIHBhZ2UgKGFmdGVyIGtl
cm5lbCBic3MpICovCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2VuZDsJLyogVkEgb2YgbGFzdCBhdmFp
bCBwYWdlIChlbmQgb2Yga2VybmVsIEFTKSAqLworCitzdGF0aWMgaW50IG5rcHQ7Cit1bnNpZ25l
ZCBwbWFwX21heF9hc2lkOwkJLyogbWF4IEFTSUQgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0gKi8K
Kworc3RhdGljIFNZU0NUTF9OT0RFKF92bSwgT0lEX0FVVE8sIHBtYXAsIENUTEZMQUdfUkQsIDAs
ICJWTS9wbWFwIHBhcmFtZXRlcnMiKTsKK3N0YXRpYyBpbnQgcGdfc3BfZW5hYmxlZCA9IDA7CitT
WVNDVExfSU5UKF92bV9wbWFwLCBPSURfQVVUTywgcGdfcHNfZW5hYmxlZCwgQ1RMRkxBR19SRFRV
TiB8IENUTEZMQUdfTk9GRVRDSCwKKyAgICAmcGdfc3BfZW5hYmxlZCwgMCwgIkFyZSBsYXJnZSBw
YWdlIG1hcHBpbmdzIGVuYWJsZWQ/Iik7CisKKyNkZWZpbmUJUE1BUF9BU0lEX1JFU0VSVkVECTAK
Kwordm1fb2Zmc2V0X3Qga2VybmVsX3ZtX2VuZCA9IFZNX01JTl9LRVJORUxfQUREUkVTUzsKKwor
c3RhdGljIHZvaWQgcG1hcF9hc2lkX2FsbG9jKHBtYXBfdCBwbWFwKTsKKworc3RhdGljIHN0cnVj
dCByd2xvY2tfcGFkYWxpZ24gcHZoX2dsb2JhbF9sb2NrOworCisvKgorICogRGF0YSBmb3IgdGhl
IHB2IGVudHJ5IGFsbG9jYXRpb24gbWVjaGFuaXNtCisgKi8KK3N0YXRpYyBUQUlMUV9IRUFEKHBj
aCwgcHZfY2h1bmspIHB2X2NodW5rcyA9IFRBSUxRX0hFQURfSU5JVElBTElaRVIocHZfY2h1bmtz
KTsKK3N0YXRpYyBzdHJ1Y3QgbXR4IHB2X2NodW5rc19tdXRleDsKK3N0YXRpYyBzdHJ1Y3Qgcnds
b2NrIHB2X2xpc3RfbG9ja3NbTlBWX0xJU1RfTE9DS1NdOworc3RhdGljIHN0cnVjdCBtZF9wYWdl
ICpwdl90YWJsZTsKKworc3RhdGljIHZvaWQgZnJlZV9wdl9jaHVuayhzdHJ1Y3QgcHZfY2h1bmsg
KnBjKTsKK3N0YXRpYyB2b2lkIGZyZWVfcHZfZW50cnkocG1hcF90IHBtYXAsIHB2X2VudHJ5X3Qg
cHYpOworc3RhdGljIHB2X2VudHJ5X3QgZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qg
cndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCByZWNsYWltX3B2X2NodW5rKHBtYXBf
dCBsb2NrZWRfcG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBtYXBf
cHZoX2ZyZWUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZh
KTsKK3N0YXRpYyBwdl9lbnRyeV90IHBtYXBfcHZoX3JlbW92ZShzdHJ1Y3QgbWRfcGFnZSAqcHZo
LCBwbWFwX3QgcG1hcCwKKyAgICB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm1fcGFnZV90IHBt
YXBfYWxsb2NfZGlyZWN0X3BhZ2UodW5zaWduZWQgaW50IGluZGV4LCBpbnQgcmVxKTsKK3N0YXRp
YyB2bV9wYWdlX3QgcG1hcF9lbnRlcl9xdWlja19sb2NrZWQocG1hcF90IHBtYXAsIHZtX29mZnNl
dF90IHZhLAorICAgIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCwgdm1fcGFnZV90IG1wdGUs
ICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcmVzZXJ2ZV9wdl9lbnRyaWVz
KHBtYXBfdCBwbWFwLCBpbnQgbmVlZGVkLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7Citz
dGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq
cGRlLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZV9s
b2NrZWQocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwKKyAgICB2bV9vZmZzZXRfdCB2YSwg
c3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxvY3BkZShw
bWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsK
K3N0YXRpYyBib29sZWFuX3QgcG1hcF9lbnRlcl9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90
IHZhLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3QgcHJvdCwgc3RydWN0IHJ3bG9jayAqKmxv
Y2twKTsKK3N0YXRpYyB2b2lkIHBtYXBfcHZfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zm
c2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0
YXRpYyBib29sZWFuX3QgcG1hcF9wdl9pbnNlcnRfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRf
dCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGlj
IHZvaWQgcG1hcF9wdl9wcm9tb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZt
X3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBt
YXBfZmlsbF9wdHAocHRfZW50cnlfdCAqZmlyc3RwdGUsIHB0X2VudHJ5X3QgbmV3cHRlKTsKK3N0
YXRpYyBfX2lubGluZSBpbnQgcG1hcF9pbnNlcnRfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fcGFn
ZV90IG1wdGUpOworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdCBwbWFwX2xvb2t1cF9wdF9wYWdl
KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm9pZCBwbWFwX3Byb21vdGVf
cGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAorICAgIHN0
cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3ZlX3BkZShwbWFwX3Qg
cG1hcCwgcGRfZW50cnlfdCAqcGRxLCB2bV9vZmZzZXRfdCBzdmEsCisgICAgc3RydWN0IHNwZ2xp
c3QgKmZyZWUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3Zl
X3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRfZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRfdCB2YSwK
KyAgICBwZF9lbnRyeV90IHB0ZXBkZSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsIHN0cnVjdCByd2xv
Y2sgKipsb2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX3JlbW92ZV9wYWdlKHN0cnVjdCBwbWFwICpw
bWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSk7CitzdGF0aWMg
Ym9vbGVhbl90IHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEsCisgICAgdm1fcGFnZV90IG0sIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMg
dm9pZCBwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcHRfZW50
cnlfdCBwdGUpOworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCk7
CitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEpOworc3RhdGljIHZvaWQgX3BtYXBfdW53aXJlX3B0cChwbWFwX3QgcG1hcCwgdm1fb2Zm
c2V0X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlKTsKKworc3Rh
dGljIHZtX3BhZ2VfdCBwbWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwK
KyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCBfcG1hcF9hbGxv
Y3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQgcHRlcGluZGV4LAorICAgIHN0cnVjdCByd2xvY2sg
Kipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfdW51c2VfcHQocG1hcF90LCB2bV9vZmZzZXRfdCwg
cGRfZW50cnlfdCwgc3RydWN0IHNwZ2xpc3QgKik7CitzdGF0aWMgcHRfZW50cnlfdCBpbml0X3B0
ZV9wcm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJvdCk7CisK
K3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpOworc3Rh
dGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbih2b2lkICphcmcpOworc3RhdGlj
IHZvaWQgcG1hcF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKTsKKworLyoKKyAqIFBhZ2Ug
dGFibGUgZW50cnkgbG9va3VwIHJvdXRpbmVzLgorICovCisKKy8qIFJldHVybiBhIHNlZ21lbnQg
ZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMgX19pbmxp
bmUgcGRfZW50cnlfdCAqCitwbWFwX3NlZ21hcChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp
Cit7CisKKwlyZXR1cm4gKCZwbWFwLT5wbV9zZWd0YWJbcG1hcF9zZWdfaW5kZXgodmEpXSk7Cit9
CisKKy8qIFJldHVybiBhIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBnaXZlbiBzZWdtZW50IHRh
YmxlICYgdmlydHVhbCBhZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgor
cG1hcF9wZHBlX3RvX3BkZShwZF9lbnRyeV90ICpwZHBlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlw
ZF9lbnRyeV90ICpwZGU7CisKKwlwZGUgPSAocGRfZW50cnlfdCAqKSpwZHBlOworCXJldHVybiAo
JnBkZVtwbWFwX3BkZV9pbmRleCh2YSldKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSBkaXJlY3Rv
cnkgZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMgX19p
bmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp
Cit7CisJcGRfZW50cnlfdCAqcGRwZTsKKworCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCB2YSk7
CisJaWYgKCpwZHBlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlyZXR1cm4gKHBtYXBf
cGRwZV90b19wZGUocGRwZSwgdmEpKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSB0YWJsZSBlbnRy
eSBmb3IgZ2l2ZW4gcGFnZSBkaXJlY3RvcnkgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMg
X19pbmxpbmUgcHRfZW50cnlfdCAqCitwbWFwX3BkZV90b19wdGUocGRfZW50cnlfdCAqcGRlLCB2
bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlwdGUgPSAocHRfZW50cnlf
dCAqKSpwZGU7CisJcmV0dXJuICgmcHRlW3BtYXBfcHRlX2luZGV4KHZhKV0pOworfQorCisvKiBS
ZXR1cm4gYSBwYWdlIHRhYmxlIGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBhZGRyZXNz
LiAqLworcHRfZW50cnlfdCAqCitwbWFwX3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp
Cit7CisJcGRfZW50cnlfdCAqcGRlOworCisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlm
IChwZGUgPT0gTlVMTCB8fCAqcGRlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJaWYgKHBk
ZV9pc19zdXBlcnBhZ2UocGRlKSkgeworCQlyZXR1cm4gKChwdF9lbnRyeV90ICopcGRlKTsKKwl9
IGVsc2UKKwkJcmV0dXJuIChwbWFwX3BkZV90b19wdGUocGRlLCB2YSkpOworfQorCitzdGF0aWMg
X19pbmxpbmUgdm9pZAorcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcF90IHBtYXAsIGludCBj
b3VudCkKK3sKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCXBtYXAtPnBt
X3N0YXRzLnJlc2lkZW50X2NvdW50ICs9IGNvdW50OworfQorCitzdGF0aWMgX19pbmxpbmUgdm9p
ZAorcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcF90IHBtYXAsIGludCBjb3VudCkKK3sKKwor
CVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQocG1hcC0+cG1fc3Rh
dHMucmVzaWRlbnRfY291bnQgPj0gY291bnQsCisJICAgICgicG1hcCAlcCByZXNpZGVudCBjb3Vu
dCB1bmRlcmZsb3cgJWxkICVkIiwgcG1hcCwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRf
Y291bnQsIGNvdW50KSk7CisJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgLT0gY291bnQ7
Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBzb21lIHdpcmVkIG1lbW9yeSBiZWZvcmUgdGhlIHZpcnR1
YWwgbWVtb3J5IHN5c3RlbSBpcworICogYm9vdHN0cmFwcGVkLgorICovCit2bV9vZmZzZXRfdAor
cG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpCit7CisJdm1fcGFkZHJfdCBiYW5rX3Np
emUsIHBhOworCXZtX29mZnNldF90IHZhOworCisJc2l6ZSA9IHJvdW5kX3BhZ2Uoc2l6ZSk7CisJ
YmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJd2hpbGUgKHNpemUg
PiBiYW5rX3NpemUpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsg
Ml07IGkgKz0gMikgeworCQkJcGh5c19hdmFpbFtpXSA9IHBoeXNfYXZhaWxbaSArIDJdOworCQkJ
cGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2YWlsW2kgKyAzXTsKKwkJfQorCQlwaHlzX2F2YWls
W2ldID0gMDsKKwkJcGh5c19hdmFpbFtpICsgMV0gPSAwOworCQlpZiAoIXBoeXNfYXZhaWxbMF0p
CisJCQlwYW5pYygicG1hcF9zdGVhbF9tZW1vcnk6IG91dCBvZiBtZW1vcnkiKTsKKwkJYmFua19z
aXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJfQorCisJcGEgPSBwaHlzX2F2
YWlsWzBdOworCXBoeXNfYXZhaWxbMF0gKz0gc2l6ZTsKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJF
Q1QocGEpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBzaXplKTsKKwlyZXR1cm4gKHZhKTsKK30KKwor
LyoKKyAqIEJvb3RzdHJhcCB0aGUgc3lzdGVtIGVub3VnaCB0byBydW4gd2l0aCB2aXJ0dWFsIG1l
bW9yeS4gIFRoaXMKKyAqIGFzc3VtZXMgdGhhdCB0aGUgcGh5c19hdmFpbCBhcnJheSBoYXMgYmVl
biBpbml0aWFsaXplZC4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfY3JlYXRlX2tlcm5lbF9wYWdl
dGFibGUodm9pZCkKK3sKKwlpbnQgaSwgajsKKwl2bV9vZmZzZXRfdCBwdGFkZHI7CisJcHRfZW50
cnlfdCAqcHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZzZXRfdCBwZGFkZHI7CisJaW50
IG5wdCwgbnBkZTsKKworCS8qCisJICogQWxsb2NhdGUgc2VnbWVudCB0YWJsZSBmb3IgdGhlIGtl
cm5lbAorCSAqLworCWtlcm5lbF9zZWdtYXAgPSAocGRfZW50cnlfdCAqKXBtYXBfc3RlYWxfbWVt
b3J5KFBBR0VfU0laRSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNlY29uZCBsZXZlbCBwYWdlIHRh
YmxlcyBmb3IgdGhlIGtlcm5lbAorCSAqLworCW5wZGUgPSBob3dtYW55KE5LUFQsIE5QREVQRyk7
CisJcGRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbnBkZSk7CisJbmtwdCA9
IE5LUFQ7CisJcHRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbmtwdCk7CisK
KwkvKgorCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2Jh
bCBiaXQgaW4gdGhlCisJICogdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlciBmb3IgZWFjaCAy
IHBhZ2UgZW50cnkuIFRodXMgaW52YWxpZAorCSAqIGVudHJ5cyBtdXN0IGhhdmUgdGhlIEdsb2Jh
bCBiaXQgc2V0IHNvIHdoZW4gRW50cnkgTE8gYW5kIEVudHJ5IEhJCisJICogRyBiaXRzIGFyZSBh
bmRlZCB0b2dldGhlciB0aGV5IHdpbGwgcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUKKwkg
KiBpbiB0aGUgdGxiLgorCSAqLworCWZvciAoaSA9IDAsIHB0ZSA9IChwdF9lbnRyeV90ICopcHRh
ZGRyOyBpIDwgKG5rcHQgKiBOUFRFUEcpOyBpKyssIHB0ZSsrKQorCQkqcHRlID0gUFRFX0c7CisK
Kwlmb3IgKGkgPSAwLCAgbnB0ID0gbmtwdDsgbnB0ID4gMDsgaSsrKSB7CisJCWtlcm5lbF9zZWdt
YXBbaV0gPSAocGRfZW50cnlfdCkocGRhZGRyICsgaSAqIFBBR0VfU0laRSk7CisJCXBkZSA9IChw
ZF9lbnRyeV90ICopa2VybmVsX3NlZ21hcFtpXTsKKworCQlmb3IgKGogPSAwOyBqIDwgTlBERVBH
ICYmIG5wdCA+IDA7IGorKywgbnB0LS0pCisJCQlwZGVbal0gPSAocGRfZW50cnlfdCkocHRhZGRy
ICsgKGkgKiBOUERFUEcgKyBqKSAqCisJCQkgICAgUEFHRV9TSVpFKTsKKwl9CisKKwlQTUFQX0xP
Q0tfSU5JVChrZXJuZWxfcG1hcCk7CisJa2VybmVsX3BtYXAtPnBtX3NlZ3RhYiA9IGtlcm5lbF9z
ZWdtYXA7CisJQ1BVX0ZJTEwoJmtlcm5lbF9wbWFwLT5wbV9hY3RpdmUpOworCVRBSUxRX0lOSVQo
Jmtlcm5lbF9wbWFwLT5wbV9wdmNodW5rKTsKKwlrZXJuZWxfcG1hcC0+cG1fYXNpZFswXS5hc2lk
ID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCWtlcm5lbF9wbWFwLT5wbV9hc2lkWzBdLmdlbiA9IDA7
CisJa2VybmVsX3ZtX2VuZCArPSBua3B0ICogTlBURVBHICogUEFHRV9TSVpFOworfQorCit2b2lk
CitwbWFwX2Jvb3RzdHJhcCh2b2lkKQoreworCWludCBpOworCisJLyogU29ydC4gKi8KK2FnYWlu
OgorCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgeworCQkvKgor
CQkgKiBLZWVwIHRoZSBtZW1vcnkgYWxpZ25lZCBvbiBwYWdlIGJvdW5kYXJ5LgorCQkgKi8KKwkJ
cGh5c19hdmFpbFtpXSA9IHJvdW5kX3BhZ2UocGh5c19hdmFpbFtpXSk7CisJCXBoeXNfYXZhaWxb
aSArIDFdID0gdHJ1bmNfcGFnZShwaHlzX2F2YWlsW2kgKyAxXSk7CisKKwkJaWYgKGkgPCAyKQor
CQkJY29udGludWU7CisJCWlmIChwaHlzX2F2YWlsW2kgLSAyXSA+IHBoeXNfYXZhaWxbaV0pIHsK
KwkJCXZtX3BhZGRyX3QgcHRlbXBbMl07CisKKwkJCXB0ZW1wWzBdID0gcGh5c19hdmFpbFtpICsg
MF07CisJCQlwdGVtcFsxXSA9IHBoeXNfYXZhaWxbaSArIDFdOworCisJCQlwaHlzX2F2YWlsW2kg
KyAwXSA9IHBoeXNfYXZhaWxbaSAtIDJdOworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2
YWlsW2kgLSAxXTsKKworCQkJcGh5c19hdmFpbFtpIC0gMl0gPSBwdGVtcFswXTsKKwkJCXBoeXNf
YXZhaWxbaSAtIDFdID0gcHRlbXBbMV07CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJLyoK
KwkgKiBDb3B5IHRoZSBwaHlzX2F2YWlsW10gYXJyYXkgYmVmb3JlIHdlIHN0YXJ0IHN0ZWFsaW5n
IG1lbW9yeSBmcm9tIGl0LgorCSAqLworCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9
IDA7IGkgKz0gMikgeworCQlwaHlzbWVtX2Rlc2NbaV0gPSBwaHlzX2F2YWlsW2ldOworCQlwaHlz
bWVtX2Rlc2NbaSArIDFdID0gcGh5c19hdmFpbFtpICsgMV07CisJfQorCisJTWF4bWVtID0gYXRv
cChwaHlzX2F2YWlsW2kgLSAxXSk7CisKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCJQ
aHlzaWNhbCBtZW1vcnkgY2h1bmsocyk6XG4iKTsKKwkJZm9yIChpID0gMDsgcGh5c19hdmFpbFtp
ICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCQl2bV9wYWRkcl90IHNpemU7CisKKwkJCXNpemUgPSBw
aHlzX2F2YWlsW2kgKyAxXSAtIHBoeXNfYXZhaWxbaV07CisJCQlwcmludGYoIiUjMDhqeCAtICUj
MDhqeCwgJWp1IGJ5dGVzICglanUgcGFnZXMpXG4iLAorCQkJICAgICh1aW50bWF4X3QpIHBoeXNf
YXZhaWxbaV0sCisJCQkgICAgKHVpbnRtYXhfdCkgcGh5c19hdmFpbFtpICsgMV0gLSAxLAorCQkJ
ICAgICh1aW50bWF4X3QpIHNpemUsICh1aW50bWF4X3QpIHNpemUgLyBQQUdFX1NJWkUpOworCQl9
CisJCXByaW50ZigiTWF4bWVtIGlzIDB4JTBqeFxuIiwgcHRvYSgodWludG1heF90KU1heG1lbSkp
OworCX0KKwkvKgorCSAqIFN0ZWFsIHRoZSBtZXNzYWdlIGJ1ZmZlciBmcm9tIHRoZSBiZWdpbm5p
bmcgb2YgbWVtb3J5LgorCSAqLworCW1zZ2J1ZnAgPSAoc3RydWN0IG1zZ2J1ZiAqKXBtYXBfc3Rl
YWxfbWVtb3J5KG1zZ2J1ZnNpemUpOworCW1zZ2J1ZmluaXQobXNnYnVmcCwgbXNnYnVmc2l6ZSk7
CisKKwkvKgorCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLiBUaGlzIG11c3QgYmUgYWxpZ25lZCB0
bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBhIHNpbmds
ZSBUTEIgZW50cnkuCisJICoKKwkgKi8KKwlrc3RhY2swID0gcG1hcF9zdGVhbF9tZW1vcnkoKEtT
VEFDS19QQUdFUyAgKyBLU1RBQ0tfR1VBUkRfUEFHRVMpIDw8CisJICAgIFBBR0VfU0hJRlQpOwor
CWtzdGFjazAgPSByb3VuZHVwMihrc3RhY2swLCAoS1NUQUNLX1BBR0VfU0laRSAqIDIpKTsKKwor
CXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJFU1M7CisJdmlydHVhbF9lbmQgPSBW
TV9NQVhfS0VSTkVMX0FERFJFU1M7CisKKyNpZmRlZiBTTVAKKwkvKgorCSAqIFN0ZWFsIHNvbWUg
dmlydHVhbCBhZGRyZXNzIHNwYWNlIHRvIG1hcCB0aGUgcGNwdSBhcmVhLgorCSAqLworCXZpcnR1
YWxfYXZhaWwgPSByb3VuZHVwMih2aXJ0dWFsX2F2YWlsLCBQQUdFX1NJWkUgKiAyKTsKKwlwY3B1
cCA9IChzdHJ1Y3QgcGNwdSAqKXZpcnR1YWxfYXZhaWw7CisJdmlydHVhbF9hdmFpbCArPSBQQUdF
X1NJWkUgKiAyOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB3aXJlZCBUTEIgZW50cnkgbWFw
cGluZyB0aGUgcGNwdSByZWdpb24gZm9yCisJICogdGhlIEJTUCBhdCAncGNwdXAnLiBVcCB1bnRp
bCB0aGlzIHBvaW50IHdlIHdlcmUgb3BlcmF0aW5nCisJICogd2l0aCB0aGUgJ3BjcHVwJyBmb3Ig
dGhlIEJTUCBwb2ludGluZyB0byBhIHZpcnR1YWwgYWRkcmVzcworCSAqIGluIEtTRUcwIHNvIHRo
ZXJlIHdhcyBubyBuZWVkIGZvciBhIFRMQiBtYXBwaW5nLgorCSAqLworCW1pcHNfcGNwdV90bGJf
aW5pdChQQ1BVX0FERFIoMCkpOworCisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoInBjcHUg
aXMgYXZhaWxhYmxlIGF0IHZpcnR1YWwgYWRkcmVzcyAlcC5cbiIsIHBjcHVwKTsKKyNlbmRpZgor
CisJcG1hcF9jcmVhdGVfa2VybmVsX3BhZ2V0YWJsZSgpOworCXBtYXBfbWF4X2FzaWQgPSBWTU5V
TV9QSURTOworCW1pcHNfd3JfZW50cnloaSgwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDApOworCisJ
LyoKKwkgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgcHYgbGlzdCBsb2NrLgorCSAqLworCXJ3X2lu
aXQoJnB2aF9nbG9iYWxfbG9jaywgInBtYXAgcHYgZ2xvYmFsIik7Cit9CisKKy8qCisgKiBJbml0
aWFsaXplIGEgdm1fcGFnZSdzIG1hY2hpbmUtZGVwZW5kZW50IGZpZWxkcy4KKyAqLwordm9pZAor
cG1hcF9wYWdlX2luaXQodm1fcGFnZV90IG0pCit7CisKKwlUQUlMUV9JTklUKCZtLT5tZC5wdl9s
aXN0KTsKKwltLT5tZC5wdl9tZW1hdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOworfQorCisvKgor
ICoJSW5pdGlhbGl6ZSB0aGUgcG1hcCBtb2R1bGUuCisgKglDYWxsZWQgYnkgdm1faW5pdCwgdG8g
aW5pdGlhbGl6ZSBhbnkgc3RydWN0dXJlcyB0aGF0IHRoZSBwbWFwCisgKglzeXN0ZW0gbmVlZHMg
dG8gbWFwIHZpcnR1YWwgbWVtb3J5LgorICovCit2b2lkCitwbWFwX2luaXQodm9pZCkKK3sKKwlp
bnQgaTsKKwl2bV9zaXplX3QgczsKKwlpbnQgcHZfbnBnOworCisJLyoKKwkgKiBJbml0aWFsaXpl
IHRoZSBwdiBjaHVuayBsaXN0IG11dGV4LgorCSAqLworCW10eF9pbml0KCZwdl9jaHVua3NfbXV0
ZXgsICJwbWFwIHB2IGNodW5rIGxpc3QiLCBOVUxMLCBNVFhfREVGKTsKKworCS8qCisJICogSW5p
dGlhbGl6ZSB0aGUgcG9vbCBvZiBwdiBsaXN0IGxvY2tzLgorCSAqLworCWZvciAoaSA9IDA7IGkg
PCBOUFZfTElTVF9MT0NLUzsgaSsrKQorCQlyd19pbml0KCZwdl9saXN0X2xvY2tzW2ldLCAicHYg
bGlzdCIpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHB2IGhlYWQgdGFi
bGUgZm9yIHN1cGVycGFnZXMuCisJICovCisJZm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsgMV07
IGkgKz0gMik7CisJcHZfbnBnID0gcm91bmRfMm1wYWdlKHBoeXNfYXZhaWxbKGkgLSAyKSArIDFd
KSAvIE5CUERSOworCisJLyoKKwkgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwdiBoZWFkIHRh
YmxlIGZvciBzdXBlcnBhZ2VzLgorCSAqLworCXMgPSAodm1fc2l6ZV90KShwdl9ucGcgKiBzaXpl
b2Yoc3RydWN0IG1kX3BhZ2UpKTsKKwlzID0gcm91bmRfcGFnZShzKTsKKwlwdl90YWJsZSA9IChz
dHJ1Y3QgbWRfcGFnZSAqKWttZW1fbWFsbG9jKGtlcm5lbF9hcmVuYSwgcywKKwkgICAgTV9XQUlU
T0sgfCBNX1pFUk8pOworCWZvciAoaSA9IDA7IGkgPCBwdl9ucGc7IGkrKykKKwkJVEFJTFFfSU5J
VCgmcHZfdGFibGVbaV0ucHZfbGlzdCk7Cit9CisKK3N0YXRpYyBTWVNDVExfTk9ERShfdm1fcG1h
cCwgT0lEX0FVVE8sIHBkZSwgQ1RMRkxBR19SRCwgMCwKKyAgICAiMk1CIHBhZ2UgbWFwcGluZyBj
b3VudGVycyIpOworCitzdGF0aWMgdV9sb25nIHBtYXBfcGRlX2RlbW90aW9uczsKK1NZU0NUTF9V
TE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBkZW1vdGlvbnMsIENUTEZMQUdfUkQsCisgICAg
JnBtYXBfcGRlX2RlbW90aW9ucywgMCwgIjJNQiBwYWdlIGRlbW90aW9ucyIpOworCitzdGF0aWMg
dV9sb25nIHBtYXBfcGRlX21hcHBpbmdzOworU1lTQ1RMX1VMT05HKF92bV9wbWFwX3BkZSwgT0lE
X0FVVE8sIG1hcHBpbmdzLCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9tYXBwaW5ncywgMCwg
IjJNQiBwYWdlIG1hcHBpbmdzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcF9mYWlsdXJl
czsKK1NZU0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwX2ZhaWx1cmVzLCBDVExG
TEFHX1JELAorICAgICZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9u
IGZhaWx1cmVzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcHJvbW90aW9uczsKK1NZU0NU
TF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwcm9tb3Rpb25zLCBDVExGTEFHX1JELAor
ICAgICZwbWFwX3BkZV9wcm9tb3Rpb25zLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9ucyIpOworCisv
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBM
b3cgbGV2ZWwgaGVscGVyIHJvdXRpbmVzLi4uLi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglTTVAKK3N0YXRpYyBfX2lubGlu
ZSB2b2lkCitwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcF90IHBtYXAsIHZvaWQgKCpmbiko
dm9pZCAqKSwgdm9pZCAqYXJnKQoreworCWludAljcHVpZCwgY3B1LCBzZWxmOworCWNwdXNldF90
IGFjdGl2ZV9jcHVzOworCisJc2NoZWRfcGluKCk7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXAp
KSB7CisJCXNtcF9yZW5kZXp2b3VzKE5VTEwsIGZuLCBOVUxMLCBhcmcpOworCQlnb3RvIG91dDsK
Kwl9CisJLyogRm9yY2UgQVNJRCB1cGRhdGUgb24gaW5hY3RpdmUgQ1BVcyAqLworCUNQVV9GT1JF
QUNIKGNwdSkgeworCQlpZiAoIUNQVV9JU1NFVChjcHUsICZwbWFwLT5wbV9hY3RpdmUpKQorCQkJ
cG1hcC0+cG1fYXNpZFtjcHVdLmdlbiA9IDA7CisJfQorCWNwdWlkID0gUENQVV9HRVQoY3B1aWQp
OworCS8qCisJICogWFhYOiBiYXJyaWVyL2xvY2tpbmcgZm9yIGFjdGl2ZT8KKwkgKgorCSAqIFRh
a2UgYSBzbmFwc2hvdCBvZiBhY3RpdmUgaGVyZSwgYW55IGZ1cnRoZXIgY2hhbmdlcyBhcmUgaWdu
b3JlZC4KKwkgKiB0bGIgdXBkYXRlL2ludmFsaWRhdGUgc2hvdWxkIGJlIGhhcm1sZXNzIG9uIGlu
YWN0aXZlIENQVXMKKwkgKi8KKwlhY3RpdmVfY3B1cyA9IHBtYXAtPnBtX2FjdGl2ZTsKKwlzZWxm
ID0gQ1BVX0lTU0VUKGNwdWlkLCAmYWN0aXZlX2NwdXMpOworCUNQVV9DTFIoY3B1aWQsICZhY3Rp
dmVfY3B1cyk7CisJLyogT3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoaXMgY3B1IGlzIHRo
ZSBvbmx5IGFjdGl2ZSBvbmUgKi8KKwlpZiAoQ1BVX0VNUFRZKCZhY3RpdmVfY3B1cykpIHsKKwkJ
aWYgKHNlbGYpCisJCQlmbihhcmcpOworCX0gZWxzZSB7CisJCWlmIChzZWxmKQorCQkJQ1BVX1NF
VChjcHVpZCwgJmFjdGl2ZV9jcHVzKTsKKwkJc21wX3JlbmRlenZvdXNfY3B1cyhhY3RpdmVfY3B1
cywgTlVMTCwgZm4sIE5VTEwsIGFyZyk7CisJfQorb3V0OgorCXNjaGVkX3VucGluKCk7Cit9Cisj
ZWxzZSAvKiAhU01QICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9jYWxsX29uX2FjdGl2
ZV9jcHVzKHBtYXBfdCBwbWFwLCB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlp
bnQJY3B1aWQ7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJZm4oYXJnKTsKKwkJ
cmV0dXJuOworCX0KKwljcHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKwlpZiAoIUNQVV9JU1NFVChj
cHVpZCwgJnBtYXAtPnBtX2FjdGl2ZSkpCisJCXBtYXAtPnBtX2FzaWRbY3B1aWRdLmdlbiA9IDA7
CisJZWxzZQorCQlmbihhcmcpOworfQorI2VuZGlmIC8qIFNNUCAqLworCitzdGF0aWMgdm9pZAor
cG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCkKK3sKKworCXBtYXBfY2FsbF9vbl9hY3Rp
dmVfY3B1cyhwbWFwLAorCSAgICAodm9pZCAoKikodm9pZCAqKSl0bGJfaW52YWxpZGF0ZV9hbGxf
dXNlciwgcG1hcCk7Cit9CisKK3N0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgeworCXBt
YXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworfTsKKworc3RhdGljIHZvaWQKK3BtYXBfaW52
YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpCit7CisJc3RydWN0IHBtYXBfaW52YWxpZGF0
ZV9wYWdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX2FkZHJlc3MocC0+cG1hcCwg
cC0+dmEpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcF90IHBt
YXAsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcg
YXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52YSA9IHZhOworCXBtYXBfY2FsbF9vbl9h
Y3RpdmVfY3B1cyhwbWFwLCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24sICZhcmcpOworfQor
CitzdHJ1Y3QgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1f
b2Zmc2V0X3Qgc3ZhOworCXZtX29mZnNldF90IGV2YTsKK307CisKK3N0YXRpYyB2b2lkCitwbWFw
X2ludmFsaWRhdGVfcmFuZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG1hcF9pbnZh
bGlkYXRlX3JhbmdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHAtPnBt
YXAsIHAtPnN2YSwgcC0+ZXZhKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9y
YW5nZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEpCit7CisJ
c3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFw
OworCWFyZy5zdmEgPSBzdmE7CisJYXJnLmV2YSA9IGV2YTsKKwlwbWFwX2NhbGxfb25fYWN0aXZl
X2NwdXMocG1hcCwgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbiwgJmFyZyk7Cit9CisKK3N0
cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1fb2Zmc2V0X3Qg
dmE7CisJcHRfZW50cnlfdCBwdGU7Cit9OworCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGFn
ZV9hY3Rpb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyAqcCA9
IGFyZzsKKworCXRsYl91cGRhdGUocC0+cG1hcCwgcC0+dmEsIHAtPnB0ZSk7Cit9CisKK3N0YXRp
YyB2b2lkCitwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcHRf
ZW50cnlfdCBwdGUpCit7CisJc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnIGFyZzsKKworCWFy
Zy5wbWFwID0gcG1hcDsKKwlhcmcudmEgPSB2YTsKKwlhcmcucHRlID0gcHRlOworCXBtYXBfY2Fs
bF9vbl9hY3RpdmVfY3B1cyhwbWFwLCBwbWFwX3VwZGF0ZV9wYWdlX2FjdGlvbiwgJmFyZyk7Cit9
CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVfaW52YWxpZGF0ZShwbWFwX3QgcG1hcCwg
dm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgbmV3cGRlKQoreworCisJaWYgKCFwdGVfaXNfMW1f
c3VwZXJwYWdlKCZuZXdwZGUpKSB7CisJCS8qIERlbW90aW9uOiBmbHVzaCBhIHNwZWNpZmljIDJt
YiBwYWdlIG1hcHBpbmcuICovCisJCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHBtYXAsICh2YSAmIH5Q
RFJNQVNLKSwKKwkJICAgICh2YSAmIH5QRFJNQVNLKSArIE5CUERSKTsKKwl9IGVsc2UgaWYgKCFw
dGVfdGVzdCgmbmV3cGRlLCBQVEVfRykpIHsKKwkJLyoKKwkJICogUHJvbW90aW9uOiBmbHVzaCBl
dmVyeSA0S0IgcGFnZSBtYXBwaW5nIGZyb20gdGhlIFRMQgorCQkgKiBiZWNhdXNlIHRoZXJlIGFy
ZSB0b28gbWFueSB0byBmbHVzaCBpbmRpdmlkdWFsbHkuCisJCSAqLworCQl0bGJfaW52YWxpZGF0
ZV9hbGxfdXNlcihwbWFwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBQcm9tb3Rpb246IGZsdXNo
IGV2ZXJ5IDRLQiBwYWdlIG1hcHBpbmcgZnJvbSB0aGUgVExCLAorCQkgKiBpbmNsdWRpbmcgYW55
IGdsb2JhbCAoUFRFX0cpIG1hcHBpbmdzLgorCQkgKi8KKwkJdGxiX2ludmFsaWRhdGVfYWxsKCk7
CisJfQorfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJ
dm1fb2Zmc2V0X3QgdmE7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgbmV3cGRlOwor
fTsKKworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9hY3Rpb24odm9pZCAqYWN0KQorewor
CXN0cnVjdCBwbWFwX3VwZGF0ZV9wZGVfYXJnICphcmcgPSBhY3Q7CisKKwlwbWFwX3VwZGF0ZV9w
ZGVfaW52YWxpZGF0ZShhcmctPnBtYXAsIGFyZy0+dmEsIGFyZy0+bmV3cGRlKTsKK30KKworc3Rh
dGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9zdG9yZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq
cGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKworCXBkZV9zdG9yZShwZGUsIG5ld3BkZSk7Cit9
CisKKworLyoKKyAqIENoYW5nZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgc3BlY2lmaWVkIHZpcnR1
YWwgYWRkcmVzcyBpbiBhIHdheSB0aGF0CisgKiBwcmV2ZW50cyBhbnkgcG9zc2liaWxpdHkgb2Yg
dGhlIFRMQiBldmVyIGhhdmluZyB0d28gZW50cmllcyB0aGF0IG1hcCB0aGUKKyAqIHNhbWUgdmly
dHVhbCBhZGRyZXNzIHVzaW5nIGRpZmZlcmVudCBwYWdlIHNpemVzLgorICovCitzdGF0aWMgdm9p
ZAorcG1hcF91cGRhdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlf
dCAqcGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKwlzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2Fy
ZyBhcmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJnLnBkZSA9IHBk
ZTsKKwlhcmcubmV3cGRlID0gbmV3cGRlOworCisJcG1hcF91cGRhdGVfcGRlX3N0b3JlKHBtYXAs
IHBkZSwgbmV3cGRlKTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1hcF91cGRh
dGVfcGRlX2FjdGlvbiwgJmFyZyk7Cit9CisKKy8qIC0tLSAqLworCisvKgorICoJUm91dGluZToJ
cG1hcF9leHRyYWN0CisgKglGdW5jdGlvbjoKKyAqCQlFeHRyYWN0IHRoZSBwaHlzaWNhbCBwYWdl
IGFkZHJlc3MgYXNzb2NpYXRlZAorICoJCXdpdGggdGhlIGdpdmVuIG1hcC92aXJ0dWFsX2FkZHJl
c3MgcGFpci4KKyAqLwordm1fcGFkZHJfdAorcG1hcF9leHRyYWN0KHBtYXBfdCBwbWFwLCB2bV9v
ZmZzZXRfdCB2YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCXZt
X29mZnNldF90IHBhOworCisJcGEgPSAwOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFw
X3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQlwYSA9
IFRMQkxPX1BERV9UT19QQSgqcGRlKSB8ICh2YSAmIFBEUk1BU0spOworCX0gZWxzZSB7CisJCXB0
ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwkJaWYgKHB0ZSkKKwkJCXBhID0gVExCTE9f
UFRFX1RPX1BBKCpwdGUpIHwgKHZhICYgUEFHRV9NQVNLKTsKKwl9CisJUE1BUF9VTkxPQ0socG1h
cCk7CisJcmV0dXJuIChwYSk7Cit9CisKKy8qCisgKglSb3V0aW5lOglwbWFwX2V4dHJhY3RfYW5k
X2hvbGQKKyAqCUZ1bmN0aW9uOgorICoJCUF0b21pY2FsbHkgZXh0cmFjdCBhbmQgaG9sZCB0aGUg
cGh5c2ljYWwgcGFnZQorICoJCXdpdGggdGhlIGdpdmVuIHBtYXAgYW5kIHZpcnR1YWwgYWRkcmVz
cyBwYWlyCisgKgkJaWYgdGhhdCBtYXBwaW5nIHBlcm1pdHMgdGhlIGdpdmVuIHByb3RlY3Rpb24u
CisgKi8KK3ZtX3BhZ2VfdAorcG1hcF9leHRyYWN0X2FuZF9ob2xkKHBtYXBfdCBwbWFwLCB2bV9v
ZmZzZXRfdCB2YSwgdm1fcHJvdF90IHByb3QpCit7CisJcGRfZW50cnlfdCAqcGRlcDsKKwlwdF9l
bnRyeV90IHB0ZSwgKnB0ZXA7CisJdm1fcGFkZHJfdCBwYSwgcHRlX3BhOworCXZtX3BhZ2VfdCBt
OworCXZtX3BhZGRyX3QgcGRlX3BhOworCisJcGEgPSAwOworCW0gPSBOVUxMOworCVBNQVBfTE9D
SyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZXAg
IT0gTlVMTCAmJiAqcGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBk
ZXApKSB7CisJCQlpZiAoIXBkZV90ZXN0KHBkZXAsIFBURV9STykgfHwKKwkJCSAgICAocHJvdCAm
IFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJCQlwZGVfcGEgPSBUTEJMT19QREVfVE9fUEEoKnBk
ZXApIHwKKwkJCQkgICAgKHZhICYgUERSTUFTSyk7CisJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVs
b2NrKHBtYXAsIHBkZV9wYSwgJnBhKSkKKwkJCQkJZ290byByZXRyeTsKKwkJCQltID0gUEhZU19U
T19WTV9QQUdFKHBkZV9wYSk7CisJCQkJdm1fcGFnZV9ob2xkKG0pOworCQkJfQorCQl9IGVsc2Ug
eworCQkJcHRlcCA9IHBtYXBfcGRlX3RvX3B0ZShwZGVwLCB2YSk7CisJCQlpZiAocHRlcCAhPSBO
VUxMKSB7CisJCQkJcHRlID0gKnB0ZXA7CisJCQkJaWYgKHB0ZV9pc192YWxpZCgmcHRlKSAmJgor
CQkJCSAgICAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKKwkJCQkgICAgKHByb3QgJiBWTV9Q
Uk9UX1dSSVRFKSA9PSAwKSkgeworCQkJCQlwdGVfcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsK
KwkJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHB0ZV9wYSwKKwkJCQkJICAgICZw
YSkpCisJCQkJCQlnb3RvIHJldHJ5OworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHB0ZV9wYSk7
CisJCQkJCXZtX3BhZ2VfaG9sZChtKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJUEFfVU5MT0NL
X0NPTkQocGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAobSk7Cit9CisKKy8qLQor
ICoJUm91dGluZToJcG1hcF9rZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0cmFjdCB0aGUg
cGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl2aXJ0dWFsIGFkZHJlc3MuCisg
Ki8KK3ZtX3BhZGRyX3QKK3BtYXBfa2V4dHJhY3Qodm1fb2Zmc2V0X3QgdmEpCit7CisJaW50IG1h
cHBlZDsKKworCS8qCisJICogRmlyc3QsIHRoZSBkaXJlY3QtbWFwcGVkIHJlZ2lvbnMuCisJICov
CisJaWYgKHZhID49IE1JUFNfWEtQSFlTX1NUQVJUICYmIHZhIDwgTUlQU19YS1BIWVNfRU5EKQor
CQlyZXR1cm4gKE1JUFNfWEtQSFlTX1RPX1BIWVModmEpKTsKKworCWlmICh2YSA+PSBNSVBTX0tT
RUcwX1NUQVJUICYmIHZhIDwgTUlQU19LU0VHMF9FTkQpCisJCXJldHVybiAoTUlQU19LU0VHMF9U
T19QSFlTKHZhKSk7CisKKwlpZiAodmEgPj0gTUlQU19LU0VHMV9TVEFSVCAmJiB2YSA8IE1JUFNf
S1NFRzFfRU5EKQorCQlyZXR1cm4gKE1JUFNfS1NFRzFfVE9fUEhZUyh2YSkpOworCisJLyoKKwkg
KiBVc2VyIHZpcnR1YWwgYWRkcmVzc2VzLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJfQURE
UkVTUykgeworCQlwZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCWlm
IChjdXJwcm9jICYmIGN1cnByb2MtPnBfdm1zcGFjZSkgeworCQkJcGRlcCA9IHBtYXBfcGRlKCZj
dXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09IE5VTEwgfHwg
KnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18xbV9zdXBlcnBh
Z2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJCXJldHVybiAo
VExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0spKTsKKwkJCX0K
KwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0ZXApIHsKKwkJ
CQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEgJiBQQUdFX01B
U0spKTsKKwkJCX0KKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNob3VsZCBi
ZSBrZXJuZWwgdmlydHVhbCBoZXJlLCBvdGhlcndpc2UgZmFpbAorCSAqLworCW1hcHBlZCA9ICh2
YSA+PSBNSVBTX0tTRUcyX1NUQVJUIHx8IHZhIDwgTUlQU19LU0VHMl9FTkQpOworCW1hcHBlZCA9
IG1hcHBlZCB8fCAodmEgPj0gTUlQU19YS1NFR19TVEFSVCB8fCB2YSA8IE1JUFNfWEtTRUdfRU5E
KTsKKwkvKgorCSAqIEtlcm5lbCB2aXJ0dWFsLgorCSAqLworCisJaWYgKG1hcHBlZCkgeworCQlw
ZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCS8qIElzIHRoZSBrZXJu
ZWwgcG1hcCBpbml0aWFsaXplZD8gKi8KKwkJaWYgKCFDUFVfRU1QVFkoJmtlcm5lbF9wbWFwLT5w
bV9hY3RpdmUpKSB7CisJCQkvKiBJdCdzIGluc2lkZSB0aGUgdmlydHVhbCBhZGRyZXNzIHJhbmdl
ICovCisJCQlwZGVwID0gcG1hcF9wZGUoa2VybmVsX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09
IE5VTEwgfHwgKnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18x
bV9zdXBlcnBhZ2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJ
CXJldHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0sp
KTsKKwkJCX0KKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0
ZXApIHsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEg
JiBQQUdFX01BU0spKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gKDApOworCX0KKworCXBhbmljKCIl
cyBmb3IgdW5rbm93biBhZGRyZXNzIHNwYWNlICVwLiIsIF9fZnVuY19fLCAodm9pZCAqKXZhKTsK
K30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KgorICogTG93IGxldmVsIG1hcHBpbmcgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotCisgKiBhZGQgYSB3aXJl
ZCBwYWdlIHRvIHRoZSBrdmEKKyAqLwordm9pZAorcG1hcF9rZW50ZXJfYXR0cih2bV9vZmZzZXRf
dCB2YSwgdm1fcGFkZHJfdCBwYSwgaW50IGF0dHIpCit7CisJcHRfZW50cnlfdCAqcHRlOworCXB0
X2VudHJ5X3Qgb3B0ZSwgbnB0ZTsKKworI2lmZGVmIFBNQVBfREVCVUcKKwlwcmludGYoInBtYXBf
a2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZvaWQgKilwYSk7Cisj
ZW5kaWYKKworCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJb3B0ZSA9ICpwdGU7
CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0QgfCBQVEVfUkVGIHwg
UFRFX1ZBTElEIHwgUFRFX0c7CisJcHRlX3N0b3JlKHB0ZSwgbnB0ZSk7CisJaWYgKHB0ZV9pc192
YWxpZCgmb3B0ZSkgJiYgb3B0ZSAhPSBucHRlKQorCQlwbWFwX3VwZGF0ZV9wYWdlKGtlcm5lbF9w
bWFwLCB2YSwgbnB0ZSk7Cit9CisKK3ZvaWQKK3BtYXBfa2VudGVyKHZtX29mZnNldF90IHZhLCB2
bV9wYWRkcl90IHBhKQoreworCisJS0FTU0VSVChpc19jYWNoZWFibGVfbWVtKHBhKSwKKwkJKCJw
bWFwX2tlbnRlcjogbWVtb3J5IGF0IDB4JWx4IGlzIG5vdCBjYWNoZWFibGUiLCAodV9sb25nKXBh
KSk7CisKKwlwbWFwX2tlbnRlcl9hdHRyKHZhLCBwYSwgUFRFX0NfQ0FDSEUpOworfQorCisvKi0K
KyAqIHJlbW92ZSBhIHBhZ2UgZnJvbSB0aGUga2VybmVsIHBhZ2V0YWJsZXMKKyAqLworIC8qIFBN
QVBfSU5MSU5FICovIHZvaWQKK3BtYXBfa3JlbW92ZSh2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9l
bnRyeV90ICpwdGU7CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxsIGNhY2hlcyBmcm9tIHRoZSBw
YWdlIGJlaW5nIGRlc3Ryb3llZAorCSAqLworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4
KHZhLCBQQUdFX1NJWkUpOworCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKKwlw
dGVfc3RvcmUocHRlLCBQVEVfRyk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2Uoa2VybmVsX3BtYXAs
IHZhKTsKK30KKworLyoKKyAqCVVzZWQgdG8gbWFwIGEgcmFuZ2Ugb2YgcGh5c2ljYWwgYWRkcmVz
c2VzIGludG8ga2VybmVsCisgKgl2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisgKgorICoJVGhlIHZh
bHVlIHBhc3NlZCBpbiAnKnZpcnQnIGlzIGEgc3VnZ2VzdGVkIHZpcnR1YWwgYWRkcmVzcyBmb3IK
KyAqCXRoZSBtYXBwaW5nLiBBcmNoaXRlY3R1cmVzIHdoaWNoIGNhbiBzdXBwb3J0IGEgZGlyZWN0
LW1hcHBlZAorICoJcGh5c2ljYWwgdG8gdmlydHVhbCByZWdpb24gY2FuIHJldHVybiB0aGUgYXBw
cm9wcmlhdGUgYWRkcmVzcworICoJd2l0aGluIHRoYXQgcmVnaW9uLCBsZWF2aW5nICcqdmlydCcg
dW5jaGFuZ2VkLiBPdGhlcgorICoJYXJjaGl0ZWN0dXJlcyBzaG91bGQgbWFwIHRoZSBwYWdlcyBz
dGFydGluZyBhdCAnKnZpcnQnIGFuZAorICoJdXBkYXRlICcqdmlydCcgd2l0aCB0aGUgZmlyc3Qg
dXNhYmxlIGFkZHJlc3MgYWZ0ZXIgdGhlIG1hcHBlZAorICoJcmVnaW9uLgorICoKKyAqCVVzZSBY
S1BIWVMgZm9yIDY0IGJpdC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfbWFwKHZtX29mZnNldF90
ICp2aXJ0LCB2bV9wYWRkcl90IHN0YXJ0LCB2bV9wYWRkcl90IGVuZCwgaW50IHByb3QpCit7CisK
KwlyZXR1cm4gKE1JUFNfUEhZU19UT19ESVJFQ1Qoc3RhcnQpKTsKK30KKworLyotCisgKiBBZGQg
YSBsaXN0IG9mIHdpcmVkIHBhZ2VzIHRvIHRoZSBrdmEKKyAqIHRoaXMgcm91dGluZSBpcyBvbmx5
IHVzZWQgZm9yIHRlbXBvcmFyeQorICoga2VybmVsIG1hcHBpbmdzIHRoYXQgZG8gbm90IG5lZWQg
dG8gaGF2ZQorICogcGFnZSBtb2RpZmljYXRpb24gb3IgcmVmZXJlbmNlcyByZWNvcmRlZC4KKyAq
IE5vdGUgdGhhdCBvbGQgbWFwcGluZ3MgYXJlIHNpbXBseSB3cml0dGVuCisgKiBvdmVyLiAgVGhl
IHBhZ2UgKm11c3QqIGJlIHdpcmVkLgorICovCit2b2lkCitwbWFwX3FlbnRlcih2bV9vZmZzZXRf
dCB2YSwgdm1fcGFnZV90ICptLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdm1fb2Zmc2V0X3Qg
b3JpZ3ZhID0gdmE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlwbWFwX2Zs
dXNoX3B2Y2FjaGUobVtpXSk7CisJCXBtYXBfa2VudGVyKHZhLCBWTV9QQUdFX1RPX1BIWVMobVtp
XSkpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfQorCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2Vf
aW5kZXgob3JpZ3ZhLCBQQUdFX1NJWkUqY291bnQpOworfQorCisvKi0KKyAqIFRoaXMgcm91dGlu
ZSBqZXJrcyBwYWdlIG1hcHBpbmdzIGZyb20gdGhlCisgKiBrZXJuZWwgLS0gaXQgaXMgbWVhbnQg
b25seSBmb3IgdGVtcG9yYXJ5IG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3FyZW1vdmUodm1f
b2Zmc2V0X3QgdmEsIGludCBjb3VudCkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisJdm1fb2Zmc2V0
X3Qgb3JpZ3ZhOworCisJaWYgKGNvdW50IDwgMSkKKwkJcmV0dXJuOworCW1pcHNfZGNhY2hlX3di
aW52X3JhbmdlX2luZGV4KHZhLCBQQUdFX1NJWkUgKiBjb3VudCk7CisJb3JpZ3ZhID0gdmE7CisJ
ZG8geworCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOworCQlwdGVfc3RvcmUocHRl
LCBQVEVfRyk7CisJCXZhICs9IFBBR0VfU0laRTsKKwl9IHdoaWxlICgtLWNvdW50ID4gMCk7CisJ
cG1hcF9pbnZhbGlkYXRlX3JhbmdlKGtlcm5lbF9wbWFwLCBvcmlndmEsIHZhKTsKK30KKworLyoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGFn
ZSB0YWJsZSBwYWdlIG1hbmFnZW1lbnQgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lk
CitwbWFwX2ZyZWVfemVyb19wYWdlcyhzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwl2bV9wYWdl
X3QgbTsKKworCXdoaWxlICgobSA9IFNMSVNUX0ZJUlNUKGZyZWUpKSAhPSBOVUxMKSB7CisJCVNM
SVNUX1JFTU9WRV9IRUFEKGZyZWUsIHBsaW5rcy5zLnNzKTsKKwkJLyogUHJlc2VydmUgdGhlIHBh
Z2UncyBQR19aRVJPIHNldHRpbmcuICovCisJCXZtX3BhZ2VfZnJlZV90b3EobSk7CisJfQorfQor
CisvKi0KKyAqIFNjaGVkdWxlIHRoZSBzcGVjaWZpZWQgdW51c2VkIHBhZ2UgdGFibGUgcGFnZSB0
byBiZSBmcmVlZC4gIFNwZWNpZmljYWxseQorICogYWRkIHRoZSBwYWdlIHRvIHRoZSBzcGVjaWZp
ZWQgbGlzdCBvZiBwYWdlcyB0aGF0IHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlCisgKiBwaHlzaWNh
bCBtZW1vcnkgbWFuYWdlciBhZnRlciB0aGUgVExCIGhhcyBiZWVuIHVwZGF0ZWQuCisgKi8KK3N0
YXRpYyBfX2lubGluZSB2b2lkCitwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdCh2bV9wYWdlX3Qg
bSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsCisgICAgYm9vbGVhbl90IHNldF9QR19aRVJPKQorewor
CisJaWYgKHNldF9QR19aRVJPKQorCQltLT5mbGFncyB8PSBQR19aRVJPOworCWVsc2UKKwkJbS0+
ZmxhZ3MgJj0gflBHX1pFUk87CisJU0xJU1RfSU5TRVJUX0hFQUQoZnJlZSwgbSwgcGxpbmtzLnMu
c3MpOworfQorCisvKgorICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBp
bnRvIHRoZSBzcGVjaWZpZWQgcG1hcCdzIGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJs
ZSBwYWdlcy4gIEVhY2ggb2YgYSBwbWFwJ3MgcGFnZSB0YWJsZSBwYWdlcyBpcyByZXNwb25zaWJs
ZQorICogZm9yIG1hcHBpbmcgYSBkaXN0aW5jdCByYW5nZSBvZiB2aXJ0dWFsIGFkZHJlc3Nlcy4g
IFRoZSBwbWFwJ3MgY29sbGVjdGlvbiBpcworICogb3JkZXJlZCBieSB0aGlzIHZpcnR1YWwgYWRk
cmVzcyByYW5nZS4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcG1hcF9pbnNlcnRfcHRfcGFn
ZShwbWFwX3QgcG1hcCwgdm1fcGFnZV90IG1wdGUpCit7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBt
YXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2luc2VydCgmcG1hcC0+cG1fcm9vdCwg
bXB0ZSkpOworfQorCisvKgorICogTG9va3MgZm9yIGEgcGFnZSB0YWJsZSBwYWdlIG1hcHBpbmcg
dGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlCisgKiBzcGVjaWZpZWQgcG1hcCdz
IGNvbGxlY3Rpb24gb2YgaWRsZSBwYWdlIHRhYmxlIHBhZ2VzLiAgUmV0dXJucyBOVUxMIGlmIHRo
ZXJlCisgKiBpcyBubyBwYWdlIHRhYmxlIHBhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lm
aWVkIHZpcnR1YWwgYWRkcmVzcy4KKyAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdAorcG1h
cF9sb29rdXBfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisKKwlQTUFQ
X0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2xvb2t1cCgm
cG1hcC0+cG1fcm9vdCwgcG1hcF9wZGVfcGluZGV4KHZhKSkpOworfQorCisvKgorICogUmVtb3Zl
cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBmcm9tIHRoZSBzcGVjaWZpZWQgcG1hcCdz
IGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJsZSBwYWdlcy4gIFRoZSBzcGVjaWZpZWQg
cGFnZSB0YWJsZSBwYWdlIG11c3QgYmUgYSBtZW1iZXIgb2YKKyAqIHRoZSBwbWFwJ3MgY29sbGVj
dGlvbi4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVtb3ZlX3B0X3BhZ2UocG1h
cF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKQoreworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBN
QV9PV05FRCk7CisJdm1fcmFkaXhfcmVtb3ZlKCZwbWFwLT5wbV9yb290LCBtcHRlLT5waW5kZXgp
OworfQorCisvKgorICogRGVjcmVtZW50cyBhIHBhZ2UgdGFibGUgcGFnZSdzIHdpcmUgY291bnQs
IHdoaWNoIGlzIHVzZWQgdG8gcmVjb3JkIHRoZQorICogbnVtYmVyIG9mIHZhbGlkIHBhZ2UgdGFi
bGUgZW50cmllcyB3aXRoaW4gdGhlIHBhZ2UuICBJZiB0aGUgd2lyZSBjb3VudAorICogZHJvcHMg
dG8gemVybywgdGhlbiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIHVubWFwcGVkLiAgUmV0dXJucyBU
UlVFIGlmIHRoZQorICogcGFnZSB0YWJsZSBwYWdlIHdhcyB1bm1hcHBlZCBhbmQgRkFMU0Ugb3Ro
ZXJ3aXNlLgorICovCitzdGF0aWMgUE1BUF9JTkxJTkUgYm9vbGVhbl90CitwbWFwX3Vud2lyZV9w
dHAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwgc3RydWN0IHNwZ2xp
c3QgKmZyZWUpCit7CisKKwktLW0tPndpcmVfY291bnQ7CisJaWYgKG0tPndpcmVfY291bnQgPT0g
MCkgeworCQlfcG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtLCBmcmVlKTsKKwkJcmV0dXJuIChU
UlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lkCitfcG1h
cF91bndpcmVfcHRwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sIHN0
cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcDsKKwl2bV9wYWdl
X3QgcGRwZzsKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCS8qCisJICog
dW5tYXAgdGhlIHBhZ2UgdGFibGUgcGFnZQorCSAqLworCWlmIChtLT5waW5kZXggPCBOVVBERSkg
eworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJCSpwZGUgPSAwOworCQlwbWFwX3Jlc2lk
ZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKworCQkvKgorCQkgKiBSZWN1cnNpdmVseSBkZWNyZW1l
bnQgbmV4dCBsZXZlbCBwYWdldGFibGUgcmVmY291bnQKKwkJICovCisJCXBkcCA9IChwZF9lbnRy
eV90ICopKnBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJcGRwZyA9IFBIWVNfVE9fVk1fUEFHRShN
SVBTX0RJUkVDVF9UT19QSFlTKHBkcCkpOworCQlwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEsIHBk
cGcsIGZyZWUpOworCX0gZWxzZSB7CisJCXBkZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJ
KnBkZSA9IDA7CisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCX0KKworCS8q
CisJICogSWYgdGhlIHBhZ2UgaXMgZmluYWxseSB1bndpcmVkLCBzaW1wbHkgZnJlZSBpdC4KKwkg
KiBUaGlzIGlzIGEgcmVsZWFzZSBzdG9yZSBzbyB0aGF0IHRoZSBvcmRpbmFyeSBzdG9yZSB1bm1h
cHBpbmcKKwkgKiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIGdsb2JhbGx5IHBlcmZvcm1lZCBiZWZv
cmUgVExCIHNob290LQorCSAqIGRvd24gaXMgYmVndW4uCisJICovCisJYXRvbWljX3N1YnRyYWN0
X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisKKwkvKgorCSAqIFB1dCBwYWdlIG9uIGEg
bGlzdCBzbyB0aGF0IGl0IGlzIHJlbGVhc2VkIGFmdGVyCisJICogKkFMTCogVExCIHNob290ZG93
biBpcyBkb25lLgorCSAqLworCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG0sIGZyZWUsIFRS
VUUpOworfQorCisvKgorICogQWZ0ZXIgcmVtb3ZpbmcgYSBwYWdlIHRhYmxlIGVudHJ5LCB0aGlz
IHJvdXRpbmUgaXMgdXNlZCB0bworICogY29uZGl0aW9uYWxseSBmcmVlIHRoZSBwYWdlLCBhbmQg
bWFuYWdlIHRoZSBob2xkL3dpcmUgY291bnRzLgorICovCitzdGF0aWMgaW50CitwbWFwX3VudXNl
X3B0KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlfdCBwdGVwZGUsCisgICAg
c3RydWN0IHNwZ2xpc3QgKmZyZWUpCit7CisJdm1fcGFnZV90IG1wdGU7CisKKwlpZiAodmEgPj0g
Vk1fTUFYVVNFUl9BRERSRVNTKQorCQlyZXR1cm4gKDApOworCUtBU1NFUlQocHRlcGRlICE9IDAs
ICgicG1hcF91bnVzZV9wdDogcHRlcGRlICE9IDAiKSk7CisJbXB0ZSA9IFBIWVNfVE9fVk1fUEFH
RShNSVBTX0RJUkVDVF9UT19QSFlTKHB0ZXBkZSkpOworCXJldHVybiAocG1hcF91bndpcmVfcHRw
KHBtYXAsIHZhLCBtcHRlLCBmcmVlKSk7Cit9CisKK3ZvaWQKK3BtYXBfcGluaXQwKHBtYXBfdCBw
bWFwKQoreworCWludCBpOworCisJUE1BUF9MT0NLX0lOSVQocG1hcCk7CisJcG1hcC0+cG1fc2Vn
dGFiID0ga2VybmVsX3NlZ21hcDsKKwlDUFVfWkVSTygmcG1hcC0+cG1fYWN0aXZlKTsKKwlmb3Ig
KGkgPSAwOyBpIDwgTUFYQ1BVOyBpKyspIHsKKwkJcG1hcC0+cG1fYXNpZFtpXS5hc2lkID0gUE1B
UF9BU0lEX1JFU0VSVkVEOworCQlwbWFwLT5wbV9hc2lkW2ldLmdlbiA9IDA7CisJfQorCVBDUFVf
U0VUKGN1cnBtYXAsIHBtYXApOworCVRBSUxRX0lOSVQoJnBtYXAtPnBtX3B2Y2h1bmspOworCWJ6
ZXJvKCZwbWFwLT5wbV9zdGF0cywgc2l6ZW9mIHBtYXAtPnBtX3N0YXRzKTsKK30KKwordm9pZAor
cG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKCkKK3sKKworCXZtX3BhZ2VvdXRfZ3Jvd19jYWNo
ZSgzLCAwLCBNSVBTX1hLUEhZU19MQVJHRVNUX1BIWVMpOworfQorCitzdGF0aWMgdm1fcGFnZV90
CitwbWFwX2FsbG9jX2RpcmVjdF9wYWdlKHVuc2lnbmVkIGludCBpbmRleCwgaW50IHJlcSkKK3sK
Kwl2bV9wYWdlX3QgbTsKKworCW0gPSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZSRUVMSVNU
X0RJUkVDVCwgcmVxIHwgVk1fQUxMT0NfV0lSRUQgfAorCSAgICBWTV9BTExPQ19aRVJPKTsKKwlp
ZiAobSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJaWYgKChtLT5mbGFncyAmIFBHX1pF
Uk8pID09IDApCisJCXBtYXBfemVyb19wYWdlKG0pOworCisJbS0+cGluZGV4ID0gaW5kZXg7CisJ
cmV0dXJuIChtKTsKK30KKworLyotCisgKiBJbml0aWFsaXplIGEgcHJlYWxsb2NhdGVkIGFuZCB6
ZXJvZWQgcG1hcCBzdHJ1Y3R1cmUsCisgKiBzdWNoIGFzIG9uZSBpbiBhIHZtc3BhY2Ugc3RydWN0
dXJlLgorICovCitpbnQKK3BtYXBfcGluaXQocG1hcF90IHBtYXApCit7CisJdm1fb2Zmc2V0X3Qg
cHRkdmE7CisJdm1fcGFnZV90IHB0ZHBnOworCWludCBpOworCisJLyoKKwkgKiBhbGxvY2F0ZSB0
aGUgcGFnZSBkaXJlY3RvcnkgcGFnZQorCSAqLworCXdoaWxlICgocHRkcGcgPSBwbWFwX2FsbG9j
X2RpcmVjdF9wYWdlKE5VU0VSUEdUQkxTLCBWTV9BTExPQ19OT09CSiB8CisJICAgIFZNX0FMTE9D
X05PUk1BTCkpID09IE5VTEwpIHsKKwkgICAgICAgcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hl
KCk7CisJfQorCisJcHRkdmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyhw
dGRwZykpOworCXBtYXAtPnBtX3NlZ3RhYiA9IChwZF9lbnRyeV90ICopcHRkdmE7CisJQ1BVX1pF
Uk8oJnBtYXAtPnBtX2FjdGl2ZSk7CisJZm9yIChpID0gMDsgaSA8IE1BWENQVTsgaSsrKSB7CisJ
CXBtYXAtPnBtX2FzaWRbaV0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwkJcG1hcC0+cG1f
YXNpZFtpXS5nZW4gPSAwOworCX0KKwlUQUlMUV9JTklUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwli
emVybygmcG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5wbV9zdGF0cyk7CisKKwlyZXR1cm4g
KDEpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpZiB0aGUgZGVzaXJlZCBw
YWdlIHRhYmxlIHBhZ2UgZG9lcyBub3QgZXhpc3QuCisgKi8KK3N0YXRpYyB2bV9wYWdlX3QKK19w
bWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB1bnNpZ25lZCBwdGVwaW5kZXgsIHN0cnVjdCByd2xv
Y2sgKipsb2NrcCkKK3sKKwl2bV9vZmZzZXRfdCBwYWdldmE7CisJdm1fcGFnZV90IG07CisKKwlQ
TUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKworCS8qCisJICogRmluZCBvciBmYWJy
aWNhdGUgYSBuZXcgcGFnZXRhYmxlIHBhZ2UKKwkgKi8KKwlpZiAoKG0gPSB2bV9wYWdlX2FsbG9j
KE5VTEwsIHB0ZXBpbmRleCwgVk1fQUxMT0NfTk9STUFMIHwKKwkgICAgVk1fQUxMT0NfTk9PQkog
fCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pKSA9PSBOVUxMKSB7CisJCWlmIChsb2Nr
cCAhPSBOVUxMKSB7CisJCQlSRUxFQVNFX1BWX0xJU1RfTE9DSyhsb2NrcCk7CisJCQlQTUFQX1VO
TE9DSyhwbWFwKTsKKwkJCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlWTV9XQUlU
OworCQkJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJ
CX0KKworCQkvKgorCQkgKiBJbmRpY2F0ZSB0aGUgbmVlZCB0byByZXRyeS4JV2hpbGUgd2FpdGlu
ZywgdGhlIHBhZ2UKKwkJICogdGFibGUgcGFnZSBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KKwkJ
ICovCisJCXJldHVybiAoTlVMTCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAw
KQorCQlwbWFwX3plcm9fcGFnZShtKTsKKworCS8qCisJICogTWFwIHRoZSBwYWdldGFibGUgcGFn
ZSBpbnRvIHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UsIGlmIGl0CisJICogaXNuJ3QgYWxyZWFk
eSB0aGVyZS4KKwkgKi8KKwlwYWdldmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9f
UEhZUyhtKSk7CisKKwlpZiAocHRlcGluZGV4ID49IE5VUERFKSB7CisJCXBtYXAtPnBtX3NlZ3Rh
YltwdGVwaW5kZXggLSBOVVBERV0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfSBlbHNlIHsKKwkJ
cGRfZW50cnlfdCAqcGRlcCwgKnBkZTsKKwkJaW50IHNlZ2luZGV4ID0gcHRlcGluZGV4ID4+IChT
RUdTSElGVCAtIFBEUlNISUZUKTsKKwkJaW50IHBkZWluZGV4ID0gcHRlcGluZGV4ICYgKE5QREVQ
RyAtIDEpOworCQl2bV9wYWdlX3QgcGc7CisKKwkJcGRlcCA9ICZwbWFwLT5wbV9zZWd0YWJbc2Vn
aW5kZXhdOworCQlpZiAoKnBkZXAgPT0gTlVMTCkgeworCQkJLyogSGF2ZSB0byBhbGxvY2F0ZSBh
IG5ldyBwZCwgcmVjdXJzZSAqLworCQkJaWYgKF9wbWFwX2FsbG9jcHRlKHBtYXAsIE5VUERFICsg
c2VnaW5kZXgsCisJCQkgICAgbG9ja3ApID09IE5VTEwpIHsKKwkJCQkvKiBhbGxvYyBmYWlsZWQs
IHJlbGVhc2UgY3VycmVudCAqLworCQkJCS0tbS0+d2lyZV9jb3VudDsKKwkJCQlhdG9taWNfc3Vi
dHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsKKwkJCQl2bV9wYWdlX2ZyZWVfemVy
byhtKTsKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQWRkIHJl
ZmVyZW5jZSB0byB0aGUgcGQgcGFnZSAqLworCQkJcGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19E
SVJFQ1RfVE9fUEhZUygqcGRlcCkpOworCQkJcGctPndpcmVfY291bnQrKzsKKwkJfQorCQkvKiBO
ZXh0IGxldmVsIGVudHJ5ICovCisJCXBkZSA9IChwZF9lbnRyeV90ICopKnBkZXA7CisJCXBkZVtw
ZGVpbmRleF0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfQorCisJcG1hcF9yZXNpZGVudF9jb3Vu
dF9pbmMocG1hcCwgMSk7CisKKwlyZXR1cm4gKG0pOworfQorCitzdGF0aWMgdm1fcGFnZV90Citw
bWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgc3RydWN0IHJ3bG9jayAq
KmxvY2twKQoreworCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwlwZF9lbnRyeV90ICpwZDsKKwl2bV9w
YWdlX3QgbTsKKworCS8qCisJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4CisJICov
CisJcHRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKK3JldHJ5OgorCS8qCisJICogR2V0
IHRoZSBwYWdlIGRpcmVjdG9yeSBlbnRyeQorCSAqLworCXBkID0gcG1hcF9wZGUocG1hcCwgdmEp
OworCisJLyoKKwkgKiBUaGlzIHN1cHBvcnRzIHN3aXRjaGluZyBmcm9tIGEgMk1CIHBhZ2UgdG8g
YQorCSAqIG5vcm1hbCA0SyBwYWdlLgorCSAqLworCWlmIChwZCAhPSBOVUxMICYmIChwZGVfaXNf
MW1fc3VwZXJwYWdlKHBkKSAmJgorCSAgICBwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZCkp
KSB7CisJCSBpZiAoIXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGQsIHZhLCBsb2NrcCkp
IHsKKwkJCSAvKgorCQkJICAqIEludmFsaWRhdGlvbiBvZiB0aGUgMk1CIHBhZ2UgbWFwcGluZyBt
YXkgaGF2ZSBjYXVzZWQKKwkJCSAgKiB0aGUgZGVhbGxvY2F0aW9uIG9mIHRoZSB1bmRlcmx5aW5n
IFBEIHBhZ2UuCisJCQkgICovCisJCQkgcGQgPSBOVUxMOworCQkgfQorCX0KKworCS8qCisJICog
SWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBtYXBwZWQsIHdlIGp1c3QgaW5jcmVtZW50IHRoZSBo
b2xkCisJICogY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkgKi8KKwlpZiAocGQgIT0gTlVMTCAm
JiAqcGQgIT0gTlVMTCkgeworCQltID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BI
WVMoKHB0X2VudHJ5X3QpKnBkKSk7CisJCW0tPndpcmVfY291bnQrKzsKKwl9IGVsc2UgeworCQkv
KgorCQkgKiBIZXJlIGlmIHRoZSBwdGUgcGFnZSBpc24ndCBtYXBwZWQsIG9yIGlmIGl0IGhhcyBi
ZWVuCisJCSAqIGRlYWxsb2NhdGVkLgorCQkgKi8KKwkJbSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAs
IHB0ZXBpbmRleCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMICYmIGxvY2twICE9IE5VTEwpCisJ
CQlnb3RvIHJldHJ5OworCX0KKwlyZXR1cm4gKG0pOworfQorCisvKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbWFwIGFsbG9jYXRpb24vZGVh
bGxvY2F0aW9uIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKi8KKworLyotCisgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgaGVsZCBi
eSB0aGUgZ2l2ZW4gcGh5c2ljYWwgbWFwLgorICogQ2FsbGVkIHdoZW4gYSBwbWFwIGluaXRpYWxp
emVkIGJ5IHBtYXBfcGluaXQgaXMgYmVpbmcgcmVsZWFzZWQuCisgKiBTaG91bGQgb25seSBiZSBj
YWxsZWQgaWYgdGhlIG1hcCBjb250YWlucyBubyB2YWxpZCBtYXBwaW5ncy4KKyAqLwordm9pZAor
cG1hcF9yZWxlYXNlKHBtYXBfdCBwbWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3Bh
Z2VfdCBwdGRwZzsKKworCUtBU1NFUlQocG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgPT0g
MCwKKwkgICAgKCJwbWFwX3JlbGVhc2U6IHBtYXAgcmVzaWRlbnQgY291bnQgJWxkICE9IDAiLAor
CSAgICBwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCkpOworCisJLyoKKwkgKiBJbnZhbGlk
YXRlIGFueSBsZWZ0IFRMQiBlbnRyaWVzLCB0byBhbGxvdyB0aGUgcmV1c2UKKwkgKiBvZiB0aGUg
YXNpZC4KKwkgKi8KKwlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCisJcHRkdmEgPSAodm1f
b2Zmc2V0X3QpcG1hcC0+cG1fc2VndGFiOworCXB0ZHBnID0gUEhZU19UT19WTV9QQUdFKE1JUFNf
RElSRUNUX1RPX1BIWVMocHRkdmEpKTsKKworCXB0ZHBnLT53aXJlX2NvdW50LS07CisJYXRvbWlj
X3N1YnRyYWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisJdm1fcGFnZV9mcmVlX3pl
cm8ocHRkcGcpOworfQorCisvKi0KKyAqIGdyb3cgdGhlIG51bWJlciBvZiBrZXJuZWwgcGFnZSB0
YWJsZSBlbnRyaWVzLCBpZiBuZWVkZWQKKyAqLwordm9pZAorcG1hcF9ncm93a2VybmVsKHZtX29m
ZnNldF90IGFkZHIpCit7CisJdm1fcGFnZV90IG5rcGc7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRw
ZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJaW50IGk7CisKKwltdHhfYXNzZXJ0KCZrZXJuZWxfbWFw
LT5zeXN0ZW1fbXR4LCBNQV9PV05FRCk7CisJYWRkciA9IHJvdW5kdXAyKGFkZHIsIE5CU0VHKTsK
KwlpZiAoYWRkciAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkKKwkJYWRkciA9IGtlcm5l
bF9tYXAtPm1heF9vZmZzZXQ7CisJd2hpbGUgKGtlcm5lbF92bV9lbmQgPCBhZGRyKSB7CisJCXBk
cGUgPSBwbWFwX3NlZ21hcChrZXJuZWxfcG1hcCwga2VybmVsX3ZtX2VuZCk7CisJCWlmICgqcGRw
ZSA9PSAwKSB7CisJCQkvKiBuZXcgaW50ZXJtZWRpYXRlIHBhZ2UgdGFibGUgZW50cnkgKi8KKwkJ
CW5rcGcgPSB2bV9wYWdlX2FsbG9jKE5VTEwsIG5rcHQsIFZNX0FMTE9DX0lOVEVSUlVQVCB8CisJ
CQkgICAgVk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOwor
CQkJaWYgKG5rcGcgPT0gTlVMTCkKKwkJCQlwYW5pYygiJXM6IG5vIG1lbW9yeSB0byBncm93IGtl
cm5lbCIsIF9fZnVuY19fKTsKKwkJCSpwZHBlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJ
UkVDVCgKKwkJCSAgICBWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCQkJY29udGludWU7IC8qIHRy
eSBhZ2FpbiAqLworCQl9CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwga2VybmVsX3Zt
X2VuZCk7CisJCWlmICgqcGRlICE9IDApIHsKKwkJCWtlcm5lbF92bV9lbmQgPSAoa2VybmVsX3Zt
X2VuZCArIE5CUERSKSAmIH5QRFJNQVNLOworCQkJaWYgKGtlcm5lbF92bV9lbmQgLSAxID49IGtl
cm5lbF9tYXAtPm1heF9vZmZzZXQpIHsKKwkJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+
bWF4X29mZnNldDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoK
KwkJICogVGhpcyBpbmRleCBpcyBib2d1cywgYnV0IG91dCBvZiB0aGUgd2F5CisJCSAqLworCQlu
a3BnID0gdm1fcGFnZV9hbGxvYyhOVUxMLCBua3B0LCBWTV9BTExPQ19JTlRFUlJVUFQgfAorCQkg
ICAgVk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOworCQlp
ZiAoIW5rcGcpCisJCQlwYW5pYygicG1hcF9ncm93a2VybmVsOiBubyBtZW1vcnkgdG8gZ3JvdyBr
ZXJuZWwiKTsKKwkJbmtwdCsrOworCQkqcGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJ
UkVDVChWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCisJCS8qCisJCSAqIFRoZSBSWzQtN10/MDAg
c3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2JhbCBiaXQgaW4KKwkJICogdGhlIHRyYW5z
bGF0aW9uIGxvb2thc2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LgorCQkgKiBUaHVz
IGludmFsaWQgZW50cnlzIG11c3QgaGF2ZSB0aGUgR2xvYmFsIGJpdCBzZXQgc28gd2hlbgorCQkg
KiBFbnRyeSBMTyBhbmQgRW50cnkgSEkgRyBiaXRzIGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdp
bGwKKwkJICogcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUgaW4gdGhlIHRsYi4KKwkJICov
CisJCXB0ZSA9IChwdF9lbnRyeV90ICopKnBkZTsKKwkJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsg
aSsrKQorCQkJcHRlW2ldID0gUFRFX0c7CisKKwkJa2VybmVsX3ZtX2VuZCA9IChrZXJuZWxfdm1f
ZW5kICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmIChrZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJu
ZWxfbWFwLT5tYXhfb2Zmc2V0KSB7CisJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4
X29mZnNldDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwYWdlIG1hbmFnZW1lbnQgcm91dGlu
ZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
LworCitDVEFTU0VSVChzaXplb2Yoc3RydWN0IHB2X2NodW5rKSA9PSBQQUdFX1NJWkUpOworQ1RB
U1NFUlQoX05QQ00gPT0gMyk7CitDVEFTU0VSVChfTlBDUFYgPT0gMTY4KTsKKworc3RhdGljIF9f
aW5saW5lIHN0cnVjdCBwdl9jaHVuayAqCitwdl90b19jaHVuayhwdl9lbnRyeV90IHB2KQorewor
CisJcmV0dXJuICgoc3RydWN0IHB2X2NodW5rICopKCh1aW50cHRyX3QpcHYgJiB+KHVpbnRwdHJf
dClQQUdFX01BU0spKTsKK30KKworI2RlZmluZSBQVl9QTUFQKHB2KSAocHZfdG9fY2h1bmsocHYp
LT5wY19wbWFwKQorCisjZGVmaW5lCVBDX0ZSRUUwCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVm
aW5lCVBDX0ZSRUUxCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVmaW5lCVBDX0ZSRUUyCTB4MDAw
MDAwZmZmZmZmZmZmZnVsCisKK3N0YXRpYyBjb25zdCB1X2xvbmcgcGNfZnJlZW1hc2tbX05QQ01d
ID0geyBQQ19GUkVFMCwgUENfRlJFRTEsIFBDX0ZSRUUyIH07CisKKyNpZmRlZiBQVl9TVEFUUwor
c3RhdGljIGludCBwY19jaHVua19jb3VudCwgcGNfY2h1bmtfYWxsb2NzLCBwY19jaHVua19mcmVl
cywgcGNfY2h1bmtfdHJ5ZmFpbDsKKworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBj
X2NodW5rX2NvdW50LCBDVExGTEFHX1JELCAmcGNfY2h1bmtfY291bnQsIDAsCisgICAgIkN1cnJl
bnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5rcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lE
X0FVVE8sIHBjX2NodW5rX2FsbG9jcywgQ1RMRkxBR19SRCwgJnBjX2NodW5rX2FsbG9jcywgMCwK
KyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cnkgY2h1bmtzIGFsbG9jYXRlZCIpOworU1lT
Q1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX2ZyZWVzLCBDVExGTEFHX1JELCAm
cGNfY2h1bmtfZnJlZXMsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5r
cyBmcmVlcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX3RyeWZh
aWwsIENUTEZMQUdfUkQsICZwY19jaHVua190cnlmYWlsLCAwLAorICAgICJOdW1iZXIgb2YgdGlt
ZXMgdHJpZWQgdG8gZ2V0IGEgY2h1bmsgcGFnZSBidXQgZmFpbGVkLiIpOworCitzdGF0aWMgbG9u
ZyBwdl9lbnRyeV9jb3VudCwgcHZfZW50cnlfZnJlZXMsIHB2X2VudHJ5X2FsbG9jczsKK3N0YXRp
YyBpbnQgcHZfZW50cnlfc3BhcmU7CisKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBPSURfQVVUTywg
cHZfZW50cnlfZnJlZXMsIENUTEZMQUdfUkQsICZwdl9lbnRyeV9mcmVlcywgMCwKKyAgICAiQ3Vy
cmVudCBudW1iZXIgb2YgcHYgZW50cnkgZnJlZXMiKTsKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBP
SURfQVVUTywgcHZfZW50cnlfYWxsb2NzLCBDVExGTEFHX1JELCAmcHZfZW50cnlfYWxsb2NzLCAw
LAorICAgICJDdXJyZW50IG51bWJlciBvZiBwdiBlbnRyeSBhbGxvY3MiKTsKK1NZU0NUTF9MT05H
KF92bV9wbWFwLCBPSURfQVVUTywgcHZfZW50cnlfY291bnQsIENUTEZMQUdfUkQsICZwdl9lbnRy
eV9jb3VudCwgMCwKKyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cmllcyIpOworU1lTQ1RM
X0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X3NwYXJlLCBDVExGTEFHX1JELCAmcHZf
ZW50cnlfc3BhcmUsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHNwYXJlIHB2IGVudHJpZXMi
KTsKKyNlbmRpZgorCisvKgorICogV2UgYXJlIGluIGEgc2VyaW91cyBsb3cgbWVtb3J5IGNvbmRp
dGlvbi4gIFJlc29ydCB0bworICogZHJhc3RpYyBtZWFzdXJlcyB0byBmcmVlIHNvbWUgcGFnZXMg
c28gd2UgY2FuIGFsbG9jYXRlCisgKiBhbm90aGVyIHB2IGVudHJ5IGNodW5rLgorICoKKyAqIFJl
dHVybnMgTlVMTCBpZiBQViBlbnRyaWVzIHdlcmUgcmVjbGFpbWVkIGZyb20gdGhlIHNwZWNpZmll
ZCBwbWFwLgorICoKKyAqIFdlIGRvIG5vdCwgaG93ZXZlciwgdW5tYXAgMm1wYWdlcyBiZWNhdXNl
IHN1YnNlcXVlbnQgYWNjZXNzIHdpbGwKKyAqIGFsbG9jYXRlIHBlci1wYWdlIHB2IGVudHJpZXMg
dW50aWwgcmVwcm9tb3Rpb24gb2NjdXJzLCB0aGVyZWJ5CisgKiBleGFjZXJiYXRpbmcgdGhlIHNo
b3J0YWdlIG9mIGZyZWUgcHYgZW50cmllcy4KKyAqLworc3RhdGljIHZtX3BhZ2VfdAorcmVjbGFp
bV9wdl9jaHVuayhwbWFwX3QgbG9ja2VkX3BtYXAsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sK
KwlzdHJ1Y3QgcGNoIG5ld190YWlsOworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJcGRfZW50cnlf
dCAqcGRlOworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5X3QgKnB0ZSwgb2xkcHRlOworCXB2X2Vu
dHJ5X3QgcHY7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFnZV90IG0sIG1fcGM7CisJc3RydWN0
IHNwZ2xpc3QgZnJlZTsKKwl1aW50NjRfdCBpbnVzZTsKKwlpbnQgYml0LCBmaWVsZCwgZnJlZWQs
IGlkeDsKKworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBf
TE9DS19BU1NFUlQobG9ja2VkX3BtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKGxvY2twICE9IE5V
TEwsICgicmVjbGFpbV9wdl9jaHVuazogbG9ja3AgaXMgTlVMTCIpKTsKKwlwbWFwID0gTlVMTDsK
KwltX3BjID0gTlVMTDsKKwlTTElTVF9JTklUKCZmcmVlKTsKKwlUQUlMUV9JTklUKCZuZXdfdGFp
bCk7CisJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJd2hpbGUgKChwYyA9IFRBSUxRX0ZJ
UlNUKCZwdl9jaHVua3MpKSAhPSBOVUxMICYmIFNMSVNUX0VNUFRZKCZmcmVlKSkgeworCQlUQUlM
UV9SRU1PVkUoJnB2X2NodW5rcywgcGMsIHBjX2xydSk7CisJCW10eF91bmxvY2soJnB2X2NodW5r
c19tdXRleCk7CisJCWlmIChwbWFwICE9IHBjLT5wY19wbWFwKSB7CisJCQlpZiAocG1hcCAhPSBO
VUxMKSB7CisJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwKTsKKwkJCQlpZiAocG1hcCAhPSBs
b2NrZWRfcG1hcCkKKwkJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQl9CisJCQlwbWFwID0gcGMt
PnBjX3BtYXA7CisJCQkvKiBBdm9pZCBkZWFkbG9jayBhbmQgbG9jayByZWN1cnNpb24uICovCisJ
CQlpZiAocG1hcCA+IGxvY2tlZF9wbWFwKSB7CisJCQkJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9j
a3ApOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCX0gZWxzZSBpZiAocG1hcCAhPSBsb2NrZWRf
cG1hcCAmJiAhUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJcG1hcCA9IE5VTEw7CisJCQkJVEFJ
TFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJCQltdHhfbG9jaygmcHZf
Y2h1bmtzX211dGV4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIERl
c3Ryb3kgZXZlcnkgbm9uLXdpcmVkLCA0IEtCIHBhZ2UgbWFwcGluZyBpbiB0aGUgY2h1bmsuCisJ
CSAqLworCQlmcmVlZCA9IDA7CisJCWZvciAoZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBmaWVs
ZCsrKSB7CisJCQlmb3IgKGludXNlID0gfnBjLT5wY19tYXBbZmllbGRdICYgcGNfZnJlZW1hc2tb
ZmllbGRdOworCQkJICAgIGludXNlICE9IDA7IGludXNlICY9IH4oMVVMIDw8IGJpdCkpIHsKKwkJ
CQliaXQgPSBmZnNsKGludXNlKSAtIDE7CisJCQkJaWR4ID0gZmllbGQgKiBzaXplb2YoaW51c2Up
ICogTkJCWSArIGJpdDsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtpZHhdOworCQkJCXZhID0g
cHYtPnB2X3ZhOworCQkJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJCQlLQVNTRVJUKHBk
ZSAhPSBOVUxMICYmICpwZGUgIT0gMCwKKwkJCQkgICAgKCIlczogcGRlIiwgX19mdW5jX18pKTsK
KwkJCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKQorCQkJCQljb250aW51ZTsKKwkJCQlw
dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCQkJb2xkcHRlID0gKnB0ZTsKKwkJCQlp
ZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoaXNf
a2VybmVsX3BtYXAocG1hcCkpCisJCQkJCSpwdGUgPSBQVEVfRzsKKwkJCQllbHNlCisJCQkJCSpw
dGUgPSAwOworCQkJCWlmIChwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRykpCisJCQkJCXBtYXBfaW52
YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQltID0gUEhZU19UT19WTV9QQUdFKFRMQkxPX1BU
RV9UT19QQShvbGRwdGUpKTsKKwkJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJ
CQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCWlmIChwdGVfaXNfcmVmKCZvbGRwdGUpKQorCQkJCQl2
bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZt
LT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJaWYg
KFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJCSAgICAobS0+ZmxhZ3MgJiBQR19G
SUNUSVRJT1VTKSA9PSAwKSB7CisJCQkJCXN0cnVjdCBtZF9wYWdlICpwdmggPQorCQkJCQkgICAg
cGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZo
LT5wdl9saXN0KSkgeworCQkJCQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtLAorCQkJCQkJICAgIFBH
QV9XUklURUFCTEUpOworCQkJCQl9CisJCQkJfQorCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFV
TCA8PCBiaXQ7CisJCQkJcG1hcF91bnVzZV9wdChwbWFwLCB2YSwgKnBkZSwgJmZyZWUpOworCQkJ
CWZyZWVkKys7CisJCQl9CisJCX0KKwkJaWYgKGZyZWVkID09IDApIHsKKwkJCVRBSUxRX0lOU0VS
VF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211
dGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEV2ZXJ5IGZyZWVkIG1hcHBpbmcgaXMgZm9y
IGEgNCBLQiBwYWdlLiAqLworCQlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCBmcmVlZCk7
CisJCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJ
UFZfU1RBVChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NU
QVQoYXRvbWljX3N1YnRyYWN0X2xvbmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlUQUlM
UV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJaWYgKHBjLT5wY19t
YXBbMF0gPT0gUENfRlJFRTAgJiYgcGMtPnBjX21hcFsxXSA9PSBQQ19GUkVFMSAmJgorCQkgICAg
cGMtPnBjX21hcFsyXSA9PSBQQ19GUkVFMikgeworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3Rf
aW50KCZwdl9lbnRyeV9zcGFyZSwgX05QQ1BWKSk7CisJCQlQVl9TVEFUKGF0b21pY19zdWJ0cmFj
dF9pbnQoJnBjX2NodW5rX2NvdW50LCAxKSk7CisJCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZw
Y19jaHVua19mcmVlcywgMSkpOworCQkJLyogRW50aXJlIGNodW5rIGlzIGZyZWU7IHJldHVybiBp
dC4gKi8KKwkJCW1fcGMgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygKKwkJ
CSAgICAodm1fb2Zmc2V0X3QpcGMpKTsKKwkJCWR1bXBfZHJvcF9wYWdlKG1fcGMtPnBoeXNfYWRk
cik7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwkJCWJyZWFrOworCQl9CisJCVRB
SUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxR
X0lOU0VSVF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCW10eF9sb2NrKCZwdl9jaHVu
a3NfbXV0ZXgpOworCQkvKiBPbmUgZnJlZWQgcHYgZW50cnkgaW4gbG9ja2VkX3BtYXAgaXMgc3Vm
ZmljaWVudC4gKi8KKwkJaWYgKHBtYXAgPT0gbG9ja2VkX3BtYXApCisJCQlicmVhazsKKwl9CisJ
VEFJTFFfQ09OQ0FUKCZwdl9jaHVua3MsICZuZXdfdGFpbCwgcGNfbHJ1KTsKKwltdHhfdW5sb2Nr
KCZwdl9jaHVua3NfbXV0ZXgpOworCWlmIChwbWFwICE9IE5VTEwpIHsKKwkJcG1hcF9pbnZhbGlk
YXRlX2FsbChwbWFwKTsKKwkJaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXApCisJCQlQTUFQX1VOTE9D
SyhwbWFwKTsKKwl9CisJaWYgKG1fcGMgPT0gTlVMTCAmJiAhU0xJU1RfRU1QVFkoJmZyZWUpKSB7
CisJCW1fcGMgPSBTTElTVF9GSVJTVCgmZnJlZSk7CisJCVNMSVNUX1JFTU9WRV9IRUFEKCZmcmVl
LCBwbGlua3Mucy5zcyk7CisJCS8qIFJlY3ljbGUgYSBmcmVlZCBwYWdlIHRhYmxlIHBhZ2UuICov
CisJCW1fcGMtPndpcmVfY291bnQgPSAxOworCQlhdG9taWNfYWRkX2ludCgmdm1fY250LnZfd2ly
ZV9jb3VudCwgMSk7CisJfQorCXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKKwlyZXR1cm4g
KG1fcGMpOworfQorCisvKgorICogZnJlZSB0aGUgcHZfZW50cnkgYmFjayB0byB0aGUgZnJlZSBs
aXN0CisgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBwdl9lbnRy
eV90IHB2KQoreworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJaW50IGJpdCwgZmllbGQsIGlkeDsK
KworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19B
U1NFUlQocG1hcCwgTUFfT1dORUQpOworCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRy
eV9mcmVlcywgMSkpOworCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCAx
KSk7CisJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfbG9uZygmcHZfZW50cnlfY291bnQsIDEpKTsK
KwlwYyA9IHB2X3RvX2NodW5rKHB2KTsKKwlpZHggPSBwdiAtICZwYy0+cGNfcHZlbnRyeVswXTsK
KwlmaWVsZCA9IGlkeCAvIChzaXplb2YodV9sb25nKSAqIE5CQlkpOworCWJpdCA9IGlkeCAlIChz
aXplb2YodV9sb25nKSAqIE5CQlkpOworCXBjLT5wY19tYXBbZmllbGRdIHw9IDF1bCA8PCBiaXQ7
CisJaWYgKHBjLT5wY19tYXBbMF0gIT0gUENfRlJFRTAgfHwgcGMtPnBjX21hcFsxXSAhPSBQQ19G
UkVFMSB8fAorCSAgICBwYy0+cGNfbWFwWzJdICE9IFBDX0ZSRUUyKSB7CisJCS8qIDk4JSBvZiB0
aGUgdGltZSwgcGMgaXMgYWxyZWFkeSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKi8KKwkJaWYg
KF9fcHJlZGljdF9mYWxzZShwYyAhPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuaykpKSB7
CisJCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJCVRB
SUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCX0KKwkJ
cmV0dXJuOworCX0KKwlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0
KTsKKwlmcmVlX3B2X2NodW5rKHBjKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfcHZfY2h1bmso
c3RydWN0IHB2X2NodW5rICpwYykKK3sKKwl2bV9wYWdlX3QgbTsKKworCW10eF9sb2NrKCZwdl9j
aHVua3NfbXV0ZXgpOworCVRBSUxRX1JFTU9WRSgmcHZfY2h1bmtzLCBwYywgcGNfbHJ1KTsKKwlt
dHhfdW5sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2lu
dCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2lu
dCgmcGNfY2h1bmtfY291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVu
a19mcmVlcywgMSkpOworCS8qIGVudGlyZSBjaHVuayBpcyBmcmVlLCByZXR1cm4gaXQgKi8KKwlt
ID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKHZtX29mZnNldF90KXBjKSk7
CisJZHVtcF9kcm9wX3BhZ2UobS0+cGh5c19hZGRyKTsKKwl2bV9wYWdlX3Vud2lyZShtLCBQUV9J
TkFDVElWRSk7CisJdm1fcGFnZV9mcmVlKG0pOworfQorCisvKgorICogUmV0dXJucyBhIG5ldyBQ
ViBlbnRyeSwgYWxsb2NhdGluZyBhIG5ldyBQViBjaHVuayBmcm9tIHRoZSBzeXN0ZW0gd2hlbgor
ICogbmVlZGVkLiAgSWYgdGhpcyBQViBjaHVuayBhbGxvY2F0aW9uIGZhaWxzIGFuZCBhIFBWIGxp
c3QgbG9jayBwb2ludGVyIHdhcworICogZ2l2ZW4sIGEgUFYgY2h1bmsgaXMgcmVjbGFpbWVkIGZy
b20gYW4gYXJiaXRyYXJ5IHBtYXAuICBPdGhlcndpc2UsIE5VTEwgaXMKKyAqIHJldHVybmVkLgor
ICoKKyAqIFRoZSBnaXZlbiBQViBsaXN0IGxvY2sgbWF5IGJlIHJlbGVhc2VkLgorICovCitzdGF0
aWMgcHZfZW50cnlfdAorZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qgcndsb2NrICoq
bG9ja3ApCit7CisJaW50IGJpdCwgZmllbGQsIGlkeDsKKwlwdl9lbnRyeV90IHB2OworCXN0cnVj
dCBwdl9jaHVuayAqcGM7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxf
bG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlQ
Vl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfYWxsb2NzLCAxKSk7CityZXRyeToKKwlw
YyA9IFRBSUxRX0ZJUlNUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwlpZiAocGMgIT0gTlVMTCkgewor
CQlmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaWYgKHBjLT5w
Y19tYXBbZmllbGRdKSB7CisJCQkJYml0ID0gZmZzbChwYy0+cGNfbWFwW2ZpZWxkXSkgLSAxOwor
CQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChmaWVsZCA8IF9OUENNKSB7CisJCQlpZHggPSBm
aWVsZCAqIHNpemVvZihwYy0+cGNfbWFwW2ZpZWxkXSkgKiBOQkJZICsgYml0OworCQkJcHYgPSAm
cGMtPnBjX3B2ZW50cnlbaWR4XTsKKwkJCXBjLT5wY19tYXBbZmllbGRdICY9IH4oMXVsIDw8IGJp
dCk7CisJCQkvKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBpdGVtLCBtb3ZlIGl0IHRvIHRhaWwgKi8K
KwkJCWlmIChwYy0+cGNfbWFwWzBdID09IDAgJiYgcGMtPnBjX21hcFsxXSA9PSAwICYmCisJCQkg
ICAgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCQkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNo
dW5rLCBwYywgcGNfbGlzdCk7CisJCQkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1
bmssIHBjLAorCQkJCSAgICBwY19saXN0KTsKKwkJCX0KKwkJCVBWX1NUQVQoYXRvbWljX2FkZF9s
b25nKCZwdl9lbnRyeV9jb3VudCwgMSkpOworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50
KCZwdl9lbnRyeV9zcGFyZSwgMSkpOworCQkJcmV0dXJuIChwdik7CisJCX0KKwl9CisJLyogTm8g
ZnJlZSBpdGVtcywgYWxsb2NhdGUgYW5vdGhlciBjaHVuayAqLworCW0gPSB2bV9wYWdlX2FsbG9j
KE5VTEwsIDAsIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX05PT0JKIHwKKwkgICAgVk1fQUxM
T0NfV0lSRUQpOworCWlmIChtID09IE5VTEwpIHsKKwkJaWYgKGxvY2twID09IE5VTEwpIHsKKwkJ
CVBWX1NUQVQocGNfY2h1bmtfdHJ5ZmFpbCsrKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJ
bSA9IHJlY2xhaW1fcHZfY2h1bmsocG1hcCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMKQorCQkJ
Z290byByZXRyeTsKKwl9CisJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfY291bnQs
IDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwlk
dW1wX2FkZF9wYWdlKG0tPnBoeXNfYWRkcik7CisJcGMgPSAoc3RydWN0IHB2X2NodW5rICopTUlQ
U19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCXBjLT5wY19wbWFwID0gcG1h
cDsKKwlwYy0+cGNfbWFwWzBdID0gUENfRlJFRTAgJiB+MXVsOwkvKiBwcmVhbGxvY2F0ZWQgYml0
IDAgKi8KKwlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJcGMtPnBjX21hcFsyXSA9IFBDX0ZS
RUUyOworCW10eF9sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZw
dl9jaHVua3MsIHBjLCBwY19scnUpOworCW10eF91bmxvY2soJnB2X2NodW5rc19tdXRleCk7CisJ
cHYgPSAmcGMtPnBjX3B2ZW50cnlbMF07CisJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2
Y2h1bmssIHBjLCBwY19saXN0KTsKKwlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlf
Y291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwdl9lbnRyeV9zcGFyZSwgX05Q
Q1BWIC0gMSkpOworCXJldHVybiAocHYpOworfQorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVy
IG9mIG9uZSBiaXRzIHdpdGhpbiB0aGUgZ2l2ZW4gUFYgY2h1bmsgbWFwIGVsZW1lbnQuCisgKi8K
K3N0YXRpYyBpbmxpbmUgaW50Citwb3Bjb3VudF9wY19tYXBfZWxlbSh1aW50NjRfdCBlbGVtKQor
eworCWludCBjb3VudDsKKworCS8qCisJICogVGhpcyBzaW1wbGUgbWV0aG9kIG9mIGNvdW50aW5n
IHRoZSBvbmUgYml0cyBwZXJmb3JtcyB3ZWxsIGJlY2F1c2UKKwkgKiB0aGUgZ2l2ZW4gZWxlbWVu
dCB0eXBpY2FsbHkgY29udGFpbnMgbW9yZSB6ZXJvIGJpdHMgdGhhbiBvbmUgYml0cy4KKwkgKi8K
Kwljb3VudCA9IDA7CisJZm9yICg7IGVsZW0gIT0gMDsgZWxlbSAmPSBlbGVtIC0gMSkKKwkJY291
bnQrKzsKKwlyZXR1cm4gKGNvdW50KTsKK30KKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBudW1i
ZXIgb2Ygc3BhcmUgUFYgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIHBtYXAgbWVldHMgb3IKKyAq
IGV4Y2VlZHMgdGhlIGdpdmVuIGNvdW50LCAibmVlZGVkIi4KKyAqCisgKiBUaGUgZ2l2ZW4gUFYg
bGlzdCBsb2NrIG1heSBiZSByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQKK3Jlc2VydmVfcHZf
ZW50cmllcyhwbWFwX3QgcG1hcCwgaW50IG5lZWRlZCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQor
eworCXN0cnVjdCBwY2ggbmV3X3RhaWw7CisJc3RydWN0IHB2X2NodW5rICpwYzsKKwlpbnQgYXZh
aWwsIGZyZWU7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg
UkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJU
KGxvY2twICE9IE5VTEwsICgiJXM6IGxvY2twIGlzIE5VTEwiLCBfX2Z1bmNfXykpOworCisJLyoK
KwkgKiBOZXdseSBhbGxvY2F0ZWQgUFYgY2h1bmtzIG11c3QgYmUgc3RvcmVkIGluIGEgcHJpdmF0
ZSBsaXN0IHVudGlsCisJICogdGhlIHJlcXVpcmVkIG51bWJlciBvZiBQViBjaHVua3MgaGF2ZSBi
ZWVuIGFsbG9jYXRlZC4gIE90aGVyd2lzZSwKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgY291bGQg
cmVjeWNsZSBvbmUgb2YgdGhlc2UgY2h1bmtzLiAgSW4KKwkgKiBjb250cmFzdCwgdGhlc2UgY2h1
bmtzIG11c3QgYmUgYWRkZWQgdG8gdGhlIHBtYXAgdXBvbiBhbGxvY2F0aW9uLgorCSAqLworCVRB
SUxRX0lOSVQoJm5ld190YWlsKTsKK3JldHJ5OgorCWF2YWlsID0gMDsKKwlUQUlMUV9GT1JFQUNI
KHBjLCAmcG1hcC0+cG1fcHZjaHVuaywgcGNfbGlzdCkgeworCQlmcmVlID0gcG9wY291bnRfcGNf
bWFwX2VsZW0ocGMtPnBjX21hcFswXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0o
cGMtPnBjX21hcFsxXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0ocGMtPnBjX21h
cFsyXSk7CisJCWlmIChmcmVlID09IDApCisJCQlicmVhazsKKwkJYXZhaWwgKz0gZnJlZTsKKwkJ
aWYgKGF2YWlsID49IG5lZWRlZCkKKwkJCWJyZWFrOworCX0KKwlmb3IgKDsgYXZhaWwgPCBuZWVk
ZWQ7IGF2YWlsICs9IF9OUENQVikgeworCQltID0gdm1fcGFnZV9hbGxvYyhOVUxMLCAwLCBWTV9B
TExPQ19OT1JNQUwgfCBWTV9BTExPQ19OT09CSiB8CisJCSAgICBWTV9BTExPQ19XSVJFRCk7CisJ
CWlmIChtID09IE5VTEwpIHsKKwkJCW0gPSByZWNsYWltX3B2X2NodW5rKHBtYXAsIGxvY2twKTsK
KwkJCWlmIChtID09IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCQlQVl9TVEFUKGF0b21p
Y19hZGRfaW50KCZwY19jaHVua19jb3VudCwgMSkpOworCQlQVl9TVEFUKGF0b21pY19hZGRfaW50
KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwkJZHVtcF9hZGRfcGFnZShtLT5waHlzX2FkZHIpOwor
CQlwYyA9IChzdHJ1Y3QgcHZfY2h1bmsgKilNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9f
UEhZUyhtKSk7CisJCXBjLT5wY19wbWFwID0gcG1hcDsKKwkJcGMtPnBjX21hcFswXSA9IFBDX0ZS
RUUwOworCQlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJCXBjLT5wY19tYXBbMl0gPSBQQ19G
UkVFMjsKKwkJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0
KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJUFZfU1RB
VChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCX0KKwlpZiAoIVRB
SUxRX0VNUFRZKCZuZXdfdGFpbCkpIHsKKwkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJ
CVRBSUxRX0NPTkNBVCgmcHZfY2h1bmtzLCAmbmV3X3RhaWwsIHBjX2xydSk7CisJCW10eF91bmxv
Y2soJnB2X2NodW5rc19tdXRleCk7CisJfQorfQorCisvKgorICogRmlyc3QgZmluZCBhbmQgdGhl
biByZW1vdmUgdGhlIHB2IGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIHBtYXAgYW5kIHZpcnR1YWwK
KyAqIGFkZHJlc3MgZnJvbSB0aGUgc3BlY2lmaWVkIHB2IGxpc3QuICBSZXR1cm5zIHRoZSBwdiBl
bnRyeSBpZiBmb3VuZCBhbmQgTlVMTAorICogb3RoZXJ3aXNlLiAgVGhpcyBvcGVyYXRpb24gY2Fu
IGJlIHBlcmZvcm1lZCBvbiBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvcgorICogMk1CIHBhZ2Ug
bWFwcGluZ3MuCisgKi8KK3N0YXRpYyBwdl9lbnRyeV90CitwbWFwX3B2aF9yZW1vdmUoc3RydWN0
IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXB2X2VudHJ5
X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlUQUlM
UV9GT1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCWlmIChwbWFwID09IFBW
X1BNQVAocHYpICYmIHZhID09IHB2LT5wdl92YSkgeworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2
X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCXB2aC0+cHZfZ2VuKys7CisJCQlicmVhazsKKwkJfQor
CX0KKwlyZXR1cm4gKHB2KTsKK30KKworLyoKKyAqIEFmdGVyIGRlbW90aW9uIGZyb20gYSAyTUIg
cGFnZSBtYXBwaW5nIHRvIDUxMiA0S0IgcGFnZSBtYXBwaW5ncywKKyAqIGRlc3Ryb3kgdGhlIHB2
IGVudHJ5IGZvciB0aGUgMk1CIHBhZ2UgbWFwcGluZyBhbmQgcmVpbnN0YW50aWF0ZSB0aGUgcHYK
KyAqIGVudHJpZXMgZm9yIGVhY2ggb2YgdGhlIDRLQiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0
aWMgdm9pZAorcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg
dm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJc3RydWN0IG1k
X3BhZ2UgKnB2aDsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOworCXB2X2VudHJ5X3QgcHY7CisJdm1f
b2Zmc2V0X3QgdmFfbGFzdDsKKwl2bV9wYWdlX3QgbTsKKwlpbnQgYml0LCBmaWVsZDsKKworCXJ3
X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQo
cG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQoKHBhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCIl
czogcGEgaXMgbm90IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlDSEFOR0VfUFZfTElT
VF9MT0NLX1RPX1BIWVMobG9ja3AsIHBhKTsKKworCS8qCisJICogVHJhbnNmZXIgdGhlIDJtcGFn
ZSdzIHB2IGVudHJ5IGZvciB0aGlzIG1hcHBpbmcgdG8gdGhlIGZpcnN0CisJICogcGFnZSdzIHB2
IGxpc3QuICBPbmNlIHRoaXMgdHJhbnNmZXIgYmVnaW5zLCB0aGUgcHYgbGlzdCBsb2NrCisJICog
bXVzdCBub3QgYmUgcmVsZWFzZWQgdW50aWwgdGhlIGxhc3QgcHYgZW50cnkgaXMgcmVpbnN0YW50
aWF0ZWQuCisJICovCisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwl2YSA9IHRydW5jXzJtcGFnZSh2
YSk7CisJcHYgPSBwbWFwX3B2aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAh
PSBOVUxMLCAoIiVzOiBwdiBub3QgZm91bmQiLCBfX2Z1bmNfXykpOworCW0gPSBQSFlTX1RPX1ZN
X1BBR0UocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4
dCk7CisJbS0+bWQucHZfZ2VuKys7CisJLyogSW5zdGFudGlhdGUgdGhlIHJlbWFpbmluZyBOUFRF
UEcgLSAxIHB2IGVudHJpZXMuICovCisJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5
X2FsbG9jcywgTlBURVBHIC0gMSkpOworCXZhX2xhc3QgPSB2YSArIE5CUERSIC0gUEFHRV9TSVpF
OworCWZvciAoOzspIHsKKwkJcGMgPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuayk7CisJ
CUtBU1NFUlQocGMtPnBjX21hcFswXSAhPSAwIHx8IHBjLT5wY19tYXBbMV0gIT0gMCB8fAorCQkg
ICAgcGMtPnBjX21hcFsyXSAhPSAwLCAoIiVzOiBtaXNzaW5nIHNwYXJlIiwgX19mdW5jX18pKTsK
KwkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007IGZpZWxkKyspIHsKKwkJCXdoaWxlIChw
Yy0+cGNfbWFwW2ZpZWxkXSkgeworCQkJCWJpdCA9IGZmc2wocGMtPnBjX21hcFtmaWVsZF0pIC0g
MTsKKwkJCQlwYy0+cGNfbWFwW2ZpZWxkXSAmPSB+KDF1bCA8PCBiaXQpOworCQkJCXB2ID0gJnBj
LT5wY19wdmVudHJ5W2ZpZWxkICogNjQgKyBiaXRdOworCQkJCXZhICs9IFBBR0VfU0laRTsKKwkJ
CQlwdi0+cHZfdmEgPSB2YTsKKwkJCQltKys7CisJCQkJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBP
X1VOTUFOQUdFRCkgPT0gMCwKKwkJCQkgICAoIiVzOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwg
X19mdW5jX18sIG0pKTsKKwkJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYs
IHB2X25leHQpOworCQkJCW0tPm1kLnB2X2dlbisrOworCQkJCWlmICh2YSA9PSB2YV9sYXN0KQor
CQkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1
bmssIHBjLCBwY19saXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmss
IHBjLCBwY19saXN0KTsKKwl9CitvdXQ6CisJaWYgKHBjLT5wY19tYXBbMF0gPT0gMCAmJiBwYy0+
cGNfbWFwWzFdID09IDAgJiYgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCVRBSUxRX1JFTU9WRSgm
cG1hcC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmcG1h
cC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCX0KKwlQVl9TVEFUKGF0b21pY19hZGRfbG9u
ZygmcHZfZW50cnlfY291bnQsIE5QVEVQRyAtIDEpKTsKKwlQVl9TVEFUKGF0b21pY19zdWJ0cmFj
dF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBOUFRFUEcgLSAxKSk7Cit9CisKKy8qCisgKiBBZnRlciBw
cm9tb3Rpb24gZnJvbSA1MTIgNEtCIHBhZ2UgbWFwcGluZ3MgdG8gYSBzaW5nbGUgMk1CIHBhZ2Ug
bWFwcGluZywKKyAqIHJlcGxhY2UgdGhlIG1hbnkgcHYgZW50cmllcyBmb3IgdGhlIDRLQiBwYWdl
IG1hcHBpbmdzIGJ5IGEgc2luZ2xlIHB2IGVudHJ5CisgKiBmb3IgdGhlIDJNQiBwYWdlIG1hcHBp
bmcuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX3B2X3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCB2
bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3Ap
Cit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90
IHZhX2xhc3Q7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg
UkFfTE9DS0VEKTsKKwlLQVNTRVJUKChwYSAmIFBEUk1BU0spID09IDAsCisJICAgICgiJXM6IHBh
IGlzIG5vdCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVuY19fKSk7CisJQ0hBTkdFX1BWX0xJU1RfTE9D
S19UT19QSFlTKGxvY2twLCBwYSk7CisKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSBmaXJzdCBwYWdl
J3MgcHYgZW50cnkgZm9yIHRoaXMgbWFwcGluZyB0byB0aGUgMm1wYWdlJ3MKKwkgKiBwdiBsaXN0
LiAgQXNpZGUgZnJvbSBhdm9pZGluZyB0aGUgY29zdCBvZiBhIGNhbGwgdG8gZ2V0X3B2X2VudHJ5
KCksCisJICogYSB0cmFuc2ZlciBhdm9pZHMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgZ2V0X3B2X2Vu
dHJ5KCkgY2FsbHMKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgYW5kIHRoYXQgcmVjbGFpbV9wdl9j
aHVuaygpIHJlbW92ZXMgb25lIG9mIHRoZQorCSAqIG1hcHBpbmdzIHRoYXQgaXMgYmVpbmcgcHJv
bW90ZWQuCisJICovCisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJdmEgPSB0cnVuY18ybXBh
Z2UodmEpOworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKCZtLT5tZCwgcG1hcCwgdmEpOworCUtBU1NF
UlQocHYgIT0gTlVMTCwgKCIlczogcHYgbm90IGZvdW5kIiwgX19mdW5jX18pKTsKKwlwdmggPSBw
YV90b19wdmgocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9u
ZXh0KTsKKwlwdmgtPnB2X2dlbisrOworCS8qIEZyZWUgdGhlIHJlbWFpbmluZyBOUFRFUEcgLSAx
IHB2IGVudHJpZXMuICovCisJdmFfbGFzdCA9IHZhICsgTkJQRFIgLSBQQUdFX1NJWkU7CisJZG8g
eworCQltKys7CisJCXZhICs9IFBBR0VfU0laRTsKKwkJcG1hcF9wdmhfZnJlZSgmbS0+bWQsIHBt
YXAsIHZhKTsKKwl9IHdoaWxlICh2YSA8IHZhX2xhc3QpOworfQorCisvKgorICogRmlyc3QgZmlu
ZCBhbmQgdGhlbiBkZXN0cm95IHRoZSBwdiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBwbWFwIGFu
ZCB2aXJ0dWFsCisgKiBhZGRyZXNzLiAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBv
biBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvciAyTUIKKyAqIHBhZ2UgbWFwcGluZ3MuCisgKi8K
K3N0YXRpYyB2b2lkCitwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBw
bWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJcHYgPSBwbWFwX3B2
aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxMLCAoInBtYXBfcHZo
X2ZyZWU6IHB2IG5vdCBmb3VuZCwgcGEgJWx4IHZhICVseCIsCisJICAgICAodV9sb25nKVZNX1BB
R0VfVE9fUEhZUyhfX2NvbnRhaW5lcm9mKHB2aCwgc3RydWN0IHZtX3BhZ2UsIG1kKSksCisJICAg
ICAodV9sb25nKXZhKSk7CisJZnJlZV9wdl9lbnRyeShwbWFwLCBwdik7Cit9CisKKy8qCisgKiBD
b25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgcHYgZW50cnkgZm9yIGEgNEtCIHBhZ2UgbWFwcGluZyBp
ZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4gYmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzdG9y
dGluZyB0byByZWNsYW1hdGlvbi4KKyAqLworc3RhdGljIGJvb2xlYW5fdAorcG1hcF90cnlfaW5z
ZXJ0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sCisg
ICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3Nl
cnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAs
IE1BX09XTkVEKTsKKwlpZiAoKHB2ID0gZ2V0X3B2X2VudHJ5KHBtYXAsIE5VTEwpKSAhPSBOVUxM
KSB7CisJCXB2LT5wdl92YSA9IHZhOworCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0Uo
bG9ja3AsIG0pOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25l
eHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJcmV0dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJcmV0
dXJuIChGQUxTRSk7Cit9CisKKy8qCisgKiBDb25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgUFYgZW50
cnkgZm9yIGEgMk1CIHBhZ2UgbWFwcGluZyBpZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4g
YmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHJlY2xhbWF0aW9uLgorICovCitzdGF0
aWMgYm9vbGVhbl90CitwbWFwX3B2X2luc2VydF9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90
IHZhLCB2bV9wYWRkcl90IHBhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1
Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9i
YWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK
KwkvKiBQYXNzIE5VTEwgaW5zdGVhZCBvZiB0aGUgbG9jayBwb2ludGVyIHRvIGRpc2FibGUgcmVj
bGFtYXRpb24uICovCisJaWYgKChwdiA9IGdldF9wdl9lbnRyeShwbWFwLCBOVUxMKSkgIT0gTlVM
TCkgeworCQlwdi0+cHZfdmEgPSB2YTsKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxv
Y2twLCBwYSk7CisJCXB2aCA9IHBhX3RvX3B2aChwYSk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZw
dmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJcHZoLT5wdl9nZW4rKzsKKwkJcmV0dXJuIChU
UlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKKworLyoKKyAqIEZpbGxzIGEg
cGFnZSB0YWJsZSBwYWdlIHdpdGggbWFwcGluZ3MgdG8gY29uc2VjdXRpdmUgcGh5c2ljYWwgcGFn
ZXMuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX2ZpbGxfcHRwKHB0X2VudHJ5X3QgKmZpcnN0cHRl
LCBwdF9lbnRyeV90IG5ld3B0ZSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlmb3IgKHB0ZSA9
IGZpcnN0cHRlOyBwdGUgPCBmaXJzdHB0ZSArIE5QVEVQRzsgcHRlKyspIHsKKwkJKnB0ZSA9IG5l
d3B0ZTsKKwkJbmV3cHRlICs9IChQQUdFX1NJWkUgPj4gVExCTE9fUEZOX1NISUZUKTsKKwl9Cit9
CisKKy8qCisgKiBUcmllcyB0byBkZW1vdGUgYSAyTUIgcGFnZSBtYXBwaW5nLiAgSWYgZGVtb3Rp
b24gZmFpbHMsIHRoZSAyTUIgcGFnZQorICogbWFwcGluZyBpcyBpbnZhbGlkYXRlZC4KKyAqLwor
c3RhdGljIGJvb2xlYW5fdAorcG1hcF9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90
ICpwZGUsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJYm9vbGVh
bl90IHJ2OworCisJbG9jayA9IE5VTEw7CisJcnYgPSBwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBt
YXAsIHBkZSwgdmEsICZsb2NrKTsKKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxv
Y2spOworCXJldHVybiAocnYpOworfQorCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX2RlbW90ZV9w
ZGVfbG9ja2VkKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAor
ICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwkgcGRfZW50cnlfdCBuZXdwZGUsIG9sZHBk
ZTsKKwkgcHRfZW50cnlfdCBvbGRwdGUsICpmaXJzdHB0ZSwgbmV3cHRlOworCSB2bV9wYWRkcl90
IG1wdGVwYTsKKwkgdm1fcGFnZV90IG1wdGU7CisJIHN0cnVjdCBzcGdsaXN0IGZyZWU7CisKKwkg
UE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJIG9sZHBkZSA9ICpwZGU7CisJIG9s
ZHB0ZSA9IChwdF9lbnRyeV90KW9sZHBkZTsKKwkgS0FTU0VSVChwdGVfaXNfMW1fc3VwZXJwYWdl
KCZvbGRwdGUpICYmIHB0ZV9pc192YWxpZCgmb2xkcHRlKSwKKwkgICAgICgiJXM6IG9sZHBkZSBp
cyBub3Qgc3VwZXJwYWdlIGFuZC9vciB2YWxpZC4iLCBfX2Z1bmNfXykpOworCSBpZiAocHRlX2lz
X3JlZigmb2xkcHRlKSAmJiAobXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1hcCwgdmEpKSAh
PQorCSAgICAgTlVMTCkKKwkJIHBtYXBfcmVtb3ZlX3B0X3BhZ2UocG1hcCwgbXB0ZSk7CisJIGVs
c2UgeworCQkgS0FTU0VSVCghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpLAorCQkgICAgICgiJXM6
IHBhZ2UgdGFibGUgcGFnZSBmb3IgYSB3aXJlZCBtYXBwaW5nIGlzIG1pc3NpbmciLAorCQkgICAg
IF9fZnVuY19fKSk7CisJCSAvKgorCQkgICogSW52YWxpZGF0ZSB0aGUgMk1CIHBhZ2UgbWFwcGlu
ZyBhbmQgcmV0dXJuICJmYWlsdXJlIiBpZiB0aGUKKwkJICAqIG1hcHBpbmcgd2FzIG5ldmVyIGFj
Y2Vzc2VkIG9yIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBuZXcKKwkJICAqIHBhZ2UgdGFibGUgcGFn
ZSBmYWlscy4gIElmIHRoZSAyTUIgcGFnZSBtYXBwaW5nIGJlbG9uZ3MgdG8KKwkJICAqIHRoZSBk
aXJlY3QgbWFwIHJlZ2lvbiBvZiB0aGUga2VybmVsJ3MgYWRkcmVzcyBzcGFjZSwgdGhlbgorCQkg
ICogdGhlIHBhZ2UgYWxsb2NhdGlvbiByZXF1ZXN0IHNwZWNpZmllcyB0aGUgaGlnaGVzdCBwb3Nz
aWJsZQorCQkgICogcHJpb3JpdHkgKFZNX0FMTE9DX0lOVEVSUlVQVCkuICBPdGhlcndpc2UsIHRo
ZSBwcmlvcml0eSBpcworCQkgICogbm9ybWFsLiAgUGFnZSB0YWJsZSBwYWdlcyBhcmUgcHJlYWxs
b2NhdGVkIGZvciBldmVyeSBvdGhlcgorCQkgICogcGFydCBvZiB0aGUga2VybmVsIGFkZHJlc3Mg
c3BhY2UsIHNvIHRoZSBkaXJlY3QgbWFwIHJlZ2lvbgorCQkgICogaXMgdGhlIG9ubHkgcGFydCBv
ZiB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UgdGhhdCBtdXN0IGJlCisJCSAgKiBoYW5kbGVkIGhl
cmUuCisJCSAgKi8KKwkJIGlmICghcHRlX2lzX3JlZigmb2xkcHRlKSB8fCAobXB0ZSA9IHZtX3Bh
Z2VfYWxsb2MoTlVMTCwKKwkJICAgICBwbWFwX3BkZV9waW5kZXgodmEpLCAodmEgPj0gVk1fTUlO
X0tFUk5FTF9BRERSRVNTICYmIHZhIDwKKwkJICAgICBWTV9NQVhfQUREUkVTUyA/IFZNX0FMTE9D
X0lOVEVSUlVQVCA6IFZNX0FMTE9DX05PUk1BTCkgfAorCQkgICAgIFZNX0FMTE9DX05PT0JKIHwg
Vk1fQUxMT0NfV0lSRUQpKSA9PSBOVUxMKSB7CisJCQkgU0xJU1RfSU5JVCgmZnJlZSk7CisJCQkg
cG1hcF9yZW1vdmVfcGRlKHBtYXAsIHBkZSwgdHJ1bmNfMm1wYWdlKHZhKSwgJmZyZWUsCisJCQkg
ICAgIGxvY2twKTsKKwkJCSBwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwKKwkJCSAgICAgKHZt
X29mZnNldF90KSh2YSAmIH5QRFJNQVNLKSwKKwkJCSAgICAgKHZtX29mZnNldF90KSh2YSAmIH5Q
RFJNQVNLKSArIE5CUERSKTsKKwkJCSBwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkg
Q1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkJ
ICAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQkJIHJldHVybiAoRkFMU0UpOworCQkgfQorCQkg
aWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJIHBtYXBfcmVzaWRlbnRfY291bnRfaW5j
KHBtYXAsIDEpOworCSB9CisJIG1wdGVwYSA9IFZNX1BBR0VfVE9fUEhZUyhtcHRlKTsKKwkgbmV3
cGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVChtcHRlcGEpOworCSBmaXJzdHB0
ZSA9IG5ld3BkZTsKKwkgS0FTU0VSVChwdGVfaXNfcmVmKCZvbGRwdGUpLAorCSAgICAgKCIlczog
b2xkcHRlIGlzIG5vdCByZWZlcmVuY2VkIiwgX19mdW5jX18pKTsKKwkgS0FTU0VSVCghcHRlX3Rl
c3QoJm9sZHB0ZSwgUFRFX1JPKSAmJiBwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRCksCisJICAgICAo
IiVzOiBvbGRwdGUgaXMgbWlzc2luZyBQVEVfRCIsIF9fZnVuY19fKSk7CisJIG5ld3B0ZSA9IG9s
ZHB0ZSAmIH5QVEVfUFNfSURYX01BU0s7CisKKwkgLyoKKwkgICogSWYgdGhlIHBhZ2UgdGFibGUg
cGFnZSBpcyBuZXcsIGluaXRpYWxpemUgaXQuCisJICAqLworCSBpZiAobXB0ZS0+d2lyZV9jb3Vu
dCA9PSAxKSB7CisJCSBtcHRlLT53aXJlX2NvdW50ID0gTlBURVBHOworCQkgcG1hcF9maWxsX3B0
cChmaXJzdHB0ZSwgbmV3cHRlKTsKKwkgfQorCSBLQVNTRVJUKFRMQkxPX1BURV9UT19QQSgqZmly
c3RwdGUpID09IFRMQkxPX1BURV9UT19QQShuZXdwdGUpLAorCSAgICAgKCIlczogZmlyc3RwdGUg
YW5kIG5ld3B0ZSBtYXAgZGlmZmVyZW50IHBoeXNpY2FsIGFkZHJlc3NlcyIsCisJICAgICBfX2Z1
bmNfXykpOworCisJIC8qCisJICAqIElmIHRoZSBtYXBwaW5nIGhhcyBjaGFuZ2VkIGF0dHJpYnV0
ZXMsIHVwZGF0ZSB0aGUgcGFnZSB0YWJsZQorCSAgKiBlbnRyaWVzLgorCSAgKi8KKwkgaWYgKCgq
Zmlyc3RwdGUgJiBQR19QUk9NT1RFX01BU0spICE9IChuZXdwdGUgJiBQR19QUk9NT1RFX01BU0sp
KQorCQkgcG1hcF9maWxsX3B0cChmaXJzdHB0ZSwgbmV3cHRlKTsKKworCisJIC8qCisJICAqIFRo
ZSBzcGFyZSBQViBlbnRyaWVzIG11c3QgYmUgcmVzZXJ2ZWQgcHJpb3IgdG8gZGVtb3RpbmcgdGhl
CisJICAqIG1hcHBpbmcsIHRoYXQgaXMsIHByaW9yIHRvIGNoYW5naW5nIHRoZSBQREUuICBPdGhl
cndpc2UsIHRoZSBzdGF0ZQorCSAgKiBvZiB0aGUgUERFIGFuZCB0aGUgUFYgbGlzdHMgd2lsbCBi
ZSBpbmNvbnNpc3RlbnQsIHdoaWNoIGNhbiByZXN1bHQKKwkgICogaW4gcmVjbGFpbV9wdl9jaHVu
aygpIGF0dGVtcHRpbmcgdG8gcmVtb3ZlIGEgUFYgZW50cnkgZnJvbSB0aGUKKwkgICogd3Jvbmcg
UFYgbGlzdCBhbmQgcG1hcF9wdl9kZW1vdGVfcGRlKCkgZmFpbGluZyB0byBmaW5kIHRoZSBleHBl
Y3RlZAorCSAgKiBQViBlbnRyeSBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcgdGhhdCBpcyBiZWlu
ZyBkZW1vdGVkLgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VEKSkK
KwkJIHJlc2VydmVfcHZfZW50cmllcyhwbWFwLCBOUFRFUEcgLSAxLCBsb2NrcCk7CisKKwkgLyoK
KwkgICogRGVtb3RlIHRoZSBtYXBwaW5nLiAgVGhpcyBwbWFwIGlzIGxvY2tlZC4gIFRoZSBvbGQg
UERFIGhhcworCSAgKiBQVEVfUkVGIHNldC4gIElmIHRoZSBvbGQgUERFIGhhcyBQVEVfUk8gY2xl
YXIsIGl0IGFsc28gaGFzCisJICAqIFBURV9EIHNldC4gIFRodXMsIHRoZXJlIGlzIG5vIGRhbmdl
ciBvZiBhIHJhY2Ugd2l0aCBhbm90aGVyCisJICAqIHByb2Nlc3NvciBjaGFuZ2luZyB0aGUgc2V0
dGluZyBvZiBQVEVfUkVGIGFuZC9vciBQVEVfRCBiZXR3ZWVuCisJICAqIHRoZSByZWFkIGFib3Zl
IGFuZCB0aGUgc3RvcmUgYmVsb3cuCisJICAqLworCSBwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEs
IHBkZSwgKHB0X2VudHJ5X3QpbmV3cGRlKTsKKworCSAvKgorCSAgKiBJbnZhbGlkYXRlIGEgc3Rh
bGUgcmVjdXJzaXZlIG1hcHBpbmcgb2YgdGhlIHBhZ2UgdGFibGUgcGFnZS4KKwkgICovCisJIGlm
ICh2YSA+PSBWTV9NQVhVU0VSX0FERFJFU1MpCisJCSBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFw
LCAodm1fb2Zmc2V0X3QpcG1hcF9wdGUocG1hcCwgdmEpKTsKKworCSAvKgorCSAgKiBEZW1vdGUg
dGhlIFBWIGVudHJ5LgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VE
KSkgeworCQkgcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXAsIHZhLCBUTEJMT19QREVfVE9fUEEob2xk
cGRlKSwgbG9ja3ApOworCSB9CisJIGF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfZGVtb3Rpb25z
LCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAg
JXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKworCSByZXR1cm4gKFRSVUUpOworfQor
CisvKgorICogcG1hcF9yZW1vdmVfa2VybmVsX3BkZTogUmVtb3ZlIGEga2VybmVsIHN1cGVycGFn
ZSBtYXBwaW5nLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9yZW1vdmVfa2VybmVsX3BkZShwbWFw
X3QgcG1hcCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwkvKiBYWFggTm90
IGRvaW5nIGtlcm5lbCBzdXBlcnBhZ2VzIHlldC4gKi8KKwlwYW5pYygicG1hcF9yZW1vdmVfa2Vy
bmVsX3BkZToga2VybmVsIHN1cGVycGFnZSIpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcGRl
OiBkbyB0aGUgdGhpbmdzIHRvIHVubWFwIGEgc3VwZXJwYWdlIGluIGEgcHJvY2VzcworICovCitz
dGF0aWMgaW50CitwbWFwX3JlbW92ZV9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkcSwg
dm1fb2Zmc2V0X3Qgc3ZhLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2Nr
ICoqbG9ja3ApCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwZF9lbnRyeV90IG9sZHBkZTsK
Kwl2bV9vZmZzZXRfdCBldmEsIHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCisJLyoKKwkgKiBX
cml0ZSBiYWNrIGFsbCBjYWNoZSBsaW5lcyBmcm9tIHRoZSBzdXBlcnBhZ2UgYmVpbmcgdW5tYXBw
ZWQuCisJICovCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgoKHN2YSAmIH5QRFJNQVNL
KSwgTkJQRFIpOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJS0FTU0VS
VCgoc3ZhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9wZGU6IHN2YSBpcyBu
b3QgMm1wYWdlIGFsaWduZWQiKSk7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisJCW9s
ZHBkZSA9IHBkZV9sb2FkX3N0b3JlKHBkcSwgUFRFX0cpOworCWVsc2UKKwkJb2xkcGRlID0gcGRl
X2xvYWRfc3RvcmUocGRxLCAwKTsKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1cpKQorCQlw
bWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCAtPSBOQlBEUiAvIFBBR0VfU0laRTsKKworCWlmIChw
ZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKGtlcm5lbF9w
bWFwLCBzdmEpOworCisJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgTkJQRFIgLyBQQUdF
X1NJWkUpOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpIHsKKwkgICAgQ0hB
TkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7
CisJICAgIHB2aCA9IHBhX3RvX3B2aChUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7CisJICAgIHBt
YXBfcHZoX2ZyZWUocHZoLCBwbWFwLCBzdmEpOworCSAgICBldmEgPSBzdmEgKyBOQlBEUjsKKwkg
ICAgZm9yICh2YSA9IHN2YSwgbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QREVfVE9fUEEob2xk
cGRlKSk7CisJCXZhIDwgZXZhOyB2YSArPSBQQUdFX1NJWkUsIG0rKykgeworCQkgICAgaWYgKHBk
ZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAmJiAhcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1JPKSkKKwkJ
CSAgICB2bV9wYWdlX2RpcnR5KG0pOworCQkgICAgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9S
RUYpKQorCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQkgICAgaWYg
KFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJVEFJTFFfRU1QVFkoJnB2aC0+cHZf
bGlzdCkpCisJCQkgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKKwkg
ICAgfQorCX0KKwlpZiAocG1hcCA9PSBrZXJuZWxfcG1hcCkgeworCQlwbWFwX3JlbW92ZV9rZXJu
ZWxfcGRlKHBtYXAsIHBkcSwgc3ZhKTsKKwl9IGVsc2UgeworCQltcHRlID0gcG1hcF9sb29rdXBf
cHRfcGFnZShwbWFwLCBzdmEpOworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQlwbWFwX3JlbW92
ZV9wdF9wYWdlKHBtYXAsIG1wdGUpOworCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwg
MSk7CisJCQlLQVNTRVJUKG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJICAgICgicG1h
cF9yZW1vdmVfcGRlOiBwdGUgcGFnZSB3aXJlIGNvdW50IGVycm9yIikpOworCQkJbXB0ZS0+d2ly
ZV9jb3VudCA9IDA7CisJCQlwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdChtcHRlLCBmcmVlLCBG
QUxTRSk7CisJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsK
KwkJfQorCX0KKwlyZXR1cm4gKHBtYXBfdW51c2VfcHQocG1hcCwgc3ZhLCAqcG1hcF9zZWdtYXAo
cG1hcCwgc3ZhKSwgZnJlZSkpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcHRlOiBkbyB0aGUg
dGhpbmdzIHRvIHVubWFwIGEgcGFnZSBpbiBhIHByb2Nlc3MKKyAqLworc3RhdGljIGludAorcG1h
cF9yZW1vdmVfcHRlKHN0cnVjdCBwbWFwICpwbWFwLCBwdF9lbnRyeV90ICpwdHEsIHZtX29mZnNl
dF90IHZhLAorICAgIHBkX2VudHJ5X3QgcHRlcGRlLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSwgc3Ry
dWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHRfZW50cnlf
dCBvbGRwdGU7CisJdm1fcGFnZV90IG07CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09X
TkVEKTsKKworCS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGUgbGluZXMgZnJvbSB0aGUgcGFn
ZSBiZWluZyB1bm1hcHBlZC4KKwkgKi8KKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2
YSwgUEFHRV9TSVpFKTsKKworCW9sZHB0ZSA9ICpwdHE7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBt
YXApKQorCQkqcHRxID0gUFRFX0c7CisJZWxzZQorCQkqcHRxID0gMDsKKworCWlmIChwdGVfdGVz
dCgmb2xkcHRlLCBQVEVfVykpCisJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50IC09IDE7CisK
KwlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwlpZiAocHRlX3Rlc3QoJm9sZHB0
ZSwgUFRFX01BTkFHRUQpKSB7CisJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRFX1RPX1BB
KG9sZHB0ZSkpOworCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJU
KCFwdGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pLAorCQkJICAgKCIlczogbW9kaWZpZWQgcGFnZSBu
b3Qgd3JpdGFibGU6IHZhOiAlcCwgcHRlOiAlI2p4IiwKKwkJCSAgICBfX2Z1bmNfXywgKHZvaWQg
Kil2YSwgKHVpbnRtYXhfdClvbGRwdGUpKTsKKwkJCXZtX3BhZ2VfZGlydHkobSk7CisJCX0KKwkJ
aWYgKHB0ZV9pc19yZWYoJm9sZHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVG
RVJFTkNFRCk7CisJCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fVk1fUEFHRShsb2NrcCwgbSk7CisJ
CXBtYXBfcHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJCWlmIChUQUlMUV9FTVBUWSgmbS0+
bWQucHZfbGlzdCkgJiYKKwkJICAgIChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsK
KwkJCXB2aCA9IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQkJaWYgKFRBSUxRX0VN
UFRZKCZwdmgtPnB2X2xpc3QpKQorCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRF
QUJMRSk7CisJCX0KKwl9CisJcmV0dXJuIChwbWFwX3VudXNlX3B0KHBtYXAsIHZhLCBwdGVwZGUs
IGZyZWUpKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIHNpbmdsZSBwYWdlIGZyb20gYSBwcm9jZXNz
IGFkZHJlc3Mgc3BhY2UKKyAqLworc3RhdGljIHZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2Uoc3RydWN0
IHBtYXAgKnBtYXAsIHZtX29mZnNldF90IHZhLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwlz
dHJ1Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7
CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlwZGUgPSBwbWFwX3BkZShw
bWFwLCB2YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gMCkKKwkJcmV0dXJuOworCXB0
ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8g
cHRlIGZvciB0aGlzIGFkZHJlc3MsIGp1c3Qgc2tpcCBpdCEKKwkgKi8KKwlpZiAoIXB0ZV9pc192
YWxpZChwdGUpKQorCQlyZXR1cm47CisKKwlsb2NrID0gTlVMTDsKKwkodm9pZClwbWFwX3JlbW92
ZV9wdGUocG1hcCwgcHRlLCB2YSwgKnBkZSwgZnJlZSwgJmxvY2spOworCWlmIChsb2NrICE9IE5V
TEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEp
OworfQorCisvKgorICoJUmVtb3ZlIHRoZSBnaXZlbiByYW5nZSBvZiBhZGRyZXNzZXMgZnJvbSB0
aGUgc3BlY2lmaWVkIG1hcC4KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHN0YXJ0IGFu
ZCBlbmQgYXJlIHByb3Blcmx5CisgKglyb3VuZGVkIHRvIHRoZSBwYWdlIHNpemUuCisgKi8KK3Zv
aWQKK3BtYXBfcmVtb3ZlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90
IGV2YSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZhLCB2YV9uZXh0
OworCXBkX2VudHJ5X3QgcHRwYWRkciwgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlfdCAqcHRlOwor
CXN0cnVjdCBzcGdsaXN0IGZyZWU7CisJaW50IGFueXZhbGlkOworCisJLyoKKwkgKiBQZXJmb3Jt
IGFuIHVuc3luY2hyb25pemVkIHJlYWQuICBUaGlzIGlzLCBob3dldmVyLCBzYWZlLgorCSAqLwor
CWlmIChwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlh
bnl2YWxpZCA9IDA7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisKKwlyd19ybG9jaygmcHZoX2dsb2Jh
bF9sb2NrKTsKKwlQTUFQX0xPQ0socG1hcCk7CisKKwkvKgorCSAqIHNwZWNpYWwgaGFuZGxpbmcg
b2YgcmVtb3Zpbmcgb25lIHBhZ2UuICBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbgorCSAqIGFuZCBl
YXN5IHRvIHNob3J0IGNpcmN1aXQgc29tZSBjb2RlLgorCSAqLworCWlmICgoc3ZhICsgUEFHRV9T
SVpFKSA9PSBldmEpIHsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgc3ZhKTsKKwkJaWYgKCFwZGVf
aXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJCXBtYXBfcmVtb3ZlX3BhZ2UocG1hcCwgc3ZhLCAm
ZnJlZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWxvY2sgPSBOVUxMOworCWZvciAoOyBz
dmEgPCBldmE7IHN2YSA9IHZhX25leHQpIHsKKwkJaWYgKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50
X2NvdW50ID09IDApCisJCQlicmVhazsKKworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3Zh
KTsKKwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNF
R01BU0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29u
dGludWU7CisJCX0KKwkJLyoKKwkJICogQ2FsY3VsYXRlIGluZGV4IGZvciBuZXh0IHBhZ2UgdGFi
bGUuCisJCSAqLworCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAo
dmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3Rv
X3BkZShwZHBlLCBzdmEpOworCQlwdHBhZGRyID0gKnBkZTsKKworCQkvKgorCQkgKiBXZWVkIG91
dCBpbnZhbGlkIG1hcHBpbmdzLgorCQkgKi8KKwkJaWYgKHB0cGFkZHIgPT0gTlVMTCkKKwkJCWNv
bnRpbnVlOworCQkvKgorCQkgKiBDaGVjayBmb3Igc3VwZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBk
ZV9pc18xbV9zdXBlcnBhZ2UoJnB0cGFkZHIpKSB7CisJCQkvKgorCQkJICogQXJlIHdlIHJlbW92
aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyAgSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBw
aW5nIGFuZCBmYWxsIHRocm91Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9u
ZXh0ICYmIGV2YSA+PSB2YV9uZXh0KSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgVExCIGVudHJ5IGZv
ciBhIFBURV9HIG1hcHBpbmcgaXMKKwkJCQkgKiBpbnZhbGlkYXRlZCBieSBwbWFwX3JlbW92ZV9w
ZGUoKS4KKwkJCQkgKi8KKwkJCQlpZiAoIXBkZV90ZXN0KCZwdHBhZGRyLCBQVEVfRykpCisJCQkJ
CWFueXZhbGlkID0gVFJVRTsKKwkJCQlwbWFwX3JlbW92ZV9wZGUocG1hcCwgcGRlLCBzdmEsICZm
cmVlLCAmbG9jayk7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCFwbWFwX2RlbW90ZV9w
ZGVfbG9ja2VkKHBtYXAsIHBkZSwgc3ZhLAorCQkJICAgICZsb2NrKSkgeworCQkJCS8qIFRoZSBz
dXBlcnBhZ2UgbWFwcGluZyB3YXMgZGVzdHJveWVkLiAqLworCQkJCWNvbnRpbnVlOworCQkJfSBl
bHNlIHsKKwkJCQlwdHBhZGRyID0gKnBkZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIExpbWl0
IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2YSByZXByZXNlbnRlZAorCQkgKiBi
eSB0aGUgY3VycmVudCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlCisJCSAq
IHJhbmdlIGJlaW5nIHJlbW92ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkKKwkJCXZh
X25leHQgPSBldmE7CisKKwkJdmEgPSB2YV9uZXh0OworCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3Rv
X3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKKwkJICAgIHN2YSArPSBQQUdF
X1NJWkUpIHsKKwkJCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJCQlpZiAodmEgIT0gdmFf
bmV4dCkgeworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CisJCQkJ
CXZhID0gdmFfbmV4dDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXB0ZV90
ZXN0KHB0ZSwgUFRFX0cpKQorCQkJCWFueXZhbGlkID0gVFJVRTsKKwkJCWlmICh2YSA9PSB2YV9u
ZXh0KQorCQkJCXZhID0gc3ZhOworCQkJaWYgKHBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdGUsIHN2
YSwgcHRwYWRkciwgJmZyZWUsCisJCQkgICAgJmxvY2spKSB7CisJCQkJc3ZhICs9IFBBR0VfU0la
RTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4dCkKKwkJCXBtYXBf
aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkK
KwkJcndfd3VubG9jayhsb2NrKTsKK291dDoKKwlpZiAoYW55dmFsaWQpCisJCXBtYXBfaW52YWxp
ZGF0ZV9hbGwocG1hcCk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQTUFQX1VO
TE9DSyhwbWFwKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKglS
b3V0aW5lOglwbWFwX3JlbW92ZV9hbGwKKyAqCUZ1bmN0aW9uOgorICoJCVJlbW92ZXMgdGhpcyBw
aHlzaWNhbCBwYWdlIGZyb20KKyAqCQlhbGwgcGh5c2ljYWwgbWFwcyBpbiB3aGljaCBpdCByZXNp
ZGVzLgorICoJCVJlZmxlY3RzIGJhY2sgbW9kaWZ5IGJpdHMgdG8gdGhlIHBhZ2VyLgorICoKKyAq
CU5vdGVzOgorICoJCU9yaWdpbmFsIHZlcnNpb25zIG9mIHRoaXMgcm91dGluZSB3ZXJlIHZlcnkK
KyAqCQlpbmVmZmljaWVudCBiZWNhdXNlIHRoZXkgaXRlcmF0aXZlbHkgY2FsbGVkCisgKgkJcG1h
cF9yZW1vdmUgKHNsb3cuLi4pCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX2FsbCh2bV9wYWdlX3Qg
bSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisJcG1hcF90IHBt
YXA7CisJcHRfZW50cnlfdCAqcHRlLCB0cHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZz
ZXRfdCB2YTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYg
VlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9hbGw6IHBhZ2UgJXAgaXMg
bm90IG1hbmFnZWQiLCBtKSk7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfd2xvY2soJnB2aF9n
bG9iYWxfbG9jayk7CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdv
dG8gc21hbGxfbWFwcGluZ3M7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7
CisJd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBOVUxMKSB7CisJ
CXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJUE1BUF9MT0NLKHBtYXApOworCQl2YSA9IHB2LT5wdl92
YTsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQkodm9pZClwbWFwX2RlbW90ZV9wZGUo
cG1hcCwgcGRlLCB2YSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdz
OgorCXdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkpICE9IE5VTEwpIHsK
KwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlQTUFQX0xPQ0socG1hcCk7CisKKwkJLyoKKwkJICog
SWYgaXQncyBsYXN0IG1hcHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbQorCQkgKiB0aGUg
cGFnZSBiZWluZyBkZXN0cm95ZWQKKwkJICovCisJCWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0
KSA9PSBOVUxMKQorCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQ
QUdFX1NJWkUpOworCisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCQlwZGUg
PSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKHBkZSAhPSBOVUxMICYmICpw
ZGUgIT0gMCwgKCJwbWFwX3JlbW92ZV9hbGw6IHBkZSIpKTsKKwkJS0FTU0VSVCghcGRlX2lzX3N1
cGVycGFnZShwZGUpLCAoInBtYXBfcmVtb3ZlX2FsbDogZm91bmQiCisJCSAgICAiIGEgc3VwZXJw
YWdlIGluIHBhZ2UgJXAgJ3MgcHYgbGlzdCIsIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRl
KHBkZSwgcHYtPnB2X3ZhKTsKKworCQl0cHRlID0gKnB0ZTsKKwkJcHRlX3N0b3JlKHB0ZSwgaXNf
a2VybmVsX3BtYXAocG1hcCkgPyBQVEVfRyA6IDApOworCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwg
UFRFX1cpKQorCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKworCQkvKgorCQkgKiBV
cGRhdGUgdGhlIHZtX3BhZ2VfdCBkaXJ0eSBhbmQgcmVmZXJlbmNlIGJpdHMuCisJCSAqLworCQlp
ZiAocHRlX2lzX3JlZigmdHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJF
TkNFRCk7CisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJUKCFwdGVf
dGVzdCgmdHB0ZSwgUFRFX1JPKSwKKwkJCSAgICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0
YWJsZTogdmE6ICVwLCBwdGU6ICUjangiCisJCQkgICAgLCBfX2Z1bmNfXywgKHZvaWQgKilwdi0+
cHZfdmEsICh1aW50bWF4X3QpdHB0ZSkpOworCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJfQorCQlw
bWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSwgJmZyZWUpOworCQlwbWFwX2ludmFs
aWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZf
bGlzdCwgcHYsIHB2X25leHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJZnJlZV9wdl9lbnRyeShw
bWFwLCBwdik7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KKworCXZtX3BhZ2VfYWZsYWdfY2xl
YXIobSwgUEdBX1dSSVRFQUJMRSk7CisJcndfd3VubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlw
bWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKiBwbWFwX3Byb3RlY3RfcGRl
OiBkbyB0aGUgdGhpbmdzIHRvIHByb3RlY3QgYSBzdXBlcnBhZ2UgaW4gYSBwcm9jZXNzCisgKi8K
K3N0YXRpYyBib29sZWFuX3QKK3BtYXBfcHJvdGVjdF9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5
X3QgKnBkZSwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlwZF9lbnRyeV90
IG5ld3BkZSwgb2xkcGRlOworCXZtX29mZnNldF90IGV2YSwgdmE7CisJdm1fcGFnZV90IG07CisJ
Ym9vbGVhbl90IGFueWNoYW5nZWQ7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVE
KTsKKwlLQVNTRVJUKChzdmEgJiBQRFJNQVNLKSA9PSAwLAorCSAgICAoIiVzOiBzdmEgaXMgbm90
IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlhbnljaGFuZ2VkID0gRkFMU0U7CityZXRy
eToKKwlvbGRwZGUgPSBuZXdwZGUgPSAqcGRlOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVf
TUFOQUdFRCkpIHsKKwkJZXZhID0gc3ZhICsgTkJQRFI7CisJCWZvciAodmEgPSBzdmEsIG0gPSBQ
SFlTX1RPX1ZNX1BBR0UoVExCTE9fUERFX1RPX1BBKG9sZHBkZSkpOworCQkgICAgdmEgPCBldmE7
IHZhICs9IFBBR0VfU0laRSwgbSsrKQorCQkJaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAm
JgorCQkJICAgICFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfUk8pKQorCQkJCXZtX3BhZ2VfZGlydHko
bSk7CisJfQorCWlmICgocHJvdCAmIFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJcGRlX3NldCgm
bmV3cGRlLCBQVEVfUk8pOworCQlwZGVfY2xlYXIoJm5ld3BkZSwgUFRFX0QpOworCX0KKwlpZiAo
bmV3cGRlICE9IG9sZHBkZSkgeworCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZygocHRfZW50cnlf
dCAqKXBkZSwgKHB0X2VudHJ5X3Qpb2xkcGRlLAorCQkgICAgKHB0X2VudHJ5X3QpbmV3cGRlKSkK
KwkJCWdvdG8gcmV0cnk7CisJCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCQlwbWFw
X2ludmFsaWRhdGVfcGFnZShwbWFwLCBzdmEpOworCQllbHNlCisJCQlhbnljaGFuZ2VkID0gVFJV
RTsKKwl9CisJcmV0dXJuIChhbnljaGFuZ2VkKTsKK30KKworLyotCisgKglTZXQgdGhlIHBoeXNp
Y2FsIHByb3RlY3Rpb24gb24gdGhlCisgKglzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhpcyBtYXAgYXMg
cmVxdWVzdGVkLgorICovCit2b2lkCitwbWFwX3Byb3RlY3QocG1hcF90IHBtYXAsIHZtX29mZnNl
dF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwl2bV9vZmZzZXRf
dCB2YSwgdmFfbmV4dDsKKwlwZF9lbnRyeV90ICpwZGUsICpwZHBlOworCXB0X2VudHJ5X3QgKnB0
ZTsKKwlib29sZWFuX3QgYW55Y2hhbmdlZCwgcHZfbGlzdHNfbG9ja2VkOworCisJaWYgKChwcm90
ICYgVk1fUFJPVF9SRUFEKSA9PSBWTV9QUk9UX05PTkUpIHsKKwkJcG1hcF9yZW1vdmUocG1hcCwg
c3ZhLCBldmEpOworCQlyZXR1cm47CisJfQorCWlmIChwcm90ICYgVk1fUFJPVF9XUklURSkKKwkJ
cmV0dXJuOworCisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdl
ZCA9IEZBTFNFOworCisJUE1BUF9MT0NLKHBtYXApOworCWZvciAoOyBzdmEgPCBldmE7IHN2YSA9
IHZhX25leHQpIHsKKwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRw
ZSA9PSAwKSB7CisJCQl2YV9uZXh0ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYg
KHZhX25leHQgPCBzdmEpCisJCQkJdmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJ
CXZhX25leHQgPSAoc3ZhICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3Zh
KQorCQkJdmFfbmV4dCA9IGV2YTsKKworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2
YSk7CisKKwkJLyoKKwkJICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICovCisJCWlm
ICgqcGRlID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBDaGVjayBmb3Igc3Vw
ZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJLyoK
KwkJCSAqIEFyZSB3ZSBwcm90ZWN0aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJ
CQkgKiBkZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYg
KHN2YSArIE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQkvKgorCQkJ
CSAqIFRoZSBUTEIgZW50cnkgZm9yIGEgUEdfRyBtYXBwaW5nIGlzCisJCQkJICogaW52YWxpZGF0
ZWQgYnkgcG1hcF9wcm90ZWN0X3BkZSgpLgorCQkJCSAqLworCQkJCWlmIChwbWFwX3Byb3RlY3Rf
cGRlKHBtYXAsIHBkZSwgc3ZhLCBwcm90KSkKKwkJCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJCQkJ
Y29udGludWU7CisJCQl9IGVsc2UgeworCQkJCWlmICghcHZfbGlzdHNfbG9ja2VkKSB7CisJCQkJ
CXB2X2xpc3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJCWlmICghcndfdHJ5X3Jsb2NrKCZwdmhfZ2xv
YmFsX2xvY2spKSB7CisJCQkJCQlpZiAoYW55Y2hhbmdlZCkKKwkJCQkJCQlwbWFwX2ludmFsaWRh
dGVfYWxsKAorCQkJCQkJCSAgICBwbWFwKTsKKwkJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ
CQkJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCQlnb3RvIHJlc3VtZTsKKwkJCQkJ
fQorCQkJCX0KKwkJCQlpZiAoIXBtYXBfZGVtb3RlX3BkZShwbWFwLCBwZGUsIHN2YSkpIHsKKwkJ
CQkJLyoKKwkJCQkJICogVGhlIHN1cGVycGFnZSBtYXBwaW5nIHdhcyBkZXN0cm95ZWQuCisJCQkJ
CSAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyoKKwkJICogTGltaXQg
b3VyIHNjYW4gdG8gZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHZhIHJlcHJlc2VudGVkCisJCSAqIGJ5
IHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgcGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUKKwkJICog
cmFuZ2UgYmVpbmcgd3JpdGUgcHJvdGVjdGVkLgorCQkgKi8KKwkJaWYgKHZhX25leHQgPiBldmEp
CisJCQl2YV9uZXh0ID0gZXZhOworCisJCXZhID0gdmFfbmV4dDsKKwkJZm9yIChwdGUgPSBwbWFw
X3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEg
Kz0gUEFHRV9TSVpFKSB7CisJCQlwdF9lbnRyeV90IHBiaXRzOworCQkJdm1fcGFnZV90IG07CisJ
CQl2bV9wYWRkcl90IHBhOworCisJCQlwYml0cyA9ICpwdGU7CisJCQlpZiAoIXB0ZV9pc192YWxp
ZCgmcGJpdHMpIHx8IHB0ZV90ZXN0KCZwYml0cywgUFRFX1JPKSkgeworCQkJCWlmICh2YSAhPSB2
YV9uZXh0KSB7CisJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJ
CQkJdmEgPSB2YV9uZXh0OworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXB0ZV9zZXQo
JnBiaXRzLCBQVEVfUk8pOworCQkJaWYgKHB0ZV90ZXN0KCZwYml0cywgUFRFX0QpKSB7CisJCQkJ
cHRlX2NsZWFyKCZwYml0cywgUFRFX0QpOworCQkJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9N
QU5BR0VEKSkgeworCQkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwYml0cyk7CisJCQkJCW0gPSBQ
SFlTX1RPX1ZNX1BBR0UocGEpOworCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCX0KKwkJCQlp
ZiAodmEgPT0gdmFfbmV4dCkKKwkJCQkJdmEgPSBzdmE7CisJCQl9IGVsc2UgeworCQkJCS8qCisJ
CQkJICogVW5sZXNzIFBURV9EIGlzIHNldCwgYW55IFRMQiBlbnRyaWVzCisJCQkJICogbWFwcGlu
ZyAic3ZhIiBkb24ndCBhbGxvdyB3cml0ZSBhY2Nlc3MsIHNvCisJCQkJICogdGhleSBuZWVkbid0
IGJlIGludmFsaWRhdGVkLgorCQkJCSAqLworCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CisJCQkJ
CXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJCQkJdmEgPSB2YV9uZXh0
OworCQkJCX0KKwkJCX0KKwkJCSpwdGUgPSBwYml0czsKKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4
dCkKKwkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGFu
eWNoYW5nZWQpCisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJaWYgKHB2X2xpc3RzX2xv
Y2tlZCkgeworCQlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCX0KKwlQTUFQX1VOTE9D
SyhwbWFwKTsKK30KKworLyotCisgKiBUcmllcyB0byBwcm9tb3RlIHRoZSA1MTIsIGNvbnRpZ3Vv
dXMgNEtCIHBhZ2UgbWFwcGluZ3MgdGhhdCBhcmUgd2l0aGluIGEKKyAqIHNpbmdsZSBwYWdlIHRh
YmxlIHBhZ2UgdG8gYSBzaW5nbGUgMk1CIHBhZ2UgbWFwcGluZy4gIEZvciBwcm9tb3Rpb24gdG8K
KyAqIG9jY3VyLCB0d28gY29uZGl0aW9ucyBtdXN0IGJlIG1ldDogKDEpIHRoZSA0S0IgcGFnZSBt
YXBwaW5ncyBtdXN0IG1hcAorICogYWxpZ25lZCwgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkg
YW5kICgyKSB0aGUgNEtCIHBhZ2UgbWFwcGluZ3MgbXVzdCBoYXZlCisgKiBpZGVudGljYWwgY2hh
cmFjdGVyaXN0aWNzLgorICoKKyAqIE9uIE1JUFM2NCBwcm9tb3Rpb25zIGFyZSBhY3R1YWxseSBk
b25lIGluIHBhaXJzIG9mIHR3byAxTUIgc3VwZXJwYWdlcworICogYmVjYXVzZSBvZiB0aGUgaGFy
ZHdhcmUgYXJjaGl0ZWN0dXJlICh0d28gcGh5c2ljYWwgcGFnZXMgYXJlIGluIGEgc2luZ2xlCisg
KiBUTEIgZW50cnkpIGV2ZW4gdGhvdWdoIFZNIGxheWVyIGlzIHVuZGVyIHRoZSBpbXByZXNzaW9u
IHRoYXQgdGhlIHN1cGVycGFnZQorICogc2l6ZSBpcyBhY3R1YWxseSAyTUIuCisgKi8KK3N0YXRp
YyB2b2lkCitwbWFwX3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZt
X29mZnNldF90IHZhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdF9lbnRyeV90
IG5ld3BkZTsKKwlwdF9lbnRyeV90ICpmaXJzdHB0ZSwgb2xkcHRlLCBwYSwgKnB0ZTsKKwl2bV9v
ZmZzZXRfdCBvbGRwdGV2YTsKKwl2bV9wYWdlX3QgbXB0ZTsKKworCVBNQVBfTE9DS19BU1NFUlQo
cG1hcCwgTUFfT1dORUQpOworCS8qCisJICogRXhhbWluZSB0aGUgZmlyc3QgUFRFIGluIHRoZSBz
cGVjaWZpZWQgUFRQLiAgQWJvcnQgaWYgdGhpcyBQVEUgaXMKKwkgKiBlaXRoZXIgaW52YWxpZCwg
dW51c2VkLCBvciBkb2VzIG5vdCBtYXAgdGhlIGZpcnN0IDRLQiBwaHlzaWNhbCBwYWdlCisJICog
d2l0aGluIGEgMk1CIHBhZ2UuCisJICovCisJZmlyc3RwdGUgPSBwbWFwX3B0ZShwbWFwLCB0cnVu
Y18ybXBhZ2UodmEpKTsKK3NldHBkZToKKwluZXdwZGUgPSAqZmlyc3RwdGU7CisJaWYgKGlzX2tl
cm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIFhYWCBub3QgZG9pbmcga2VybmVsIHBtYXAgeWV0ICov
CisJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RS
X1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVu
Y19fLCB2YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFwdGVfaXNfdmFsaWQoJm5ld3Bk
ZSkgfHwgIXB0ZV9pc19yZWYoJm5ld3BkZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3Bk
ZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAl
I2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0dXJuOwor
CX0KKwlpZiAoIXB0ZV90ZXN0KCZuZXdwZGUsIFBURV9EKSAmJiAhcHRlX3Rlc3QoJm5ld3BkZSwg
UFRFX1JPKSkgeworCQkvKgorCQkgKiBXaGVuIFBURV9EIGlzIGFscmVhZHkgY2xlYXIsIFBURV9S
TyBjYW4gYmUgc2V0IHdpdGhvdXQKKwkJICogYSBUTEIgaW52YWxpZGF0aW9uLgorCQkgKi8KKwkJ
aWYgKCFhdG9taWNfY21wc2V0X2xvbmcoKHVfbG9uZyAqKWZpcnN0cHRlLCBuZXdwZGUsIG5ld3Bk
ZSB8CisJCSAgICBQVEVfUk8pKQorCQkJZ290byBzZXRwZGU7CisJCW5ld3BkZSB8PSBQVEVfUk87
CisJfQorCisJLyoKKwkgKiBFeGFtaW5lIGVhY2ggb2YgdGhlIG90aGVyIFBURXMgaW4gdGhlIHNw
ZWNpZmllZCBQVFAuICBBYm9ydCBpZiB0aGlzCisJICogUFRFIG1hcHMgYW4gdW5leHBlY3RlZCA0
S0IgcGh5c2ljYWwgcGFnZSBvciBkb2VzIG5vdCBoYXZlIGlkZW50aWNhbAorCSAqIGNoYXJhY3Rl
cmlzdGljcyB0byB0aGUgZmlyc3QgUFRFLgorCSAqLworCXBhID0gVExCTE9fUFRFX1RPX1BBKG5l
d3BkZSkgKyBOQlBEUiAtIFBBR0VfU0laRTsKKwlmb3IgKHB0ZSA9IGZpcnN0cHRlICsgTlBURVBH
IC0gMTsgcHRlID4gZmlyc3RwdGU7IHB0ZS0tKSB7CitzZXRwdGU6CisJCW9sZHB0ZSA9ICpwdGU7
CisJCWlmIChUTEJMT19QVEVfVE9fUEEob2xkcHRlKSAhPSBwYSkgeworCQkJYXRvbWljX2FkZF9s
b25nKCZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJCUNUUjMoS1RSX1BNQVAsICIlczogZmFp
bHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXAp
OworCQkJcmV0dXJuOworCQl9CisJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpICYmICFw
dGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pKSB7CisJCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZyhw
dGUsIG9sZHB0ZSwgb2xkcHRlIHwgUFRFX1JPKSkKKwkJCQlnb3RvIHNldHB0ZTsKKwkJCW9sZHB0
ZSB8PSBQVEVfUk87CisJCQlvbGRwdGV2YSA9ICh2YSAmIH5QRFJNQVNLKSB8CisJCQkgICAgKFRM
QkxPX1BURV9UT19QQShvbGRwdGUpICYgUERSTUFTSyk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6
IHByb3RlY3QgZm9yIHZhICUjbHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIG9sZHB0
ZXZhLCBwbWFwKTsKKwkJfQorCQlpZiAoKG9sZHB0ZSAmIFBHX1BST01PVEVfTUFTSykgIT0gKG5l
d3BkZSAmIFBHX1BST01PVEVfTUFTSykpIHsKKwkJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVf
cF9mYWlsdXJlcywgMSk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUj
bHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCXJldHVybjsK
KwkJfQorCQlwYSAtPSBQQUdFX1NJWkU7CisJfQorCisJLyoKKwkgKiBTYXZlIHRoZSBwYWdlIHRh
YmxlIHBhZ2UgaW4gaXRzIGN1cnJlbnQgc3RhdGUgdW50aWwgdGhlIFBERQorCSAqIG1hcHBpbmcg
dGhlIHN1cGVycGFnZSBpcyBkZW1vdGVkIGJ5IHBtYXBfZGVtb3RlX3BkZSgpIG9yCisJICogZGVz
dHJveWVkIGJ5IHBtYXBfcmVtb3ZlX3BkZSgpLgorCSAqLworCW1wdGUgPSBQSFlTX1RPX1ZNX1BB
R0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7CisJS0FTU0VSVChtcHRlID49IHZtX3BhZ2Vf
YXJyYXkgJiYKKwkgICAgbXB0ZSA8ICZ2bV9wYWdlX2FycmF5W3ZtX3BhZ2VfYXJyYXlfc2l6ZV0s
CisJICAgICgiJXM6IHBhZ2UgdGFibGUgcGFnZSBpcyBvdXQgb2YgcmFuZ2UiLCBfX2Z1bmNfXykp
OworCUtBU1NFUlQobXB0ZS0+cGluZGV4ID09IHBtYXBfcGRlX3BpbmRleCh2YSksCisJICAgICgi
JXM6IHBhZ2UgdGFibGUgcGFnZSdzIHBpbmRleCBpcyB3cm9uZyIsIF9fZnVuY19fKSk7CisJaWYg
KHBtYXBfaW5zZXJ0X3B0X3BhZ2UocG1hcCwgbXB0ZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZw
bWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZv
ciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0
dXJuOworCX0KKworCS8qCisJICogUHJvbW90ZSB0aGUgcHYgZW50cmllcy4KKwkgKi8KKwlpZiAo
cHRlX3Rlc3QoJm5ld3BkZSwgUFRFX01BTkFHRUQpKQorCQlwbWFwX3B2X3Byb21vdGVfcGRlKHBt
YXAsIHZhLCBUTEJMT19QVEVfVE9fUEEobmV3cGRlKSwgbG9ja3ApOworCisJLyoKKwkgKiBNYXAg
dGhlIHN1cGVycGFnZS4KKwkgKi8KKwlwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEsIHBkZSwgbmV3
cGRlIHwgUFRFX1BTXzFNKTsKKworCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcHJvbW90aW9u
cywgMSk7CisJQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAg
JXAiLCBfX2Z1bmNfXywgdmEsCisJICAgIHBtYXApOworfQorCisvKgorICoJSW5zZXJ0IHRoZSBn
aXZlbiBwaHlzaWNhbCBwYWdlIChwKSBhdAorICoJdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJl
c3MgKHYpIGluIHRoZQorICoJdGFyZ2V0IHBoeXNpY2FsIG1hcCB3aXRoIHRoZSBwcm90ZWN0aW9u
IHJlcXVlc3RlZC4KKyAqCisgKglJZiBzcGVjaWZpZWQsIHRoZSBwYWdlIHdpbGwgYmUgd2lyZWQg
ZG93biwgbWVhbmluZworICoJdGhhdCB0aGUgcmVsYXRlZCBwdGUgY2FuIG5vdCBiZSByZWNsYWlt
ZWQuCisgKgorICoJTkI6ICBUaGlzIGlzIHRoZSBvbmx5IHJvdXRpbmUgd2hpY2ggTUFZIE5PVCBs
YXp5LWV2YWx1YXRlCisgKglvciBsb3NlIGluZm9ybWF0aW9uLiAgVGhhdCBpcywgdGhpcyByb3V0
aW5lIG11c3QgYWN0dWFsbHkKKyAqCWluc2VydCB0aGlzIHBhZ2UgaW50byB0aGUgZ2l2ZW4gbWFw
IE5PVy4KKyAqLworaW50CitwbWFwX2VudGVyKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg
dm1fcGFnZV90IG0sIHZtX3Byb3RfdCBwcm90LAorICAgIHVfaW50IGZsYWdzLCBpbnQ4X3QgcHNp
bmQgX191bnVzZWQpCit7CisgICAgICAgIHN0cnVjdCByd2xvY2sgKmxvY2s7CisgICAgICAgIHZt
X3BhZGRyX3QgcGEsIG9wYTsKKyAgICAgICAgcGRfZW50cnlfdCAqcGRlOworICAgICAgICBwdF9l
bnRyeV90ICpwdGU7CisgICAgICAgIHB0X2VudHJ5X3Qgb3JpZ3B0ZSwgbmV3cHRlOworICAgICAg
ICBwdl9lbnRyeV90IHB2OworICAgICAgICB2bV9wYWdlX3QgbXB0ZSwgb207CisgICAgICAgIGJv
b2xlYW5fdCBub3NsZWVwOworCisgICAgICAgIHZhID0gdHJ1bmNfcGFnZSh2YSk7CisgICAgICAg
IEtBU1NFUlQodmEgPD0gVk1fTUFYX0tFUk5FTF9BRERSRVNTLCAoInBtYXBfZW50ZXI6IHRvb2Jp
ZyIpKTsKKyAgICAgICAgS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCB8
fCB2YSA8IGttaS5jbGVhbl9zdmEgfHwKKyAgICAgICAgICAgIHZhID49IGttaS5jbGVhbl9ldmEs
CisgICAgICAgICAgICAoInBtYXBfZW50ZXI6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhlIGNs
ZWFuIHN1Ym1hcCIpKTsKKyAgICAgICAgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9
PSAwICYmICF2bV9wYWdlX3hidXNpZWQobSkpCisgICAgICAgICAgICAgICAgVk1fT0JKRUNUX0FT
U0VSVF9MT0NLRUQobS0+b2JqZWN0KTsKKworICAgICAgICBtcHRlID0gTlVMTDsKKworICAgICAg
ICBsb2NrID0gTlVMTDsKKyAgICAgICAgcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAg
ICAgIFBNQVBfTE9DSyhwbWFwKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbiB0aGUgY2Fz
ZSB0aGF0IGEgcGFnZSB0YWJsZSBwYWdlIGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisgICAgICAg
ICAqIGNyZWF0aW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCWlmICh2YSA8IFZNX01BWFVTRVJf
QUREUkVTUykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSGVyZSBp
ZiB0aGUgcHRlIHBhZ2UgaXNuJ3QgbWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorICAgICAgICAg
ICAgICAgICAqIGRlYWxsb2NhdGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAg
ICAgIG5vc2xlZXAgPSAoZmxhZ3MgJiBQTUFQX0VOVEVSX05PU0xFRVApICE9IDA7CisgICAgICAg
ICAgICAgICAgbXB0ZSA9IHBtYXBfYWxsb2NwdGUocG1hcCwgdmEsIG5vc2xlZXAgPyBOVUxMIDog
JmxvY2spOworICAgICAgICAgICAgICAgIGlmIChtcHRlID09IE5VTEwpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIEtBU1NFUlQobm9zbGVlcCAhPSAwLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICgicG1hcF9hbGxvY3B0ZSBmYWlsZWQgd2l0aCBzbGVlcCBhbGxvd2VkIikpOworICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2sgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcndfd3VubG9jayhsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IHJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBQ
TUFQX1VOTE9DSyhwbWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoS0VSTl9S
RVNPVVJDRV9TSE9SVEFHRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJcGRlID0g
cG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJ
cGFuaWMoIiVzOiBhdHRlbXB0ZWQgcG1hcF9lbnRlciBvbiBzdXBlcnBhZ2UiLCBfX2Z1bmNfXyk7
CisJfQorCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworICAgICAgICAvKgorICAg
ICAgICAgKiAgUGFnZSBEaXJlY3RvcnkgdGFibGUgZW50cnkgbm90IHZhbGlkLCB3ZSBuZWVkIGEg
bmV3IFBUIHBhZ2UKKyAgICAgICAgICovCisgICAgICAgIGlmIChwdGUgPT0gTlVMTCkgeworICAg
ICAgICAgICAgICAgIHBhbmljKCJwbWFwX2VudGVyOiBpbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LCBw
ZGlyPSVwLCB2YT0lcCIsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopcG1hcC0+cG1fc2Vn
dGFiLCAodm9pZCAqKXZhKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhID0gVk1fUEFHRV9UT19Q
SFlTKG0pOworICAgICAgICBvbSA9IE5VTEw7CisgICAgICAgIG9yaWdwdGUgPSAqcHRlOworCW9w
YSA9IFRMQkxPX1BURV9UT19QQShvcmlncHRlKTsKKworICAgICAgICBuZXdwdGUgPSBUTEJMT19Q
QV9UT19QRk4ocGEpIHwgaW5pdF9wdGVfcHJvdChtLCBmbGFncywgcHJvdCk7CisgICAgICAgIC8q
CisgICAgICAgICAqIHBtYXBfZW50ZXIoKSBpcyBjYWxsZWQgZHVyaW5nIGEgZmF1bHQgb3Igc2lt
dWxhdGVkIGZhdWx0IHNvCisgICAgICAgICAqIHNldCB0aGUgcmVmZXJlbmNlIGJpdCBub3cgdG8g
YXZvaWQgYSBmYXVsdC4KKyAgICAgICAgICovCisgICAgICAgIHB0ZV9yZWZfc2V0KCZuZXdwdGUp
OworICAgICAgICBpZiAoKGZsYWdzICYgUE1BUF9FTlRFUl9XSVJFRCkgIT0gMCkKKyAgICAgICAg
ICAgICAgICBuZXdwdGUgfD0gUFRFX1c7CisgICAgICAgIGlmIChpc19rZXJuZWxfcG1hcChwbWFw
KSkKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRFX0c7CisgICAgICAgIGlmIChpc19jYWNo
ZWFibGVfbWVtKHBhKSkgeworICAgICAgICAgICAgICAgIGlmIChtLT5tZC5wdl9tZW1hdHRyID09
IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdwdGUg
fD0gUFRFX0NfVU5DQUNIRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3cHRlIHw9IFBURV9DX0NBQ0hFOworICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgICAgICBuZXdwdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisjaWZkZWYgQ1BVX0NIRVJJCisgICAg
ICAgIGlmICgoZmxhZ3MgJiBQTUFQX0VOVEVSX05PTE9BRFRBR1MpICE9IDApCisgICAgICAgICAg
ICAgICAgbmV3cHRlIHw9IFBURV9MQzsKKyAgICAgICAgaWYgKChmbGFncyAmIFBNQVBfRU5URVJf
Tk9TVE9SRVRBR1MpICE9IDApCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9TQzsKKyNl
bmRpZgorCisJLyoKKwkgKiBTZXQgbW9kaWZpZWQgYml0IGdyYXR1aXRvdXNseSBmb3Igd3JpdGVh
YmxlIG1hcHBpbmdzIGlmCisJICogdGhlIHBhZ2UgaXMgdW5tYW5hZ2VkLiBXZSBkbyBub3Qgd2Fu
dCB0byB0YWtlIGEgZmF1bHQKKwkgKiB0byBkbyB0aGUgZGlydHkgYml0IGVtdWxhdGlvbiBmb3Ig
dGhlc2UgbWFwcGluZ3MuCisJICovCisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAh
PSAwKSB7CisJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJCW5ld3B0ZSB8PSBQ
VEVfRDsKKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFwcGluZyBoYXMgbm90IGNoYW5n
ZWQsIG11c3QgYmUgcHJvdGVjdGlvbiBvciB3aXJpbmcgY2hhbmdlLgorICAgICAgICAgKi8KKyAg
ICAgICAgaWYgKHB0ZV9pc192YWxpZCgmb3JpZ3B0ZSkgJiYgb3BhID09IHBhKSB7CisgICAgICAg
ICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0
ZSBzdGF0cy4gV2UgZG9uJ3Qgd29ycnkgYWJvdXQKKyAgICAgICAgICAgICAgICAgKiB3aXJpbmcg
UFQgcGFnZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9uZyBhcyB0aGVyZQorICAgICAg
ICAgICAgICAgICAqIGFyZSB2YWxpZCBtYXBwaW5ncyBpbiB0aGVtLiBIZW5jZSwgaWYgYSB1c2Vy
IHBhZ2UgaXMKKyAgICAgICAgICAgICAgICAgKiB3aXJlZCwgdGhlIFBUIHBhZ2Ugd2lsbCBiZSBh
bHNvLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgm
bmV3cHRlLCBQVEVfVykgJiYgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVykpCisgICAgICAgICAg
ICAgICAgICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworICAgICAgICAgICAg
ICAgIGVsc2UgaWYgKCFwdGVfdGVzdCgmbmV3cHRlLCBQVEVfVykgJiYgcHRlX3Rlc3QoJm9yaWdw
dGUsCisgICAgICAgICAgICAgICAgICAgIFBURV9XKSkKKyAgICAgICAgICAgICAgICAgICAgICAg
IHBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyAgICAgICAgICAgICAgICBLQVNTRVJU
KCFwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX0QgfCBQVEVfUk8pLAorICAgICAgICAgICAgICAgICAg
ICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6ICVwLCBwdGU6ICUjangiLAor
ICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClvcmln
cHRlKSk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFJlbW92ZSB0
aGUgZXh0cmEgUFQgcGFnZSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAg
ICAgICAgICBpZiAobXB0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtcHRl
LT53aXJlX2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBLQVNTRVJUKG1wdGUtPndp
cmVfY291bnQgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicG1hcF9lbnRlcjog
bWlzc2luZyByZWZlcmVuY2UgdG8gcGFnZSB0YWJsZSBwYWdlLCIKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIiB2YTogMHglbHgiLCB2YSkpOworICAgICAgICAgICAgICAgIH0KKwkJaWYg
KHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJCW9tID0gbTsKKwkJCW5ld3B0
ZSB8PSBQVEVfTUFOQUdFRDsKKwkJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJ
CQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKKwkJfQorCQlnb3RvIHZhbGlk
YXRlOworCX0KKworCXB2ID0gTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYXBwaW5n
IGhhcyBjaGFuZ2VkLCBpbnZhbGlkYXRlIG9sZCByYW5nZSBhbmQgZmFsbCB0aHJvdWdoIHRvCisg
ICAgICAgICAqIGhhbmRsZSB2YWxpZGF0aW5nIG5ldyBtYXBwaW5nLgorICAgICAgICAgKi8KKyAg
ICAgICAgaWYgKG9wYSkgeworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwg
UFRFX1cpKQorICAgICAgICAgICAgICAgICAgICAgICAgcG1hcC0+cG1fc3RhdHMud2lyZWRfY291
bnQtLTsKKworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFH
RUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbSA9IFBIWVNfVE9fVk1fUEFHRShvcGEp
OworICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19WTV9QQUdF
KCZsb2NrLCBvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdiA9IHBtYXBfcHZoX3JlbW92
ZSgmb20tPm1kLCBwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IGlmIChtcHRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wdGUtPndpcmVf
Y291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBU1NFUlQobXB0ZS0+d2lyZV9jb3Vu
dCA+IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJwbWFwX2VudGVyOiBtaXNzaW5n
IHJlZmVyZW5jZSB0byBwYWdlIHRhYmxlIHBhZ2UsIgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICIgdmE6ICVwIiwgKHZvaWQgKil2YSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
fSBlbHNlCisgICAgICAgICAgICAgICAgcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgMSk7
CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRW50ZXIgb24gdGhlIFBWIGxpc3QgaWYgcGFydCBv
ZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG0tPm9mbGFn
cyAmIFZQT19VTk1BTkFHRUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRF
X01BTkFHRUQ7CisJCS8qIEluc2VydCBFbnRyeSAqLworCQlpZiAocHYgPT0gTlVMTCkKKwkJCXB2
ID0gZ2V0X3B2X2VudHJ5KHBtYXAsICZsb2NrKTsKKyAgICAgICAgICAgICAgICBwdi0+cHZfdmEg
PSB2YTsKKyAgICAgICAgICAgICAgICBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1BIWVMoJmxvY2ss
IHBhKTsKKyAgICAgICAgICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwg
cHYsIHB2X25leHQpOworICAgICAgICAgICAgICAgIG0tPm1kLnB2X2dlbisrOworICAgICAgICAg
ICAgICAgIGlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9XUklURUFCTEUpOworICAgICAgICB9IGVs
c2UgaWYgKHB2ICE9IE5VTEwpCisJCWZyZWVfcHZfZW50cnkocG1hcCwgcHYpOworCisKKyAgICAg
ICAgLyoKKyAgICAgICAgICogSW5jcmVtZW50IGNvdW50ZXJzCisgICAgICAgICAqLworICAgICAg
ICBpZiAocHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1cpKQorICAgICAgICAgICAgICAgIHBtYXAtPnBt
X3N0YXRzLndpcmVkX2NvdW50Kys7CisKK3ZhbGlkYXRlOgorI2lmZGVmIFBNQVBfREVCVUcKKyAg
ICAgICAgcHJpbnRmKCJwbWFwX2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2
YSwgKHZvaWQgKilwYSk7CisjZW5kaWYKKyAgICAgICAgLyoKKyAgICAgICAgICogaWYgdGhlIG1h
cHBpbmcgb3IgcGVybWlzc2lvbiBiaXRzIGFyZSBkaWZmZXJlbnQsIHdlIG5lZWQgdG8KKyAgICAg
ICAgICogdXBkYXRlIHRoZSBwdGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG9yaWdwdGUg
JiB+IChQVEVfRHxQVEVfUkVGKSkgIT0gbmV3cHRlKSB7CisgICAgICAgICAgICAgICAgbmV3cHRl
IHw9IFBURV9WUjsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgVk1fUFJPVF9XUklURSkg
IT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfRDsKKyAgICAgICAg
ICAgICAgICBpZiAocHRlX2lzX3ZhbGlkKCZvcmlncHRlKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgYm9vbGVhbl90IGludmx2YSA9IEZBTFNFOworCisJCQlvcmlncHRlID0gcHRlX2xvYWRf
c3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0ZV9pc19y
ZWYoJm9yaWdwdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVf
dGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG9tLCBQR0FfUkVGRVJFTkNFRCk7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGEgIT0gcGEpCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52bHZhID0gVFJVRTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0
ZSwgUFRFX0QpICYmCisJCQkgICAgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfUk8pKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01B
TkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtX3BhZ2Vf
ZGlydHkob20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByb3QgJiBW
TV9QUk9UX1dSSVRFKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGludmx2YSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSAmJgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFRBSUxRX0VNUFRZKCZvbS0+bWQucHZfbGlzdCkgJiYK
KwkJCSAgICAoKG9tLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwKKwkJCSAgICBUQUlM
UV9FTVBUWSgmcGFfdG9fcHZoKG9wYSktPnB2X2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihvbSwgUEdBX1dSSVRFQUJMRSk7CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoaW52bHZhKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAg
fSBlbHNlCisJCQlwdGVfc3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICB9CisKKyAgICAgICAg
LyoKKyAgICAgICAgICogIElmIGJvdGggdGhlIHBhZ2UgdGFibGUgcGFnZSBhbmQgdGhlIHJlc2Vy
dmF0aW9uIGFyZSBmdWxseQorICAgICAgICAgKiAgcG9wdWxhdGVkLCB0aGVuIGF0dGVtcHQgcHJv
bW90aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChtcHRlID09IE5VTEwgfHwgbXB0ZS0+
d2lyZV9jb3VudCA9PSBOUFRFUEcpICYmCisgICAgICAgICAgICAobS0+ZmxhZ3MgJiBQR19GSUNU
SVRJT1VTKSA9PSAwICYmCisgICAgICAgICAgICBwZ19zcF9lbmFibGVkICYmIHZtX3Jlc2Vydl9s
ZXZlbF9pZmZ1bGxwb3AobSkgPT0gMCkKKyAgICAgICAgICAgICAgICBwbWFwX3Byb21vdGVfcGRl
KHBtYXAsIHBkZSwgdmEsICZsb2NrKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTeW5jIEkg
JiBEIGNhY2hlcyBmb3IgZXhlY3V0YWJsZSBwYWdlcy4gIERvIHRoaXMgb25seSBpZiB0aGUKKyAg
ICAgICAgICogdGFyZ2V0IHBtYXAgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3Ro
ZXJ3aXNlLCBhbgorICAgICAgICAgKiB1bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgor
ICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFpc19rZXJuZWxfcG1hcChwbWFwKSAmJiAocG1hcCA9
PSAmY3VycHJvYy0+cF92bXNwYWNlLT52bV9wbWFwKSAmJgorICAgICAgICAgICAgKHByb3QgJiBW
TV9QUk9UX0VYRUNVVEUpKSB7CisgICAgICAgICAgICAgICAgbWlwc19pY2FjaGVfc3luY19yYW5n
ZSh2YSwgUEFHRV9TSVpFKTsKKyAgICAgICAgICAgICAgICBtaXBzX2RjYWNoZV93Ymludl9yYW5n
ZSh2YSwgUEFHRV9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jayAhPSBOVUxMKQor
ICAgICAgICAgICAgICAgIHJ3X3d1bmxvY2sobG9jayk7CisgICAgICAgIHJ3X3J1bmxvY2soJnB2
aF9nbG9iYWxfbG9jayk7CisgICAgICAgIFBNQVBfVU5MT0NLKHBtYXApOworICAgICAgICByZXR1
cm4gKEtFUk5fU1VDQ0VTUyk7Cit9CisKKy8qCisgKiB0aGlzIGNvZGUgbWFrZXMgc29tZSAqTUFK
T1IqIGFzc3VtcHRpb25zOgorICogMS4gQ3VycmVudCBwbWFwICYgcG1hcCBleGlzdHMuCisgKiAy
LiBOb3Qgd2lyZWQuCisgKiAzLiBSZWFkIGFjY2Vzcy4KKyAqIDQuIE5vIHBhZ2UgdGFibGUgcGFn
ZXMuCisgKiBidXQgaXMgKk1VQ0gqIGZhc3RlciB0aGFuIHBtYXBfZW50ZXIuLi4KKyAqLwordm9p
ZAorcG1hcF9lbnRlcl9xdWljayhwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2Vf
dCBtLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCisJbG9jayA9
IE5VTEw7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOwor
CSh2b2lkKXBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LCBOVUxMLCAm
bG9jayk7CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5s
b2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCitzdGF0aWMg
dm1fcGFnZV90CitwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHZtX3Byb3RfdCBwcm90LCB2bV9wYWdlX3QgbXB0ZSwg
c3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB0X2VudHJ5X3QgKnB0ZSwgbmV3cHRlOworCXZt
X3BhZGRyX3QgcGE7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKworCUtBU1NFUlQodmEgPCBrbWku
Y2xlYW5fc3ZhIHx8IHZhID49IGttaS5jbGVhbl9ldmEgfHwKKwkgICAgKG0tPm9mbGFncyAmIFZQ
T19VTk1BTkFHRUQpICE9IDAsCisJICAgICgiJXM6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhl
IGNsZWFuIHN1Ym1hcCIsIF9fZnVuY19fKSk7CisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ss
IFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwkvKgor
CSAqIEluIHRoZSBjYXNlIHRoYXQgYSBwYWdlIHRhYmxlIHBhZ2UgaXMgbm90IHJlc2lkZW50LCB3
ZSBhcmUKKwkgKiBjcmVhdGluZyBpdCBoZXJlLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJf
QUREUkVTUykgeworCQlwZF9lbnRyeV90ICpwZGU7CisJCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwor
CQkvKgorCQkgKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXgKKwkJICovCisJCXB0ZXBp
bmRleCA9IHBtYXBfcGRlX3BpbmRleCh2YSk7CisJCWlmIChtcHRlICYmIChtcHRlLT5waW5kZXgg
PT0gcHRlcGluZGV4KSkgeworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJ
LyoKKwkJCSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkJCSAqLworCQkJcGRlID0g
cG1hcF9wZGUocG1hcCwgdmEpOworCisJCQkvKgorCQkJICogSWYgdGhlIHBhZ2UgdGFibGUgcGFn
ZSBpcyBtYXBwZWQsIHdlIGp1c3QKKwkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudCwgYW5k
IGFjdGl2YXRlIGl0LgorCQkJICovCisJCQlpZiAocGRlICYmICpwZGUgIT0gMCkgeworCQkJCWlm
IChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQkJCXJldHVybiAoTlVMTCk7CisJCQkJbXB0
ZSA9IFBIWVNfVE9fVk1fUEFHRSgKKwkJCQkgICAgTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7
CisJCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFBh
c3MgTlVMTCBpbnN0ZWFkIG9mIHRoZSBQViBsaXN0IGxvY2sKKwkJCQkgKiBwb2ludGVyLCBiZWNh
dXNlIHdlIGRvbid0IGludGVuZCB0byBzbGVlcC4KKwkJCQkgKi8KKwkJCQltcHRlID0gX3BtYXBf
YWxsb2NwdGUocG1hcCwgcHRlcGluZGV4LCBOVUxMKTsKKwkJCQlpZiAobXB0ZSA9PSBOVUxMKQor
CQkJCQlyZXR1cm4gKG1wdGUpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbXB0ZSA9IE5VTEw7
CisJfQorCisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOworCWlmIChwdGVfaXNfdmFsaWQocHRl
KSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQltcHRlLT53aXJlX2NvdW50LS07CisJCQlt
cHRlID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gKG1wdGUpOworCX0KKworCS8qCisJICogRW50ZXIg
b24gdGhlIFBWIGxpc3QgaWYgcGFydCBvZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisJICovCisJaWYg
KChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwICYmCisJICAgICFwbWFwX3RyeV9pbnNl
cnRfcHZfZW50cnkocG1hcCwgdmEsIG0sIGxvY2twKSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7
CisJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCWlmIChwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEs
IG1wdGUsICZmcmVlKSkgeworCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJ
CQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQl9CisKKwkJCW1wdGUgPSBOVUxMOwor
CQl9CisJCXJldHVybiAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBJbmNyZW1lbnQgY291bnRlcnMK
KwkgKi8KKwlwbWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCAxKTsKKworCXBhID0gVk1fUEFH
RV9UT19QSFlTKG0pOworCisJLyoKKwkgKiBOb3cgdmFsaWRhdGUgbWFwcGluZyB3aXRoIFJPIHBy
b3RlY3Rpb24KKwkgKi8KKwluZXdwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwg
UFRFX1ZBTElEOworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkKKwkJbmV3
cHRlIHw9IFBURV9NQU5BR0VEOworCisJaWYgKGlzX2NhY2hlYWJsZV9tZW0ocGEpKSB7CisJCWlm
IChtLT5tZC5wdl9tZW1hdHRyID09IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisJCQluZXdwdGUg
fD0gUFRFX0NfVU5DQUNIRUQ7CisJCWVsc2UKKwkJCW5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKwl9
IGVsc2UKKwkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCisJc2NoZWRfcGluKCk7CisJaWYg
KGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCW5ld3B0ZSB8PSBQVEVfRzsKKwkJcHRlX3JlZl9z
ZXQoJm5ld3B0ZSk7CisJCXB0ZV9zdG9yZShwdGUsIG5ld3B0ZSk7CisJfSBlbHNlIHsKKwkJcHRl
X3N0b3JlKHB0ZSwgbmV3cHRlKTsKKwkJLyoKKwkJICogU3luYyBJICYgRCBjYWNoZXMuICBEbyB0
aGlzIG9ubHkgaWYgdGhlIHRhcmdldCBwbWFwCisJCSAqIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQg
cHJvY2Vzcy4gIE90aGVyd2lzZSwgYW4KKwkJICogdW5yZXNvbHZhYmxlIFRMQiBtaXNzIG1heSBv
Y2N1ci4KKwkJICovCisJCWlmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAp
IHsKKwkJCXZhICY9IH5QQUdFX01BU0s7CisJCQltaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBQ
QUdFX1NJWkUpOworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisJ
CX0KKwl9CisJc2NoZWRfdW5waW4oKTsKKworCXJldHVybiAobXB0ZSk7Cit9CisKKy8qCisgKiBN
YWtlIGEgdGVtcG9yYXJ5IG1hcHBpbmcgZm9yIGEgcGh5c2ljYWwgYWRkcmVzcy4gIFRoaXMgaXMg
b25seSBpbnRlbmRlZAorICogdG8gYmUgdXNlZCBmb3IgcGFuaWMgZHVtcHMuCisgKgorICogVXNl
IFhLUEhZUyBmb3IgNjQgYml0LgorICovCit2b2lkICoKK3BtYXBfa2VudGVyX3RlbXBvcmFyeSh2
bV9wYWRkcl90IHBhLCBpbnQgaSkKK3sKKworCWlmIChpICE9IDApCisJCXByaW50ZigiJXM6IEVS
Uk9SISEhIE1vcmUgdGhhbiBvbmUgcGFnZSBvZiB2aXJ0dWFsIGFkZHJlc3MgIgorCQkgICAgIm1h
cHBpbmcgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuICgodm9pZCAqKU1J
UFNfUEhZU19UT19ESVJFQ1QocGEpKTsKK30KKwordm9pZAorcG1hcF9rZW50ZXJfdGVtcG9yYXJ5
X2ZyZWUodm1fcGFkZHJfdCBwYSkKK3sKKworCS8qIG5vdGhpbmcgdG8gZG8gZm9yIG1pcHM2NCAq
LworCXJldHVybjsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3BkZShwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwl2bV9waW5k
ZXhfdCBwZHBpbmRleCwgcHRlcGluZGV4OworCXBkX2VudHJ5X3QgKnBkcGU7CisJdm1fcGFnZV90
IG1wdGUgPSBOVUxMOworCisJaWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKSB7CityZXRyeToK
KwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJaWYgKHBkcGUgIT0gTlVMTCAmJiAo
KnBkcGUgIT0gTlVMTCkpIHsKKwkJCS8qIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgcGQgcGFnZS4g
Ki8KKwkJCW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRwZSkp
OworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyogQWxsb2NhdGUgYSBw
ZCBwYWdlLiAqLworCisJCQkvKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXguICovCisJ
CQlwdGVwaW5kZXggPSBwbWFwX3BkZV9waW5kZXgodmEpOworCQkJcGRwaW5kZXggPSBwdGVwaW5k
ZXggPj4gTlBERVBHU0hJRlQ7ICAvKiBYWFggKi8KKwkJCW1wdGUgPSBfcG1hcF9hbGxvY3B0ZShw
bWFwLCBOVVBERSArIHBkcGluZGV4LCBsb2NrcCk7CisJCQlpZiAobXB0ZSA9PSBOVUxMICYmIGxv
Y2twICE9IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gKG1wdGUpOwor
fQorCisvKgorICogVHJpZXMgdG8gY3JlYXRlIGEgMk1CIHBhZ2UgbWFwcGluZy4gIFJldHVybnMg
VFJVRSBpZiBzdWNjZXNzZnVsIGFuZCBGQUxTRQorICogb3RoZXJ3aXNlLiAgRmFpbHMgaWYgKDEp
IGEgcGFnZSB0YWJsZSBwYWdlIGNhbm5vdCBiZSBhbGxvY2F0ZWQgd2l0aG91dAorICogYmxvY2tp
bmcsICgyKSBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgYXQgdGhlIHNwZWNpZmllZCB2aXJ0dWFs
IGFkZHJlc3MsIG9yCisgKiAoMykgYSBwdiBlbnRyeSBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhv
dXQgcmVjbGFpbWluZyBhbm90aGVyIHB2IGVudHJ5LgorICovCitzdGF0aWMgYm9vbGVhbl90Citw
bWFwX2VudGVyX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2
bV9wcm90X3QgcHJvdCwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJcGRfZW50cnlf
dCAqcGRlOworCXB0X2VudHJ5X3QgbmV3cGRlOworCXZtX3BhZ2VfdCBtcGRlOworCXN0cnVjdCBz
cGdsaXN0IGZyZWU7CisJdm1fcGFkZHJfdCBwYTsKKworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFs
X2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisK
KwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJLyogTm90IGRvaW5nIHRoZSBrZXJuZWwg
cG1hcCBmb3Igbm93ICovCisJCUNUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNs
eCBpbiBwbWFwICVwOiBrZXJuZWwgbWFwIiwKKwkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJ
CXJldHVybiAoRkFMU0UpOworCX0KKwlpZiAoKG1wZGUgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIHZh
LCBOVUxMKSkgPT0gTlVMTCkgeworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZh
ICUjbHggaW4gcG1hcCAlcCIsCisJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm4g
KEZBTFNFKTsKKwl9CisJLyogcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOyAqLworCXBkZSA9IChw
ZF9lbnRyeV90ICopTUlQU19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobXBkZSkpOwor
CXBkZSA9ICZwZGVbcG1hcF9wZGVfaW5kZXgodmEpXTsKKwlpZiAocGRlID09IE5VTEwpIHsKKwkJ
S0FTU0VSVChtcGRlLT53aXJlX2NvdW50ID4gMSwKKwkJICAgICgiJXM6IG1wZGUncyB3aXJlIGNv
dW50IGlzIHRvbyBsb3ciLCBfX2Z1bmNfXykpOworCQltcGRlLT53aXJlX2NvdW50LS07CisJCUNU
UjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5j
X18sCisJCSAgICB2YSwgcG1hcCk7CisJCXJldHVybiAoRkFMU0UpOworCX0KKwlwYSA9IFZNX1BB
R0VfVE9fUEhZUyhtKTsKKyAgICAgICAgbmV3cGRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZO
KHBhKSB8IFBURV9WQUxJRCB8IFBURV9QU18xTTsKKwlpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkp
IHsKKwkJaWYgKG0tPm1kLnB2X21lbWF0dHIgPT0gVk1fTUVNQVRUUl9VTkNBQ0hFQUJMRSkKKwkJ
CW5ld3BkZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKwkJZWxzZQorCQkJbmV3cGRlIHw9IFBURV9DX0NB
Q0hFOworCX0gZWxzZQorCQluZXdwZGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisJaWYgKChtLT5vZmxh
Z3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwKSB7CisJCW5ld3BkZSB8PSBQVEVfTUFOQUdFRDsKKwor
CQkvKgorCQkgKiBBYm9ydCB0aGlzIG1hcHBpbmcgaWYgaXRzIFBWIGVudHJ5IGNvdWxkIG5vdCBi
ZSBjcmVhdGVkLgorCQkgKi8KKwkJaWYgKCFwbWFwX3B2X2luc2VydF9wZGUocG1hcCwgdmEsIFZN
X1BBR0VfVE9fUEhZUyhtKSwKKwkJICAgIGxvY2twKSkgeworCQkJU0xJU1RfSU5JVCgmZnJlZSk7
CisJCQlpZiAocG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtcGRlLCAmZnJlZSkpIHsKKwkJCQlw
bWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMo
JmZyZWUpOworCQkJfQorCQkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4
IGluIHBtYXAgJXAiLAorCQkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJCQlyZXR1cm4gKEZB
TFNFKTsKKwkJfQorCX0KKworCS8qCisJICogSW5jcmVtZW50IGNvdW50ZXJzLgorCSAqLworCSBw
bWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCBOQlBEUiAvIFBBR0VfU0laRSk7CisKKwkgLyoK
KwkgICogTWFwIHRoZSBzdXBlcnBhZ2UuCisJICAqLworCSBzY2hlZF9waW4oKTsKKwkgcGRlX3N0
b3JlKHBkZSwgbmV3cGRlKTsKKworCS8qCisJICogU3luYyBJICYgRCBjYWNoZXMgZm9yIGV4ZWN1
dGFibGUgcGFnZXMuICBEbyB0aGlzIG9ubHkgaWYgdGhlCisJICogdGFyZ2V0IHBtYXAgYmVsb25n
cyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBhbgorCSAqIHVucmVzb2x2YWJs
ZSBUTEIgbWlzcyBtYXkgb2NjdXIuCisJICovCisJIGlmICghaXNfa2VybmVsX3BtYXAocG1hcCkg
JiYgKHBtYXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYKKwkgICAgIChwcm90
ICYgVk1fUFJPVF9FWEVDVVRFKSkgeworCQkJIHZhICY9IH5QRFJNQVNLOworCQkJIG1pcHNfaWNh
Y2hlX3N5bmNfcmFuZ2UodmEsIE5CUERSKTsKKwkJCSBtaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2
YSwgTkJQRFIpOworCisJIH0KKwkgc2NoZWRfdW5waW4oKTsKKworCSBhdG9taWNfYWRkX2xvbmco
JnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZv
ciB2YSAlI2x4IGluIHBtYXAgJXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKwkgcmV0
dXJuIChUUlVFKTsKK30KKworLyoKKyAqIE1hcHMgYSBzZXF1ZW5jZSBvZiByZXNpZGVudCBwYWdl
cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgb2JqZWN0LgorICogVGhlIHNlcXVlbmNlIGJlZ2lucyB3
aXRoIHRoZSBnaXZlbiBwYWdlIG1fc3RhcnQuICBUaGlzIHBhZ2UgaXMKKyAqIG1hcHBlZCBhdCB0
aGUgZ2l2ZW4gdmlydHVhbCBhZGRyZXNzIHN0YXJ0LiAgRWFjaCBzdWJzZXF1ZW50IHBhZ2UgaXMK
KyAqIG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyB0aGF0IGlzIG9mZnNldCBmcm9tIHN0YXJ0
IGJ5IHRoZSBzYW1lCisgKiBhbW91bnQgYXMgdGhlIHBhZ2UgaXMgb2Zmc2V0IGZyb20gbV9zdGFy
dCB3aXRoaW4gdGhlIG9iamVjdC4gIFRoZQorICogbGFzdCBwYWdlIGluIHRoZSBzZXF1ZW5jZSBp
cyB0aGUgcGFnZSB3aXRoIHRoZSBsYXJnZXN0IG9mZnNldCBmcm9tCisgKiBtX3N0YXJ0IHRoYXQg
Y2FuIGJlIG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyBsZXNzIHRoYW4gdGhlIGdpdmVuCisg
KiB2aXJ0dWFsIGFkZHJlc3MgZW5kLiAgTm90IGV2ZXJ5IHZpcnR1YWwgcGFnZSBiZXR3ZWVuIHN0
YXJ0IGFuZCBlbmQKKyAqIGlzIG1hcHBlZDsgb25seSB0aG9zZSBmb3Igd2hpY2ggYSByZXNpZGVu
dCBwYWdlIGV4aXN0cyB3aXRoIHRoZQorICogY29ycmVzcG9uZGluZyBvZmZzZXQgZnJvbSBtX3N0
YXJ0IGFyZSBtYXBwZWQuCisgKi8KK3ZvaWQKK3BtYXBfZW50ZXJfb2JqZWN0KHBtYXBfdCBwbWFw
LCB2bV9vZmZzZXRfdCBzdGFydCwgdm1fb2Zmc2V0X3QgZW5kLAorICAgIHZtX3BhZ2VfdCBtX3N0
YXJ0LCB2bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNl
dF90IHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCXZtX3BpbmRleF90IGRpZmYsIHBzaXplOwor
CisJVk1fT0JKRUNUX0FTU0VSVF9MT0NLRUQobV9zdGFydC0+b2JqZWN0KTsKKworCXBzaXplID0g
YXRvcChlbmQgLSBzdGFydCk7CisJbXB0ZSA9IE5VTEw7CisJbSA9IG1fc3RhcnQ7CisJbG9jayA9
IE5VTEw7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOwor
CXdoaWxlIChtICE9IE5VTEwgJiYgKGRpZmYgPSBtLT5waW5kZXggLSBtX3N0YXJ0LT5waW5kZXgp
IDwgcHNpemUpIHsKKwkJdmEgPSBzdGFydCArIHB0b2EoZGlmZik7CisJCWlmICgodmEgJiBQRFJN
QVNLKSA9PSAwICYmIHZhICsgTkJQRFIgPD0gZW5kICYmCisJCSAgICBtLT5wc2luZCA9PSAxICYm
IHBnX3NwX2VuYWJsZWQgJiYKKwkJICAgIHBtYXBfZW50ZXJfcGRlKHBtYXAsIHZhLCBtLCBwcm90
LCAmbG9jaykpCisJCQltID0gJm1bTkJQRFIgLyBQQUdFX1NJWkUgLSAxXTsKKwkJZWxzZQorCQkJ
bXB0ZSA9IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LAorCQkJICAg
IG1wdGUsICZsb2NrKTsKKwkJbSA9IFRBSUxRX05FWFQobSwgbGlzdHEpOworCX0KKwlpZiAobG9j
ayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxf
bG9jayk7CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKiBwbWFwX29iamVjdF9pbml0
X3B0IHByZWxvYWRzIHRoZSBwdGVzIGZvciBhIGdpdmVuIG9iamVjdAorICogaW50byB0aGUgc3Bl
Y2lmaWVkIHBtYXAuICBUaGlzIGVsaW1pbmF0ZXMgdGhlIGJsYXN0IG9mIHNvZnQKKyAqIGZhdWx0
cyBvbiBwcm9jZXNzIHN0YXJ0dXAgYW5kIGltbWVkaWF0ZWx5IGFmdGVyIGEgbW1hcCgpLgorICoK
KyAqIFRoaXMgY29kZSBtYXBzIGxhcmdlIHBoeXNpY2FsIG1tYXAgcmVnaW9ucyBpbnRvIHRoZQor
ICogcHJvY2Vzc29yIGFkZHJlc3Mgc3BhY2UuIE5vdGUgdGhhdCBzb21lIHNob3J0Y3V0cworICog
YXJlIHRha2VuLCBidXQgdGhlIGNvZGUgd29ya3MuCisgKi8KK3ZvaWQKK3BtYXBfb2JqZWN0X2lu
aXRfcHQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX29iamVjdF90IG9iamVjdCwK
KyAgICB2bV9waW5kZXhfdCBwaW5kZXgsIHZtX3NpemVfdCBzaXplKQoreworCXBkX2VudHJ5X3Qg
KnBkZTsKKwl2bV9wYWRkcl90IHBhLCBwdGVwYTsKKwl2bV9wYWdlX3QgcCwgcGRwZzsKKwl2bV9t
ZW1hdHRyX3QgbWVtYXR0cjsKKworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChvYmplY3QpOwor
CUtBU1NFUlQob2JqZWN0LT50eXBlID09IE9CSlRfREVWSUNFIHx8IG9iamVjdC0+dHlwZSA9PSBP
QkpUX1NHLAorCSAgICAoInBtYXBfb2JqZWN0X2luaXRfcHQ6IG5vbi1kZXZpY2Ugb2JqZWN0Iikp
OworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIE5vdCBkb2luZyB0aGUga2Vy
bmVsIHBtYXAgZm9yIG5vdy4gKi8KKwkJcmV0dXJuOworCX0KKworCWlmICgoYWRkciAmIChOQlBE
UiAtIDEpKSA9PSAwICYmIChzaXplICYgKE5CUERSIC0gMSkpID09IDApIHsKKwkJaWYgKCFwZ19z
cF9lbmFibGVkKQorCQkJcmV0dXJuOworCQlpZiAoIXZtX29iamVjdF9wb3B1bGF0ZShvYmplY3Qs
IHBpbmRleCwgcGluZGV4ICsgYXRvcChzaXplKSkpCisJCQlyZXR1cm47CisJCXAgPSB2bV9wYWdl
X2xvb2t1cChvYmplY3QsIHBpbmRleCk7CisJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFHRV9C
SVRTX0FMTCwKKwkJICAgICgiJXM6IGludmFsaWQgcGFnZSAlcCIsIF9fZnVuY19fLCBwKSk7CisJ
CW1lbWF0dHIgPSBwLT5tZC5wdl9tZW1hdHRyOworCisJCS8qCisJCSAqIEFib3J0IHRoZSBtYXBw
aW5nIGlmIHRoZSBmaXJzdCBwYWdlIGlzIG5vdCBwaHlzaWNhbGx5CisJCSAqIGFsaWduZWQgdG8g
YSAyTUIgcGFnZSBib3VuZGFyeS4KKwkJICovCisJCXB0ZXBhID0gVk1fUEFHRV9UT19QSFlTKHAp
OworCQlpZiAocHRlcGEgJiAoTkJQRFIgLSAxKSkKKwkJCXJldHVybjsKKworCQkvKgorCQkgKiBT
a2lwIHRoZSBmaXJzdCBwYWdlLiBBYm9ydCB0aGUgbWFwcGluZyBpZiB0aGUgcmVzdCBvZgorCQkg
KiB0aGUgcGFnZXMgYXJlIG5vdCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgb3IgaGF2ZSBkaWZmZXJp
bmcKKwkJICogbWVtb3J5IGF0dHJpYnV0ZXMuCisJCSAqLworCQlwID0gVEFJTFFfTkVYVChwLCBs
aXN0cSk7CisJCWZvciAocGEgPSBwdGVwYSArIFBBR0VfU0laRTsgcGEgPCBwdGVwYSArIHNpemU7
CisJCSAgICBwYSArPSBQQUdFX1NJWkUpIHsKKwkJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFH
RV9CSVRTX0FMTCwKKwkJCSAgICAoIiVzOiBpbnZhbGlkIHBhZ2UgJXAiLCBfX2Z1bmNfXywgcCkp
OworCQkJaWYgKHBhICE9IFZNX1BBR0VfVE9fUEhZUyhwKSB8fAorCQkJICAgIG1lbWF0dHIgIT0g
cC0+bWQucHZfbWVtYXR0cikKKwkJCQlyZXR1cm47CisJCQlwID0gVEFJTFFfTkVYVChwLCBsaXN0
cSk7CisJCX0KKworCQkvKgorCQkgKiBNYXAgdXNpbmcgMk1CIHBhZ2VzLiAgInB0ZXBhIiBpcyAy
TSBhbGlnbmVkIGFuZCAic2l6ZSIKKwkJICogaXMgYSBtdWx0aXBsZSBvZiAyTS4KKwkJICovCisJ
CVBNQVBfTE9DSyhwbWFwKTsKKwkJZm9yIChwYSA9IHB0ZXBhOyBwYSA8IHB0ZXBhICsgc2l6ZTsg
cGEgKz0gTkJQRFIpIHsKKwkJCXBkcGcgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIGFkZHIsIE5VTEwp
OworCQkJaWYgKHBkcGcgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogVGhlIGNyZWF0aW9uIG9m
IG1hcHBpbmdzIGJlbG93IGlzIG9ubHkgYW4KKwkJCQkgKiBvcHRpbWl6YXRpb24uICBJZiBhIHBh
Z2UgZGlyZWN0b3J5IHBhZ2UKKwkJCQkgKiBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhvdXQgYmxv
Y2tpbmcsCisJCQkJICogY29udGludWUgb24gdG8gdGhlIG5leHQgbWFwcGluZyByYXRoZXIgdGhh
bgorCQkJCSAqIGJsb2NraW5nLgorCQkJCSAqLworCQkJCWFkZHIgKz0gTkJQRFI7CisJCQkJY29u
dGludWU7CisJCQl9CisJCQlwZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1Qo
CisJCQkgICAgVk1fUEFHRV9UT19QSFlTKHBkcGcpKTsKKwkJCXBkZSA9ICZwZGVbcG1hcF9wZGVf
aW5kZXgoYWRkcildOworCQkJaWYgKCFwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZGUpKSB7
CisJCQkJcHRfZW50cnlfdCBuZXdwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwKKwkJCQkgICAg
UFRFX1BTXzFNIHwgUFRFX0QgfCBQVEVfUkVGIHwgUFRFX1ZBTElEOworCisJCQkJaWYgKGlzX2Nh
Y2hlYWJsZV9tZW0ocGEpKSB7CisJCQkJCWlmIChwZHBnLT5tZC5wdl9tZW1hdHRyID09CisJCQkJ
CSAgICBWTV9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorCQkJCQkJbmV3cHRlIHw9IFBURV9DX1VOQ0FD
SEVEOworCQkJCQllbHNlCisJCQkJCQluZXdwdGUgfD0gUFRFX0NfQ0FDSEU7CisJCQkJfSBlbHNl
CisJCQkJCW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKworCQkJCXBkZV9zdG9yZShwZGUsIG5l
d3B0ZSk7CisJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgTkJQRFIvUEFHRV9TSVpF
KTsKKwkJCQlhdG9taWNfYWRkX2xvbmcoJnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkJCX0gZWxz
ZSB7CisJCQkJLyogQ29udGludWUgb24gaWYgdGhlIFBERSBpcyBhbHJlYWR5IHZhbGlkLiAqLwor
CQkJCXBkcGctPndpcmVfY291bnQtLTsKKwkJCQlLQVNTRVJUKHBkcGctPndpcmVfY291bnQgPiAw
LAorCQkJCSAgICAoIiVzOiBtaXNzaW5nIHJlZmVyZW5jZSB0byBwYWdlIGRpcmVjdG9yeSAiCisJ
CQkJICAgICJwYWdlLCB2YTogMHglbHgiLCBfX2Z1bmNfXywgYWRkcikpOworCQkJfQorCQkJYWRk
ciArPSBOQlBEUjsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9Cit9CisKKy8qCisgKglD
bGVhciB0aGUgd2lyZWQgYXR0cmlidXRlIGZyb20gdGhlIG1hcHBpbmdzIGZvciB0aGUgc3BlY2lm
aWVkIHJhbmdlIG9mCisgKglhZGRyZXNzZXMgaW4gdGhlIGdpdmVuIHBtYXAuICBFdmVyeSB2YWxp
ZCBtYXBwaW5nIHdpdGhpbiB0aGF0IHJhbmdlCisgKgltdXN0IGhhdmUgdGhlIHdpcmVkIGF0dHJp
YnV0ZSBzZXQuICBJbiBjb250cmFzdCwgaW52YWxpZCBtYXBwaW5ncworICoJY2Fubm90IGhhdmUg
dGhlIHdpcmVkIGF0dHJpYnV0ZSBzZXQsIHNvIHRoZXkgYXJlIGlnbm9yZWQuCisgKgorICoJVGhl
IHdpcmVkIGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyeSBpcyBub3QgYSBoYXJkd2Fy
ZSBmZWF0dXJlLAorICoJc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbnZhbGlkYXRlIGFueSBUTEIg
ZW50cmllcy4KKyAqLwordm9pZAorcG1hcF91bndpcmUocG1hcF90IHBtYXAsIHZtX29mZnNldF90
IHN2YSwgdm1fb2Zmc2V0X3QgZXZhKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcGU7CisJcHRf
ZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisJYm9vbGVhbl90IHB2X2xpc3Rz
X2xvY2tlZDsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNFOworcmVzdW1lOgorCVBNQVBfTE9D
SyhwbWFwKTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCXBkcGUgPSBw
bWFwX3NlZ21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gTlVMTCkgeworCQkJdmFfbmV4
dCA9IChzdmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJ
CXZhX25leHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0gKHN2YSArIE5C
UERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7
CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKwkJaWYgKCpwZGUgPT0gTlVM
TCkKKwkJCWNvbnRpbnVlOworCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlp
ZiAoIXBkZV90ZXN0KHBkZSwgUFRFX1cpKQorCQkJCXBhbmljKCJwbWFwX3Vud2lyZTogcGRlICUj
anggaXMgbWlzc2luZyBQVEVfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnBkZSk7CisJCQkvKgor
CQkJICogQXJlIHdlIHVud2lyaW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJCQkg
KiBkZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYgKHN2
YSArIE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQlhdG9taWNfY2xl
YXJfbG9uZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1cpOworCQkJCXBtYXAtPnBtX3N0YXRzLndp
cmVkX2NvdW50IC09IE5CUERSIC8gUEFHRV9TSVpFOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNl
IHsKKwkJCQlpZiAoIXB2X2xpc3RzX2xvY2tlZCkgeworCQkJCQlwdl9saXN0c19sb2NrZWQgPSBU
UlVFOworCQkJCQlpZiAoIXJ3X3RyeV9ybG9jaygmcHZoX2dsb2JhbF9sb2NrKSkgeworCQkJCQkJ
IFBNQVBfVU5MT0NLKHBtYXApOworCQkJCQkJIHJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwor
CQkJCQkJIC8qIFJlcGVhdCBzdmEuICovCisJCQkJCQkgZ290byByZXN1bWU7CisJCQkJCX0KKwkJ
CQl9CisJCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGUocG1hcCwgcGRlLCBzdmEpKQorCQkJCQlwYW5p
YygicG1hcF91bndpcmU6IGRlbW90aW9uIGZhaWxlZCIpOworCQkJfQorCQl9CisJCWlmICh2YV9u
ZXh0ID4gZXZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19w
dGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9T
SVpFKSB7CisJCQlpZiAoIXB0ZV9pc192YWxpZChwdGUpKQorCQkJCWNvbnRpbnVlOworCQkJaWYg
KCFwdGVfdGVzdChwdGUsIFBURV9XKSkKKwkJCQlwYW5pYygicG1hcF91bndpcmU6IHB0ZSAlI2p4
IGlzIG1pc3NpbmcgUEdfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnB0ZSk7CisJCQkvKgorCQkJ
ICogUFRFX1cgbXVzdCBiZSBjbGVhcmVkIGF0b21pY2FsbHkuICBBbHRob3VnaCB0aGUgcG1hcAor
CQkJICogbG9jayBzeW5jaHJvbml6ZXMgYWNjZXNzIHRvIFBURV9XLCBhbm90aGVyIHByb2Nlc3Nv
cgorCQkJICogY291bGQgYmUgc2V0dGluZyBQVEVfRCBhbmQvb3IgUFRFX1JFRiBjb25jdXJyZW50
bHkuCisJCQkgKi8KKwkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfVyk7CisJCQlwbWFwLT5w
bV9zdGF0cy53aXJlZF9jb3VudC0tOworCQl9CisJfQorCWlmIChwdl9saXN0c19sb2NrZWQpIHsK
KwkJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7
Cit9CisKKy8qCisgKglDb3B5IHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgc3JjX2FkZHIvbGVuCisg
Kglmcm9tIHRoZSBzb3VyY2UgbWFwIHRvIHRoZSByYW5nZSBkc3RfYWRkci9sZW4KKyAqCWluIHRo
ZSBkZXN0aW5hdGlvbiBtYXAuCisgKgorICoJVGhpcyByb3V0aW5lIGlzIG9ubHkgYWR2aXNvcnkg
YW5kIG5lZWQgbm90IGRvIGFueXRoaW5nLgorICovCisKK3ZvaWQKK3BtYXBfY29weShwbWFwX3Qg
ZHN0X3BtYXAsIHBtYXBfdCBzcmNfcG1hcCwgdm1fb2Zmc2V0X3QgZHN0X2FkZHIsCisgICAgdm1f
c2l6ZV90IGxlbiwgdm1fb2Zmc2V0X3Qgc3JjX2FkZHIpCit7CisjaWYgMAorLyoKKyAqIFhYWCBU
aGlzIGRvZXNuJ3QgaGVscCB3aXRoIGZvcmsoKSBwZXJmb3JtYW5jZSBhbmQKKyAqIGFkZHMgbW9y
ZSBvdmVyaGVhZC4gIE1heWJlIHRoZSByZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorICogaXMgY2F1
c2luZyBmYXVsdC1saWtlIG92ZXJoZWFkIGFueXdheT8KKyAqLworCisJc3RydWN0IHJ3bG9jayAq
bG9jazsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX29mZnNldF90IGFkZHIsIGVuZF9hZGRy
LCB2YV9uZXh0OworCisJaWYgKGRzdF9hZGRyICE9IHNyY19hZGRyKQorCQlyZXR1cm47CisKKwlp
ZiAoUENQVV9HRVQoY3VycG1hcCkgIT0gc3JjX3BtYXApCisJCXJldHVybjsKKworCWVuZF9hZGRy
ID0gc3JjX2FkZHIgKyBsZW47CisKKwlsb2NrID0gTlVMTDsKKwlyd19ybG9jaygmcHZoX2dsb2Jh
bF9sb2NrKTsKKwkvKiBMb2NrIHRoZSBwbWFwcyBpbiB0aGUgc2FtZSBvcmRlciB0byBhdm9pZCBk
ZWFkbG9jay4gKi8KKwlpZiAoZHN0X3BtYXAgPCBzcmNfcG1hcCkgeworCQlQTUFQX0xPQ0soZHN0
X3BtYXApOworCQlQTUFQX0xPQ0soc3JjX3BtYXApOworCX0gZWxzZSB7CisJCVBNQVBfTE9DSyhz
cmNfcG1hcCk7CisJCVBNQVBfTE9DSyhkc3RfcG1hcCk7CisJfQorCisJZm9yIChhZGRyID0gc3Jj
X2FkZHI7IGFkZHIgPCBlbmRfYWRkcjsgYWRkciA9IHZhX25leHQpIHsKKwkJcHRfZW50cnlfdCAq
c3JjX3B0ZSwgKmRzdF9wdGU7CisJCXZtX3BhZ2VfdCBkc3RtcGRlLCBkc3RtcHRlLCBzcmNtcHRl
OworCQlwZF9lbnRyeV90ICpzcmNfcGRwZSwgKnNyY19wZGUsICpkc3RfcGRlOworCQlwdF9lbnRy
eV90IHNyY3B0ZTsKKwkJdm1fcGFkZHJfdCBzcmNwYWRkcjsKKwkJdm1fcGFnZV90IG07CisKKwor
CQlzcmNfcGRwZSA9IHBtYXBfc2VnbWFwKHNyY19wbWFwLCBhZGRyKTsKKwkJaWYgKHNyY19wZHBl
ID09IE5VTEwgfHwgKnNyY19wZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoYWRkciArIE5CU0VH
KSAmIH5TRUdNQVNLOworCQkJLyoKKwkJCSAqIElmIHRoZSBuZXh0IHZhIGlzIG91dCBvZiB0aGUg
Y29weSByYW5nZSB0aGVuIHNldAorCQkJICogaXQgdG8gZW5kX2FkZHIgaW4gb3JkZXIgdG8gY29w
eSBhbGwgbWFwcGluZ3MgdW50aWwKKwkJCSAqIGdpdmVuIGxpbWl0LgorCQkJICovCisJCQlpZiAo
dmFfbmV4dCA8IGFkZHIpCisJCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCQkJY29udGludWU7CisJ
CX0KKworCQl2YV9uZXh0ID0gKGFkZHIgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25l
eHQgPCBhZGRyKQorCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCisJCXNyY19wZGUgPSBwbWFwX3Bk
cGVfdG9fcGRlKHNyY19wZHBlLCBhZGRyKTsKKwkJaWYgKHNyY19wZGUgPT0gTlVMTCB8fCAqc3Jj
X3BkZSA9PSAwKQorCQkJY29udGludWU7CisJCXNyY3B0ZSA9IChwdF9lbnRyeV90KSpzcmNfcGRl
OworCisJCWlmIChwdGVfaXNfMW1fc3VwZXJwYWdlKCZzcmNwdGUpKSB7CisJCQkvKiBDb3B5IHN1
cGVycGFnZSBwZGUuICovCisJCQlpZiAoKGFkZHIgJiBQRFJNQVNLKSAhPSAwIHx8IGFkZHIgKyBO
QlBEUiA+IGVuZF9hZGRyKQorCQkJCWNvbnRpbnVlOworCQkJZHN0bXBkZSA9IHBtYXBfYWxsb2Nw
ZGUoZHN0X3BtYXAsIGFkZHIsIE5VTEwpOworCQkJaWYgKGRzdG1wZGUgPT0gTlVMTCkKKwkJCQli
cmVhazsKKworCQkJLyogZHN0X3BkZSA9IHBtYXBfcGRlKGRzdF9wbWFwLCBhZGRyKTsgKi8KKwkJ
CWRzdF9wZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkgICAgVk1f
UEFHRV9UT19QSFlTKGRzdG1wZGUpKTsKKwkJCWRzdF9wZGUgPSAmZHN0X3BkZVtwbWFwX3BkZV9p
bmRleChhZGRyKV07CisKKwkJCWlmICgqZHN0X3BkZSA9PSAwICYmCisJCQkgICAgKCFwdGVfdGVz
dCgmc3JjcHRlLCBQVEVfTUFOQUdFRCkgfHwKKwkJCSAgICBwbWFwX3B2X2luc2VydF9wZGUoZHN0
X3BtYXAsIGFkZHIsCisJCQkgICAgVExCTE9fUFRFX1RPX1BBKHNyY3B0ZSksICZsb2NrKSkpIHsK
KwkJCQkqZHN0X3BkZSA9IChwZF9lbnRyeV90KShzcmNwdGUgJiB+UFRFX1cpOworCQkJCXBtYXBf
cmVzaWRlbnRfY291bnRfaW5jKGRzdF9wbWFwLCBOQlBEUiAvCisJCQkJICAgIFBBR0VfU0laRSk7
CisJCQl9IGVsc2UKKwkJCQlkc3RtcGRlLT53aXJlX2NvdW50LS07CisJCQljb250aW51ZTsKKwkJ
fQorCisJCXNyY3BhZGRyID0gTUlQU19ESVJFQ1RfVE9fUEhZUygqc3JjX3BkZSk7CisJCXNyY21w
dGUgPSBQSFlTX1RPX1ZNX1BBR0Uoc3JjcGFkZHIpOworCQlLQVNTRVJUKHNyY21wdGUtPndpcmVf
Y291bnQgPiAwLAorCQkgICAgKCJwbWFwX2NvcHk6IHNvdXJjZSBwYWdlIHRhYmxlIHBhZ2UgaXMg
dW51c2VkIikpOworCisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5k
IG9mIHRoZSB2YWRkciByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgc291cmNlIHBhZ2UgdGFibGUg
cGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UKKwkJICogYmVpbmcgY29waWVkLgorCQkg
Ki8KKwkJaWYgKHZhX25leHQgPiBlbmRfYWRkcikKKwkJCXZhX25leHQgPSBlbmRfYWRkcjsKKwor
CQkvKgorCQkgKiBXYWxrIHRoZSBzb3VyY2UgcGFnZSB0YWJsZSBlbnRyaWVzIGFuZCBjb3B5IHRo
ZSBtYW5hZ2VkCisJCSAqIGVudHJpZXMuCisJCSAqLworCisJCS8qIHNyY19wdGUgPSBwbWFwX3Bk
ZV90b19wdGUoc3JjX3BkZSwgYWRkcik7ICovCisJCXNyY19wdGUgPSAocHRfZW50cnlfdCAqKU1J
UFNfUEhZU19UT19ESVJFQ1Qoc3JjcGFkZHIpOworCQlzcmNfcHRlID0gJnNyY19wdGVbcG1hcF9w
dGVfaW5kZXgoYWRkcildOworCisJCWlmIChzcmNfcHRlID09IE5VTEwgfHwgKnNyY19wdGUgPT0g
MCkKKwkJCWNvbnRpbnVlOworCisJCWRzdG1wdGUgPSBOVUxMOworCQl3aGlsZSAoYWRkciA8IHZh
X25leHQpIHsKKwkJCXVuc2lnbmVkIHBkZXBpbmRleDsKKwkJCXB0X2VudHJ5X3QgcHRldGVtcDsK
KworCisJCQlwdGV0ZW1wID0gKnNyY19wdGU7CisKKwkJCS8qCisJCQkgKiB3ZSBvbmx5IHZpcnR1
YWwgY29weSBtYW5hZ2VkIHBhZ2VzCisJCQkgKi8KKwkJCWlmIChwdGVfdGVzdCgmcHRldGVtcCwg
UFRFX01BTkFHRUQpKSB7CisJCQkJLyogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4ICov
CisJCQkJcGRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KGFkZHIpOworCisJCQkJLyogR2V0IHRo
ZSBwYWdlIGRpcmVjdG9yeSBlbnRyeS4gKi8KKwkJCQlkc3RfcGRlID0gcG1hcF9wZGUoZHN0X3Bt
YXAsIGFkZHIpOworCisJCQkJaWYgKGRzdF9wZGUgIT0gTlVMTCAmJiAqZHN0X3BkZSAhPSAwKSB7
CisJCQkJCWRzdG1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJCSAgICBNSVBTX0RJUkVDVF9U
T19QSFlTKCpkc3RfcGRlKSk7CisJCQkJfSBlbHNlCisJCQkJCWRzdG1wdGUgPSBOVUxMOworCisJ
CQkJaWYgKGRzdG1wdGUgIT0gTlVMTCAmJgorCQkJCSAgICBkc3RtcHRlLT5waW5kZXggPT0gcGRl
cGluZGV4KSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBwYWdlIHRhYmxlIGlzIG1hcHBlZCBzbyBq
dXN0CisJCQkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudC4KKwkJCQkJICovCisJCQkJCWRz
dG1wdGUtPndpcmVfY291bnQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBUaGUg
cGFnZSB0YWJsZSBpc24ndCBtYXBwZWQsIG9yIGl0CisJCQkJCSAqIGhhcyBiZWVuIGRlYWxsb2Nh
dGVkLgorCQkJCQkgKi8KKwkJCQkJZHN0bXB0ZSA9IHBtYXBfYWxsb2NwdGUoZHN0X3BtYXAsCisJ
CQkJCSAgICBhZGRyLCBOVUxMKTsKKworCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSBhcmUgaGF2aW5n
IG1lbW9yeSBhbGxvYyBpc3N1ZXMKKwkJCQkJICogdGhlbiBhYmFuZG9uIHRyeWluZyB0byBjb3B5
IHRoZSBwYWdlCisJCQkJCSAqIHRhYmxlcy4KKwkJCQkJICovCisJCQkJCWlmIChkc3RtcHRlID09
IE5VTEwpCisJCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBOb3cgdGhhdCB3
ZSBoYXZlIGEgcGFnZSBkaXJlY3RvcnksIGdldCB0aGUKKwkJCQkgKiBwdGUuCisJCQkJICovCisK
KwkJCQkvKiBkc3RfcHRlID0gcG1hcF9wdGUoZHN0X3BtYXAsIGFkZHIpOyAqLworCQkJCWRzdF9w
dGUgPSAocHRfZW50cnlfdCAqKQorCQkJCSAgICBNSVBTX1BIWVNfVE9fRElSRUNUKAorCQkJCQlW
TV9QQUdFX1RPX1BIWVMoZHN0bXB0ZSkpOworCQkJCWRzdF9wdGUgPSAmZHN0X3B0ZVtwbWFwX3B0
ZV9pbmRleChhZGRyKV07CisKKwkJCQkvKiBUcnkgYW5kIGluc2VydCB0aGUgcHZfZW50cnkuICov
CisJCQkJbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QVEVfVE9fUEEocHRldGVtcCkpOworCQkJ
CWlmICgqZHN0X3B0ZSA9PSAwICYmCisJCQkJICAgIHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShk
c3RfcG1hcCwgYWRkciwgbSwKKwkJCQkgICAgJmxvY2spKSB7CisJCQkJCS8qCisJCQkJCSAqIFBv
cHVsYXRlIHRoZSBlbnRyeS4KKwkJCQkJICoKKwkJCQkJICogQ2xlYXIgdGhlIHdpcmVkLCBtb2Rp
ZmllZCwgYW5kCisJCQkJCSAqIGFjY2Vzc2VkIChyZWZlcmVuY2VkKSBiaXRzCisJCQkJCSAqIGR1
cmluZyB0aGUgY29weS4KKwkJCQkJICovCisJCQkJCXB0ZV9jbGVhcigmcHRldGVtcCwgUFRFX1cg
fCBQVEVfRCB8CisJCQkJCSAgICBQVEVfUkVGKTsKKwkJCQkJKmRzdF9wdGUgPSBwdGV0ZW1wOwor
CQkJCQkvKiBVcGRhdGUgc3RhdHMuICovCisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfaW5jKGRz
dF9wbWFwLCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCQkJ
aWYgKHBtYXBfdW53aXJlX3B0cChkc3RfcG1hcCwgYWRkciwKKwkJCQkJICAgIGRzdG1wdGUsICZm
cmVlKSkgeworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UoZHN0X3BtYXAsCisJCQkJCQkgICAg
YWRkcik7CisJCQkJCQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkJCX0KKwkJCQkJ
Z290byBvdXQ7CisJCQkJfQorCQkJCS8qIENoZWNrIHRoZSB3aXJlX2NvdW50IHRvIHNlZSBpZiB3
ZSdyZSBkb25lLiAqLworCQkJCWlmIChkc3RtcHRlLT53aXJlX2NvdW50ID49IHNyY21wdGUtPndp
cmVfY291bnQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJYWRkciArPSBQQUdFX1NJWkU7CisJCQlz
cmNfcHRlKys7CisJCX0KKwl9CitvdXQ6CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9j
ayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHNy
Y19wbWFwKTsKKwlQTUFQX1VOTE9DSyhkc3RfcG1hcCk7CisjZW5kaWYgLyogI2lmIDAgKi8KK30K
KworLyoKKyAqCXBtYXBfemVyb19wYWdlIHplcm9zIHRoZSBzcGVjaWZpZWQgaGFyZHdhcmUgcGFn
ZSBieSBtYXBwaW5nCisgKgl0aGUgcGFnZSBpbnRvIEtWTSBhbmQgdXNpbmcgYnplcm8gdG8gY2xl
YXIgaXRzIGNvbnRlbnRzLgorICoKKyAqIAlVc2UgWEtQSFlTIGZvciA2NCBiaXQuCisgKi8KK3Zv
aWQKK3BtYXBfemVyb19wYWdlKHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNldF90IHZhOworCXZt
X3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RP
X0RJUkVDVChwaHlzKTsKKwlzY2hlZF9waW4oKTsKKwliemVybygoY2FkZHJfdCl2YSwgUEFHRV9T
SVpFKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgUEFHRV9TSVpFKTsKKwlzY2hlZF91
bnBpbigpOworfQorCisvKgorICoJcG1hcF96ZXJvX3BhZ2VfYXJlYSB6ZXJvcyB0aGUgc3BlY2lm
aWVkIGhhcmR3YXJlIHBhZ2UgYnkgbWFwcGluZworICoJdGhlIHBhZ2UgaW50byBLVk0gYW5kIHVz
aW5nIGJ6ZXJvIHRvIGNsZWFyIGl0cyBjb250ZW50cy4KKyAqCisgKglvZmYgYW5kIHNpemUgbWF5
IG5vdCBjb3ZlciBhbiBhcmVhIGJleW9uZCBhIHNpbmdsZSBoYXJkd2FyZSBwYWdlLgorICovCit2
b2lkCitwbWFwX3plcm9fcGFnZV9hcmVhKHZtX3BhZ2VfdCBtLCBpbnQgb2ZmLCBpbnQgc2l6ZSkK
K3sKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMo
bSk7CisKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJFQ1QocGh5cyk7CisJc2NoZWRfcGluKCk7CisJ
Ynplcm8oKGNoYXIgKikoY2FkZHJfdCl2YSArIG9mZiwgc2l6ZSk7CisJbWlwc19kY2FjaGVfd2Jp
bnZfcmFuZ2UodmEgKyBvZmYsIHNpemUpOworCXNjaGVkX3VucGluKCk7Cit9CisKK3ZvaWQKK3Bt
YXBfemVyb19wYWdlX2lkbGUodm1fcGFnZV90IG0pCit7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1f
cGFkZHJfdCBwaHlzID0gVk1fUEFHRV9UT19QSFlTKG0pOworCisJdmEgPSBNSVBTX1BIWVNfVE9f
RElSRUNUKHBoeXMpOworCXNjaGVkX3BpbigpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBQQUdFX1NJ
WkUpOworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhLCBQQUdFX1NJWkUpOworCXNjaGVkX3Vu
cGluKCk7Cit9CisKKy8qCisgKglwbWFwX2NvcHlfcGFnZSBjb3BpZXMgdGhlIHNwZWNpZmllZCAo
bWFjaGluZSBpbmRlcGVuZGVudCkKKyAqCXBhZ2UgYnkgbWFwcGluZyB0aGUgcGFnZSBpbnRvIHZp
cnR1YWwgbWVtb3J5IGFuZCB1c2luZworICoJYmNvcHkgdG8gY29weSB0aGUgcGFnZSwgb25lIG1h
Y2hpbmUgZGVwZW5kZW50IHBhZ2UgYXQgYQorICoJdGltZS4KKyAqCisgKiAJVXNlIFhLUEhZUyBm
b3IgNjQgYml0LgorICovCisjZGVmaW5lCVBNQVBfQ09QWV9UQUdTCTB4MDAwMDAwMDEKK3N0YXRp
YyB2b2lkCitwbWFwX2NvcHlfcGFnZV9pbnRlcm5hbCh2bV9wYWdlX3Qgc3JjLCB2bV9wYWdlX3Qg
ZHN0LCBpbnQgZmxhZ3MpCit7CisJdm1fb2Zmc2V0X3QgdmFfc3JjLCB2YV9kc3Q7CisJdm1fcGFk
ZHJfdCBwaHlzX3NyYyA9IFZNX1BBR0VfVE9fUEhZUyhzcmMpOworCXZtX3BhZGRyX3QgcGh5c19k
c3QgPSBWTV9QQUdFX1RPX1BIWVMoZHN0KTsKKworCS8qIGVhc3kgY2FzZSwgYWxsIGNhbiBiZSBh
Y2Nlc3NlZCB2aWEgS1NFRzAgKi8KKwkvKgorCSAqIEZsdXNoIGFsbCBjYWNoZXMgZm9yIFZBIHRo
YXQgYXJlIG1hcHBlZCB0byB0aGlzIHBhZ2UKKwkgKiB0byBtYWtlIHN1cmUgdGhhdCBkYXRhIGlu
IFNEUkFNIGlzIHVwIHRvIGRhdGUKKwkgKi8KKwlzY2hlZF9waW4oKTsKKwlwbWFwX2ZsdXNoX3B2
Y2FjaGUoc3JjKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChNSVBTX1BIWVNfVE9f
RElSRUNUKHBoeXNfZHN0KSwgUEFHRV9TSVpFKTsKKwl2YV9zcmMgPSBNSVBTX1BIWVNfVE9fRElS
RUNUKHBoeXNfc3JjKTsKKwl2YV9kc3QgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfZHN0KTsK
KyNpZmRlZiBDUFVfQ0hFUkkKKwlpZiAoZmxhZ3MgJiBQTUFQX0NPUFlfVEFHUykKKwkJY2hlcmlf
YmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0VfU0laRSk7CisJZWxz
ZQorI2Vsc2UKKwkJYmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0Vf
U0laRSk7CisjZW5kaWYKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YV9kc3QsIFBBR0VfU0la
RSk7CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqIFdpdGggQ0hFUkksIGl0IGlzIHNvbWV0
aW1lcyBkZXNpcmFibGUgdG8gZXhwbGljaXRseSBwcm9wYWdhdGUgdGFncyBiZXR3ZWVuCisgKiBw
YWdlcyAoZS5nLiwgZHVyaW5nIGNvcHktb24td3JpdGUpLCBidXQgbm90IG90aGVyIHRpbWVzIChl
LmcuLCBjb3B5aW5nIGRhdGEKKyAqIGZyb20gVk0gdG8gYnVmZmVyIGNhY2hlKS4gIFRoZXJlIGlz
IG1vcmUgcGxheWluZyBvdXQgaGVyZSB5ZXQgdG8gZG8gKGUuZy4sCisgKiBpZiBhbnkgZmlsZXN5
c3RlbXMgbGVhcm4gdG8gcHJlc2VydmUgdGFncykgYnV0IHRoZXNlIEtQSXMgYWxsb3cgdXMgdG8K
KyAqIGNhcHR1cmUgdGhhdCBkaWZmZXJlbmNlIGluIHRoZSBtZWFuIHRpbWUuCisgKi8KK3ZvaWQK
K3BtYXBfY29weV9wYWdlKHZtX3BhZ2VfdCBzcmMsIHZtX3BhZ2VfdCBkc3QpCit7CisKKwlwbWFw
X2NvcHlfcGFnZV9pbnRlcm5hbChzcmMsIGRzdCwgMCk7Cit9CisKKyNpZmRlZiBDUFVfQ0hFUkkK
K3ZvaWQKK3BtYXBfY29weV9wYWdlX3RhZ3Modm1fcGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCkK
K3sKKworCXBtYXBfY29weV9wYWdlX2ludGVybmFsKHNyYywgZHN0LCBQTUFQX0NPUFlfVEFHUyk7
Cit9CisjZW5kaWYKKworaW50IHVubWFwcGVkX2J1Zl9hbGxvd2VkOworCitzdGF0aWMgdm9pZAor
cG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKHZtX3BhZ2VfdCBtYVtdLCB2bV9vZmZzZXRfdCBhX29m
ZnNldCwgdm1fcGFnZV90IG1iW10sCisgICAgdm1fb2Zmc2V0X3QgYl9vZmZzZXQsIGludCB4ZmVy
c2l6ZSwgaW50IGZsYWdzKQoreworCWNoYXIgKmFfY3AsICpiX2NwOworCXZtX3BhZ2VfdCBhX20s
IGJfbTsKKwl2bV9vZmZzZXRfdCBhX3BnX29mZnNldCwgYl9wZ19vZmZzZXQ7CisJdm1fcGFkZHJf
dCBhX3BoeXMsIGJfcGh5czsKKwlpbnQgY250OworCisJc2NoZWRfcGluKCk7CisJd2hpbGUgKHhm
ZXJzaXplID4gMCkgeworCQlhX3BnX29mZnNldCA9IGFfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQlj
bnQgPSBtaW4oeGZlcnNpemUsIFBBR0VfU0laRSAtIGFfcGdfb2Zmc2V0KTsKKwkJYV9tID0gbWFb
YV9vZmZzZXQgPj4gUEFHRV9TSElGVF07CisJCWFfcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhhX20p
OworCQliX3BnX29mZnNldCA9IGJfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQljbnQgPSBtaW4oY250
LCBQQUdFX1NJWkUgLSBiX3BnX29mZnNldCk7CisJCWJfbSA9IG1iW2Jfb2Zmc2V0ID4+IFBBR0Vf
U0hJRlRdOworCQliX3BoeXMgPSBWTV9QQUdFX1RPX1BIWVMoYl9tKTsKKwkJcG1hcF9mbHVzaF9w
dmNhY2hlKGFfbSk7CisJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KE1JUFNfUEhZU19U
T19ESVJFQ1QoYl9waHlzKSwKKwkJICAgIFBBR0VfU0laRSk7CisJCWFfY3AgPSAoY2hhciAqKU1J
UFNfUEhZU19UT19ESVJFQ1QoYV9waHlzKSArIGFfcGdfb2Zmc2V0OworCQliX2NwID0gKGNoYXIg
KilNSVBTX1BIWVNfVE9fRElSRUNUKGJfcGh5cykgKyBiX3BnX29mZnNldDsKKyNpZmRlZiBDUFVf
Q0hFUkkKKwkJaWYgKGZsYWdzICYgUE1BUF9DT1BZX1RBR1MpCisJCQljaGVyaV9iY29weShhX2Nw
LCBiX2NwLCBjbnQpOworCQllbHNlCisjZWxzZQorCQkJYmNvcHkoYV9jcCwgYl9jcCwgY250KTsK
KyNlbmRpZgorCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZSgodm1fb2Zmc2V0X3QpYl9jcCwgY250
KTsKKwkJYV9vZmZzZXQgKz0gY250OworCQliX29mZnNldCArPSBjbnQ7CisJCXhmZXJzaXplIC09
IGNudDsKKwl9CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqIEFzIHdpdGggcG1hcF9jb3B5
X3BhZ2UoKSwgQ0hFUkkgcmVxdWlyZXMgdGFnZ2VkIGFuZCBub24tdGFnZ2VkIHZlcnNpb25zCisg
KiBkZXBlbmRpbmcgb24gdGhlIGNpcmN1bXN0YW5jZXMuCisgKi8KK3ZvaWQKK3BtYXBfY29weV9w
YWdlcyh2bV9wYWdlX3QgbWFbXSwgdm1fb2Zmc2V0X3QgYV9vZmZzZXQsIHZtX3BhZ2VfdCBtYltd
LAorICAgIHZtX29mZnNldF90IGJfb2Zmc2V0LCBpbnQgeGZlcnNpemUpCit7CisKKwlwbWFwX2Nv
cHlfcGFnZXNfaW50ZXJuYWwobWEsIGFfb2Zmc2V0LCBtYiwgYl9vZmZzZXQsIHhmZXJzaXplLCAw
KTsKK30KKworI2lmZGVmIENQVV9DSEVSSQordm9pZAorcG1hcF9jb3B5X3BhZ2VzX3RhZ3Modm1f
cGFnZV90IG1hW10sIHZtX29mZnNldF90IGFfb2Zmc2V0LCB2bV9wYWdlX3QgbWJbXSwKKyAgICB2
bV9vZmZzZXRfdCBiX29mZnNldCwgaW50IHhmZXJzaXplKQoreworCisJcG1hcF9jb3B5X3BhZ2Vz
X2ludGVybmFsKG1hLCBhX29mZnNldCwgbWIsIGJfb2Zmc2V0LCB4ZmVyc2l6ZSwKKwkgICAgUE1B
UF9DT1BZX1RBR1MpOworfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBt
YXAncyBwdiBpcyBvbmUgb2YgdGhlIGZpcnN0CisgKiAxNiBwdnMgbGlua2VkIHRvIGZyb20gdGhp
cyBwYWdlLiAgVGhpcyBjb3VudCBtYXkKKyAqIGJlIGNoYW5nZWQgdXB3YXJkcyBvciBkb3dud2Fy
ZHMgaW4gdGhlIGZ1dHVyZTsgaXQKKyAqIGlzIG9ubHkgbmVjZXNzYXJ5IHRoYXQgdHJ1ZSBiZSBy
ZXR1cm5lZCBmb3IgYSBzbWFsbAorICogc3Vic2V0IG9mIHBtYXBzIGZvciBwcm9wZXIgcGFnZSBh
Z2luZy4KKyAqLworYm9vbGVhbl90CitwbWFwX3BhZ2VfZXhpc3RzX3F1aWNrKHBtYXBfdCBwbWFw
LCB2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXN0cnVjdCByd2xvY2sg
KmxvY2s7CisJcHZfZW50cnlfdCBwdjsKKwlpbnQgbG9vcHMgPSAwOworCWJvb2xlYW5fdCBydjsK
KworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgiJXM6
IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBfX2Z1bmNfXywgbSkpOworCXJ2ID0gRkFMU0U7CisJ
cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M
T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s
aXN0LCBwdl9uZXh0KSB7CisJCWlmIChQVl9QTUFQKHB2KSA9PSBwbWFwKSB7CisJCQlydiA9IFRS
VUU7CisJCQlicmVhazsKKwkJfQorCQlsb29wcysrOworCQlpZiAobG9vcHMgPj0gMTYpCisJCQli
cmVhazsKKwl9CisJaWYgKCFydiAmJiBsb29wcyA8IDE2ICYmIChtLT5mbGFncyAmIFBHX0ZJQ1RJ
VElPVVMpID09IDApIHsKKwkJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJ
CVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKKwkJCWlmIChQVl9Q
TUFQKHB2KSA9PSBwbWFwKSB7CisJCQkJcnYgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQkJ
bG9vcHMrKzsKKwkJCWlmIChsb29wcyA+PSAxNikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyd19y
dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChy
dik7Cit9CisKKy8qCisgKglwbWFwX3BhZ2Vfd2lyZWRfbWFwcGluZ3M6CisgKgorICoJUmV0dXJu
IHRoZSBudW1iZXIgb2YgbWFuYWdlZCBtYXBwaW5ncyB0byB0aGUgZ2l2ZW4gcGh5c2ljYWwgcGFn
ZQorICoJdGhhdCBhcmUgd2lyZWQuCisgKi8KK2ludAorcG1hcF9wYWdlX3dpcmVkX21hcHBpbmdz
KHZtX3BhZ2VfdCBtKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcHZfZW50cnlfdCBwdjsK
KwlwbWFwX3QgcG1hcDsKKwlwdF9lbnRyeV90ICpwdGU7CisJaW50IGNvdW50LCBtZF9nZW47CisK
KwlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpICE9IDApCisJCXJldHVybiAoMCk7CisJ
cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M
T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworcmVzdGFydDoKKwljb3VudCA9IDA7CisJVEFJTFFf
Rk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAo
cHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJbWRfZ2VuID0gbS0+bWQucHZf
Z2VuOworCQkJcndfcnVubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3Js
b2NrKGxvY2spOworCQkJaWYgKG1kX2dlbiAhPSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQTUFQX1VO
TE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCX0KKwkJcHRlID0gcG1hcF9w
dGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1cpKQorCQkJY291
bnQrKzsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19GSUNU
SVRJT1VTKSA9PSAwKSB7CisJCXN0cnVjdCBtZF9wYWdlICpwdmggPSBwYV90b19wdmgoVk1fUEFH
RV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4
dCkgeworCQkJcG1hcCA9IFBWX1BNQVAocHYpOworCQkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkp
IHsKKwkJCQlpbnQgcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJCW1kX2dlbiA9IG0tPm1kLnB2
X2dlbjsKKwkJCQlyd19ydW5sb2NrKGxvY2spOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCQly
d19ybG9jayhsb2NrKTsKKwkJCQlpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbiB8fAorCQkJCSAg
ICBwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuKSB7CisJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ
CQlnb3RvIHJlc3RhcnQ7CisJCQkJfQorCQkJfQorCQkJcGRfZW50cnlfdCAqcGRlID0gcG1hcF9w
ZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCWlmIChwdGVfdGVzdCgocHRfZW50cnlfdCAqKXBkZSwg
UFRFX1cpKQorCQkJCWNvdW50Kys7CisJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJfQorCX0KKwly
d19ydW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJu
IChjb3VudCk7Cit9CisKKy8qCisgKiAgUmV0dXJucyBUUlVFIGlmIHRoZSBnaXZlbiBwYWdlIGlz
IG1hcHBlZCBpbmRpdmlkdWFsbHkgb3IgYXMgcGFydCBvZgorICogIGEgMm1wYWdlLiBPdGhlcndp
c2UsIHJldHVybnMgRkFMU0UuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9wYWdlX2lzX21hcHBlZCh2
bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCWJvb2xlYW5fdCBydjsKKwor
CWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCkKKwkJcmV0dXJuIChGQUxTRSk7
CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElT
VF9MT0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworCXJ2ID0gIVRBSUxRX0VNUFRZKCZtLT5tZC5w
dl9saXN0KSB8fAorCSAgICAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCAmJgorCQkh
VEFJTFFfRU1QVFkoJnBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpLT5wdl9saXN0KSk7CisJ
cndfcnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVy
biAocnYpOworfQorCisvKgorICogRGVzdHJveSBhbGwgbWFuYWdlZCwgbm9uLXdpcmVkIG1hcHBp
bmdzIGluIHRoZSBnaXZlbiB1c2VyLXNwYWNlCisgKiBwbWFwLiAgVGhpcyBwbWFwIGNhbm5vdCBi
ZSBhY3RpdmUgb24gYW55IHByb2Nlc3NvciBiZXNpZGVzIHRoZQorICogY2FsbGVyLgorICoKKyAq
IFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIGtlcm5lbCBwbWFwLiAgTW9y
ZW92ZXIsIGl0CisgKiBpcyBub3QgaW50ZW5kZWQgZm9yIGdlbmVyYWwgdXNlLiAgSXQgaXMgb25s
eSB0byBiZSB1c2VkIGR1cmluZworICogcHJvY2VzcyB0ZXJtaW5hdGlvbi4gIENvbnNlcXVlbnRs
eSwgaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHdheXMKKyAqIHRoYXQgbWFrZSBpdCBmYXN0ZXIg
dGhhbiBwbWFwX3JlbW92ZSgpLiAgRmlyc3QsIGl0IGNhbiBtb3JlIHF1aWNrbHkKKyAqIGRlc3Ry
b3kgbWFwcGluZ3MgYnkgaXRlcmF0aW5nIG92ZXIgdGhlIHBtYXAncyBjb2xsZWN0aW9uIG9mIFBW
CisgKiBlbnRyaWVzLCByYXRoZXIgdGhhbiBzZWFyY2hpbmcgdGhlIHBhZ2UgdGFibGUuICBTZWNv
bmQsIGl0IGRvZXNuJ3QKKyAqIGhhdmUgdG8gdGVzdCBhbmQgY2xlYXIgdGhlIHBhZ2UgdGFibGUg
ZW50cmllcyBhdG9taWNhbGx5LCBiZWNhdXNlCisgKiBubyBwcm9jZXNzb3IgaXMgY3VycmVudGx5
IGFjY2Vzc2luZyB0aGUgdXNlciBhZGRyZXNzIHNwYWNlLiAgSW4KKyAqIHBhcnRpY3VsYXIsIGEg
cGFnZSB0YWJsZSBlbnRyeSdzIGRpcnR5IGJpdCB3b24ndCBjaGFuZ2Ugc3RhdGUgb25jZQorICog
dGhpcyBmdW5jdGlvbiBzdGFydHMuCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2VzKHBtYXBf
dCBwbWFwKQoreworCXBkX2VudHJ5X3QgcHRlcGRlLCAqcGRlOworCXB0X2VudHJ5X3QgKnB0ZSwg
dHB0ZTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX3BhZ2VfdCBtLCBtcHRlLCBtdDsKKwlw
dl9lbnRyeV90IHB2OworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJc3RydWN0IHB2X2NodW5rICpw
YywgKm5wYzsKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCWludCBiaXQ7CisJdWludDY0X3QgaW51
c2UsIGJpdG1hc2s7CisJaW50IGFsbGZyZWUsIGZpZWxkLCBmcmVlZCwgaWR4OworCWJvb2xlYW5f
dCBzdXBlcnBhZ2U7CisJdm1fcGFkZHJfdCBwYTsKKworCS8qCisJICogQXNzZXJ0IHRoYXQgdGhl
IGdpdmVuIHBtYXAgaXMgb25seSBhY3RpdmUgb24gdGhlIGN1cnJlbnQKKwkgKiBDUFUuICBVbmZv
cnR1bmF0ZWx5LCB3ZSBjYW5ub3QgYmxvY2sgYW5vdGhlciBDUFUgZnJvbQorCSAqIGFjdGl2YXRp
bmcgdGhlIHBtYXAgd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBleGVjdXRpbmcuCisJICovCisJS0FT
U0VSVChwbWFwID09IHZtc3BhY2VfcG1hcChjdXJ0aHJlYWQtPnRkX3Byb2MtPnBfdm1zcGFjZSks
CisJICAgICgiJXM6IG5vbi1jdXJyZW50IHBtYXAgJXAiLCBfX2Z1bmNfXywgcG1hcCkpOworCisJ
bG9jayA9IE5VTEw7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfcmxvY2soJnB2aF9nbG9iYWxf
bG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCVRBSUxRX0ZPUkVBQ0hfU0FGRShwYywgJnBtYXAt
PnBtX3B2Y2h1bmssIHBjX2xpc3QsIG5wYykgeworCQlhbGxmcmVlID0gMTsKKwkJZnJlZWQgPSAw
OworCQlmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaW51c2Ug
PSB+cGMtPnBjX21hcFtmaWVsZF0gJiBwY19mcmVlbWFza1tmaWVsZF07CisJCQl3aGlsZSAoaW51
c2UgIT0gMCkgeworCQkJCWJpdCA9IGZmc2woaW51c2UpIC0gMTsKKwkJCQliaXRtYXNrID0gMVVM
IDw8IGJpdDsKKwkJCQlpZHggPSBmaWVsZCAqIHNpemVvZihpbnVzZSkgKiBOQkJZICsgYml0Owor
CQkJCXB2ID0gJnBjLT5wY19wdmVudHJ5W2lkeF07CisJCQkJaW51c2UgJj0gfmJpdG1hc2s7CisK
KwkJCQlwZGUgPSBwbWFwX3NlZ21hcChwbWFwLCBwdi0+cHZfdmEpOworCQkJCXB0ZXBkZSA9ICpw
ZGU7CisJCQkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShwZGUsIHB2LT5wdl92YSk7CisJCQkJaWYg
KHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJCQlzdXBlcnBhZ2UgPSBUUlVFOworCQkJ
CQlwdGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdXBlcnBhZ2Ug
PSBGQUxTRTsKKwkJCQkJcHRlcGRlID0gKnBkZTsKKwkJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRl
KHBkZSwgcHYtPnB2X3ZhKTsKKwkJCQl9CisJCQkJdHB0ZSA9ICpwdGU7CisJCQkJaWYgKCFwdGVf
aXNfdmFsaWQocHRlKSkgIHsKKwkJCQkJcGFuaWMoIiVzOiBiYWQgJXMgcHRlIHZhICVseCBwdGUg
JWx4IiwKKwkJCQkJICAgIF9fZnVuY19fLCBzdXBlcnBhZ2UgPyAic3VwZXJwYWdlIiA6CisJCQkJ
CSAgICAiIiwgcHYtPnB2X3ZhLCB0cHRlKTsKKwkJCQl9CisKKy8qCisgKiBXZSBjYW5ub3QgcmVt
b3ZlIHdpcmVkIHBhZ2VzIGZyb20gYSBwcm9jZXNzJyBtYXBwaW5nIGF0IHRoaXMgdGltZQorICov
CisJCQkJaWYgKHB0ZV90ZXN0KCZ0cHRlLCBQVEVfVykpIHsKKwkJCQkJYWxsZnJlZSA9IDA7CisJ
CQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHRwdGUpOwor
CQkJCWlmIChzdXBlcnBhZ2UpCisJCQkJCXBhICY9IH5QRFJNQVNLOworCQkJCW0gPSBQSFlTX1RP
X1ZNX1BBR0UocGEpOworCQkJCUtBU1NFUlQobS0+cGh5c19hZGRyID09IHBhLAorCQkJCSAgICAo
IiVzOiB2bV9wYWdlX3QgJXAgcGh5c19hZGRyIG1pc21hdGNoICIKKwkJCQkgICAgIiUwMTZqeCAl
MDE2angiLCBfX2Z1bmNfXywgbSwKKwkJCQkgICAgKHVpbnRtYXhfdCltLT5waHlzX2FkZHIsICh1
aW50bWF4X3QpdHB0ZSkpOworCisJCQkJS0FTU0VSVCgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VT
KSAhPSAwIHx8CisJCQkJICAgIG0gPCAmdm1fcGFnZV9hcnJheVt2bV9wYWdlX2FycmF5X3NpemVd
LAorCQkJCSAgICAoIiVzOiBiYWQgdHB0ZSAlI2p4IiwgX19mdW5jX18sCisJCQkJICAgICh1aW50
bWF4X3QpdHB0ZSkpOworCisJCQkJLyogQ2xlYXIgUFRFICovCisJCQkJaWYgKHN1cGVycGFnZSkK
KwkJCQkJcHRlX3N0b3JlKHB0ZSwgMCk7CisJCQkJZWxzZQorCQkJCQlwdGVfc3RvcmUocHRlLCBp
c19rZXJuZWxfcG1hcChwbWFwKSA/CisJCQkJCSAgICBQVEVfRyA6IDApOworCisJCQkJLyoKKwkJ
CQkgKiBVcGRhdGUgdGhlIHZtX3BhZ2VfdCBjbGVhbiBhbmQgcmVmZXJlbmNlIGJpdHMKKwkJCQkg
Ki8KKwkJCQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9EKSAmJgorCQkJCSAgICAhcHRlX3Rlc3Qo
JnRwdGUsIFBURV9STykpIHsKKwkJCQkJaWYgKHN1cGVycGFnZSkgeworCQkJCQkJdm1fcGFnZV90
IG10OworCisJCQkJCQlmb3IgKG10ID0gbTsgbXQgPCAmbVtOQlBEUiAvIFBBR0VfU0laRV07IG10
KyspCisJCQkJCQkJdm1fcGFnZV9kaXJ0eShtdCk7CisJCQkJCX0gZWxzZQorCQkJCQkJdm1fcGFn
ZV9kaXJ0eShtKTsKKwkJCQl9CisKKwkJCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0Uo
JmxvY2ssIG0pOworCisJCQkJLyogTWFyayBmcmVlICovCisJCQkJcGMtPnBjX21hcFtmaWVsZF0g
fD0gYml0bWFzazsKKwkJCQlpZiAoc3VwZXJwYWdlKSB7CisJCQkJCXBtYXBfcmVzaWRlbnRfY291
bnRfZGVjKHBtYXAsIE5CUERSIC8gUEFHRV9TSVpFKTsKKwkJCQkJcHZoID0gcGFfdG9fcHZoKFRM
QkxPX1BURV9UT19QQSh0cHRlKSk7CisJCQkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBw
diwgcHZfbmV4dCk7CisJCQkJCXB2aC0+cHZfZ2VuKys7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgm
cHZoLT5wdl9saXN0KSkgeworCQkJCQkJZm9yIChtdCA9IG07IG10IDwgJm1bTkJQRFIgLyBQQUdF
X1NJWkVdOyBtdCsrKQorCQkJCQkJCWlmIChUQUlMUV9FTVBUWSgmbXQtPm1kLnB2X2xpc3QpKQor
CQkJCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG10LCBQR0FfV1JJVEVBQkxFKTsKKwkJCQkJfQor
CQkJCQltcHRlID0gcG1hcF9sb29rdXBfcHRfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQkJCQlp
ZiAobXB0ZSAhPSBOVUxMKSB7CisJCQkJCQlwbWFwX3JlbW92ZV9wdF9wYWdlKHBtYXAsIG1wdGUp
OworCQkJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7CisJCQkJCQlLQVNTRVJU
KG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJCQkJICAgICgiJXM6IHB0ZSBwYWdlIHdp
cmUgY291bnQgZXJyb3IiLAorCQkJCQkJICAgIF9fZnVuY19fKSk7CisJCQkJCQltcHRlLT53aXJl
X2NvdW50ID0gMDsKKwkJCQkJCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG1wdGUsICZmcmVl
LCBGQUxTRSk7CisJCQkJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50
LCAxKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVj
KHBtYXAsIDEpOworCQkJCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0
KTsKKwkJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJCWlmICgobS0+YWZsYWdzICYgUEdBX1dSSVRF
QUJMRSkgIT0gMCAmJgorCQkJCQkgICAgVEFJTFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpICYmCisJ
CQkJCSAgICAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCQkJCQlwdmggPSBw
YV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZo
LT5wdl9saXN0KSkKKwkJCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUp
OworCQkJCQl9CisJCQkJfQorCQkJCXBtYXBfdW51c2VfcHQocG1hcCwgcHYtPnB2X3ZhLCBwdGVw
ZGUsICZmcmVlKTsKKwkJCQlmcmVlZCsrOworCQkJfQorCQl9CisJCVBWX1NUQVQoYXRvbWljX2Fk
ZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJUFZfU1RBVChhdG9taWNfYWRkX2lu
dCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2xv
bmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlpZiAoYWxsZnJlZSkgeworCQkJVEFJTFFf
UkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCQlmcmVlX3B2X2NodW5r
KHBjKTsKKwkJfQorCX0KKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOwor
CXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcndfcnVu
bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9
CisKKy8qCisgKiBDbGVhciB0aGUgd3JpdGUgYW5kIG1vZGlmaWVkIGJpdHMgaW4gZWFjaCBvZiB0
aGUgZ2l2ZW4gcGFnZSdzIG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3JlbW92ZV93cml0ZSh2
bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXZtX29mZnNldF90IHZhOwor
CXB2X2VudHJ5X3QgbmV4dF9wdjsKKwlpbnQgcHZoX2dlbjsKKwlwbWFwX3QgcG1hcDsKKwlzdHJ1
Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90IG9sZHB0ZSwg
KnB0ZTsKKwlwdl9lbnRyeV90IHB2OworCWludCBtZF9nZW47CisKKwlLQVNTRVJUKChtLT5vZmxh
Z3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfcmVtb3ZlX3dyaXRlOiBwYWdl
ICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3Qg
ZXhjbHVzaXZlIGJ1c2llZCwgdGhlbiBQR0FfV1JJVEVBQkxFIGNhbm5vdCBiZQorCSAqIHNldCBi
eSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGUgb2JqZWN0IGlzIGxvY2tlZC4gIFRodXMsCisJICog
aWYgUEdBX1dSSVRFQUJMRSBpcyBjbGVhciwgbm8gcGFnZSB0YWJsZSBlbnRyaWVzIG5lZWQgdXBk
YXRpbmcuCisJICovCisJVk1fT0JKRUNUX0FTU0VSVF9XTE9DS0VEKG0tPm9iamVjdCk7CisJaWYg
KCF2bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDAp
CisJCXJldHVybjsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlsb2NrID0gVk1fUEFH
RV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyht
KSk7CityZXRyeV9wdl9sb29wOgorCXJ3X3dsb2NrKGxvY2spOworCWlmICgobS0+ZmxhZ3MgJiBQ
R19GSUNUSVRJT1VTKSAhPSAwKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCVRBSUxRX0ZPUkVB
Q0hfU0FGRShwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCwgbmV4dF9wdikgeworCQlwbWFwID0g
UFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0g
cHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOwor
CQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJ
CVBNQVBfVU5MT0NLKHBtYXApOworCQkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQkJZ290byByZXRy
eV9wdl9sb29wOworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3Bk
ZShwbWFwLCB2YSk7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkgJiYgIXBkZV90ZXN0
KHBkZSwgUFRFX1JPKSkKKwkJCSh2b2lkKXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGRl
LCB2YSwgJmxvY2spOworCQlLQVNTRVJUKGxvY2sgPT0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0so
bSksCisJCSAgICAoImluY29uc2lzdGVudCBwdiBsb2NrICVwICVwIGZvciBwYWdlICVwIiwKKwkJ
ICAgIGxvY2ssIFZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pLCBtKSk7CisJCVBNQVBfVU5MT0NL
KHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5w
dl9saXN0LCBwdl9uZXh0KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RS
WUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCW1kX2dlbiA9IG0t
Pm1kLnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJ
CQlyd193bG9jayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuIHx8CisJCQkg
ICAgbWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ
CXJ3X3d1bmxvY2sobG9jayk7CisJCQkJZ290byByZXRyeV9wdl9sb29wOworCQkJfQorCQl9CisJ
CXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQoIXBkZV9pc19zdXBl
cnBhZ2UocGRlKSwKKwkJICAgICgiJXM6IGZvdW5kIGEgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBw
diBsaXN0IiwKKwkJICAgIF9fZnVuY19fLCBtKSk7CisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShw
ZGUsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQocHRlICE9IE5VTEwgJiYgcHRlX2lzX3ZhbGlkKHB0
ZSksCisJCSAgICAoIiVzOnBhZ2Ugb24gcHZfbGlzdCBoYXMgbm8gcHRlIiwgX19mdW5jX18pKTsK
K3JldHJ5OgorCQlvbGRwdGUgPSAqcHRlOworCQlpZiAoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9S
TykpIHsKKwkJCWlmICghYXRvbWljX2NtcHNldF9sb25nKHB0ZSwgb2xkcHRlLAorCQkJICAgICgo
b2xkcHRlICYgflBURV9EKSB8IFBURV9STykpKQorCQkJCWdvdG8gcmV0cnk7CisJCQlpZiAocHRl
X3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJCXZtX3BhZ2VfZGlydHkobSk7CisJCQlwbWFwX2lu
dmFsaWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQl9CisJCVBNQVBfVU5MT0NLKHBtYXAp
OworCX0KKwl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUpOworCXJ3X3d1bmxv
Y2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKK30KKworI2RlZmluZQlQ
TUFQX1RTX1JFRkVSRU5DRURfTUFYCTUKKworLyotCisgKglwbWFwX3RzX3JlZmVyZW5jZWQ6Cisg
KgorICogIFJldHVybiBhIGNvdW50IG9mIHBhZ2VzIHRoYXQgaGF2ZSBiZWVuIHJlZmVyZW5jZWQs
IGFuZCByZXNldCB0aGUKKyAqICByZWZlcmVuY2UgYml0LiAgSXQgaXMgbm90IG5lY2Vzc2FyeSBm
b3IgZXZlcnkgcmVmZXJlbmNlIGJpdCB0byBiZQorICogIHJlc2V0LCBidXQgaXQgaXMgbmVjZXNz
YXJ5IHRoYXQgMCBvbmx5IGJlIHJldHVybmVkIHdoZW4gdGhlcmUgYXJlCisgKiAgdHJ1bHkgaGF2
ZSBiZWVuIHBhZ2VzIHJlZmVyZW5jZWQuCisgKgorICogIFhYWDogVGhlIGV4YWN0IG51bWJlciBv
ZiBmbGFncyB0byBjaGVjayBhbmQgcmVzZXQgaXMgYSBtYXR0ZXIgdGhhdAorICogIHNob3VsZCBi
ZSB0ZXN0ZWQgYW5kIHN0YW5kYXJkaXplZCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgZm9y
CisgKiAgb3B0aW1hbCBhZ2luZyBvZiBzaGFyZWQgcGFnZXMuCisgKi8KK2ludAorcG1hcF90c19y
ZWZlcmVuY2VkKHZtX3BhZ2VfdCBtKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHZfZW50
cnlfdCBwdiwgcHZmOworCXBtYXBfdCBwbWFwOworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcGRf
ZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9w
YWRkcl90IHBhOworCWludCBjbGVhcmVkLCBtZF9nZW4sIG5vdF9jbGVhcmVkLCBwdmhfZ2VuOwor
CisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFw
X3RzX3JlZmVyZW5jZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJY2xlYXJlZCA9
IDA7CisJcGEgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisJbG9jayA9IFBIWVNfVE9fUFZfTElTVF9M
T0NLKHBhKTsKKwlwdmggPSBwYV90b19wdmgocGEpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xv
Y2spOworCXJ3X3dsb2NrKGxvY2spOworcmV0cnk6CisJbm90X2NsZWFyZWQgPSAwOworCWlmICgo
bS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSAhPSAwIHx8CisJICAgIChwdmYgPSBUQUlMUV9GSVJT
VCgmcHZoLT5wdl9saXN0KSkgPT0gTlVMTCkKKwkJZ290byBzbWFsbF9tYXBwaW5nczsKKwlwdiA9
IHB2ZjsKKwlkbyB7CisJCWlmIChwdmYgPT0gTlVMTCkKKwkJCXB2ZiA9IHB2OworCQlwbWFwID0g
UFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0g
cHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOwor
CQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJ
CVBNQVBfVU5MT0NLKHBtYXApOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKwkJdmEgPSBw
di0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCWlmIChwdGVf
aXNfcmVmKChwdF9lbnRyeV90ICopcGRlKSkgeworCQkJLyoKKwkJCSAqIFNpbmNlIHRoaXMgcmVm
ZXJlbmNlIGJpdCBpcyBzaGFyZWQgYnkgNTEyIDRLQgorCQkJICogcGFnZXMsIGl0IHNob3VsZCBu
b3QgYmUgY2xlYXJlZCBldmVyeSB0aW1lIGl0IGlzCisJCQkgKiB0ZXN0ZWQuICBBcHBseSBhIHNp
bXBsZSAiaGFzaCIgZnVuY3Rpb24gb24gdGhlCisJCQkgKiBwaHlzaWNhbCBwYWdlIG51bWJlciwg
dGhlIHZpcnR1YWwgc3VwZXJwYWdlIG51bWJlciwKKwkJCSAqIGFuZCB0aGUgcG1hcCBhZGRyZXNz
IHRvIHNlbGVjdCBvbmUgNEtCIHBhZ2Ugb3V0IG9mCisJCQkgKiB0aGUgNTEyIG9uIHdoaWNoIHRl
c3RpbmcgdGhlIHJlZmVyZW5jZSBiaXQgd2lsbAorCQkJICogcmVzdWx0IGluIGNsZWFyaW5nIHRo
YXQgcmVmZXJlbmNlIGJpdC4gIFRoaXMKKwkJCSAqIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGF2
b2lkIHRoZSBzZWxlY3Rpb24gb2YgdGhlCisJCQkgKiBzYW1lIDRLQiBwYWdlIGZvciBldmVyeSAy
TUIgcGFnZSBtYXBwaW5nLgorCQkJICoKKwkJCSAqIE9uIGRlbW90aW9uLCBhIG1hcHBpbmcgdGhh
dCBoYXNuJ3QgYmVlbiByZWZlcmVuY2VkCisJCQkgKiBpcyBzaW1wbHkgZGVzdHJveWVkLiAgVG8g
YXZvaWQgdGhlIHBvc3NpYmlsaXR5IG9mIGEKKwkJCSAqIHN1YnNlcXVlbnQgcGFnZSBmYXVsdCBv
biBhIGRlbW90ZWQgd2lyZWQgbWFwcGluZywKKwkJCSAqIGFsd2F5cyBsZWF2ZSBpdHMgcmVmZXJl
bmNlIGJpdCBzZXQuICBNb3Jlb3ZlciwKKwkJCSAqIHNpbmNlIHRoZSBzdXBlcnBhZ2UgaXMgd2ly
ZWQsIHRoZSBjdXJyZW50IHN0YXRlIG9mCisJCQkgKiBpdHMgcmVmZXJlbmNlIGJpdCB3b24ndCBh
ZmZlY3QgcGFnZSByZXBsYWNlbWVudC4KKwkJCSAqLworCQkJaWYgKCgoKHBhID4+IFBBR0VfU0hJ
RlQpIF4gKHB2LT5wdl92YSA+PiBQRFJTSElGVCkgXgorCQkJICAgICh1aW50cHRyX3QpcG1hcCkg
JiAoTlBURVBHIC0gMSkpID09IDAgJiYKKwkJCSAgICAhcGRlX3Rlc3QocGRlLCBQVEVfVykpIHsK
KwkJCQlhdG9taWNfY2xlYXJfbG9uZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1JFRik7CisJCQkJ
cG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCQljbGVhcmVkKys7CisJ
CQl9IGVsc2UKKwkJCQlub3RfY2xlYXJlZCsrOworCisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7
CisJCS8qIFJvdGF0ZSB0aGUgUFYgbGlzdCBpZiBpdCBoYXMgbW9yZSB0aGFuIG9uZSBlbnRyeS4g
Ki8KKwkJaWYgKHB2ICE9IE5VTEwgJiYgVEFJTFFfTkVYVChwdiwgcHZfbmV4dCkgIT0gTlVMTCkg
eworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCVRBSUxR
X0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJfQorCQlpZiAoKGNs
ZWFyZWQgKyBub3RfY2xlYXJlZCkgPj0gUE1BUF9UU19SRUZFUkVOQ0VEX01BWCkKKwkJCWdvdG8g
b3V0OworCX0gd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBwdmYp
Oworc21hbGxfbWFwcGluZ3M6CisJaWYgKChwdmYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlz
dCkpID09IE5VTEwpCisJCWdvdG8gb3V0OworCXB2ID0gcHZmOworCWRvIHsKKwkJaWYgKHB2ZiA9
PSBOVUxMKQorCQkJcHZmID0gcHY7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQ
X1RSWUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCW1kX2dlbiA9
IG0tPm1kLnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7
CisJCQlyd193bG9jayhsb2NrKTsKKwkJCWlmICgKKwkJCSAgICBwdmhfZ2VuICE9IHB2aC0+cHZf
Z2VuIHx8CisJCQkgICAgbWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NL
KHBtYXApOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKworCQlwZGUgPSBwbWFwX3BkZShw
bWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKCFwZGVfaXNfc3VwZXJwYWdlKHBkZSksCisJCSAg
ICAoInBtYXBfdHNfcmVmZXJlbmNlZDogZm91bmQgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBwdiBs
aXN0IiwKKwkJICAgIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgcHYtPnB2X3Zh
KTsKKwkJaWYgKHB0ZV9pc19yZWYocHRlKSkgeworCQkJYXRvbWljX2NsZWFyX2xvbmcoKHB0X2Vu
dHJ5X3QgKilwZGUsIFBURV9SRUYpOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYt
PnB2X3ZhKTsKKwkJCWNsZWFyZWQrKzsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJLyog
Um90YXRlIHRoZSBQViBsaXN0IGlmIGl0IGhhcyBtb3JlIHRoYW4gb25lIGVudHJ5LiAqLworCQlp
ZiAocHYgIT0gTlVMTCAmJiBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSAhPSBOVUxMKSB7CisJCQlU
QUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCVRBSUxRX0lOU0VS
VF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQltLT5tZC5wdl9nZW4rKzsK
KwkJfQorCX0gd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KSkgIT0gcHZm
ICYmIGNsZWFyZWQgKworCSAgICBub3RfY2xlYXJlZCA8IFBNQVBfVFNfUkVGRVJFTkNFRF9NQVgp
Oworb3V0OgorCXJ3X3d1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2Nr
KTsKKwlyZXR1cm4gKGNsZWFyZWQgKyBub3RfY2xlYXJlZCk7Cit9CisKK3N0YXRpYyBib29sZWFu
X3QKK3BtYXBfcGFnZV90ZXN0X21hcHBpbmdzKHZtX3BhZ2VfdCBtLCBib29sZWFuX3QgYWNjZXNz
ZWQsIGJvb2xlYW5fdCBtb2RpZmllZCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXB2X2Vu
dHJ5X3QgcHY7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdF9lbnRyeV90ICpwdGU7CisJcG1h
cF90IHBtYXA7CisJaW50IG1kX2dlbiwgcHZoX2dlbjsKKwlib29sZWFuX3QgcnY7CisKKwlydiA9
IEZBTFNFOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sgPSBWTV9QQUdFX1RP
X1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKK3Jlc3RhcnQ6CisJVEFJTFFfRk9S
RUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYp
OworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJIG1kX2dlbiA9IG0tPm1kLnB2X2dl
bjsKKwkJCSByd19ydW5sb2NrKGxvY2spOworCQkJIFBNQVBfTE9DSyhwbWFwKTsKKwkJCSByd19y
bG9jayhsb2NrKTsKKwkJCSBpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCSBQTUFQ
X1VOTE9DSyhwbWFwKTsKKwkJCQkgZ290byByZXN0YXJ0OworCQkJIH0KKwkJfQorCQlwdGUgPSBw
bWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOworCQlpZiAobW9kaWZpZWQpIHsKKwkJCXJ2ID0gcHRl
X3Rlc3QocHRlLCBQVEVfRCkgJiYgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKTsKKwkJCWlmIChhY2Nl
c3NlZCkKKwkJCQlydiA9IHJ2ICYmIHB0ZV9pc192YWxpZChwdGUpICYmIHB0ZV9pc19yZWYocHRl
KTsKKwkJfSBlbHNlIGlmIChhY2Nlc3NlZCkgeworCQkJcnYgPSBwdGVfaXNfdmFsaWQocHRlKSAm
JiBwdGVfaXNfcmVmKHB0ZSk7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCWlmIChydikK
KwkJCWdvdG8gb3V0OworCX0KKwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkg
eworCQlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFD
SChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCkgeworCQkJcG1hcCA9IFBWX1BNQVAocHYpOwor
CQkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47
CisJCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJCXJ3X3J1bmxvY2sobG9jayk7CisJCQkJ
UE1BUF9MT0NLKHBtYXApOworCQkJCXJ3X3Jsb2NrKGxvY2spOworCQkJCWlmIChtZF9nZW4gIT0g
bS0+bWQucHZfZ2VuIHx8CisJCQkJICAgIHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4pIHsKKwkJCQkJ
UE1BUF9VTkxPQ0socG1hcCk7CisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQl9CisJCQl9CisJCQlw
dGUgPSAocHRfZW50cnlfdCAqKXBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCQlpZiAobW9k
aWZpZWQpIHsKKwkJCQlydiA9IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmCisJCQkJICAgICFwdGVf
dGVzdChwdGUsIFBURV9STyk7CisJCQkJaWYgKGFjY2Vzc2VkKQorCQkJCQlydiA9IHJ2ICYmIHB0
ZV9pc192YWxpZChwdGUpICYmCisJCQkJCSAgICBwdGVfaXNfcmVmKHB0ZSk7CisJCQl9IGVsc2Ug
aWYgKGFjY2Vzc2VkKSB7CisJCQkJcnYgPSBwdGVfaXNfdmFsaWQocHRlKSAmJgorCQkJCSAgICBw
dGVfaXNfcmVmKHB0ZSk7CisJCQl9CisJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCWlmIChydikK
KwkJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlyd19ydW5sb2NrKGxvY2spOworCXJ3X3J1
bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChydik7Cit9CisKKworLyoKKyAqCXBt
YXBfaXNfbW9kaWZpZWQ6CisgKgorICoJUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZp
ZWQgcGh5c2ljYWwgcGFnZSB3YXMgbW9kaWZpZWQKKyAqCWluIGFueSBwaHlzaWNhbCBtYXBzLgor
ICovCitib29sZWFuX3QKK3BtYXBfaXNfbW9kaWZpZWQodm1fcGFnZV90IG0pCit7CisKKwlLQVNT
RVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfaXNfbW9k
aWZpZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisKKwkvKgorCSAqIElmIHRoZSBw
YWdlIGlzIG5vdCBleGNsdXNpdmUgYnVzaWVkLCB0aGVuIFBHQV9XUklURUFCTEUgY2Fubm90IGJl
CisJICogY29uY3VycmVudGx5IHNldCB3aGlsZSB0aGUgb2JqZWN0IGlzIGxvY2tlZC4gIFRodXMs
IGlmIFBHQV9XUklURUFCTEUKKwkgKiBpcyBjbGVhciwgbm8gUFRFcyBjYW4gaGF2ZSBQVEVfRCBz
ZXQuCisJICovCisJVk1fT0JKRUNUX0FTU0VSVF9XTE9DS0VEKG0tPm9iamVjdCk7CisJaWYgKCF2
bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCisJ
CXJldHVybiAoRkFMU0UpOworCXJldHVybiAocG1hcF9wYWdlX3Rlc3RfbWFwcGluZ3MobSwgRkFM
U0UsIFRSVUUpKTsKK30KKworLyoKKyAqCXBtYXBfaXNfcHJlZmF1bHRhYmxlOgorICoKKyAqCVJl
dHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyBpcyBlbGdp
YmxlCisgKglmb3IgcHJlZmF1bHQuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9pc19wcmVmYXVsdGFi
bGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIpCit7CisJcGRfZW50cnlfdCAqcGRlOwor
CXB0X2VudHJ5X3QgKnB0ZTsKKwlib29sZWFuX3QgcnY7CisKKwlydiA9IEZBTFNFOworCVBNQVBf
TE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFwX3BkZShwbWFwLCBhZGRyKTsKKwlpZiAocGRlICE9IE5V
TEwgJiYgKnBkZSAhPSAwKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQlw
dGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJZWxzZQorCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRl
KHBkZSwgYWRkcik7CisJCXJ2ID0gKCpwdGUgPT0gMCkgfHwgKCpwdGUgPT0gUFRFX0cpOworCX0K
KwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqCXBtYXBfaXNf
cmVmZXJlbmNlZDoKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBw
aHlzaWNhbCBwYWdlIHdhcyByZWZlcmVuY2VkCisgKglpbiBhbnkgcGh5c2ljYWwgbWFwcy4KKyAq
LworYm9vbGVhbl90CitwbWFwX2lzX3JlZmVyZW5jZWQodm1fcGFnZV90IG0pCit7CisKKwlLQVNT
RVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfaXNfcmVm
ZXJlbmNlZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwlyZXR1cm4gKHBtYXBfcGFn
ZV90ZXN0X21hcHBpbmdzKG0sIFRSVUUsIEZBTFNFKSk7Cit9CisKKy8qCisgKglBcHBseSB0aGUg
Z2l2ZW4gYWR2aWNlIHRvIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgYWRkcmVzc2VzIHdpdGhpbiB0
aGUKKyAqCWdpdmVuIHBtYXAuICBEZXBlbmRpbmcgb24gdGhlIGFkdmljZSwgY2xlYXIgdGhlIHJl
ZmVyZW5jZWQgYW5kL29yCisgKgltb2RpZmllZCBmbGFncyBpbiBlYWNoIG1hcHBpbmcgYW5kIHNl
dCB0aGUgbWFwcGVkIHBhZ2UncyBkaXJ0eSBmaWVsZC4KKyAqLwordm9pZAorcG1hcF9hZHZpc2Uo
cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhLCBpbnQgYWR2aWNl
KQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRwZSwgb2xk
cGRlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YV9uZXh0OworCXZtX3BhZ2Vf
dCBtOworCWJvb2xlYW5fdCBhbnljaGFuZ2VkLCBwdl9saXN0c19sb2NrZWQ7CisKKwlpZiAoYWR2
aWNlICE9IE1BRFZfRE9OVE5FRUQgJiYgYWR2aWNlICE9IE1BRFZfRlJFRSkKKwkJcmV0dXJuOwor
CisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdlZCA9IEZBTFNF
OworCVBNQVBfTE9DSyhwbWFwKTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7
CisJCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gMCkgewor
CQkJdmFfbmV4dCA9IChzdmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwg
c3ZhKQorCQkJCXZhX25leHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0g
KHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25l
eHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShwZHBlLCBzdmEpOworCQlvbGRw
ZGUgPSAqcGRlOworCQlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSAwKQorCQkJY29udGludWU7
CisJCWVsc2UgaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJaWYgKCFwZGVfdGVz
dCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpCisJCQkJY29udGludWU7CisJCQlpZiAoIXB2X2xpc3Rz
X2xvY2tlZCkgeworCQkJCXB2X2xpc3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJaWYgKCFyd190cnlf
cmxvY2soJnB2aF9nbG9iYWxfbG9jaykpIHsKKwkJCQkJaWYgKGFueWNoYW5nZWQpCisJCQkJCQlw
bWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCQkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJ
cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCWdvdG8gcmVzdW1lOworCQkJCX0KKwkJ
CX0KKwkJCWxvY2sgPSBOVUxMOworCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBtYXAs
IHBkZSwgc3ZhLCAmbG9jaykpIHsKKwkJCQlpZiAobG9jayAhPSBOVUxMKQorCQkJCQlyd193dW5s
b2NrKGxvY2spOworCisJCQkJLyoKKwkJCQkgKiBUaGUgc3VwZXJwYWdlIG1hcHBpbmcgd2FzIGRl
c3Ryb3llZC4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFVu
bGVzcyB0aGUgcGFnZSBtYXBwaW5ncyBhcmUgd2lyZWQsIHJlbW92ZSB0aGUKKwkJCSAqIG1hcHBp
bmcgdG8gYSBzaW5nbGUgcGFnZSBzbyB0aGF0IGEgc3Vic2VxdWVudAorCQkJICogYWNjZXNzIG1h
eSByZXByb21vdGUuICBTaW5jZSB0aGUgdW5kZXJseWluZyBwYWdlCisJCQkgKiB0YWJsZSBwYWdl
IGlzIGZ1bGx5IHBvcHVsYXRlZCwgdGhpcyByZW1vdmFsIG5ldmVyCisJCQkgKiBmcmVlcyBhIHBh
Z2UgdGFibGUgcGFnZS4KKwkJCSAqLworCQkJaWYgKCFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfVykp
IHsKKwkJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOworCQkJCUtBU1NFUlQocHRl
X3Rlc3QocHRlLCBQVEVfVkFMSUQpLAorCQkJCSAgICAoInBtYXBfYWR2aXNlOiBpbnZhbGlkIFBU
RSIpKTsKKwkJCQlwbWFwX3JlbW92ZV9wdGUocG1hcCwgcHRlLCBzdmEsICpwZGUsIE5VTEwsCisJ
CQkJICAgICZsb2NrKTsKKwkJCQlhbnljaGFuZ2VkID0gVFJVRTsKKwkJCX0KKwkJCWlmIChsb2Nr
ICE9IE5VTEwpCisJCQkJcndfd3VubG9jayhsb2NrKTsKKwkJfQorCQkvKgorCQkgKiBMaW1pdCBv
dXIgc2NhbiB0byBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgdmEgcmVwcmVzZW50ZWQKKwkJICogYnkg
dGhlIGN1cnJlbnQgcGFnZSB0YWJsZSBwYWdlLCBvciB0byB0aGUgZW5kIG9mIHRoZQorCQkgKiBy
YW5nZSBiZWluZyB3cml0ZSBwcm90ZWN0ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkK
KwkJCXZhX25leHQgPSBldmE7CisKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBz
dmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7CisJ
CQlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8ICFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VEKSkK
KwkJCQljb250aW51ZTsKKwkJCWVsc2UgaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmCisJCQkg
ICAgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKSkgeworCQkJCWlmIChhZHZpY2UgPT0gTUFEVl9ET05U
TkVFRCkgeworCQkJCQkvKgorCQkJCQkgKiBGdXR1cmUgY2FsbHMgdG8gcG1hcF9pc19tb2RpZmll
ZCgpCisJCQkJCSAqIGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyB0aGUgcGFnZQorCQkJCQkgKiBk
aXJ0eSBub3cuCisJCQkJCSAqLworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKAorCQkJCQkgICAg
VExCTE9fUFRFX1RPX1BBKCpwdGUpKTsKKwkJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCQl9CisJ
CQkJcHRlX2F0b21pY19jbGVhcihwdGUsIFBURV9EIHwgUFRFX1JFRik7CisJCQl9IGVsc2UgaWYg
KHB0ZV9pc19yZWYocHRlKSkKKwkJCQlwdGVfYXRvbWljX2NsZWFyKHB0ZSwgUFRFX1JFRik7CisJ
CQllbHNlCisJCQkJY29udGludWU7CisJCQlpZiAocHRlX3Rlc3QocHRlLCBQVEVfRykpCisJCQkJ
cG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgc3ZhKTsKKwkJCWVsc2UKKwkJCQlhbnljaGFuZ2Vk
ID0gVFJVRTsKKwkJfQorCX0KKwlpZiAoYW55Y2hhbmdlZCkKKwkJcG1hcF9pbnZhbGlkYXRlX2Fs
bChwbWFwKTsKKwlpZiAocHZfbGlzdHNfbG9ja2VkKSB7CisJCXJ3X3J1bmxvY2soJnB2aF9nbG9i
YWxfbG9jayk7CisJfQorCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisvKgorICoJQ2xlYXIgdGhl
IG1vZGlmeSBiaXRzIG9uIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZS4KKyAqLwordm9pZAor
cG1hcF9jbGVhcl9tb2RpZnkodm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsK
KwlwbWFwX3QgcG1hcDsKKwlwdl9lbnRyeV90IG5leHRfcHYsIHB2OworCXBkX2VudHJ5X3Qgb2xk
cGRlLCAqcGRlOworCXB0X2VudHJ5X3Qgb2xkcHRlLCAqcHRlOworCXN0cnVjdCByd2xvY2sgKmxv
Y2s7CisJdm1fb2Zmc2V0X3QgdmE7CisJaW50IG1kX2dlbiwgcHZoX2dlbjsKKworCUtBU1NFUlQo
KG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9jbGVhcl9tb2Rp
Znk6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJVk1fT0JKRUNUX0FTU0VSVF9XTE9D
S0VEKG0tPm9iamVjdCk7CisJS0FTU0VSVCghdm1fcGFnZV94YnVzaWVkKG0pLAorCSAgICAoInBt
YXBfY2xlYXJfbW9kaWZ5OiBwYWdlICVwIGlzIGV4Y2x1c2l2ZSBidXNpZWQiLCBtKSk7CisKKwkv
KgorCSAqIElmIHRoZSBwYWdlIGlzIG5vdCBQR0FfV1JJVEVBQkxFLCB0aGVuIG5vIFBURXMgY2Fu
IGhhdmUgUFRFX0Qgc2V0LgorCSAqIElmIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgcGFnZSBp
cyBsb2NrZWQgYW5kIHRoZSBwYWdlIGlzIG5vdAorCSAqIHdyaXRlIGJ1c2llZCwgdGhlbiBQR0Ff
V1JJVEVBQkxFIGNhbm5vdCBiZSBjb25jdXJyZW50bHkgc2V0LgorCSAqLworCWlmICgobS0+YWZs
YWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJuOworCXB2aCA9IHBhX3RvX3B2aChW
TV9QQUdFX1RPX1BIWVMobSkpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sg
PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd193bG9jayhsb2NrKTsKK3Jlc3RhcnQ6
CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdvdG8gc21hbGxfbWFw
cGluZ3M7CisJVEFJTFFfRk9SRUFDSF9TQUZFKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0LCBu
ZXh0X3B2KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1h
cCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJ
CQlQTUFQX0xPQ0socG1hcCk7CisJCQlyd193bG9jayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9
IHB2aC0+cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJZ290byByZXN0YXJ0
OworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2
YSk7CisJCW9sZHBkZSA9ICpwZGU7CisJCWlmICghcGRlX3Rlc3QocGRlLCBQVEVfUk8pKSB7CisJ
CQlpZiAocG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHZhLCAmbG9jaykpIHsKKwkJ
CQlpZiAoIXBkZV90ZXN0KCZvbGRwZGUsIFBURV9XKSkgeworCQkJCQkvKgorCQkJCQkgKiBXcml0
ZSBwcm90ZWN0IHRoZSBtYXBwaW5nIHRvIGEKKwkJCQkJICogc2luZ2xlIHBhZ2Ugc28gdGhhdCBh
IHN1YnNlcXVlbnQKKwkJCQkJICogd3JpdGUgYWNjZXNzIG1heSByZXByb21vdGUuCisJCQkJCSAq
LworCQkJCQl2YSArPSBWTV9QQUdFX1RPX1BIWVMobSkgLQorCQkJCQkgICBUTEJMT19QREVfVE9f
UEEob2xkcGRlKTsKKwkJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCQkJCQlv
bGRwdGUgPSAqcHRlOworCQkJCQlpZiAoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9WQUxJRCkpIHsK
KwkJCQkJCXdoaWxlICghYXRvbWljX2NtcHNldF9sb25nKHB0ZSwKKwkJCQkJCSAgICBvbGRwdGUs
CisJCQkJCQkgICAgKG9sZHB0ZSAmIH5QVEVfRCkgfCBQVEVfUk8pKQorCQkJCQkJCW9sZHB0ZSA9
ICpwdGU7CisJCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3Bh
Z2UocG1hcCwgdmEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCVBNQVBfVU5MT0NLKHBt
YXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s
aXN0LCBwdl9uZXh0KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxP
Q0socG1hcCkpIHsKKwkJCW1kX2dlbiA9IG0tPm1kLnB2X2dlbjsKKwkJCXB2aF9nZW4gPSBwdmgt
PnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCQly
d193bG9jayhsb2NrKTsKKwkJCWlmIChtZF9nZW4gIT0gbS0+bWQucHZfZ2VuIHx8IG1kX2dlbiAh
PSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3Rh
cnQ7CisJCQl9CisJCX0KKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FT
U0VSVCghcGRlX2lzX3N1cGVycGFnZShwZGUpLCAoInBtYXBfY2xlYXJfbW9kaWZ5OiBmb3VuZCIK
KwkJICAgICIgYSBzdXBlcnBhZ2UgaW4gcGFnZSAlcCdzIHB2IGxpc3QiLCBtKSk7CisJCXB0ZSA9
IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisJCWlmIChwdGVfdGVzdChwdGUsIFBU
RV9EKSAmJiAhcHRlX3Rlc3QocHRlLCBQVEVfUk8pKSB7CisJCQlwdGVfYXRvbWljX2NsZWFyKHB0
ZSwgUFRFX0QpOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJ
fQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CisJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5s
b2NrKCZwdmhfZ2xvYmFsX2xvY2spOworfQorCisvKgorICogTWlzY2VsbGFuZW91cyBzdXBwb3J0
IHJvdXRpbmVzIGZvbGxvdworICovCisKKy8qCisgKiBNYXAgYSBzZXQgb2YgcGh5c2ljYWwgbWVt
b3J5IHBhZ2VzIGludG8gdGhlIGtlcm5lbCB2aXJ0dWFsCisgKiBhZGRyZXNzIHNwYWNlLiBSZXR1
cm4gYSBwb2ludGVyIHRvIHdoZXJlIGl0IGlzIG1hcHBlZC4gVGhpcworICogcm91dGluZSBpcyBp
bnRlbmRlZCB0byBiZSB1c2VkIGZvciBtYXBwaW5nIGRldmljZSBtZW1vcnksCisgKiBOT1QgcmVh
bCBtZW1vcnkuCisgKgorICogVXNlIFhLUEhZUyB1bmNhY2hlZCBmb3IgNjQgYml0LgorICovCit2
b2lkICoKK3BtYXBfbWFwZGV2KHZtX3BhZGRyX3QgcGEsIHZtX3NpemVfdCBzaXplKQoreworCisJ
cmV0dXJuICgodm9pZCAqKU1JUFNfUEhZU19UT19ESVJFQ1RfVU5DQUNIRUQocGEpKTsKK30KKwor
dm9pZAorcG1hcF91bm1hcGRldih2bV9vZmZzZXRfdCB2YSwgdm1fc2l6ZV90IHNpemUpCit7CisK
KwkvKiBOb3RoaW5nIHRvIGRvIGZvciBtaXBzNjQuICovCit9CisKKy8qCisgKiBTZXRzIHRoZSBt
ZW1vcnkgYXR0cmlidXRlIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KK3ZvaWQKK3BtYXBf
cGFnZV9zZXRfbWVtYXR0cih2bV9wYWdlX3QgbSwgdm1fbWVtYXR0cl90IG1hKQoreworCS8qCisJ
ICogU2V0IHRoZSBtZW1hdHRyIGZpZWxkIHNvIHRoZSBhcHByb3ByaWF0ZSBiaXRzIGFyZSBzZXQg
aW4gdGhlCisJICogUFRFIGFzIG1hcHBpbmdzIGFyZSBjcmVhdGVkLgorCSAqLworCW0tPm1kLnB2
X21lbWF0dHIgPSBtYTsKKworCS8qCisJICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgZnVuY3Rp
b24gaXMgb25seSBjYWxsZWQgYmVmb3JlIGFueSBtYXBwaW5ncworCSAqIGFyZSBlc3RhYmxpc2hl
ZC4gIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsCisJICog
bmVlZCB0byB3YWxrIHRoZSBwdl9saXN0IGFuZCBtYWtlIGVhY2ggb2YgdGhlIGV4aXN0aW5nIG1h
cHBpbmdzCisJICogdW5jYWNoZWFibGUsIHN5bmMgdGhlIGNhY2hlICh3aXRoIG1pcHNfaWNhY2hl
X3N5bmNfYWxsKCkgYW5kCisJICogbWlwc19kY2FjaGVfd2JpbnZfYWxsKCkpIGFuZCBtb3N0IGxp
a2VseSBpbnZhbGlkYXRlIFRMQiBlbnRyaWVzIGZvcgorCSAqIGFueSBvZiB0aGUgY3VycmVudCBt
YXBwaW5ncyBpdCBtb2RpZmllcy4KKwkgKi8KKwlpZiAoVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xp
c3QpICE9IE5VTEwpCisJCXBhbmljKCJDYW4ndCBjaGFuZ2UgbWVtYXR0ciBvbiBwYWdlIHdpdGgg
ZXhpc3RpbmcgbWFwcGluZ3MiKTsKK30KKworLyoKKyAqIHBlcmZvcm0gdGhlIHBtYXAgd29yayBm
b3IgbWluY29yZQorICovCitpbnQKK3BtYXBfbWluY29yZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgYWRkciwgdm1fcGFkZHJfdCAqbG9ja2VkX3BhKQoreworCXBkX2VudHJ5X3QgKnBkZXA7CisJ
cHRfZW50cnlfdCAqcHRlcCwgcHRlOworCXZtX3BhZGRyX3QgcGE7CisJaW50IHZhbDsKKworCVBN
QVBfTE9DSyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCBhZGRyKTsKKwlp
ZiAocGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZXApKSB7CisJ
CQlwdGUgPSAocHRfZW50cnlfdCkqcGRlcDsKKwkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7
CisJCQl2YWwgPSBNSU5DT1JFX1NVUEVSOworCQl9IGVsc2UgeworCQkJcHRlcCA9IHBtYXBfcGRl
X3RvX3B0ZShwZGVwLCBhZGRyKTsKKwkJCXB0ZSA9IChwdGVwICE9IE5VTEwpID8gKnB0ZXAgOiAw
OworCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKKwkJCXZhbCA9IDA7CisJCX0KKwl9IGVs
c2UgeworCQlwdGUgPSAwOworCQlwYSA9IDA7CisJCXZhbCA9IDA7CisJfQorCWlmIChwdGVfaXNf
dmFsaWQoJnB0ZSkpIHsKKwkJdmFsIHw9IE1JTkNPUkVfSU5DT1JFOworCQlpZiAocHRlX3Rlc3Qo
JnB0ZSwgUFRFX0QpKQorCQkJdmFsIHw9IE1JTkNPUkVfTU9ESUZJRUQgfCBNSU5DT1JFX01PRElG
SUVEX09USEVSOworCQlpZiAocHRlX2lzX3JlZigmcHRlKSkKKwkJCXZhbCB8PSBNSU5DT1JFX1JF
RkVSRU5DRUQgfCBNSU5DT1JFX1JFRkVSRU5DRURfT1RIRVI7CisJfQorCWlmICgodmFsICYgKE1J
TkNPUkVfTU9ESUZJRURfT1RIRVIgfCBNSU5DT1JFX1JFRkVSRU5DRURfT1RIRVIpKSAhPQorCSAg
ICAoTUlOQ09SRV9NT0RJRklFRF9PVEhFUiB8IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUikgJiYK
KwkgICAgcHRlX3Rlc3QoJnB0ZSwgUFRFX01BTkFHRUQpKSB7CisJCS8qIEVuc3VyZSB0aGF0ICJQ
SFlTX1RPX1ZNX1BBR0UocGEpLT5vYmplY3QiIGRvZXNuJ3QgY2hhbmdlLiAqLworCQlpZiAodm1f
cGFnZV9wYV90cnlyZWxvY2socG1hcCwgcGEsIGxvY2tlZF9wYSkpCisJCQlnb3RvIHJldHJ5Owor
CX0gZWxzZQorCQlQQV9VTkxPQ0tfQ09ORCgqbG9ja2VkX3BhKTsKKwlQTUFQX1VOTE9DSyhwbWFw
KTsKKwlyZXR1cm4gKHZhbCk7Cit9CisKK3ZvaWQKK3BtYXBfYWN0aXZhdGUoc3RydWN0IHRocmVh
ZCAqdGQpCit7CisJcG1hcF90IHBtYXAsIG9sZHBtYXA7CisJc3RydWN0IHByb2MgKnAgPSB0ZC0+
dGRfcHJvYzsKKwl1X2ludCBjcHVpZDsKKworCWNyaXRpY2FsX2VudGVyKCk7CisKKwlwbWFwID0g
dm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJb2xkcG1hcCA9IFBDUFVfR0VUKGN1cnBtYXAp
OworCWNwdWlkID0gUENQVV9HRVQoY3B1aWQpOworCisJaWYgKG9sZHBtYXApCisJCUNQVV9DTFJf
QVRPTUlDKGNwdWlkLCAmb2xkcG1hcC0+cG1fYWN0aXZlKTsKKwlDUFVfU0VUX0FUT01JQyhjcHVp
ZCwgJnBtYXAtPnBtX2FjdGl2ZSk7CisJcG1hcF9hc2lkX2FsbG9jKHBtYXApOworCWlmICh0ZCA9
PSBjdXJ0aHJlYWQpIHsKKwkJUENQVV9TRVQoc2VnYmFzZSwgcG1hcC0+cG1fc2VndGFiKTsKKwkJ
bWlwc193cl9lbnRyeWhpKHBtYXAtPnBtX2FzaWRbY3B1aWRdLmFzaWQpOworCX0KKworCVBDUFVf
U0VUKGN1cnBtYXAsIHBtYXApOworCWNyaXRpY2FsX2V4aXQoKTsKK30KKwordm9pZAorcG1hcF9z
eW5jX2ljYWNoZShwbWFwX3QgcG0sIHZtX29mZnNldF90IHZhLCB2bV9zaXplX3Qgc3opCit7Cit9
CisKKy8qCisgKglJbmNyZWFzZSB0aGUgc3RhcnRpbmcgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBn
aXZlbiBtYXBwaW5nIGlmIGEKKyAqCWRpZmZlcmVudCBhbGlnbm1lbnQgbWlnaHQgcmVzdWx0IGlu
IG1vcmUgc3VwZXJwYWdlIG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX2FsaWduX3N1cGVycGFn
ZSh2bV9vYmplY3RfdCBvYmplY3QsIHZtX29vZmZzZXRfdCBvZmZzZXQsCisgICAgdm1fb2Zmc2V0
X3QgKmFkZHIsIHZtX3NpemVfdCBzaXplKQoreworCXZtX29mZnNldF90IHN1cGVycGFnZV9vZmZz
ZXQ7CisKKwlpZiAoc2l6ZSA8IE5CU0VHKQorCQlyZXR1cm47CisJaWYgKG9iamVjdCAhPSBOVUxM
ICYmIChvYmplY3QtPmZsYWdzICYgT0JKX0NPTE9SRUQpICE9IDApCisJCW9mZnNldCArPSBwdG9h
KG9iamVjdC0+cGdfY29sb3IpOworCXN1cGVycGFnZV9vZmZzZXQgPSBvZmZzZXQgJiBTRUdNQVNL
OworCWlmIChzaXplIC0gKChOQlNFRyAtIHN1cGVycGFnZV9vZmZzZXQpICYgU0VHTUFTSykgPCBO
QlNFRyB8fAorCSAgICAoKmFkZHIgJiBTRUdNQVNLKSA9PSBzdXBlcnBhZ2Vfb2Zmc2V0KQorCQly
ZXR1cm47CisJaWYgKCgqYWRkciAmIFNFR01BU0spIDwgc3VwZXJwYWdlX29mZnNldCkKKwkJKmFk
ZHIgPSAoKmFkZHIgJiB+U0VHTUFTSykgKyBzdXBlcnBhZ2Vfb2Zmc2V0OworCWVsc2UKKwkJKmFk
ZHIgPSAoKCphZGRyICsgU0VHTUFTSykgJiB+U0VHTUFTSykgKyBzdXBlcnBhZ2Vfb2Zmc2V0Owor
fQorCisjaWZkZWYgRERCCitEQl9TSE9XX0NPTU1BTkQocHRhYmxlLCBkZGJfcGlkX2R1bXApCit7
CisJcG1hcF90IHBtYXA7CisJc3RydWN0IHRocmVhZCAqdGQgPSBOVUxMOworCXN0cnVjdCBwcm9j
ICpwOworCWludCBpLCBqLCBrOworCXZtX3BhZGRyX3QgcGE7CisJdm1fb2Zmc2V0X3QgdmE7CisK
KwlpZiAoaGF2ZV9hZGRyKSB7CisJCXRkID0gZGJfbG9va3VwX3RocmVhZChhZGRyLCBUUlVFKTsK
KwkJaWYgKHRkID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiSW52YWxpZCBwaWQgb3IgdGlkIik7
CisJCQlyZXR1cm47CisJCX0KKwkJcCA9IHRkLT50ZF9wcm9jOworCQlpZiAocC0+cF92bXNwYWNl
ID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiTm8gdm1zcGFjZSBmb3IgcHJvY2VzcyIpOworCQkJ
cmV0dXJuOworCQl9CisJCQlwbWFwID0gdm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJfSBl
bHNlCisJCXBtYXAgPSBrZXJuZWxfcG1hcDsKKworCWRiX3ByaW50ZigicG1hcDolcCBzZWd0YWI6
JXAgYXNpZDoleCBnZW5lcmF0aW9uOiV4XG4iLAorCSAgICBwbWFwLCBwbWFwLT5wbV9zZWd0YWIs
IHBtYXAtPnBtX2FzaWRbMF0uYXNpZCwKKwkgICAgcG1hcC0+cG1fYXNpZFswXS5nZW4pOworCWZv
ciAoaSA9IDA7IGkgPCBOUERFUEc7IGkrKykgeworCQlwZF9lbnRyeV90ICpwZHBlOworCQlwdF9l
bnRyeV90ICpwZGU7CisJCXB0X2VudHJ5X3QgcHRlOworCisJCXBkcGUgPSAocGRfZW50cnlfdCAq
KXBtYXAtPnBtX3NlZ3RhYltpXTsKKwkJaWYgKHBkcGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwor
CQlkYl9wcmludGYoIlslNGRdICVwXG4iLCBpLCBwZHBlKTsKKwkJZm9yIChqID0gMDsgaiA8IE5Q
REVQRzsgaisrKSB7CisJCQlwZGUgPSAocHRfZW50cnlfdCAqKXBkcGVbal07CisJCQlpZiAocGRl
ID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlkYl9wcmludGYoIlx0WyU0ZF0gJXBcbiIsIGos
IHBkZSk7CisJCQlmb3IgKGsgPSAwOyBrIDwgTlBURVBHOyBrKyspIHsKKwkJCQlwdGUgPSBwZGVb
a107CisJCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfaXNfdmFsaWQoJnB0ZSkpCisJCQkJCWNvbnRp
bnVlOworCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJCQkJdmEgPSAoKHVfbG9uZylp
IDw8IFNFR1NISUZUKSB8IChqIDw8IFBEUlNISUZUKSB8IChrIDw8IFBBR0VfU0hJRlQpOworCQkJ
CWRiX3ByaW50ZigiXHRcdFslMDRkXSB2YTogJXAgcHRlOiAlOGp4IHBhOiVqeFxuIiwKKwkJCQkg
ICAgICAgaywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClwdGUsICh1aW50bWF4X3QpcGEpOworCQkJ
fQorCQl9CisJfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHKQorCitzdGF0aWMgdm9p
ZCBwYWRzKHBtYXBfdCBwbSk7Cit2b2lkIHBtYXBfcHZkdW1wKHZtX29mZnNldF90IHBhKTsKKwor
LyogcHJpbnQgYWRkcmVzcyBzcGFjZSBvZiBwbWFwKi8KK3N0YXRpYyB2b2lkCitwYWRzKHBtYXBf
dCBwbSkKK3sKKwl1bnNpZ25lZCB2YSwgaSwgajsKKwlwdF9lbnRyeV90ICpwdGVwOworCisJaWYg
KHBtID09IGtlcm5lbF9wbWFwKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsg
aSsrKQorCQlpZiAocG0tPnBtX3NlZ3RhYltpXSkKKwkJCWZvciAoaiA9IDA7IGogPCBOUFRFUEc7
IGorKykgeworCQkJCXZhID0gKGkgPDwgU0VHU0hJRlQpICsgKGogPDwgUEFHRV9TSElGVCk7CisJ
CQkJaWYgKHBtID09IGtlcm5lbF9wbWFwICYmIHZhIDwgS0VSTkJBU0UpCisJCQkJCWNvbnRpbnVl
OworCQkJCWlmIChwbSAhPSBrZXJuZWxfcG1hcCAmJgorCQkJCSAgICB2YSA+PSBWTV9NQVhVU0VS
X0FERFJFU1MpCisJCQkJCWNvbnRpbnVlOworCQkJCXB0ZXAgPSBwbWFwX3B0ZShwbSwgdmEpOwor
CQkJCWlmIChwdGVfaXNfdmFsaWQocHRlcCkpCisJCQkJCXByaW50ZigiJXg6JXggIiwgdmEsICoo
aW50ICopcHRlcCk7CisJCQl9CisKK30KKwordm9pZAorcG1hcF9wdmR1bXAodm1fb2Zmc2V0X3Qg
cGEpCit7CisJcmVnaXN0ZXIgcHZfZW50cnlfdCBwdjsKKwl2bV9wYWdlX3QgbTsKKworCXByaW50
ZigicGEgJXgiLCBwYSk7CisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJZm9yIChwdiA9IFRB
SUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7CisJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwg
cHZfbGlzdCkpIHsKKwkJcHJpbnRmKCIgLT4gcG1hcCAlcCwgdmEgJXgiLCAodm9pZCAqKXB2LT5w
dl9wbWFwLCBwdi0+cHZfdmEpOworCQlwYWRzKHB2LT5wdl9wbWFwKTsKKwl9CisJcHJpbnRmKCIg
Iik7Cit9CisKKy8qIE4vQyAqLworI2VuZGlmCisKKworLyoKKyAqIEFsbG9jYXRlIFRMQiBhZGRy
ZXNzIHNwYWNlIHRhZyAoY2FsbGVkIEFTSUQgb3IgVExCUElEKSBhbmQgcmV0dXJuIGl0LgorICog
SXQgdGFrZXMgYWxtb3N0IGFzIG11Y2ggb3IgbW9yZSB0aW1lIHRvIHNlYXJjaCB0aGUgVExCIGZv
ciBhCisgKiBzcGVjaWZpYyBBU0lEIGFuZCBmbHVzaCB0aG9zZSBlbnRyaWVzIGFzIGl0IGRvZXMg
dG8gZmx1c2ggdGhlIGVudGlyZSBUTEIuCisgKiBUaGVyZWZvcmUsIHdoZW4gd2UgYWxsb2NhdGUg
YSBuZXcgQVNJRCwgd2UganVzdCB0YWtlIHRoZSBuZXh0IG51bWJlci4gV2hlbgorICogd2UgcnVu
IG91dCBvZiBudW1iZXJzLCB3ZSBmbHVzaCB0aGUgVExCLCBpbmNyZW1lbnQgdGhlIGdlbmVyYXRp
b24gY291bnQKKyAqIGFuZCBzdGFydCBvdmVyLiBBU0lEIHplcm8gaXMgcmVzZXJ2ZWQgZm9yIGtl
cm5lbCB1c2UuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX2FzaWRfYWxsb2MocG1hcCkKKwlwbWFw
X3QgcG1hcDsKK3sKKwlpZiAocG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmFzaWQgIT0g
UE1BUF9BU0lEX1JFU0VSVkVEICYmCisJICAgIHBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQp
XS5nZW4gPT0gUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSk7CisJZWxzZSB7CisJCWlmIChQQ1BV
X0dFVChuZXh0X2FzaWQpID09IHBtYXBfbWF4X2FzaWQpIHsKKwkJCXRsYl9pbnZhbGlkYXRlX2Fs
bF91c2VyKE5VTEwpOworCQkJUENQVV9TRVQoYXNpZF9nZW5lcmF0aW9uLAorCQkJICAgIChQQ1BV
X0dFVChhc2lkX2dlbmVyYXRpb24pICsgMSkgJiBBU0lER0VOX01BU0spOworCQkJaWYgKFBDUFVf
R0VUKGFzaWRfZ2VuZXJhdGlvbikgPT0gMCkgeworCQkJCVBDUFVfU0VUKGFzaWRfZ2VuZXJhdGlv
biwgMSk7CisJCQl9CisJCQlQQ1BVX1NFVChuZXh0X2FzaWQsIDEpOwkvKiAwIG1lYW5zIGludmFs
aWQgKi8KKwkJfQorCQlwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uYXNpZCA9IFBDUFVf
R0VUKG5leHRfYXNpZCk7CisJCXBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5nZW4gPSBQ
Q1BVX0dFVChhc2lkX2dlbmVyYXRpb24pOworCQlQQ1BVX1NFVChuZXh0X2FzaWQsIFBDUFVfR0VU
KG5leHRfYXNpZCkgKyAxKTsKKwl9Cit9CisKK3N0YXRpYyBwdF9lbnRyeV90Citpbml0X3B0ZV9w
cm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlw
dF9lbnRyeV90IHJ3OworCisJaWYgKCEocHJvdCAmIFZNX1BST1RfV1JJVEUpKQorCQlydyA9IFBU
RV9WQUxJRCB8IFBURV9STzsKKwllbHNlIGlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkg
PT0gMCkgeworCQlpZiAoKGFjY2VzcyAmIFZNX1BST1RfV1JJVEUpICE9IDApCisJCQlydyA9IFBU
RV9WQUxJRCB8IFBURV9EOworCQllbHNlCisJCQlydyA9IFBURV9WQUxJRDsKKwl9IGVsc2Ugewor
CQkvKgorCQkgKiBOZWVkbid0IGVtdWxhdGUgYSByZWZlcmVuY2UvbW9kaWZpZWQgYml0IGZvciB1
bm1hbmFnZWQKKwkJICogcGFnZXMuCisJCSAqLworCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwor
CQlwdGVfcmVmX3NldCgmcncpOworCX0KKworCXJldHVybiAocncpOworfQorCisvKgorICogcG1h
cF9lbXVsYXRlX21vZGlmaWVkIDogZG8gZGlydHkgYml0IGVtdWxhdGlvbgorICoKKyAqIE9uIFNN
UCwgdXBkYXRlIGp1c3QgdGhlIGxvY2FsIFRMQiwgb3RoZXIgQ1BVcyB3aWxsIHVwZGF0ZSB0aGVp
cgorICogVExCcyBmcm9tIFBURSBsYXppbHksIGlmIHRoZXkgZ2V0IHRoZSBleGNlcHRpb24uCisg
KiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNlc3MsIDEgaWYgdGhlIHBhZ2UgaXMgcmVhZCBvbmx5
IGFuZCB3ZQorICogbmVlZCB0byBmYXVsdC4KKyAqLworaW50CitwbWFwX2VtdWxhdGVfbW9kaWZp
ZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKwlw
dF9lbnRyeV90ICpwdGU7CisKKwlQTUFQX0xPQ0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1h
cCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCXB0ZSA9IChwdF9lbnRy
eV90ICopcGRlOworCWVsc2UKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCWlm
IChwdGUgPT0gTlVMTCkKKwkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogY2FuJ3QgZmlu
ZCBQVEUiKTsKKyNpZmRlZiBTTVAKKwkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgb3RoZXIg
Q1BVIGNoYW5nZWQgbS1iaXQgKi8KKwlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8IHB0ZV90ZXN0
KHB0ZSwgUFRFX0QpKSB7CisJCXRsYl91cGRhdGUocG1hcCwgdmEsICpwdGUpOworCQlQTUFQX1VO
TE9DSyhwbWFwKTsKKwkJcmV0dXJuICgwKTsKKwl9CisjZWxzZQorCWlmICghcHRlX2lzX3ZhbGlk
KHB0ZSkgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpIHsKKwkJdGxiX3VwZGF0ZShwbWFwLCB2YSwg
KnB0ZSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCQlyZXR1cm4gKDApOworCX0KKyNlbmRpZgor
CWlmIChwdGVfdGVzdChwdGUsIFBURV9STykpIHsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCXJl
dHVybiAoMSk7CisJfQorCXB0ZV9hdG9taWNfc2V0KHB0ZSwgUFRFX0QpOyAvKiBtYXJrIGl0IHJl
ZmVyZW5jZWQgYW5kIG1vZGlmaWVkICovCisJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSk7CisJdGxi
X3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VE
KSkKKwkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogdW5tYW5hZ2VkIHBhZ2UiKTsKKwlQ
TUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogcG1hcF9lbXVsYXRl
X3JlZmVyZW5jZWQ6IGRvIHJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisgKgorICogUmV0dXJucyAw
IGluIGNhc2Ugb2Ygc3VjY2Vzcy4gIFJldHVybnMgMSBpZiB3ZSBuZWVkIHRvIGZhdWx0LgorICov
CitpbnQKK3BtYXBfZW11bGF0ZV9yZWZlcmVuY2VkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2
YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJaWYgKGlzX2tl
cm5lbF9wbWFwKHBtYXApKQorCQlyZXR1cm4gKDEpOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUg
PSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gTlVMTCkg
eworCQkvKiBJbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LiAqLworCQlnb3RvIGRvZmF1bHQ7CisJfQor
CWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJcHRlID0gKHB0X2VudHJ5X3QgKilw
ZGU7CisJfSBlbHNlCisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwlpZiAocHRl
ID09IE5VTEwpIHsKKwkJLyogSW52YWxpZCBwYWdlIHRhYmxlLiAqLworCQlnb3RvIGRvZmF1bHQ7
CisJfQorCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJLyogSW52YWxpZCBQVEUuICovCisJ
CWdvdG8gZG9mYXVsdDsKKwl9CisJLyogQ2hlY2sgdG8gc2VlIGlmIGFscmVhZHkgbWFya2VkIGJ5
IG90aGVyIENQVS4gICovCisJaWYgKCFwdGVfaXNfcmVmKHB0ZSkpCisJCXB0ZV9yZWZfYXRvbWlj
X3NldChwdGUpOworCisJdGxiX3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJUE1BUF9VTkxPQ0so
cG1hcCk7CisKKwlyZXR1cm4gKDApOworCitkb2ZhdWx0OgorCVBNQVBfVU5MT0NLKHBtYXApOwor
CXJldHVybiAoMSk7Cit9CisKK3ZvaWQKK3BtYXBfZmx1c2hfcHZjYWNoZSh2bV9wYWdlX3QgbSkK
K3sKKwlwdl9lbnRyeV90IHB2OworCisJaWYgKG0gIT0gTlVMTCkgeworCQlmb3IgKHB2ID0gVEFJ
TFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpOyBwdjsKKwkJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwg
cHZfbmV4dCkpIHsKKwkJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KHB2LT5wdl92YSwg
UEFHRV9TSVpFKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvcG1hcC5j
IGIvc3lzL21pcHMvbWlwcy9wbWFwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy9wbWFwLmMKKysrIGIv
c3lzL21pcHMvbWlwcy9wbWFwLmMKQEAgLTc0LDYgKzc0LDcgQEAKICNpbmNsdWRlIDxzeXMvcHJv
Yy5oPgogI2luY2x1ZGUgPHN5cy9yd2xvY2suaD4KICNpbmNsdWRlIDxzeXMvc2NoZWQuaD4KKyNp
bmNsdWRlIDxzeXMvX3R5cGVzLmg+CiAjaWZkZWYgU01QCiAjaW5jbHVkZSA8c3lzL3NtcC5oPgog
I2Vsc2UKQEAgLTIzMiw3ICsyMzMsNyBAQAogCXN5c20gPSAmc3lzbWFwX2xtZW1bY3B1XTsKIAlz
eXNtLT5zYXZlZF9pbnRyID0gaW50cjsKIAl2YSA9IHN5c20tPmJhc2U7Ci0JbnB0ZSA9IFRMQkxP
X1BBX1RPX1BGTihwaHlzKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HOwor
CW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5cykgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRF
X1ZBTElEIHwgUFRFX0c7CiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKIAkqcHRl
ID0gbnB0ZTsKIAlzeXNtLT52YWxpZDEgPSAxOwpAQCAtMjU0LDEwICsyNTUsMTAgQEAKIAlzeXNt
LT5zYXZlZF9pbnRyID0gaW50cjsKIAl2YTEgPSBzeXNtLT5iYXNlOwogCXZhMiA9IHN5c20tPmJh
c2UgKyBQQUdFX1NJWkU7Ci0JbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwaHlzMSkgfCBQVEVfQ19D
QUNIRSB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBo
eXMxKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRzsKIAlwdGUgPSBw
bWFwX3B0ZShrZXJuZWxfcG1hcCwgdmExKTsKIAkqcHRlID0gbnB0ZTsKLQlucHRlID0gVExCTE9f
UEFfVE9fUEZOKHBoeXMyKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HOwor
CW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5czIpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBU
RV9WQUxJRCB8IFBURV9HOwogCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YTIpOwogCSpw
dGUgPSBucHRlOwogCXN5c20tPnZhbGlkMSA9IDE7CkBAIC01NTYsOSArNTU3LDE1IEBACiAJbXNn
YnVmaW5pdChtc2didWZwLCBtc2didWZzaXplKTsKIAogCS8qCi0JICogU3RlYWwgdGhyZWFkMCBr
c3RhY2suCisJICogU3RlYWwgdGhyZWFkMCBrc3RhY2suICBUaGlzIG11c3QgYmUgYWxpZ25lZCB0
bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBhIHNpbmds
ZSBUTEIgZW50cnkuCisJICoKKwkgKiBYWFggVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheSBv
ZiBnZXR0aW5nIGFsaWduZWQgbWVtb3J5CisJICogd2l0aCBwbWFwX3N0ZWFsX21lbW9yeSgpLgog
CSAqLwotCWtzdGFjazAgPSBwbWFwX3N0ZWFsX21lbW9yeShLU1RBQ0tfUEFHRVMgPDwgUEFHRV9T
SElGVCk7CisJa3N0YWNrMCA9IHBtYXBfc3RlYWxfbWVtb3J5KChLU1RBQ0tfUEFHRVMgKyBLU1RB
Q0tfR1VBUkRfUEFHRVMpIFwKKwkJCQkJPDwgUEFHRV9TSElGVCk7CisJa3N0YWNrMCA9IHJvdW5k
dXAyKGtzdGFjazAsIChLU1RBQ0tfUEFHRV9TSVpFICogMikpOwogCiAJdmlydHVhbF9hdmFpbCA9
IFZNX01JTl9LRVJORUxfQUREUkVTUzsKIAl2aXJ0dWFsX2VuZCA9IFZNX01BWF9LRVJORUxfQURE
UkVTUzsKQEAgLTYwNSw2ICs2MTIsNyBAQAogCiAJVEFJTFFfSU5JVCgmbS0+bWQucHZfbGlzdCk7
CiAJbS0+bWQucHZfZmxhZ3MgPSAwOworCW0tPm1kLnB2X21lbWF0dHIgPSBWTV9NRU1BVFRSX0RF
RkFVTFQ7CiB9CiAKIC8qCkBAIC04MDEsNyArODA5LDcgQEAKIAlwdGVwID0gcG1hcF9wdGUocG1h
cCwgdmEpOwogCWlmIChwdGVwICE9IE5VTEwpIHsKIAkJcHRlID0gKnB0ZXA7Ci0JCWlmIChwdGVf
dGVzdCgmcHRlLCBQVEVfVikgJiYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfUk8pIHx8CisJCWlmIChw
dGVfdGVzdCgmcHRlLCBQVEVfVkFMSUQpICYmICghcHRlX3Rlc3QoJnB0ZSwgUFRFX1JPKSB8fAog
CQkgICAgKHByb3QgJiBWTV9QUk9UX1dSSVRFKSA9PSAwKSkgewogCQkJcHRlX3BhID0gVExCTE9f
UFRFX1RPX1BBKHB0ZSk7CiAJCQlpZiAodm1fcGFnZV9wYV90cnlyZWxvY2socG1hcCwgcHRlX3Bh
LCAmcGEpKQpAQCAtODM0LDkgKzg0Miw5IEBACiAKIAlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h
cCwgdmEpOwogCW9wdGUgPSAqcHRlOwotCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgYXR0
ciB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8
IGF0dHIgfCBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9HOwogCSpwdGUgPSBucHRlOwotCWlmIChw
dGVfdGVzdCgmb3B0ZSwgUFRFX1YpICYmIG9wdGUgIT0gbnB0ZSkKKwlpZiAocHRlX3Rlc3QoJm9w
dGUsIFBURV9WQUxJRCkgJiYgb3B0ZSAhPSBucHRlKQogCQlwbWFwX3VwZGF0ZV9wYWdlKGtlcm5l
bF9wbWFwLCB2YSwgbnB0ZSk7CiB9CiAKQEAgLTE0NDksNyArMTQ1Nyw3IEBACiAJCQkJaWYgKG0t
Pm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQogCQkJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQ
R0FfUkVGRVJFTkNFRCk7CiAJCQkJbS0+bWQucHZfZmxhZ3MgJj0gflBWX1RBQkxFX1JFRjsKLQkJ
CQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJCQlUQUlMUV9S
RU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJCQlpZiAoVEFJTFFfRU1QVFko
Jm0tPm1kLnB2X2xpc3QpKQogCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFC
TEUpOwogCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFVTCA8PCBiaXQ7CkBAIC0xNjI3LDkgKzE2
MzUsOSBAQAogCXB2X2VudHJ5X3QgcHY7CiAKIAlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg
UkFfV0xPQ0tFRCk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbGlzdCkg
eworCVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKIAkJaWYgKHBt
YXAgPT0gUFZfUE1BUChwdikgJiYgdmEgPT0gcHYtPnB2X3ZhKSB7Ci0JCQlUQUlMUV9SRU1PVkUo
JnB2aC0+cHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xp
c3QsIHB2LCBwdl9uZXh0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTY3MSw3ICsxNjc5LDcg
QEAKIAlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKIAlpZiAoKHB2ID0gZ2V0X3B2
X2VudHJ5KHBtYXAsIFRSVUUpKSAhPSBOVUxMKSB7CiAJCXB2LT5wdl92YSA9IHZhOwotCQlUQUlM
UV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQlUQUlMUV9JTlNF
UlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQlyZXR1cm4gKFRSVUUpOwog
CX0gZWxzZQogCQlyZXR1cm4gKEZBTFNFKTsKQEAgLTE3NDQsNyArMTc1Miw3IEBACiAJLyoKIAkg
KiBJZiB0aGVyZSBpcyBubyBwdGUgZm9yIHRoaXMgYWRkcmVzcywganVzdCBza2lwIGl0IQogCSAq
LwotCWlmICghcHRlX3Rlc3QocHRxLCBQVEVfVikpCisJaWYgKCFwdGVfdGVzdChwdHEsIFBURV9W
QUxJRCkpCiAJCXJldHVybjsKIAogCSh2b2lkKXBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdHEsIHZh
LCAqcGRlKTsKQEAgLTE4MTAsNyArMTgxOCw3IEBACiAJCXZhID0gdmFfbmV4dDsKIAkJZm9yIChw
dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCiAJ
CSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpKSB7
CisJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSkgewogCQkJCWlmICh2YSAhPSB2YV9u
ZXh0KSB7CiAJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKIAkJCQkJ
dmEgPSB2YV9uZXh0OwpAQCAtMTg2OCw3ICsxODc2LDcgQEAKIAkJICogSWYgaXQncyBsYXN0IG1h
cHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbSAKIAkJICogdGhlIHBhZ2UgYmVpbmcgZGVz
dHJveWVkCiAJIAkgKi8KLQkJaWYgKFRBSUxRX05FWFQocHYsIHB2X2xpc3QpID09IE5VTEwpCisJ
CWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSA9PSBOVUxMKQogCQkJbWlwc19kY2FjaGVfd2Jp
bnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJWkUpOwogCiAJCXBtYXAtPnBtX3N0YXRz
LnJlc2lkZW50X2NvdW50LS07CkBAIC0xODk3LDcgKzE5MDUsNyBAQAogCQl9CiAJCXBtYXBfaW52
YWxpZGF0ZV9wYWdlKHBtYXAsIHB2LT5wdl92YSk7CiAKLQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5w
dl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYs
IHB2X25leHQpOwogCQlwbWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSk7CiAJCWZy
ZWVfcHZfZW50cnkocG1hcCwgcHYpOwogCQlQTUFQX1VOTE9DSyhwbWFwKTsKQEAgLTE5NTksNyAr
MTk2Nyw3IEBACiAJCWZvciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9
IHZhX25leHQ7IHB0ZSsrLAogCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgewogCQkJcGJpdHMgPSAq
cHRlOwotCQkJaWYgKCFwdGVfdGVzdCgmcGJpdHMsIFBURV9WKSB8fCBwdGVfdGVzdCgmcGJpdHMs
CisJCQlpZiAoIXB0ZV90ZXN0KCZwYml0cywgUFRFX1ZBTElEKSB8fCBwdGVfdGVzdCgmcGJpdHMs
CiAJCQkgICAgUFRFX1JPKSkgewogCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CiAJCQkJCXBtYXBf
aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKQEAgLTIwNzEsNyArMjA3OSw3IEBACiAJ
LyoKIAkgKiBNYXBwaW5nIGhhcyBub3QgY2hhbmdlZCwgbXVzdCBiZSBwcm90ZWN0aW9uIG9yIHdp
cmluZyBjaGFuZ2UuCiAJICovCi0JaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVikgJiYgb3Bh
ID09IHBhKSB7CisJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVkFMSUQpICYmIG9wYSA9PSBw
YSkgewogCQkvKgogCQkgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0ZSBzdGF0cy4gV2UgZG9u
J3Qgd29ycnkgYWJvdXQKIAkJICogd2lyaW5nIFBUIHBhZ2VzIGFzIHRoZXkgcmVtYWluIHJlc2lk
ZW50IGFzIGxvbmcgYXMgdGhlcmUKQEAgLTIxMzUsNyArMjE0Myw3IEBACiAJCWlmIChwdiA9PSBO
VUxMKQogCQkJcHYgPSBnZXRfcHZfZW50cnkocG1hcCwgRkFMU0UpOwogCQlwdi0+cHZfdmEgPSB2
YTsKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJ
VEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJbmV3cHRl
IHw9IFBURV9NQU5BR0VEOwogCQlpZiAoIXB0ZV90ZXN0KCZuZXdwdGUsIFBURV9STykpCiAJCQl2
bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKQEAgLTIxNjAsNyArMjE2OCw3IEBA
CiAJICovCiAJaWYgKG9yaWdwdGUgIT0gbmV3cHRlKSB7CiAJCSpwdGUgPSBuZXdwdGU7Ci0JCWlm
IChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1YpKSB7CisJCWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwg
UFRFX1ZBTElEKSkgewogCQkJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkgJiYg
b3BhICE9IHBhKSB7CiAJCQkJaWYgKG9tLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikKIAkJ
CQkJdm1fcGFnZV9hZmxhZ19zZXQob20sIFBHQV9SRUZFUkVOQ0VEKTsKQEAgLTIyNjgsNyArMjI3
Niw3IEBACiAJfQogCiAJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOwotCWlmIChwdGVfdGVzdChw
dGUsIFBURV9WKSkgeworCWlmIChwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpIHsKIAkJaWYgKG1w
dGUgIT0gTlVMTCkgewogCQkJbXB0ZS0+d2lyZV9jb3VudC0tOwogCQkJbXB0ZSA9IE5VTEw7CkBA
IC0yMjk4LDcgKzIzMDYsNyBAQAogCS8qCiAJICogTm93IHZhbGlkYXRlIG1hcHBpbmcgd2l0aCBS
TyBwcm90ZWN0aW9uCiAJICovCi0JKnB0ZSA9IFBURV9STyB8IFRMQkxPX1BBX1RPX1BGTihwYSkg
fCBQVEVfVjsKKwkqcHRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9WQUxJ
RDsKIAlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDApCiAJCSpwdGUgfD0gUFRF
X01BTkFHRUQ7CiAKQEAgLTIzNTYsNyArMjM2NCw3IEBACiAJCWNwdSA9IFBDUFVfR0VUKGNwdWlk
KTsKIAkJc3lzbSA9ICZzeXNtYXBfbG1lbVtjcHVdOwogCQkvKiBTaW5jZSB0aGlzIGlzIGZvciB0
aGUgZGVidWdnZXIsIG5vIGxvY2tzIG9yIGFueSBvdGhlciBmdW4gKi8KLQkJbnB0ZSA9IFRMQkxP
X1BBX1RPX1BGTihwYSkgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1YgfAorCQlucHRlID0g
VExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfAog
CQkgICAgUFRFX0c7CiAJCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCBzeXNtLT5iYXNlKTsK
IAkJKnB0ZSA9IG5wdGU7CkBAIC0yNDg0LDcgKzI0OTIsNyBAQAogCQkJdmFfbmV4dCA9IGV2YTsK
IAkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsg
cHRlKyssCiAJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwg
UFRFX1YpKQorCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpCiAJCQkJY29udGludWU7
CiAJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1cpKQogCQkJCXBhbmljKCJwbWFwX3Vud2lyZTog
cHRlICUjanggaXMgbWlzc2luZyBQR19XIiwKQEAgLTI2NjYsNyArMjY3NCw3IEBACiAJS0FTU0VS
VChzeXNtLT52YWxpZDEgPT0gMCwgKCJwbWFwX3F1aWNrX2VudGVyX3BhZ2U6IFBURSBidXN5Iikp
OwogCiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHN5c20tPmJhc2UpOwotCSpwdGUgPSBU
TEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HIHwKKwkqcHRlID0gVExC
TE9fUEFfVE9fUEZOKHBhKSB8IFBURV9EIHwgUFRFX1ZBTElEIHwgUFRFX0cgfAogCSAgICAoaXNf
Y2FjaGVhYmxlX3BhZ2UocGEsIG0pID8gUFRFX0NfQ0FDSEUgOiBQVEVfQ19VTkNBQ0hFRCk7CiAJ
c3lzbS0+dmFsaWQxID0gMTsKIApAQCAtMjcxOSw3ICsyNzI3LDcgQEAKIAkgICAgKCJwbWFwX3Bh
Z2VfZXhpc3RzX3F1aWNrOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOwogCXJ2ID0gRkFM
U0U7CiAJcndfd2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0t
Pm1kLnB2X2xpc3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlz
dCwgcHZfbmV4dCkgewogCQlpZiAoUFZfUE1BUChwdikgPT0gcG1hcCkgewogCQkJcnYgPSBUUlVF
OwogCQkJYnJlYWs7CkBAIC0yNzcyLDcgKzI3ODAsNyBAQAogCQkJCUtBU1NFUlQocGRlICE9IE5V
TEwgJiYgKnBkZSAhPSAwLAogCQkJCSAgICAoInBtYXBfcmVtb3ZlX3BhZ2VzOiBwZGUiKSk7CiAJ
CQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgcHYtPnB2X3ZhKTsKLQkJCQlpZiAoIXB0ZV90
ZXN0KHB0ZSwgUFRFX1YpKQorCQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpKQogCQkJ
CQlwYW5pYygicG1hcF9yZW1vdmVfcGFnZXM6IGJhZCBwdGUiKTsKIAkJCQl0cHRlID0gKnB0ZTsK
IApAQCAtMjgwMiw3ICsyODEwLDcgQEAKIAkJCQlwdl9lbnRyeV9jb3VudC0tOwogCQkJCXBjLT5w
Y19tYXBbZmllbGRdIHw9IGJpdG1hc2s7CiAJCQkJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291
bnQtLTsKLQkJCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJ
CQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJCQlpZiAoVEFJ
TFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpKQogCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBH
QV9XUklURUFCTEUpOwogCQkJCXBtYXBfdW51c2VfcHQocG1hcCwgcHYtPnB2X3ZhLCAqcGRlKTsK
QEAgLTI4MzMsNyArMjg0MSw3IEBACiAJCXJldHVybiAocnYpOwogCiAJcndfYXNzZXJ0KCZwdmhf
Z2xvYmFsX2xvY2ssIFJBX1dMT0NLRUQpOwotCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s
aXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25l
eHQpIHsKIAkJcG1hcCA9IFBWX1BNQVAocHYpOwogCQlQTUFQX0xPQ0socG1hcCk7CiAJCXB0ZSA9
IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7CkBAIC0yODYzLDcgKzI4NzEsNyBAQAogCWlmICgo
bS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCkKIAkJcmV0dXJuIChjb3VudCk7CiAJcndf
d2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xp
c3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4
dCkgewogCQlwbWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRlID0g
cG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKQEAgLTI4OTcsMTEgKzI5MDUsMTEgQEAKIAlpZiAo
IXZtX3BhZ2VfeGJ1c2llZChtKSAmJiAobS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkK
IAkJcmV0dXJuOwogCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwotCVRBSUxRX0ZPUkVBQ0go
cHYsICZtLT5tZC5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1k
LnB2X2xpc3QsIHB2X25leHQpIHsKIAkJcG1hcCA9IFBWX1BNQVAocHYpOwogCQlQTUFQX0xPQ0so
cG1hcCk7CiAJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7Ci0JCUtBU1NFUlQocHRl
ICE9IE5VTEwgJiYgcHRlX3Rlc3QocHRlLCBQVEVfViksCisJCUtBU1NFUlQocHRlICE9IE5VTEwg
JiYgcHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpLAogCQkgICAgKCJwYWdlIG9uIHB2X2xpc3QgaGFz
IG5vIHB0ZSIpKTsKIAkJcGJpdHMgPSAqcHRlOwogCQlpZiAocHRlX3Rlc3QoJnBiaXRzLCBQVEVf
RCkpIHsKQEAgLTMwNDAsNyArMzA0OCw3IEBACiAJCXZhID0gdmFfbmV4dDsKIAkJZm9yIChwdGUg
PSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCiAJCSAg
ICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX01BTkFHRUQg
fCBQVEVfVikpIHsKKwkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfTUFOQUdFRCB8IFBURV9WQUxJ
RCkpIHsKIAkJCQlpZiAodmEgIT0gdmFfbmV4dCkgewogCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFu
Z2UocG1hcCwgdmEsIHN2YSk7CiAJCQkJCXZhID0gdmFfbmV4dDsKQEAgLTMxMDYsNyArMzExNCw3
IEBACiAJaWYgKChtLT5hZmxhZ3MgJiBQR0FfV1JJVEVBQkxFKSA9PSAwKQogCQlyZXR1cm47CiAJ
cndfd2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2
X2xpc3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZf
bmV4dCkgewogCQlwbWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRl
ID0gcG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKQEAgLTMyMDgsNyArMzIxNiw3IEBACiByZXRy
eToKIAlwdGVwID0gcG1hcF9wdGUocG1hcCwgYWRkcik7CiAJcHRlID0gKHB0ZXAgIT0gTlVMTCkg
PyAqcHRlcCA6IDA7Ci0JaWYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfVikpIHsKKwlpZiAoIXB0ZV90
ZXN0KCZwdGUsIFBURV9WQUxJRCkpIHsKIAkJdmFsID0gMDsKIAkJZ290byBvdXQ7CiAJfQpAQCAt
MzM0NSw3ICszMzUzLDcgQEAKICNlbmRpZgogCQkJZm9yIChrID0gMDsgayA8IE5QVEVQRzsgaysr
KSB7CiAJCQkJcHRlID0gcGRlW2tdOwotCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX3Rlc3QoJnB0
ZSwgUFRFX1YpKQorCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX3Rlc3QoJnB0ZSwgUFRFX1ZBTElE
KSkKIAkJCQkJY29udGludWU7CiAJCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKIAkJCQl2
YSA9ICgodV9sb25nKWkgPDwgU0VHU0hJRlQpIHwgKGogPDwgUERSU0hJRlQpIHwgKGsgPDwgUEFH
RV9TSElGVCk7CkBAIC0zMzkzLDE1ICszNDAxLDE1IEBACiAJcHRfZW50cnlfdCBydzsKIAogCWlm
ICghKHByb3QgJiBWTV9QUk9UX1dSSVRFKSkKLQkJcncgPSBQVEVfViB8IFBURV9STzsKKwkJcncg
PSBQVEVfVkFMSUQgfCBQVEVfUk87CiAJZWxzZSBpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFH
RUQpID09IDApIHsKIAkJaWYgKChhY2Nlc3MgJiBWTV9QUk9UX1dSSVRFKSAhPSAwKQotCQkJcncg
PSBQVEVfViB8IFBURV9EOworCQkJcncgPSBQVEVfVkFMSUQgfCBQVEVfRDsKIAkJZWxzZQotCQkJ
cncgPSBQVEVfVjsKKwkJCXJ3ID0gUFRFX1ZBTElEOwogCX0gZWxzZQogCQkvKiBOZWVkbid0IGVt
dWxhdGUgYSBtb2RpZmllZCBiaXQgZm9yIHVubWFuYWdlZCBwYWdlcy4gKi8KLQkJcncgPSBQVEVf
ViB8IFBURV9EOworCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwogCXJldHVybiAocncpOwogfQog
CkBAIC0zNDI0LDEzICszNDMyLDEzIEBACiAJCXBhbmljKCJwbWFwX2VtdWxhdGVfbW9kaWZpZWQ6
IGNhbid0IGZpbmQgUFRFIik7CiAjaWZkZWYgU01QCiAJLyogSXQgaXMgcG9zc2libGUgdGhhdCBz
b21lIG90aGVyIENQVSBjaGFuZ2VkIG0tYml0ICovCi0JaWYgKCFwdGVfdGVzdChwdGUsIFBURV9W
KSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkgeworCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVkFM
SUQpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKSB7CiAJCXRsYl91cGRhdGUocG1hcCwgdmEsICpw
dGUpOwogCQlQTUFQX1VOTE9DSyhwbWFwKTsKIAkJcmV0dXJuICgwKTsKIAl9CiAjZWxzZQotCWlm
ICghcHRlX3Rlc3QocHRlLCBQVEVfVikgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpCisJaWYgKCFw
dGVfdGVzdChwdGUsIFBURV9WQUxJRCkgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpCiAJCXBhbmlj
KCJwbWFwX2VtdWxhdGVfbW9kaWZpZWQ6IGludmFsaWQgcHRlIik7CiAjZW5kaWYKIAlpZiAocHRl
X3Rlc3QocHRlLCBQVEVfUk8pKSB7CkBAIC0zNDQ2LDYgKzM0NTQsMTggQEAKIH0KIAogLyoKKyAq
IHBtYXBfZW11bGF0ZV9yZWZlcmVuY2VkCisgKgorICogUmVmZXJlbmNlIGJpdCBlbXVsYXRpb24g
aXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHBtYXAgaW1wbGVtZW50YXRpb24uCisgKi8KK2ludAor
cG1hcF9lbXVsYXRlX3JlZmVyZW5jZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQorewor
CisJCXJldHVybiAoMSk7Cit9CisKKy8qCiAgKglSb3V0aW5lOglwbWFwX2tleHRyYWN0CiAgKglG
dW5jdGlvbjoKICAqCQlFeHRyYWN0IHRoZSBwaHlzaWNhbCBwYWdlIGFkZHJlc3MgYXNzb2NpYXRl
ZApAQCAtMzUyMiwxNyArMzU0MiwyNiBAQAogCiAJaWYgKG0gIT0gTlVMTCkgewogCQlmb3IgKHB2
ID0gVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpOyBwdjsKLQkJICAgIHB2ID0gVEFJTFFfTkVY
VChwdiwgcHZfbGlzdCkpIHsKKwkJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwgcHZfbmV4dCkpIHsK
IAkJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KHB2LT5wdl92YSwgUEFHRV9TSVpFKTsK
IAkJfQogCX0KIH0KIAorLyoKKyAqIFNldHMgdGhlIG1lbW9yeSBhdHRyaWJ1dGUgZm9yIHRoZSBz
cGVjaWZpZWQgcGFnZS4KKyAqLwogdm9pZAogcG1hcF9wYWdlX3NldF9tZW1hdHRyKHZtX3BhZ2Vf
dCBtLCB2bV9tZW1hdHRyX3QgbWEpCiB7CiAKIAkvKgorCSAqIFNldCB0aGUgbWVtYXR0ciBmaWVs
ZCBzbyB0aGUgYXBwcm9wcmlhdGUgYml0cyBhcmUgc2V0IGluIHRoZQorCSAqIFBURSBhcyBtYXBw
aW5ncyBhcmUgY3JlYXRlZC4KKwkgKi8KKwltLT5tZC5wdl9tZW1hdHRyID0gbWE7CisKKwkvKgog
CSAqIEl0IGFwcGVhcnMgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBiZWZv
cmUgYW55IG1hcHBpbmdzCiAJICogZm9yIHRoZSBwYWdlIGFyZSBlc3RhYmxpc2hlZC4gIElmIHRo
aXMgZXZlciBjaGFuZ2VzLCB0aGlzIGNvZGUgd2lsbAogCSAqIG5lZWQgdG8gd2FsayB0aGUgcHZf
bGlzdCBhbmQgbWFrZSBlYWNoIG9mIHRoZSBleGlzdGluZyBtYXBwaW5ncwpkaWZmIC0tZ2l0IGEv
c3lzL21pcHMvbWlwcy9taW5pZHVtcF9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL21pbmlkdW1w
X21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL21pbmlkdW1wX21hY2hkZXAuYworKysgYi9z
eXMvbWlwcy9taXBzL21pbmlkdW1wX21hY2hkZXAuYwpAQCAtMTc5LDcgKzE3OSw3IEBACiAJCXB0
ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CiAJCUtBU1NFUlQocHRlICE9IE5VTEwsICgi
cHRlIGZvciAlanggaXMgTlVMTCIsICh1aW50bWF4X3QpdmEpKTsKIAkJZm9yIChpID0gMDsgaSA8
IE5QVEVQRzsgaSsrKSB7Ci0JCQlpZiAocHRlX3Rlc3QoJnB0ZVtpXSwgUFRFX1YpKSB7CisJCQlp
ZiAocHRlX2lzX3ZhbGlkKCZwdGVbaV0pKSB7CiAJCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRl
W2ldKTsKIAkJCQlpZiAoaXNfZHVtcGFibGUocGEpKQogCQkJCQlkdW1wX2FkZF9wYWdlKHBhKTsK
ZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvbWFjaGRlcC5jIGIvc3lzL21pcHMvbWlwcy9tYWNo
ZGVwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy9tYWNoZGVwLmMKKysrIGIvc3lzL21pcHMvbWlwcy9t
YWNoZGVwLmMKQEAgLTI4Myw5ICsyODMsOSBAQAogI2VuZGlmCiAJcHJvY19saW5rdXAwKCZwcm9j
MCwgJnRocmVhZDApOwogCi0JS0FTU0VSVCgoa3N0YWNrMCAmIFBBR0VfTUFTSykgPT0gMCwKLQkJ
KCJrc3RhY2swIGlzIG5vdCBhbGlnbmVkIG9uIGEgcGFnZSBib3VuZGFyeTogMHglMGx4IiwKLQkJ
KGxvbmcpa3N0YWNrMCkpOworCUtBU1NFUlQoKGtzdGFjazAgJiAoKEtTVEFDS19QQUdFX1NJWkUg
KiAyKSAtIDEpKSA9PSAwLAorCQkoImtzdGFjazAgaXMgbm90IGFsaWduZWQgb24gYSBwYWdlICgw
eCUwbHgpIGJvdW5kYXJ5OiAweCUwbHgiLAorCQkobG9uZykoS1NUQUNLX1BBR0VfU0laRSAqIDIp
LCAobG9uZylrc3RhY2swKSk7CiAJdGhyZWFkMC50ZF9rc3RhY2sgPSBrc3RhY2swOwogCXRocmVh
ZDAudGRfa3N0YWNrX3BhZ2VzID0gS1NUQUNLX1BBR0VTOwogCS8qIApAQCAtNDU5LDcgKzQ1OSw3
IEBACiAJICogV2UgdXNlIGEgd2lyZWQgdGxiIGluZGV4IHRvIGRvIHRoaXMgb25lLXRpbWUgbWFw
cGluZy4KIAkgKi8KIAlwYSA9IHZ0b3BoeXMocGNwdSk7Ci0JcHRlID0gUFRFX0QgfCBQVEVfViB8
IFBURV9HIHwgUFRFX0NfQ0FDSEU7CisJcHRlID0gUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfUkVG
IHwgUFRFX0cgfCBQVEVfQ19DQUNIRTsKIAl0bGJfaW5zZXJ0X3dpcmVkKFBDUFVfVExCX0VOVFJZ
LCAodm1fb2Zmc2V0X3QpcGNwdXAsCiAJCQkgVExCTE9fUEFfVE9fUEZOKHBhKSB8IHB0ZSwKIAkJ
CSBUTEJMT19QQV9UT19QRk4ocGEgKyBQQUdFX1NJWkUpIHwgcHRlKTsKZGlmZiAtLWdpdCBhL3N5
cy9taXBzL21pcHMvZ2VuYXNzeW0uYyBiL3N5cy9taXBzL21pcHMvZ2VuYXNzeW0uYwotLS0gYS9z
eXMvbWlwcy9taXBzL2dlbmFzc3ltLmMKKysrIGIvc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCkBA
IC0xMDIsNiArMTAyLDkgQEAKIEFTU1lNKFRERl9BU1RQRU5ESU5HLCBUREZfQVNUUEVORElORyk7
CiBBU1NZTShNQVhDT01MRU4sIE1BWENPTUxFTik7CiBBU1NZTShNRFREX0NPUDJVU0VELCBNRFRE
X0NPUDJVU0VEKTsKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorQVNTWU0oS1NUQUNLX1RMQk1B
U0tfTUFTSywgS1NUQUNLX1RMQk1BU0tfTUFTSyk7CisjZW5kaWYKIAogQVNTWU0oTUlQU19LU0VH
MF9TVEFSVCwgTUlQU19LU0VHMF9TVEFSVCk7CiBBU1NZTShNSVBTX0tTRUcxX1NUQVJULCBNSVBT
X0tTRUcxX1NUQVJUKTsKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMgYi9z
eXMvbWlwcy9taXBzL2V4Y2VwdGlvbi5TCi0tLSBhL3N5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMK
KysrIGIvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUwpAQCAtODUsNiArODUsMjggQEAKICAqLwog
I2RlZmluZQlJTlRSQ05UX0NPVU5UCTI1NgogCisvKgorICogR2VuZXJhbCBNSVBTIENQVSBzdGF0
ZSBmb3IgZXhjZXB0aW9uczoKKyAqCisgKiBFUEMgUmVnaXN0ZXIgd2lsbCBwb2ludCB0byB0aGUg
aW5zdHJ1Y3Rpb24gdGhhdCBjYXVzZWQgZmF1bHQsIHVubGVzcyB0aGUKKyAqIGZhdWx0aW5nIGlu
c3RydWN0aW9uIHdhcyBpbiBhIGJyYW5jaCBkZWxheSBzbG90LiAgSW4gdGhhdCBjYXNlLCBpdCB3
aWxsCisgKiBwb2ludCB0byB0aGUgYnJhbmNoIGJlZm9yZSB0aGUgYnJhbmNoIGRlbGF5IHNsb3Qg
aW5zdHJ1Y3Rpb24uCisgKgorICogVGhlIGNhdXNlIHJlZ2lzdGVyIHdpbGwgY29udGFpbiB3aGF0
IGNhdXNlZCB0aGUgZXhjZXB0aW9uIGFuZCBzb21lIHN0YXRlCisgKiBhYm91dCB0aGUgaW50ZXJy
dXB0LgorICoKKyAqIFRoZSBzdGF0dXMgcmVnaXN0ZXIgY29udGFpbnMgaW5mb3JtYXRpb24gYWJv
dXQgdGhlIHN0YXR1cyBvZiB0aGUgQ1BVIHN1Y2gKKyAqIGFzOiBLZXJuZWwvVXNlciBtb2RlIGJp
dCwgaW50ZXJydXB0IGVuYWJsZSBiaXQuCisgKgorICogVGhlIEJhZFZhZGRyIHJlZ2lzdGVyIGNv
bnRhaW5zIHRoZSB2aXJ0dWFsIGFkZHJlc3MgdGhhdCBjYXVzZSB0aGUgbGFzdAorICogZXhjZXB0
aW9uLgorICoKKyAqIFRoZSBDb250ZXh0IHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBsb3dlciAyMiBi
aXRzIG9mIHRoZSBWUE4gKHN0YXJ0aW5nIGF0CisgKiBiaXQgNCkgdGhhdCBjYXVzZSB0aGUgbGFz
dCBleGNlcHRpb24gZXhjZXB0IGJpdDAgYW5kIGJpdDEgYXJlIHplcm8uIFRoZQorICogdXBwZXIg
Yml0cyAoYml0cyAyMyB0byAzMSBmb3IgTUlQUzMyIGFuZCBiaXRzIDIzIHRvIDYzKSBhcmUgc2V0
IHVuZGVyCisgKiBrZXJuZWwgY29udHJvbCAoaS5lLiBwb2ludCB0byB0aGUgcGFnZSB0YWJsZSku
IFRoZSBDb250ZXh0L1hDb250ZXh0CisgKiByZWdpc3RlcnMgYXJlIG5vdCBjdXJyZW50bHkgdXNl
ZCBieSBGcmVlQlNELgorICovCiAKIC8qCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTExMCwx
MyArMTMyLDI3IEBACiAvKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgotICogTWlwc0RvVExC
TWlzcyAtLQorICogTWlwc0RvVExCTWlzcyAtLSAgKFVUTEIgbWlzcykKICAqCi0gKiBUaGlzIGlz
IHRoZSByZWFsIFRMQiBNaXNzIEhhbmRsZXIgY29kZS4KKyAqIFRoaXMgaXMgdGhlIHJlYWwgVExC
IE1pc3MgSGFuZGxlciBjb2RlLiAgQSBtaXNzIHdhcyBnZW5lcmF0ZWQgd2hlbiB0aGUKKyAqIGFj
Y2VzcyBpcyB0byBrdXNlZyBhbmQgdGhlcmUgd2FzIG5vdCBtYXRjaGluZyBtYXBwaW5nIGxvYWRl
ZCBpbnRvIHRoZSBUTEIuCiAgKiAnc2VnYmFzZScgcG9pbnRzIHRvIHRoZSBiYXNlIG9mIHRoZSBz
ZWdtZW50IHRhYmxlIGZvciB1c2VyIHByb2Nlc3Nlcy4KICAqCisgKiBUaGUgQ1BVIGRvZXMgdGhl
IGZvbGxvd2luZyBmb3IgYW4gVVRMQiBtaXNzOgorICogLSBTZXRzIHRoZSBFUEMgcmVnaXN0ZXIu
CisgKiAtIFNldHMgdGhlIENhdXNlIHJlZ2lzdGVyLgorICogLSBTZXRzIHRoZSBTdGF0dXMgcmVn
aXN0ZXIuIFNoaWZ0cyBLL1UgYW5kIElFIGJpdHMgb3ZlciBvbmUgYW5kIGNsZWFycworICogICB0
aGUgY3VycmVudCBLZXJuZWwvVXNlciBhbmQgSW50ZXJydXB0IEVuYWJsZSBiaXRzLiBTbyB0aGUg
cHJvY2Vzc29yCisgKiAgIGlzIGluIGtlcm5lbCBtb2RlIHdpdGggdGhlIGludGVydXB0cyB0dXJu
ZWQgb2ZmLgorICogLSBTZXRzIEJhZFZhZGRyIHJlZ2lzdGVyLgorICogLSBTZXRzIHRoZSBDb250
ZXh0L1hDb250ZXh0IHJlZ2lzdGVyKHMpLgorICogLSBTZXRzIHRoZSBUTEIgRW50cnlIaSByZWdp
c3RlciB0byBjb250YWluIFZQTiBvZiB0aGUgZmF1bHRpbmcgYWRkcmVzcy4KKyAqCiAgKiBEb24n
dCBjaGVjayBmb3IgaW52YWxpZCBwdGUncyBoZXJlLiBXZSBsb2FkIHRoZW0gYXMgd2VsbCBhbmQK
ICAqIGxldCB0aGUgcHJvY2Vzc29yIHRyYXAgdG8gbG9hZCB0aGUgY29ycmVjdCB2YWx1ZSBhZnRl
ciBzZXJ2aWNlLgorICoKKyAqIFhYWCBUaGlzIHJlYWxseSBuZWVkcyB0byBiZSBjaGFuZ2VkIHRv
IGEgbGluZWFyIHBhZ2UgdGFibGUgYW5kIHVzZSB0aGUKKyAqIENvbnRleHQgYW5kIFhDb250ZXh0
IHJlZ2lzdGVycy4gIFRoYXQgaXMgcmVhbGx5IHdoYXQgaXQgd2FzIGRlc2lnbmVkIGZvci4KICAq
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAgCS5zZXQgcHVzaApAQCAtMTM3LDI1ICsxNzMsODkg
QEAKICNpZmRlZiBfX21pcHNfbjY0CiAJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJ
CSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCBQREVQVFJNQVNLCQkjIGswPXBkZSBvZmZzZXQKLQlQ
VFJfQUREVQlrMSwgazAsIGsxCQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcwotCVBUUl9MCQlrMSwg
MChrMSkJCQkjIGsxPXBkZSBlbnRyeQotCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQUREUgkj
IGswPWJhZCBhZGRyZXNzIChhZ2FpbikKKwlQVFJfQUREVQlrMCwgazAsIGsxCQkJIyBrMT1wZGUg
ZW50cnkgYWRkcmVzcworCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeQogCWJlcQkJ
azEsIHplcm8sIDJmCQkJIyA9PTAgLS0gbm8gcGFnZSB0YWJsZQorCW5vcAorCisjaWZkZWYgTUlQ
UzY0X05FV19QTUFQCisJIyBDaGVjayBmb3Igc3VwZXJwYWdlCisJR0VUX1NVUEVSUEFHRV9JRFgo
azEpCQkJCSMgazE9c3VwZXJwYWdlIGluZGV4IGZyb20gUFRFCisJYmVxCQlrMSwgemVybywgbm90
X3N1cGVycGFnZQkJIyA9PTAgLS0gbm90IHN1cGVycGFnZQorCVBUUl9MCQlrMSwgMChrMCkJCQkj
IGsxPXBkZSBlbnRyeSAoZGVsYXkgc2xvdCkKKworCSMgU2V0IHRoZSByZWZlcmVuY2VkIGJpdCBp
biB0aGUgUERFIGlmIHZhbGlkLgorCSMKKwkjIFhYWCBTZXR0aW5nIHRoZSByZWZlcmVuY2VkIGJp
dCBoZXJlIHNhdmVzIGEgZmF1bHQgbGF0ZXIgYnV0IGl0CisJIyBtYXkgbm90IGJlIHNhZmUgdG8g
ZG8gc28uIFRoZXJlZm9yZSwganVzdCB0YWtlIHRoZSBmYXVsdCB0byBzZXQKKwkjIHRoZSByZWZl
cmVuY2UgYml0LgorIwlJRl9WQUxJRF9TRVRfUkVGQklUKGsxLCBrMCwgMCwgMSkKKworCSMgVGhl
IFBERSBpcyBhY3R1YWxseSBhIHN1cGVycGFnZSBQVEUuICBTdG9yZSBpdCBpbiB0aGUgVExCIGxv
MCByZWcuCisJQ0xFQVJfUFRFX1NXQklUUyhrMSkKKwlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9U
TEJfTE8wCQkjIGxvMCBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgQ29tcHV0ZSB0aGUgUEZO
IGZvciB0aGUgVExCIGxvMSByZWdpc3RlciBmcm9tIGsxKD1QVEUgZm9yIFRMQiBsbzApLgorCUdF
VF9PRERfMU1fUEZOX0ZST01fRVZFTihrMSkJCQkjIGsxPU9kZCBQRk4gaW4gUFRFIHBvc3Rpb24K
KworCSMgR2V0IGhhcmQgVExCIGZsYWcgYml0cy4KKwlQVFJfTAkJazAsIDAoazApCQkJIyBrMD1w
ZGUgZW50cnkgKGFnYWluKQorCUdFVF9IV19UTEJfRkxBR1MoazApCQkJCSMgazA9aHcgVExCIGZs
YWcgYml0cworCW9yCQlrMSwgazEsIGswCQkJIyBrMT1QVEU9UEZOIHwgaHdmbGcgYml0cworCSMg
TG9hZCBpdCBpbnRvIHRoZSBUTEIgTG8xIHJlZ2lzdGVyLgorCSNDTEVBUl9QVEVfU1dCSVRTKGsx
KQkJCQkjIE5vIFNXIGJpdHMgdG8gY2xlYXIKKwlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJf
TE8xCQkjIGxvMSBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgTG9hZCB0aGUgVExCIFBhZ2VN
YXNrIGZvciAxTSBwYWdlcy4KKwlkbGkJCWswLCBUTEJNQVNLXzFNX1BBR0UJCSMgUGFnZU1hc2sg
Zm9yIDFNIFBhZ2UKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwkjIFBhZ2VN
YXNrIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJdGxid3IJCQkJCQkjIHdyaXRlIHRvIHRsYgor
CUhBWkFSRF9ERUxBWQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJIyB6
ZXJvIG91dCBQYWdlTWFzayByZWcKKwlDT1AwX1NZTkMKKwllcmV0CQkJCQkJIyByZXR1cm4gZnJv
bSBleGNlcHRpb24KKworbm90X3N1cGVycGFnZToKKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAg
Ki8KICNlbmRpZgorCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQUREUgkjIGswPWJhZCBhZGRy
ZXNzIChhZ2FpbikKIAlQVFJfU1JMCQlrMCwgUEFHRV9TSElGVCAtIFBURVNISUZUCSMwYjogazA9
VlBOIChha2EgdmE+PjEwKQogCWFuZGkJCWswLCBrMCwgUFRFMk1BU0sJCSMwYzogazA9cGFnZSB0
YWIgb2Zmc2V0CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMwZDogazE9cHRlIGFkZHJlc3MKLQlQ
VEVfTAkJazAsIDAoazEpCQkJIzBlOiBrMD1sbzAgcHRlCi0JUFRFX0wJCWsxLCBQVEVTSVpFKGsx
KQkJCSMwZjogazE9bG8wIHB0ZQorCisJUFRFX0wJCWswLCAwKGsxKQkJCSMgazA9bG8wIHB0ZQor
CisJIyBTZXQgdGhlIHJlZmVyZW5jZWQgYml0IGluIHRoZSBQREUgaWYgdmFsaWQuCisJIworCSMg
WFhYIFNldHRpbmcgdGhlIHJlZmVyZW5jZWQgYml0IGhlcmUgc2F2ZXMgYSBmYXVsdCBsYXRlciBi
dXQgaXQKKwkjIG1heSBub3QgYmUgc2FmZSB0byBkbyBzby4gVGhlcmVmb3JlLCBqdXN0IHRha2Ug
dGhlIGZhdWx0IHRvIHNldAorCSMgdGhlIHJlZmVyZW5jZSBiaXQuCisjCUlGX1ZBTElEX1NFVF9S
RUZCSVQoazAsIGsxLCAwLCAyKQorCiAJQ0xFQVJfUFRFX1NXQklUUyhrMCkKIAlQVEVfTVRDMAlr
MCwgTUlQU19DT1BfMF9UTEJfTE8wCQkjMTI6IGxvMCBpcyBsb2FkZWQKIAlDT1AwX1NZTkMKLQlD
TEVBUl9QVEVfU1dCSVRTKGsxKQotCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMx
NTogbG8xIGlzIGxvYWRlZAorCisJUFRFX0wJCWswLCBQVEVTSVpFKGsxKQkJCSMgazA9bG8xIHB0
ZQorCisJIyBTZXQgdGhlIHJlZmVyZW5jZWQgYml0IGluIHRoZSBQREUgaWYgdmFsaWQuCisJIwor
CSMgWFhYIFNldHRpbmcgdGhlIHJlZmVyZW5jZWQgYml0IGhlcmUgc2F2ZXMgYSBmYXVsdCBsYXRl
ciBidXQgaXQKKwkjIG1heSBub3QgYmUgc2FmZSB0byBkbyBzby4gVGhlcmVmb3JlLCBqdXN0IHRh
a2UgdGhlIGZhdWx0IHRvIHNldAorCSMgdGhlIHJlZmVyZW5jZSBiaXQuCisjCUlGX1ZBTElEX1NF
VF9SRUZCSVQoazAsIGsxLCAwLCAzKQorCisJQ0xFQVJfUFRFX1NXQklUUyhrMCkKKwlQVEVfTVRD
MAlrMCwgTUlQU19DT1BfMF9UTEJfTE8xCQkjMTU6IGxvMSBpcyBsb2FkZWQKIAlDT1AwX1NZTkMK
IAl0bGJ3cgkJCQkJCSMxYTogd3JpdGUgdG8gdGxiCiAJSEFaQVJEX0RFTEFZCiAJZXJldAkJCQkJ
CSMxZjogcmV0VXJuIGZyb20gZXhjZXB0aW9uCisKIDE6CWoJCU1pcHNUTEJNaXNzRXhjZXB0aW9u
CQkjMjA6IGtlcm5lbCBleGNlcHRpb24KIAlub3AJCQkJCQkjMjE6IGJyYW5jaCBkZWxheSBzbG90
CiAyOglqCQlTbG93RmF1bHQJCQkjMjI6IG5vIHBhZ2UgdGFibGUgcHJlc2VudApAQCAtMjY1LDcg
KzM2NSw3IEBACiAjZW5kaWYKIAogLyoKLSAqIFNhdmUgQ1BVIGFuZCBDUDAgcmVnaXN0ZXIgc3Rh
dGUuCisgKiBTYXZlIENQVSBhbmQgQ1AwIHJlZ2lzdGVyIHN0YXRlIHdoZW4gdGFraW5nIGFuIGV4
Y2VwdGlvbiBpbiBrZXJuZWwgbW9kZS4KICAqCiAgKiBUaGlzIGlzIHN0cmFpZ2h0Zm9yd2FyZCBl
eGNlcHQgZm9yIHNhdmluZyB0aGUgZXhjZXB0aW9uIHByb2dyYW0KICAqIGNvdW50ZXIuIFRoZSBk
ZGIgYmFja3RyYWNlIGNvZGUgbG9va3MgZm9yIHRoZSBmaXJzdCBpbnN0cnVjdGlvbgpAQCAtNDA2
LDYgKzUwNiw3IEBACiAJU0FWRV9SRUcoYTEsIFNSLCBzcCkKIAlSRVNUT1JFX0NQVQkJCSMgdjAg
Y29udGFpbnMgdGhlIHJldHVybiBhZGRyZXNzLgogCXN5bmMKKwogCWVyZXQKIAkuc2V0CWF0CiBF
TkQoTWlwc0tlcm5HZW5FeGNlcHRpb24pCkBAIC04ODQsMjEgKzk4NSw2MCBAQAogCVBUUl9TUkwJ
CWswLCBQRFJTSElGVCAtIFBUUlNISUZUCQkjIGswPXBkZSBvZmZzZXQgKGFsbW9zdCkKIAliZXEJ
CWsxLCB6ZXJvLCBNaXBzS2VybkdlbkV4Y2VwdGlvbgkjID09MCAtLSBubyBwZGUgdGFiCiAJYW5k
aQkJazAsIGswLCBQREVQVFJNQVNLCQkjIGswPXBkZSBvZmZzZXQKLQlQVFJfQUREVQlrMSwgazAs
IGsxCQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcwotCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsxPXBk
ZSBlbnRyeQorCVBUUl9BRERVCWswLCBrMCwgazEJCQkjIGswPXBkZSBlbnRyeSBhZGRyZXNzCisJ
UFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5CiAKIAkvKiBWYWxpZGF0ZSBwZGUgdGFi
bGUgcG9pbnRlci4gICovCiAJYmVxegkJazEsIDNmCiAJbm9wCisKKyNpZmRlZiBNSVBTNjRfTkVX
X1BNQVAKKwkjIENoZWNrIGZvciBzdXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJ
IyBrMT1zdXBlcnBhZ2UgaW5kZXggZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfc3BnCQkj
ID09MCAtLSBub3Qgc3VwZXJwYWdlCisJUFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5
IChkZWxheSBzbG90KQorCisJLyogVmFsaWRhdGUgcGFnZSB0YWJsZSBlbnRyeS4gICovCisJYW5k
aQkJazEsIFBURV9WUgorCWJlcXoJCWsxLCAzZgorCW5vcAorCisJIyBUaGUgUERFIGlzIGFjdHVh
bGx5IGEgc3VwZXJwYWdlIFBURS4gIFN0b3JlIGl0IGluIHRoZSBUTEIgbG8wIHJlZy4KKwlDTEVB
Ul9QVEVfU1dCSVRTKGsxKQorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMgbG8w
IGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBDb21wdXRlIHRoZSBQRk4gZm9yIHRoZSBUTEIg
bG8xIHJlZ2lzdGVyIGZyb20gazEoPVBURSBmb3IgVExCIGxvMCkuCisJR0VUX09ERF8xTV9QRk5f
RlJPTV9FVkVOKGsxKQkJCSMgazE9T2RkIFBGTiBpbiBQVEUgcG9zdGlvbgorCisJIyBHZXQgaGFy
ZCBUTEIgZmxhZyBiaXRzLgorCVBUUl9MCQlrMCwgMChrMCkJCQkjIGswPXBkZSBlbnRyeSAoYWdh
aW4pCisJR0VUX0hXX1RMQl9GTEFHUyhrMCkJCQkJIyBrMD1odyBUTEIgZmxhZyBiaXRzCisJb3IJ
CWsxLCBrMSwgazAJCQkjIGsxPVBURT1QRk4gfCBod2ZsZyBiaXRzCisJIyBMb2FkIGl0IGludG8g
dGhlIFRMQiBMbzEgcmVnaXN0ZXIuCisJIyBDTEVBUl9QVEVfU1dCSVRTKGsxKQkJCQkjIE5vIFNX
IGJpdHMgdG8gY2xlYXIKKwlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJfTE8xCQkjIGxvMSBp
cyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgTG9hZCB0aGUgVExCIFBhZ2VNYXNrIGZvciAxTSBw
YWdlcy4KKwlkbGkJCWswLCBUTEJNQVNLXzFNX1BBR0UJCSMgUGFnZU1hc2sgZm9yIDFNIFBhZ2UK
KwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwkjIFBhZ2VNYXNrIGlzIGxvYWRl
ZAorCUNPUDBfU1lOQworCisJYgkJdGxiX2luc2VydF9lbnRyeQorCW5vcAorCitub3Rfc3BnOgor
I2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLwogI2VuZGlmCiAJTUZDMAkJazAsIE1JUFNfQ09Q
XzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogCVBUUl9TUkwJCWswLCBQQUdF
X1NISUZUIC0gUFRFU0hJRlQJIyBrMD1WUE4KIAlhbmRpCQlrMCwgazAsIFBURU1BU0sJCQkjIGsw
PXBhZ2UgdGFiIG9mZnNldAogCVBUUl9BRERVCWsxLCBrMSwgazAJCQkjIGsxPXB0ZSBhZGRyZXNz
CiAJUFRFX0wJCWswLCAwKGsxKQkJCSMgazA9dGhpcyBQVEUKIAogCS8qIFZhbGlkYXRlIHBhZ2Ug
dGFibGUgZW50cnkuICAqLwotCWFuZGkJCWswLCBQVEVfVgorCWFuZGkJCWswLCBQVEVfVlIKIAli
ZXF6CQlrMCwgM2YKIAlub3AKIApAQCAtOTA4LDI1ICsxMDQ4LDMxIEBACiAJbm9wCiAKIAlQVEVf
TAkJazAsIDAoazEpCi0JUFRFX0wJCWsxLCBQVEVTSVpFKGsxKQorCiAJQ0xFQVJfUFRFX1NXQklU
UyhrMCkKIAlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8wCiAJQ09QMF9TWU5DCi0JQ0xF
QVJfUFRFX1NXQklUUyhrMSkKLQlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJfTE8xCisKKwlQ
VEVfTAkJazAsIFBURVNJWkUoazEpCisKKwlDTEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMw
CWswLCBNSVBTX0NPUF8wX1RMQl9MTzEKIAlDT1AwX1NZTkMKIAogCWIJCXRsYl9pbnNlcnRfZW50
cnkKIAlub3AKIAogb2RkX3BhZ2U6CiAJUFRFX0wJCWswLCAtUFRFU0laRShrMSkKLQlQVEVfTAkJ
azEsIDAoazEpCisKIAlDTEVBUl9QVEVfU1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBTX0NP
UF8wX1RMQl9MTzAKIAlDT1AwX1NZTkMKLQlDTEVBUl9QVEVfU1dCSVRTKGsxKQotCVBURV9NVEMw
CWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEKKworCVBURV9MCQlrMCwgMChrMSkKKworCUNMRUFSX1BU
RV9TV0JJVFMoazApCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMQogCUNPUDBfU1lO
QwogCiB0bGJfaW5zZXJ0X2VudHJ5OgpAQCAtOTM2LDExICsxMDgyLDE1IEBACiAJYmx0egkJazAs
IHRsYl9pbnNlcnRfcmFuZG9tCiAJbm9wCiAJdGxid2kKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NP
UF8wX1RMQl9QR19NQVNLCisJQ09QMF9TWU5DCiAJZXJldAogCXNzbm9wCiAKIHRsYl9pbnNlcnRf
cmFuZG9tOgogCXRsYndyCisJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwor
CUNPUDBfU1lOQwogCWVyZXQKIAlzc25vcAogCkBAIC0xMDU0LDIxICsxMjA0LDY3IEBACiAjaWZk
ZWYgX19taXBzX242NAogCVBUUl9TUkwJCWswLCBQRFJTSElGVCAtIFBUUlNISUZUCQkjIGswPVZQ
TgogCWFuZGkJCWswLCBrMCwgUERFUFRSTUFTSwkJIyBrMD1wZGUgb2Zmc2V0Ci0JUFRSX0FERFUJ
azEsIGswLCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKLQlQVFJfTAkJazEsIDAoazEpCQkJ
IyBrMT1wZGUgZW50cnkKKwlQVFJfQUREVQlrMCwgazAsIGsxCQkJIyBrMT1wZGUgZW50cnkgYWRk
cmVzcworCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeQorCisjaWZkZWYgTUlQUzY0
X05FV19QTUFQCisJIyBDaGVjayBmb3Igc3VwZXJwYWdlCisJR0VUX1NVUEVSUEFHRV9JRFgoazEp
CQkJCSMgazE9c3VwZXJwYWdlIGluZGV4IGZyb20gUFRFCisJYmVxCQlrMSwgemVybywgbm90X2tz
cGcJCSMgPT0wIC0tIG5vdCBzdXBlcnBhZ2UKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUg
ZW50cnkgKGRlbGF5IHNsb3QpCisKKwkjIFhYWCBSZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorCisJ
IyBUaGUgUERFIGlzIGFjdHVhbGx5IGEgc3VwZXJwYWdlIFBURS4gIFN0b3JlIGl0IGluIHRoZSBU
TEIgbG8wIHJlZy4KKwlDTEVBUl9QVEVfU1dCSVRTKGsxKQorCVBURV9NVEMwCWsxLCBNSVBTX0NP
UF8wX1RMQl9MTzAJCSMgbG8wIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBDb21wdXRlIHRo
ZSBQRk4gZm9yIHRoZSBUTEIgbG8xIHJlZ2lzdGVyIGZyb20gazEoPVBURSBmb3IgVExCIGxvMCku
CisJR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVOKGsxKQkJCSMgazE9T2RkIFBGTiBpbiBQVEUgcG9z
dGlvbgorCisJIyBHZXQgaGFyZCBUTEIgZmxhZyBiaXRzLgorCVBUUl9MCQlrMCwgMChrMCkJCQkj
IGswPXBkZSBlbnRyeSAoYWdhaW4pCisJR0VUX0hXX1RMQl9GTEFHUyhrMCkJCQkJIyBrMD1odyBU
TEIgZmxhZyBiaXRzCisJb3IJCWsxLCBrMSwgazAJCQkjIGsxPVBURT1QRk4gfCBod2ZsZyBiaXRz
CisJIyBMb2FkIGl0IGludG8gdGhlIFRMQiBMbzEgcmVnaXN0ZXIuCisJI0NMRUFSX1BURV9TV0JJ
VFMoazEpCQkJCSMgTm8gU1cgQml0cyB0byBjbGVhcgorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8w
X1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBMb2FkIHRoZSBUTEIg
UGFnZU1hc2sgZm9yIDFNIHBhZ2VzLgorCWRsaQkJazAsIFRMQk1BU0tfMU1fUEFHRQkJIyBQYWdl
TWFzayBmb3IgMU0gUGFnZQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMg
UGFnZU1hc2sgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwl0bGJ3cgkJCQkJCSMgd3JpdGUgdG8g
dGxiCisJSEFaQVJEX0RFTEFZCisJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFT
SwkjIHplcm8gb3V0IFBhZ2VNYXNrIHJlZworCUNPUDBfU1lOQworCWVyZXQJCQkJCQkjIHJldHVy
biBmcm9tIGV4Y2VwdGlvbgorCitub3Rfa3NwZzoKKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAg
Ki8KKwogCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQUREUgkjIGswPWJhZCBhZGRyZXNzIChh
Z2FpbikKICAgCWJlcQkJazEsIHplcm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5v
IHBhZ2UgdGFibGUKICNlbmRpZgogCVBUUl9TUkwJCWswLCBQQUdFX1NISUZUIC0gUFRFU0hJRlQJ
IyBrMD1WUE4KIAlhbmRpCQlrMCwgazAsIFBURTJNQVNLCQkjIGswPXBhZ2UgdGFiIG9mZnNldAog
CVBUUl9BRERVCWsxLCBrMSwgazAJCQkjIGsxPXB0ZSBhZGRyZXNzCisKIAlQVEVfTAkJazAsIDAo
azEpCQkJIyBrMD1sbzAgcHRlCi0JUFRFX0wJCWsxLCBQVEVTSVpFKGsxKQkJCSMgazE9bG8xIHB0
ZQorCisJIyBYWFggUmVmZXJlbmNlIGJpdCBlbXVsYXRpb24KKwogCUNMRUFSX1BURV9TV0JJVFMo
azApCiAJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9hZGVkCiAJ
Q09QMF9TWU5DCi0JQ0xFQVJfUFRFX1NXQklUUyhrMSkKLQlQVEVfTVRDMAlrMSwgTUlQU19DT1Bf
MF9UTEJfTE8xCQkjIGxvMSBpcyBsb2FkZWQKKworCVBURV9MCQlrMCwgUFRFU0laRShrMSkJCQkj
IGswPWxvMSBwdGUKKworCUNMRUFSX1BURV9TV0JJVFMoazApCisJUFRFX01UQzAJazAsIE1JUFNf
Q09QXzBfVExCX0xPMQkJIyBsbzEgaXMgbG9hZGVkCiAJQ09QMF9TWU5DCiAJdGxid3IJCQkJCSMg
d3JpdGUgdG8gdGxiCiAJSEFaQVJEX0RFTEFZCmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL2Nw
dS5jIGIvc3lzL21pcHMvbWlwcy9jcHUuYwotLS0gYS9zeXMvbWlwcy9taXBzL2NwdS5jCisrKyBi
L3N5cy9taXBzL21pcHMvY3B1LmMKQEAgLTMxMyw2ICszMTMsMjUgQEAKIAljcHVpbmZvLT5sMi5k
Y19zaXplID0gY3B1aW5mby0+bDIuZGNfbGluZXNpemUKIAkgICAgKiBjcHVpbmZvLT5sMi5kY19u
c2V0cyAqIGNwdWluZm8tPmwyLmRjX253YXlzOwogI2VuZGlmCisKKwkvKgorCSAqIFByb2JlIFBh
Z2VNYXNrIHJlZ2lzdGVyIHRvIHNlZSB3aGF0IHNpemVzIG9mIHBhZ2VzIGFyZSBzdXBwb3J0ZWQK
KwkgKiBieSB3cml0aW5nIGFsbCBvbmUncyBhbmQgdGhlbiByZWFkaW5nIGl0IGJhY2suCisJICov
CisJbWlwc193cl9wYWdlbWFzayh+MCk7CisJY3B1aW5mby0+dGxiX3BnbWFzayA9IG1pcHNfcmRf
cGFnZW1hc2soKTsKKwltaXBzX3dyX3BhZ2VtYXNrKE1JUFMzX1BHTUFTS180Syk7CisKKyNpZmRl
ZiBLU1RBQ0tfTEFSR0VfUEFHRQorCWlmICgoY3B1aW5mby0+dGxiX3BnbWFzayAmIE1JUFMzX1BH
TUFTS18xNkspID09IDApCisJCXBhbmljKCIlczogMTZLIHNpemVkIHBhZ2VzIGFyZSBub3Qgc3Vw
cG9ydGVkIGJ5IHRoaXMgQ1BVLiIsCisJCSAgICBfX2Z1bmNfXyk7CisjZW5kaWYgLyogS1NUQUNL
X0xBUkdFX1BBR0UgKi8KKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwlpZiAoKGNwdWluZm8tPnRs
Yl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMU0pID09IDApCisJCXBhbmljKCIlczogMU0gc2l6ZWQg
cGFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBDUFUuIiwKKwkJICAgIF9fZnVuY19fKTsK
KyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KIH0KIAogdm9pZApAQCAtMzg5LDYgKzQwOCwz
MCBAQAogCQkJcHJpbnRmKCJGaXhlZCBtYXBwaW5nIik7CiAJCX0KIAkJcHJpbnRmKCIsICVkIGVu
dHJpZXMgIiwgY3B1aW5mby50bGJfbmVudHJpZXMpOworCQlpZiAoY3B1aW5mby50bGJfcGdtYXNr
KSB7CisJCQlwcmludGYoIigiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19Q
R01BU0tfTUFTS1gpCisJCQkJcHJpbnRmKCIxSyAiKTsKKwkJCXByaW50ZigiNEsgIik7CisJCQlp
ZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzE2SykKKwkJCQlwcmludGYoIjE2
SyAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfNjRLKQorCQkJ
CXByaW50ZigiNjRLICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFT
S18yNTZLKQorCQkJCXByaW50ZigiMjU2SyAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sg
JiBNSVBTM19QR01BU0tfMU0pCisJCQkJcHJpbnRmKCIxTSAiKTsKKwkJCWlmIChjcHVpbmZvLnRs
Yl9wZ21hc2sgJiBNSVBTM19QR01BU0tfNE0pCisJCQkJcHJpbnRmKCI0TSAiKTsKKwkJCWlmIChj
cHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMTZNKQorCQkJCXByaW50ZigiMTZNICIp
OworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS182NE0pCisJCQkJcHJp
bnRmKCI2NE0gIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzI1
Nk0pCisJCQkJcHJpbnRmKCIyNTZNICIpOworCQkJcHJpbnRmKCJwZyBzaXplcykiKTsKKwkJfQor
CQlwcmludGYoIlxuIik7CiAJfQogCiAJaWYgKGNwdWluZm8udGxiX3BnbWFzaykgewpkaWZmIC0t
Z2l0IGEvc3lzL21pcHMvaW5jbHVkZS92bXBhcmFtLmggYi9zeXMvbWlwcy9pbmNsdWRlL3ZtcGFy
YW0uaAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3ZtcGFyYW0uaAorKysgYi9zeXMvbWlwcy9pbmNs
dWRlL3ZtcGFyYW0uaApAQCAtMTAwLDE1ICsxMDAsNDcgQEAKICNkZWZpbmUJRlJFRUJTRDMyX1VT
UlNUQUNLCSgoKHZtX29mZnNldF90KTB4ODAwMDAwMDApIC0gUEFHRV9TSVpFKQogI2VuZGlmCiAK
KyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKIC8qCi0gKiBEaXNhYmxlIHN1cGVycGFnZSByZXNlcnZh
dGlvbnMuIChub3Qgc3VyZSBpZiB0aGlzIGlzIHJpZ2h0Ci0gKiBJIGNvcGllZCBpdCBmcm9tIEFS
TSkKKyAqIEVuYWJsZSBzdXBlcnBhZ2UgcmVzZXJ2YXRpb25zOiAxIGxldmVsLgorICoKKyAqIFZN
X05SRVNFUlZMRVZFTCBzcGVjaWZpZXMgYSBudW1iZXIgb2YgcHJvbW90aW9uIGxldmVscyBlbmFi
bGVkLgorICogQ3VycmVudGx5IG1pcHM2NCBvbmx5IHN1cHBvcnRzIG9uZSBzaXplIG9yIGxldmVs
IChWTV9MRVZFTF8wX09SREVSKSBvZgorICogc3VwZXJwYWdlcyAoMk1CKQorICovCisjaWZuZGVm
CVZNX05SRVNFUlZMRVZFTAorI2RlZmluZQlWTV9OUkVTRVJWTEVWRUwJCQkxCisjZW5kaWYKKwor
LyoKKyAqIExldmVsIDAgcmVzZXJ2YXRpb25zIGNvbnNpc3Qgb2YgNTEyICgyXjkpIHBhZ2VzICgy
TUIpLgorICovCisjaWZuZGVmCVZNX0xFVkVMXzBfT1JERVIKKyNkZWZpbmUJVk1fTEVWRUxfMF9P
UkRFUgkJOQorI2VuZGlmCisKKy8qCisgKiBUaGUgbGFyZ2VzdCBhbGxvY2F0aW9uIHNpemUgaXMg
NE1CLgorICovCisjZGVmaW5lCVZNX05GUkVFT1JERVIJCQkxMQorCisjZWxzZSAvKiAhIE1JUFM2
NF9ORVdfUE1BUCAqLworCisvKgorICogRGlzYWJsZSBzdXBlcnBhZ2UgcmVzZXJ2YXRpb25zLgog
ICovCiAjaWZuZGVmCVZNX05SRVNFUlZMRVZFTAogI2RlZmluZQlWTV9OUkVTRVJWTEVWRUwJCTAK
ICNlbmRpZgogCiAvKgorICogVGhlIGxhcmdlc3QgYWxsb2NhdGlvbiBzaXplIGlzIDFNQi4KKyAq
LworI2RlZmluZQlWTV9ORlJFRU9SREVSCQk5CisKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1B
UCAqLworCisvKgogICogSG93IG1hbnkgcGh5c2ljYWwgcGFnZXMgcGVyIGttZW0gYXJlbmEgdmly
dHVhbCBwYWdlLgogICovCiAjaWZuZGVmIFZNX0tNRU1fU0laRV9TQ0FMRQpAQCAtMTc3LDExICsy
MDksNiBAQAogI2RlZmluZQlWTV9MT1dNRU1fQk9VTkRBUlkJKCh2bV9wYWRkcl90KTB4MjAwMDAw
MDApCiAjZW5kaWYKIAotLyoKLSAqIFRoZSBsYXJnZXN0IGFsbG9jYXRpb24gc2l6ZSBpcyAxTUIu
Ci0gKi8KLSNkZWZpbmUJVk1fTkZSRUVPUkRFUgkJOQotCiAjZGVmaW5lCVpFUk9fUkVHSU9OX1NJ
WkUJKDY0ICogMTAyNCkJLyogNjRLQiAqLwogCiAjaWZuZGVmIF9fbWlwc19uNjQKZGlmZiAtLWdp
dCBhL3N5cy9taXBzL2luY2x1ZGUvcHRlLmggYi9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oCi0tLSBh
L3N5cy9taXBzL2luY2x1ZGUvcHRlLmgKKysrIGIvc3lzL21pcHMvaW5jbHVkZS9wdGUuaApAQCAt
MjksNiArMjksMTAgQEAKICNpZm5kZWYJX01BQ0hJTkVfUFRFX0hfCiAjZGVmaW5lCV9NQUNISU5F
X1BURV9IXwogCisjaWYgIWRlZmluZWQoX0tFUk5FTCkKKyNpbmNsdWRlIDxtYWNoaW5lL3BhcmFt
Lmg+CisjZW5kaWYKKwogI2lmbmRlZiBfTE9DT1JFCiAjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8
fCBkZWZpbmVkKF9fbWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KIHR5cGVkZWYJdWlu
dDY0X3QgcHRfZW50cnlfdDsKQEAgLTcyLDIyICs3NiwyNSBAQAogICogTk9URTogVGhpcyBtZWFu
cyB0aGF0IGZvciAzMi1iaXQgdXNlIG9mIENQMCwgd2UgYXJlbid0IGFibGUgdG8gc2V0IHRoZSB0
b3AKICAqIGJpdCBvZiBQRk4gdG8gYSBub24temVybyB2YWx1ZSwgYXMgc29mdHdhcmUgaXMgdXNp
bmcgaXQhICBUaGlzIHBoeXNpY2FsCiAgKiBtZW1vcnkgc2l6ZSBsaW1pdCBtYXkgbm90IGJlIHN1
ZmZpY2llbnRseSBlbmZvcmNlZCBlbHNld2hlcmUuCisgKgorICogWFhYUlc6IE9uIENIRVJJLCBi
aXRzIDYzIGFuZCA2MiBhcmUgdXNlZCBmb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyB0aGF0Cisg
KiBwcmV2ZW50IGxvYWRpbmcgYW5kIHN0b3Jpbmcgb2YgY2FwYWJpbGl0aWVzLCBzbyB3ZSBoYXZl
IHJlZHVjZWQgdGhlIDU1LWJpdAorICogc2hpZnQgdG8gNTMgYml0cy4KICAqLwogI2lmIGRlZmlu
ZWQoX19taXBzX242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklU
ICovCi0jZGVmaW5lCVRMQkxPX1NXQklUU19TSElGVAkoNTUpCi0jZGVmaW5lCVRMQkxPX1NXQklU
U19DTEVBUl9TSElGVAkoOSkKLSNkZWZpbmUJVExCTE9fUEZOX01BU0sJCTB4M0ZGRkZGRkMwVUxM
CisjZGVmaW5lCVRMQkxPX1NXQklUU19TSElGVAkoNTMpCQkvKiBYWFhSVzogV2FzIDU1LiAqLwor
I2RlZmluZQlUTEJMT19SRUZfQklUX1NISUZUCSg2MSkKKyNkZWZpbmUJVExCTE9fU1dCSVRTX0NM
RUFSX1NISUZUCSgxMSkJLyogWFhYU1M6IFdhcyA5LiAqLworI2RlZmluZQlUTEJMT19QRk5fTUFT
SwkJMHhGRkZGRkZDMFVMTAorI2RlZmluZQlUTEJfMU1fU1VQRVJQQUdFX1NISUZUCShQRFJTSElG
VCkKKyNkZWZpbmUJVExCTE9fU1dCSVRTX01BU0sJKChwdF9lbnRyeV90KTB4N0YgPDwgVExCTE9f
U1dCSVRTX1NISUZUKQogI2Vsc2UKICNkZWZpbmUJVExCTE9fU1dCSVRTX1NISUZUCSgyOSkKICNk
ZWZpbmUJVExCTE9fU1dCSVRTX0NMRUFSX1NISUZUCSgzKQogI2RlZmluZQlUTEJMT19QRk5fTUFT
SwkJKDB4MUZGRkZGQzApCisjZGVmaW5lCVRMQkxPX1NXQklUU19NQVNLCSgocHRfZW50cnlfdCkw
eDcgPDwgVExCTE9fU1dCSVRTX1NISUZUKQogI2VuZGlmCiAjZGVmaW5lCVRMQkxPX1BGTl9TSElG
VAkJKDYpCi0jZGVmaW5lCVRMQkxPX1NXQklUU19NQVNLCSgocHRfZW50cnlfdCkweDcgPDwgVExC
TE9fU1dCSVRTX1NISUZUKQotI2RlZmluZQlUTEJMT19QQV9UT19QRk4ocGEpCSgoKChwYSkgPj4g
VExCX1BBR0VfU0hJRlQpIDw8IFRMQkxPX1BGTl9TSElGVCkgJiBUTEJMT19QRk5fTUFTSykKLSNk
ZWZpbmUJVExCTE9fUEZOX1RPX1BBKHBmbikJKCh2bV9wYWRkcl90KSgocGZuKSA+PiBUTEJMT19Q
Rk5fU0hJRlQpIDw8IFRMQl9QQUdFX1NISUZUKQotI2RlZmluZQlUTEJMT19QVEVfVE9fUEZOKHB0
ZSkJKChwdGUpICYgVExCTE9fUEZOX01BU0spCi0jZGVmaW5lCVRMQkxPX1BURV9UT19QQShwdGUp
CShUTEJMT19QRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTigocHRlKSkpKQogCiAvKgogICogWFhY
IFRoaXMgY29tbWVudCBpcyBub3QgY29ycmVjdCBmb3IgYW55dGhpbmcgbW9yZSBtb2Rlcm4gdGhh
biBSNEsuCkBAIC0xMjEsMjUgKzEyOCw4MyBAQAogI2VuZGlmIC8qIGRlZmluZWQoX19taXBzX242
NCkgKi8KIAogLyoKKyAqIFBURSBIYXJkd2FyZSBCaXRzIChFbnRyeUxvMC0xIHJlZ2lzdGVyIGZp
ZWxkcykKKyAqCisgKiBMb3dlciBiaXRzIG9mIGEgMzIgYml0IFBURToKKyAqCisgKiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAyOCAtLS0tLS0tLS0tLS0tLS0gNiA1IC0gMyAgMiAg
IDEgICAwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB8ICAgICAgICAgUEZOICAgICAgICB8ICBDICB8IEQgfCBWUnwgRyB8CisgKiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQorICoKKyAqIExvd2VyIGJpdHMgb2YgYSA2NCBiaXQgUFRFOgorICoKKyAqICA1MiAt
LS0tLS0tLS0tLS0tLS0tLS0tLSAzNCAgMzMgLS0tLS0tLS0tLS0tLS0tLS0tLSA2IDUgLSAzICAy
ICAgMSAgIDAKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgIFJlc2VydmVkIChaZXJvKSAg
ICAgfCAgICAgICAgICBQRk4gICAgICAgICAgIHwgIEMgIHwgRCB8IFZSfCBHIHwKKyAqICAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisgKgogICogVExCIGZsYWdzIG1hbmFnZWQgaW4gaGFyZHdhcmU6CisgKiAgICBQ
Rk46CVBhZ2UgRnJhbWUgTnVtYmVyLgogICogCUM6CUNhY2hlIGF0dHJpYnV0ZS4KICAqIAlEOglE
aXJ0eSBiaXQuICBUaGlzIG1lYW5zIGEgcGFnZSBpcyB3cml0YWJsZS4gIEl0IGlzIG5vdAogICog
CQlzZXQgYXQgZmlyc3QsIGFuZCBhIHdyaXRlIGlzIHRyYXBwZWQsIGFuZCB0aGUgZGlydHkKICAq
IAkJYml0IGlzIHNldC4gIFNlZSBhbHNvIFBURV9STy4KLSAqIAlWOglWYWxpZCBiaXQuICBPYnZp
b3VzLCBpc24ndCBpdD8KKyAqIAlWUjoJVmFsaWQvUmVmZXJlbmNlIGJpdC4gU2VlIGFsc28gUFRF
X1NWLgogICogCUc6CUdsb2JhbCBiaXQuICBUaGlzIG1lYW5zIHRoYXQgdGhpcyBtYXBwaW5nIGlz
IHByZXNlbnQKICAqIAkJaW4gRVZFUlkgYWRkcmVzcyBzcGFjZSwgYW5kIHRvIGlnbm9yZSB0aGUg
QVNJRCB3aGVuCiAgKiAJCWl0IGlzIG1hdGNoZWQuCiAgKi8KICNkZWZpbmUJUFRFX0MoYXR0cikJ
CSgoYXR0ciAmIDB4MDcpIDw8IDMpCiAjZGVmaW5lCVBURV9DX1VOQ0FDSEVECQkoUFRFX0MoTUlQ
U19DQ0FfVU5DQUNIRUQpKQogI2RlZmluZQlQVEVfQ19DQUNIRQkJKFBURV9DKE1JUFNfQ0NBX0NB
Q0hFRCkpCiAjZGVmaW5lCVBURV9ECQkJMHgwNAotI2RlZmluZQlQVEVfVgkJCTB4MDIKKyNkZWZp
bmUJUFRFX1ZSCQkJMHgwMgogI2RlZmluZQlQVEVfRwkJCTB4MDEKIAorI2lmZGVmIENQVV9DSEVS
SQorLyoKKyAqIENIRVJJIEVudHJ5TG8gZXh0ZW5zaW9ucyB0aGF0IGxpbWl0IHN0b3JpbmcgbG9h
ZGluZyBhbmQgc3RvcmluZyB0YWdnZWQKKyAqIHZhbHVlcy4KKyAqLworI2RlZmluZQlQVEVfU0MJ
CQkoMHgxVUxMIDw8IDYzKQorI2RlZmluZQlQVEVfTEMJCQkoMHgxVUxMIDw8IDYyKQorI2VuZGlm
CisKIC8qCisgKiBQVEUgU29mdHdhcmUgQml0cworICoKKyAqIFVwcGVyIGJpdHMgb2YgYSAzMiBi
aXQgUFRFOgorICoKKyAqICAgICAzMSAgIDMwICAgMjkKKyAqICAgIC0tLS0tLS0tLS0tLS0tCisg
KiAgIHwgTU4gfCBXICB8IFJPIHwKKyAqICAgIC0tLS0tLS0tLS0tLS0tCisgKgorICogVXBwZXIg
Yml0cyBvZiBhIDY0IGJpdCBQVEU6CisgKgorICogICA2My02MiAgIDYxLTYwICA1OSAgIDU4IC0t
IDU2ICAgIDU1ICAgNTQgICA1MworICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KKyAqICB8ICBSRyAgfCAgICAgIHwgU1YgfCBQRyBTWiBJRFggfCBNTiB8
IFcgIHwgUk8gfAorICogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KKyAqCiAgKiBWTSBmbGFncyBtYW5hZ2VkIGluIHNvZnR3YXJlOgorICoJUkc6CVJlZ2lv
bi4JIChSZXNlcnZlZC4gQ3VycmVudGx5IG5vdCB1c2VkLikKKyAqCVNWOglTb2Z0IFZhbGlkIGJp
dC4KKyAqCVBHIFNaIElEWDogUGFnZSBTaXplIEluZGV4ICgwLTcpLgorICoJCUluZGV4CVBhZ2Ug
TWFzayAoQmluYXJ5KQlIVyBQYWdlIFNpemUKKyAqCQktLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0t
CS0tLS0tLS0tLS0tLQorICoJCTAJMDAwMCAwMDAwIDAwMDAgMDAwMAkgIDRLCisgKgkJMQkwMDAw
IDAwMDAgMDAwMCAwMDExCSAxNksKKyAqCQkyCTAwMDAgMDAwMCAwMDAwIDExMTEJIDY0SworICoJ
CTMJMDAwMCAwMDAwIDAwMTEgMTExMQkyNTZLCisgKgkJNAkwMDAwIDAwMDAgMTExMSAxMTExCSAg
MU0KKyAqCQk1CTAwMDAgMDAxMSAxMTExIDExMTEJICA0TQorICoJCTYJMDAwMCAxMTExIDExMTEg
MTExMQkgMTZNCisgKiAoTUlQUyAzOikKKyAqCQk3CTAwMTEgMTExMSAxMTExIDExMTEJIDY0TQor
ICoJCTgJMTExMSAxMTExIDExMTEgMTExMQkyNTZNIChOb3QgY3VycmVudGx5IHN1cHBvcnRlZCkK
KyAqCiAgKiAJUk86CVJlYWQgb25seS4gIE5ldmVyIHNldCBQVEVfRCBvbiB0aGlzIHBhZ2UsIGFu
ZCBkb24ndAogICogCQlsaXN0ZW4gdG8gcmVxdWVzdHMgdG8gd3JpdGUgdG8gaXQuCiAgKiAJVzoJ
V2lyZWQuICA/Pz8KQEAgLTE1MSwxMyArMjE2LDI5MSBAQAogI2RlZmluZQlQVEVfUk8JCQkoKHB0
X2VudHJ5X3QpMHgwMSA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCiAjZGVmaW5lCVBURV9XCQkJKChw
dF9lbnRyeV90KTB4MDIgPDwgVExCTE9fU1dCSVRTX1NISUZUKQogI2RlZmluZQlQVEVfTUFOQUdF
RAkJKChwdF9lbnRyeV90KTB4MDQgPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2lmIGRlZmluZWQo
X19taXBzX242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklUICov
CisjZGVmaW5lCVBURV9QU18xNksJCSgocHRfZW50cnlfdCkweDA4IDw8IFRMQkxPX1NXQklUU19T
SElGVCkKKyNkZWZpbmUJUFRFX1BTXzY0SwkJKChwdF9lbnRyeV90KTB4MTAgPDwgVExCTE9fU1dC
SVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfMjU2SwkJKChwdF9lbnRyeV90KTB4MTggPDwgVExC
TE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfMU0JCSgocHRfZW50cnlfdCkweDIwIDw8
IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzRNCQkoKHB0X2VudHJ5X3QpMHgy
OCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU18xNk0JCSgocHRfZW50cnlf
dCkweDMwIDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzY0TQkJKChwdF9l
bnRyeV90KTB4MzggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfSURYX01B
U0sJCSgocHRfZW50cnlfdCkweDM4IDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRF
X1BTSURYX05CSVRTX1RPX0xFRlQJCTUKKyNkZWZpbmUJUFRFX1BTSURYX05CSVRTX1RPX1JJR0hU
CTU2CisjZGVmaW5lCVBURV9QRk5fTkJJVFNfVE9fTEVGVAkJMTEKKyNkZWZpbmUJUFRFX1BGTl9O
QklUU19UT19SSUdIVAkJNgorI2RlZmluZQlQVEVfSFdGTEFHU19OQklUU19UT19MRUZUCTU4Cisj
ZGVmaW5lCVNXX1ZBTElECQkweDQwCisjZGVmaW5lCVBURV9TVgkJCSgocHRfZW50cnlfdClTV19W
QUxJRCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZWxzZQorI2RlZmluZQlQVEVfUFNfSURYX01B
U0sJCTAKKyNkZWZpbmUJUFRFX1NWCQkJMAorI2VuZGlmCisKKy8qCisgKiBQcm9tb3Rpb24gdG8g
YSA0TUIgKFBERSkgcGFnZSBtYXBwaW5nIHJlcXVpcmVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcg
NEtCCisgKiAoUFRFKSBwYWdlIG1hcHBpbmdzIGhhdmUgaWRlbnRpY2FsIHNldHRpbmdzIGZvciB0
aGUgZm9sbG93aW5nIGZpZWxkczoKKyAqLworI2RlZmluZQlQR19QUk9NT1RFX01BU0sJKFBURV9H
IHwgUFRFX1ZBTElEIHwgUFRFX0QgfCBQVEVfQ19VTkNBQ0hFRCB8IFwKKwkJCVBURV9DX0NBQ0hF
IHwgUFRFX1JPIHwgUFRFX1cgfCBQVEVfTUFOQUdFRCB8IFwKKwkJCVBURV9SRUYpCisKKyNpZmRl
ZiBNSVBTNjRfTkVXX1BNQVAKKyNkZWZpbmUJVExCTE9fUFRFX1RPX0lEWChwdGUpCSgoKHB0ZSkg
JiBQVEVfUFNfSURYX01BU0spID4+IDU2KQorI2RlZmluZQlUTEJNQVNLX0lEWF9UT19NQVNLKGlk
eCkgKCgoMSA8PCAoKGlkeCkgPDwgMSkpIC0gMSkgPDwgVExCTUFTS19TSElGVCkKKyNkZWZpbmUJ
VExCTE9fUFRFX1RPX01BU0socHRlKQlUTEJNQVNLX0lEWF9UT19NQVNLKFRMQkxPX1BURV9UT19J
RFgocHRlKSkKKyNkZWZpbmUJVExCTUFTS180S19QQUdFCQlUTEJNQVNLX0lEWF9UT19NQVNLKDAp
CisjZGVmaW5lCVRMQk1BU0tfMTZLX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSygxKQorI2RlZmlu
ZQlUTEJNQVNLXzY0S19QQUdFCVRMQk1BU0tfSURYX1RPX01BU0soMikKKyNkZWZpbmUJVExCTUFT
S18yNTZLX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSygzKQorI2RlZmluZQlUTEJNQVNLXzFNX1BB
R0UJCVRMQk1BU0tfSURYX1RPX01BU0soNCkKKyNkZWZpbmUJVExCTUFTS180TV9QQUdFCQlUTEJN
QVNLX0lEWF9UT19NQVNLKDUpCisjZGVmaW5lCVRMQk1BU0tfMTZNX1BBR0UJVExCTUFTS19JRFhf
VE9fTUFTSyg2KQorI2RlZmluZQlUTEJNQVNLXzY0TV9QQUdFCVRMQk1BU0tfSURYX1RPX01BU0so
NykKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICovCisjZGVmaW5lCVRMQkxPX1BURV9UT19J
RFgocHRlKSAJMAorI2RlZmluZQlUTEJMT19QVEVfVE9fTUFTSyhwdGUpCTAKKyNlbmRpZiAvKiAh
IE1JUFM2NF9ORVdfUE1BUCAqLwogCiAvKgogICogUFRFIG1hbmFnZW1lbnQgZnVuY3Rpb25zIGZv
ciBiaXRzIGRlZmluZWQgYWJvdmUuCiAgKi8KLSNkZWZpbmUJcHRlX2NsZWFyKHB0ZSwgYml0KQko
KihwdGUpICY9IH4oYml0KSkKLSNkZWZpbmUJcHRlX3NldChwdGUsIGJpdCkJKCoocHRlKSB8PSAo
Yml0KSkKLSNkZWZpbmUJcHRlX3Rlc3QocHRlLCBiaXQpCSgoKihwdGUpICYgKGJpdCkpID09IChi
aXQpKQorI2lmbmRlZiBfTE9DT1JFCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcHRlX2NsZWFyKHB0
X2VudHJ5X3QgKnB0ZSwgcHRfZW50cnlfdCBiaXQpCit7CisKKwkqcHRlICY9ICh+Yml0KTsKK30K
Kworc3RhdGljIF9faW5saW5lIHZvaWQKK3B0ZV9zZXQocHRfZW50cnlfdCAqcHRlLCBwdF9lbnRy
eV90IGJpdCkKK3sKKworCSpwdGUgfD0gYml0OworfQorCitzdGF0aWMgX19pbmxpbmUgaW50Citw
dGVfdGVzdChwdF9lbnRyeV90ICpwdGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJcmV0dXJuICgo
KnB0ZSAmIGJpdCkgPT0gYml0KTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK3BkZV9jbGVh
cihwZF9lbnRyeV90ICpwZGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJKihwdF9lbnRyeV90ICop
cGRlICY9ICh+Yml0KTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK3BkZV9zZXQocGRfZW50
cnlfdCAqcGRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCSoocHRfZW50cnlfdCAqKXBkZSB8PSBi
aXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK3BkZV90ZXN0KHBkX2VudHJ5X3QgKnBkZSwg
cHRfZW50cnlfdCBiaXQpCit7CisKKwlyZXR1cm4gKCgqKHB0X2VudHJ5X3QgKilwZGUgJiBiaXQp
ID09IGJpdCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBwdF9lbnRyeV90CitUTEJMT19QQV9UT19Q
Rk4odm1fcGFkZHJfdCBwYSkKK3sKKworCXJldHVybiAoKChwYSA+PiBUTEJfUEFHRV9TSElGVCkg
PDwgVExCTE9fUEZOX1NISUZUKSAmIFRMQkxPX1BGTl9NQVNLKTsKK30KKworc3RhdGljIF9faW5s
aW5lIHZtX3BhZGRyX3QKK1RMQkxPX1BGTl9UT19QQShwdF9lbnRyeV90IHBmbikKK3sKKworCXJl
dHVybiAoKHZtX3BhZGRyX3QpKHBmbiA+PiBUTEJMT19QRk5fU0hJRlQpIDw8IFRMQl9QQUdFX1NI
SUZUKTsKK30KKworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QKK1RMQkxPX1BURV9UT19QRk4o
cHRfZW50cnlfdCBwdGUpCit7CisKKwlyZXR1cm4gKHB0ZSAmIFRMQkxPX1BGTl9NQVNLKTsKK30K
KworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCisjZGVmaW5lCVBURV9SRUYJCVBURV9WUgorI2Rl
ZmluZQlQVEVfVkFMSUQgCVBURV9TVgorCisjZGVmaW5lCXB0ZV9pc19yZWYocHRlKQkJCXB0ZV90
ZXN0KChwdGUpLCBQVEVfUkVGKQorI2RlZmluZQlwdGVfcmVmX2NsZWFyKHB0ZSkJCXB0ZV9jbGVh
cigocHRlKSwgUFRFX1JFRikKKyNkZWZpbmUJcHRlX3JlZl9zZXQocHRlKQkJcHRlX3NldCgocHRl
KSwgUFRFX1JFRikKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfY2xlYXIocHRlKQlhdG9taWNfY2xl
YXJfbG9uZygocHRlKSwgUFRFX1JFRikKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSkJ
CWF0b21pY19zZXRfbG9uZygocHRlKSwgUFRFX1JFRikKKworI2Vsc2UgLyogISBNSVBTNjRfTkVX
X1BNQVAgKi8KKworI2RlZmluZQlQVEVfUkVGCQkwCisjZGVmaW5lCVBURV9WQUxJRAlQVEVfVlIK
KworI2RlZmluZQlwdGVfaXNfcmVmKHB0ZSkJCQkwCisjZGVmaW5lCXB0ZV9yZWZfY2xlYXIocHRl
KQorI2RlZmluZQlwdGVfcmVmX3NldChwdGUpCisjZGVmaW5lCXB0ZV9yZWZfYXRvbWljX2NsZWFy
KHB0ZSkKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSwgYml0KQorCisjZW5kaWYgLyog
ISBNSVBTNjRfTkVXX1BNQVAgKi8KKworI2RlZmluZQlwdGVfaXNfdmFsaWQocHRlKQkJcHRlX3Rl
c3QoKHB0ZSksIFBURV9WQUxJRCkKKworI2lmIGRlZmluZWQoX19taXBzX242NCkgfHwgZGVmaW5l
ZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklUICovCisKKyNkZWZpbmUJcHRlX2F0b21p
Y19jbGVhcihwdGUsIGJpdCkJYXRvbWljX2NsZWFyXzY0KChwdGUpLCBiaXQpCisjZGVmaW5lCXB0
ZV9hdG9taWNfc2V0KHB0ZSwgYml0KQlhdG9taWNfc2V0XzY0KChwdGUpLCBiaXQpCisjZGVmaW5l
CXB0ZV9sb2FkX3N0b3JlKHB0ZXAsIHB0ZSkJYXRvbWljX3JlYWRhbmRzZXRfNjQocHRlcCwgcHRl
KQorI2RlZmluZQlwZGVfbG9hZF9zdG9yZShwZGVwLCBwZGUpCShwZF9lbnRyeV90KWF0b21pY19y
ZWFkYW5kc2V0XzY0KFwKKwkJCQkJCShwdF9lbnRyeV90ICopcGRlcCwgcGRlKQorCisjZGVmaW5l
CXB0ZV9hdG9taWNfc3RvcmUocHRlcCwgcHRlKQlhdG9taWNfc3RvcmVfcmVsXzY0KHB0ZXAsIHB0
ZSkKKyNkZWZpbmUgcHRlX3N0b3JlKHB0ZXAsIHB0ZSkJZG8gewkJXAorCSoodV9sb25nICopKHB0
ZXApID0gKHVfbG9uZykocHRlKTsJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUJcGRlX3N0b3JlKHBk
ZXAsIHBkZSkJCXB0ZV9zdG9yZShwZGVwLCBwZGUpCisKKworI2Vsc2UgLyogISBQSFlTQUREUl82
NF9CSVQgKi8KKworI2RlZmluZQlwdGVfYXRvbWljX2NsZWFyKHB0ZSwgYml0KQlhdG9taWNfY2xl
YXJfMzIoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2F0b21pY19zZXQocHRlLCBiaXQpCWF0b21p
Y19zZXRfMzIoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2xvYWRfc3RvcmUocHRlcCwgcHRlKQlh
dG9taWNfcmVhZGFuZHNldF8zMihwdGVwLCBwdGUpCisjZGVmaW5lCXBkZV9sb2FkX3N0b3JlKHBk
ZXAsIHBkZSkJKHBkX2VudHJ5X3QpYXRvbWljX3JlYWRhbmRzZXRfMzIoXAorCQkJCQkJKHB0X2Vu
dHJ5X3QgKilwZGVwLCBwZGUpCisKKyNkZWZpbmUJcHRlX2F0b21pY19zdG9yZShwdGVwLCBwdGUp
CWF0b21pY19zdG9yZV9yZWxfMzIocHRlcCwgcHRlKQorI2RlZmluZSBwdGVfc3RvcmUocHRlcCwg
cHRlKQlkbyB7CQlcCisJKih1X2ludCAqKShwdGVwKSA9ICh1X2ludCkocHRlKTsJXAorfSB3aGls
ZSAoMCkKKyNkZWZpbmUJcGRlX3N0b3JlKHBkZXAsIHBkZSkJCXB0ZV9zdG9yZShwZGVwLCBwZGUp
CisKKyNlbmRpZiAvKiAhIFBIWVNBRERSXzY0X0JJVCAqLworCisjZW5kaWYgLyogISBfTE9DT1JF
ICovCisKKyNpZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgLyog
IFBIWVNBRERSXzY0X0JJVCAqLworCisjaWZuZGVmIF9MT0NPUkUKKy8qCisgKiBDaGVjayB0byBz
ZWUgaWYgYSBQREUgaXMgYWN0dWFsbHkgYSBzdXBlcnBhZ2UgKFBhZ2VTaXplID4gNEspIFBURS4K
KyAqCisgKiBPbiBfX21pcHNfbjY0IHRoZSBrZXJuZWwgdXNlcyB0aGUgdmlydHVhbCBtZW1vcnkg
YWRkcmVzcyByYW5nZSBmcm9tCisgKiBWTV9NSU5fS0VSTkVMX0FERFJFU1MgKDB4YzAwMDAwMDAw
MDAwMDAwMCkgdG8gVk1fTUFYX0tFUk5FTF9BRERSRVNTCisgKiAoMHhjMDAwMDA4MDAwMDAwMDAw
KS4gVGhlcmVmb3JlLCBhIHZhbGlkIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgUERFCisgKiAoYSBw
b2ludGVyIHRvIGEgcGFnZSB0YWJsZSkgd2lsbCBoYXZlIGJpdHMgNjEgdG8gNDAgc2V0IHRvIHpl
cm8uIEEKKyAqIHN1cGVycGFnZSB3aWxsIGhhdmUgb25lIG9mIHRoZSBzdXBlcnBhZ2Ugc2l6ZSBi
aXRzIChiaXRzIDU4IHRvIDU2KQorICogc2V0LgorICovCisKKy8qIElzIHRoZSBQREUgYSBzdXBl
cnBhZ2Ugb2YgYW55IHNpemU/ICovCitzdGF0aWMgX19pbmxpbmUgaW50CitwZGVfaXNfc3VwZXJw
YWdlKHBkX2VudHJ5X3QgKnBkZSkKK3sKKworCXJldHVybiAoKChwdF9lbnRyeV90KSpwZGUgJiBQ
VEVfUFNfSURYX01BU0spICE9IDApOworfQorCisvKiBJcyB0aGUgUFRFIGEgc3VwZXJwYWdlIG9m
IGFueSBzaXplPyAqLworc3RhdGljIF9faW5saW5lIGludAorcHRlX2lzX3N1cGVycGFnZShwdF9l
bnRyeV90ICpwdGUpCit7CisKKwlyZXR1cm4gKCgqcHRlICYgUFRFX1BTX0lEWF9NQVNLKSAhPSAw
KTsKK30KKworLyogSXMgdGhlIFBERSBhbiAxTUIgc3VwZXJwYWdlPyAqLworc3RhdGljIF9faW5s
aW5lIGludAorcGRlX2lzXzFtX3N1cGVycGFnZShwZF9lbnRyeV90ICpwZGUpCit7CisKKwlyZXR1
cm4gKCgocHRfZW50cnlfdCkqcGRlICYgUFRFX1BTXzFNKSA9PSBQVEVfUFNfMU0pOworfQorCisv
KiBJcyB0aGUgUFRFIGFuIDFNQiBzdXBlcnBhZ2U/ICovCitzdGF0aWMgX19pbmxpbmUgaW50Citw
dGVfaXNfMW1fc3VwZXJwYWdlKHB0X2VudHJ5X3QgKnB0ZSkKK3sKKworCXJldHVybiAoKCpwdGUg
JiBQVEVfUFNfMU0pID09IFBURV9QU18xTSk7Cit9CisKKy8qIFBoeXNpY2FsIEFkZHJlc3MgdG8g
U3VwZXJwYWdlIFBoeXNpY2FsIEZyYW1lIE51bWJlci4gKi8KK3N0YXRpYyBfX2lubGluZSBwdF9l
bnRyeV90CitUTEJMT19QQV9UT19TUEZOKHZtX3BhZGRyX3QgcGEpCit7CisKKwlyZXR1cm4gKCgo
cGEgPj4gVExCXzFNX1NVUEVSUEFHRV9TSElGVCkgPDwgVExCTE9fUEZOX1NISUZUKSAmCisJICAg
IFRMQkxPX1BGTl9NQVNLKTsKK30KKworLyogU3VwZXJwYWdlIFBoeXNpY2FsIEZyYW1lIE51bWJl
ciB0byBQaHlzaWNhbCBBZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RM
QkxPX1NQRk5fVE9fUEEocHRfZW50cnlfdCBzcGZuKQoreworCisJcmV0dXJuICgodm1fcGFkZHJf
dCkoc3BmbiA+PiBUTEJMT19QRk5fU0hJRlQpIDw8CisJICAgIFRMQl8xTV9TVVBFUlBBR0VfU0hJ
RlQpOworfQorCisvKiBTdXBlcnBhZ2UgUGFnZSBUYWJsZSBFbnRyeSB0byBQaHlzaWNhbCBBZGRy
ZXNzLiAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RMQkxPX1NQVEVfVE9fUEEocHRf
ZW50cnlfdCBwdGUpCit7CisJcmV0dXJuIChUTEJMT19TUEZOX1RPX1BBKFRMQkxPX1BURV9UT19Q
Rk4ocHRlKSkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fU1BERV9U
T19QQShwZF9lbnRyeV90IHBkZSkKK3sKKwlyZXR1cm4gKFRMQkxPX1NQRk5fVE9fUEEoVExCTE9f
UFRFX1RPX1BGTigocHRfZW50cnlfdClwZGUpKSk7Cit9CisKKworLyogQW4gNEtCIFBhZ2UgVGFi
bGUgRW50cnkgdG8gUGh5c2ljYWwgQWRkcmVzcy4gKi8KK3N0YXRpYyBfX2lubGluZSB2bV9wYWRk
cl90CitUTEJMT19QVEVfVE9fUEEocHRfZW50cnlfdCBwdGUpCit7CisKKwlyZXR1cm4gKFRMQkxP
X1BGTl9UT19QQShUTEJMT19QVEVfVE9fUEZOKHB0ZSkpKTsKK30KKworc3RhdGljIF9faW5saW5l
IHZtX3BhZGRyX3QKK1RMQkxPX1BERV9UT19QQShwZF9lbnRyeV90IHBkZSkKK3sKKworCXJldHVy
biAoVExCTE9fUEZOX1RPX1BBKFRMQkxPX1BURV9UT19QRk4oKHB0X2VudHJ5X3QpcGRlKSkpOwor
fQorI2VuZGlmIC8qICEgX0xPQ09SRSAqLworCisjZWxzZSAvKiAhIFBIWVNBRERSXzY0X0JJVCAq
LworCisjZGVmaW5lCXB0ZV9pc19yZWZlcmVuY2VkKHB0ZSkJCTAKKyNkZWZpbmUJcHRlX3JlZmVy
ZW5jZV9yZXNldChwdGUpCisjZGVmaW5lCXB0ZV9yZWZlcmVuY2VfcGFnZShwdGUpCisjZGVmaW5l
CXBkZV9pc19zdXBlcnBhZ2UocGRlKQkJMAorI2RlZmluZQlwdGVfaXNfc3VwZXJwYWdlKHBkZSkJ
CTAKKyNkZWZpbmUgcGRlX2lzXzFtX3N1cGVycGFnZShwdGUpCTAKKyNkZWZpbmUgcHRlX2lzXzFt
X3N1cGVycGFnZShwdGUpCTAKKworI2lmbmRlZiBfTE9DT1JFCitzdGF0aWMgX19pbmxpbmUgdm1f
cGFkZHJfdAorVExCTE9fUFRFX1RPX1BBKHB0X2VudHJ5X3QgcHRlKQoreworCisJcmV0dXJuIChU
TEJMT19QRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTihwdGUpKSk7Cit9CisjZW5kaWYgLyogISBf
TE9DT1JFICovCisjZW5kaWYgLyogISBQSFlTQUREUl82NF9CSVQgKi8KIAogLyogQXNzZW1ibHkg
c3VwcG9ydCBmb3IgUFRFIGFjY2VzcyovCiAjaWZkZWYgTE9DT1JFCkBAIC0xNjcsMTYgKzUxMCwx
MDQgQEAKICNkZWZpbmUJUFRFTUFTSwkJCTB4ZmY4CiAjZGVmaW5lCVBURVNJWkUJCQk4CiAjZGVm
aW5lCVBURV9MCQkJbGQKKyNkZWZpbmUJUFRFX1MJCQlzZAogI2RlZmluZQlQVEVfTVRDMAkJZG10
YzAKLSNkZWZpbmUJQ0xFQVJfUFRFX1NXQklUUyhwcikKLSNlbHNlCisjZGVmaW5lCUNMRUFSX1BU
RV9TV0JJVFMocikKKworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCisvKiBTdXBlcnBhZ2UgYW5k
IHJlZmVyZW5jZWQgYml0IGVtdWxhdGlvbiBBU00gbWFjcm9zLiAqLworCisvKgorICogR0VUX1NV
UEVSUEFHRV9JRFgocikKKyAqCisgKiBHZXQgdGhlIHN1cGVycGFnZSBpbmRleCBmcm9tIHRoZSBQ
VEUgYnkgc2hpZnRpbmcgaXQgbGVmdCBieQorICogUFRFX1BTSURYX05CSVRTX1RPX0xFRlQgKGNs
ZWFyaW5nIHRoZSB1cHBlciBzb2Z0Yml0cykgYW5kIHRoZW4gYmFjayB0byB0aGUKKyAqIHJpZ2h0
IGJ5IChQVEVfUFNJRFhfTkJJVFNfVE9fUklHSFQgKyBQVEVfUFNJRFhfTkJJVFNfVE9fUklHSFQp
IGNsZWFyaW5nCisgKiBhbGwgdGhlIGxvd2VyIGJpdHMgaW4gdGhlIHByb2Nlc3MuCisgKi8KKyNk
ZWZpbmUgR0VUX1NVUEVSUEFHRV9JRFgocikJCQkJXAorCWRzbGwJciwgKFBURV9QU0lEWF9OQklU
U19UT19MRUZUKTsJCVwKKwlkc3JsMzIJciwgKFBURV9QU0lEWF9OQklUU19UT19SSUdIVCArIFBU
RV9QU0lEWF9OQklUU19UT19MRUZUIC0gMzIpCisKKy8qCisgKiBHRVRfSFdfVExCX0ZMQUdTKHIp
CisgKgorICogR2V0IHRoZSBsb3dlciBoYXJkd2FyZSBUTEIgZmxhZ3MgYnV0IHNoaWZ0aW5nIGxl
ZnQgdGhlbiByaWdodC4KKyAqLworI2RlZmluZSBHRVRfSFdfVExCX0ZMQUdTKHIpCQkJCVwKKwlk
c2xsMzIJciwgKFBURV9IV0ZMQUdTX05CSVRTX1RPX0xFRlQgLSAzMik7CVwKKwlkc3JsMzIJciwg
KFBURV9IV0ZMQUdTX05CSVRTX1RPX0xFRlQgLSAzMikKKworLyoKKyAqIEdFVF9PRERfMU1fUEZO
X0ZST01fRVZFTihyKQorICoKKyAqIEdldCB0aGUgb2RkIDFNIFBGTiAoVExCIGxvMSkgZnJvbSB0
aGUgZXZlbiAxTSBQVEUuICBGaXJzdCwgbWFzayBvdXQgdGhlIFBGTgorICogZnJvbSB0aGUgZXZl
biBQVEUuIFRoZW4gYWRkIDFNIHdvcnRoIG9mIHBhZ2VzIHRvIGl0ICgyNTYpLiBGaW5hbGx5LCBz
aGlmdCBpdAorICogYmFjayB0byBpdHMgcG9zaXRpb24gaW4gdGhlIFBURS4KKyAqLworI2RlZmlu
ZSBHRVRfT0REXzFNX1BGTl9GUk9NX0VWRU4ocikJCQlcCisJZHNsbAlyLCAoUFRFX1BGTl9OQklU
U19UT19MRUZUKTsJCVwKKwlkc3JsCXIsIChQVEVfUEZOX05CSVRTX1RPX0xFRlQgKyBQVEVfUEZO
X05CSVRTX1RPX1JJR0hUKTsgXAorCWRhZGRpdQlyLCByLCAoMTAyNCAqIDEwMjQgLyBQQUdFX1NJ
WkUpOwlcCisJZHNsbAlyLCAoUFRFX1BGTl9OQklUU19UT19SSUdIVCkKKworLyoKKyAqIElGX1ZB
TElEX1NFVF9SRUZCSVQocjAsIHIxLCBvZmZzZXQsIHVuaXF1ZSkKKyAqCisgKiBJZiBhIFBERSBp
cyB2YWxpZCB0aGVuIHNldCB0aGUgcmVmZXJlbmNlZCBiaXQgKFBURV9WUikuICBUaGUgZmlyc3Qg
dmVyc2lvbgorICogZG9lcyBpdCBhdG9taWNhbGx5LgorICovCisjZGVmaW5lIEFUT01JQ19SRUZC
SVRfVVBEQVRFCisjaWZkZWYgQVRPTUlDX1JFRkJJVF9VUERBVEUKKworI2RlZmluZSBJRl9WQUxJ
RF9TRVRfUkVGQklUKHIwLCByMSwgb2Zmc2V0LCB1bmlxdWUpCVwKK3RyeV9hZ2FpbiAjIyB1bmlx
dWUgIyMgOiA7CQkJCVwKKwlkc3JsMzIJcjAsIChUTEJMT19TV0JJVFNfU0hJRlQgLSAzMik7CQlc
CisJYW5kaQlyMCwgcjAsIFNXX1ZBTElEOwkJCVwKKwliZXF6CXIwLCBub3RfdmFsaWQgIyMgdW5p
cXVlIDsJCVwKKwlQVEVfTAlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKKwlsbGQJcjAsIG9mZnNl
dCAjIyAocjEpIDsJCQlcCisJb3JpCXIwLCByMCwgUFRFX1ZSIDsJCQlcCisJc2NkCXIwLCBvZmZz
ZXQgIyMgKHIxKSA7CQkJXAorCWJlcXoJcjAsIHRyeV9hZ2FpbiAjIyB1bmlxdWUgOwkJXAorCVBU
RV9MCXIwLCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorbm90X3ZhbGlkICMjIHVuaXF1ZSAjIyA6CisK
KyNlbHNlIC8qICEgQVRPTUlDX1JFRkJJVF9VUERBVEUgKi8KKworI2RlZmluZSBJRl9WQUxJRF9T
RVRfUkVGQklUKHIwLCByMSwgb2Zmc2V0LCB1bmlxdWUpCVwKK3RyeV9hZ2FpbiAjIyB1bmlxdWUg
IyMgOiA7CQkJCVwKKwlkc3JsMzIJcjAsIChUTEJMT19TV0JJVFNfU0hJRlQgLSAzMikgOwkJXAor
CWFuZGkJcjAsIHIwLCBTV19WQUxJRCA7CQkJXAorCWJlcXoJcjAsIG5vdF92YWxpZCAjIyB1bmlx
dWUgOwkJXAorCVBURV9MCXIwLCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorCW9yaQlyMCwgcjAsIFBU
RV9WUiA7CQkJXAorCVBURV9TCXIwLCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorbm90X3ZhbGlkICMj
IHVuaXF1ZSAjIyA6CisjZW5kaWYgLyogISBBVE9NSUNfUkVGQklUX1VQREFURSAqLworCisjZWxz
ZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisjZGVmaW5lCUdFVF9TVVBFUlBBR0VfSURYKHIp
CisjZGVmaW5lIEdFVF9IV19UTEJfRkxBR1MocikKKyNkZWZpbmUJSUZfVkFMSURfU0VUX1JFRkJJ
VChyMCwgcjEsIG9mZnNldCwgdW5pcXVlKQorCisjZW5kaWYgLyogISBNSVBTNjRfTkVXX1BNQVAg
Ki8KKworI2Vsc2UgLyogISBMT0NPUkUgKi8KICNkZWZpbmUJUFRFU0hJRlQJCTIKICNkZWZpbmUJ
UFRFMk1BU0sJCTB4ZmY4CS8qIGZvciB0aGUgMi1wYWdlIGxvMC9sbzEgKi8KICNkZWZpbmUJUFRF
TUFTSwkJCTB4ZmZjCiAjZGVmaW5lCVBURVNJWkUJCQk0CiAjZGVmaW5lCVBURV9MCQkJbHcKKyNk
ZWZpbmUJUFRFX1MJCQlzdwogI2RlZmluZQlQVEVfTVRDMAkJbXRjMAogI2RlZmluZQlDTEVBUl9Q
VEVfU1dCSVRTKHIpCUxPTkdfU0xMIHIsIFRMQkxPX1NXQklUU19DTEVBUl9TSElGVDsgTE9OR19T
UkwgciwgVExCTE9fU1dCSVRTX0NMRUFSX1NISUZUIC8qIHJlbW92ZSBzd2JpdHMgKi8KKworI2Rl
ZmluZQlJU19QVEVfVkFMSUQocjAsIHIxLCBvZmZzZXQsIGxhYmVsKQorI2RlZmluZQlTRVRfUkVG
X0JJVChyMCwgcjEsIG9mZnNldCkKKwogI2VuZGlmIC8qIGRlZmluZWQoX19taXBzX242NCkgfHwg
ZGVmaW5lZChfX21pcHNfbjMyKSAqLwogCiAjaWYgZGVmaW5lZChfX21pcHNfbjY0KQpAQCAtMjAx
LDQgKzYzMiwxNyBAQAogI2RlZmluZQlNSVBTM19QR01BU0tfNjRNCTB4MDdmZmUwMDAKICNkZWZp
bmUJTUlQUzNfUEdNQVNLXzI1Nk0JMHgxZmZmZTAwMAogCisKKy8qIFBhZ2VNYXNrIFJlZ2lzdGVy
IChDUDAgUmVnaXN0ZXIgNSwgU2VsZWN0IDApIFZhbHVlcyAqLworI2RlZmluZQlNSVBTM19QR01B
U0tfTUFTS1gJMHgwMDAwMTgwMAorI2RlZmluZQlNSVBTM19QR01BU0tfNEsJCTB4MDAwMDAwMDAK
KyNkZWZpbmUJTUlQUzNfUEdNQVNLXzE2SwkweDAwMDA2MDAwCisjZGVmaW5lCU1JUFMzX1BHTUFT
S182NEsJMHgwMDAxZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMjU2SwkweDAwMDdlMDAwCisj
ZGVmaW5lCU1JUFMzX1BHTUFTS18xTQkJMHgwMDFmZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tf
NE0JCTB4MDA3ZmUwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzE2TQkweDAxZmZlMDAwCisjZGVm
aW5lCU1JUFMzX1BHTUFTS182NE0JMHgwN2ZmZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMjU2
TQkweDFmZmZlMDAwCisKICNlbmRpZiAvKiAhX01BQ0hJTkVfUFRFX0hfICovCmRpZmYgLS1naXQg
YS9zeXMvbWlwcy9pbmNsdWRlL3BtYXAuaCBiL3N5cy9taXBzL2luY2x1ZGUvcG1hcC5oCi0tLSBh
L3N5cy9taXBzL2luY2x1ZGUvcG1hcC5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvcG1hcC5oCkBA
IC00OCw2ICs0OCw3IEBACiAKICNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KICNpbmNsdWRl
IDxtYWNoaW5lL3B0ZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaWYgZGVmaW5lZChf
X21pcHNfbjMyKSB8fCBkZWZpbmVkKF9fbWlwc19uNjQpIC8qIFBIWVNBRERSXzY0QklUICovCiAj
ZGVmaW5lCU5LUFQJCTI1NgkvKiBtZW0gPiA0Rywgdm1fcGFnZV9zdGFydHVwIG5lZWRzIG1vcmUg
S1BUcyAqLwpAQCAtNjIsMTUgKzYzLDI0IEBACiAjaW5jbHVkZSA8c3lzL19sb2NrLmg+CiAjaW5j
bHVkZSA8c3lzL19tdXRleC5oPgogCisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisjaW5jbHVkZSA8
dm0vX3ZtX3JhZGl4Lmg+CisjZW5kaWYgLyogTUlQUzY0X05FV19QTUFQICovCisKIC8qCiAgKiBQ
bWFwIHN0dWZmCiAgKi8KIHN0cnVjdCBwdl9lbnRyeTsKIHN0cnVjdCBwdl9jaHVuazsKIAogc3Ry
dWN0IG1kX3BhZ2UgewotCWludCBwdl9mbGFnczsKIAlUQUlMUV9IRUFEKCwgcHZfZW50cnkpIHB2
X2xpc3Q7CisJdm1fbWVtYXR0cl90IHB2X21lbWF0dHI7CisjaWZkZWYgTUlQUzY0X05FV19QTUFQ
CisJaW50IHB2X2dlbjsKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQICovCisJaW50IHB2X2Zs
YWdzOworI2VuZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCiB9OwogCiAjZGVmaW5lCVBWX1RB
QkxFX1JFRgkJMHgwMgkvKiByZWZlcmVuY2VkICovCkBAIC04MSwxNSArOTEsMTggQEAKICNkZWZp
bmUJQVNJREdFTl9NQVNLCQkoKDEgPDwgQVNJREdFTl9CSVRTKSAtIDEpCiAKIHN0cnVjdCBwbWFw
IHsKKwlzdHJ1Y3QgbXR4IHBtX210eDsKIAlwZF9lbnRyeV90ICpwbV9zZWd0YWI7CS8qIEtWQSBv
ZiBzZWdtZW50IHRhYmxlICovCiAJVEFJTFFfSEVBRCgsIHB2X2NodW5rKQlwbV9wdmNodW5rOwkv
KiBsaXN0IG9mIG1hcHBpbmdzIGluIHBtYXAgKi8KIAljcHVzZXRfdAlwbV9hY3RpdmU7CQkvKiBh
Y3RpdmUgb24gY3B1cyAqLwogCXN0cnVjdCB7CiAJCXVfaW50MzJfdCBhc2lkOkFTSURfQklUUzsJ
LyogVExCIGFkZHJlc3Mgc3BhY2UgdGFnICovCiAJCXVfaW50MzJfdCBnZW46QVNJREdFTl9CSVRT
OwkvKiBpdHMgZ2VuZXJhdGlvbiBudW1iZXIgKi8KIAl9ICAgICAgcG1fYXNpZFtNQVhTTVBDUFVd
OwogCXN0cnVjdCBwbWFwX3N0YXRpc3RpY3MgcG1fc3RhdHM7CS8qIHBtYXAgc3RhdGlzdGljcyAq
LwotCXN0cnVjdCBtdHggcG1fbXR4OworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCXN0cnVjdCB2
bV9yYWRpeCBwbV9yb290OwkJLyogc3BhcmUgcGFnZSB0YWJsZSBwYWdlcyAqLworI2VuZGlmIC8q
IE1JUFM2NF9ORVdfUE1BUCAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgcG1hcCAqcG1hcF90OwpA
QCAtMTIxLDcgKzEzNCw3IEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IHB2X2VudHJ5IHsKIAl2bV9v
ZmZzZXRfdCBwdl92YTsJLyogdmlydHVhbCBhZGRyZXNzIGZvciBtYXBwaW5nICovCi0JVEFJTFFf
RU5UUlkocHZfZW50cnkpIHB2X2xpc3Q7CisJVEFJTFFfRU5UUlkocHZfZW50cnkpIHB2X25leHQ7
CiB9ICAgICAgICpwdl9lbnRyeV90OwogCiAvKgpAQCAtMTY5LDYgKzE4Miw3IEBACiAKIHZvaWQg
cG1hcF9ib290c3RyYXAodm9pZCk7CiB2b2lkICpwbWFwX21hcGRldih2bV9wYWRkcl90LCB2bV9z
aXplX3QpOworLy9ib29sZWFuX3QgcG1hcF9wYWdlX2lzX21hcHBlZCh2bV9wYWdlX3QgbSk7CiB2
b2lkIHBtYXBfdW5tYXBkZXYodm1fb2Zmc2V0X3QsIHZtX3NpemVfdCk7CiB2bV9vZmZzZXRfdCBw
bWFwX3N0ZWFsX21lbW9yeSh2bV9zaXplX3Qgc2l6ZSk7CiB2b2lkIHBtYXBfa2VudGVyKHZtX29m
ZnNldF90IHZhLCB2bV9wYWRkcl90IHBhKTsKQEAgLTE3OCw2ICsxOTIsNyBAQAogdm9pZCBwbWFw
X2tlbnRlcl90ZW1wb3JhcnlfZnJlZSh2bV9wYWRkcl90IHBhKTsKIHZvaWQgcG1hcF9mbHVzaF9w
dmNhY2hlKHZtX3BhZ2VfdCBtKTsKIGludCBwbWFwX2VtdWxhdGVfbW9kaWZpZWQocG1hcF90IHBt
YXAsIHZtX29mZnNldF90IHZhKTsKK2ludCBwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZChwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3QgdmEpOwogdm9pZCBwbWFwX3BhZ2Vfc2V0X21lbWF0dHIodm1fcGFn
ZV90LCB2bV9tZW1hdHRyX3QpOwogCiAjZW5kaWYJCQkJLyogX0tFUk5FTCAqLwpkaWZmIC0tZ2l0
IGEvc3lzL21pcHMvaW5jbHVkZS9wYXJhbS5oIGIvc3lzL21pcHMvaW5jbHVkZS9wYXJhbS5oCi0t
LSBhL3N5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAorKysgYi9zeXMvbWlwcy9pbmNsdWRlL3BhcmFt
LmgKQEAgLTE2MywxNyArMTYzLDM4IEBACiAKICNkZWZpbmUJTUFYRFVNUFBHUwkJMQkJLyogeHh4
OiB3aHkgaXMgdGhpcyBvbmx5IG9uZT8gKi8KIAorI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCisv
KgorICogRm9yIGEgbGFyZ2Uga2VybmVsIHN0YWNrIHBhZ2UgdGhlIEtTVEFDS19TSVpFIG5lZWRz
IHRvIGJlIGEgcGFnZSBzaXplCisgKiBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlIChlLmcuIDE2
SykuCisgKi8KKyNkZWZpbmUJS1NUQUNLX1NJWkUJCSgxIDw8IDE0KQkvKiBTaW5nbGUgMTZLIHBh
Z2UgKi8KKyNkZWZpbmUJS1NUQUNLX1BBR0VfU0laRQlLU1RBQ0tfU0laRQorI2RlZmluZQlLU1RB
Q0tfUEFHRV9NQVNLCShLU1RBQ0tfUEFHRV9TSVpFIC0gMSkKKyNkZWZpbmUJS1NUQUNLX1BBR0VT
CQkoS1NUQUNLX1NJWkUgLyBQQUdFX1NJWkUpCisjZGVmaW5lCUtTVEFDS19UTEJNQVNLX01BU0sJ
KChLU1RBQ0tfUEFHRV9NQVNLID4+IChUTEJNQVNLX1NISUZUIC0gMSkpIFwKKwkJCQkJPDwgVExC
TUFTS19TSElGVCkKKyNkZWZpbmUJS1NUQUNLX0dVQVJEX1BBR0VTCSgoS1NUQUNLX1BBR0VfU0la
RSAqIDIpIC8gUEFHRV9TSVpFKQorCisjZWxzZSAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCisK
IC8qCiAgKiBUaGUga2VybmVsIHN0YWNrIG5lZWRzIHRvIGJlIGFsaWduZWQgb24gYSAoUEFHRV9T
SVpFICogMikgYm91bmRhcnkuCiAgKi8KICNkZWZpbmUJS1NUQUNLX1BBR0VTCQkyCS8qIGtlcm5l
bCBzdGFjayAqLworI2RlZmluZQlLU1RBQ0tfU0laRQkJKEtTVEFDS19QQUdFUyAqIFBBR0VfU0la
RSkKKyNkZWZpbmUJS1NUQUNLX1BBR0VfU0laRQlQQUdFX1NJWkUKKyNkZWZpbmUJS1NUQUNLX1BB
R0VfTUFTSwkoUEFHRV9TSVpFIC0gMSkKICNkZWZpbmUJS1NUQUNLX0dVQVJEX1BBR0VTCTIJLyog
cGFnZXMgb2Yga3N0YWNrIGd1YXJkOyAwIGRpc2FibGVzICovCisjZW5kaWYgLyogISBLU1RBQ0tf
TEFSR0VfUEFHRSAqLwogCiAvKgogICogTWFjaCBkZXJpdmVkIGNvbnZlcnNpb24gbWFjcm9zCiAg
Ki8KICNkZWZpbmUJcm91bmRfcGFnZSh4KQkJKCgoeCkgKyBQQUdFX01BU0spICYgflBBR0VfTUFT
SykKICNkZWZpbmUJdHJ1bmNfcGFnZSh4KQkJKCh4KSAmIH5QQUdFX01BU0spCisjZGVmaW5lCXJv
dW5kXzJtcGFnZSh4KQkJKCgoeCkgKyBQRFJNQVNLKSAmIH5QRFJNQVNLKQorI2RlZmluZQl0cnVu
Y18ybXBhZ2UoeCkJCSgoeCkgJiB+UERSTUFTSykKIAogI2RlZmluZQlhdG9wKHgpCQkJKCh4KSA+
PiBQQUdFX1NISUZUKQogI2RlZmluZQlwdG9hKHgpCQkJKCh4KSA8PCBQQUdFX1NISUZUKQpkaWZm
IC0tZ2l0IGEvc3lzL2NvbmYvb3B0aW9ucy5taXBzIGIvc3lzL2NvbmYvb3B0aW9ucy5taXBzCi0t
LSBhL3N5cy9jb25mL29wdGlvbnMubWlwcworKysgYi9zeXMvY29uZi9vcHRpb25zLm1pcHMKQEAg
LTk3LDExICs5NywyNCBAQAogQkVSSV9MQVJHRV9UTEIJCQlvcHRfZ2xvYmFsLmgKIAogIworIyBV
c2UgdGhlIG5ldyBwbWFwIGZvciBNSVBTNjQgdGhhdCBpbmNsdWRlcyByZWZlcmVuY2UgYml0IGVt
dWxhdGlvbgorIyBhbmQgc3VwZXJwYWdlIHN1cHBvcnQuCisjCitNSVBTNjRfTkVXX1BNQVAJCQlv
cHRfZ2xvYmFsLmgKKworIwogIyBPcHRpb25zIHRoYXQgY29udHJvbCB0aGUgTmV0RlBHQS0xMEcg
RW1iZWRkZWQgQ1BVIEV0aGVybmV0IENvcmUuCiAjCiBORjEwQk1BQ182NEJJVAkJCW9wdF9uZXRm
cGdhLmgKIAogIworIyBPcHRpb25zIGZvciBoYXJkd2FyZSB3aXRoIFBhZ2VNYXNrIHJlZ2lzdGVy
IHN1cHBvcnQKKyMKKworIyBVc2Ugb25lIGxhcmdlIHBhZ2UgKGN1cnJlbnRseSAxNkspIGZvciB0
aGUga2VybmVsIHRocmVhZCBzdGFjaworS1NUQUNLX0xBUkdFX1BBR0UgICAJCW9wdF9nbG9iYWwu
aAorCisjCiAjIE9wdGlvbnMgdGhhdCBjb250cm9sIHRoZSBBdGhlcm9zIFNvQyBwZXJpcGhlcmFs
cwogIwogQVJHRV9ERUJVRwkJCW9wdF9hcmdlLmgKZGlmZiAtLWdpdCBhL3N5cy9jb25mL2ZpbGVz
Lm1pcHMgYi9zeXMvY29uZi9maWxlcy5taXBzCi0tLSBhL3N5cy9jb25mL2ZpbGVzLm1pcHMKKysr
IGIvc3lzL2NvbmYvZmlsZXMubWlwcwpAQCAtMzEsNyArMzEsOCBAQAogbWlwcy9taXBzL25leHVz
LmMJCQlzdGFuZGFyZAogbWlwcy9taXBzL29md19tYWNoZGVwLmMJCQlvcHRpb25hbAlmZHQKIG1p
cHMvbWlwcy9wbV9tYWNoZGVwLmMJCQlzdGFuZGFyZAotbWlwcy9taXBzL3BtYXAuYwkJCXN0YW5k
YXJkCittaXBzL21pcHMvcG1hcC5jCQkJb3B0aW9uYWwJIW1pcHM2NF9uZXdfcG1hcAorbWlwcy9t
aXBzL3BtYXBfbWlwczY0LmMJCQlvcHRpb25hbAltaXBzNjRfbmV3X3BtYXAKIG1pcHMvbWlwcy9w
dHJhY2VfbWFjaGRlcC5jCQlzdGFuZGFyZAogbWlwcy9taXBzL3NjX21hY2hkZXAuYwkJCXN0YW5k
YXJkCiBtaXBzL21pcHMvc3RhY2tfbWFjaGRlcC5jCQlvcHRpb25hbAlkZGIgfCBzdGFjawpkaWZm
IC0tZ2l0IGEvbGliL2xpYmt2bS9rdm1fbWlwcy5oIGIvbGliL2xpYmt2bS9rdm1fbWlwcy5oCi0t
LSBhL2xpYi9saWJrdm0va3ZtX21pcHMuaAorKysgYi9saWIvbGlia3ZtL2t2bV9taXBzLmgKQEAg
LTQ5LDcgKzQ5LDcgQEAKICNkZWZpbmUJTUlQUzY0X0tTRUcxX0VORAkweGZmZmZmZmZmYmZmZmZm
ZmYKIAogI2RlZmluZQlNSVBTMzJfUEZOX01BU0sJCSgweDFGRkZGRkMwKQotI2RlZmluZQlNSVBT
NjRfUEZOX01BU0sJCTB4M0ZGRkZGRkMwCisjZGVmaW5lCU1JUFM2NF9QRk5fTUFTSwkJMHhGRkZG
RkZDMAogI2RlZmluZQlNSVBTX1BGTl9TSElGVAkJKDYpCiAKICNkZWZpbmUJTUlQU19QRk5fVE9f
UEEocGZuKQkoKChwZm4pID4+IE1JUFNfUEZOX1NISUZUKSA8PCBNSVBTX1BBR0VfU0hJRlQpCgo=


--b1_8cfbda1353b73aeded57f1b1746022d2--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8cfbda1353b73aeded57f1b1746022d2>