Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Sep 2016 19:53:17 +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:  <0f329be06464796422fbdb79db4d9952@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_0f329be06464796422fbdb79db4d9952
Content-Type: text/plain; charset = "utf-8"
Content-Transfer-Encoding: base64

c2JydW5vIHVwZGF0ZWQgdGhpcyByZXZpc2lvbiB0byBEaWZmIDIwMzkyLgpzYnJ1bm8gYWRkZWQg
YSBjb21tZW50LgoKCiAgQ29weS9wYXN0ZSBhIGNvdXBsZSBvZiBxdWljayBmdW5jdGlvbnMgZnJv
bSBwbWFwLmMgdG8gcG1hcF9taXBzNjQuYyAKICBhbmQgbm93IHRoZSBuZXcgb3B0aW9uIGNvbXBp
bGVzIGFuZCBib290cyB1bmRlciBNQUxUQTY0CgpSRVBPU0lUT1JZCiAgclMgRnJlZUJTRCBzcmMg
cmVwb3NpdG9yeQoKQ0hBTkdFUyBTSU5DRSBMQVNUIFVQREFURQogIGh0dHBzOi8vcmV2aWV3cy5m
cmVlYnNkLm9yZy9EMjUzNT92cz0yMDM5MSZpZD0yMDM5MgoKUkVWSVNJT04gREVUQUlMCiAgaHR0
cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0QyNTM1CgpBRkZFQ1RFRCBGSUxFUwogIGxpYi9saWJr
dm0va3ZtX21pcHMuaAogIHN5cy9jb25mL2ZpbGVzLm1pcHMKICBzeXMvY29uZi9vcHRpb25zLm1p
cHMKICBzeXMvbWlwcy9jb25mL01BTFRBNjQKICBzeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmgKICBz
eXMvbWlwcy9pbmNsdWRlL3BtYXAuaAogIHN5cy9taXBzL2luY2x1ZGUvcHRlLmgKICBzeXMvbWlw
cy9pbmNsdWRlL3ZtcGFyYW0uaAogIHN5cy9taXBzL21pcHMvY3B1LmMKICBzeXMvbWlwcy9taXBz
L2V4Y2VwdGlvbi5TCiAgc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCiAgc3lzL21pcHMvbWlwcy9t
YWNoZGVwLmMKICBzeXMvbWlwcy9taXBzL21pbmlkdW1wX21hY2hkZXAuYwogIHN5cy9taXBzL21p
cHMvcG1hcC5jCiAgc3lzL21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCiAgc3lzL21pcHMvbWlwcy9z
d3RjaC5TCiAgc3lzL21pcHMvbWlwcy90bGIuYwogIHN5cy9taXBzL21pcHMvdHJhcC5jCiAgc3lz
L21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCiAgc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMKICBz
eXMvdm0vdm1fZ2x1ZS5jCgpFTUFJTCBQUkVGRVJFTkNFUwogIGh0dHBzOi8vcmV2aWV3cy5mcmVl
YnNkLm9yZy9zZXR0aW5ncy9wYW5lbC9lbWFpbHByZWZlcmVuY2VzLwoKVG86IHNicnVubywgc3Nv
bgpDYzogc2JydW5vLCByd2F0c29uLCBlbWFzdGUsIGltcCwgZnJlZWJzZC1taXBzLWxpc3QsIGRu
ZWxzb25fMTkwMV95YWhvby5jb20sIG1pemhrYV9nbWFpbC5jb20K

--b1_0f329be06464796422fbdb79db4d9952
Content-Type: text/x-patch; charset=utf-8; name="D2535.20392.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="D2535.20392.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
LCBQQUdFX1NJWkUsIDApKQpAQCAtNjgsNiArNzIsOCBAQAogCX0KIAogCXBhID0gVk1fUEFHRV9U
T19QSFlTKG0pOworCWlmICgod2FpdCAmIE1fTk9EVU1QKSA9PSAwKQorCQlkdW1wX2FkZF9wYWdl
KHBhKTsKIAl2YSA9ICh2b2lkICopTUlQU19QSFlTX1RPX0RJUkVDVChwYSk7CiAJaWYgKCh3YWl0
ICYgTV9aRVJPKSAmJiAobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAwKQogCQliemVybyh2YSwgUEFH
RV9TSVpFKTsKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvdHJhcC5jIGIvc3lzL21pcHMvbWlw
cy90cmFwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy90cmFwLmMKKysrIGIvc3lzL21pcHMvbWlwcy90
cmFwLmMKQEAgLTgxLDYgKzgxLDcgQEAKICNpbmNsdWRlIDxtYWNoaW5lL21pcHNfb3Bjb2RlLmg+
CiAjaW5jbHVkZSA8bWFjaGluZS9mcmFtZS5oPgogI2luY2x1ZGUgPG1hY2hpbmUvcmVnbnVtLmg+
CisjaW5jbHVkZSA8bWFjaGluZS90bGIuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3Rscy5oPgogCiAj
aWZkZWYgRERCCkBAIC0yNjQsNyArMjY1LDcgQEAKIAkicmVzZXJ2ZWQgMjEiLAogCSJyZXNlcnZl
ZCAyMiIsCiAJIndhdGNoIiwKLQkicmVzZXJ2ZWQgMjQiLAorCSJtYWNoaW5lIGNoZWNrIiwKIAki
cmVzZXJ2ZWQgMjUiLAogCSJyZXNlcnZlZCAyNiIsCiAJInJlc2VydmVkIDI3IiwKQEAgLTYzMiw2
ICs2MzMsMzMgQEAKICNlbmRpZgogCQlwYW5pYygiTUNIRUNLXG4iKTsKIAkJYnJlYWs7CisJY2Fz
ZSBUX01DSEVDSyArIFRfVVNFUjoKKwkJeworCQkJdWludDMyX3Qgc3RhdHVzID0gbWlwc19yZF9z
dGF0dXMoKTsKKworCQkJaWYgKHN0YXR1cyAmIE1JUFNfU1JfVFMpIHsKKwkJCQkvKgorCQkJCSAq
IE1hY2hpbmUgQ2hlY2sgZXhjZXB0aW9uIGNhdXNlZCBieSBUTEIKKwkJCQkgKiBkZXRlY3Rpbmcg
YSBtYXRjaCBmb3IgbXVsdGlwbGUgZW50cmllcy4KKwkJCQkgKgorCQkJCSAqIEF0dGVtcHQgdG8g
cmVjb3ZlciBieSBmbHVzaGluZyB0aGUgdXNlciBUTEIKKwkJCQkgKiBhbmQgcmVzZXR0aW5nIHRo
ZSBzdGF0dXMgYml0LgorCQkJCSAqLworCQkJCXByaW50ZigiTWFjaGluZSBDaGVjayBpbiBVc2Vy
IC0gRHVwIFRMQiBlbnRyeS4gIgorCQkJCSAgICAiUmVjb3ZlcmluZy4uLlxuIik7CisJCQkJcG1h
cCA9ICZwLT5wX3Ztc3BhY2UtPnZtX3BtYXA7CisJCQkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIo
cG1hcCk7CisJCQkJbWlwc193cl9zdGF0dXMoc3RhdHVzICYgfk1JUFNfU1JfVFMpOworCisJCQkJ
cmV0dXJuICh0cmFwZnJhbWUtPnBjKTsKKwkJCX0gZWxzZSB7CisjaWZkZWYgRERCCisJCQkJa2Ri
X3RyYXAodHlwZSwgMCwgdHJhcGZyYW1lKTsKKyNlbmRpZgorCQkJCXBhbmljKCJNQ0hFQ0tcbiIp
OworCQkJfQorCQl9CisJCWJyZWFrOwogCWNhc2UgVF9UTEJfTU9EOgogCQkvKiBjaGVjayBmb3Ig
a2VybmVsIGFkZHJlc3MgKi8KIAkJaWYgKEtFUk5MQU5EKHRyYXBmcmFtZS0+YmFkdmFkZHIpKSB7
CkBAIC02OTQsMTAgKzcyMiwyMyBAQAogCiAJY2FzZSBUX1RMQl9MRF9NSVNTICsgVF9VU0VSOgog
CQlmdHlwZSA9IFZNX1BST1RfUkVBRDsKLQkJZ290byBkb2ZhdWx0OworCQlnb3RvIGNoZWNrcmVm
Yml0OwogCiAJY2FzZSBUX1RMQl9TVF9NSVNTICsgVF9VU0VSOgogCQlmdHlwZSA9IFZNX1BST1Rf
V1JJVEU7CisKK2NoZWNrcmVmYml0OgorCQkvKgorCQkgKiBXYXMgdGhpcyB0cmFwIGNhdXNlZCBi
eSB0aGUgUFRFX1ZSIGJpdCBub3QgYmVpbmcgc2V0PworCQkgKi8KKwkJaWYgKHBtYXBfZW11bGF0
ZV9yZWZlcmVuY2VkKCZwLT5wX3Ztc3BhY2UtPnZtX3BtYXAsCisJCSAgICB0cmFwZnJhbWUtPmJh
ZHZhZGRyKSA9PSAwKSB7CisJCQlpZiAoIXVzZXJtb2RlKSB7CisJCQkJcmV0dXJuICh0cmFwZnJh
bWUtPnBjKTsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisKIGRvZmF1bHQ6CiAJCXsKIAkJCXZt
X29mZnNldF90IHZhOwpAQCAtMTQxMSw5ICsxNDUyLDE2IEBACiAJc3RydWN0IHByb2MgKnAgPSBj
dXJwcm9jOwogCiAJcGRlcCA9ICgmKHAtPnBfdm1zcGFjZS0+dm1fcG1hcC5wbV9zZWd0YWJbKHZh
ID4+IFNFR1NISUZUKSAmIChOUERFUEcgLSAxKV0pKTsKLQlpZiAoKnBkZXApCi0JCXB0ZXAgPSBw
bWFwX3B0ZSgmcC0+cF92bXNwYWNlLT52bV9wbWFwLCB2YSk7Ci0JZWxzZQorCWlmICgqcGRlcCkg
eworI2lmIFZNX05SRVNFUlZMRVZFTCA+IDAKKwkJcGRfZW50cnlfdCAqcGRlID0gJnBkZXBbKHZh
ID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKV07CisKKwkJaWYgKHBkZV9pc19zdXBlcnBhZ2Uo
cGRlKSkKKwkJCXB0ZXAgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJZWxzZQorI2VuZGlmIC8qIFZN
X05SRVNFUlZMRVZFTCA+IDAgKi8KKwkJCXB0ZXAgPSBwbWFwX3B0ZSgmcC0+cF92bXNwYWNlLT52
bV9wbWFwLCB2YSk7CisJfSBlbHNlCiAJCXB0ZXAgPSAocHRfZW50cnlfdCAqKTA7CiAKIAkqcGRl
cHAgPSBwZGVwOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy90bGIuYyBiL3N5cy9taXBzL21p
cHMvdGxiLmMKLS0tIGEvc3lzL21pcHMvbWlwcy90bGIuYworKysgYi9zeXMvbWlwcy9taXBzL3Rs
Yi5jCkBAIC00MCwxMCArNDAsMTQgQEAKICNpbmNsdWRlIDxtYWNoaW5lL3B0ZS5oPgogI2luY2x1
ZGUgPG1hY2hpbmUvdGxiLmg+CiAKKyNpbmNsdWRlICJvcHRfdm0uaCIKKwogI2lmIGRlZmluZWQo
Q1BVX0NOTUlQUykKICNkZWZpbmUJTUlQU19NQVhfVExCX0VOVFJJRVMJMTI4CiAjZWxpZiBkZWZp
bmVkKENQVV9OTE0pCiAjZGVmaW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCSgyMDQ4ICsgMTI4KQor
I2VsaWYgZGVmaW5lZChDUFVfQ0hFUkkpCisjZGVmaW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTE0
NAogI2Vsc2UKICNkZWZpbmUJTUlQU19NQVhfVExCX0VOVFJJRVMJNjQKICNlbmRpZgpAQCAtMTAy
LDIwICsxMDYsMzEgQEAKIHsKIAlyZWdpc3Rlcl90IGFzaWQ7CiAJcmVnaXN0ZXJfdCBzOworCXVp
bnQzMl90IHBhZ2VtYXNrOworCXVuc2lnbmVkIGxvbmcgbWFzaywgc2l6ZTsKIAotCXZhICY9IH5Q
QUdFX01BU0s7CisJS0FTU0VSVCgoVExCTE9fUFRFX1RPX0lEWChwdGUwKSA9PSBUTEJMT19QVEVf
VE9fSURYKHB0ZTEpKSwKKwkgICAgKCIlczogcHRlMCBhbmQgcHRlMSBwYWdlIHNpemVzIGRvbid0
IG1hdGNoIiwgX19mdW5jX18pKTsKKworCS8qIENvbXB1dGUgdGhlIHBhZ2UgbWFzayBhbmQgc2l6
ZS4gKi8KKwlwYWdlbWFzayA9IFRMQkxPX1BURV9UT19NQVNLKHB0ZTApOworCW1hc2sgPSAodW5z
aWduZWQgbG9uZylwYWdlbWFzayB8IFBBR0VfTUFTSzsgLyogT1IgaXQgd2l0aCBsb3dlciAxMiBi
aXRzICovCisJc2l6ZSA9IG1hc2sgKyAxOworCisJdmEgJj0gfm1hc2s7CiAKIAlzID0gaW50cl9k
aXNhYmxlKCk7CiAJYXNpZCA9IG1pcHNfcmRfZW50cnloaSgpICYgVExCSElfQVNJRF9NQVNLOwog
CiAJbWlwc193cl9pbmRleChpKTsKLQltaXBzX3dyX3BhZ2VtYXNrKDApOworCW1pcHNfd3JfcGFn
ZW1hc2socGFnZW1hc2spOwogCW1pcHNfd3JfZW50cnloaShUTEJISV9FTlRSWSh2YSwgMCkpOwog
CW1pcHNfd3JfZW50cnlsbzAocHRlMCk7CiAJbWlwc193cl9lbnRyeWxvMShwdGUxKTsKIAl0bGJf
d3JpdGVfaW5kZXhlZCgpOwogCiAJbWlwc193cl9lbnRyeWhpKGFzaWQpOworCW1pcHNfd3JfcGFn
ZW1hc2soMCk7CiAJaW50cl9yZXN0b3JlKHMpOwogfQogCkBAIC0xMzcsNyArMTUyLDYgQEAKIAlp
ID0gbWlwc19yZF9pbmRleCgpOwogCWlmIChpID49IDApCiAJCXRsYl9pbnZhbGlkYXRlX29uZShp
KTsKLQogCW1pcHNfd3JfZW50cnloaShhc2lkKTsKIAlpbnRyX3Jlc3RvcmUocyk7CiB9CkBAIC0y
OTgsMjkgKzMxMiw1MyBAQAogCXJlZ2lzdGVyX3QgYXNpZDsKIAlyZWdpc3Rlcl90IHM7CiAJaW50
IGk7CisJdWludDMyX3QgcGFnZW1hc2s7CisJdW5zaWduZWQgbG9uZyBtYXNrLCBzaXplOworCXB0
X2VudHJ5X3QgcHRlMCwgcHRlMTsKKworCS8qIENvbXB1dGUgdGhlIHBhZ2UgbWFzayBhbmQgc2l6
ZS4gKi8KKwlwYWdlbWFzayA9IFRMQkxPX1BURV9UT19NQVNLKHB0ZSk7CisJbWFzayA9ICh1bnNp
Z25lZCBsb25nKXBhZ2VtYXNrIHwgUEFHRV9NQVNLOyAvKiBPUiBpdCB3aXRoIGxvd2VyIDEyIGJp
dHMgKi8KKwlzaXplID0gbWFzayArIDE7CiAKLQl2YSAmPSB+UEFHRV9NQVNLOworCXZhICY9IH5t
YXNrOwogCXB0ZSAmPSB+VExCTE9fU1dCSVRTX01BU0s7CiAKIAlzID0gaW50cl9kaXNhYmxlKCk7
CiAJYXNpZCA9IG1pcHNfcmRfZW50cnloaSgpICYgVExCSElfQVNJRF9NQVNLOwogCi0JbWlwc193
cl9wYWdlbWFzaygwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKHBhZ2VtYXNrKTsKIAltaXBzX3dyX2Vu
dHJ5aGkoVExCSElfRU5UUlkodmEsIHBtYXBfYXNpZChwbWFwKSkpOwogCXRsYl9wcm9iZSgpOwog
CWkgPSBtaXBzX3JkX2luZGV4KCk7CiAJaWYgKGkgPj0gMCkgewogCQl0bGJfcmVhZCgpOworCQlw
dGUwID0gbWlwc19yZF9lbnRyeWxvMCgpOworCQlwdGUxID0gbWlwc19yZF9lbnRyeWxvMSgpOwor
CQlLQVNTRVJUKChUTEJMT19QVEVfVE9fSURYKHB0ZSkgPT0gVExCTE9fUFRFX1RPX0lEWChwdGUw
KSAmJgorCQkgICAgVExCTE9fUFRFX1RPX0lEWChwdGUpID09IFRMQkxPX1BURV9UT19JRFgocHRl
MSkpLAorCQkJKCIlczogcHRlLCBwdGUwIGFuZCBwdGUxIHBhZ2Ugc2l6ZXMgZG9uJ3QgbWF0Y2gi
LCBfX2Z1bmNfXykpOwogCi0JCWlmICgodmEgJiBQQUdFX1NJWkUpID09IDApIHsKKwkJaWYgKCh2
YSAmIHNpemUpID09IDApIHsKIAkJCW1pcHNfd3JfZW50cnlsbzAocHRlKTsKKwkJCWlmIChwYWdl
bWFzayAmIH5QQUdFX01BU0spIHsKKwkJCQkvKiBTdXBlcnBhZ2UgKi8KKwkJCQlwdGUxID0gKHB0
ZTEgJiB+KFBURV9WUiB8IFBURV9EKSkgfCAocHRlICYgKFBURV9WUiB8IFBURV9EKSk7CisJCQkJ
bWlwc193cl9lbnRyeWxvMShwdGUxKTsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCW1pcHNfd3JfZW50
cnlsbzEocHRlKTsKKwkJCWlmIChwYWdlbWFzayAmIH5QQUdFX01BU0spIHsKKwkJCQkvKiBTdXBl
cnBhZ2UgKi8KKwkJCQlwdGUwID0gKHB0ZTAgJiB+KFBURV9WUiB8IFBURV9EKSkgfCAocHRlICYg
KFBURV9WUiB8IFBURV9EKSk7CisJCQkJbWlwc193cl9lbnRyeWxvMChwdGUwKTsKKwkJCX0KIAkJ
fQogCQl0bGJfd3JpdGVfaW5kZXhlZCgpOwogCX0KIAogCW1pcHNfd3JfZW50cnloaShhc2lkKTsK
KwltaXBzX3dyX3BhZ2VtYXNrKDApOwogCWludHJfcmVzdG9yZShzKTsKIH0KIApkaWZmIC0tZ2l0
IGEvc3lzL21pcHMvbWlwcy9zd3RjaC5TIGIvc3lzL21pcHMvbWlwcy9zd3RjaC5TCi0tLSBhL3N5
cy9taXBzL21pcHMvc3d0Y2guUworKysgYi9zeXMvbWlwcy9taXBzL3N3dGNoLlMKQEAgLTMxNSwz
NiArMzE1LDkxIEBACiAgKiBOT1RFOiBUaGlzIGlzIGhhcmQgY29kZWQgdG8gVVBBR0VTID09IDIu
CiAgKiBBbHNvLCB0aGVyZSBzaG91bGQgYmUgbm8gVExCIGZhdWx0cyBhdCB0aGlzIHBvaW50Lgog
ICovCi0JTVRDMAl2MCwgTUlQU19DT1BfMF9UTEJfSEkJCSMgVlBOID0gdmEKKwlNVEMwCQl2MCwg
TUlQU19DT1BfMF9UTEJfSEkJIyBWUE4gPSB2YQogCUhBWkFSRF9ERUxBWQogCXRsYnAJCQkJCSMg
cHJvYmUgVlBOCiAJSEFaQVJEX0RFTEFZCi0JbWZjMAlzMCwgTUlQU19DT1BfMF9UTEJfSU5ERVgK
KwltZmMwCQlzMCwgTUlQU19DT1BfMF9UTEJfSU5ERVgKIAlIQVpBUkRfREVMQVkKIAotCVBUUl9M
SQl0MSwgTUlQU19LU0VHMF9TVEFSVAkJIyBpbnZhbGlkYXRlIHRsYiBlbnRyeQotCWJsdHoJczAs
IGVudHJ5MHNldAorCSMgTUlQU19LU0VHMF9TVEFSVCArICgyICogaW5kZXggKiBQQUdFX1NJWkUp
IC0+IE1JUFNfQ09QXzBfVExCX0hJCisJUFRSX0xJCQl0MSwgTUlQU19LU0VHMF9TVEFSVAkJIyBp
bnZhbGlkYXRlIHRsYiBlbnRyeQorI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJYmx0egkJczAs
IGludmFsX254dDEKKyNlbHNlCisJYmx0egkJczAsIGVudHJ5MHNldAorI2VuZGlmCiAJbm9wCi0J
c2xsCXMwLCBQQUdFX1NISUZUICsgMQotCWFkZHUJdDEsIHMwCi0JTVRDMAl0MSwgTUlQU19DT1Bf
MF9UTEJfSEkKKwlzbGwJCXMwLCBQQUdFX1NISUZUICsgMQorCVBUUl9BRERVCXQxLCBzMAorCU1U
QzAJCXQxLCBNSVBTX0NPUF8wX1RMQl9ISQogCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExC
X0xPMAogCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMQorCU1UQzAJCXplcm8sIE1J
UFNfQ09QXzBfVExCX1BHX01BU0sKIAlIQVpBUkRfREVMQVkKIAl0bGJ3aQogCUhBWkFSRF9ERUxB
WQotCU1UQzAJdjAsIE1JUFNfQ09QXzBfVExCX0hJCQkjIHNldCBWUE4gYWdhaW4KKworI2lmZGVm
IEtTVEFDS19MQVJHRV9QQUdFCisvKgorICogV2l0aCBhIEtTVEFDS19QQUdFX1NJWkUgb2YgMTZL
IGFuZCBQQUdFX1NJWkUgb2YgNEsgaXQgaXMgcG9zc2libGUgdGhhdAorICogYSBzZWNvbmQgVExC
IGVudHJ5IGlzIGN1cnJlbnRseSBtYXBwaW5nIHRoZSBrZXJuZWwgdGhyZWFkIHN0YWNrIGFzIGEK
KyAqIHJlZ3VsYXIgNEsgc2l6ZWQgcGFnZShzKS4gQ2hlY2sgZm9yIHRoaXMgY2FzZSBhbmQsIGlm
IHNvLCBpbnZhbGlkYXRlCisgKiB0aGF0IFRMQiBlbnRyeSBhcyB3ZWxsLgorICovCisjaWYgKFBB
R0VfU0laRSAhPSA0MDk2KSAmJiAoS1NUQUNLX1BBR0VfU0laRSAhPSAxNjM4NCkKKyNlcnJvciBQ
QUdFX1NJWkUgaXMgbm90IDRLIG9yIEtTVEFDS19QQUdFX1NJWkUgaXMgbm90IDE2Sy4KKyNlbmRp
ZgoraW52YWxfbnh0MToKKwltb3ZlCQl2MSwgdjAKKwlQVFJfQUREVQl2MSwgUEFHRV9TSVpFICog
MgorCU1UQzAJCXYxLCBNSVBTX0NPUF8wX1RMQl9ISQkJIyBWUE4gPSB2YQorCUhBWkFSRF9ERUxB
WQorCXRsYnAJCQkJCQkjIHByb2JlIFZQTgorCUhBWkFSRF9ERUxBWQorCW1mYzAJCXMwLCBNSVBT
X0NPUF8wX1RMQl9JTkRFWAorCUhBWkFSRF9ERUxBWQorCisJIyBNSVBTX0tTRUcwX1NUQVJUICsg
KDIgKiBpbmRleCAqIFBBR0VfU0laRSkgLT4gTUlQU19DT1BfMF9UTEJfSEkKKwlQVFJfTEkJCXQx
LCBNSVBTX0tTRUcwX1NUQVJUCQkjIGludmFsaWRhdGUgdGxiIGVudHJ5CisJYmx0egkJczAsIGVu
dHJ5MHNldAorCW5vcAorCXNsbAkJczAsIFBBR0VfU0hJRlQgKyAxCisJUFRSX0FERFUJdDEsIHMw
CisJTVRDMAkJdDEsIE1JUFNfQ09QXzBfVExCX0hJCisJUFRFX01UQzAJemVybywgTUlQU19DT1Bf
MF9UTEJfTE8wCisJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfTE8xCisJTVRDMAkJemVy
bywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSworCUhBWkFSRF9ERUxBWQorCXRsYndpCisJSEFaQVJE
X0RFTEFZCisjZW5kaWYJLyogS1NUQUNLX0xBUkdFX1BBR0UgKi8KIAogZW50cnkwc2V0OgorCU1U
QzAJCXYwLCBNSVBTX0NPUF8wX1RMQl9ISQkJIyBzZXQgVlBOIGFnYWluCisJSEFaQVJEX0RFTEFZ
CiAvKiBTTVAhISAtIFdvcmtzIG9ubHkgZm9yICB1bnNoYXJlZCBUTEIgY2FzZSAtIGkuZS4gbm8g
di1jcHVzICovCi0JbXRjMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9JTkRFWAkJIyBUTEIgZW50cnkg
IzAKKwltdGMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9JTkRFWAkjIFRMQiBlbnRyeSAjMAogCUhB
WkFSRF9ERUxBWQogCVBURV9NVEMwCWExLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMgdXB0ZVswXQog
CUhBWkFSRF9ERUxBWQogCVBURV9NVEMwCWEyLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgdXB0ZVsx
XQorI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJSEFaQVJEX0RFTEFZCisJbGkJCXQxLCBLU1RB
Q0tfVExCTUFTS19NQVNLCisJTVRDMAkJdDEsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sKIAlIQVpB
UkRfREVMQVkKKyNlbHNlCisJTVRDMAkJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSworCUhB
WkFSRF9ERUxBWQorI2VuZGlmCiAJdGxid2kJCQkJCSMgc2V0IFRMQiBlbnRyeSAjMAogCUhBWkFS
RF9ERUxBWQorCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKwlNVEMwCQl6ZXJvLCBNSVBTX0NP
UF8wX1RMQl9QR19NQVNLCisJSEFaQVJEX0RFTEFZCisjZW5kaWYKIC8qCiAgKiBOb3cgcnVubmlu
ZyBvbiBuZXcgdSBzdHJ1Y3QuCiAgKi8KZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvcG1hcF9t
aXBzNjQuYyBiL3N5cy9taXBzL21pcHMvcG1hcF9taXBzNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0
NAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9taXBzL21pcHMvcG1hcF9taXBzNjQuYwpAQCAtMCww
ICsxLDU1NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5p
dmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoYykgMTk5NCBKb2huIFMuIER5c29uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog
Q29weXJpZ2h0IChjKSAxOTk0IERhdmlkIEdyZWVubWFuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChjKSAyMDAzIFBldGVyIFdlbW0KKyAqIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBBbGFuIEwuIENveCA8YWxjQGNzLnJpY2Uu
ZWR1PgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNSBTdGFj
ZXkgRC4gU29uIDxzc29uQC4uLj4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp
cyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBi
eQorICogdGhlIFN5c3RlbXMgUHJvZ3JhbW1pbmcgR3JvdXAgb2YgdGhlIFVuaXZlcnNpdHkgb2Yg
VXRhaCBDb21wdXRlcgorICogU2NpZW5jZSBEZXBhcnRtZW50IGFuZCBXaWxsaWFtIEpvbGl0eiBv
ZiBVVU5FVCBUZWNobm9sb2dpZXMgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFt
ZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAq
ICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy
b20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5U
UyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwK
KyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
CisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4K
KyAqCisgKglmcm9tOglAKCMpcG1hcC5jCTcuNyAoQmVya2VsZXkpCTUvMTIvOTEKKyAqCWZyb206
IHNyYy9zeXMvaTM4Ni9pMzg2L3BtYXAuYyx2IDEuMjUwLjIuOCAyMDAwLzExLzIxIDAwOjA5OjE0
IHBzCisgKglKTlBSOiBwbWFwLmMsdiAxLjExLjIuMSAyMDA3LzA4LzE2IDExOjUxOjA2IGdpcmlz
aAorICovCisKKy8qCisgKglNYW5hZ2VzIHBoeXNpY2FsIGFkZHJlc3MgbWFwcy4KKyAqCisgKglT
aW5jZSB0aGUgaW5mb3JtYXRpb24gbWFuYWdlZCBieSB0aGlzIG1vZHVsZSBpcworICoJYWxzbyBz
dG9yZWQgYnkgdGhlIGxvZ2ljYWwgYWRkcmVzcyBtYXBwaW5nIG1vZHVsZSwKKyAqCXRoaXMgbW9k
dWxlIG1heSB0aHJvdyBhd2F5IHZhbGlkIHZpcnR1YWwtdG8tcGh5c2ljYWwKKyAqCW1hcHBpbmdz
IGF0IGFsbW9zdCBhbnkgdGltZS4gIEhvd2V2ZXIsIGludmFsaWRhdGlvbnMKKyAqCW9mIHZpcnR1
YWwtdG8tcGh5c2ljYWwgbWFwcGluZ3MgbXVzdCBiZSBkb25lIGFzCisgKglyZXF1ZXN0ZWQuCisg
KgorICoJSW4gb3JkZXIgdG8gY29wZSB3aXRoIGhhcmR3YXJlIGFyY2hpdGVjdHVyZXMgd2hpY2gK
KyAqCW1ha2UgdmlydHVhbC10by1waHlzaWNhbCBtYXAgaW52YWxpZGF0ZXMgZXhwZW5zaXZlLAor
ICoJdGhpcyBtb2R1bGUgbWF5IGRlbGF5IGludmFsaWRhdGUgb3IgcmVkdWNlZCBwcm90ZWN0aW9u
CisgKglvcGVyYXRpb25zIHVudGlsIHN1Y2ggdGltZSBhcyB0aGV5IGFyZSBhY3R1YWxseQorICoJ
bmVjZXNzYXJ5LiAgVGhpcyBtb2R1bGUgaXMgZ2l2ZW4gZnVsbCBpbmZvcm1hdGlvbiBhcworICoJ
dG8gd2hpY2ggcHJvY2Vzc29ycyBhcmUgY3VycmVudGx5IHVzaW5nIHdoaWNoIG1hcHMsCisgKglh
bmQgdG8gd2hlbiBwaHlzaWNhbCBtYXBzIG11c3QgYmUgbWFkZSBjb3JyZWN0LgorICovCisKKyNp
bmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRCQiKTsKKworI2luY2x1ZGUg
Im9wdF9kZGIuaCIKKyNpbmNsdWRlICJvcHRfcG1hcC5oIgorI2luY2x1ZGUgIm9wdF92bS5oIgor
CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RtLmg+CisjaW5jbHVk
ZSA8c3lzL2t0ci5oPgorI2luY2x1ZGUgPHN5cy9sb2NrLmg+CisjaW5jbHVkZSA8c3lzL21tYW4u
aD4KKyNpbmNsdWRlIDxzeXMvbXNnYnVmLmg+CisjaW5jbHVkZSA8c3lzL211dGV4Lmg+CisjaW5j
bHVkZSA8c3lzL3BjcHUuaD4KKyNpbmNsdWRlIDxzeXMvcHJvYy5oPgorI2luY2x1ZGUgPHN5cy9y
d2xvY2suaD4KKyNpbmNsdWRlIDxzeXMvc2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4K
KyNpbmNsdWRlIDxzeXMvX3R5cGVzLmg+CisjaWZkZWYgU01QCisjaW5jbHVkZSA8c3lzL3NtcC5o
PgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvY3B1c2V0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMv
c3lzY3RsLmg+CisjaW5jbHVkZSA8c3lzL3ZtbWV0ZXIuaD4KKworI2lmZGVmIEREQgorI2luY2x1
ZGUgPGRkYi9kZGIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dm0vdm0uaD4KKyNpbmNsdWRlIDx2
bS92bV9wYXJhbS5oPgorI2luY2x1ZGUgPHZtL3ZtX2tlcm4uaD4KKyNpbmNsdWRlIDx2bS92bV9w
YWdlLmg+CisjaW5jbHVkZSA8dm0vdm1fbWFwLmg+CisjaW5jbHVkZSA8dm0vdm1fb2JqZWN0Lmg+
CisjaW5jbHVkZSA8dm0vdm1fZXh0ZXJuLmg+CisjaW5jbHVkZSA8dm0vdm1fcGFnZW91dC5oPgor
I2luY2x1ZGUgPHZtL3ZtX3BhZ2VyLmg+CisjaW5jbHVkZSA8dm0vdm1fcmFkaXguaD4KKyNpbmNs
dWRlIDx2bS92bV9yZXNlcnYuaD4KKyNpbmNsdWRlIDx2bS91bWEuaD4KKworI2luY2x1ZGUgPG1h
Y2hpbmUvY2FjaGUuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL21kX3Zhci5oPgorI2luY2x1ZGUgPG1h
Y2hpbmUvdGxiLmg+CisKKyN1bmRlZiBQTUFQX0RFQlVHCisKKyNpZiAhZGVmaW5lZChESUFHTk9T
VElDKQorI2RlZmluZQlQTUFQX0lOTElORSBfX2lubGluZQorI2Vsc2UKKyNkZWZpbmUJUE1BUF9J
TkxJTkUKKyNlbmRpZgorCisvLyAjZGVmaW5lIFBWX1NUQVRTCisjaWZkZWYgUFZfU1RBVFMKKyNk
ZWZpbmUgUFZfU1RBVCh4KQlkbyB7IHggOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUFZf
U1RBVCh4KQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZQlwYV9pbmRleChwYSkJ
KChwYSkgPj4gUERSU0hJRlQpCisjZGVmaW5lCXBhX3RvX3B2aChwYSkJKCZwdl90YWJsZVtwYV9p
bmRleChwYSldKQorCisjZGVmaW5lCU5QVl9MSVNUX0xPQ0tTCU1BWENQVQorCisjZGVmaW5lCVBI
WVNfVE9fUFZfTElTVF9MT0NLKHBhKQlcCisJCSgmcHZfbGlzdF9sb2Nrc1twYV9pbmRleChwYSkg
JSBOUFZfTElTVF9MT0NLU10pCisKKyNkZWZpbmUJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlT
KGxvY2twLCBwYSkJZG8gewlcCisJc3RydWN0IHJ3bG9jayAqKl9sb2NrcCA9IChsb2NrcCk7CQlc
CisJc3RydWN0IHJ3bG9jayAqX25ld19sb2NrOwkJCVwKKwkJCQkJCQlcCisJX25ld19sb2NrID0g
UEhZU19UT19QVl9MSVNUX0xPQ0socGEpOwkJXAorCWlmIChfbmV3X2xvY2sgIT0gKl9sb2NrcCkg
ewkJCVwKKwkJaWYgKCpfbG9ja3AgIT0gTlVMTCkJCQlcCisJCQlyd193dW5sb2NrKCpfbG9ja3Ap
OwkJXAorCQkqX2xvY2twID0gX25ld19sb2NrOwkJCVwKKwkJIHJ3X3dsb2NrKCpfbG9ja3ApOwkJ
CVwKKwl9CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSEFOR0VfUFZfTElTVF9MT0NL
X1RPX1ZNX1BBR0UobG9ja3AsIG0pCVwKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxv
Y2twLCBWTV9QQUdFX1RPX1BIWVMobSkpCisKKyNkZWZpbmUJUkVMRUFTRV9QVl9MSVNUX0xPQ0so
bG9ja3ApCQlkbyB7CVwKKwlzdHJ1Y3Qgcndsb2NrICoqX2xvY2twID0gKGxvY2twKTsJCVwKKwkJ
CQkJCQlcCisJaWYgKCpfbG9ja3AgIT0gTlVMTCkgewkJCQlcCisJCXJ3X3d1bmxvY2soKl9sb2Nr
cCk7CQkJXAorCQkqX2xvY2twID0gTlVMTDsJCQkJXAorCX0JCQkJCQlcCit9IHdoaWxlICgwKQor
CisjZGVmaW5lCVZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pCVwKKwkJUEhZU19UT19QVl9MSVNU
X0xPQ0soVk1fUEFHRV9UT19QSFlTKG0pKQorCisvKgorICogR2V0IFBERXMgYW5kIFBURXMgZm9y
IHVzZXIva2VybmVsIGFkZHJlc3Mgc3BhY2UKKyAqLworI2RlZmluZQlwbWFwX3NlZ19pbmRleCh2
KQkoKCh2KSA+PiBTRUdTSElGVCkgJiAoTlBERVBHIC0gMSkpCisjZGVmaW5lCXBtYXBfcGRlX2lu
ZGV4KHYpCSgoKHYpID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKSkKKyNkZWZpbmUJcG1hcF9w
dGVfaW5kZXgodikJKCgodikgPj4gUEFHRV9TSElGVCkgJiAoTlBURVBHIC0gMSkpCisjZGVmaW5l
CXBtYXBfcGRlX3BpbmRleCh2KQkoKHYpID4+IFBEUlNISUZUKQorCisjZGVmaW5lCU5VUERFCQkJ
KE5QREVQRyAqIE5QREVQRykKKyNkZWZpbmUJTlVTRVJQR1RCTFMJCShOVVBERSArIE5QREVQRykK
KworI2RlZmluZQlpc19rZXJuZWxfcG1hcCh4KQkoKHgpID09IGtlcm5lbF9wbWFwKQorCitzdHJ1
Y3QgcG1hcCBrZXJuZWxfcG1hcF9zdG9yZTsKK3BkX2VudHJ5X3QgKmtlcm5lbF9zZWdtYXA7CisK
K3ZtX29mZnNldF90IHZpcnR1YWxfYXZhaWw7CS8qIFZBIG9mIGZpcnN0IGF2YWlsIHBhZ2UgKGFm
dGVyIGtlcm5lbCBic3MpICovCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2VuZDsJLyogVkEgb2YgbGFz
dCBhdmFpbCBwYWdlIChlbmQgb2Yga2VybmVsIEFTKSAqLworCitzdGF0aWMgaW50IG5rcHQ7Cit1
bnNpZ25lZCBwbWFwX21heF9hc2lkOwkJLyogbWF4IEFTSUQgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0
ZW0gKi8KKworc3RhdGljIFNZU0NUTF9OT0RFKF92bSwgT0lEX0FVVE8sIHBtYXAsIENUTEZMQUdf
UkQsIDAsICJWTS9wbWFwIHBhcmFtZXRlcnMiKTsKK3N0YXRpYyBpbnQgcGdfc3BfZW5hYmxlZCA9
IDA7CitTWVNDVExfSU5UKF92bV9wbWFwLCBPSURfQVVUTywgcGdfcHNfZW5hYmxlZCwgQ1RMRkxB
R19SRFRVTiB8IENUTEZMQUdfTk9GRVRDSCwKKyAgICAmcGdfc3BfZW5hYmxlZCwgMCwgIkFyZSBs
YXJnZSBwYWdlIG1hcHBpbmdzIGVuYWJsZWQ/Iik7CisKKyNkZWZpbmUJUE1BUF9BU0lEX1JFU0VS
VkVECTAKKwordm1fb2Zmc2V0X3Qga2VybmVsX3ZtX2VuZCA9IFZNX01JTl9LRVJORUxfQUREUkVT
UzsKKworc3RhdGljIHZvaWQgcG1hcF9hc2lkX2FsbG9jKHBtYXBfdCBwbWFwKTsKKworc3RhdGlj
IHN0cnVjdCByd2xvY2tfcGFkYWxpZ24gcHZoX2dsb2JhbF9sb2NrOworCisvKgorICogRGF0YSBm
b3IgdGhlIHB2IGVudHJ5IGFsbG9jYXRpb24gbWVjaGFuaXNtCisgKi8KK3N0YXRpYyBUQUlMUV9I
RUFEKHBjaCwgcHZfY2h1bmspIHB2X2NodW5rcyA9IFRBSUxRX0hFQURfSU5JVElBTElaRVIocHZf
Y2h1bmtzKTsKK3N0YXRpYyBzdHJ1Y3QgbXR4IHB2X2NodW5rc19tdXRleDsKK3N0YXRpYyBzdHJ1
Y3Qgcndsb2NrIHB2X2xpc3RfbG9ja3NbTlBWX0xJU1RfTE9DS1NdOworc3RhdGljIHN0cnVjdCBt
ZF9wYWdlICpwdl90YWJsZTsKKworc3RhdGljIHZvaWQgZnJlZV9wdl9jaHVuayhzdHJ1Y3QgcHZf
Y2h1bmsgKnBjKTsKK3N0YXRpYyB2b2lkIGZyZWVfcHZfZW50cnkocG1hcF90IHBtYXAsIHB2X2Vu
dHJ5X3QgcHYpOworc3RhdGljIHB2X2VudHJ5X3QgZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBz
dHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCByZWNsYWltX3B2X2NodW5r
KHBtYXBfdCBsb2NrZWRfcG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lk
IHBtYXBfcHZoX2ZyZWUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNl
dF90IHZhKTsKK3N0YXRpYyBwdl9lbnRyeV90IHBtYXBfcHZoX3JlbW92ZShzdHJ1Y3QgbWRfcGFn
ZSAqcHZoLCBwbWFwX3QgcG1hcCwKKyAgICB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm1fcGFn
ZV90IHBtYXBfYWxsb2NfZGlyZWN0X3BhZ2UodW5zaWduZWQgaW50IGluZGV4LCBpbnQgcmVxKTsK
K3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9lbnRlcl9xdWlja19sb2NrZWQocG1hcF90IHBtYXAsIHZt
X29mZnNldF90IHZhLAorICAgIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCwgdm1fcGFnZV90
IG1wdGUsICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcmVzZXJ2ZV9wdl9l
bnRyaWVzKHBtYXBfdCBwbWFwLCBpbnQgbmVlZGVkLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2Nr
cCk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgcGRfZW50
cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3Rl
X3BkZV9sb2NrZWQocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwKKyAgICB2bV9vZmZzZXRf
dCB2YSwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxv
Y3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxv
Y2twKTsKK3N0YXRpYyBib29sZWFuX3QgcG1hcF9lbnRlcl9wZGUocG1hcF90IHBtYXAsIHZtX29m
ZnNldF90IHZhLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3QgcHJvdCwgc3RydWN0IHJ3bG9j
ayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBtYXBfcHZfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwg
dm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2tw
KTsKK3N0YXRpYyBib29sZWFuX3QgcG1hcF9wdl9pbnNlcnRfcGRlKHBtYXBfdCBwbWFwLCB2bV9v
ZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOwor
c3RhdGljIHZvaWQgcG1hcF9wdl9wcm9tb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qg
dmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2
b2lkIHBtYXBfZmlsbF9wdHAocHRfZW50cnlfdCAqZmlyc3RwdGUsIHB0X2VudHJ5X3QgbmV3cHRl
KTsKK3N0YXRpYyBfX2lubGluZSBpbnQgcG1hcF9pbnNlcnRfcHRfcGFnZShwbWFwX3QgcG1hcCwg
dm1fcGFnZV90IG1wdGUpOworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdCBwbWFwX2xvb2t1cF9w
dF9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm9pZCBwbWFwX3By
b21vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAor
ICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3ZlX3BkZShw
bWFwX3QgcG1hcCwgcGRfZW50cnlfdCAqcGRxLCB2bV9vZmZzZXRfdCBzdmEsCisgICAgc3RydWN0
IHNwZ2xpc3QgKmZyZWUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBf
cmVtb3ZlX3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRfZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRf
dCB2YSwKKyAgICBwZF9lbnRyeV90IHB0ZXBkZSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsIHN0cnVj
dCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX3JlbW92ZV9wYWdlKHN0cnVjdCBw
bWFwICpwbWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSk7Citz
dGF0aWMgYm9vbGVhbl90IHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3QgcG1hcCwgdm1f
b2Zmc2V0X3QgdmEsCisgICAgdm1fcGFnZV90IG0sIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7Citz
dGF0aWMgdm9pZCBwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg
cHRfZW50cnlfdCBwdGUpOworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3Qg
cG1hcCk7CitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwX3QgcG1hcCwgdm1f
b2Zmc2V0X3QgdmEpOworc3RhdGljIHZvaWQgX3BtYXBfdW53aXJlX3B0cChwbWFwX3QgcG1hcCwg
dm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlKTsK
Kworc3RhdGljIHZtX3BhZ2VfdCBwbWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRf
dCB2YSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCBfcG1h
cF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQgcHRlcGluZGV4LAorICAgIHN0cnVjdCBy
d2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfdW51c2VfcHQocG1hcF90LCB2bV9vZmZz
ZXRfdCwgcGRfZW50cnlfdCwgc3RydWN0IHNwZ2xpc3QgKik7CitzdGF0aWMgcHRfZW50cnlfdCBp
bml0X3B0ZV9wcm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJv
dCk7CisKK3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcp
Oworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbih2b2lkICphcmcpOwor
c3RhdGljIHZvaWQgcG1hcF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKTsKKworLyoKKyAq
IFBhZ2UgdGFibGUgZW50cnkgbG9va3VwIHJvdXRpbmVzLgorICovCisKKy8qIFJldHVybiBhIHNl
Z21lbnQgZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMg
X19pbmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3NlZ21hcChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEpCit7CisKKwlyZXR1cm4gKCZwbWFwLT5wbV9zZWd0YWJbcG1hcF9zZWdfaW5kZXgodmEp
XSk7Cit9CisKKy8qIFJldHVybiBhIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBnaXZlbiBzZWdt
ZW50IHRhYmxlICYgdmlydHVhbCBhZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5
X3QgKgorcG1hcF9wZHBlX3RvX3BkZShwZF9lbnRyeV90ICpwZHBlLCB2bV9vZmZzZXRfdCB2YSkK
K3sKKwlwZF9lbnRyeV90ICpwZGU7CisKKwlwZGUgPSAocGRfZW50cnlfdCAqKSpwZHBlOworCXJl
dHVybiAoJnBkZVtwbWFwX3BkZV9pbmRleCh2YSldKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSBk
aXJlY3RvcnkgZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0
aWMgX19pbmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRwZTsKKworCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFw
LCB2YSk7CisJaWYgKCpwZHBlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlyZXR1cm4g
KHBtYXBfcGRwZV90b19wZGUocGRwZSwgdmEpKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSB0YWJs
ZSBlbnRyeSBmb3IgZ2l2ZW4gcGFnZSBkaXJlY3RvcnkgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitz
dGF0aWMgX19pbmxpbmUgcHRfZW50cnlfdCAqCitwbWFwX3BkZV90b19wdGUocGRfZW50cnlfdCAq
cGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlwdGUgPSAocHRf
ZW50cnlfdCAqKSpwZGU7CisJcmV0dXJuICgmcHRlW3BtYXBfcHRlX2luZGV4KHZhKV0pOworfQor
CisvKiBSZXR1cm4gYSBwYWdlIHRhYmxlIGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBh
ZGRyZXNzLiAqLworcHRfZW50cnlfdCAqCitwbWFwX3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEp
OworCWlmIChwZGUgPT0gTlVMTCB8fCAqcGRlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJ
aWYgKHBkZV9pc19zdXBlcnBhZ2UocGRlKSkgeworCQlyZXR1cm4gKChwdF9lbnRyeV90ICopcGRl
KTsKKwl9IGVsc2UKKwkJcmV0dXJuIChwbWFwX3BkZV90b19wdGUocGRlLCB2YSkpOworfQorCitz
dGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcF90IHBtYXAs
IGludCBjb3VudCkKK3sKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCXBt
YXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50ICs9IGNvdW50OworfQorCitzdGF0aWMgX19pbmxp
bmUgdm9pZAorcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcF90IHBtYXAsIGludCBjb3VudCkK
K3sKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQocG1hcC0+
cG1fc3RhdHMucmVzaWRlbnRfY291bnQgPj0gY291bnQsCisJICAgICgicG1hcCAlcCByZXNpZGVu
dCBjb3VudCB1bmRlcmZsb3cgJWxkICVkIiwgcG1hcCwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVz
aWRlbnRfY291bnQsIGNvdW50KSk7CisJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgLT0g
Y291bnQ7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBzb21lIHdpcmVkIG1lbW9yeSBiZWZvcmUgdGhl
IHZpcnR1YWwgbWVtb3J5IHN5c3RlbSBpcworICogYm9vdHN0cmFwcGVkLgorICovCit2bV9vZmZz
ZXRfdAorcG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpCit7CisJdm1fcGFkZHJfdCBi
YW5rX3NpemUsIHBhOworCXZtX29mZnNldF90IHZhOworCisJc2l6ZSA9IHJvdW5kX3BhZ2Uoc2l6
ZSk7CisJYmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJd2hpbGUg
KHNpemUgPiBiYW5rX3NpemUpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgcGh5c19hdmFp
bFtpICsgMl07IGkgKz0gMikgeworCQkJcGh5c19hdmFpbFtpXSA9IHBoeXNfYXZhaWxbaSArIDJd
OworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2YWlsW2kgKyAzXTsKKwkJfQorCQlwaHlz
X2F2YWlsW2ldID0gMDsKKwkJcGh5c19hdmFpbFtpICsgMV0gPSAwOworCQlpZiAoIXBoeXNfYXZh
aWxbMF0pCisJCQlwYW5pYygicG1hcF9zdGVhbF9tZW1vcnk6IG91dCBvZiBtZW1vcnkiKTsKKwkJ
YmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJfQorCisJcGEgPSBw
aHlzX2F2YWlsWzBdOworCXBoeXNfYXZhaWxbMF0gKz0gc2l6ZTsKKwl2YSA9IE1JUFNfUEhZU19U
T19ESVJFQ1QocGEpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBzaXplKTsKKwlyZXR1cm4gKHZhKTsK
K30KKworLyoKKyAqIEJvb3RzdHJhcCB0aGUgc3lzdGVtIGVub3VnaCB0byBydW4gd2l0aCB2aXJ0
dWFsIG1lbW9yeS4gIFRoaXMKKyAqIGFzc3VtZXMgdGhhdCB0aGUgcGh5c19hdmFpbCBhcnJheSBo
YXMgYmVlbiBpbml0aWFsaXplZC4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfY3JlYXRlX2tlcm5l
bF9wYWdldGFibGUodm9pZCkKK3sKKwlpbnQgaSwgajsKKwl2bV9vZmZzZXRfdCBwdGFkZHI7CisJ
cHRfZW50cnlfdCAqcHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZzZXRfdCBwZGFkZHI7
CisJaW50IG5wdCwgbnBkZTsKKworCS8qCisJICogQWxsb2NhdGUgc2VnbWVudCB0YWJsZSBmb3Ig
dGhlIGtlcm5lbAorCSAqLworCWtlcm5lbF9zZWdtYXAgPSAocGRfZW50cnlfdCAqKXBtYXBfc3Rl
YWxfbWVtb3J5KFBBR0VfU0laRSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNlY29uZCBsZXZlbCBw
YWdlIHRhYmxlcyBmb3IgdGhlIGtlcm5lbAorCSAqLworCW5wZGUgPSBob3dtYW55KE5LUFQsIE5Q
REVQRyk7CisJcGRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbnBkZSk7CisJ
bmtwdCA9IE5LUFQ7CisJcHRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbmtw
dCk7CisKKwkvKgorCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhl
IEdsb2JhbCBiaXQgaW4gdGhlCisJICogdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlciBmb3Ig
ZWFjaCAyIHBhZ2UgZW50cnkuIFRodXMgaW52YWxpZAorCSAqIGVudHJ5cyBtdXN0IGhhdmUgdGhl
IEdsb2JhbCBiaXQgc2V0IHNvIHdoZW4gRW50cnkgTE8gYW5kIEVudHJ5IEhJCisJICogRyBiaXRz
IGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdpbGwgcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3Rv
cmUKKwkgKiBpbiB0aGUgdGxiLgorCSAqLworCWZvciAoaSA9IDAsIHB0ZSA9IChwdF9lbnRyeV90
ICopcHRhZGRyOyBpIDwgKG5rcHQgKiBOUFRFUEcpOyBpKyssIHB0ZSsrKQorCQkqcHRlID0gUFRF
X0c7CisKKwlmb3IgKGkgPSAwLCAgbnB0ID0gbmtwdDsgbnB0ID4gMDsgaSsrKSB7CisJCWtlcm5l
bF9zZWdtYXBbaV0gPSAocGRfZW50cnlfdCkocGRhZGRyICsgaSAqIFBBR0VfU0laRSk7CisJCXBk
ZSA9IChwZF9lbnRyeV90ICopa2VybmVsX3NlZ21hcFtpXTsKKworCQlmb3IgKGogPSAwOyBqIDwg
TlBERVBHICYmIG5wdCA+IDA7IGorKywgbnB0LS0pCisJCQlwZGVbal0gPSAocGRfZW50cnlfdCko
cHRhZGRyICsgKGkgKiBOUERFUEcgKyBqKSAqCisJCQkgICAgUEFHRV9TSVpFKTsKKwl9CisKKwlQ
TUFQX0xPQ0tfSU5JVChrZXJuZWxfcG1hcCk7CisJa2VybmVsX3BtYXAtPnBtX3NlZ3RhYiA9IGtl
cm5lbF9zZWdtYXA7CisJQ1BVX0ZJTEwoJmtlcm5lbF9wbWFwLT5wbV9hY3RpdmUpOworCVRBSUxR
X0lOSVQoJmtlcm5lbF9wbWFwLT5wbV9wdmNodW5rKTsKKwlrZXJuZWxfcG1hcC0+cG1fYXNpZFsw
XS5hc2lkID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCWtlcm5lbF9wbWFwLT5wbV9hc2lkWzBdLmdl
biA9IDA7CisJa2VybmVsX3ZtX2VuZCArPSBua3B0ICogTlBURVBHICogUEFHRV9TSVpFOworfQor
Cit2b2lkCitwbWFwX2Jvb3RzdHJhcCh2b2lkKQoreworCWludCBpOworCisJLyogU29ydC4gKi8K
K2FnYWluOgorCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgewor
CQkvKgorCQkgKiBLZWVwIHRoZSBtZW1vcnkgYWxpZ25lZCBvbiBwYWdlIGJvdW5kYXJ5LgorCQkg
Ki8KKwkJcGh5c19hdmFpbFtpXSA9IHJvdW5kX3BhZ2UocGh5c19hdmFpbFtpXSk7CisJCXBoeXNf
YXZhaWxbaSArIDFdID0gdHJ1bmNfcGFnZShwaHlzX2F2YWlsW2kgKyAxXSk7CisKKwkJaWYgKGkg
PCAyKQorCQkJY29udGludWU7CisJCWlmIChwaHlzX2F2YWlsW2kgLSAyXSA+IHBoeXNfYXZhaWxb
aV0pIHsKKwkJCXZtX3BhZGRyX3QgcHRlbXBbMl07CisKKwkJCXB0ZW1wWzBdID0gcGh5c19hdmFp
bFtpICsgMF07CisJCQlwdGVtcFsxXSA9IHBoeXNfYXZhaWxbaSArIDFdOworCisJCQlwaHlzX2F2
YWlsW2kgKyAwXSA9IHBoeXNfYXZhaWxbaSAtIDJdOworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBw
aHlzX2F2YWlsW2kgLSAxXTsKKworCQkJcGh5c19hdmFpbFtpIC0gMl0gPSBwdGVtcFswXTsKKwkJ
CXBoeXNfYXZhaWxbaSAtIDFdID0gcHRlbXBbMV07CisJCQlnb3RvIGFnYWluOworCQl9CisJfQor
CisJLyoKKwkgKiBDb3B5IHRoZSBwaHlzX2F2YWlsW10gYXJyYXkgYmVmb3JlIHdlIHN0YXJ0IHN0
ZWFsaW5nIG1lbW9yeSBmcm9tIGl0LgorCSAqLworCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSAr
IDFdICE9IDA7IGkgKz0gMikgeworCQlwaHlzbWVtX2Rlc2NbaV0gPSBwaHlzX2F2YWlsW2ldOwor
CQlwaHlzbWVtX2Rlc2NbaSArIDFdID0gcGh5c19hdmFpbFtpICsgMV07CisJfQorCisJTWF4bWVt
ID0gYXRvcChwaHlzX2F2YWlsW2kgLSAxXSk7CisKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJp
bnRmKCJQaHlzaWNhbCBtZW1vcnkgY2h1bmsocyk6XG4iKTsKKwkJZm9yIChpID0gMDsgcGh5c19h
dmFpbFtpICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCQl2bV9wYWRkcl90IHNpemU7CisKKwkJCXNp
emUgPSBwaHlzX2F2YWlsW2kgKyAxXSAtIHBoeXNfYXZhaWxbaV07CisJCQlwcmludGYoIiUjMDhq
eCAtICUjMDhqeCwgJWp1IGJ5dGVzICglanUgcGFnZXMpXG4iLAorCQkJICAgICh1aW50bWF4X3Qp
IHBoeXNfYXZhaWxbaV0sCisJCQkgICAgKHVpbnRtYXhfdCkgcGh5c19hdmFpbFtpICsgMV0gLSAx
LAorCQkJICAgICh1aW50bWF4X3QpIHNpemUsICh1aW50bWF4X3QpIHNpemUgLyBQQUdFX1NJWkUp
OworCQl9CisJCXByaW50ZigiTWF4bWVtIGlzIDB4JTBqeFxuIiwgcHRvYSgodWludG1heF90KU1h
eG1lbSkpOworCX0KKwkvKgorCSAqIFN0ZWFsIHRoZSBtZXNzYWdlIGJ1ZmZlciBmcm9tIHRoZSBi
ZWdpbm5pbmcgb2YgbWVtb3J5LgorCSAqLworCW1zZ2J1ZnAgPSAoc3RydWN0IG1zZ2J1ZiAqKXBt
YXBfc3RlYWxfbWVtb3J5KG1zZ2J1ZnNpemUpOworCW1zZ2J1ZmluaXQobXNnYnVmcCwgbXNnYnVm
c2l6ZSk7CisKKwkvKgorCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLiBUaGlzIG11c3QgYmUgYWxp
Z25lZCB0bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBh
IHNpbmdsZSBUTEIgZW50cnkuCisJICoKKwkgKi8KKwlrc3RhY2swID0gcG1hcF9zdGVhbF9tZW1v
cnkoKEtTVEFDS19QQUdFUyAgKyBLU1RBQ0tfR1VBUkRfUEFHRVMpIDw8CisJICAgIFBBR0VfU0hJ
RlQpOworCWtzdGFjazAgPSByb3VuZHVwMihrc3RhY2swLCAoS1NUQUNLX1BBR0VfU0laRSAqIDIp
KTsKKworCXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJFU1M7CisJdmlydHVhbF9l
bmQgPSBWTV9NQVhfS0VSTkVMX0FERFJFU1M7CisKKyNpZmRlZiBTTVAKKwkvKgorCSAqIFN0ZWFs
IHNvbWUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIHRvIG1hcCB0aGUgcGNwdSBhcmVhLgorCSAqLwor
CXZpcnR1YWxfYXZhaWwgPSByb3VuZHVwMih2aXJ0dWFsX2F2YWlsLCBQQUdFX1NJWkUgKiAyKTsK
KwlwY3B1cCA9IChzdHJ1Y3QgcGNwdSAqKXZpcnR1YWxfYXZhaWw7CisJdmlydHVhbF9hdmFpbCAr
PSBQQUdFX1NJWkUgKiAyOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB3aXJlZCBUTEIgZW50
cnkgbWFwcGluZyB0aGUgcGNwdSByZWdpb24gZm9yCisJICogdGhlIEJTUCBhdCAncGNwdXAnLiBV
cCB1bnRpbCB0aGlzIHBvaW50IHdlIHdlcmUgb3BlcmF0aW5nCisJICogd2l0aCB0aGUgJ3BjcHVw
JyBmb3IgdGhlIEJTUCBwb2ludGluZyB0byBhIHZpcnR1YWwgYWRkcmVzcworCSAqIGluIEtTRUcw
IHNvIHRoZXJlIHdhcyBubyBuZWVkIGZvciBhIFRMQiBtYXBwaW5nLgorCSAqLworCW1pcHNfcGNw
dV90bGJfaW5pdChQQ1BVX0FERFIoMCkpOworCisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYo
InBjcHUgaXMgYXZhaWxhYmxlIGF0IHZpcnR1YWwgYWRkcmVzcyAlcC5cbiIsIHBjcHVwKTsKKyNl
bmRpZgorCisJcG1hcF9jcmVhdGVfa2VybmVsX3BhZ2V0YWJsZSgpOworCXBtYXBfbWF4X2FzaWQg
PSBWTU5VTV9QSURTOworCW1pcHNfd3JfZW50cnloaSgwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDAp
OworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgcHYgbGlzdCBsb2NrLgorCSAqLwor
CXJ3X2luaXQoJnB2aF9nbG9iYWxfbG9jaywgInBtYXAgcHYgZ2xvYmFsIik7Cit9CisKKy8qCisg
KiBJbml0aWFsaXplIGEgdm1fcGFnZSdzIG1hY2hpbmUtZGVwZW5kZW50IGZpZWxkcy4KKyAqLwor
dm9pZAorcG1hcF9wYWdlX2luaXQodm1fcGFnZV90IG0pCit7CisKKwlUQUlMUV9JTklUKCZtLT5t
ZC5wdl9saXN0KTsKKwltLT5tZC5wdl9tZW1hdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOworfQor
CisvKgorICoJSW5pdGlhbGl6ZSB0aGUgcG1hcCBtb2R1bGUuCisgKglDYWxsZWQgYnkgdm1faW5p
dCwgdG8gaW5pdGlhbGl6ZSBhbnkgc3RydWN0dXJlcyB0aGF0IHRoZSBwbWFwCisgKglzeXN0ZW0g
bmVlZHMgdG8gbWFwIHZpcnR1YWwgbWVtb3J5LgorICovCit2b2lkCitwbWFwX2luaXQodm9pZCkK
K3sKKwlpbnQgaTsKKwl2bV9zaXplX3QgczsKKwlpbnQgcHZfbnBnOworCisJLyoKKwkgKiBJbml0
aWFsaXplIHRoZSBwdiBjaHVuayBsaXN0IG11dGV4LgorCSAqLworCW10eF9pbml0KCZwdl9jaHVu
a3NfbXV0ZXgsICJwbWFwIHB2IGNodW5rIGxpc3QiLCBOVUxMLCBNVFhfREVGKTsKKworCS8qCisJ
ICogSW5pdGlhbGl6ZSB0aGUgcG9vbCBvZiBwdiBsaXN0IGxvY2tzLgorCSAqLworCWZvciAoaSA9
IDA7IGkgPCBOUFZfTElTVF9MT0NLUzsgaSsrKQorCQlyd19pbml0KCZwdl9saXN0X2xvY2tzW2ld
LCAicHYgbGlzdCIpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHB2IGhl
YWQgdGFibGUgZm9yIHN1cGVycGFnZXMuCisJICovCisJZm9yIChpID0gMDsgcGh5c19hdmFpbFtp
ICsgMV07IGkgKz0gMik7CisJcHZfbnBnID0gcm91bmRfMm1wYWdlKHBoeXNfYXZhaWxbKGkgLSAy
KSArIDFdKSAvIE5CUERSOworCisJLyoKKwkgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwdiBo
ZWFkIHRhYmxlIGZvciBzdXBlcnBhZ2VzLgorCSAqLworCXMgPSAodm1fc2l6ZV90KShwdl9ucGcg
KiBzaXplb2Yoc3RydWN0IG1kX3BhZ2UpKTsKKwlzID0gcm91bmRfcGFnZShzKTsKKwlwdl90YWJs
ZSA9IChzdHJ1Y3QgbWRfcGFnZSAqKWttZW1fbWFsbG9jKGtlcm5lbF9hcmVuYSwgcywKKwkgICAg
TV9XQUlUT0sgfCBNX1pFUk8pOworCWZvciAoaSA9IDA7IGkgPCBwdl9ucGc7IGkrKykKKwkJVEFJ
TFFfSU5JVCgmcHZfdGFibGVbaV0ucHZfbGlzdCk7Cit9CisKK3N0YXRpYyBTWVNDVExfTk9ERShf
dm1fcG1hcCwgT0lEX0FVVE8sIHBkZSwgQ1RMRkxBR19SRCwgMCwKKyAgICAiMk1CIHBhZ2UgbWFw
cGluZyBjb3VudGVycyIpOworCitzdGF0aWMgdV9sb25nIHBtYXBfcGRlX2RlbW90aW9uczsKK1NZ
U0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBkZW1vdGlvbnMsIENUTEZMQUdfUkQs
CisgICAgJnBtYXBfcGRlX2RlbW90aW9ucywgMCwgIjJNQiBwYWdlIGRlbW90aW9ucyIpOworCitz
dGF0aWMgdV9sb25nIHBtYXBfcGRlX21hcHBpbmdzOworU1lTQ1RMX1VMT05HKF92bV9wbWFwX3Bk
ZSwgT0lEX0FVVE8sIG1hcHBpbmdzLCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9tYXBwaW5n
cywgMCwgIjJNQiBwYWdlIG1hcHBpbmdzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcF9m
YWlsdXJlczsKK1NZU0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwX2ZhaWx1cmVz
LCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAwLCAiMk1CIHBhZ2UgcHJv
bW90aW9uIGZhaWx1cmVzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcHJvbW90aW9uczsK
K1NZU0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwcm9tb3Rpb25zLCBDVExGTEFH
X1JELAorICAgICZwbWFwX3BkZV9wcm9tb3Rpb25zLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9ucyIp
OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
CisgKiBMb3cgbGV2ZWwgaGVscGVyIHJvdXRpbmVzLi4uLi4KKyAqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglTTVAKK3N0YXRpYyBf
X2lubGluZSB2b2lkCitwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcF90IHBtYXAsIHZvaWQg
KCpmbikodm9pZCAqKSwgdm9pZCAqYXJnKQoreworCWludAljcHVpZCwgY3B1LCBzZWxmOworCWNw
dXNldF90IGFjdGl2ZV9jcHVzOworCisJc2NoZWRfcGluKCk7CisJaWYgKGlzX2tlcm5lbF9wbWFw
KHBtYXApKSB7CisJCXNtcF9yZW5kZXp2b3VzKE5VTEwsIGZuLCBOVUxMLCBhcmcpOworCQlnb3Rv
IG91dDsKKwl9CisJLyogRm9yY2UgQVNJRCB1cGRhdGUgb24gaW5hY3RpdmUgQ1BVcyAqLworCUNQ
VV9GT1JFQUNIKGNwdSkgeworCQlpZiAoIUNQVV9JU1NFVChjcHUsICZwbWFwLT5wbV9hY3RpdmUp
KQorCQkJcG1hcC0+cG1fYXNpZFtjcHVdLmdlbiA9IDA7CisJfQorCWNwdWlkID0gUENQVV9HRVQo
Y3B1aWQpOworCS8qCisJICogWFhYOiBiYXJyaWVyL2xvY2tpbmcgZm9yIGFjdGl2ZT8KKwkgKgor
CSAqIFRha2UgYSBzbmFwc2hvdCBvZiBhY3RpdmUgaGVyZSwgYW55IGZ1cnRoZXIgY2hhbmdlcyBh
cmUgaWdub3JlZC4KKwkgKiB0bGIgdXBkYXRlL2ludmFsaWRhdGUgc2hvdWxkIGJlIGhhcm1sZXNz
IG9uIGluYWN0aXZlIENQVXMKKwkgKi8KKwlhY3RpdmVfY3B1cyA9IHBtYXAtPnBtX2FjdGl2ZTsK
KwlzZWxmID0gQ1BVX0lTU0VUKGNwdWlkLCAmYWN0aXZlX2NwdXMpOworCUNQVV9DTFIoY3B1aWQs
ICZhY3RpdmVfY3B1cyk7CisJLyogT3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoaXMgY3B1
IGlzIHRoZSBvbmx5IGFjdGl2ZSBvbmUgKi8KKwlpZiAoQ1BVX0VNUFRZKCZhY3RpdmVfY3B1cykp
IHsKKwkJaWYgKHNlbGYpCisJCQlmbihhcmcpOworCX0gZWxzZSB7CisJCWlmIChzZWxmKQorCQkJ
Q1BVX1NFVChjcHVpZCwgJmFjdGl2ZV9jcHVzKTsKKwkJc21wX3JlbmRlenZvdXNfY3B1cyhhY3Rp
dmVfY3B1cywgTlVMTCwgZm4sIE5VTEwsIGFyZyk7CisJfQorb3V0OgorCXNjaGVkX3VucGluKCk7
Cit9CisjZWxzZSAvKiAhU01QICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9jYWxsX29u
X2FjdGl2ZV9jcHVzKHBtYXBfdCBwbWFwLCB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykK
K3sKKwlpbnQJY3B1aWQ7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJZm4oYXJn
KTsKKwkJcmV0dXJuOworCX0KKwljcHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKwlpZiAoIUNQVV9J
U1NFVChjcHVpZCwgJnBtYXAtPnBtX2FjdGl2ZSkpCisJCXBtYXAtPnBtX2FzaWRbY3B1aWRdLmdl
biA9IDA7CisJZWxzZQorCQlmbihhcmcpOworfQorI2VuZGlmIC8qIFNNUCAqLworCitzdGF0aWMg
dm9pZAorcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCkKK3sKKworCXBtYXBfY2FsbF9v
bl9hY3RpdmVfY3B1cyhwbWFwLAorCSAgICAodm9pZCAoKikodm9pZCAqKSl0bGJfaW52YWxpZGF0
ZV9hbGxfdXNlciwgcG1hcCk7Cit9CisKK3N0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcg
eworCXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworfTsKKworc3RhdGljIHZvaWQKK3Bt
YXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpCit7CisJc3RydWN0IHBtYXBfaW52
YWxpZGF0ZV9wYWdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX2FkZHJlc3MocC0+
cG1hcCwgcC0+dmEpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1h
cF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFn
ZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52YSA9IHZhOworCXBtYXBfY2Fs
bF9vbl9hY3RpdmVfY3B1cyhwbWFwLCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24sICZhcmcp
OworfQorCitzdHJ1Y3QgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FyZyB7CisJcG1hcF90IHBtYXA7
CisJdm1fb2Zmc2V0X3Qgc3ZhOworCXZtX29mZnNldF90IGV2YTsKK307CisKK3N0YXRpYyB2b2lk
CitwbWFwX2ludmFsaWRhdGVfcmFuZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG1h
cF9pbnZhbGlkYXRlX3JhbmdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX3Jhbmdl
KHAtPnBtYXAsIHAtPnN2YSwgcC0+ZXZhKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxp
ZGF0ZV9yYW5nZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEp
Cit7CisJc3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcgYXJnOworCisJYXJnLnBtYXAg
PSBwbWFwOworCWFyZy5zdmEgPSBzdmE7CisJYXJnLmV2YSA9IGV2YTsKKwlwbWFwX2NhbGxfb25f
YWN0aXZlX2NwdXMocG1hcCwgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbiwgJmFyZyk7Cit9
CisKK3N0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1fb2Zm
c2V0X3QgdmE7CisJcHRfZW50cnlfdCBwdGU7Cit9OworCitzdGF0aWMgdm9pZAorcG1hcF91cGRh
dGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2Fy
ZyAqcCA9IGFyZzsKKworCXRsYl91cGRhdGUocC0+cG1hcCwgcC0+dmEsIHAtPnB0ZSk7Cit9CisK
K3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2
YSwgcHRfZW50cnlfdCBwdGUpCit7CisJc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnIGFyZzsK
KworCWFyZy5wbWFwID0gcG1hcDsKKwlhcmcudmEgPSB2YTsKKwlhcmcucHRlID0gcHRlOworCXBt
YXBfY2FsbF9vbl9hY3RpdmVfY3B1cyhwbWFwLCBwbWFwX3VwZGF0ZV9wYWdlX2FjdGlvbiwgJmFy
Zyk7Cit9CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVfaW52YWxpZGF0ZShwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgbmV3cGRlKQoreworCisJaWYgKCFwdGVf
aXNfMW1fc3VwZXJwYWdlKCZuZXdwZGUpKSB7CisJCS8qIERlbW90aW9uOiBmbHVzaCBhIHNwZWNp
ZmljIDJtYiBwYWdlIG1hcHBpbmcuICovCisJCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHBtYXAsICh2
YSAmIH5QRFJNQVNLKSwKKwkJICAgICh2YSAmIH5QRFJNQVNLKSArIE5CUERSKTsKKwl9IGVsc2Ug
aWYgKCFwdGVfdGVzdCgmbmV3cGRlLCBQVEVfRykpIHsKKwkJLyoKKwkJICogUHJvbW90aW9uOiBm
bHVzaCBldmVyeSA0S0IgcGFnZSBtYXBwaW5nIGZyb20gdGhlIFRMQgorCQkgKiBiZWNhdXNlIHRo
ZXJlIGFyZSB0b28gbWFueSB0byBmbHVzaCBpbmRpdmlkdWFsbHkuCisJCSAqLworCQl0bGJfaW52
YWxpZGF0ZV9hbGxfdXNlcihwbWFwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBQcm9tb3Rpb246
IGZsdXNoIGV2ZXJ5IDRLQiBwYWdlIG1hcHBpbmcgZnJvbSB0aGUgVExCLAorCQkgKiBpbmNsdWRp
bmcgYW55IGdsb2JhbCAoUFRFX0cpIG1hcHBpbmdzLgorCQkgKi8KKwkJdGxiX2ludmFsaWRhdGVf
YWxsKCk7CisJfQorfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2FyZyB7CisJcG1hcF90IHBt
YXA7CisJdm1fb2Zmc2V0X3QgdmE7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgbmV3
cGRlOworfTsKKworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9hY3Rpb24odm9pZCAqYWN0
KQoreworCXN0cnVjdCBwbWFwX3VwZGF0ZV9wZGVfYXJnICphcmcgPSBhY3Q7CisKKwlwbWFwX3Vw
ZGF0ZV9wZGVfaW52YWxpZGF0ZShhcmctPnBtYXAsIGFyZy0+dmEsIGFyZy0+bmV3cGRlKTsKK30K
Kworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9zdG9yZShwbWFwX3QgcG1hcCwgcGRfZW50
cnlfdCAqcGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKworCXBkZV9zdG9yZShwZGUsIG5ld3Bk
ZSk7Cit9CisKKworLyoKKyAqIENoYW5nZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgc3BlY2lmaWVk
IHZpcnR1YWwgYWRkcmVzcyBpbiBhIHdheSB0aGF0CisgKiBwcmV2ZW50cyBhbnkgcG9zc2liaWxp
dHkgb2YgdGhlIFRMQiBldmVyIGhhdmluZyB0d28gZW50cmllcyB0aGF0IG1hcCB0aGUKKyAqIHNh
bWUgdmlydHVhbCBhZGRyZXNzIHVzaW5nIGRpZmZlcmVudCBwYWdlIHNpemVzLgorICovCitzdGF0
aWMgdm9pZAorcG1hcF91cGRhdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRf
ZW50cnlfdCAqcGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKwlzdHJ1Y3QgcG1hcF91cGRhdGVf
cGRlX2FyZyBhcmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJnLnBk
ZSA9IHBkZTsKKwlhcmcubmV3cGRlID0gbmV3cGRlOworCisJcG1hcF91cGRhdGVfcGRlX3N0b3Jl
KHBtYXAsIHBkZSwgbmV3cGRlKTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1h
cF91cGRhdGVfcGRlX2FjdGlvbiwgJmFyZyk7Cit9CisKKy8qIC0tLSAqLworCisvKgorICoJUm91
dGluZToJcG1hcF9leHRyYWN0CisgKglGdW5jdGlvbjoKKyAqCQlFeHRyYWN0IHRoZSBwaHlzaWNh
bCBwYWdlIGFkZHJlc3MgYXNzb2NpYXRlZAorICoJCXdpdGggdGhlIGdpdmVuIG1hcC92aXJ0dWFs
X2FkZHJlc3MgcGFpci4KKyAqLwordm1fcGFkZHJfdAorcG1hcF9leHRyYWN0KHBtYXBfdCBwbWFw
LCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRl
OworCXZtX29mZnNldF90IHBhOworCisJcGEgPSAwOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUg
PSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgewor
CQlwYSA9IFRMQkxPX1BERV9UT19QQSgqcGRlKSB8ICh2YSAmIFBEUk1BU0spOworCX0gZWxzZSB7
CisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwkJaWYgKHB0ZSkKKwkJCXBhID0g
VExCTE9fUFRFX1RPX1BBKCpwdGUpIHwgKHZhICYgUEFHRV9NQVNLKTsKKwl9CisJUE1BUF9VTkxP
Q0socG1hcCk7CisJcmV0dXJuIChwYSk7Cit9CisKKy8qCisgKglSb3V0aW5lOglwbWFwX2V4dHJh
Y3RfYW5kX2hvbGQKKyAqCUZ1bmN0aW9uOgorICoJCUF0b21pY2FsbHkgZXh0cmFjdCBhbmQgaG9s
ZCB0aGUgcGh5c2ljYWwgcGFnZQorICoJCXdpdGggdGhlIGdpdmVuIHBtYXAgYW5kIHZpcnR1YWwg
YWRkcmVzcyBwYWlyCisgKgkJaWYgdGhhdCBtYXBwaW5nIHBlcm1pdHMgdGhlIGdpdmVuIHByb3Rl
Y3Rpb24uCisgKi8KK3ZtX3BhZ2VfdAorcG1hcF9leHRyYWN0X2FuZF9ob2xkKHBtYXBfdCBwbWFw
LCB2bV9vZmZzZXRfdCB2YSwgdm1fcHJvdF90IHByb3QpCit7CisJcGRfZW50cnlfdCAqcGRlcDsK
KwlwdF9lbnRyeV90IHB0ZSwgKnB0ZXA7CisJdm1fcGFkZHJfdCBwYSwgcHRlX3BhOworCXZtX3Bh
Z2VfdCBtOworCXZtX3BhZGRyX3QgcGRlX3BhOworCisJcGEgPSAwOworCW0gPSBOVUxMOworCVBN
QVBfTE9DSyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYg
KHBkZXAgIT0gTlVMTCAmJiAqcGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJw
YWdlKHBkZXApKSB7CisJCQlpZiAoIXBkZV90ZXN0KHBkZXAsIFBURV9STykgfHwKKwkJCSAgICAo
cHJvdCAmIFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJCQlwZGVfcGEgPSBUTEJMT19QREVfVE9f
UEEoKnBkZXApIHwKKwkJCQkgICAgKHZhICYgUERSTUFTSyk7CisJCQkJaWYgKHZtX3BhZ2VfcGFf
dHJ5cmVsb2NrKHBtYXAsIHBkZV9wYSwgJnBhKSkKKwkJCQkJZ290byByZXRyeTsKKwkJCQltID0g
UEhZU19UT19WTV9QQUdFKHBkZV9wYSk7CisJCQkJdm1fcGFnZV9ob2xkKG0pOworCQkJfQorCQl9
IGVsc2UgeworCQkJcHRlcCA9IHBtYXBfcGRlX3RvX3B0ZShwZGVwLCB2YSk7CisJCQlpZiAocHRl
cCAhPSBOVUxMKSB7CisJCQkJcHRlID0gKnB0ZXA7CisJCQkJaWYgKHB0ZV9pc192YWxpZCgmcHRl
KSAmJgorCQkJCSAgICAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKKwkJCQkgICAgKHByb3Qg
JiBWTV9QUk9UX1dSSVRFKSA9PSAwKSkgeworCQkJCQlwdGVfcGEgPSBUTEJMT19QVEVfVE9fUEEo
cHRlKTsKKwkJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHB0ZV9wYSwKKwkJCQkJ
ICAgICZwYSkpCisJCQkJCQlnb3RvIHJldHJ5OworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHB0
ZV9wYSk7CisJCQkJCXZtX3BhZ2VfaG9sZChtKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJUEFf
VU5MT0NLX0NPTkQocGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAobSk7Cit9CisK
Ky8qLQorICoJUm91dGluZToJcG1hcF9rZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0cmFj
dCB0aGUgcGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl2aXJ0dWFsIGFkZHJl
c3MuCisgKi8KK3ZtX3BhZGRyX3QKK3BtYXBfa2V4dHJhY3Qodm1fb2Zmc2V0X3QgdmEpCit7CisJ
aW50IG1hcHBlZDsKKworCS8qCisJICogRmlyc3QsIHRoZSBkaXJlY3QtbWFwcGVkIHJlZ2lvbnMu
CisJICovCisJaWYgKHZhID49IE1JUFNfWEtQSFlTX1NUQVJUICYmIHZhIDwgTUlQU19YS1BIWVNf
RU5EKQorCQlyZXR1cm4gKE1JUFNfWEtQSFlTX1RPX1BIWVModmEpKTsKKworCWlmICh2YSA+PSBN
SVBTX0tTRUcwX1NUQVJUICYmIHZhIDwgTUlQU19LU0VHMF9FTkQpCisJCXJldHVybiAoTUlQU19L
U0VHMF9UT19QSFlTKHZhKSk7CisKKwlpZiAodmEgPj0gTUlQU19LU0VHMV9TVEFSVCAmJiB2YSA8
IE1JUFNfS1NFRzFfRU5EKQorCQlyZXR1cm4gKE1JUFNfS1NFRzFfVE9fUEhZUyh2YSkpOworCisJ
LyoKKwkgKiBVc2VyIHZpcnR1YWwgYWRkcmVzc2VzLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVT
RVJfQUREUkVTUykgeworCQlwZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOwor
CisJCWlmIChjdXJwcm9jICYmIGN1cnByb2MtPnBfdm1zcGFjZSkgeworCQkJcGRlcCA9IHBtYXBf
cGRlKCZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09IE5V
TEwgfHwgKnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18xbV9z
dXBlcnBhZ2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJCXJl
dHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0spKTsK
KwkJCX0KKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0ZXAp
IHsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEgJiBQ
QUdFX01BU0spKTsKKwkJCX0KKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNo
b3VsZCBiZSBrZXJuZWwgdmlydHVhbCBoZXJlLCBvdGhlcndpc2UgZmFpbAorCSAqLworCW1hcHBl
ZCA9ICh2YSA+PSBNSVBTX0tTRUcyX1NUQVJUIHx8IHZhIDwgTUlQU19LU0VHMl9FTkQpOworCW1h
cHBlZCA9IG1hcHBlZCB8fCAodmEgPj0gTUlQU19YS1NFR19TVEFSVCB8fCB2YSA8IE1JUFNfWEtT
RUdfRU5EKTsKKwkvKgorCSAqIEtlcm5lbCB2aXJ0dWFsLgorCSAqLworCisJaWYgKG1hcHBlZCkg
eworCQlwZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCS8qIElzIHRo
ZSBrZXJuZWwgcG1hcCBpbml0aWFsaXplZD8gKi8KKwkJaWYgKCFDUFVfRU1QVFkoJmtlcm5lbF9w
bWFwLT5wbV9hY3RpdmUpKSB7CisJCQkvKiBJdCdzIGluc2lkZSB0aGUgdmlydHVhbCBhZGRyZXNz
IHJhbmdlICovCisJCQlwZGVwID0gcG1hcF9wZGUoa2VybmVsX3BtYXAsIHZhKTsKKwkJCWlmIChw
ZGVwID09IE5VTEwgfHwgKnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBk
ZV9pc18xbV9zdXBlcnBhZ2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVw
OworCQkJCXJldHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBE
Uk1BU0spKTsKKwkJCX0KKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJ
aWYgKHB0ZXApIHsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAg
ICAodmEgJiBQQUdFX01BU0spKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gKDApOworCX0KKworCXBh
bmljKCIlcyBmb3IgdW5rbm93biBhZGRyZXNzIHNwYWNlICVwLiIsIF9fZnVuY19fLCAodm9pZCAq
KXZhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKgorICogTG93IGxldmVsIG1hcHBpbmcgcm91dGluZXMuLi4uLgorICoqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotCisgKiBhZGQg
YSB3aXJlZCBwYWdlIHRvIHRoZSBrdmEKKyAqLwordm9pZAorcG1hcF9rZW50ZXJfYXR0cih2bV9v
ZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwgaW50IGF0dHIpCit7CisJcHRfZW50cnlfdCAqcHRl
OworCXB0X2VudHJ5X3Qgb3B0ZSwgbnB0ZTsKKworI2lmZGVmIFBNQVBfREVCVUcKKwlwcmludGYo
InBtYXBfa2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZvaWQgKilw
YSk7CisjZW5kaWYKKworCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJb3B0ZSA9
ICpwdGU7CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0QgfCBQVEVf
UkVGIHwgUFRFX1ZBTElEIHwgUFRFX0c7CisJcHRlX3N0b3JlKHB0ZSwgbnB0ZSk7CisJaWYgKHB0
ZV9pc192YWxpZCgmb3B0ZSkgJiYgb3B0ZSAhPSBucHRlKQorCQlwbWFwX3VwZGF0ZV9wYWdlKGtl
cm5lbF9wbWFwLCB2YSwgbnB0ZSk7Cit9CisKK3ZvaWQKK3BtYXBfa2VudGVyKHZtX29mZnNldF90
IHZhLCB2bV9wYWRkcl90IHBhKQoreworCisJS0FTU0VSVChpc19jYWNoZWFibGVfbWVtKHBhKSwK
KwkJKCJwbWFwX2tlbnRlcjogbWVtb3J5IGF0IDB4JWx4IGlzIG5vdCBjYWNoZWFibGUiLCAodV9s
b25nKXBhKSk7CisKKwlwbWFwX2tlbnRlcl9hdHRyKHZhLCBwYSwgUFRFX0NfQ0FDSEUpOworfQor
CisvKi0KKyAqIHJlbW92ZSBhIHBhZ2UgZnJvbSB0aGUga2VybmVsIHBhZ2V0YWJsZXMKKyAqLwor
IC8qIFBNQVBfSU5MSU5FICovIHZvaWQKK3BtYXBfa3JlbW92ZSh2bV9vZmZzZXRfdCB2YSkKK3sK
KwlwdF9lbnRyeV90ICpwdGU7CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxsIGNhY2hlcyBmcm9t
IHRoZSBwYWdlIGJlaW5nIGRlc3Ryb3llZAorCSAqLworCW1pcHNfZGNhY2hlX3diaW52X3Jhbmdl
X2luZGV4KHZhLCBQQUdFX1NJWkUpOworCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZh
KTsKKwlwdGVfc3RvcmUocHRlLCBQVEVfRyk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2Uoa2VybmVs
X3BtYXAsIHZhKTsKK30KKworLyoKKyAqCVVzZWQgdG8gbWFwIGEgcmFuZ2Ugb2YgcGh5c2ljYWwg
YWRkcmVzc2VzIGludG8ga2VybmVsCisgKgl2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisgKgorICoJ
VGhlIHZhbHVlIHBhc3NlZCBpbiAnKnZpcnQnIGlzIGEgc3VnZ2VzdGVkIHZpcnR1YWwgYWRkcmVz
cyBmb3IKKyAqCXRoZSBtYXBwaW5nLiBBcmNoaXRlY3R1cmVzIHdoaWNoIGNhbiBzdXBwb3J0IGEg
ZGlyZWN0LW1hcHBlZAorICoJcGh5c2ljYWwgdG8gdmlydHVhbCByZWdpb24gY2FuIHJldHVybiB0
aGUgYXBwcm9wcmlhdGUgYWRkcmVzcworICoJd2l0aGluIHRoYXQgcmVnaW9uLCBsZWF2aW5nICcq
dmlydCcgdW5jaGFuZ2VkLiBPdGhlcgorICoJYXJjaGl0ZWN0dXJlcyBzaG91bGQgbWFwIHRoZSBw
YWdlcyBzdGFydGluZyBhdCAnKnZpcnQnIGFuZAorICoJdXBkYXRlICcqdmlydCcgd2l0aCB0aGUg
Zmlyc3QgdXNhYmxlIGFkZHJlc3MgYWZ0ZXIgdGhlIG1hcHBlZAorICoJcmVnaW9uLgorICoKKyAq
CVVzZSBYS1BIWVMgZm9yIDY0IGJpdC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfbWFwKHZtX29m
ZnNldF90ICp2aXJ0LCB2bV9wYWRkcl90IHN0YXJ0LCB2bV9wYWRkcl90IGVuZCwgaW50IHByb3Qp
Cit7CisKKwlyZXR1cm4gKE1JUFNfUEhZU19UT19ESVJFQ1Qoc3RhcnQpKTsKK30KKworLyotCisg
KiBBZGQgYSBsaXN0IG9mIHdpcmVkIHBhZ2VzIHRvIHRoZSBrdmEKKyAqIHRoaXMgcm91dGluZSBp
cyBvbmx5IHVzZWQgZm9yIHRlbXBvcmFyeQorICoga2VybmVsIG1hcHBpbmdzIHRoYXQgZG8gbm90
IG5lZWQgdG8gaGF2ZQorICogcGFnZSBtb2RpZmljYXRpb24gb3IgcmVmZXJlbmNlcyByZWNvcmRl
ZC4KKyAqIE5vdGUgdGhhdCBvbGQgbWFwcGluZ3MgYXJlIHNpbXBseSB3cml0dGVuCisgKiBvdmVy
LiAgVGhlIHBhZ2UgKm11c3QqIGJlIHdpcmVkLgorICovCit2b2lkCitwbWFwX3FlbnRlcih2bV9v
ZmZzZXRfdCB2YSwgdm1fcGFnZV90ICptLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdm1fb2Zm
c2V0X3Qgb3JpZ3ZhID0gdmE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlw
bWFwX2ZsdXNoX3B2Y2FjaGUobVtpXSk7CisJCXBtYXBfa2VudGVyKHZhLCBWTV9QQUdFX1RPX1BI
WVMobVtpXSkpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfQorCisJbWlwc19kY2FjaGVfd2JpbnZf
cmFuZ2VfaW5kZXgob3JpZ3ZhLCBQQUdFX1NJWkUqY291bnQpOworfQorCisvKi0KKyAqIFRoaXMg
cm91dGluZSBqZXJrcyBwYWdlIG1hcHBpbmdzIGZyb20gdGhlCisgKiBrZXJuZWwgLS0gaXQgaXMg
bWVhbnQgb25seSBmb3IgdGVtcG9yYXJ5IG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3FyZW1v
dmUodm1fb2Zmc2V0X3QgdmEsIGludCBjb3VudCkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisJdm1f
b2Zmc2V0X3Qgb3JpZ3ZhOworCisJaWYgKGNvdW50IDwgMSkKKwkJcmV0dXJuOworCW1pcHNfZGNh
Y2hlX3diaW52X3JhbmdlX2luZGV4KHZhLCBQQUdFX1NJWkUgKiBjb3VudCk7CisJb3JpZ3ZhID0g
dmE7CisJZG8geworCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOworCQlwdGVfc3Rv
cmUocHRlLCBQVEVfRyk7CisJCXZhICs9IFBBR0VfU0laRTsKKwl9IHdoaWxlICgtLWNvdW50ID4g
MCk7CisJcG1hcF9pbnZhbGlkYXRlX3JhbmdlKGtlcm5lbF9wbWFwLCBvcmlndmEsIHZhKTsKK30K
KworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgor
ICogUGFnZSB0YWJsZSBwYWdlIG1hbmFnZW1lbnQgcm91dGluZXMuLi4uLgorICoqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGlu
ZSB2b2lkCitwbWFwX2ZyZWVfemVyb19wYWdlcyhzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwl2
bV9wYWdlX3QgbTsKKworCXdoaWxlICgobSA9IFNMSVNUX0ZJUlNUKGZyZWUpKSAhPSBOVUxMKSB7
CisJCVNMSVNUX1JFTU9WRV9IRUFEKGZyZWUsIHBsaW5rcy5zLnNzKTsKKwkJLyogUHJlc2VydmUg
dGhlIHBhZ2UncyBQR19aRVJPIHNldHRpbmcuICovCisJCXZtX3BhZ2VfZnJlZV90b3EobSk7CisJ
fQorfQorCisvKi0KKyAqIFNjaGVkdWxlIHRoZSBzcGVjaWZpZWQgdW51c2VkIHBhZ2UgdGFibGUg
cGFnZSB0byBiZSBmcmVlZC4gIFNwZWNpZmljYWxseQorICogYWRkIHRoZSBwYWdlIHRvIHRoZSBz
cGVjaWZpZWQgbGlzdCBvZiBwYWdlcyB0aGF0IHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlCisgKiBw
aHlzaWNhbCBtZW1vcnkgbWFuYWdlciBhZnRlciB0aGUgVExCIGhhcyBiZWVuIHVwZGF0ZWQuCisg
Ki8KK3N0YXRpYyBfX2lubGluZSB2b2lkCitwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdCh2bV9w
YWdlX3QgbSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsCisgICAgYm9vbGVhbl90IHNldF9QR19aRVJP
KQoreworCisJaWYgKHNldF9QR19aRVJPKQorCQltLT5mbGFncyB8PSBQR19aRVJPOworCWVsc2UK
KwkJbS0+ZmxhZ3MgJj0gflBHX1pFUk87CisJU0xJU1RfSU5TRVJUX0hFQUQoZnJlZSwgbSwgcGxp
bmtzLnMuc3MpOworfQorCisvKgorICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUg
cGFnZSBpbnRvIHRoZSBzcGVjaWZpZWQgcG1hcCdzIGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFn
ZSB0YWJsZSBwYWdlcy4gIEVhY2ggb2YgYSBwbWFwJ3MgcGFnZSB0YWJsZSBwYWdlcyBpcyByZXNw
b25zaWJsZQorICogZm9yIG1hcHBpbmcgYSBkaXN0aW5jdCByYW5nZSBvZiB2aXJ0dWFsIGFkZHJl
c3Nlcy4gIFRoZSBwbWFwJ3MgY29sbGVjdGlvbiBpcworICogb3JkZXJlZCBieSB0aGlzIHZpcnR1
YWwgYWRkcmVzcyByYW5nZS4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcG1hcF9pbnNlcnRf
cHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fcGFnZV90IG1wdGUpCit7CisKKwlQTUFQX0xPQ0tfQVNT
RVJUKHBtYXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2luc2VydCgmcG1hcC0+cG1f
cm9vdCwgbXB0ZSkpOworfQorCisvKgorICogTG9va3MgZm9yIGEgcGFnZSB0YWJsZSBwYWdlIG1h
cHBpbmcgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlCisgKiBzcGVjaWZpZWQg
cG1hcCdzIGNvbGxlY3Rpb24gb2YgaWRsZSBwYWdlIHRhYmxlIHBhZ2VzLiAgUmV0dXJucyBOVUxM
IGlmIHRoZXJlCisgKiBpcyBubyBwYWdlIHRhYmxlIHBhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUg
c3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcy4KKyAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZ2Vf
dAorcG1hcF9sb29rdXBfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisK
KwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2xv
b2t1cCgmcG1hcC0+cG1fcm9vdCwgcG1hcF9wZGVfcGluZGV4KHZhKSkpOworfQorCisvKgorICog
UmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBmcm9tIHRoZSBzcGVjaWZpZWQg
cG1hcCdzIGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJsZSBwYWdlcy4gIFRoZSBzcGVj
aWZpZWQgcGFnZSB0YWJsZSBwYWdlIG11c3QgYmUgYSBtZW1iZXIgb2YKKyAqIHRoZSBwbWFwJ3Mg
Y29sbGVjdGlvbi4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVtb3ZlX3B0X3Bh
Z2UocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKQoreworCisJUE1BUF9MT0NLX0FTU0VSVChw
bWFwLCBNQV9PV05FRCk7CisJdm1fcmFkaXhfcmVtb3ZlKCZwbWFwLT5wbV9yb290LCBtcHRlLT5w
aW5kZXgpOworfQorCisvKgorICogRGVjcmVtZW50cyBhIHBhZ2UgdGFibGUgcGFnZSdzIHdpcmUg
Y291bnQsIHdoaWNoIGlzIHVzZWQgdG8gcmVjb3JkIHRoZQorICogbnVtYmVyIG9mIHZhbGlkIHBh
Z2UgdGFibGUgZW50cmllcyB3aXRoaW4gdGhlIHBhZ2UuICBJZiB0aGUgd2lyZSBjb3VudAorICog
ZHJvcHMgdG8gemVybywgdGhlbiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIHVubWFwcGVkLiAgUmV0
dXJucyBUUlVFIGlmIHRoZQorICogcGFnZSB0YWJsZSBwYWdlIHdhcyB1bm1hcHBlZCBhbmQgRkFM
U0Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgUE1BUF9JTkxJTkUgYm9vbGVhbl90CitwbWFwX3Vu
d2lyZV9wdHAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwgc3RydWN0
IHNwZ2xpc3QgKmZyZWUpCit7CisKKwktLW0tPndpcmVfY291bnQ7CisJaWYgKG0tPndpcmVfY291
bnQgPT0gMCkgeworCQlfcG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtLCBmcmVlKTsKKwkJcmV0
dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lk
CitfcG1hcF91bndpcmVfcHRwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90
IG0sIHN0cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcDsKKwl2
bV9wYWdlX3QgcGRwZzsKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCS8q
CisJICogdW5tYXAgdGhlIHBhZ2UgdGFibGUgcGFnZQorCSAqLworCWlmIChtLT5waW5kZXggPCBO
VVBERSkgeworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJCSpwZGUgPSAwOworCQlwbWFw
X3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKworCQkvKgorCQkgKiBSZWN1cnNpdmVseSBk
ZWNyZW1lbnQgbmV4dCBsZXZlbCBwYWdldGFibGUgcmVmY291bnQKKwkJICovCisJCXBkcCA9IChw
ZF9lbnRyeV90ICopKnBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJcGRwZyA9IFBIWVNfVE9fVk1f
UEFHRShNSVBTX0RJUkVDVF9UT19QSFlTKHBkcCkpOworCQlwbWFwX3Vud2lyZV9wdHAocG1hcCwg
dmEsIHBkcGcsIGZyZWUpOworCX0gZWxzZSB7CisJCXBkZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZh
KTsKKwkJKnBkZSA9IDA7CisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCX0K
KworCS8qCisJICogSWYgdGhlIHBhZ2UgaXMgZmluYWxseSB1bndpcmVkLCBzaW1wbHkgZnJlZSBp
dC4KKwkgKiBUaGlzIGlzIGEgcmVsZWFzZSBzdG9yZSBzbyB0aGF0IHRoZSBvcmRpbmFyeSBzdG9y
ZSB1bm1hcHBpbmcKKwkgKiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIGdsb2JhbGx5IHBlcmZvcm1l
ZCBiZWZvcmUgVExCIHNob290LQorCSAqIGRvd24gaXMgYmVndW4uCisJICovCisJYXRvbWljX3N1
YnRyYWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisKKwkvKgorCSAqIFB1dCBwYWdl
IG9uIGEgbGlzdCBzbyB0aGF0IGl0IGlzIHJlbGVhc2VkIGFmdGVyCisJICogKkFMTCogVExCIHNo
b290ZG93biBpcyBkb25lLgorCSAqLworCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG0sIGZy
ZWUsIFRSVUUpOworfQorCisvKgorICogQWZ0ZXIgcmVtb3ZpbmcgYSBwYWdlIHRhYmxlIGVudHJ5
LCB0aGlzIHJvdXRpbmUgaXMgdXNlZCB0bworICogY29uZGl0aW9uYWxseSBmcmVlIHRoZSBwYWdl
LCBhbmQgbWFuYWdlIHRoZSBob2xkL3dpcmUgY291bnRzLgorICovCitzdGF0aWMgaW50CitwbWFw
X3VudXNlX3B0KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlfdCBwdGVwZGUs
CisgICAgc3RydWN0IHNwZ2xpc3QgKmZyZWUpCit7CisJdm1fcGFnZV90IG1wdGU7CisKKwlpZiAo
dmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQlyZXR1cm4gKDApOworCUtBU1NFUlQocHRlcGRl
ICE9IDAsICgicG1hcF91bnVzZV9wdDogcHRlcGRlICE9IDAiKSk7CisJbXB0ZSA9IFBIWVNfVE9f
Vk1fUEFHRShNSVBTX0RJUkVDVF9UT19QSFlTKHB0ZXBkZSkpOworCXJldHVybiAocG1hcF91bndp
cmVfcHRwKHBtYXAsIHZhLCBtcHRlLCBmcmVlKSk7Cit9CisKK3ZvaWQKK3BtYXBfcGluaXQwKHBt
YXBfdCBwbWFwKQoreworCWludCBpOworCisJUE1BUF9MT0NLX0lOSVQocG1hcCk7CisJcG1hcC0+
cG1fc2VndGFiID0ga2VybmVsX3NlZ21hcDsKKwlDUFVfWkVSTygmcG1hcC0+cG1fYWN0aXZlKTsK
Kwlmb3IgKGkgPSAwOyBpIDwgTUFYQ1BVOyBpKyspIHsKKwkJcG1hcC0+cG1fYXNpZFtpXS5hc2lk
ID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCQlwbWFwLT5wbV9hc2lkW2ldLmdlbiA9IDA7CisJfQor
CVBDUFVfU0VUKGN1cnBtYXAsIHBtYXApOworCVRBSUxRX0lOSVQoJnBtYXAtPnBtX3B2Y2h1bmsp
OworCWJ6ZXJvKCZwbWFwLT5wbV9zdGF0cywgc2l6ZW9mIHBtYXAtPnBtX3N0YXRzKTsKK30KKwor
c3RhdGljIHZvaWQKK3BtYXBfZ3Jvd19kaXJlY3RfcGFnZV9jYWNoZShpbnQgcmVxKQoreworCisJ
aWYgKCF2bV9wYWdlX3JlY2xhaW1fY29udGlnKHJlcSwgMSwgMCwgTUlQU19YS1BIWVNfTEFSR0VT
VF9QSFlTLAorCSAgICBQQUdFX1NJWkUsIDApKQorCQlWTV9XQUlUOworfQorCitzdGF0aWMgdm1f
cGFnZV90CitwbWFwX2FsbG9jX2RpcmVjdF9wYWdlKHVuc2lnbmVkIGludCBpbmRleCwgaW50IHJl
cSkKK3sKKwl2bV9wYWdlX3QgbTsKKworCW0gPSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZS
RUVMSVNUX0RJUkVDVCwgcmVxIHwgVk1fQUxMT0NfV0lSRUQgfAorCSAgICBWTV9BTExPQ19aRVJP
KTsKKwlpZiAobSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJaWYgKChtLT5mbGFncyAm
IFBHX1pFUk8pID09IDApCisJCXBtYXBfemVyb19wYWdlKG0pOworCisJbS0+cGluZGV4ID0gaW5k
ZXg7CisJcmV0dXJuIChtKTsKK30KKworLyotCisgKiBJbml0aWFsaXplIGEgcHJlYWxsb2NhdGVk
IGFuZCB6ZXJvZWQgcG1hcCBzdHJ1Y3R1cmUsCisgKiBzdWNoIGFzIG9uZSBpbiBhIHZtc3BhY2Ug
c3RydWN0dXJlLgorICovCitpbnQKK3BtYXBfcGluaXQocG1hcF90IHBtYXApCit7CisJdm1fb2Zm
c2V0X3QgcHRkdmE7CisJdm1fcGFnZV90IHB0ZHBnOworCWludCBpLCByZXFfY2xhc3M7CisKKwkv
KgorCSAqIGFsbG9jYXRlIHRoZSBwYWdlIGRpcmVjdG9yeSBwYWdlCisJICovCisJcmVxX2NsYXNz
ID0gVk1fQUxMT0NfTk9STUFMOworCXdoaWxlICgocHRkcGcgPSBwbWFwX2FsbG9jX2RpcmVjdF9w
YWdlKE5VU0VSUEdUQkxTLCBWTV9BTExPQ19OT09CSiB8CisJICAgIHJlcV9jbGFzcykpID09IE5V
TEwpIHsKKwkgICAgICAgcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKHJlcV9jbGFzcyk7CisJ
fQorCisJcHRkdmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyhwdGRwZykp
OworCXBtYXAtPnBtX3NlZ3RhYiA9IChwZF9lbnRyeV90ICopcHRkdmE7CisJQ1BVX1pFUk8oJnBt
YXAtPnBtX2FjdGl2ZSk7CisJZm9yIChpID0gMDsgaSA8IE1BWENQVTsgaSsrKSB7CisJCXBtYXAt
PnBtX2FzaWRbaV0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwkJcG1hcC0+cG1fYXNpZFtp
XS5nZW4gPSAwOworCX0KKwlUQUlMUV9JTklUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwliemVybygm
cG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5wbV9zdGF0cyk7CisKKwlyZXR1cm4gKDEpOwor
fQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpZiB0aGUgZGVzaXJlZCBwYWdlIHRh
YmxlIHBhZ2UgZG9lcyBub3QgZXhpc3QuCisgKi8KK3N0YXRpYyB2bV9wYWdlX3QKK19wbWFwX2Fs
bG9jcHRlKHBtYXBfdCBwbWFwLCB1bnNpZ25lZCBwdGVwaW5kZXgsIHN0cnVjdCByd2xvY2sgKips
b2NrcCkKK3sKKwl2bV9vZmZzZXRfdCBwYWdldmE7CisJdm1fcGFnZV90IG07CisKKwlQTUFQX0xP
Q0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKworCS8qCisJICogRmluZCBvciBmYWJyaWNhdGUg
YSBuZXcgcGFnZXRhYmxlIHBhZ2UKKwkgKi8KKwlpZiAoKG0gPSB2bV9wYWdlX2FsbG9jKE5VTEws
IHB0ZXBpbmRleCwgVk1fQUxMT0NfTk9STUFMIHwKKwkgICAgVk1fQUxMT0NfTk9PQkogfCBWTV9B
TExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pKSA9PSBOVUxMKSB7CisJCWlmIChsb2NrcCAhPSBO
VUxMKSB7CisJCQlSRUxFQVNFX1BWX0xJU1RfTE9DSyhsb2NrcCk7CisJCQlQTUFQX1VOTE9DSyhw
bWFwKTsKKwkJCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlWTV9XQUlUOworCQkJ
cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCX0KKwor
CQkvKgorCQkgKiBJbmRpY2F0ZSB0aGUgbmVlZCB0byByZXRyeS4JV2hpbGUgd2FpdGluZywgdGhl
IHBhZ2UKKwkJICogdGFibGUgcGFnZSBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KKwkJICovCisJ
CXJldHVybiAoTlVMTCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAwKQorCQlw
bWFwX3plcm9fcGFnZShtKTsKKworCS8qCisJICogTWFwIHRoZSBwYWdldGFibGUgcGFnZSBpbnRv
IHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UsIGlmIGl0CisJICogaXNuJ3QgYWxyZWFkeSB0aGVy
ZS4KKwkgKi8KKwlwYWdldmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyht
KSk7CisKKwlpZiAocHRlcGluZGV4ID49IE5VUERFKSB7CisJCXBtYXAtPnBtX3NlZ3RhYltwdGVw
aW5kZXggLSBOVVBERV0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfSBlbHNlIHsKKwkJcGRfZW50
cnlfdCAqcGRlcCwgKnBkZTsKKwkJaW50IHNlZ2luZGV4ID0gcHRlcGluZGV4ID4+IChTRUdTSElG
VCAtIFBEUlNISUZUKTsKKwkJaW50IHBkZWluZGV4ID0gcHRlcGluZGV4ICYgKE5QREVQRyAtIDEp
OworCQl2bV9wYWdlX3QgcGc7CisKKwkJcGRlcCA9ICZwbWFwLT5wbV9zZWd0YWJbc2VnaW5kZXhd
OworCQlpZiAoKnBkZXAgPT0gTlVMTCkgeworCQkJLyogSGF2ZSB0byBhbGxvY2F0ZSBhIG5ldyBw
ZCwgcmVjdXJzZSAqLworCQkJaWYgKF9wbWFwX2FsbG9jcHRlKHBtYXAsIE5VUERFICsgc2VnaW5k
ZXgsCisJCQkgICAgbG9ja3ApID09IE5VTEwpIHsKKwkJCQkvKiBhbGxvYyBmYWlsZWQsIHJlbGVh
c2UgY3VycmVudCAqLworCQkJCS0tbS0+d2lyZV9jb3VudDsKKwkJCQlhdG9taWNfc3VidHJhY3Rf
aW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsKKwkJCQl2bV9wYWdlX2ZyZWVfemVybyhtKTsK
KwkJCQlyZXR1cm4gKE5VTEwpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQWRkIHJlZmVyZW5j
ZSB0byB0aGUgcGQgcGFnZSAqLworCQkJcGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1Rf
VE9fUEhZUygqcGRlcCkpOworCQkJcGctPndpcmVfY291bnQrKzsKKwkJfQorCQkvKiBOZXh0IGxl
dmVsIGVudHJ5ICovCisJCXBkZSA9IChwZF9lbnRyeV90ICopKnBkZXA7CisJCXBkZVtwZGVpbmRl
eF0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfQorCisJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMo
cG1hcCwgMSk7CisKKwlyZXR1cm4gKG0pOworfQorCitzdGF0aWMgdm1fcGFnZV90CitwbWFwX2Fs
bG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgc3RydWN0IHJ3bG9jayAqKmxvY2tw
KQoreworCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwlwZF9lbnRyeV90ICpwZDsKKwl2bV9wYWdlX3Qg
bTsKKworCS8qCisJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4CisJICovCisJcHRl
cGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKK3JldHJ5OgorCS8qCisJICogR2V0IHRoZSBw
YWdlIGRpcmVjdG9yeSBlbnRyeQorCSAqLworCXBkID0gcG1hcF9wZGUocG1hcCwgdmEpOworCisJ
LyoKKwkgKiBUaGlzIHN1cHBvcnRzIHN3aXRjaGluZyBmcm9tIGEgMk1CIHBhZ2UgdG8gYQorCSAq
IG5vcm1hbCA0SyBwYWdlLgorCSAqLworCWlmIChwZCAhPSBOVUxMICYmIChwZGVfaXNfMW1fc3Vw
ZXJwYWdlKHBkKSAmJgorCSAgICBwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZCkpKSB7CisJ
CSBpZiAoIXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGQsIHZhLCBsb2NrcCkpIHsKKwkJ
CSAvKgorCQkJICAqIEludmFsaWRhdGlvbiBvZiB0aGUgMk1CIHBhZ2UgbWFwcGluZyBtYXkgaGF2
ZSBjYXVzZWQKKwkJCSAgKiB0aGUgZGVhbGxvY2F0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIFBEIHBh
Z2UuCisJCQkgICovCisJCQkgcGQgPSBOVUxMOworCQkgfQorCX0KKworCS8qCisJICogSWYgdGhl
IHBhZ2UgdGFibGUgcGFnZSBpcyBtYXBwZWQsIHdlIGp1c3QgaW5jcmVtZW50IHRoZSBob2xkCisJ
ICogY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkgKi8KKwlpZiAocGQgIT0gTlVMTCAmJiAqcGQg
IT0gTlVMTCkgeworCQltID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKHB0
X2VudHJ5X3QpKnBkKSk7CisJCW0tPndpcmVfY291bnQrKzsKKwl9IGVsc2UgeworCQkvKgorCQkg
KiBIZXJlIGlmIHRoZSBwdGUgcGFnZSBpc24ndCBtYXBwZWQsIG9yIGlmIGl0IGhhcyBiZWVuCisJ
CSAqIGRlYWxsb2NhdGVkLgorCQkgKi8KKwkJbSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAsIHB0ZXBp
bmRleCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMICYmIGxvY2twICE9IE5VTEwpCisJCQlnb3Rv
IHJldHJ5OworCX0KKwlyZXR1cm4gKG0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbWFwIGFsbG9jYXRpb24vZGVhbGxvY2F0
aW9uIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKi8KKworLyotCisgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgaGVsZCBieSB0aGUg
Z2l2ZW4gcGh5c2ljYWwgbWFwLgorICogQ2FsbGVkIHdoZW4gYSBwbWFwIGluaXRpYWxpemVkIGJ5
IHBtYXBfcGluaXQgaXMgYmVpbmcgcmVsZWFzZWQuCisgKiBTaG91bGQgb25seSBiZSBjYWxsZWQg
aWYgdGhlIG1hcCBjb250YWlucyBubyB2YWxpZCBtYXBwaW5ncy4KKyAqLwordm9pZAorcG1hcF9y
ZWxlYXNlKHBtYXBfdCBwbWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3BhZ2VfdCBw
dGRwZzsKKworCUtBU1NFUlQocG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgPT0gMCwKKwkg
ICAgKCJwbWFwX3JlbGVhc2U6IHBtYXAgcmVzaWRlbnQgY291bnQgJWxkICE9IDAiLAorCSAgICBw
bWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCkpOworCisJLyoKKwkgKiBJbnZhbGlkYXRlIGFu
eSBsZWZ0IFRMQiBlbnRyaWVzLCB0byBhbGxvdyB0aGUgcmV1c2UKKwkgKiBvZiB0aGUgYXNpZC4K
KwkgKi8KKwlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCisJcHRkdmEgPSAodm1fb2Zmc2V0
X3QpcG1hcC0+cG1fc2VndGFiOworCXB0ZHBnID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNU
X1RPX1BIWVMocHRkdmEpKTsKKworCXB0ZHBnLT53aXJlX2NvdW50LS07CisJYXRvbWljX3N1YnRy
YWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisJdm1fcGFnZV9mcmVlX3plcm8ocHRk
cGcpOworfQorCisvKi0KKyAqIGdyb3cgdGhlIG51bWJlciBvZiBrZXJuZWwgcGFnZSB0YWJsZSBl
bnRyaWVzLCBpZiBuZWVkZWQKKyAqLwordm9pZAorcG1hcF9ncm93a2VybmVsKHZtX29mZnNldF90
IGFkZHIpCit7CisJdm1fcGFnZV90IG5rcGc7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRwZTsKKwlw
dF9lbnRyeV90ICpwdGU7CisJaW50IGk7CisKKwltdHhfYXNzZXJ0KCZrZXJuZWxfbWFwLT5zeXN0
ZW1fbXR4LCBNQV9PV05FRCk7CisJYWRkciA9IHJvdW5kdXAyKGFkZHIsIE5CU0VHKTsKKwlpZiAo
YWRkciAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkKKwkJYWRkciA9IGtlcm5lbF9tYXAt
Pm1heF9vZmZzZXQ7CisJd2hpbGUgKGtlcm5lbF92bV9lbmQgPCBhZGRyKSB7CisJCXBkcGUgPSBw
bWFwX3NlZ21hcChrZXJuZWxfcG1hcCwga2VybmVsX3ZtX2VuZCk7CisJCWlmICgqcGRwZSA9PSAw
KSB7CisJCQkvKiBuZXcgaW50ZXJtZWRpYXRlIHBhZ2UgdGFibGUgZW50cnkgKi8KKwkJCW5rcGcg
PSB2bV9wYWdlX2FsbG9jKE5VTEwsIG5rcHQsIFZNX0FMTE9DX0lOVEVSUlVQVCB8CisJCQkgICAg
Vk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOworCQkJaWYg
KG5rcGcgPT0gTlVMTCkKKwkJCQlwYW5pYygiJXM6IG5vIG1lbW9yeSB0byBncm93IGtlcm5lbCIs
IF9fZnVuY19fKTsKKwkJCSpwZHBlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVCgK
KwkJCSAgICBWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCQkJY29udGludWU7IC8qIHRyeSBhZ2Fp
biAqLworCQl9CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwga2VybmVsX3ZtX2VuZCk7
CisJCWlmICgqcGRlICE9IDApIHsKKwkJCWtlcm5lbF92bV9lbmQgPSAoa2VybmVsX3ZtX2VuZCAr
IE5CUERSKSAmIH5QRFJNQVNLOworCQkJaWYgKGtlcm5lbF92bV9lbmQgLSAxID49IGtlcm5lbF9t
YXAtPm1heF9vZmZzZXQpIHsKKwkJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4X29m
ZnNldDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICog
VGhpcyBpbmRleCBpcyBib2d1cywgYnV0IG91dCBvZiB0aGUgd2F5CisJCSAqLworCQlua3BnID0g
dm1fcGFnZV9hbGxvYyhOVUxMLCBua3B0LCBWTV9BTExPQ19JTlRFUlJVUFQgfAorCQkgICAgVk1f
QUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOworCQlpZiAoIW5r
cGcpCisJCQlwYW5pYygicG1hcF9ncm93a2VybmVsOiBubyBtZW1vcnkgdG8gZ3JvdyBrZXJuZWwi
KTsKKwkJbmtwdCsrOworCQkqcGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVChW
TV9QQUdFX1RPX1BIWVMobmtwZykpOworCisJCS8qCisJCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVz
IG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2JhbCBiaXQgaW4KKwkJICogdGhlIHRyYW5zbGF0aW9u
IGxvb2thc2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LgorCQkgKiBUaHVzIGludmFs
aWQgZW50cnlzIG11c3QgaGF2ZSB0aGUgR2xvYmFsIGJpdCBzZXQgc28gd2hlbgorCQkgKiBFbnRy
eSBMTyBhbmQgRW50cnkgSEkgRyBiaXRzIGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdpbGwKKwkJ
ICogcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUgaW4gdGhlIHRsYi4KKwkJICovCisJCXB0
ZSA9IChwdF9lbnRyeV90ICopKnBkZTsKKwkJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsgaSsrKQor
CQkJcHRlW2ldID0gUFRFX0c7CisKKwkJa2VybmVsX3ZtX2VuZCA9IChrZXJuZWxfdm1fZW5kICsg
TkJQRFIpICYgflBEUk1BU0s7CisJCWlmIChrZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJuZWxfbWFw
LT5tYXhfb2Zmc2V0KSB7CisJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4X29mZnNl
dDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwYWdlIG1hbmFnZW1lbnQgcm91dGluZXMuCisg
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitD
VEFTU0VSVChzaXplb2Yoc3RydWN0IHB2X2NodW5rKSA9PSBQQUdFX1NJWkUpOworQ1RBU1NFUlQo
X05QQ00gPT0gMyk7CitDVEFTU0VSVChfTlBDUFYgPT0gMTY4KTsKKworc3RhdGljIF9faW5saW5l
IHN0cnVjdCBwdl9jaHVuayAqCitwdl90b19jaHVuayhwdl9lbnRyeV90IHB2KQoreworCisJcmV0
dXJuICgoc3RydWN0IHB2X2NodW5rICopKCh1aW50cHRyX3QpcHYgJiB+KHVpbnRwdHJfdClQQUdF
X01BU0spKTsKK30KKworI2RlZmluZSBQVl9QTUFQKHB2KSAocHZfdG9fY2h1bmsocHYpLT5wY19w
bWFwKQorCisjZGVmaW5lCVBDX0ZSRUUwCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVmaW5lCVBD
X0ZSRUUxCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVmaW5lCVBDX0ZSRUUyCTB4MDAwMDAwZmZm
ZmZmZmZmZnVsCisKK3N0YXRpYyBjb25zdCB1X2xvbmcgcGNfZnJlZW1hc2tbX05QQ01dID0geyBQ
Q19GUkVFMCwgUENfRlJFRTEsIFBDX0ZSRUUyIH07CisKKyNpZmRlZiBQVl9TVEFUUworc3RhdGlj
IGludCBwY19jaHVua19jb3VudCwgcGNfY2h1bmtfYWxsb2NzLCBwY19jaHVua19mcmVlcywgcGNf
Y2h1bmtfdHJ5ZmFpbDsKKworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5r
X2NvdW50LCBDVExGTEFHX1JELCAmcGNfY2h1bmtfY291bnQsIDAsCisgICAgIkN1cnJlbnQgbnVt
YmVyIG9mIHB2IGVudHJ5IGNodW5rcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8s
IHBjX2NodW5rX2FsbG9jcywgQ1RMRkxBR19SRCwgJnBjX2NodW5rX2FsbG9jcywgMCwKKyAgICAi
Q3VycmVudCBudW1iZXIgb2YgcHYgZW50cnkgY2h1bmtzIGFsbG9jYXRlZCIpOworU1lTQ1RMX0lO
VChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX2ZyZWVzLCBDVExGTEFHX1JELCAmcGNfY2h1
bmtfZnJlZXMsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5rcyBmcmVl
cyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX3RyeWZhaWwsIENU
TEZMQUdfUkQsICZwY19jaHVua190cnlmYWlsLCAwLAorICAgICJOdW1iZXIgb2YgdGltZXMgdHJp
ZWQgdG8gZ2V0IGEgY2h1bmsgcGFnZSBidXQgZmFpbGVkLiIpOworCitzdGF0aWMgbG9uZyBwdl9l
bnRyeV9jb3VudCwgcHZfZW50cnlfZnJlZXMsIHB2X2VudHJ5X2FsbG9jczsKK3N0YXRpYyBpbnQg
cHZfZW50cnlfc3BhcmU7CisKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBPSURfQVVUTywgcHZfZW50
cnlfZnJlZXMsIENUTEZMQUdfUkQsICZwdl9lbnRyeV9mcmVlcywgMCwKKyAgICAiQ3VycmVudCBu
dW1iZXIgb2YgcHYgZW50cnkgZnJlZXMiKTsKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBPSURfQVVU
TywgcHZfZW50cnlfYWxsb2NzLCBDVExGTEFHX1JELCAmcHZfZW50cnlfYWxsb2NzLCAwLAorICAg
ICJDdXJyZW50IG51bWJlciBvZiBwdiBlbnRyeSBhbGxvY3MiKTsKK1NZU0NUTF9MT05HKF92bV9w
bWFwLCBPSURfQVVUTywgcHZfZW50cnlfY291bnQsIENUTEZMQUdfUkQsICZwdl9lbnRyeV9jb3Vu
dCwgMCwKKyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cmllcyIpOworU1lTQ1RMX0lOVChf
dm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X3NwYXJlLCBDVExGTEFHX1JELCAmcHZfZW50cnlf
c3BhcmUsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHNwYXJlIHB2IGVudHJpZXMiKTsKKyNl
bmRpZgorCisvKgorICogV2UgYXJlIGluIGEgc2VyaW91cyBsb3cgbWVtb3J5IGNvbmRpdGlvbi4g
IFJlc29ydCB0bworICogZHJhc3RpYyBtZWFzdXJlcyB0byBmcmVlIHNvbWUgcGFnZXMgc28gd2Ug
Y2FuIGFsbG9jYXRlCisgKiBhbm90aGVyIHB2IGVudHJ5IGNodW5rLgorICoKKyAqIFJldHVybnMg
TlVMTCBpZiBQViBlbnRyaWVzIHdlcmUgcmVjbGFpbWVkIGZyb20gdGhlIHNwZWNpZmllZCBwbWFw
LgorICoKKyAqIFdlIGRvIG5vdCwgaG93ZXZlciwgdW5tYXAgMm1wYWdlcyBiZWNhdXNlIHN1YnNl
cXVlbnQgYWNjZXNzIHdpbGwKKyAqIGFsbG9jYXRlIHBlci1wYWdlIHB2IGVudHJpZXMgdW50aWwg
cmVwcm9tb3Rpb24gb2NjdXJzLCB0aGVyZWJ5CisgKiBleGFjZXJiYXRpbmcgdGhlIHNob3J0YWdl
IG9mIGZyZWUgcHYgZW50cmllcy4KKyAqLworc3RhdGljIHZtX3BhZ2VfdAorcmVjbGFpbV9wdl9j
aHVuayhwbWFwX3QgbG9ja2VkX3BtYXAsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1
Y3QgcGNoIG5ld190YWlsOworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJcGRfZW50cnlfdCAqcGRl
OworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5X3QgKnB0ZSwgb2xkcHRlOworCXB2X2VudHJ5X3Qg
cHY7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFnZV90IG0sIG1fcGM7CisJc3RydWN0IHNwZ2xp
c3QgZnJlZTsKKwl1aW50NjRfdCBpbnVzZTsKKwlpbnQgYml0LCBmaWVsZCwgZnJlZWQsIGlkeDsK
KworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19B
U1NFUlQobG9ja2VkX3BtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKGxvY2twICE9IE5VTEwsICgi
cmVjbGFpbV9wdl9jaHVuazogbG9ja3AgaXMgTlVMTCIpKTsKKwlwbWFwID0gTlVMTDsKKwltX3Bj
ID0gTlVMTDsKKwlTTElTVF9JTklUKCZmcmVlKTsKKwlUQUlMUV9JTklUKCZuZXdfdGFpbCk7CisJ
bXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJd2hpbGUgKChwYyA9IFRBSUxRX0ZJUlNUKCZw
dl9jaHVua3MpKSAhPSBOVUxMICYmIFNMSVNUX0VNUFRZKCZmcmVlKSkgeworCQlUQUlMUV9SRU1P
VkUoJnB2X2NodW5rcywgcGMsIHBjX2xydSk7CisJCW10eF91bmxvY2soJnB2X2NodW5rc19tdXRl
eCk7CisJCWlmIChwbWFwICE9IHBjLT5wY19wbWFwKSB7CisJCQlpZiAocG1hcCAhPSBOVUxMKSB7
CisJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwKTsKKwkJCQlpZiAocG1hcCAhPSBsb2NrZWRf
cG1hcCkKKwkJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQl9CisJCQlwbWFwID0gcGMtPnBjX3Bt
YXA7CisJCQkvKiBBdm9pZCBkZWFkbG9jayBhbmQgbG9jayByZWN1cnNpb24uICovCisJCQlpZiAo
cG1hcCA+IGxvY2tlZF9wbWFwKSB7CisJCQkJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9ja3ApOwor
CQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCX0gZWxzZSBpZiAocG1hcCAhPSBsb2NrZWRfcG1hcCAm
JiAhUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJcG1hcCA9IE5VTEw7CisJCQkJVEFJTFFfSU5T
RVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJCQltdHhfbG9jaygmcHZfY2h1bmtz
X211dGV4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIERlc3Ryb3kg
ZXZlcnkgbm9uLXdpcmVkLCA0IEtCIHBhZ2UgbWFwcGluZyBpbiB0aGUgY2h1bmsuCisJCSAqLwor
CQlmcmVlZCA9IDA7CisJCWZvciAoZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBmaWVsZCsrKSB7
CisJCQlmb3IgKGludXNlID0gfnBjLT5wY19tYXBbZmllbGRdICYgcGNfZnJlZW1hc2tbZmllbGRd
OworCQkJICAgIGludXNlICE9IDA7IGludXNlICY9IH4oMVVMIDw8IGJpdCkpIHsKKwkJCQliaXQg
PSBmZnNsKGludXNlKSAtIDE7CisJCQkJaWR4ID0gZmllbGQgKiBzaXplb2YoaW51c2UpICogTkJC
WSArIGJpdDsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtpZHhdOworCQkJCXZhID0gcHYtPnB2
X3ZhOworCQkJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJCQlLQVNTRVJUKHBkZSAhPSBO
VUxMICYmICpwZGUgIT0gMCwKKwkJCQkgICAgKCIlczogcGRlIiwgX19mdW5jX18pKTsKKwkJCQlp
ZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKQorCQkJCQljb250aW51ZTsKKwkJCQlwdGUgPSBw
bWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCQkJb2xkcHRlID0gKnB0ZTsKKwkJCQlpZiAocHRl
X3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoaXNfa2VybmVs
X3BtYXAocG1hcCkpCisJCQkJCSpwdGUgPSBQVEVfRzsKKwkJCQllbHNlCisJCQkJCSpwdGUgPSAw
OworCQkJCWlmIChwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRykpCisJCQkJCXBtYXBfaW52YWxpZGF0
ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQltID0gUEhZU19UT19WTV9QQUdFKFRMQkxPX1BURV9UT19Q
QShvbGRwdGUpKTsKKwkJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJCQl2bV9w
YWdlX2RpcnR5KG0pOworCQkJCWlmIChwdGVfaXNfcmVmKCZvbGRwdGUpKQorCQkJCQl2bV9wYWdl
X2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5w
dl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJaWYgKFRBSUxR
X0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJCSAgICAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJ
T1VTKSA9PSAwKSB7CisJCQkJCXN0cnVjdCBtZF9wYWdlICpwdmggPQorCQkJCQkgICAgcGFfdG9f
cHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZoLT5wdl9s
aXN0KSkgeworCQkJCQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtLAorCQkJCQkJICAgIFBHQV9XUklU
RUFCTEUpOworCQkJCQl9CisJCQkJfQorCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFVTCA8PCBi
aXQ7CisJCQkJcG1hcF91bnVzZV9wdChwbWFwLCB2YSwgKnBkZSwgJmZyZWUpOworCQkJCWZyZWVk
Kys7CisJCQl9CisJCX0KKwkJaWYgKGZyZWVkID09IDApIHsKKwkJCVRBSUxRX0lOU0VSVF9UQUlM
KCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsK
KwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEV2ZXJ5IGZyZWVkIG1hcHBpbmcgaXMgZm9yIGEgNCBL
QiBwYWdlLiAqLworCQlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCBmcmVlZCk7CisJCVBW
X1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJUFZfU1RB
VChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NUQVQoYXRv
bWljX3N1YnRyYWN0X2xvbmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlUQUlMUV9SRU1P
VkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJaWYgKHBjLT5wY19tYXBbMF0g
PT0gUENfRlJFRTAgJiYgcGMtPnBjX21hcFsxXSA9PSBQQ19GUkVFMSAmJgorCQkgICAgcGMtPnBj
X21hcFsyXSA9PSBQQ19GUkVFMikgeworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50KCZw
dl9lbnRyeV9zcGFyZSwgX05QQ1BWKSk7CisJCQlQVl9TVEFUKGF0b21pY19zdWJ0cmFjdF9pbnQo
JnBjX2NodW5rX2NvdW50LCAxKSk7CisJCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVu
a19mcmVlcywgMSkpOworCQkJLyogRW50aXJlIGNodW5rIGlzIGZyZWU7IHJldHVybiBpdC4gKi8K
KwkJCW1fcGMgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygKKwkJCSAgICAo
dm1fb2Zmc2V0X3QpcGMpKTsKKwkJCWR1bXBfZHJvcF9wYWdlKG1fcGMtPnBoeXNfYWRkcik7CisJ
CQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwkJCWJyZWFrOworCQl9CisJCVRBSUxRX0lO
U0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxRX0lOU0VS
VF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCW10eF9sb2NrKCZwdl9jaHVua3NfbXV0
ZXgpOworCQkvKiBPbmUgZnJlZWQgcHYgZW50cnkgaW4gbG9ja2VkX3BtYXAgaXMgc3VmZmljaWVu
dC4gKi8KKwkJaWYgKHBtYXAgPT0gbG9ja2VkX3BtYXApCisJCQlicmVhazsKKwl9CisJVEFJTFFf
Q09OQ0FUKCZwdl9jaHVua3MsICZuZXdfdGFpbCwgcGNfbHJ1KTsKKwltdHhfdW5sb2NrKCZwdl9j
aHVua3NfbXV0ZXgpOworCWlmIChwbWFwICE9IE5VTEwpIHsKKwkJcG1hcF9pbnZhbGlkYXRlX2Fs
bChwbWFwKTsKKwkJaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXApCisJCQlQTUFQX1VOTE9DSyhwbWFw
KTsKKwl9CisJaWYgKG1fcGMgPT0gTlVMTCAmJiAhU0xJU1RfRU1QVFkoJmZyZWUpKSB7CisJCW1f
cGMgPSBTTElTVF9GSVJTVCgmZnJlZSk7CisJCVNMSVNUX1JFTU9WRV9IRUFEKCZmcmVlLCBwbGlu
a3Mucy5zcyk7CisJCS8qIFJlY3ljbGUgYSBmcmVlZCBwYWdlIHRhYmxlIHBhZ2UuICovCisJCW1f
cGMtPndpcmVfY291bnQgPSAxOworCQlhdG9taWNfYWRkX2ludCgmdm1fY250LnZfd2lyZV9jb3Vu
dCwgMSk7CisJfQorCXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKKwlyZXR1cm4gKG1fcGMp
OworfQorCisvKgorICogZnJlZSB0aGUgcHZfZW50cnkgYmFjayB0byB0aGUgZnJlZSBsaXN0Cisg
Ki8KK3N0YXRpYyB2b2lkCitmcmVlX3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBwdl9lbnRyeV90IHB2
KQoreworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJaW50IGJpdCwgZmllbGQsIGlkeDsKKworCXJ3
X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQo
cG1hcCwgTUFfT1dORUQpOworCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRyeV9mcmVl
cywgMSkpOworCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCAxKSk7CisJ
UFZfU1RBVChhdG9taWNfc3VidHJhY3RfbG9uZygmcHZfZW50cnlfY291bnQsIDEpKTsKKwlwYyA9
IHB2X3RvX2NodW5rKHB2KTsKKwlpZHggPSBwdiAtICZwYy0+cGNfcHZlbnRyeVswXTsKKwlmaWVs
ZCA9IGlkeCAvIChzaXplb2YodV9sb25nKSAqIE5CQlkpOworCWJpdCA9IGlkeCAlIChzaXplb2Yo
dV9sb25nKSAqIE5CQlkpOworCXBjLT5wY19tYXBbZmllbGRdIHw9IDF1bCA8PCBiaXQ7CisJaWYg
KHBjLT5wY19tYXBbMF0gIT0gUENfRlJFRTAgfHwgcGMtPnBjX21hcFsxXSAhPSBQQ19GUkVFMSB8
fAorCSAgICBwYy0+cGNfbWFwWzJdICE9IFBDX0ZSRUUyKSB7CisJCS8qIDk4JSBvZiB0aGUgdGlt
ZSwgcGMgaXMgYWxyZWFkeSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKi8KKwkJaWYgKF9fcHJl
ZGljdF9mYWxzZShwYyAhPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuaykpKSB7CisJCQlU
QUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJCVRBSUxRX0lO
U0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCX0KKwkJcmV0dXJu
OworCX0KKwlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwlm
cmVlX3B2X2NodW5rKHBjKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfcHZfY2h1bmsoc3RydWN0
IHB2X2NodW5rICpwYykKK3sKKwl2bV9wYWdlX3QgbTsKKworCW10eF9sb2NrKCZwdl9jaHVua3Nf
bXV0ZXgpOworCVRBSUxRX1JFTU9WRSgmcHZfY2h1bmtzLCBwYywgcGNfbHJ1KTsKKwltdHhfdW5s
b2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2ludCgmcHZf
ZW50cnlfc3BhcmUsIF9OUENQVikpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2ludCgmcGNf
Y2h1bmtfY291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVua19mcmVl
cywgMSkpOworCS8qIGVudGlyZSBjaHVuayBpcyBmcmVlLCByZXR1cm4gaXQgKi8KKwltID0gUEhZ
U19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKHZtX29mZnNldF90KXBjKSk7CisJZHVt
cF9kcm9wX3BhZ2UobS0+cGh5c19hZGRyKTsKKwl2bV9wYWdlX3Vud2lyZShtLCBQUV9JTkFDVElW
RSk7CisJdm1fcGFnZV9mcmVlKG0pOworfQorCisvKgorICogUmV0dXJucyBhIG5ldyBQViBlbnRy
eSwgYWxsb2NhdGluZyBhIG5ldyBQViBjaHVuayBmcm9tIHRoZSBzeXN0ZW0gd2hlbgorICogbmVl
ZGVkLiAgSWYgdGhpcyBQViBjaHVuayBhbGxvY2F0aW9uIGZhaWxzIGFuZCBhIFBWIGxpc3QgbG9j
ayBwb2ludGVyIHdhcworICogZ2l2ZW4sIGEgUFYgY2h1bmsgaXMgcmVjbGFpbWVkIGZyb20gYW4g
YXJiaXRyYXJ5IHBtYXAuICBPdGhlcndpc2UsIE5VTEwgaXMKKyAqIHJldHVybmVkLgorICoKKyAq
IFRoZSBnaXZlbiBQViBsaXN0IGxvY2sgbWF5IGJlIHJlbGVhc2VkLgorICovCitzdGF0aWMgcHZf
ZW50cnlfdAorZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qgcndsb2NrICoqbG9ja3Ap
Cit7CisJaW50IGJpdCwgZmllbGQsIGlkeDsKKwlwdl9lbnRyeV90IHB2OworCXN0cnVjdCBwdl9j
aHVuayAqcGM7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg
UkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlQVl9TVEFU
KGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfYWxsb2NzLCAxKSk7CityZXRyeToKKwlwYyA9IFRB
SUxRX0ZJUlNUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwlpZiAocGMgIT0gTlVMTCkgeworCQlmb3Ig
KGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaWYgKHBjLT5wY19tYXBb
ZmllbGRdKSB7CisJCQkJYml0ID0gZmZzbChwYy0+cGNfbWFwW2ZpZWxkXSkgLSAxOworCQkJCWJy
ZWFrOworCQkJfQorCQl9CisJCWlmIChmaWVsZCA8IF9OUENNKSB7CisJCQlpZHggPSBmaWVsZCAq
IHNpemVvZihwYy0+cGNfbWFwW2ZpZWxkXSkgKiBOQkJZICsgYml0OworCQkJcHYgPSAmcGMtPnBj
X3B2ZW50cnlbaWR4XTsKKwkJCXBjLT5wY19tYXBbZmllbGRdICY9IH4oMXVsIDw8IGJpdCk7CisJ
CQkvKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBpdGVtLCBtb3ZlIGl0IHRvIHRhaWwgKi8KKwkJCWlm
IChwYy0+cGNfbWFwWzBdID09IDAgJiYgcGMtPnBjX21hcFsxXSA9PSAwICYmCisJCQkgICAgcGMt
PnBjX21hcFsyXSA9PSAwKSB7CisJCQkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBw
YywgcGNfbGlzdCk7CisJCQkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmssIHBj
LAorCQkJCSAgICBwY19saXN0KTsKKwkJCX0KKwkJCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZw
dl9lbnRyeV9jb3VudCwgMSkpOworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50KCZwdl9l
bnRyeV9zcGFyZSwgMSkpOworCQkJcmV0dXJuIChwdik7CisJCX0KKwl9CisJLyogTm8gZnJlZSBp
dGVtcywgYWxsb2NhdGUgYW5vdGhlciBjaHVuayAqLworCW0gPSB2bV9wYWdlX2FsbG9jKE5VTEws
IDAsIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX05PT0JKIHwKKwkgICAgVk1fQUxMT0NfV0lS
RUQpOworCWlmIChtID09IE5VTEwpIHsKKwkJaWYgKGxvY2twID09IE5VTEwpIHsKKwkJCVBWX1NU
QVQocGNfY2h1bmtfdHJ5ZmFpbCsrKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJbSA9IHJl
Y2xhaW1fcHZfY2h1bmsocG1hcCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMKQorCQkJZ290byBy
ZXRyeTsKKwl9CisJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfY291bnQsIDEpKTsK
KwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwlkdW1wX2Fk
ZF9wYWdlKG0tPnBoeXNfYWRkcik7CisJcGMgPSAoc3RydWN0IHB2X2NodW5rICopTUlQU19QSFlT
X1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCXBjLT5wY19wbWFwID0gcG1hcDsKKwlw
Yy0+cGNfbWFwWzBdID0gUENfRlJFRTAgJiB+MXVsOwkvKiBwcmVhbGxvY2F0ZWQgYml0IDAgKi8K
KwlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJcGMtPnBjX21hcFsyXSA9IFBDX0ZSRUUyOwor
CW10eF9sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZwdl9jaHVu
a3MsIHBjLCBwY19scnUpOworCW10eF91bmxvY2soJnB2X2NodW5rc19tdXRleCk7CisJcHYgPSAm
cGMtPnBjX3B2ZW50cnlbMF07CisJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2Y2h1bmss
IHBjLCBwY19saXN0KTsKKwlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfY291bnQs
IDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwdl9lbnRyeV9zcGFyZSwgX05QQ1BWIC0g
MSkpOworCXJldHVybiAocHYpOworfQorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9u
ZSBiaXRzIHdpdGhpbiB0aGUgZ2l2ZW4gUFYgY2h1bmsgbWFwIGVsZW1lbnQuCisgKi8KK3N0YXRp
YyBpbmxpbmUgaW50Citwb3Bjb3VudF9wY19tYXBfZWxlbSh1aW50NjRfdCBlbGVtKQoreworCWlu
dCBjb3VudDsKKworCS8qCisJICogVGhpcyBzaW1wbGUgbWV0aG9kIG9mIGNvdW50aW5nIHRoZSBv
bmUgYml0cyBwZXJmb3JtcyB3ZWxsIGJlY2F1c2UKKwkgKiB0aGUgZ2l2ZW4gZWxlbWVudCB0eXBp
Y2FsbHkgY29udGFpbnMgbW9yZSB6ZXJvIGJpdHMgdGhhbiBvbmUgYml0cy4KKwkgKi8KKwljb3Vu
dCA9IDA7CisJZm9yICg7IGVsZW0gIT0gMDsgZWxlbSAmPSBlbGVtIC0gMSkKKwkJY291bnQrKzsK
KwlyZXR1cm4gKGNvdW50KTsKK30KKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBudW1iZXIgb2Yg
c3BhcmUgUFYgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIHBtYXAgbWVldHMgb3IKKyAqIGV4Y2Vl
ZHMgdGhlIGdpdmVuIGNvdW50LCAibmVlZGVkIi4KKyAqCisgKiBUaGUgZ2l2ZW4gUFYgbGlzdCBs
b2NrIG1heSBiZSByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQKK3Jlc2VydmVfcHZfZW50cmll
cyhwbWFwX3QgcG1hcCwgaW50IG5lZWRlZCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0
cnVjdCBwY2ggbmV3X3RhaWw7CisJc3RydWN0IHB2X2NodW5rICpwYzsKKwlpbnQgYXZhaWwsIGZy
ZWU7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9D
S0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKGxvY2tw
ICE9IE5VTEwsICgiJXM6IGxvY2twIGlzIE5VTEwiLCBfX2Z1bmNfXykpOworCisJLyoKKwkgKiBO
ZXdseSBhbGxvY2F0ZWQgUFYgY2h1bmtzIG11c3QgYmUgc3RvcmVkIGluIGEgcHJpdmF0ZSBsaXN0
IHVudGlsCisJICogdGhlIHJlcXVpcmVkIG51bWJlciBvZiBQViBjaHVua3MgaGF2ZSBiZWVuIGFs
bG9jYXRlZC4gIE90aGVyd2lzZSwKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgY291bGQgcmVjeWNs
ZSBvbmUgb2YgdGhlc2UgY2h1bmtzLiAgSW4KKwkgKiBjb250cmFzdCwgdGhlc2UgY2h1bmtzIG11
c3QgYmUgYWRkZWQgdG8gdGhlIHBtYXAgdXBvbiBhbGxvY2F0aW9uLgorCSAqLworCVRBSUxRX0lO
SVQoJm5ld190YWlsKTsKK3JldHJ5OgorCWF2YWlsID0gMDsKKwlUQUlMUV9GT1JFQUNIKHBjLCAm
cG1hcC0+cG1fcHZjaHVuaywgcGNfbGlzdCkgeworCQlmcmVlID0gcG9wY291bnRfcGNfbWFwX2Vs
ZW0ocGMtPnBjX21hcFswXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0ocGMtPnBj
X21hcFsxXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0ocGMtPnBjX21hcFsyXSk7
CisJCWlmIChmcmVlID09IDApCisJCQlicmVhazsKKwkJYXZhaWwgKz0gZnJlZTsKKwkJaWYgKGF2
YWlsID49IG5lZWRlZCkKKwkJCWJyZWFrOworCX0KKwlmb3IgKDsgYXZhaWwgPCBuZWVkZWQ7IGF2
YWlsICs9IF9OUENQVikgeworCQltID0gdm1fcGFnZV9hbGxvYyhOVUxMLCAwLCBWTV9BTExPQ19O
T1JNQUwgfCBWTV9BTExPQ19OT09CSiB8CisJCSAgICBWTV9BTExPQ19XSVJFRCk7CisJCWlmICht
ID09IE5VTEwpIHsKKwkJCW0gPSByZWNsYWltX3B2X2NodW5rKHBtYXAsIGxvY2twKTsKKwkJCWlm
IChtID09IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCQlQVl9TVEFUKGF0b21pY19hZGRf
aW50KCZwY19jaHVua19jb3VudCwgMSkpOworCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19j
aHVua19hbGxvY3MsIDEpKTsKKwkJZHVtcF9hZGRfcGFnZShtLT5waHlzX2FkZHIpOworCQlwYyA9
IChzdHJ1Y3QgcHZfY2h1bmsgKilNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyht
KSk7CisJCXBjLT5wY19wbWFwID0gcG1hcDsKKwkJcGMtPnBjX21hcFswXSA9IFBDX0ZSRUUwOwor
CQlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJCXBjLT5wY19tYXBbMl0gPSBQQ19GUkVFMjsK
KwkJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJ
VEFJTFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJUFZfU1RBVChhdG9t
aWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCX0KKwlpZiAoIVRBSUxRX0VN
UFRZKCZuZXdfdGFpbCkpIHsKKwkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJCVRBSUxR
X0NPTkNBVCgmcHZfY2h1bmtzLCAmbmV3X3RhaWwsIHBjX2xydSk7CisJCW10eF91bmxvY2soJnB2
X2NodW5rc19tdXRleCk7CisJfQorfQorCisvKgorICogRmlyc3QgZmluZCBhbmQgdGhlbiByZW1v
dmUgdGhlIHB2IGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIHBtYXAgYW5kIHZpcnR1YWwKKyAqIGFk
ZHJlc3MgZnJvbSB0aGUgc3BlY2lmaWVkIHB2IGxpc3QuICBSZXR1cm5zIHRoZSBwdiBlbnRyeSBp
ZiBmb3VuZCBhbmQgTlVMTAorICogb3RoZXJ3aXNlLiAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIHBl
cmZvcm1lZCBvbiBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvcgorICogMk1CIHBhZ2UgbWFwcGlu
Z3MuCisgKi8KK3N0YXRpYyBwdl9lbnRyeV90CitwbWFwX3B2aF9yZW1vdmUoc3RydWN0IG1kX3Bh
Z2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXB2X2VudHJ5X3QgcHY7
CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlUQUlMUV9GT1JF
QUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCWlmIChwbWFwID09IFBWX1BNQVAo
cHYpICYmIHZhID09IHB2LT5wdl92YSkgeworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3Qs
IHB2LCBwdl9uZXh0KTsKKwkJCXB2aC0+cHZfZ2VuKys7CisJCQlicmVhazsKKwkJfQorCX0KKwly
ZXR1cm4gKHB2KTsKK30KKworLyoKKyAqIEFmdGVyIGRlbW90aW9uIGZyb20gYSAyTUIgcGFnZSBt
YXBwaW5nIHRvIDUxMiA0S0IgcGFnZSBtYXBwaW5ncywKKyAqIGRlc3Ryb3kgdGhlIHB2IGVudHJ5
IGZvciB0aGUgMk1CIHBhZ2UgbWFwcGluZyBhbmQgcmVpbnN0YW50aWF0ZSB0aGUgcHYKKyAqIGVu
dHJpZXMgZm9yIGVhY2ggb2YgdGhlIDRLQiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0aWMgdm9p
ZAorcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFk
ZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJc3RydWN0IG1kX3BhZ2Ug
KnB2aDsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOworCXB2X2VudHJ5X3QgcHY7CisJdm1fb2Zmc2V0
X3QgdmFfbGFzdDsKKwl2bV9wYWdlX3QgbTsKKwlpbnQgYml0LCBmaWVsZDsKKworCXJ3X2Fzc2Vy
dCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwg
TUFfT1dORUQpOworCUtBU1NFUlQoKHBhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCIlczogcGEg
aXMgbm90IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlDSEFOR0VfUFZfTElTVF9MT0NL
X1RPX1BIWVMobG9ja3AsIHBhKTsKKworCS8qCisJICogVHJhbnNmZXIgdGhlIDJtcGFnZSdzIHB2
IGVudHJ5IGZvciB0aGlzIG1hcHBpbmcgdG8gdGhlIGZpcnN0CisJICogcGFnZSdzIHB2IGxpc3Qu
ICBPbmNlIHRoaXMgdHJhbnNmZXIgYmVnaW5zLCB0aGUgcHYgbGlzdCBsb2NrCisJICogbXVzdCBu
b3QgYmUgcmVsZWFzZWQgdW50aWwgdGhlIGxhc3QgcHYgZW50cnkgaXMgcmVpbnN0YW50aWF0ZWQu
CisJICovCisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwl2YSA9IHRydW5jXzJtcGFnZSh2YSk7CisJ
cHYgPSBwbWFwX3B2aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxM
LCAoIiVzOiBwdiBub3QgZm91bmQiLCBfX2Z1bmNfXykpOworCW0gPSBQSFlTX1RPX1ZNX1BBR0Uo
cGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJ
bS0+bWQucHZfZ2VuKys7CisJLyogSW5zdGFudGlhdGUgdGhlIHJlbWFpbmluZyBOUFRFUEcgLSAx
IHB2IGVudHJpZXMuICovCisJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5X2FsbG9j
cywgTlBURVBHIC0gMSkpOworCXZhX2xhc3QgPSB2YSArIE5CUERSIC0gUEFHRV9TSVpFOworCWZv
ciAoOzspIHsKKwkJcGMgPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuayk7CisJCUtBU1NF
UlQocGMtPnBjX21hcFswXSAhPSAwIHx8IHBjLT5wY19tYXBbMV0gIT0gMCB8fAorCQkgICAgcGMt
PnBjX21hcFsyXSAhPSAwLCAoIiVzOiBtaXNzaW5nIHNwYXJlIiwgX19mdW5jX18pKTsKKwkJZm9y
IChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007IGZpZWxkKyspIHsKKwkJCXdoaWxlIChwYy0+cGNf
bWFwW2ZpZWxkXSkgeworCQkJCWJpdCA9IGZmc2wocGMtPnBjX21hcFtmaWVsZF0pIC0gMTsKKwkJ
CQlwYy0+cGNfbWFwW2ZpZWxkXSAmPSB+KDF1bCA8PCBiaXQpOworCQkJCXB2ID0gJnBjLT5wY19w
dmVudHJ5W2ZpZWxkICogNjQgKyBiaXRdOworCQkJCXZhICs9IFBBR0VfU0laRTsKKwkJCQlwdi0+
cHZfdmEgPSB2YTsKKwkJCQltKys7CisJCQkJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFO
QUdFRCkgPT0gMCwKKwkJCQkgICAoIiVzOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgX19mdW5j
X18sIG0pKTsKKwkJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25l
eHQpOworCQkJCW0tPm1kLnB2X2dlbisrOworCQkJCWlmICh2YSA9PSB2YV9sYXN0KQorCQkJCQln
b3RvIG91dDsKKwkJCX0KKwkJfQorCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBj
LCBwY19saXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBw
Y19saXN0KTsKKwl9CitvdXQ6CisJaWYgKHBjLT5wY19tYXBbMF0gPT0gMCAmJiBwYy0+cGNfbWFw
WzFdID09IDAgJiYgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCVRBSUxRX1JFTU9WRSgmcG1hcC0+
cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmcG1hcC0+cG1f
cHZjaHVuaywgcGMsIHBjX2xpc3QpOworCX0KKwlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZf
ZW50cnlfY291bnQsIE5QVEVQRyAtIDEpKTsKKwlQVl9TVEFUKGF0b21pY19zdWJ0cmFjdF9pbnQo
JnB2X2VudHJ5X3NwYXJlLCBOUFRFUEcgLSAxKSk7Cit9CisKKy8qCisgKiBBZnRlciBwcm9tb3Rp
b24gZnJvbSA1MTIgNEtCIHBhZ2UgbWFwcGluZ3MgdG8gYSBzaW5nbGUgMk1CIHBhZ2UgbWFwcGlu
ZywKKyAqIHJlcGxhY2UgdGhlIG1hbnkgcHYgZW50cmllcyBmb3IgdGhlIDRLQiBwYWdlIG1hcHBp
bmdzIGJ5IGEgc2luZ2xlIHB2IGVudHJ5CisgKiBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcuCisg
Ki8KK3N0YXRpYyB2b2lkCitwbWFwX3B2X3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZz
ZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJ
c3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90IHZhX2xh
c3Q7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9D
S0VEKTsKKwlLQVNTRVJUKChwYSAmIFBEUk1BU0spID09IDAsCisJICAgICgiJXM6IHBhIGlzIG5v
dCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVuY19fKSk7CisJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19Q
SFlTKGxvY2twLCBwYSk7CisKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSBmaXJzdCBwYWdlJ3MgcHYg
ZW50cnkgZm9yIHRoaXMgbWFwcGluZyB0byB0aGUgMm1wYWdlJ3MKKwkgKiBwdiBsaXN0LiAgQXNp
ZGUgZnJvbSBhdm9pZGluZyB0aGUgY29zdCBvZiBhIGNhbGwgdG8gZ2V0X3B2X2VudHJ5KCksCisJ
ICogYSB0cmFuc2ZlciBhdm9pZHMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgZ2V0X3B2X2VudHJ5KCkg
Y2FsbHMKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgYW5kIHRoYXQgcmVjbGFpbV9wdl9jaHVuaygp
IHJlbW92ZXMgb25lIG9mIHRoZQorCSAqIG1hcHBpbmdzIHRoYXQgaXMgYmVpbmcgcHJvbW90ZWQu
CisJICovCisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJdmEgPSB0cnVuY18ybXBhZ2UodmEp
OworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKCZtLT5tZCwgcG1hcCwgdmEpOworCUtBU1NFUlQocHYg
IT0gTlVMTCwgKCIlczogcHYgbm90IGZvdW5kIiwgX19mdW5jX18pKTsKKwlwdmggPSBwYV90b19w
dmgocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsK
KwlwdmgtPnB2X2dlbisrOworCS8qIEZyZWUgdGhlIHJlbWFpbmluZyBOUFRFUEcgLSAxIHB2IGVu
dHJpZXMuICovCisJdmFfbGFzdCA9IHZhICsgTkJQRFIgLSBQQUdFX1NJWkU7CisJZG8geworCQlt
Kys7CisJCXZhICs9IFBBR0VfU0laRTsKKwkJcG1hcF9wdmhfZnJlZSgmbS0+bWQsIHBtYXAsIHZh
KTsKKwl9IHdoaWxlICh2YSA8IHZhX2xhc3QpOworfQorCisvKgorICogRmlyc3QgZmluZCBhbmQg
dGhlbiBkZXN0cm95IHRoZSBwdiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBwbWFwIGFuZCB2aXJ0
dWFsCisgKiBhZGRyZXNzLiAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBvbiBwdiBs
aXN0cyBmb3IgZWl0aGVyIDRLQiBvciAyTUIKKyAqIHBhZ2UgbWFwcGluZ3MuCisgKi8KK3N0YXRp
YyB2b2lkCitwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBwbWFwLCB2
bV9vZmZzZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJcHYgPSBwbWFwX3B2aF9yZW1v
dmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxMLCAoInBtYXBfcHZoX2ZyZWU6
IHB2IG5vdCBmb3VuZCwgcGEgJWx4IHZhICVseCIsCisJICAgICAodV9sb25nKVZNX1BBR0VfVE9f
UEhZUyhfX2NvbnRhaW5lcm9mKHB2aCwgc3RydWN0IHZtX3BhZ2UsIG1kKSksCisJICAgICAodV9s
b25nKXZhKSk7CisJZnJlZV9wdl9lbnRyeShwbWFwLCBwdik7Cit9CisKKy8qCisgKiBDb25kaXRp
b25hbGx5IGNyZWF0ZSB0aGUgcHYgZW50cnkgZm9yIGEgNEtCIHBhZ2UgbWFwcGluZyBpZiB0aGUg
cmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4gYmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzdG9ydGluZyB0
byByZWNsYW1hdGlvbi4KKyAqLworc3RhdGljIGJvb2xlYW5fdAorcG1hcF90cnlfaW5zZXJ0X3B2
X2VudHJ5KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sCisgICAgc3Ry
dWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2
aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09X
TkVEKTsKKwlpZiAoKHB2ID0gZ2V0X3B2X2VudHJ5KHBtYXAsIE5VTEwpKSAhPSBOVUxMKSB7CisJ
CXB2LT5wdl92YSA9IHZhOworCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0UobG9ja3As
IG0pOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwor
CQltLT5tZC5wdl9nZW4rKzsKKwkJcmV0dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChG
QUxTRSk7Cit9CisKKy8qCisgKiBDb25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgUFYgZW50cnkgZm9y
IGEgMk1CIHBhZ2UgbWFwcGluZyBpZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4gYmUgYWxs
b2NhdGVkIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHJlY2xhbWF0aW9uLgorICovCitzdGF0aWMgYm9v
bGVhbl90CitwbWFwX3B2X2luc2VydF9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2
bV9wYWRkcl90IHBhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1Y3QgbWRf
cGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9j
aywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwkvKiBQ
YXNzIE5VTEwgaW5zdGVhZCBvZiB0aGUgbG9jayBwb2ludGVyIHRvIGRpc2FibGUgcmVjbGFtYXRp
b24uICovCisJaWYgKChwdiA9IGdldF9wdl9lbnRyeShwbWFwLCBOVUxMKSkgIT0gTlVMTCkgewor
CQlwdi0+cHZfdmEgPSB2YTsKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBw
YSk7CisJCXB2aCA9IHBhX3RvX3B2aChwYSk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZwdmgtPnB2
X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJcHZoLT5wdl9nZW4rKzsKKwkJcmV0dXJuIChUUlVFKTsK
Kwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKKworLyoKKyAqIEZpbGxzIGEgcGFnZSB0
YWJsZSBwYWdlIHdpdGggbWFwcGluZ3MgdG8gY29uc2VjdXRpdmUgcGh5c2ljYWwgcGFnZXMuCisg
Ki8KK3N0YXRpYyB2b2lkCitwbWFwX2ZpbGxfcHRwKHB0X2VudHJ5X3QgKmZpcnN0cHRlLCBwdF9l
bnRyeV90IG5ld3B0ZSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlmb3IgKHB0ZSA9IGZpcnN0
cHRlOyBwdGUgPCBmaXJzdHB0ZSArIE5QVEVQRzsgcHRlKyspIHsKKwkJKnB0ZSA9IG5ld3B0ZTsK
KwkJbmV3cHRlICs9IChQQUdFX1NJWkUgPj4gVExCTE9fUEZOX1NISUZUKTsKKwl9Cit9CisKKy8q
CisgKiBUcmllcyB0byBkZW1vdGUgYSAyTUIgcGFnZSBtYXBwaW5nLiAgSWYgZGVtb3Rpb24gZmFp
bHMsIHRoZSAyTUIgcGFnZQorICogbWFwcGluZyBpcyBpbnZhbGlkYXRlZC4KKyAqLworc3RhdGlj
IGJvb2xlYW5fdAorcG1hcF9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUs
IHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJYm9vbGVhbl90IHJ2
OworCisJbG9jayA9IE5VTEw7CisJcnYgPSBwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBtYXAsIHBk
ZSwgdmEsICZsb2NrKTsKKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOwor
CXJldHVybiAocnYpOworfQorCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX2RlbW90ZV9wZGVfbG9j
a2VkKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAorICAgIHN0
cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwkgcGRfZW50cnlfdCBuZXdwZGUsIG9sZHBkZTsKKwkg
cHRfZW50cnlfdCBvbGRwdGUsICpmaXJzdHB0ZSwgbmV3cHRlOworCSB2bV9wYWRkcl90IG1wdGVw
YTsKKwkgdm1fcGFnZV90IG1wdGU7CisJIHN0cnVjdCBzcGdsaXN0IGZyZWU7CisKKwkgUE1BUF9M
T0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJIG9sZHBkZSA9ICpwZGU7CisJIG9sZHB0ZSA9
IChwdF9lbnRyeV90KW9sZHBkZTsKKwkgS0FTU0VSVChwdGVfaXNfMW1fc3VwZXJwYWdlKCZvbGRw
dGUpICYmIHB0ZV9pc192YWxpZCgmb2xkcHRlKSwKKwkgICAgICgiJXM6IG9sZHBkZSBpcyBub3Qg
c3VwZXJwYWdlIGFuZC9vciB2YWxpZC4iLCBfX2Z1bmNfXykpOworCSBpZiAocHRlX2lzX3JlZigm
b2xkcHRlKSAmJiAobXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1hcCwgdmEpKSAhPQorCSAg
ICAgTlVMTCkKKwkJIHBtYXBfcmVtb3ZlX3B0X3BhZ2UocG1hcCwgbXB0ZSk7CisJIGVsc2Ugewor
CQkgS0FTU0VSVCghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpLAorCQkgICAgICgiJXM6IHBhZ2Ug
dGFibGUgcGFnZSBmb3IgYSB3aXJlZCBtYXBwaW5nIGlzIG1pc3NpbmciLAorCQkgICAgIF9fZnVu
Y19fKSk7CisJCSAvKgorCQkgICogSW52YWxpZGF0ZSB0aGUgMk1CIHBhZ2UgbWFwcGluZyBhbmQg
cmV0dXJuICJmYWlsdXJlIiBpZiB0aGUKKwkJICAqIG1hcHBpbmcgd2FzIG5ldmVyIGFjY2Vzc2Vk
IG9yIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBuZXcKKwkJICAqIHBhZ2UgdGFibGUgcGFnZSBmYWls
cy4gIElmIHRoZSAyTUIgcGFnZSBtYXBwaW5nIGJlbG9uZ3MgdG8KKwkJICAqIHRoZSBkaXJlY3Qg
bWFwIHJlZ2lvbiBvZiB0aGUga2VybmVsJ3MgYWRkcmVzcyBzcGFjZSwgdGhlbgorCQkgICogdGhl
IHBhZ2UgYWxsb2NhdGlvbiByZXF1ZXN0IHNwZWNpZmllcyB0aGUgaGlnaGVzdCBwb3NzaWJsZQor
CQkgICogcHJpb3JpdHkgKFZNX0FMTE9DX0lOVEVSUlVQVCkuICBPdGhlcndpc2UsIHRoZSBwcmlv
cml0eSBpcworCQkgICogbm9ybWFsLiAgUGFnZSB0YWJsZSBwYWdlcyBhcmUgcHJlYWxsb2NhdGVk
IGZvciBldmVyeSBvdGhlcgorCQkgICogcGFydCBvZiB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2Us
IHNvIHRoZSBkaXJlY3QgbWFwIHJlZ2lvbgorCQkgICogaXMgdGhlIG9ubHkgcGFydCBvZiB0aGUg
a2VybmVsIGFkZHJlc3Mgc3BhY2UgdGhhdCBtdXN0IGJlCisJCSAgKiBoYW5kbGVkIGhlcmUuCisJ
CSAgKi8KKwkJIGlmICghcHRlX2lzX3JlZigmb2xkcHRlKSB8fCAobXB0ZSA9IHZtX3BhZ2VfYWxs
b2MoTlVMTCwKKwkJICAgICBwbWFwX3BkZV9waW5kZXgodmEpLCAodmEgPj0gVk1fTUlOX0tFUk5F
TF9BRERSRVNTICYmIHZhIDwKKwkJICAgICBWTV9NQVhfQUREUkVTUyA/IFZNX0FMTE9DX0lOVEVS
UlVQVCA6IFZNX0FMTE9DX05PUk1BTCkgfAorCQkgICAgIFZNX0FMTE9DX05PT0JKIHwgVk1fQUxM
T0NfV0lSRUQpKSA9PSBOVUxMKSB7CisJCQkgU0xJU1RfSU5JVCgmZnJlZSk7CisJCQkgcG1hcF9y
ZW1vdmVfcGRlKHBtYXAsIHBkZSwgdHJ1bmNfMm1wYWdlKHZhKSwgJmZyZWUsCisJCQkgICAgIGxv
Y2twKTsKKwkJCSBwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwKKwkJCSAgICAgKHZtX29mZnNl
dF90KSh2YSAmIH5QRFJNQVNLKSwKKwkJCSAgICAgKHZtX29mZnNldF90KSh2YSAmIH5QRFJNQVNL
KSArIE5CUERSKTsKKwkJCSBwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkgQ1RSMyhL
VFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkJICAgICBf
X2Z1bmNfXywgdmEsIHBtYXApOworCQkJIHJldHVybiAoRkFMU0UpOworCQkgfQorCQkgaWYgKHZh
IDwgVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJIHBtYXBfcmVzaWRlbnRfY291bnRfaW5jKHBtYXAs
IDEpOworCSB9CisJIG1wdGVwYSA9IFZNX1BBR0VfVE9fUEhZUyhtcHRlKTsKKwkgbmV3cGRlID0g
KHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVChtcHRlcGEpOworCSBmaXJzdHB0ZSA9IG5l
d3BkZTsKKwkgS0FTU0VSVChwdGVfaXNfcmVmKCZvbGRwdGUpLAorCSAgICAgKCIlczogb2xkcHRl
IGlzIG5vdCByZWZlcmVuY2VkIiwgX19mdW5jX18pKTsKKwkgS0FTU0VSVCghcHRlX3Rlc3QoJm9s
ZHB0ZSwgUFRFX1JPKSAmJiBwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRCksCisJICAgICAoIiVzOiBv
bGRwdGUgaXMgbWlzc2luZyBQVEVfRCIsIF9fZnVuY19fKSk7CisJIG5ld3B0ZSA9IG9sZHB0ZSAm
IH5QVEVfUFNfSURYX01BU0s7CisKKwkgLyoKKwkgICogSWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBp
cyBuZXcsIGluaXRpYWxpemUgaXQuCisJICAqLworCSBpZiAobXB0ZS0+d2lyZV9jb3VudCA9PSAx
KSB7CisJCSBtcHRlLT53aXJlX2NvdW50ID0gTlBURVBHOworCQkgcG1hcF9maWxsX3B0cChmaXJz
dHB0ZSwgbmV3cHRlKTsKKwkgfQorCSBLQVNTRVJUKFRMQkxPX1BURV9UT19QQSgqZmlyc3RwdGUp
ID09IFRMQkxPX1BURV9UT19QQShuZXdwdGUpLAorCSAgICAgKCIlczogZmlyc3RwdGUgYW5kIG5l
d3B0ZSBtYXAgZGlmZmVyZW50IHBoeXNpY2FsIGFkZHJlc3NlcyIsCisJICAgICBfX2Z1bmNfXykp
OworCisJIC8qCisJICAqIElmIHRoZSBtYXBwaW5nIGhhcyBjaGFuZ2VkIGF0dHJpYnV0ZXMsIHVw
ZGF0ZSB0aGUgcGFnZSB0YWJsZQorCSAgKiBlbnRyaWVzLgorCSAgKi8KKwkgaWYgKCgqZmlyc3Rw
dGUgJiBQR19QUk9NT1RFX01BU0spICE9IChuZXdwdGUgJiBQR19QUk9NT1RFX01BU0spKQorCQkg
cG1hcF9maWxsX3B0cChmaXJzdHB0ZSwgbmV3cHRlKTsKKworCisJIC8qCisJICAqIFRoZSBzcGFy
ZSBQViBlbnRyaWVzIG11c3QgYmUgcmVzZXJ2ZWQgcHJpb3IgdG8gZGVtb3RpbmcgdGhlCisJICAq
IG1hcHBpbmcsIHRoYXQgaXMsIHByaW9yIHRvIGNoYW5naW5nIHRoZSBQREUuICBPdGhlcndpc2Us
IHRoZSBzdGF0ZQorCSAgKiBvZiB0aGUgUERFIGFuZCB0aGUgUFYgbGlzdHMgd2lsbCBiZSBpbmNv
bnNpc3RlbnQsIHdoaWNoIGNhbiByZXN1bHQKKwkgICogaW4gcmVjbGFpbV9wdl9jaHVuaygpIGF0
dGVtcHRpbmcgdG8gcmVtb3ZlIGEgUFYgZW50cnkgZnJvbSB0aGUKKwkgICogd3JvbmcgUFYgbGlz
dCBhbmQgcG1hcF9wdl9kZW1vdGVfcGRlKCkgZmFpbGluZyB0byBmaW5kIHRoZSBleHBlY3RlZAor
CSAgKiBQViBlbnRyeSBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcgdGhhdCBpcyBiZWluZyBkZW1v
dGVkLgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VEKSkKKwkJIHJl
c2VydmVfcHZfZW50cmllcyhwbWFwLCBOUFRFUEcgLSAxLCBsb2NrcCk7CisKKwkgLyoKKwkgICog
RGVtb3RlIHRoZSBtYXBwaW5nLiAgVGhpcyBwbWFwIGlzIGxvY2tlZC4gIFRoZSBvbGQgUERFIGhh
cworCSAgKiBQVEVfUkVGIHNldC4gIElmIHRoZSBvbGQgUERFIGhhcyBQVEVfUk8gY2xlYXIsIGl0
IGFsc28gaGFzCisJICAqIFBURV9EIHNldC4gIFRodXMsIHRoZXJlIGlzIG5vIGRhbmdlciBvZiBh
IHJhY2Ugd2l0aCBhbm90aGVyCisJICAqIHByb2Nlc3NvciBjaGFuZ2luZyB0aGUgc2V0dGluZyBv
ZiBQVEVfUkVGIGFuZC9vciBQVEVfRCBiZXR3ZWVuCisJICAqIHRoZSByZWFkIGFib3ZlIGFuZCB0
aGUgc3RvcmUgYmVsb3cuCisJICAqLworCSBwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEsIHBkZSwg
KHB0X2VudHJ5X3QpbmV3cGRlKTsKKworCSAvKgorCSAgKiBJbnZhbGlkYXRlIGEgc3RhbGUgcmVj
dXJzaXZlIG1hcHBpbmcgb2YgdGhlIHBhZ2UgdGFibGUgcGFnZS4KKwkgICovCisJIGlmICh2YSA+
PSBWTV9NQVhVU0VSX0FERFJFU1MpCisJCSBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCAodm1f
b2Zmc2V0X3QpcG1hcF9wdGUocG1hcCwgdmEpKTsKKworCSAvKgorCSAgKiBEZW1vdGUgdGhlIFBW
IGVudHJ5LgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VEKSkgewor
CQkgcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXAsIHZhLCBUTEJMT19QREVfVE9fUEEob2xkcGRlKSwg
bG9ja3ApOworCSB9CisJIGF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfZGVtb3Rpb25zLCAxKTsK
KwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLCBf
X2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKworCSByZXR1cm4gKFRSVUUpOworfQorCisvKgor
ICogcG1hcF9yZW1vdmVfa2VybmVsX3BkZTogUmVtb3ZlIGEga2VybmVsIHN1cGVycGFnZSBtYXBw
aW5nLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9yZW1vdmVfa2VybmVsX3BkZShwbWFwX3QgcG1h
cCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwkvKiBYWFggTm90IGRvaW5n
IGtlcm5lbCBzdXBlcnBhZ2VzIHlldC4gKi8KKwlwYW5pYygicG1hcF9yZW1vdmVfa2VybmVsX3Bk
ZToga2VybmVsIHN1cGVycGFnZSIpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcGRlOiBkbyB0
aGUgdGhpbmdzIHRvIHVubWFwIGEgc3VwZXJwYWdlIGluIGEgcHJvY2VzcworICovCitzdGF0aWMg
aW50CitwbWFwX3JlbW92ZV9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkcSwgdm1fb2Zm
c2V0X3Qgc3ZhLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2NrICoqbG9j
a3ApCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwZF9lbnRyeV90IG9sZHBkZTsKKwl2bV9v
ZmZzZXRfdCBldmEsIHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCisJLyoKKwkgKiBXcml0ZSBi
YWNrIGFsbCBjYWNoZSBsaW5lcyBmcm9tIHRoZSBzdXBlcnBhZ2UgYmVpbmcgdW5tYXBwZWQuCisJ
ICovCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgoKHN2YSAmIH5QRFJNQVNLKSwgTkJQ
RFIpOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJS0FTU0VSVCgoc3Zh
ICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9wZGU6IHN2YSBpcyBub3QgMm1w
YWdlIGFsaWduZWQiKSk7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisJCW9sZHBkZSA9
IHBkZV9sb2FkX3N0b3JlKHBkcSwgUFRFX0cpOworCWVsc2UKKwkJb2xkcGRlID0gcGRlX2xvYWRf
c3RvcmUocGRxLCAwKTsKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1cpKQorCQlwbWFwLT5w
bV9zdGF0cy53aXJlZF9jb3VudCAtPSBOQlBEUiAvIFBBR0VfU0laRTsKKworCWlmIChwZGVfdGVz
dCgmb2xkcGRlLCBQVEVfRykpCisJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKGtlcm5lbF9wbWFwLCBz
dmEpOworCisJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgTkJQRFIgLyBQQUdFX1NJWkUp
OworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpIHsKKwkgICAgQ0hBTkdFX1BW
X0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7CisJICAg
IHB2aCA9IHBhX3RvX3B2aChUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7CisJICAgIHBtYXBfcHZo
X2ZyZWUocHZoLCBwbWFwLCBzdmEpOworCSAgICBldmEgPSBzdmEgKyBOQlBEUjsKKwkgICAgZm9y
ICh2YSA9IHN2YSwgbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7
CisJCXZhIDwgZXZhOyB2YSArPSBQQUdFX1NJWkUsIG0rKykgeworCQkgICAgaWYgKHBkZV90ZXN0
KCZvbGRwZGUsIFBURV9EKSAmJiAhcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1JPKSkKKwkJCSAgICB2
bV9wYWdlX2RpcnR5KG0pOworCQkgICAgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9SRUYpKQor
CQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQkgICAgaWYgKFRBSUxR
X0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJVEFJTFFfRU1QVFkoJnB2aC0+cHZfbGlzdCkp
CisJCQkgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKKwkgICAgfQor
CX0KKwlpZiAocG1hcCA9PSBrZXJuZWxfcG1hcCkgeworCQlwbWFwX3JlbW92ZV9rZXJuZWxfcGRl
KHBtYXAsIHBkcSwgc3ZhKTsKKwl9IGVsc2UgeworCQltcHRlID0gcG1hcF9sb29rdXBfcHRfcGFn
ZShwbWFwLCBzdmEpOworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQlwbWFwX3JlbW92ZV9wdF9w
YWdlKHBtYXAsIG1wdGUpOworCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7CisJ
CQlLQVNTRVJUKG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJICAgICgicG1hcF9yZW1v
dmVfcGRlOiBwdGUgcGFnZSB3aXJlIGNvdW50IGVycm9yIikpOworCQkJbXB0ZS0+d2lyZV9jb3Vu
dCA9IDA7CisJCQlwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdChtcHRlLCBmcmVlLCBGQUxTRSk7
CisJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsKKwkJfQor
CX0KKwlyZXR1cm4gKHBtYXBfdW51c2VfcHQocG1hcCwgc3ZhLCAqcG1hcF9zZWdtYXAocG1hcCwg
c3ZhKSwgZnJlZSkpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcHRlOiBkbyB0aGUgdGhpbmdz
IHRvIHVubWFwIGEgcGFnZSBpbiBhIHByb2Nlc3MKKyAqLworc3RhdGljIGludAorcG1hcF9yZW1v
dmVfcHRlKHN0cnVjdCBwbWFwICpwbWFwLCBwdF9lbnRyeV90ICpwdHEsIHZtX29mZnNldF90IHZh
LAorICAgIHBkX2VudHJ5X3QgcHRlcGRlLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSwgc3RydWN0IHJ3
bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHRfZW50cnlfdCBvbGRw
dGU7CisJdm1fcGFnZV90IG07CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK
KworCS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGUgbGluZXMgZnJvbSB0aGUgcGFnZSBiZWlu
ZyB1bm1hcHBlZC4KKwkgKi8KKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2YSwgUEFH
RV9TSVpFKTsKKworCW9sZHB0ZSA9ICpwdHE7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKQor
CQkqcHRxID0gUFRFX0c7CisJZWxzZQorCQkqcHRxID0gMDsKKworCWlmIChwdGVfdGVzdCgmb2xk
cHRlLCBQVEVfVykpCisJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50IC09IDE7CisKKwlwbWFw
X3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRF
X01BTkFHRUQpKSB7CisJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRFX1RPX1BBKG9sZHB0
ZSkpOworCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJUKCFwdGVf
dGVzdCgmb2xkcHRlLCBQVEVfUk8pLAorCQkJICAgKCIlczogbW9kaWZpZWQgcGFnZSBub3Qgd3Jp
dGFibGU6IHZhOiAlcCwgcHRlOiAlI2p4IiwKKwkJCSAgICBfX2Z1bmNfXywgKHZvaWQgKil2YSwg
KHVpbnRtYXhfdClvbGRwdGUpKTsKKwkJCXZtX3BhZ2VfZGlydHkobSk7CisJCX0KKwkJaWYgKHB0
ZV9pc19yZWYoJm9sZHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNF
RCk7CisJCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fVk1fUEFHRShsb2NrcCwgbSk7CisJCXBtYXBf
cHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJCWlmIChUQUlMUV9FTVBUWSgmbS0+bWQucHZf
bGlzdCkgJiYKKwkJICAgIChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsKKwkJCXB2
aCA9IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQkJaWYgKFRBSUxRX0VNUFRZKCZw
dmgtPnB2X2xpc3QpKQorCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7
CisJCX0KKwl9CisJcmV0dXJuIChwbWFwX3VudXNlX3B0KHBtYXAsIHZhLCBwdGVwZGUsIGZyZWUp
KTsKK30KKworLyoKKyAqIFJlbW92ZSBhIHNpbmdsZSBwYWdlIGZyb20gYSBwcm9jZXNzIGFkZHJl
c3Mgc3BhY2UKKyAqLworc3RhdGljIHZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2Uoc3RydWN0IHBtYXAg
KnBtYXAsIHZtX29mZnNldF90IHZhLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwlzdHJ1Y3Qg
cndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlQ
TUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlwZGUgPSBwbWFwX3BkZShwbWFwLCB2
YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gMCkKKwkJcmV0dXJuOworCXB0ZSA9IHBt
YXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8gcHRlIGZv
ciB0aGlzIGFkZHJlc3MsIGp1c3Qgc2tpcCBpdCEKKwkgKi8KKwlpZiAoIXB0ZV9pc192YWxpZChw
dGUpKQorCQlyZXR1cm47CisKKwlsb2NrID0gTlVMTDsKKwkodm9pZClwbWFwX3JlbW92ZV9wdGUo
cG1hcCwgcHRlLCB2YSwgKnBkZSwgZnJlZSwgJmxvY2spOworCWlmIChsb2NrICE9IE5VTEwpCisJ
CXJ3X3d1bmxvY2sobG9jayk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEpOworfQor
CisvKgorICoJUmVtb3ZlIHRoZSBnaXZlbiByYW5nZSBvZiBhZGRyZXNzZXMgZnJvbSB0aGUgc3Bl
Y2lmaWVkIG1hcC4KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQg
YXJlIHByb3Blcmx5CisgKglyb3VuZGVkIHRvIHRoZSBwYWdlIHNpemUuCisgKi8KK3ZvaWQKK3Bt
YXBfcmVtb3ZlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90IGV2YSkK
K3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZhLCB2YV9uZXh0OworCXBk
X2VudHJ5X3QgcHRwYWRkciwgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlfdCAqcHRlOworCXN0cnVj
dCBzcGdsaXN0IGZyZWU7CisJaW50IGFueXZhbGlkOworCisJLyoKKwkgKiBQZXJmb3JtIGFuIHVu
c3luY2hyb25pemVkIHJlYWQuICBUaGlzIGlzLCBob3dldmVyLCBzYWZlLgorCSAqLworCWlmIChw
bWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlhbnl2YWxp
ZCA9IDA7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr
KTsKKwlQTUFQX0xPQ0socG1hcCk7CisKKwkvKgorCSAqIHNwZWNpYWwgaGFuZGxpbmcgb2YgcmVt
b3Zpbmcgb25lIHBhZ2UuICBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbgorCSAqIGFuZCBlYXN5IHRv
IHNob3J0IGNpcmN1aXQgc29tZSBjb2RlLgorCSAqLworCWlmICgoc3ZhICsgUEFHRV9TSVpFKSA9
PSBldmEpIHsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgc3ZhKTsKKwkJaWYgKCFwZGVfaXNfMW1f
c3VwZXJwYWdlKHBkZSkpIHsKKwkJCXBtYXBfcmVtb3ZlX3BhZ2UocG1hcCwgc3ZhLCAmZnJlZSk7
CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWxvY2sgPSBOVUxMOworCWZvciAoOyBzdmEgPCBl
dmE7IHN2YSA9IHZhX25leHQpIHsKKwkJaWYgKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50
ID09IDApCisJCQlicmVhazsKKworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3ZhKTsKKwkJ
aWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNFR01BU0s7
CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29udGludWU7
CisJCX0KKwkJLyoKKwkJICogQ2FsY3VsYXRlIGluZGV4IGZvciBuZXh0IHBhZ2UgdGFibGUuCisJ
CSAqLworCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4
dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShw
ZHBlLCBzdmEpOworCQlwdHBhZGRyID0gKnBkZTsKKworCQkvKgorCQkgKiBXZWVkIG91dCBpbnZh
bGlkIG1hcHBpbmdzLgorCQkgKi8KKwkJaWYgKHB0cGFkZHIgPT0gTlVMTCkKKwkJCWNvbnRpbnVl
OworCQkvKgorCQkgKiBDaGVjayBmb3Igc3VwZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBkZV9pc18x
bV9zdXBlcnBhZ2UoJnB0cGFkZHIpKSB7CisJCQkvKgorCQkJICogQXJlIHdlIHJlbW92aW5nIHRo
ZSBlbnRpcmUgc3VwZXJwYWdlPyAgSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBwaW5nIGFu
ZCBmYWxsIHRocm91Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9uZXh0ICYm
IGV2YSA+PSB2YV9uZXh0KSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgVExCIGVudHJ5IGZvciBhIFBU
RV9HIG1hcHBpbmcgaXMKKwkJCQkgKiBpbnZhbGlkYXRlZCBieSBwbWFwX3JlbW92ZV9wZGUoKS4K
KwkJCQkgKi8KKwkJCQlpZiAoIXBkZV90ZXN0KCZwdHBhZGRyLCBQVEVfRykpCisJCQkJCWFueXZh
bGlkID0gVFJVRTsKKwkJCQlwbWFwX3JlbW92ZV9wZGUocG1hcCwgcGRlLCBzdmEsICZmcmVlLCAm
bG9jayk7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCFwbWFwX2RlbW90ZV9wZGVfbG9j
a2VkKHBtYXAsIHBkZSwgc3ZhLAorCQkJICAgICZsb2NrKSkgeworCQkJCS8qIFRoZSBzdXBlcnBh
Z2UgbWFwcGluZyB3YXMgZGVzdHJveWVkLiAqLworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsK
KwkJCQlwdHBhZGRyID0gKnBkZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIExpbWl0IG91ciBz
Y2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2YSByZXByZXNlbnRlZAorCQkgKiBieSB0aGUg
Y3VycmVudCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlCisJCSAqIHJhbmdl
IGJlaW5nIHJlbW92ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkKKwkJCXZhX25leHQg
PSBldmE7CisKKwkJdmEgPSB2YV9uZXh0OworCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShw
ZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKKwkJICAgIHN2YSArPSBQQUdFX1NJWkUp
IHsKKwkJCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJCQlpZiAodmEgIT0gdmFfbmV4dCkg
eworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CisJCQkJCXZhID0g
dmFfbmV4dDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXB0ZV90ZXN0KHB0
ZSwgUFRFX0cpKQorCQkJCWFueXZhbGlkID0gVFJVRTsKKwkJCWlmICh2YSA9PSB2YV9uZXh0KQor
CQkJCXZhID0gc3ZhOworCQkJaWYgKHBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdGUsIHN2YSwgcHRw
YWRkciwgJmZyZWUsCisJCQkgICAgJmxvY2spKSB7CisJCQkJc3ZhICs9IFBBR0VfU0laRTsKKwkJ
CQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4dCkKKwkJCXBtYXBfaW52YWxp
ZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndf
d3VubG9jayhsb2NrKTsKK291dDoKKwlpZiAoYW55dmFsaWQpCisJCXBtYXBfaW52YWxpZGF0ZV9h
bGwocG1hcCk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQTUFQX1VOTE9DSyhw
bWFwKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKglSb3V0aW5l
OglwbWFwX3JlbW92ZV9hbGwKKyAqCUZ1bmN0aW9uOgorICoJCVJlbW92ZXMgdGhpcyBwaHlzaWNh
bCBwYWdlIGZyb20KKyAqCQlhbGwgcGh5c2ljYWwgbWFwcyBpbiB3aGljaCBpdCByZXNpZGVzLgor
ICoJCVJlZmxlY3RzIGJhY2sgbW9kaWZ5IGJpdHMgdG8gdGhlIHBhZ2VyLgorICoKKyAqCU5vdGVz
OgorICoJCU9yaWdpbmFsIHZlcnNpb25zIG9mIHRoaXMgcm91dGluZSB3ZXJlIHZlcnkKKyAqCQlp
bmVmZmljaWVudCBiZWNhdXNlIHRoZXkgaXRlcmF0aXZlbHkgY2FsbGVkCisgKgkJcG1hcF9yZW1v
dmUgKHNsb3cuLi4pCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX2FsbCh2bV9wYWdlX3QgbSkKK3sK
KwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisJcG1hcF90IHBtYXA7CisJ
cHRfZW50cnlfdCAqcHRlLCB0cHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZzZXRfdCB2
YTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VO
TUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9hbGw6IHBhZ2UgJXAgaXMgbm90IG1h
bmFnZWQiLCBtKSk7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfd2xvY2soJnB2aF9nbG9iYWxf
bG9jayk7CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdvdG8gc21h
bGxfbWFwcGluZ3M7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJd2hp
bGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBOVUxMKSB7CisJCXBtYXAg
PSBQVl9QTUFQKHB2KTsKKwkJUE1BUF9MT0NLKHBtYXApOworCQl2YSA9IHB2LT5wdl92YTsKKwkJ
cGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQkodm9pZClwbWFwX2RlbW90ZV9wZGUocG1hcCwg
cGRlLCB2YSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCXdo
aWxlICgocHYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkpICE9IE5VTEwpIHsKKwkJcG1h
cCA9IFBWX1BNQVAocHYpOworCQlQTUFQX0xPQ0socG1hcCk7CisKKwkJLyoKKwkJICogSWYgaXQn
cyBsYXN0IG1hcHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbQorCQkgKiB0aGUgcGFnZSBi
ZWluZyBkZXN0cm95ZWQKKwkJICovCisJCWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSA9PSBO
VUxMKQorCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJ
WkUpOworCisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCQlwZGUgPSBwbWFw
X3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKHBkZSAhPSBOVUxMICYmICpwZGUgIT0g
MCwgKCJwbWFwX3JlbW92ZV9hbGw6IHBkZSIpKTsKKwkJS0FTU0VSVCghcGRlX2lzX3N1cGVycGFn
ZShwZGUpLCAoInBtYXBfcmVtb3ZlX2FsbDogZm91bmQiCisJCSAgICAiIGEgc3VwZXJwYWdlIGlu
IHBhZ2UgJXAgJ3MgcHYgbGlzdCIsIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwg
cHYtPnB2X3ZhKTsKKworCQl0cHRlID0gKnB0ZTsKKwkJcHRlX3N0b3JlKHB0ZSwgaXNfa2VybmVs
X3BtYXAocG1hcCkgPyBQVEVfRyA6IDApOworCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX1cp
KQorCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKworCQkvKgorCQkgKiBVcGRhdGUg
dGhlIHZtX3BhZ2VfdCBkaXJ0eSBhbmQgcmVmZXJlbmNlIGJpdHMuCisJCSAqLworCQlpZiAocHRl
X2lzX3JlZigmdHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNFRCk7
CisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJUKCFwdGVfdGVzdCgm
dHB0ZSwgUFRFX1JPKSwKKwkJCSAgICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTog
dmE6ICVwLCBwdGU6ICUjangiCisJCQkgICAgLCBfX2Z1bmNfXywgKHZvaWQgKilwdi0+cHZfdmEs
ICh1aW50bWF4X3QpdHB0ZSkpOworCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJfQorCQlwbWFwX3Vu
dXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSwgJmZyZWUpOworCQlwbWFwX2ludmFsaWRhdGVf
cGFnZShwbWFwLCBwdi0+cHZfdmEpOworCisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwg
cHYsIHB2X25leHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJZnJlZV9wdl9lbnRyeShwbWFwLCBw
dik7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KKworCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwg
UEdBX1dSSVRFQUJMRSk7CisJcndfd3VubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlwbWFwX2Zy
ZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKiBwbWFwX3Byb3RlY3RfcGRlOiBkbyB0
aGUgdGhpbmdzIHRvIHByb3RlY3QgYSBzdXBlcnBhZ2UgaW4gYSBwcm9jZXNzCisgKi8KK3N0YXRp
YyBib29sZWFuX3QKK3BtYXBfcHJvdGVjdF9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBk
ZSwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlwZF9lbnRyeV90IG5ld3Bk
ZSwgb2xkcGRlOworCXZtX29mZnNldF90IGV2YSwgdmE7CisJdm1fcGFnZV90IG07CisJYm9vbGVh
bl90IGFueWNoYW5nZWQ7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlL
QVNTRVJUKChzdmEgJiBQRFJNQVNLKSA9PSAwLAorCSAgICAoIiVzOiBzdmEgaXMgbm90IDJtcGFn
ZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlhbnljaGFuZ2VkID0gRkFMU0U7CityZXRyeToKKwlv
bGRwZGUgPSBuZXdwZGUgPSAqcGRlOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfTUFOQUdF
RCkpIHsKKwkJZXZhID0gc3ZhICsgTkJQRFI7CisJCWZvciAodmEgPSBzdmEsIG0gPSBQSFlTX1RP
X1ZNX1BBR0UoVExCTE9fUERFX1RPX1BBKG9sZHBkZSkpOworCQkgICAgdmEgPCBldmE7IHZhICs9
IFBBR0VfU0laRSwgbSsrKQorCQkJaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAmJgorCQkJ
ICAgICFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfUk8pKQorCQkJCXZtX3BhZ2VfZGlydHkobSk7CisJ
fQorCWlmICgocHJvdCAmIFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJcGRlX3NldCgmbmV3cGRl
LCBQVEVfUk8pOworCQlwZGVfY2xlYXIoJm5ld3BkZSwgUFRFX0QpOworCX0KKwlpZiAobmV3cGRl
ICE9IG9sZHBkZSkgeworCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZygocHRfZW50cnlfdCAqKXBk
ZSwgKHB0X2VudHJ5X3Qpb2xkcGRlLAorCQkgICAgKHB0X2VudHJ5X3QpbmV3cGRlKSkKKwkJCWdv
dG8gcmV0cnk7CisJCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCQlwbWFwX2ludmFs
aWRhdGVfcGFnZShwbWFwLCBzdmEpOworCQllbHNlCisJCQlhbnljaGFuZ2VkID0gVFJVRTsKKwl9
CisJcmV0dXJuIChhbnljaGFuZ2VkKTsKK30KKworLyotCisgKglTZXQgdGhlIHBoeXNpY2FsIHBy
b3RlY3Rpb24gb24gdGhlCisgKglzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhpcyBtYXAgYXMgcmVxdWVz
dGVkLgorICovCit2b2lkCitwbWFwX3Byb3RlY3QocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2
YSwgdm1fb2Zmc2V0X3QgZXZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwl2bV9vZmZzZXRfdCB2YSwg
dmFfbmV4dDsKKwlwZF9lbnRyeV90ICpwZGUsICpwZHBlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwli
b29sZWFuX3QgYW55Y2hhbmdlZCwgcHZfbGlzdHNfbG9ja2VkOworCisJaWYgKChwcm90ICYgVk1f
UFJPVF9SRUFEKSA9PSBWTV9QUk9UX05PTkUpIHsKKwkJcG1hcF9yZW1vdmUocG1hcCwgc3ZhLCBl
dmEpOworCQlyZXR1cm47CisJfQorCWlmIChwcm90ICYgVk1fUFJPVF9XUklURSkKKwkJcmV0dXJu
OworCisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdlZCA9IEZB
TFNFOworCisJUE1BUF9MT0NLKHBtYXApOworCWZvciAoOyBzdmEgPCBldmE7IHN2YSA9IHZhX25l
eHQpIHsKKwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRwZSA9PSAw
KSB7CisJCQl2YV9uZXh0ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYgKHZhX25l
eHQgPCBzdmEpCisJCQkJdmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhX25l
eHQgPSAoc3ZhICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJ
dmFfbmV4dCA9IGV2YTsKKworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2YSk7CisK
KwkJLyoKKwkJICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICovCisJCWlmICgqcGRl
ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBDaGVjayBmb3Igc3VwZXJwYWdl
LgorCQkgKi8KKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJLyoKKwkJCSAq
IEFyZSB3ZSBwcm90ZWN0aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJCQkgKiBk
ZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYgKHN2YSAr
IE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQkvKgorCQkJCSAqIFRo
ZSBUTEIgZW50cnkgZm9yIGEgUEdfRyBtYXBwaW5nIGlzCisJCQkJICogaW52YWxpZGF0ZWQgYnkg
cG1hcF9wcm90ZWN0X3BkZSgpLgorCQkJCSAqLworCQkJCWlmIChwbWFwX3Byb3RlY3RfcGRlKHBt
YXAsIHBkZSwgc3ZhLCBwcm90KSkKKwkJCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJCQkJY29udGlu
dWU7CisJCQl9IGVsc2UgeworCQkJCWlmICghcHZfbGlzdHNfbG9ja2VkKSB7CisJCQkJCXB2X2xp
c3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJCWlmICghcndfdHJ5X3Jsb2NrKCZwdmhfZ2xvYmFsX2xv
Y2spKSB7CisJCQkJCQlpZiAoYW55Y2hhbmdlZCkKKwkJCQkJCQlwbWFwX2ludmFsaWRhdGVfYWxs
KAorCQkJCQkJCSAgICBwbWFwKTsKKwkJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCQkJcndf
cmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCQlnb3RvIHJlc3VtZTsKKwkJCQkJfQorCQkJ
CX0KKwkJCQlpZiAoIXBtYXBfZGVtb3RlX3BkZShwbWFwLCBwZGUsIHN2YSkpIHsKKwkJCQkJLyoK
KwkJCQkJICogVGhlIHN1cGVycGFnZSBtYXBwaW5nIHdhcyBkZXN0cm95ZWQuCisJCQkJCSAqLwor
CQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyoKKwkJICogTGltaXQgb3VyIHNj
YW4gdG8gZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHZhIHJlcHJlc2VudGVkCisJCSAqIGJ5IHRoZSBj
dXJyZW50IHBhZ2UgdGFibGUgcGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUKKwkJICogcmFuZ2Ug
YmVpbmcgd3JpdGUgcHJvdGVjdGVkLgorCQkgKi8KKwkJaWYgKHZhX25leHQgPiBldmEpCisJCQl2
YV9uZXh0ID0gZXZhOworCisJCXZhID0gdmFfbmV4dDsKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90
b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFH
RV9TSVpFKSB7CisJCQlwdF9lbnRyeV90IHBiaXRzOworCQkJdm1fcGFnZV90IG07CisJCQl2bV9w
YWRkcl90IHBhOworCisJCQlwYml0cyA9ICpwdGU7CisJCQlpZiAoIXB0ZV9pc192YWxpZCgmcGJp
dHMpIHx8IHB0ZV90ZXN0KCZwYml0cywgUFRFX1JPKSkgeworCQkJCWlmICh2YSAhPSB2YV9uZXh0
KSB7CisJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJCQkJdmEg
PSB2YV9uZXh0OworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXB0ZV9zZXQoJnBiaXRz
LCBQVEVfUk8pOworCQkJaWYgKHB0ZV90ZXN0KCZwYml0cywgUFRFX0QpKSB7CisJCQkJcHRlX2Ns
ZWFyKCZwYml0cywgUFRFX0QpOworCQkJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9NQU5BR0VE
KSkgeworCQkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwYml0cyk7CisJCQkJCW0gPSBQSFlTX1RP
X1ZNX1BBR0UocGEpOworCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCX0KKwkJCQlpZiAodmEg
PT0gdmFfbmV4dCkKKwkJCQkJdmEgPSBzdmE7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICog
VW5sZXNzIFBURV9EIGlzIHNldCwgYW55IFRMQiBlbnRyaWVzCisJCQkJICogbWFwcGluZyAic3Zh
IiBkb24ndCBhbGxvdyB3cml0ZSBhY2Nlc3MsIHNvCisJCQkJICogdGhleSBuZWVkbid0IGJlIGlu
dmFsaWRhdGVkLgorCQkJCSAqLworCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CisJCQkJCXBtYXBf
aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJCQkJdmEgPSB2YV9uZXh0OworCQkJ
CX0KKwkJCX0KKwkJCSpwdGUgPSBwYml0czsKKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4dCkKKwkJ
CXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGFueWNoYW5n
ZWQpCisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJaWYgKHB2X2xpc3RzX2xvY2tlZCkg
eworCQlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCX0KKwlQTUFQX1VOTE9DSyhwbWFw
KTsKK30KKworLyotCisgKiBUcmllcyB0byBwcm9tb3RlIHRoZSA1MTIsIGNvbnRpZ3VvdXMgNEtC
IHBhZ2UgbWFwcGluZ3MgdGhhdCBhcmUgd2l0aGluIGEKKyAqIHNpbmdsZSBwYWdlIHRhYmxlIHBh
Z2UgdG8gYSBzaW5nbGUgMk1CIHBhZ2UgbWFwcGluZy4gIEZvciBwcm9tb3Rpb24gdG8KKyAqIG9j
Y3VyLCB0d28gY29uZGl0aW9ucyBtdXN0IGJlIG1ldDogKDEpIHRoZSA0S0IgcGFnZSBtYXBwaW5n
cyBtdXN0IG1hcAorICogYWxpZ25lZCwgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkgYW5kICgy
KSB0aGUgNEtCIHBhZ2UgbWFwcGluZ3MgbXVzdCBoYXZlCisgKiBpZGVudGljYWwgY2hhcmFjdGVy
aXN0aWNzLgorICoKKyAqIE9uIE1JUFM2NCBwcm9tb3Rpb25zIGFyZSBhY3R1YWxseSBkb25lIGlu
IHBhaXJzIG9mIHR3byAxTUIgc3VwZXJwYWdlcworICogYmVjYXVzZSBvZiB0aGUgaGFyZHdhcmUg
YXJjaGl0ZWN0dXJlICh0d28gcGh5c2ljYWwgcGFnZXMgYXJlIGluIGEgc2luZ2xlCisgKiBUTEIg
ZW50cnkpIGV2ZW4gdGhvdWdoIFZNIGxheWVyIGlzIHVuZGVyIHRoZSBpbXByZXNzaW9uIHRoYXQg
dGhlIHN1cGVycGFnZQorICogc2l6ZSBpcyBhY3R1YWxseSAyTUIuCisgKi8KK3N0YXRpYyB2b2lk
CitwbWFwX3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNl
dF90IHZhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdF9lbnRyeV90IG5ld3Bk
ZTsKKwlwdF9lbnRyeV90ICpmaXJzdHB0ZSwgb2xkcHRlLCBwYSwgKnB0ZTsKKwl2bV9vZmZzZXRf
dCBvbGRwdGV2YTsKKwl2bV9wYWdlX3QgbXB0ZTsKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwg
TUFfT1dORUQpOworCS8qCisJICogRXhhbWluZSB0aGUgZmlyc3QgUFRFIGluIHRoZSBzcGVjaWZp
ZWQgUFRQLiAgQWJvcnQgaWYgdGhpcyBQVEUgaXMKKwkgKiBlaXRoZXIgaW52YWxpZCwgdW51c2Vk
LCBvciBkb2VzIG5vdCBtYXAgdGhlIGZpcnN0IDRLQiBwaHlzaWNhbCBwYWdlCisJICogd2l0aGlu
IGEgMk1CIHBhZ2UuCisJICovCisJZmlyc3RwdGUgPSBwbWFwX3B0ZShwbWFwLCB0cnVuY18ybXBh
Z2UodmEpKTsKK3NldHBkZToKKwluZXdwZGUgPSAqZmlyc3RwdGU7CisJaWYgKGlzX2tlcm5lbF9w
bWFwKHBtYXApKSB7CisJCS8qIFhYWCBub3QgZG9pbmcga2VybmVsIHBtYXAgeWV0ICovCisJCWF0
b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RSX1BNQVAs
ICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVuY19fLCB2
YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFwdGVfaXNfdmFsaWQoJm5ld3BkZSkgfHwg
IXB0ZV9pc19yZWYoJm5ld3BkZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3BkZV9wX2Zh
aWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGlu
IHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0dXJuOworCX0KKwlp
ZiAoIXB0ZV90ZXN0KCZuZXdwZGUsIFBURV9EKSAmJiAhcHRlX3Rlc3QoJm5ld3BkZSwgUFRFX1JP
KSkgeworCQkvKgorCQkgKiBXaGVuIFBURV9EIGlzIGFscmVhZHkgY2xlYXIsIFBURV9STyBjYW4g
YmUgc2V0IHdpdGhvdXQKKwkJICogYSBUTEIgaW52YWxpZGF0aW9uLgorCQkgKi8KKwkJaWYgKCFh
dG9taWNfY21wc2V0X2xvbmcoKHVfbG9uZyAqKWZpcnN0cHRlLCBuZXdwZGUsIG5ld3BkZSB8CisJ
CSAgICBQVEVfUk8pKQorCQkJZ290byBzZXRwZGU7CisJCW5ld3BkZSB8PSBQVEVfUk87CisJfQor
CisJLyoKKwkgKiBFeGFtaW5lIGVhY2ggb2YgdGhlIG90aGVyIFBURXMgaW4gdGhlIHNwZWNpZmll
ZCBQVFAuICBBYm9ydCBpZiB0aGlzCisJICogUFRFIG1hcHMgYW4gdW5leHBlY3RlZCA0S0IgcGh5
c2ljYWwgcGFnZSBvciBkb2VzIG5vdCBoYXZlIGlkZW50aWNhbAorCSAqIGNoYXJhY3RlcmlzdGlj
cyB0byB0aGUgZmlyc3QgUFRFLgorCSAqLworCXBhID0gVExCTE9fUFRFX1RPX1BBKG5ld3BkZSkg
KyBOQlBEUiAtIFBBR0VfU0laRTsKKwlmb3IgKHB0ZSA9IGZpcnN0cHRlICsgTlBURVBHIC0gMTsg
cHRlID4gZmlyc3RwdGU7IHB0ZS0tKSB7CitzZXRwdGU6CisJCW9sZHB0ZSA9ICpwdGU7CisJCWlm
IChUTEJMT19QVEVfVE9fUEEob2xkcHRlKSAhPSBwYSkgeworCQkJYXRvbWljX2FkZF9sb25nKCZw
bWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJCUNUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBm
b3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQkJ
cmV0dXJuOworCQl9CisJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpICYmICFwdGVfdGVz
dCgmb2xkcHRlLCBQVEVfUk8pKSB7CisJCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZyhwdGUsIG9s
ZHB0ZSwgb2xkcHRlIHwgUFRFX1JPKSkKKwkJCQlnb3RvIHNldHB0ZTsKKwkJCW9sZHB0ZSB8PSBQ
VEVfUk87CisJCQlvbGRwdGV2YSA9ICh2YSAmIH5QRFJNQVNLKSB8CisJCQkgICAgKFRMQkxPX1BU
RV9UT19QQShvbGRwdGUpICYgUERSTUFTSyk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6IHByb3Rl
Y3QgZm9yIHZhICUjbHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIG9sZHB0ZXZhLCBw
bWFwKTsKKwkJfQorCQlpZiAoKG9sZHB0ZSAmIFBHX1BST01PVEVfTUFTSykgIT0gKG5ld3BkZSAm
IFBHX1BST01PVEVfTUFTSykpIHsKKwkJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWls
dXJlcywgMSk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUjbHggaW4g
cG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCXJldHVybjsKKwkJfQor
CQlwYSAtPSBQQUdFX1NJWkU7CisJfQorCisJLyoKKwkgKiBTYXZlIHRoZSBwYWdlIHRhYmxlIHBh
Z2UgaW4gaXRzIGN1cnJlbnQgc3RhdGUgdW50aWwgdGhlIFBERQorCSAqIG1hcHBpbmcgdGhlIHN1
cGVycGFnZSBpcyBkZW1vdGVkIGJ5IHBtYXBfZGVtb3RlX3BkZSgpIG9yCisJICogZGVzdHJveWVk
IGJ5IHBtYXBfcmVtb3ZlX3BkZSgpLgorCSAqLworCW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQ
U19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7CisJS0FTU0VSVChtcHRlID49IHZtX3BhZ2VfYXJyYXkg
JiYKKwkgICAgbXB0ZSA8ICZ2bV9wYWdlX2FycmF5W3ZtX3BhZ2VfYXJyYXlfc2l6ZV0sCisJICAg
ICgiJXM6IHBhZ2UgdGFibGUgcGFnZSBpcyBvdXQgb2YgcmFuZ2UiLCBfX2Z1bmNfXykpOworCUtB
U1NFUlQobXB0ZS0+cGluZGV4ID09IHBtYXBfcGRlX3BpbmRleCh2YSksCisJICAgICgiJXM6IHBh
Z2UgdGFibGUgcGFnZSdzIHBpbmRleCBpcyB3cm9uZyIsIF9fZnVuY19fKSk7CisJaWYgKHBtYXBf
aW5zZXJ0X3B0X3BhZ2UocG1hcCwgbXB0ZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3Bk
ZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAl
I2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0dXJuOwor
CX0KKworCS8qCisJICogUHJvbW90ZSB0aGUgcHYgZW50cmllcy4KKwkgKi8KKwlpZiAocHRlX3Rl
c3QoJm5ld3BkZSwgUFRFX01BTkFHRUQpKQorCQlwbWFwX3B2X3Byb21vdGVfcGRlKHBtYXAsIHZh
LCBUTEJMT19QVEVfVE9fUEEobmV3cGRlKSwgbG9ja3ApOworCisJLyoKKwkgKiBNYXAgdGhlIHN1
cGVycGFnZS4KKwkgKi8KKwlwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEsIHBkZSwgbmV3cGRlIHwg
UFRFX1BTXzFNKTsKKworCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcHJvbW90aW9ucywgMSk7
CisJQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLCBf
X2Z1bmNfXywgdmEsCisJICAgIHBtYXApOworfQorCisvKgorICoJSW5zZXJ0IHRoZSBnaXZlbiBw
aHlzaWNhbCBwYWdlIChwKSBhdAorICoJdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgKHYp
IGluIHRoZQorICoJdGFyZ2V0IHBoeXNpY2FsIG1hcCB3aXRoIHRoZSBwcm90ZWN0aW9uIHJlcXVl
c3RlZC4KKyAqCisgKglJZiBzcGVjaWZpZWQsIHRoZSBwYWdlIHdpbGwgYmUgd2lyZWQgZG93biwg
bWVhbmluZworICoJdGhhdCB0aGUgcmVsYXRlZCBwdGUgY2FuIG5vdCBiZSByZWNsYWltZWQuCisg
KgorICoJTkI6ICBUaGlzIGlzIHRoZSBvbmx5IHJvdXRpbmUgd2hpY2ggTUFZIE5PVCBsYXp5LWV2
YWx1YXRlCisgKglvciBsb3NlIGluZm9ybWF0aW9uLiAgVGhhdCBpcywgdGhpcyByb3V0aW5lIG11
c3QgYWN0dWFsbHkKKyAqCWluc2VydCB0aGlzIHBhZ2UgaW50byB0aGUgZ2l2ZW4gbWFwIE5PVy4K
KyAqLworaW50CitwbWFwX2VudGVyKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFn
ZV90IG0sIHZtX3Byb3RfdCBwcm90LAorICAgIHVfaW50IGZsYWdzLCBpbnQ4X3QgcHNpbmQgX191
bnVzZWQpCit7CisgICAgICAgIHN0cnVjdCByd2xvY2sgKmxvY2s7CisgICAgICAgIHZtX3BhZGRy
X3QgcGEsIG9wYTsKKyAgICAgICAgcGRfZW50cnlfdCAqcGRlOworICAgICAgICBwdF9lbnRyeV90
ICpwdGU7CisgICAgICAgIHB0X2VudHJ5X3Qgb3JpZ3B0ZSwgbmV3cHRlOworICAgICAgICBwdl9l
bnRyeV90IHB2OworICAgICAgICB2bV9wYWdlX3QgbXB0ZSwgb207CisgICAgICAgIGJvb2xlYW5f
dCBub3NsZWVwOworCisgICAgICAgIHZhID0gdHJ1bmNfcGFnZSh2YSk7CisgICAgICAgIEtBU1NF
UlQodmEgPD0gVk1fTUFYX0tFUk5FTF9BRERSRVNTLCAoInBtYXBfZW50ZXI6IHRvb2JpZyIpKTsK
KyAgICAgICAgS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCB8fCB2YSA8
IGttaS5jbGVhbl9zdmEgfHwKKyAgICAgICAgICAgIHZhID49IGttaS5jbGVhbl9ldmEsCisgICAg
ICAgICAgICAoInBtYXBfZW50ZXI6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhlIGNsZWFuIHN1
Ym1hcCIpKTsKKyAgICAgICAgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwICYm
ICF2bV9wYWdlX3hidXNpZWQobSkpCisgICAgICAgICAgICAgICAgVk1fT0JKRUNUX0FTU0VSVF9M
T0NLRUQobS0+b2JqZWN0KTsKKworICAgICAgICBtcHRlID0gTlVMTDsKKworICAgICAgICBsb2Nr
ID0gTlVMTDsKKyAgICAgICAgcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAgICAgIFBN
QVBfTE9DSyhwbWFwKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbiB0aGUgY2FzZSB0aGF0
IGEgcGFnZSB0YWJsZSBwYWdlIGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisgICAgICAgICAqIGNy
ZWF0aW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCWlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVT
UykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSGVyZSBpZiB0aGUg
cHRlIHBhZ2UgaXNuJ3QgbWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorICAgICAgICAgICAgICAg
ICAqIGRlYWxsb2NhdGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG5v
c2xlZXAgPSAoZmxhZ3MgJiBQTUFQX0VOVEVSX05PU0xFRVApICE9IDA7CisgICAgICAgICAgICAg
ICAgbXB0ZSA9IHBtYXBfYWxsb2NwdGUocG1hcCwgdmEsIG5vc2xlZXAgPyBOVUxMIDogJmxvY2sp
OworICAgICAgICAgICAgICAgIGlmIChtcHRlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIEtBU1NFUlQobm9zbGVlcCAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICgicG1hcF9hbGxvY3B0ZSBmYWlsZWQgd2l0aCBzbGVlcCBhbGxvd2VkIikpOworICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGxvY2sgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcndfd3VubG9jayhsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ3X3J1
bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBQTUFQX1VO
TE9DSyhwbWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoS0VSTl9SRVNPVVJD
RV9TSE9SVEFHRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJcGRlID0gcG1hcF9w
ZGUocG1hcCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJcGFuaWMo
IiVzOiBhdHRlbXB0ZWQgcG1hcF9lbnRlciBvbiBzdXBlcnBhZ2UiLCBfX2Z1bmNfXyk7CisJfQor
CXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworICAgICAgICAvKgorICAgICAgICAg
KiAgUGFnZSBEaXJlY3RvcnkgdGFibGUgZW50cnkgbm90IHZhbGlkLCB3ZSBuZWVkIGEgbmV3IFBU
IHBhZ2UKKyAgICAgICAgICovCisgICAgICAgIGlmIChwdGUgPT0gTlVMTCkgeworICAgICAgICAg
ICAgICAgIHBhbmljKCJwbWFwX2VudGVyOiBpbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LCBwZGlyPSVw
LCB2YT0lcCIsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopcG1hcC0+cG1fc2VndGFiLCAo
dm9pZCAqKXZhKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhID0gVk1fUEFHRV9UT19QSFlTKG0p
OworICAgICAgICBvbSA9IE5VTEw7CisgICAgICAgIG9yaWdwdGUgPSAqcHRlOworCW9wYSA9IFRM
QkxPX1BURV9UT19QQShvcmlncHRlKTsKKworICAgICAgICBuZXdwdGUgPSBUTEJMT19QQV9UT19Q
Rk4ocGEpIHwgaW5pdF9wdGVfcHJvdChtLCBmbGFncywgcHJvdCk7CisgICAgICAgIC8qCisgICAg
ICAgICAqIHBtYXBfZW50ZXIoKSBpcyBjYWxsZWQgZHVyaW5nIGEgZmF1bHQgb3Igc2ltdWxhdGVk
IGZhdWx0IHNvCisgICAgICAgICAqIHNldCB0aGUgcmVmZXJlbmNlIGJpdCBub3cgdG8gYXZvaWQg
YSBmYXVsdC4KKyAgICAgICAgICovCisgICAgICAgIHB0ZV9yZWZfc2V0KCZuZXdwdGUpOworICAg
ICAgICBpZiAoKGZsYWdzICYgUE1BUF9FTlRFUl9XSVJFRCkgIT0gMCkKKyAgICAgICAgICAgICAg
ICBuZXdwdGUgfD0gUFRFX1c7CisgICAgICAgIGlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkKKyAg
ICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRFX0c7CisgICAgICAgIGlmIChpc19jYWNoZWFibGVf
bWVtKHBhKSkgeworICAgICAgICAgICAgICAgIGlmIChtLT5tZC5wdl9tZW1hdHRyID09IFZNX01F
TUFUVFJfVU5DQUNIRUFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRF
X0NfVU5DQUNIRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAg
ICAgbmV3cHRlIHw9IFBURV9DX0NBQ0hFOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAg
ICBuZXdwdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisjaWZkZWYgQ1BVX0NIRVJJCisgICAgICAgIGlm
ICgoZmxhZ3MgJiBQTUFQX0VOVEVSX05PTE9BRFRBR1MpICE9IDApCisgICAgICAgICAgICAgICAg
bmV3cHRlIHw9IFBURV9MQzsKKyAgICAgICAgaWYgKChmbGFncyAmIFBNQVBfRU5URVJfTk9TVE9S
RVRBR1MpICE9IDApCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9TQzsKKyNlbmRpZgor
CisJLyoKKwkgKiBTZXQgbW9kaWZpZWQgYml0IGdyYXR1aXRvdXNseSBmb3Igd3JpdGVhYmxlIG1h
cHBpbmdzIGlmCisJICogdGhlIHBhZ2UgaXMgdW5tYW5hZ2VkLiBXZSBkbyBub3Qgd2FudCB0byB0
YWtlIGEgZmF1bHQKKwkgKiB0byBkbyB0aGUgZGlydHkgYml0IGVtdWxhdGlvbiBmb3IgdGhlc2Ug
bWFwcGluZ3MuCisJICovCisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAhPSAwKSB7
CisJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJCW5ld3B0ZSB8PSBQVEVfRDsK
Kwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFwcGluZyBoYXMgbm90IGNoYW5nZWQsIG11
c3QgYmUgcHJvdGVjdGlvbiBvciB3aXJpbmcgY2hhbmdlLgorICAgICAgICAgKi8KKyAgICAgICAg
aWYgKHB0ZV9pc192YWxpZCgmb3JpZ3B0ZSkgJiYgb3BhID09IHBhKSB7CisgICAgICAgICAgICAg
ICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0ZSBzdGF0
cy4gV2UgZG9uJ3Qgd29ycnkgYWJvdXQKKyAgICAgICAgICAgICAgICAgKiB3aXJpbmcgUFQgcGFn
ZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9uZyBhcyB0aGVyZQorICAgICAgICAgICAg
ICAgICAqIGFyZSB2YWxpZCBtYXBwaW5ncyBpbiB0aGVtLiBIZW5jZSwgaWYgYSB1c2VyIHBhZ2Ug
aXMKKyAgICAgICAgICAgICAgICAgKiB3aXJlZCwgdGhlIFBUIHBhZ2Ugd2lsbCBiZSBhbHNvLgor
ICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmbmV3cHRl
LCBQVEVfVykgJiYgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVykpCisgICAgICAgICAgICAgICAg
ICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworICAgICAgICAgICAgICAgIGVs
c2UgaWYgKCFwdGVfdGVzdCgmbmV3cHRlLCBQVEVfVykgJiYgcHRlX3Rlc3QoJm9yaWdwdGUsCisg
ICAgICAgICAgICAgICAgICAgIFBURV9XKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtYXAt
PnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyAgICAgICAgICAgICAgICBLQVNTRVJUKCFwdGVf
dGVzdCgmb3JpZ3B0ZSwgUFRFX0QgfCBQVEVfUk8pLAorICAgICAgICAgICAgICAgICAgICAoIiVz
OiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6ICVwLCBwdGU6ICUjangiLAorICAgICAg
ICAgICAgICAgICAgICBfX2Z1bmNfXywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClvcmlncHRlKSk7
CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFJlbW92ZSB0aGUgZXh0
cmEgUFQgcGFnZSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAg
ICBpZiAobXB0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtcHRlLT53aXJl
X2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBLQVNTRVJUKG1wdGUtPndpcmVfY291
bnQgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicG1hcF9lbnRlcjogbWlzc2lu
ZyByZWZlcmVuY2UgdG8gcGFnZSB0YWJsZSBwYWdlLCIKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIiB2YTogMHglbHgiLCB2YSkpOworICAgICAgICAgICAgICAgIH0KKwkJaWYgKHB0ZV90
ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJCW9tID0gbTsKKwkJCW5ld3B0ZSB8PSBQ
VEVfTUFOQUdFRDsKKwkJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJCQl2bV9w
YWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKKwkJfQorCQlnb3RvIHZhbGlkYXRlOwor
CX0KKworCXB2ID0gTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYXBwaW5nIGhhcyBj
aGFuZ2VkLCBpbnZhbGlkYXRlIG9sZCByYW5nZSBhbmQgZmFsbCB0aHJvdWdoIHRvCisgICAgICAg
ICAqIGhhbmRsZSB2YWxpZGF0aW5nIG5ldyBtYXBwaW5nLgorICAgICAgICAgKi8KKyAgICAgICAg
aWYgKG9wYSkgeworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1cp
KQorICAgICAgICAgICAgICAgICAgICAgICAgcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsK
KworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBvbSA9IFBIWVNfVE9fVk1fUEFHRShvcGEpOworICAg
ICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19WTV9QQUdFKCZsb2Nr
LCBvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdiA9IHBtYXBfcHZoX3JlbW92ZSgmb20t
Pm1kLCBwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICht
cHRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wdGUtPndpcmVfY291bnQt
LTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBU1NFUlQobXB0ZS0+d2lyZV9jb3VudCA+IDAs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJwbWFwX2VudGVyOiBtaXNzaW5nIHJlZmVy
ZW5jZSB0byBwYWdlIHRhYmxlIHBhZ2UsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIg
dmE6ICVwIiwgKHZvaWQgKil2YSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICAgICAgcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgMSk7CisKKyAg
ICAgICAgLyoKKyAgICAgICAgICogRW50ZXIgb24gdGhlIFBWIGxpc3QgaWYgcGFydCBvZiBvdXIg
bWFuYWdlZCBtZW1vcnkuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG0tPm9mbGFncyAmIFZQ
T19VTk1BTkFHRUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRFX01BTkFH
RUQ7CisJCS8qIEluc2VydCBFbnRyeSAqLworCQlpZiAocHYgPT0gTlVMTCkKKwkJCXB2ID0gZ2V0
X3B2X2VudHJ5KHBtYXAsICZsb2NrKTsKKyAgICAgICAgICAgICAgICBwdi0+cHZfdmEgPSB2YTsK
KyAgICAgICAgICAgICAgICBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1BIWVMoJmxvY2ssIHBhKTsK
KyAgICAgICAgICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2
X25leHQpOworICAgICAgICAgICAgICAgIG0tPm1kLnB2X2dlbisrOworICAgICAgICAgICAgICAg
IGlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKyAgICAgICAgICAgICAgICAgICAgICAg
IHZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9XUklURUFCTEUpOworICAgICAgICB9IGVsc2UgaWYg
KHB2ICE9IE5VTEwpCisJCWZyZWVfcHZfZW50cnkocG1hcCwgcHYpOworCisKKyAgICAgICAgLyoK
KyAgICAgICAgICogSW5jcmVtZW50IGNvdW50ZXJzCisgICAgICAgICAqLworICAgICAgICBpZiAo
cHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1cpKQorICAgICAgICAgICAgICAgIHBtYXAtPnBtX3N0YXRz
LndpcmVkX2NvdW50Kys7CisKK3ZhbGlkYXRlOgorI2lmZGVmIFBNQVBfREVCVUcKKyAgICAgICAg
cHJpbnRmKCJwbWFwX2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZv
aWQgKilwYSk7CisjZW5kaWYKKyAgICAgICAgLyoKKyAgICAgICAgICogaWYgdGhlIG1hcHBpbmcg
b3IgcGVybWlzc2lvbiBiaXRzIGFyZSBkaWZmZXJlbnQsIHdlIG5lZWQgdG8KKyAgICAgICAgICog
dXBkYXRlIHRoZSBwdGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG9yaWdwdGUgJiB+IChQ
VEVfRHxQVEVfUkVGKSkgIT0gbmV3cHRlKSB7CisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBU
RV9WUjsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgVk1fUFJPVF9XUklURSkgIT0gMCkK
KyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfRDsKKyAgICAgICAgICAgICAg
ICBpZiAocHRlX2lzX3ZhbGlkKCZvcmlncHRlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAg
Ym9vbGVhbl90IGludmx2YSA9IEZBTFNFOworCisJCQlvcmlncHRlID0gcHRlX2xvYWRfc3RvcmUo
cHRlLCBuZXdwdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0ZV9pc19yZWYoJm9y
aWdwdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgm
b3JpZ3B0ZSwgUFRFX01BTkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG9tLCBQR0FfUkVGRVJFTkNFRCk7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGEgIT0gcGEpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaW52bHZhID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRF
X0QpICYmCisJCQkgICAgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfUk8pKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQp
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtX3BhZ2VfZGlydHko
b20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByb3QgJiBWTV9QUk9U
X1dSSVRFKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
dmx2YSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSAmJgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFRBSUxRX0VNUFRZKCZvbS0+bWQucHZfbGlzdCkgJiYKKwkJCSAg
ICAoKG9tLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwKKwkJCSAgICBUQUlMUV9FTVBU
WSgmcGFfdG9fcHZoKG9wYSktPnB2X2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihvbSwgUEdBX1dSSVRFQUJMRSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAoaW52bHZhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAgfSBlbHNl
CisJCQlwdGVfc3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAg
ICAgICAgICogIElmIGJvdGggdGhlIHBhZ2UgdGFibGUgcGFnZSBhbmQgdGhlIHJlc2VydmF0aW9u
IGFyZSBmdWxseQorICAgICAgICAgKiAgcG9wdWxhdGVkLCB0aGVuIGF0dGVtcHQgcHJvbW90aW9u
LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChtcHRlID09IE5VTEwgfHwgbXB0ZS0+d2lyZV9j
b3VudCA9PSBOUFRFUEcpICYmCisgICAgICAgICAgICAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VT
KSA9PSAwICYmCisgICAgICAgICAgICBwZ19zcF9lbmFibGVkICYmIHZtX3Jlc2Vydl9sZXZlbF9p
ZmZ1bGxwb3AobSkgPT0gMCkKKyAgICAgICAgICAgICAgICBwbWFwX3Byb21vdGVfcGRlKHBtYXAs
IHBkZSwgdmEsICZsb2NrKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTeW5jIEkgJiBEIGNh
Y2hlcyBmb3IgZXhlY3V0YWJsZSBwYWdlcy4gIERvIHRoaXMgb25seSBpZiB0aGUKKyAgICAgICAg
ICogdGFyZ2V0IHBtYXAgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNl
LCBhbgorICAgICAgICAgKiB1bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgorICAgICAg
ICAgKi8KKyAgICAgICAgaWYgKCFpc19rZXJuZWxfcG1hcChwbWFwKSAmJiAocG1hcCA9PSAmY3Vy
cHJvYy0+cF92bXNwYWNlLT52bV9wbWFwKSAmJgorICAgICAgICAgICAgKHByb3QgJiBWTV9QUk9U
X0VYRUNVVEUpKSB7CisgICAgICAgICAgICAgICAgbWlwc19pY2FjaGVfc3luY19yYW5nZSh2YSwg
UEFHRV9TSVpFKTsKKyAgICAgICAgICAgICAgICBtaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwg
UEFHRV9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jayAhPSBOVUxMKQorICAgICAg
ICAgICAgICAgIHJ3X3d1bmxvY2sobG9jayk7CisgICAgICAgIHJ3X3J1bmxvY2soJnB2aF9nbG9i
YWxfbG9jayk7CisgICAgICAgIFBNQVBfVU5MT0NLKHBtYXApOworICAgICAgICByZXR1cm4gKEtF
Uk5fU1VDQ0VTUyk7Cit9CisKKy8qCisgKiB0aGlzIGNvZGUgbWFrZXMgc29tZSAqTUFKT1IqIGFz
c3VtcHRpb25zOgorICogMS4gQ3VycmVudCBwbWFwICYgcG1hcCBleGlzdHMuCisgKiAyLiBOb3Qg
d2lyZWQuCisgKiAzLiBSZWFkIGFjY2Vzcy4KKyAqIDQuIE5vIHBhZ2UgdGFibGUgcGFnZXMuCisg
KiBidXQgaXMgKk1VQ0gqIGZhc3RlciB0aGFuIHBtYXBfZW50ZXIuLi4KKyAqLwordm9pZAorcG1h
cF9lbnRlcl9xdWljayhwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2
bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCisJbG9jayA9IE5VTEw7
CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCSh2b2lk
KXBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LCBOVUxMLCAmbG9jayk7
CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZw
dmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCitzdGF0aWMgdm1fcGFn
ZV90CitwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEs
IHZtX3BhZ2VfdCBtLAorICAgIHZtX3Byb3RfdCBwcm90LCB2bV9wYWdlX3QgbXB0ZSwgc3RydWN0
IHJ3bG9jayAqKmxvY2twKQoreworCXB0X2VudHJ5X3QgKnB0ZSwgbmV3cHRlOworCXZtX3BhZGRy
X3QgcGE7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKworCUtBU1NFUlQodmEgPCBrbWkuY2xlYW5f
c3ZhIHx8IHZhID49IGttaS5jbGVhbl9ldmEgfHwKKwkgICAgKG0tPm9mbGFncyAmIFZQT19VTk1B
TkFHRUQpICE9IDAsCisJICAgICgiJXM6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhlIGNsZWFu
IHN1Ym1hcCIsIF9fZnVuY19fKSk7CisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xP
Q0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwkvKgorCSAqIElu
IHRoZSBjYXNlIHRoYXQgYSBwYWdlIHRhYmxlIHBhZ2UgaXMgbm90IHJlc2lkZW50LCB3ZSBhcmUK
KwkgKiBjcmVhdGluZyBpdCBoZXJlLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVT
UykgeworCQlwZF9lbnRyeV90ICpwZGU7CisJCXVuc2lnbmVkIHB0ZXBpbmRleDsKKworCQkvKgor
CQkgKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXgKKwkJICovCisJCXB0ZXBpbmRleCA9
IHBtYXBfcGRlX3BpbmRleCh2YSk7CisJCWlmIChtcHRlICYmIChtcHRlLT5waW5kZXggPT0gcHRl
cGluZGV4KSkgeworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyoKKwkJ
CSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkJCSAqLworCQkJcGRlID0gcG1hcF9w
ZGUocG1hcCwgdmEpOworCisJCQkvKgorCQkJICogSWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBt
YXBwZWQsIHdlIGp1c3QKKwkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudCwgYW5kIGFjdGl2
YXRlIGl0LgorCQkJICovCisJCQlpZiAocGRlICYmICpwZGUgIT0gMCkgeworCQkJCWlmIChwZGVf
aXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQkJCXJldHVybiAoTlVMTCk7CisJCQkJbXB0ZSA9IFBI
WVNfVE9fVk1fUEFHRSgKKwkJCQkgICAgTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7CisJCQkJ
bXB0ZS0+d2lyZV9jb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFBhc3MgTlVM
TCBpbnN0ZWFkIG9mIHRoZSBQViBsaXN0IGxvY2sKKwkJCQkgKiBwb2ludGVyLCBiZWNhdXNlIHdl
IGRvbid0IGludGVuZCB0byBzbGVlcC4KKwkJCQkgKi8KKwkJCQltcHRlID0gX3BtYXBfYWxsb2Nw
dGUocG1hcCwgcHRlcGluZGV4LCBOVUxMKTsKKwkJCQlpZiAobXB0ZSA9PSBOVUxMKQorCQkJCQly
ZXR1cm4gKG1wdGUpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbXB0ZSA9IE5VTEw7CisJfQor
CisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOworCWlmIChwdGVfaXNfdmFsaWQocHRlKSkgewor
CQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQltcHRlLT53aXJlX2NvdW50LS07CisJCQltcHRlID0g
TlVMTDsKKwkJfQorCQlyZXR1cm4gKG1wdGUpOworCX0KKworCS8qCisJICogRW50ZXIgb24gdGhl
IFBWIGxpc3QgaWYgcGFydCBvZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisJICovCisJaWYgKChtLT5v
ZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwICYmCisJICAgICFwbWFwX3RyeV9pbnNlcnRfcHZf
ZW50cnkocG1hcCwgdmEsIG0sIGxvY2twKSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQlT
TElTVF9JTklUKCZmcmVlKTsKKwkJCWlmIChwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEsIG1wdGUs
ICZmcmVlKSkgeworCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQlwbWFw
X2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQl9CisKKwkJCW1wdGUgPSBOVUxMOworCQl9CisJ
CXJldHVybiAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBJbmNyZW1lbnQgY291bnRlcnMKKwkgKi8K
KwlwbWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCAxKTsKKworCXBhID0gVk1fUEFHRV9UT19Q
SFlTKG0pOworCisJLyoKKwkgKiBOb3cgdmFsaWRhdGUgbWFwcGluZyB3aXRoIFJPIHByb3RlY3Rp
b24KKwkgKi8KKwluZXdwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX1ZB
TElEOworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkKKwkJbmV3cHRlIHw9
IFBURV9NQU5BR0VEOworCisJaWYgKGlzX2NhY2hlYWJsZV9tZW0ocGEpKSB7CisJCWlmIChtLT5t
ZC5wdl9tZW1hdHRyID09IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisJCQluZXdwdGUgfD0gUFRF
X0NfVU5DQUNIRUQ7CisJCWVsc2UKKwkJCW5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKwl9IGVsc2UK
KwkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCisJc2NoZWRfcGluKCk7CisJaWYgKGlzX2tl
cm5lbF9wbWFwKHBtYXApKSB7CisJCW5ld3B0ZSB8PSBQVEVfRzsKKwkJcHRlX3JlZl9zZXQoJm5l
d3B0ZSk7CisJCXB0ZV9zdG9yZShwdGUsIG5ld3B0ZSk7CisJfSBlbHNlIHsKKwkJcHRlX3N0b3Jl
KHB0ZSwgbmV3cHRlKTsKKwkJLyoKKwkJICogU3luYyBJICYgRCBjYWNoZXMuICBEbyB0aGlzIG9u
bHkgaWYgdGhlIHRhcmdldCBwbWFwCisJCSAqIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcHJvY2Vz
cy4gIE90aGVyd2lzZSwgYW4KKwkJICogdW5yZXNvbHZhYmxlIFRMQiBtaXNzIG1heSBvY2N1ci4K
KwkJICovCisJCWlmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXApIHsKKwkJ
CXZhICY9IH5QQUdFX01BU0s7CisJCQltaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBQQUdFX1NJ
WkUpOworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisJCX0KKwl9
CisJc2NoZWRfdW5waW4oKTsKKworCXJldHVybiAobXB0ZSk7Cit9CisKKy8qCisgKiBNYWtlIGEg
dGVtcG9yYXJ5IG1hcHBpbmcgZm9yIGEgcGh5c2ljYWwgYWRkcmVzcy4gIFRoaXMgaXMgb25seSBp
bnRlbmRlZAorICogdG8gYmUgdXNlZCBmb3IgcGFuaWMgZHVtcHMuCisgKgorICogVXNlIFhLUEhZ
UyBmb3IgNjQgYml0LgorICovCit2b2lkICoKK3BtYXBfa2VudGVyX3RlbXBvcmFyeSh2bV9wYWRk
cl90IHBhLCBpbnQgaSkKK3sKKworCWlmIChpICE9IDApCisJCXByaW50ZigiJXM6IEVSUk9SISEh
IE1vcmUgdGhhbiBvbmUgcGFnZSBvZiB2aXJ0dWFsIGFkZHJlc3MgIgorCQkgICAgIm1hcHBpbmcg
bm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuICgodm9pZCAqKU1JUFNfUEhZ
U19UT19ESVJFQ1QocGEpKTsKK30KKwordm9pZAorcG1hcF9rZW50ZXJfdGVtcG9yYXJ5X2ZyZWUo
dm1fcGFkZHJfdCBwYSkKK3sKKworCS8qIG5vdGhpbmcgdG8gZG8gZm9yIG1pcHM2NCAqLworCXJl
dHVybjsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3BkZShwbWFwX3QgcG1hcCwg
dm1fb2Zmc2V0X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwl2bV9waW5kZXhfdCBw
ZHBpbmRleCwgcHRlcGluZGV4OworCXBkX2VudHJ5X3QgKnBkcGU7CisJdm1fcGFnZV90IG1wdGUg
PSBOVUxMOworCisJaWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKSB7CityZXRyeToKKwkJcGRw
ZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJaWYgKHBkcGUgIT0gTlVMTCAmJiAoKnBkcGUg
IT0gTlVMTCkpIHsKKwkJCS8qIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgcGQgcGFnZS4gKi8KKwkJ
CW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRwZSkpOworCQkJ
bXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyogQWxsb2NhdGUgYSBwZCBwYWdl
LiAqLworCisJCQkvKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXguICovCisJCQlwdGVw
aW5kZXggPSBwbWFwX3BkZV9waW5kZXgodmEpOworCQkJcGRwaW5kZXggPSBwdGVwaW5kZXggPj4g
TlBERVBHU0hJRlQ7ICAvKiBYWFggKi8KKwkJCW1wdGUgPSBfcG1hcF9hbGxvY3B0ZShwbWFwLCBO
VVBERSArIHBkcGluZGV4LCBsb2NrcCk7CisJCQlpZiAobXB0ZSA9PSBOVUxMICYmIGxvY2twICE9
IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gKG1wdGUpOworfQorCisv
KgorICogVHJpZXMgdG8gY3JlYXRlIGEgMk1CIHBhZ2UgbWFwcGluZy4gIFJldHVybnMgVFJVRSBp
ZiBzdWNjZXNzZnVsIGFuZCBGQUxTRQorICogb3RoZXJ3aXNlLiAgRmFpbHMgaWYgKDEpIGEgcGFn
ZSB0YWJsZSBwYWdlIGNhbm5vdCBiZSBhbGxvY2F0ZWQgd2l0aG91dAorICogYmxvY2tpbmcsICgy
KSBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgYXQgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJl
c3MsIG9yCisgKiAoMykgYSBwdiBlbnRyeSBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVj
bGFpbWluZyBhbm90aGVyIHB2IGVudHJ5LgorICovCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX2Vu
dGVyX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2bV9wcm90
X3QgcHJvdCwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJcGRfZW50cnlfdCAqcGRl
OworCXB0X2VudHJ5X3QgbmV3cGRlOworCXZtX3BhZ2VfdCBtcGRlOworCXN0cnVjdCBzcGdsaXN0
IGZyZWU7CisJdm1fcGFkZHJfdCBwYTsKKworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ss
IFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwlpZiAo
aXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJLyogTm90IGRvaW5nIHRoZSBrZXJuZWwgcG1hcCBm
b3Igbm93ICovCisJCUNUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBw
bWFwICVwOiBrZXJuZWwgbWFwIiwKKwkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJCXJldHVy
biAoRkFMU0UpOworCX0KKwlpZiAoKG1wZGUgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIHZhLCBOVUxM
KSkgPT0gTlVMTCkgeworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUjbHgg
aW4gcG1hcCAlcCIsCisJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm4gKEZBTFNF
KTsKKwl9CisJLyogcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOyAqLworCXBkZSA9IChwZF9lbnRy
eV90ICopTUlQU19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobXBkZSkpOworCXBkZSA9
ICZwZGVbcG1hcF9wZGVfaW5kZXgodmEpXTsKKwlpZiAocGRlID09IE5VTEwpIHsKKwkJS0FTU0VS
VChtcGRlLT53aXJlX2NvdW50ID4gMSwKKwkJICAgICgiJXM6IG1wZGUncyB3aXJlIGNvdW50IGlz
IHRvbyBsb3ciLCBfX2Z1bmNfXykpOworCQltcGRlLT53aXJlX2NvdW50LS07CisJCUNUUjMoS1RS
X1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5jX18sCisJ
CSAgICB2YSwgcG1hcCk7CisJCXJldHVybiAoRkFMU0UpOworCX0KKwlwYSA9IFZNX1BBR0VfVE9f
UEhZUyhtKTsKKyAgICAgICAgbmV3cGRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZOKHBhKSB8
IFBURV9WQUxJRCB8IFBURV9QU18xTTsKKwlpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkpIHsKKwkJ
aWYgKG0tPm1kLnB2X21lbWF0dHIgPT0gVk1fTUVNQVRUUl9VTkNBQ0hFQUJMRSkKKwkJCW5ld3Bk
ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKwkJZWxzZQorCQkJbmV3cGRlIHw9IFBURV9DX0NBQ0hFOwor
CX0gZWxzZQorCQluZXdwZGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisJaWYgKChtLT5vZmxhZ3MgJiBW
UE9fVU5NQU5BR0VEKSA9PSAwKSB7CisJCW5ld3BkZSB8PSBQVEVfTUFOQUdFRDsKKworCQkvKgor
CQkgKiBBYm9ydCB0aGlzIG1hcHBpbmcgaWYgaXRzIFBWIGVudHJ5IGNvdWxkIG5vdCBiZSBjcmVh
dGVkLgorCQkgKi8KKwkJaWYgKCFwbWFwX3B2X2luc2VydF9wZGUocG1hcCwgdmEsIFZNX1BBR0Vf
VE9fUEhZUyhtKSwKKwkJICAgIGxvY2twKSkgeworCQkJU0xJU1RfSU5JVCgmZnJlZSk7CisJCQlp
ZiAocG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtcGRlLCAmZnJlZSkpIHsKKwkJCQlwbWFwX2lu
dmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMoJmZyZWUp
OworCQkJfQorCQkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBt
YXAgJXAiLAorCQkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJCQlyZXR1cm4gKEZBTFNFKTsK
KwkJfQorCX0KKworCS8qCisJICogSW5jcmVtZW50IGNvdW50ZXJzLgorCSAqLworCSBwbWFwX3Jl
c2lkZW50X2NvdW50X2luYyhwbWFwLCBOQlBEUiAvIFBBR0VfU0laRSk7CisKKwkgLyoKKwkgICog
TWFwIHRoZSBzdXBlcnBhZ2UuCisJICAqLworCSBzY2hlZF9waW4oKTsKKwkgcGRlX3N0b3JlKHBk
ZSwgbmV3cGRlKTsKKworCS8qCisJICogU3luYyBJICYgRCBjYWNoZXMgZm9yIGV4ZWN1dGFibGUg
cGFnZXMuICBEbyB0aGlzIG9ubHkgaWYgdGhlCisJICogdGFyZ2V0IHBtYXAgYmVsb25ncyB0byB0
aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBhbgorCSAqIHVucmVzb2x2YWJsZSBUTEIg
bWlzcyBtYXkgb2NjdXIuCisJICovCisJIGlmICghaXNfa2VybmVsX3BtYXAocG1hcCkgJiYgKHBt
YXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYKKwkgICAgIChwcm90ICYgVk1f
UFJPVF9FWEVDVVRFKSkgeworCQkJIHZhICY9IH5QRFJNQVNLOworCQkJIG1pcHNfaWNhY2hlX3N5
bmNfcmFuZ2UodmEsIE5CUERSKTsKKwkJCSBtaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgTkJQ
RFIpOworCisJIH0KKwkgc2NoZWRfdW5waW4oKTsKKworCSBhdG9taWNfYWRkX2xvbmcoJnBtYXBf
cGRlX21hcHBpbmdzLCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAl
I2x4IGluIHBtYXAgJXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKwkgcmV0dXJuIChU
UlVFKTsKK30KKworLyoKKyAqIE1hcHMgYSBzZXF1ZW5jZSBvZiByZXNpZGVudCBwYWdlcyBiZWxv
bmdpbmcgdG8gdGhlIHNhbWUgb2JqZWN0LgorICogVGhlIHNlcXVlbmNlIGJlZ2lucyB3aXRoIHRo
ZSBnaXZlbiBwYWdlIG1fc3RhcnQuICBUaGlzIHBhZ2UgaXMKKyAqIG1hcHBlZCBhdCB0aGUgZ2l2
ZW4gdmlydHVhbCBhZGRyZXNzIHN0YXJ0LiAgRWFjaCBzdWJzZXF1ZW50IHBhZ2UgaXMKKyAqIG1h
cHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyB0aGF0IGlzIG9mZnNldCBmcm9tIHN0YXJ0IGJ5IHRo
ZSBzYW1lCisgKiBhbW91bnQgYXMgdGhlIHBhZ2UgaXMgb2Zmc2V0IGZyb20gbV9zdGFydCB3aXRo
aW4gdGhlIG9iamVjdC4gIFRoZQorICogbGFzdCBwYWdlIGluIHRoZSBzZXF1ZW5jZSBpcyB0aGUg
cGFnZSB3aXRoIHRoZSBsYXJnZXN0IG9mZnNldCBmcm9tCisgKiBtX3N0YXJ0IHRoYXQgY2FuIGJl
IG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyBsZXNzIHRoYW4gdGhlIGdpdmVuCisgKiB2aXJ0
dWFsIGFkZHJlc3MgZW5kLiAgTm90IGV2ZXJ5IHZpcnR1YWwgcGFnZSBiZXR3ZWVuIHN0YXJ0IGFu
ZCBlbmQKKyAqIGlzIG1hcHBlZDsgb25seSB0aG9zZSBmb3Igd2hpY2ggYSByZXNpZGVudCBwYWdl
IGV4aXN0cyB3aXRoIHRoZQorICogY29ycmVzcG9uZGluZyBvZmZzZXQgZnJvbSBtX3N0YXJ0IGFy
ZSBtYXBwZWQuCisgKi8KK3ZvaWQKK3BtYXBfZW50ZXJfb2JqZWN0KHBtYXBfdCBwbWFwLCB2bV9v
ZmZzZXRfdCBzdGFydCwgdm1fb2Zmc2V0X3QgZW5kLAorICAgIHZtX3BhZ2VfdCBtX3N0YXJ0LCB2
bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZh
OworCXZtX3BhZ2VfdCBtLCBtcHRlOworCXZtX3BpbmRleF90IGRpZmYsIHBzaXplOworCisJVk1f
T0JKRUNUX0FTU0VSVF9MT0NLRUQobV9zdGFydC0+b2JqZWN0KTsKKworCXBzaXplID0gYXRvcChl
bmQgLSBzdGFydCk7CisJbXB0ZSA9IE5VTEw7CisJbSA9IG1fc3RhcnQ7CisJbG9jayA9IE5VTEw7
CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCXdoaWxl
IChtICE9IE5VTEwgJiYgKGRpZmYgPSBtLT5waW5kZXggLSBtX3N0YXJ0LT5waW5kZXgpIDwgcHNp
emUpIHsKKwkJdmEgPSBzdGFydCArIHB0b2EoZGlmZik7CisJCWlmICgodmEgJiBQRFJNQVNLKSA9
PSAwICYmIHZhICsgTkJQRFIgPD0gZW5kICYmCisJCSAgICBtLT5wc2luZCA9PSAxICYmIHBnX3Nw
X2VuYWJsZWQgJiYKKwkJICAgIHBtYXBfZW50ZXJfcGRlKHBtYXAsIHZhLCBtLCBwcm90LCAmbG9j
aykpCisJCQltID0gJm1bTkJQRFIgLyBQQUdFX1NJWkUgLSAxXTsKKwkJZWxzZQorCQkJbXB0ZSA9
IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LAorCQkJICAgIG1wdGUs
ICZsb2NrKTsKKwkJbSA9IFRBSUxRX05FWFQobSwgbGlzdHEpOworCX0KKwlpZiAobG9jayAhPSBO
VUxMKQorCQlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7
CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKiBwbWFwX29iamVjdF9pbml0X3B0IHBy
ZWxvYWRzIHRoZSBwdGVzIGZvciBhIGdpdmVuIG9iamVjdAorICogaW50byB0aGUgc3BlY2lmaWVk
IHBtYXAuICBUaGlzIGVsaW1pbmF0ZXMgdGhlIGJsYXN0IG9mIHNvZnQKKyAqIGZhdWx0cyBvbiBw
cm9jZXNzIHN0YXJ0dXAgYW5kIGltbWVkaWF0ZWx5IGFmdGVyIGEgbW1hcCgpLgorICoKKyAqIFRo
aXMgY29kZSBtYXBzIGxhcmdlIHBoeXNpY2FsIG1tYXAgcmVnaW9ucyBpbnRvIHRoZQorICogcHJv
Y2Vzc29yIGFkZHJlc3Mgc3BhY2UuIE5vdGUgdGhhdCBzb21lIHNob3J0Y3V0cworICogYXJlIHRh
a2VuLCBidXQgdGhlIGNvZGUgd29ya3MuCisgKi8KK3ZvaWQKK3BtYXBfb2JqZWN0X2luaXRfcHQo
cG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX29iamVjdF90IG9iamVjdCwKKyAgICB2
bV9waW5kZXhfdCBwaW5kZXgsIHZtX3NpemVfdCBzaXplKQoreworCXBkX2VudHJ5X3QgKnBkZTsK
Kwl2bV9wYWRkcl90IHBhLCBwdGVwYTsKKwl2bV9wYWdlX3QgcCwgcGRwZzsKKwl2bV9tZW1hdHRy
X3QgbWVtYXR0cjsKKworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChvYmplY3QpOworCUtBU1NF
UlQob2JqZWN0LT50eXBlID09IE9CSlRfREVWSUNFIHx8IG9iamVjdC0+dHlwZSA9PSBPQkpUX1NH
LAorCSAgICAoInBtYXBfb2JqZWN0X2luaXRfcHQ6IG5vbi1kZXZpY2Ugb2JqZWN0IikpOworCisJ
aWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIE5vdCBkb2luZyB0aGUga2VybmVsIHBt
YXAgZm9yIG5vdy4gKi8KKwkJcmV0dXJuOworCX0KKworCWlmICgoYWRkciAmIChOQlBEUiAtIDEp
KSA9PSAwICYmIChzaXplICYgKE5CUERSIC0gMSkpID09IDApIHsKKwkJaWYgKCFwZ19zcF9lbmFi
bGVkKQorCQkJcmV0dXJuOworCQlpZiAoIXZtX29iamVjdF9wb3B1bGF0ZShvYmplY3QsIHBpbmRl
eCwgcGluZGV4ICsgYXRvcChzaXplKSkpCisJCQlyZXR1cm47CisJCXAgPSB2bV9wYWdlX2xvb2t1
cChvYmplY3QsIHBpbmRleCk7CisJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFHRV9CSVRTX0FM
TCwKKwkJICAgICgiJXM6IGludmFsaWQgcGFnZSAlcCIsIF9fZnVuY19fLCBwKSk7CisJCW1lbWF0
dHIgPSBwLT5tZC5wdl9tZW1hdHRyOworCisJCS8qCisJCSAqIEFib3J0IHRoZSBtYXBwaW5nIGlm
IHRoZSBmaXJzdCBwYWdlIGlzIG5vdCBwaHlzaWNhbGx5CisJCSAqIGFsaWduZWQgdG8gYSAyTUIg
cGFnZSBib3VuZGFyeS4KKwkJICovCisJCXB0ZXBhID0gVk1fUEFHRV9UT19QSFlTKHApOworCQlp
ZiAocHRlcGEgJiAoTkJQRFIgLSAxKSkKKwkJCXJldHVybjsKKworCQkvKgorCQkgKiBTa2lwIHRo
ZSBmaXJzdCBwYWdlLiBBYm9ydCB0aGUgbWFwcGluZyBpZiB0aGUgcmVzdCBvZgorCQkgKiB0aGUg
cGFnZXMgYXJlIG5vdCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgb3IgaGF2ZSBkaWZmZXJpbmcKKwkJ
ICogbWVtb3J5IGF0dHJpYnV0ZXMuCisJCSAqLworCQlwID0gVEFJTFFfTkVYVChwLCBsaXN0cSk7
CisJCWZvciAocGEgPSBwdGVwYSArIFBBR0VfU0laRTsgcGEgPCBwdGVwYSArIHNpemU7CisJCSAg
ICBwYSArPSBQQUdFX1NJWkUpIHsKKwkJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFHRV9CSVRT
X0FMTCwKKwkJCSAgICAoIiVzOiBpbnZhbGlkIHBhZ2UgJXAiLCBfX2Z1bmNfXywgcCkpOworCQkJ
aWYgKHBhICE9IFZNX1BBR0VfVE9fUEhZUyhwKSB8fAorCQkJICAgIG1lbWF0dHIgIT0gcC0+bWQu
cHZfbWVtYXR0cikKKwkJCQlyZXR1cm47CisJCQlwID0gVEFJTFFfTkVYVChwLCBsaXN0cSk7CisJ
CX0KKworCQkvKgorCQkgKiBNYXAgdXNpbmcgMk1CIHBhZ2VzLiAgInB0ZXBhIiBpcyAyTSBhbGln
bmVkIGFuZCAic2l6ZSIKKwkJICogaXMgYSBtdWx0aXBsZSBvZiAyTS4KKwkJICovCisJCVBNQVBf
TE9DSyhwbWFwKTsKKwkJZm9yIChwYSA9IHB0ZXBhOyBwYSA8IHB0ZXBhICsgc2l6ZTsgcGEgKz0g
TkJQRFIpIHsKKwkJCXBkcGcgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIGFkZHIsIE5VTEwpOworCQkJ
aWYgKHBkcGcgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogVGhlIGNyZWF0aW9uIG9mIG1hcHBp
bmdzIGJlbG93IGlzIG9ubHkgYW4KKwkJCQkgKiBvcHRpbWl6YXRpb24uICBJZiBhIHBhZ2UgZGly
ZWN0b3J5IHBhZ2UKKwkJCQkgKiBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhvdXQgYmxvY2tpbmcs
CisJCQkJICogY29udGludWUgb24gdG8gdGhlIG5leHQgbWFwcGluZyByYXRoZXIgdGhhbgorCQkJ
CSAqIGJsb2NraW5nLgorCQkJCSAqLworCQkJCWFkZHIgKz0gTkJQRFI7CisJCQkJY29udGludWU7
CisJCQl9CisJCQlwZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkg
ICAgVk1fUEFHRV9UT19QSFlTKHBkcGcpKTsKKwkJCXBkZSA9ICZwZGVbcG1hcF9wZGVfaW5kZXgo
YWRkcildOworCQkJaWYgKCFwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZGUpKSB7CisJCQkJ
cHRfZW50cnlfdCBuZXdwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwKKwkJCQkgICAgUFRFX1BT
XzFNIHwgUFRFX0QgfCBQVEVfUkVGIHwgUFRFX1ZBTElEOworCisJCQkJaWYgKGlzX2NhY2hlYWJs
ZV9tZW0ocGEpKSB7CisJCQkJCWlmIChwZHBnLT5tZC5wdl9tZW1hdHRyID09CisJCQkJCSAgICBW
TV9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorCQkJCQkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOwor
CQkJCQllbHNlCisJCQkJCQluZXdwdGUgfD0gUFRFX0NfQ0FDSEU7CisJCQkJfSBlbHNlCisJCQkJ
CW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKworCQkJCXBkZV9zdG9yZShwZGUsIG5ld3B0ZSk7
CisJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgTkJQRFIvUEFHRV9TSVpFKTsKKwkJ
CQlhdG9taWNfYWRkX2xvbmcoJnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkJCX0gZWxzZSB7CisJ
CQkJLyogQ29udGludWUgb24gaWYgdGhlIFBERSBpcyBhbHJlYWR5IHZhbGlkLiAqLworCQkJCXBk
cGctPndpcmVfY291bnQtLTsKKwkJCQlLQVNTRVJUKHBkcGctPndpcmVfY291bnQgPiAwLAorCQkJ
CSAgICAoIiVzOiBtaXNzaW5nIHJlZmVyZW5jZSB0byBwYWdlIGRpcmVjdG9yeSAiCisJCQkJICAg
ICJwYWdlLCB2YTogMHglbHgiLCBfX2Z1bmNfXywgYWRkcikpOworCQkJfQorCQkJYWRkciArPSBO
QlBEUjsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9Cit9CisKKy8qCisgKglDbGVhciB0
aGUgd2lyZWQgYXR0cmlidXRlIGZyb20gdGhlIG1hcHBpbmdzIGZvciB0aGUgc3BlY2lmaWVkIHJh
bmdlIG9mCisgKglhZGRyZXNzZXMgaW4gdGhlIGdpdmVuIHBtYXAuICBFdmVyeSB2YWxpZCBtYXBw
aW5nIHdpdGhpbiB0aGF0IHJhbmdlCisgKgltdXN0IGhhdmUgdGhlIHdpcmVkIGF0dHJpYnV0ZSBz
ZXQuICBJbiBjb250cmFzdCwgaW52YWxpZCBtYXBwaW5ncworICoJY2Fubm90IGhhdmUgdGhlIHdp
cmVkIGF0dHJpYnV0ZSBzZXQsIHNvIHRoZXkgYXJlIGlnbm9yZWQuCisgKgorICoJVGhlIHdpcmVk
IGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyeSBpcyBub3QgYSBoYXJkd2FyZSBmZWF0
dXJlLAorICoJc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbnZhbGlkYXRlIGFueSBUTEIgZW50cmll
cy4KKyAqLwordm9pZAorcG1hcF91bndpcmUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2YSwg
dm1fb2Zmc2V0X3QgZXZhKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlf
dCAqcHRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisJYm9vbGVhbl90IHB2X2xpc3RzX2xvY2tl
ZDsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNFOworcmVzdW1lOgorCVBNQVBfTE9DSyhwbWFw
KTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCXBkcGUgPSBwbWFwX3Nl
Z21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gTlVMTCkgeworCQkJdmFfbmV4dCA9IChz
dmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJCXZhX25l
eHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAm
IH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisJCXBk
ZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKwkJaWYgKCpwZGUgPT0gTlVMTCkKKwkJ
CWNvbnRpbnVlOworCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlpZiAoIXBk
ZV90ZXN0KHBkZSwgUFRFX1cpKQorCQkJCXBhbmljKCJwbWFwX3Vud2lyZTogcGRlICUjanggaXMg
bWlzc2luZyBQVEVfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnBkZSk7CisJCQkvKgorCQkJICog
QXJlIHdlIHVud2lyaW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJCQkgKiBkZW1v
dGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYgKHN2YSArIE5C
UERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQlhdG9taWNfY2xlYXJfbG9u
ZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1cpOworCQkJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2Nv
dW50IC09IE5CUERSIC8gUEFHRV9TSVpFOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJ
CQlpZiAoIXB2X2xpc3RzX2xvY2tlZCkgeworCQkJCQlwdl9saXN0c19sb2NrZWQgPSBUUlVFOwor
CQkJCQlpZiAoIXJ3X3RyeV9ybG9jaygmcHZoX2dsb2JhbF9sb2NrKSkgeworCQkJCQkJIFBNQVBf
VU5MT0NLKHBtYXApOworCQkJCQkJIHJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCQkJCQkJ
IC8qIFJlcGVhdCBzdmEuICovCisJCQkJCQkgZ290byByZXN1bWU7CisJCQkJCX0KKwkJCQl9CisJ
CQkJaWYgKCFwbWFwX2RlbW90ZV9wZGUocG1hcCwgcGRlLCBzdmEpKQorCQkJCQlwYW5pYygicG1h
cF91bndpcmU6IGRlbW90aW9uIGZhaWxlZCIpOworCQkJfQorCQl9CisJCWlmICh2YV9uZXh0ID4g
ZXZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRl
LCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7
CisJCQlpZiAoIXB0ZV9pc192YWxpZChwdGUpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFwdGVf
dGVzdChwdGUsIFBURV9XKSkKKwkJCQlwYW5pYygicG1hcF91bndpcmU6IHB0ZSAlI2p4IGlzIG1p
c3NpbmcgUEdfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnB0ZSk7CisJCQkvKgorCQkJICogUFRF
X1cgbXVzdCBiZSBjbGVhcmVkIGF0b21pY2FsbHkuICBBbHRob3VnaCB0aGUgcG1hcAorCQkJICog
bG9jayBzeW5jaHJvbml6ZXMgYWNjZXNzIHRvIFBURV9XLCBhbm90aGVyIHByb2Nlc3NvcgorCQkJ
ICogY291bGQgYmUgc2V0dGluZyBQVEVfRCBhbmQvb3IgUFRFX1JFRiBjb25jdXJyZW50bHkuCisJ
CQkgKi8KKwkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfVyk7CisJCQlwbWFwLT5wbV9zdGF0
cy53aXJlZF9jb3VudC0tOworCQl9CisJfQorCWlmIChwdl9saXN0c19sb2NrZWQpIHsKKwkJcndf
cnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisK
Ky8qCisgKglDb3B5IHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgc3JjX2FkZHIvbGVuCisgKglmcm9t
IHRoZSBzb3VyY2UgbWFwIHRvIHRoZSByYW5nZSBkc3RfYWRkci9sZW4KKyAqCWluIHRoZSBkZXN0
aW5hdGlvbiBtYXAuCisgKgorICoJVGhpcyByb3V0aW5lIGlzIG9ubHkgYWR2aXNvcnkgYW5kIG5l
ZWQgbm90IGRvIGFueXRoaW5nLgorICovCisKK3ZvaWQKK3BtYXBfY29weShwbWFwX3QgZHN0X3Bt
YXAsIHBtYXBfdCBzcmNfcG1hcCwgdm1fb2Zmc2V0X3QgZHN0X2FkZHIsCisgICAgdm1fc2l6ZV90
IGxlbiwgdm1fb2Zmc2V0X3Qgc3JjX2FkZHIpCit7CisjaWYgMAorLyoKKyAqIFhYWCBUaGlzIGRv
ZXNuJ3QgaGVscCB3aXRoIGZvcmsoKSBwZXJmb3JtYW5jZSBhbmQKKyAqIGFkZHMgbW9yZSBvdmVy
aGVhZC4gIE1heWJlIHRoZSByZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorICogaXMgY2F1c2luZyBm
YXVsdC1saWtlIG92ZXJoZWFkIGFueXdheT8KKyAqLworCisJc3RydWN0IHJ3bG9jayAqbG9jazsK
KwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX29mZnNldF90IGFkZHIsIGVuZF9hZGRyLCB2YV9u
ZXh0OworCisJaWYgKGRzdF9hZGRyICE9IHNyY19hZGRyKQorCQlyZXR1cm47CisKKwlpZiAoUENQ
VV9HRVQoY3VycG1hcCkgIT0gc3JjX3BtYXApCisJCXJldHVybjsKKworCWVuZF9hZGRyID0gc3Jj
X2FkZHIgKyBsZW47CisKKwlsb2NrID0gTlVMTDsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr
KTsKKwkvKiBMb2NrIHRoZSBwbWFwcyBpbiB0aGUgc2FtZSBvcmRlciB0byBhdm9pZCBkZWFkbG9j
ay4gKi8KKwlpZiAoZHN0X3BtYXAgPCBzcmNfcG1hcCkgeworCQlQTUFQX0xPQ0soZHN0X3BtYXAp
OworCQlQTUFQX0xPQ0soc3JjX3BtYXApOworCX0gZWxzZSB7CisJCVBNQVBfTE9DSyhzcmNfcG1h
cCk7CisJCVBNQVBfTE9DSyhkc3RfcG1hcCk7CisJfQorCisJZm9yIChhZGRyID0gc3JjX2FkZHI7
IGFkZHIgPCBlbmRfYWRkcjsgYWRkciA9IHZhX25leHQpIHsKKwkJcHRfZW50cnlfdCAqc3JjX3B0
ZSwgKmRzdF9wdGU7CisJCXZtX3BhZ2VfdCBkc3RtcGRlLCBkc3RtcHRlLCBzcmNtcHRlOworCQlw
ZF9lbnRyeV90ICpzcmNfcGRwZSwgKnNyY19wZGUsICpkc3RfcGRlOworCQlwdF9lbnRyeV90IHNy
Y3B0ZTsKKwkJdm1fcGFkZHJfdCBzcmNwYWRkcjsKKwkJdm1fcGFnZV90IG07CisKKworCQlzcmNf
cGRwZSA9IHBtYXBfc2VnbWFwKHNyY19wbWFwLCBhZGRyKTsKKwkJaWYgKHNyY19wZHBlID09IE5V
TEwgfHwgKnNyY19wZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoYWRkciArIE5CU0VHKSAmIH5T
RUdNQVNLOworCQkJLyoKKwkJCSAqIElmIHRoZSBuZXh0IHZhIGlzIG91dCBvZiB0aGUgY29weSBy
YW5nZSB0aGVuIHNldAorCQkJICogaXQgdG8gZW5kX2FkZHIgaW4gb3JkZXIgdG8gY29weSBhbGwg
bWFwcGluZ3MgdW50aWwKKwkJCSAqIGdpdmVuIGxpbWl0LgorCQkJICovCisJCQlpZiAodmFfbmV4
dCA8IGFkZHIpCisJCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCQkJY29udGludWU7CisJCX0KKwor
CQl2YV9uZXh0ID0gKGFkZHIgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25leHQgPCBh
ZGRyKQorCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCisJCXNyY19wZGUgPSBwbWFwX3BkcGVfdG9f
cGRlKHNyY19wZHBlLCBhZGRyKTsKKwkJaWYgKHNyY19wZGUgPT0gTlVMTCB8fCAqc3JjX3BkZSA9
PSAwKQorCQkJY29udGludWU7CisJCXNyY3B0ZSA9IChwdF9lbnRyeV90KSpzcmNfcGRlOworCisJ
CWlmIChwdGVfaXNfMW1fc3VwZXJwYWdlKCZzcmNwdGUpKSB7CisJCQkvKiBDb3B5IHN1cGVycGFn
ZSBwZGUuICovCisJCQlpZiAoKGFkZHIgJiBQRFJNQVNLKSAhPSAwIHx8IGFkZHIgKyBOQlBEUiA+
IGVuZF9hZGRyKQorCQkJCWNvbnRpbnVlOworCQkJZHN0bXBkZSA9IHBtYXBfYWxsb2NwZGUoZHN0
X3BtYXAsIGFkZHIsIE5VTEwpOworCQkJaWYgKGRzdG1wZGUgPT0gTlVMTCkKKwkJCQlicmVhazsK
KworCQkJLyogZHN0X3BkZSA9IHBtYXBfcGRlKGRzdF9wbWFwLCBhZGRyKTsgKi8KKwkJCWRzdF9w
ZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkgICAgVk1fUEFHRV9U
T19QSFlTKGRzdG1wZGUpKTsKKwkJCWRzdF9wZGUgPSAmZHN0X3BkZVtwbWFwX3BkZV9pbmRleChh
ZGRyKV07CisKKwkJCWlmICgqZHN0X3BkZSA9PSAwICYmCisJCQkgICAgKCFwdGVfdGVzdCgmc3Jj
cHRlLCBQVEVfTUFOQUdFRCkgfHwKKwkJCSAgICBwbWFwX3B2X2luc2VydF9wZGUoZHN0X3BtYXAs
IGFkZHIsCisJCQkgICAgVExCTE9fUFRFX1RPX1BBKHNyY3B0ZSksICZsb2NrKSkpIHsKKwkJCQkq
ZHN0X3BkZSA9IChwZF9lbnRyeV90KShzcmNwdGUgJiB+UFRFX1cpOworCQkJCXBtYXBfcmVzaWRl
bnRfY291bnRfaW5jKGRzdF9wbWFwLCBOQlBEUiAvCisJCQkJICAgIFBBR0VfU0laRSk7CisJCQl9
IGVsc2UKKwkJCQlkc3RtcGRlLT53aXJlX2NvdW50LS07CisJCQljb250aW51ZTsKKwkJfQorCisJ
CXNyY3BhZGRyID0gTUlQU19ESVJFQ1RfVE9fUEhZUygqc3JjX3BkZSk7CisJCXNyY21wdGUgPSBQ
SFlTX1RPX1ZNX1BBR0Uoc3JjcGFkZHIpOworCQlLQVNTRVJUKHNyY21wdGUtPndpcmVfY291bnQg
PiAwLAorCQkgICAgKCJwbWFwX2NvcHk6IHNvdXJjZSBwYWdlIHRhYmxlIHBhZ2UgaXMgdW51c2Vk
IikpOworCisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRo
ZSB2YWRkciByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgc291cmNlIHBhZ2UgdGFibGUgcGFnZSwg
b3IgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UKKwkJICogYmVpbmcgY29waWVkLgorCQkgKi8KKwkJ
aWYgKHZhX25leHQgPiBlbmRfYWRkcikKKwkJCXZhX25leHQgPSBlbmRfYWRkcjsKKworCQkvKgor
CQkgKiBXYWxrIHRoZSBzb3VyY2UgcGFnZSB0YWJsZSBlbnRyaWVzIGFuZCBjb3B5IHRoZSBtYW5h
Z2VkCisJCSAqIGVudHJpZXMuCisJCSAqLworCisJCS8qIHNyY19wdGUgPSBwbWFwX3BkZV90b19w
dGUoc3JjX3BkZSwgYWRkcik7ICovCisJCXNyY19wdGUgPSAocHRfZW50cnlfdCAqKU1JUFNfUEhZ
U19UT19ESVJFQ1Qoc3JjcGFkZHIpOworCQlzcmNfcHRlID0gJnNyY19wdGVbcG1hcF9wdGVfaW5k
ZXgoYWRkcildOworCisJCWlmIChzcmNfcHRlID09IE5VTEwgfHwgKnNyY19wdGUgPT0gMCkKKwkJ
CWNvbnRpbnVlOworCisJCWRzdG1wdGUgPSBOVUxMOworCQl3aGlsZSAoYWRkciA8IHZhX25leHQp
IHsKKwkJCXVuc2lnbmVkIHBkZXBpbmRleDsKKwkJCXB0X2VudHJ5X3QgcHRldGVtcDsKKworCisJ
CQlwdGV0ZW1wID0gKnNyY19wdGU7CisKKwkJCS8qCisJCQkgKiB3ZSBvbmx5IHZpcnR1YWwgY29w
eSBtYW5hZ2VkIHBhZ2VzCisJCQkgKi8KKwkJCWlmIChwdGVfdGVzdCgmcHRldGVtcCwgUFRFX01B
TkFHRUQpKSB7CisJCQkJLyogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4ICovCisJCQkJ
cGRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KGFkZHIpOworCisJCQkJLyogR2V0IHRoZSBwYWdl
IGRpcmVjdG9yeSBlbnRyeS4gKi8KKwkJCQlkc3RfcGRlID0gcG1hcF9wZGUoZHN0X3BtYXAsIGFk
ZHIpOworCisJCQkJaWYgKGRzdF9wZGUgIT0gTlVMTCAmJiAqZHN0X3BkZSAhPSAwKSB7CisJCQkJ
CWRzdG1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJCSAgICBNSVBTX0RJUkVDVF9UT19QSFlT
KCpkc3RfcGRlKSk7CisJCQkJfSBlbHNlCisJCQkJCWRzdG1wdGUgPSBOVUxMOworCisJCQkJaWYg
KGRzdG1wdGUgIT0gTlVMTCAmJgorCQkJCSAgICBkc3RtcHRlLT5waW5kZXggPT0gcGRlcGluZGV4
KSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBwYWdlIHRhYmxlIGlzIG1hcHBlZCBzbyBqdXN0CisJ
CQkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudC4KKwkJCQkJICovCisJCQkJCWRzdG1wdGUt
PndpcmVfY291bnQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBUaGUgcGFnZSB0
YWJsZSBpc24ndCBtYXBwZWQsIG9yIGl0CisJCQkJCSAqIGhhcyBiZWVuIGRlYWxsb2NhdGVkLgor
CQkJCQkgKi8KKwkJCQkJZHN0bXB0ZSA9IHBtYXBfYWxsb2NwdGUoZHN0X3BtYXAsCisJCQkJCSAg
ICBhZGRyLCBOVUxMKTsKKworCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSBhcmUgaGF2aW5nIG1lbW9y
eSBhbGxvYyBpc3N1ZXMKKwkJCQkJICogdGhlbiBhYmFuZG9uIHRyeWluZyB0byBjb3B5IHRoZSBw
YWdlCisJCQkJCSAqIHRhYmxlcy4KKwkJCQkJICovCisJCQkJCWlmIChkc3RtcHRlID09IE5VTEwp
CisJCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBOb3cgdGhhdCB3ZSBoYXZl
IGEgcGFnZSBkaXJlY3RvcnksIGdldCB0aGUKKwkJCQkgKiBwdGUuCisJCQkJICovCisKKwkJCQkv
KiBkc3RfcHRlID0gcG1hcF9wdGUoZHN0X3BtYXAsIGFkZHIpOyAqLworCQkJCWRzdF9wdGUgPSAo
cHRfZW50cnlfdCAqKQorCQkJCSAgICBNSVBTX1BIWVNfVE9fRElSRUNUKAorCQkJCQlWTV9QQUdF
X1RPX1BIWVMoZHN0bXB0ZSkpOworCQkJCWRzdF9wdGUgPSAmZHN0X3B0ZVtwbWFwX3B0ZV9pbmRl
eChhZGRyKV07CisKKwkJCQkvKiBUcnkgYW5kIGluc2VydCB0aGUgcHZfZW50cnkuICovCisJCQkJ
bSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QVEVfVE9fUEEocHRldGVtcCkpOworCQkJCWlmICgq
ZHN0X3B0ZSA9PSAwICYmCisJCQkJICAgIHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShkc3RfcG1h
cCwgYWRkciwgbSwKKwkJCQkgICAgJmxvY2spKSB7CisJCQkJCS8qCisJCQkJCSAqIFBvcHVsYXRl
IHRoZSBlbnRyeS4KKwkJCQkJICoKKwkJCQkJICogQ2xlYXIgdGhlIHdpcmVkLCBtb2RpZmllZCwg
YW5kCisJCQkJCSAqIGFjY2Vzc2VkIChyZWZlcmVuY2VkKSBiaXRzCisJCQkJCSAqIGR1cmluZyB0
aGUgY29weS4KKwkJCQkJICovCisJCQkJCXB0ZV9jbGVhcigmcHRldGVtcCwgUFRFX1cgfCBQVEVf
RCB8CisJCQkJCSAgICBQVEVfUkVGKTsKKwkJCQkJKmRzdF9wdGUgPSBwdGV0ZW1wOworCQkJCQkv
KiBVcGRhdGUgc3RhdHMuICovCisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfaW5jKGRzdF9wbWFw
LCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCQkJaWYgKHBt
YXBfdW53aXJlX3B0cChkc3RfcG1hcCwgYWRkciwKKwkJCQkJICAgIGRzdG1wdGUsICZmcmVlKSkg
eworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UoZHN0X3BtYXAsCisJCQkJCQkgICAgYWRkcik7
CisJCQkJCQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkJCX0KKwkJCQkJZ290byBv
dXQ7CisJCQkJfQorCQkJCS8qIENoZWNrIHRoZSB3aXJlX2NvdW50IHRvIHNlZSBpZiB3ZSdyZSBk
b25lLiAqLworCQkJCWlmIChkc3RtcHRlLT53aXJlX2NvdW50ID49IHNyY21wdGUtPndpcmVfY291
bnQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJYWRkciArPSBQQUdFX1NJWkU7CisJCQlzcmNfcHRl
Kys7CisJCX0KKwl9CitvdXQ6CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2Nr
KTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHNyY19wbWFw
KTsKKwlQTUFQX1VOTE9DSyhkc3RfcG1hcCk7CisjZW5kaWYgLyogI2lmIDAgKi8KK30KKworLyoK
KyAqCXBtYXBfemVyb19wYWdlIHplcm9zIHRoZSBzcGVjaWZpZWQgaGFyZHdhcmUgcGFnZSBieSBt
YXBwaW5nCisgKgl0aGUgcGFnZSBpbnRvIEtWTSBhbmQgdXNpbmcgYnplcm8gdG8gY2xlYXIgaXRz
IGNvbnRlbnRzLgorICoKKyAqIAlVc2UgWEtQSFlTIGZvciA2NCBiaXQuCisgKi8KK3ZvaWQKK3Bt
YXBfemVyb19wYWdlKHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNldF90IHZhOworCXZtX3BhZGRy
X3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RPX0RJUkVD
VChwaHlzKTsKKwlzY2hlZF9waW4oKTsKKwliemVybygoY2FkZHJfdCl2YSwgUEFHRV9TSVpFKTsK
KwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgUEFHRV9TSVpFKTsKKwlzY2hlZF91bnBpbigp
OworfQorCisvKgorICoJcG1hcF96ZXJvX3BhZ2VfYXJlYSB6ZXJvcyB0aGUgc3BlY2lmaWVkIGhh
cmR3YXJlIHBhZ2UgYnkgbWFwcGluZworICoJdGhlIHBhZ2UgaW50byBLVk0gYW5kIHVzaW5nIGJ6
ZXJvIHRvIGNsZWFyIGl0cyBjb250ZW50cy4KKyAqCisgKglvZmYgYW5kIHNpemUgbWF5IG5vdCBj
b3ZlciBhbiBhcmVhIGJleW9uZCBhIHNpbmdsZSBoYXJkd2FyZSBwYWdlLgorICovCit2b2lkCitw
bWFwX3plcm9fcGFnZV9hcmVhKHZtX3BhZ2VfdCBtLCBpbnQgb2ZmLCBpbnQgc2l6ZSkKK3sKKwl2
bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisK
Kwl2YSA9IE1JUFNfUEhZU19UT19ESVJFQ1QocGh5cyk7CisJc2NoZWRfcGluKCk7CisJYnplcm8o
KGNoYXIgKikoY2FkZHJfdCl2YSArIG9mZiwgc2l6ZSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFu
Z2UodmEgKyBvZmYsIHNpemUpOworCXNjaGVkX3VucGluKCk7Cit9CisKKy8qCisgKglwbWFwX2Nv
cHlfcGFnZSBjb3BpZXMgdGhlIHNwZWNpZmllZCAobWFjaGluZSBpbmRlcGVuZGVudCkKKyAqCXBh
Z2UgYnkgbWFwcGluZyB0aGUgcGFnZSBpbnRvIHZpcnR1YWwgbWVtb3J5IGFuZCB1c2luZworICoJ
YmNvcHkgdG8gY29weSB0aGUgcGFnZSwgb25lIG1hY2hpbmUgZGVwZW5kZW50IHBhZ2UgYXQgYQor
ICoJdGltZS4KKyAqCisgKiAJVXNlIFhLUEhZUyBmb3IgNjQgYml0LgorICovCisjZGVmaW5lCVBN
QVBfQ09QWV9UQUdTCTB4MDAwMDAwMDEKK3N0YXRpYyB2b2lkCitwbWFwX2NvcHlfcGFnZV9pbnRl
cm5hbCh2bV9wYWdlX3Qgc3JjLCB2bV9wYWdlX3QgZHN0LCBpbnQgZmxhZ3MpCit7CisJdm1fb2Zm
c2V0X3QgdmFfc3JjLCB2YV9kc3Q7CisJdm1fcGFkZHJfdCBwaHlzX3NyYyA9IFZNX1BBR0VfVE9f
UEhZUyhzcmMpOworCXZtX3BhZGRyX3QgcGh5c19kc3QgPSBWTV9QQUdFX1RPX1BIWVMoZHN0KTsK
KworCS8qIGVhc3kgY2FzZSwgYWxsIGNhbiBiZSBhY2Nlc3NlZCB2aWEgS1NFRzAgKi8KKwkvKgor
CSAqIEZsdXNoIGFsbCBjYWNoZXMgZm9yIFZBIHRoYXQgYXJlIG1hcHBlZCB0byB0aGlzIHBhZ2UK
KwkgKiB0byBtYWtlIHN1cmUgdGhhdCBkYXRhIGluIFNEUkFNIGlzIHVwIHRvIGRhdGUKKwkgKi8K
KwlzY2hlZF9waW4oKTsKKwlwbWFwX2ZsdXNoX3B2Y2FjaGUoc3JjKTsKKwltaXBzX2RjYWNoZV93
Ymludl9yYW5nZV9pbmRleChNSVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfZHN0KSwgUEFHRV9TSVpF
KTsKKwl2YV9zcmMgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfc3JjKTsKKwl2YV9kc3QgPSBN
SVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfZHN0KTsKKyNpZmRlZiBDUFVfQ0hFUkkKKwlpZiAoZmxh
Z3MgJiBQTUFQX0NPUFlfVEFHUykKKwkJY2hlcmlfYmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2Fk
ZHJfdCl2YV9kc3QsIFBBR0VfU0laRSk7CisJZWxzZQorI2Vsc2UKKwkJYmNvcHkoKGNhZGRyX3Qp
dmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0VfU0laRSk7CisjZW5kaWYKKwltaXBzX2RjYWNo
ZV93Ymludl9yYW5nZSh2YV9kc3QsIFBBR0VfU0laRSk7CisJc2NoZWRfdW5waW4oKTsKK30KKwor
LyoKKyAqIFdpdGggQ0hFUkksIGl0IGlzIHNvbWV0aW1lcyBkZXNpcmFibGUgdG8gZXhwbGljaXRs
eSBwcm9wYWdhdGUgdGFncyBiZXR3ZWVuCisgKiBwYWdlcyAoZS5nLiwgZHVyaW5nIGNvcHktb24t
d3JpdGUpLCBidXQgbm90IG90aGVyIHRpbWVzIChlLmcuLCBjb3B5aW5nIGRhdGEKKyAqIGZyb20g
Vk0gdG8gYnVmZmVyIGNhY2hlKS4gIFRoZXJlIGlzIG1vcmUgcGxheWluZyBvdXQgaGVyZSB5ZXQg
dG8gZG8gKGUuZy4sCisgKiBpZiBhbnkgZmlsZXN5c3RlbXMgbGVhcm4gdG8gcHJlc2VydmUgdGFn
cykgYnV0IHRoZXNlIEtQSXMgYWxsb3cgdXMgdG8KKyAqIGNhcHR1cmUgdGhhdCBkaWZmZXJlbmNl
IGluIHRoZSBtZWFuIHRpbWUuCisgKi8KK3ZvaWQKK3BtYXBfY29weV9wYWdlKHZtX3BhZ2VfdCBz
cmMsIHZtX3BhZ2VfdCBkc3QpCit7CisKKwlwbWFwX2NvcHlfcGFnZV9pbnRlcm5hbChzcmMsIGRz
dCwgMCk7Cit9CisKKyNpZmRlZiBDUFVfQ0hFUkkKK3ZvaWQKK3BtYXBfY29weV9wYWdlX3RhZ3Mo
dm1fcGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCkKK3sKKworCXBtYXBfY29weV9wYWdlX2ludGVy
bmFsKHNyYywgZHN0LCBQTUFQX0NPUFlfVEFHUyk7Cit9CisjZW5kaWYKKworaW50IHVubWFwcGVk
X2J1Zl9hbGxvd2VkOworCitzdGF0aWMgdm9pZAorcG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKHZt
X3BhZ2VfdCBtYVtdLCB2bV9vZmZzZXRfdCBhX29mZnNldCwgdm1fcGFnZV90IG1iW10sCisgICAg
dm1fb2Zmc2V0X3QgYl9vZmZzZXQsIGludCB4ZmVyc2l6ZSwgaW50IGZsYWdzKQoreworCWNoYXIg
KmFfY3AsICpiX2NwOworCXZtX3BhZ2VfdCBhX20sIGJfbTsKKwl2bV9vZmZzZXRfdCBhX3BnX29m
ZnNldCwgYl9wZ19vZmZzZXQ7CisJdm1fcGFkZHJfdCBhX3BoeXMsIGJfcGh5czsKKwlpbnQgY250
OworCisJc2NoZWRfcGluKCk7CisJd2hpbGUgKHhmZXJzaXplID4gMCkgeworCQlhX3BnX29mZnNl
dCA9IGFfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQljbnQgPSBtaW4oeGZlcnNpemUsIFBBR0VfU0la
RSAtIGFfcGdfb2Zmc2V0KTsKKwkJYV9tID0gbWFbYV9vZmZzZXQgPj4gUEFHRV9TSElGVF07CisJ
CWFfcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhhX20pOworCQliX3BnX29mZnNldCA9IGJfb2Zmc2V0
ICYgUEFHRV9NQVNLOworCQljbnQgPSBtaW4oY250LCBQQUdFX1NJWkUgLSBiX3BnX29mZnNldCk7
CisJCWJfbSA9IG1iW2Jfb2Zmc2V0ID4+IFBBR0VfU0hJRlRdOworCQliX3BoeXMgPSBWTV9QQUdF
X1RPX1BIWVMoYl9tKTsKKwkJcG1hcF9mbHVzaF9wdmNhY2hlKGFfbSk7CisJCW1pcHNfZGNhY2hl
X3diaW52X3JhbmdlX2luZGV4KE1JUFNfUEhZU19UT19ESVJFQ1QoYl9waHlzKSwKKwkJICAgIFBB
R0VfU0laRSk7CisJCWFfY3AgPSAoY2hhciAqKU1JUFNfUEhZU19UT19ESVJFQ1QoYV9waHlzKSAr
IGFfcGdfb2Zmc2V0OworCQliX2NwID0gKGNoYXIgKilNSVBTX1BIWVNfVE9fRElSRUNUKGJfcGh5
cykgKyBiX3BnX29mZnNldDsKKyNpZmRlZiBDUFVfQ0hFUkkKKwkJaWYgKGZsYWdzICYgUE1BUF9D
T1BZX1RBR1MpCisJCQljaGVyaV9iY29weShhX2NwLCBiX2NwLCBjbnQpOworCQllbHNlCisjZWxz
ZQorCQkJYmNvcHkoYV9jcCwgYl9jcCwgY250KTsKKyNlbmRpZgorCQltaXBzX2RjYWNoZV93Ymlu
dl9yYW5nZSgodm1fb2Zmc2V0X3QpYl9jcCwgY250KTsKKwkJYV9vZmZzZXQgKz0gY250OworCQli
X29mZnNldCArPSBjbnQ7CisJCXhmZXJzaXplIC09IGNudDsKKwl9CisJc2NoZWRfdW5waW4oKTsK
K30KKworLyoKKyAqIEFzIHdpdGggcG1hcF9jb3B5X3BhZ2UoKSwgQ0hFUkkgcmVxdWlyZXMgdGFn
Z2VkIGFuZCBub24tdGFnZ2VkIHZlcnNpb25zCisgKiBkZXBlbmRpbmcgb24gdGhlIGNpcmN1bXN0
YW5jZXMuCisgKi8KK3ZvaWQKK3BtYXBfY29weV9wYWdlcyh2bV9wYWdlX3QgbWFbXSwgdm1fb2Zm
c2V0X3QgYV9vZmZzZXQsIHZtX3BhZ2VfdCBtYltdLAorICAgIHZtX29mZnNldF90IGJfb2Zmc2V0
LCBpbnQgeGZlcnNpemUpCit7CisKKwlwbWFwX2NvcHlfcGFnZXNfaW50ZXJuYWwobWEsIGFfb2Zm
c2V0LCBtYiwgYl9vZmZzZXQsIHhmZXJzaXplLCAwKTsKK30KKworI2lmZGVmIENQVV9DSEVSSQor
dm9pZAorcG1hcF9jb3B5X3BhZ2VzX3RhZ3Modm1fcGFnZV90IG1hW10sIHZtX29mZnNldF90IGFf
b2Zmc2V0LCB2bV9wYWdlX3QgbWJbXSwKKyAgICB2bV9vZmZzZXRfdCBiX29mZnNldCwgaW50IHhm
ZXJzaXplKQoreworCisJcG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKG1hLCBhX29mZnNldCwgbWIs
IGJfb2Zmc2V0LCB4ZmVyc2l6ZSwKKwkgICAgUE1BUF9DT1BZX1RBR1MpOworfQorI2VuZGlmCisK
Kwordm1fb2Zmc2V0X3QKK3BtYXBfcXVpY2tfZW50ZXJfcGFnZSh2bV9wYWdlX3QgbSkKK3sKKyNp
ZiBkZWZpbmVkKF9fbWlwc19uNjQpCisgICAgICAgIHJldHVybiBNSVBTX1BIWVNfVE9fRElSRUNU
KFZNX1BBR0VfVE9fUEhZUyhtKSk7CisjZWxzZQorICAgICAgICB2bV9wYWRkcl90IHBhOworICAg
ICAgICBzdHJ1Y3QgbG9jYWxfc3lzbWFwcyAqc3lzbTsKKyAgICAgICAgcHRfZW50cnlfdCAqcHRl
OworCisgICAgICAgIHBhID0gVk1fUEFHRV9UT19QSFlTKG0pOworCisgICAgICAgIGlmIChNSVBT
X0RJUkVDVF9NQVBQQUJMRShwYSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobS0+bWQucHZfZmxh
Z3MgJiBQVl9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIChNSVBTX1BIWVNfVE9fRElSRUNUX1VOQ0FDSEVEKHBhKSk7CisgICAgICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChNSVBTX1BIWVNfVE9fRElSRUNU
KHBhKSk7CisgICAgICAgIH0KKyAgICAgICAgY3JpdGljYWxfZW50ZXIoKTsKKyAgICAgICAgc3lz
bSA9ICZzeXNtYXBfbG1lbVtQQ1BVX0dFVChjcHVpZCldOworCisgICAgICAgIEtBU1NFUlQoc3lz
bS0+dmFsaWQxID09IDAsICgicG1hcF9xdWlja19lbnRlcl9wYWdlOiBQVEUgYnVzeSIpKTsKKwor
ICAgICAgICBwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgc3lzbS0+YmFzZSk7CisgICAgICAg
ICpwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRyB8
CisgICAgICAgICAgICAoaXNfY2FjaGVhYmxlX3BhZ2UocGEsIG0pID8gUFRFX0NfQ0FDSEUgOiBQ
VEVfQ19VTkNBQ0hFRCk7CisgICAgICAgIHN5c20tPnZhbGlkMSA9IDE7CisKKyAgICAgICAgcmV0
dXJuIChzeXNtLT5iYXNlKTsKKyNlbmRpZgorfQorCit2b2lkCitwbWFwX3F1aWNrX3JlbW92ZV9w
YWdlKHZtX29mZnNldF90IGFkZHIpCit7CisgICAgICAgIG1pcHNfZGNhY2hlX3diaW52X3Jhbmdl
KGFkZHIsIFBBR0VfU0laRSk7CisKKyNpZiAhZGVmaW5lZChfX21pcHNfbjY0KQorICAgICAgICBz
dHJ1Y3QgbG9jYWxfc3lzbWFwcyAqc3lzbTsKKyAgICAgICAgcHRfZW50cnlfdCAqcHRlOworCisg
ICAgICAgIGlmIChhZGRyID49IE1JUFNfS1NFRzBfU1RBUlQgJiYgYWRkciA8IE1JUFNfS1NFRzBf
RU5EKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzeXNtID0gJnN5c21hcF9s
bWVtW1BDUFVfR0VUKGNwdWlkKV07CisKKyAgICAgICAgS0FTU0VSVChzeXNtLT52YWxpZDEgIT0g
MCwKKyAgICAgICAgICAgICgicG1hcF9xdWlja19yZW1vdmVfcGFnZTogUFRFIG5vdCBpbiB1c2Ui
KSk7CisgICAgICAgIEtBU1NFUlQoc3lzbS0+YmFzZSA9PSBhZGRyLAorICAgICAgICAgICAgKCJw
bWFwX3F1aWNrX3JlbW92ZV9wYWdlOiBpbnZhbGlkIGFkZHJlc3MiKSk7CisKKyAgICAgICAgcHRl
ID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIGFkZHIpOworICAgICAgICAqcHRlID0gUFRFX0c7Cisg
ICAgICAgIHRsYl9pbnZhbGlkYXRlX2FkZHJlc3Moa2VybmVsX3BtYXAsIGFkZHIpOworICAgICAg
ICBzeXNtLT52YWxpZDEgPSAwOworICAgICAgICBjcml0aWNhbF9leGl0KCk7CisjZW5kaWYKK30K
KworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG1hcCdzIHB2IGlzIG9uZSBvZiB0aGUgZmly
c3QKKyAqIDE2IHB2cyBsaW5rZWQgdG8gZnJvbSB0aGlzIHBhZ2UuICBUaGlzIGNvdW50IG1heQor
ICogYmUgY2hhbmdlZCB1cHdhcmRzIG9yIGRvd253YXJkcyBpbiB0aGUgZnV0dXJlOyBpdAorICog
aXMgb25seSBuZWNlc3NhcnkgdGhhdCB0cnVlIGJlIHJldHVybmVkIGZvciBhIHNtYWxsCisgKiBz
dWJzZXQgb2YgcG1hcHMgZm9yIHByb3BlciBwYWdlIGFnaW5nLgorICovCitib29sZWFuX3QKK3Bt
YXBfcGFnZV9leGlzdHNfcXVpY2socG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtKQoreworCXN0cnVj
dCBtZF9wYWdlICpwdmg7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlwdl9lbnRyeV90IHB2Owor
CWludCBsb29wcyA9IDA7CisJYm9vbGVhbl90IHJ2OworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYg
VlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCIlczogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIs
IF9fZnVuY19fLCBtKSk7CisJcnYgPSBGQUxTRTsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr
KTsKKwlsb2NrID0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcndfcmxvY2sobG9jayk7
CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJaWYgKFBW
X1BNQVAocHYpID09IHBtYXApIHsKKwkJCXJ2ID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJCWxv
b3BzKys7CisJCWlmIChsb29wcyA+PSAxNikKKwkJCWJyZWFrOworCX0KKwlpZiAoIXJ2ICYmIGxv
b3BzIDwgMTYgJiYgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkgeworCQlwdmggPSBw
YV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+
cHZfbGlzdCwgcHZfbmV4dCkgeworCQkJaWYgKFBWX1BNQVAocHYpID09IHBtYXApIHsKKwkJCQly
diA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlsb29wcysrOworCQkJaWYgKGxvb3BzID49
IDE2KQorCQkJCWJyZWFrOworCQl9CisJfQorCXJ3X3J1bmxvY2sobG9jayk7CisJcndfcnVubG9j
aygmcHZoX2dsb2JhbF9sb2NrKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqCXBtYXBfcGFn
ZV93aXJlZF9tYXBwaW5nczoKKyAqCisgKglSZXR1cm4gdGhlIG51bWJlciBvZiBtYW5hZ2VkIG1h
cHBpbmdzIHRvIHRoZSBnaXZlbiBwaHlzaWNhbCBwYWdlCisgKgl0aGF0IGFyZSB3aXJlZC4KKyAq
LworaW50CitwbWFwX3BhZ2Vfd2lyZWRfbWFwcGluZ3Modm1fcGFnZV90IG0pCit7CisJc3RydWN0
IHJ3bG9jayAqbG9jazsKKwlwdl9lbnRyeV90IHB2OworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5
X3QgKnB0ZTsKKwlpbnQgY291bnQsIG1kX2dlbjsKKworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VO
TUFOQUdFRCkgIT0gMCkKKwkJcmV0dXJuICgwKTsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr
KTsKKwlsb2NrID0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcndfcmxvY2sobG9jayk7
CityZXN0YXJ0OgorCWNvdW50ID0gMDsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlz
dCwgcHZfbmV4dCkgeworCQlwbWFwID0gUFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NL
KHBtYXApKSB7CisJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQlyd19ydW5sb2NrKGxvY2sp
OworCQkJUE1BUF9MT0NLKHBtYXApOworCQkJcndfcmxvY2sobG9jayk7CisJCQlpZiAobWRfZ2Vu
ICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCWdvdG8gcmVz
dGFydDsKKwkJCX0KKwkJfQorCQlwdGUgPSBwbWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOworCQlp
ZiAocHRlX3Rlc3QocHRlLCBQVEVfVykpCisJCQljb3VudCsrOworCQlQTUFQX1VOTE9DSyhwbWFw
KTsKKwl9CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsKKwkJc3RydWN0
IG1kX3BhZ2UgKnB2aCA9IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQlUQUlMUV9G
T1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCQlwbWFwID0gUFZfUE1BUChw
dik7CisJCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJCWludCBwdmhfZ2VuID0gcHZo
LT5wdl9nZW47CisJCQkJbWRfZ2VuID0gbS0+bWQucHZfZ2VuOworCQkJCXJ3X3J1bmxvY2sobG9j
ayk7CisJCQkJUE1BUF9MT0NLKHBtYXApOworCQkJCXJ3X3Jsb2NrKGxvY2spOworCQkJCWlmICht
ZF9nZW4gIT0gbS0+bWQucHZfZ2VuIHx8CisJCQkJICAgIHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4p
IHsKKwkJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQl9CisJ
CQl9CisJCQlwZF9lbnRyeV90ICpwZGUgPSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQkJ
aWYgKHB0ZV90ZXN0KChwdF9lbnRyeV90ICopcGRlLCBQVEVfVykpCisJCQkJY291bnQrKzsKKwkJ
CVBNQVBfVU5MT0NLKHBtYXApOworCQl9CisJfQorCXJ3X3J1bmxvY2sobG9jayk7CisJcndfcnVu
bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlyZXR1cm4gKGNvdW50KTsKK30KKworI2lmIDAKKy8q
CisgKiAgUmV0dXJucyBUUlVFIGlmIHRoZSBnaXZlbiBwYWdlIGlzIG1hcHBlZCBpbmRpdmlkdWFs
bHkgb3IgYXMgcGFydCBvZgorICogIGEgMm1wYWdlLiBPdGhlcndpc2UsIHJldHVybnMgRkFMU0Uu
CisgKi8KK2Jvb2xlYW5fdAorcG1hcF9wYWdlX2lzX21hcHBlZCh2bV9wYWdlX3QgbSkKK3sKKwlz
dHJ1Y3Qgcndsb2NrICpsb2NrOworCWJvb2xlYW5fdCBydjsKKworCWlmICgobS0+b2ZsYWdzICYg
VlBPX1VOTUFOQUdFRCkgIT0gMCkKKwkJcmV0dXJuIChGQUxTRSk7CisJcndfcmxvY2soJnB2aF9n
bG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pOworCXJ3X3Js
b2NrKGxvY2spOworCXJ2ID0gIVRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSB8fAorCSAgICAo
KG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCAmJgorCQkhVEFJTFFfRU1QVFkoJnBhX3Rv
X3B2aChWTV9QQUdFX1RPX1BIWVMobSkpLT5wdl9saXN0KSk7CisJcndfcnVubG9jayhsb2NrKTsK
Kwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVybiAocnYpOworfQorI2VuZGlm
CisKKy8qCisgKiBEZXN0cm95IGFsbCBtYW5hZ2VkLCBub24td2lyZWQgbWFwcGluZ3MgaW4gdGhl
IGdpdmVuIHVzZXItc3BhY2UKKyAqIHBtYXAuICBUaGlzIHBtYXAgY2Fubm90IGJlIGFjdGl2ZSBv
biBhbnkgcHJvY2Vzc29yIGJlc2lkZXMgdGhlCisgKiBjYWxsZXIuCisgKgorICogVGhpcyBmdW5j
dGlvbiBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUga2VybmVsIHBtYXAuICBNb3Jlb3ZlciwgaXQK
KyAqIGlzIG5vdCBpbnRlbmRlZCBmb3IgZ2VuZXJhbCB1c2UuICBJdCBpcyBvbmx5IHRvIGJlIHVz
ZWQgZHVyaW5nCisgKiBwcm9jZXNzIHRlcm1pbmF0aW9uLiAgQ29uc2VxdWVudGx5LCBpdCBjYW4g
YmUgaW1wbGVtZW50ZWQgaW4gd2F5cworICogdGhhdCBtYWtlIGl0IGZhc3RlciB0aGFuIHBtYXBf
cmVtb3ZlKCkuICBGaXJzdCwgaXQgY2FuIG1vcmUgcXVpY2tseQorICogZGVzdHJveSBtYXBwaW5n
cyBieSBpdGVyYXRpbmcgb3ZlciB0aGUgcG1hcCdzIGNvbGxlY3Rpb24gb2YgUFYKKyAqIGVudHJp
ZXMsIHJhdGhlciB0aGFuIHNlYXJjaGluZyB0aGUgcGFnZSB0YWJsZS4gIFNlY29uZCwgaXQgZG9l
c24ndAorICogaGF2ZSB0byB0ZXN0IGFuZCBjbGVhciB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzIGF0
b21pY2FsbHksIGJlY2F1c2UKKyAqIG5vIHByb2Nlc3NvciBpcyBjdXJyZW50bHkgYWNjZXNzaW5n
IHRoZSB1c2VyIGFkZHJlc3Mgc3BhY2UuICBJbgorICogcGFydGljdWxhciwgYSBwYWdlIHRhYmxl
IGVudHJ5J3MgZGlydHkgYml0IHdvbid0IGNoYW5nZSBzdGF0ZSBvbmNlCisgKiB0aGlzIGZ1bmN0
aW9uIHN0YXJ0cy4KKyAqLwordm9pZAorcG1hcF9yZW1vdmVfcGFnZXMocG1hcF90IHBtYXApCit7
CisJcGRfZW50cnlfdCBwdGVwZGUsICpwZGU7CisJcHRfZW50cnlfdCAqcHRlLCB0cHRlOworCXN0
cnVjdCBzcGdsaXN0IGZyZWU7CisJdm1fcGFnZV90IG0sIG1wdGUsIG10OworCXB2X2VudHJ5X3Qg
cHY7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjLCAqbnBjOwor
CXN0cnVjdCByd2xvY2sgKmxvY2s7CisJaW50IGJpdDsKKwl1aW50NjRfdCBpbnVzZSwgYml0bWFz
azsKKwlpbnQgYWxsZnJlZSwgZmllbGQsIGZyZWVkLCBpZHg7CisJYm9vbGVhbl90IHN1cGVycGFn
ZTsKKwl2bV9wYWRkcl90IHBhOworCisJLyoKKwkgKiBBc3NlcnQgdGhhdCB0aGUgZ2l2ZW4gcG1h
cCBpcyBvbmx5IGFjdGl2ZSBvbiB0aGUgY3VycmVudAorCSAqIENQVS4gIFVuZm9ydHVuYXRlbHks
IHdlIGNhbm5vdCBibG9jayBhbm90aGVyIENQVSBmcm9tCisJICogYWN0aXZhdGluZyB0aGUgcG1h
cCB3aGlsZSB0aGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGluZy4KKwkgKi8KKwlLQVNTRVJUKHBtYXAg
PT0gdm1zcGFjZV9wbWFwKGN1cnRocmVhZC0+dGRfcHJvYy0+cF92bXNwYWNlKSwKKwkgICAgKCIl
czogbm9uLWN1cnJlbnQgcG1hcCAlcCIsIF9fZnVuY19fLCBwbWFwKSk7CisKKwlsb2NrID0gTlVM
TDsKKwlTTElTVF9JTklUKCZmcmVlKTsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQ
TUFQX0xPQ0socG1hcCk7CisJVEFJTFFfRk9SRUFDSF9TQUZFKHBjLCAmcG1hcC0+cG1fcHZjaHVu
aywgcGNfbGlzdCwgbnBjKSB7CisJCWFsbGZyZWUgPSAxOworCQlmcmVlZCA9IDA7CisJCWZvciAo
ZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBmaWVsZCsrKSB7CisJCQlpbnVzZSA9IH5wYy0+cGNf
bWFwW2ZpZWxkXSAmIHBjX2ZyZWVtYXNrW2ZpZWxkXTsKKwkJCXdoaWxlIChpbnVzZSAhPSAwKSB7
CisJCQkJYml0ID0gZmZzbChpbnVzZSkgLSAxOworCQkJCWJpdG1hc2sgPSAxVUwgPDwgYml0Owor
CQkJCWlkeCA9IGZpZWxkICogc2l6ZW9mKGludXNlKSAqIE5CQlkgKyBiaXQ7CisJCQkJcHYgPSAm
cGMtPnBjX3B2ZW50cnlbaWR4XTsKKwkJCQlpbnVzZSAmPSB+Yml0bWFzazsKKworCQkJCXBkZSA9
IHBtYXBfc2VnbWFwKHBtYXAsIHB2LT5wdl92YSk7CisJCQkJcHRlcGRlID0gKnBkZTsKKwkJCQlw
ZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkZSwgcHYtPnB2X3ZhKTsKKwkJCQlpZiAocGRlX2lzXzFt
X3N1cGVycGFnZShwZGUpKSB7CisJCQkJCXN1cGVycGFnZSA9IFRSVUU7CisJCQkJCXB0ZSA9IChw
dF9lbnRyeV90ICopcGRlOworCQkJCX0gZWxzZSB7CisJCQkJCXN1cGVycGFnZSA9IEZBTFNFOwor
CQkJCQlwdGVwZGUgPSAqcGRlOworCQkJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBwdi0+
cHZfdmEpOworCQkJCX0KKwkJCQl0cHRlID0gKnB0ZTsKKwkJCQlpZiAoIXB0ZV9pc192YWxpZChw
dGUpKSAgeworCQkJCQlwYW5pYygiJXM6IGJhZCAlcyBwdGUgdmEgJWx4IHB0ZSAlbHgiLAorCQkJ
CQkgICAgX19mdW5jX18sIHN1cGVycGFnZSA/ICJzdXBlcnBhZ2UiIDoKKwkJCQkJICAgICIiLCBw
di0+cHZfdmEsIHRwdGUpOworCQkJCX0KKworLyoKKyAqIFdlIGNhbm5vdCByZW1vdmUgd2lyZWQg
cGFnZXMgZnJvbSBhIHByb2Nlc3MnIG1hcHBpbmcgYXQgdGhpcyB0aW1lCisgKi8KKwkJCQlpZiAo
cHRlX3Rlc3QoJnRwdGUsIFBURV9XKSkgeworCQkJCQlhbGxmcmVlID0gMDsKKwkJCQkJY29udGlu
dWU7CisJCQkJfQorCisJCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEodHB0ZSk7CisJCQkJaWYgKHN1
cGVycGFnZSkKKwkJCQkJcGEgJj0gflBEUk1BU0s7CisJCQkJbSA9IFBIWVNfVE9fVk1fUEFHRShw
YSk7CisJCQkJS0FTU0VSVChtLT5waHlzX2FkZHIgPT0gcGEsCisJCQkJICAgICgiJXM6IHZtX3Bh
Z2VfdCAlcCBwaHlzX2FkZHIgbWlzbWF0Y2ggIgorCQkJCSAgICAiJTAxNmp4ICUwMTZqeCIsIF9f
ZnVuY19fLCBtLAorCQkJCSAgICAodWludG1heF90KW0tPnBoeXNfYWRkciwgKHVpbnRtYXhfdCl0
cHRlKSk7CisKKwkJCQlLQVNTRVJUKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwK
KwkJCQkgICAgbSA8ICZ2bV9wYWdlX2FycmF5W3ZtX3BhZ2VfYXJyYXlfc2l6ZV0sCisJCQkJICAg
ICgiJXM6IGJhZCB0cHRlICUjangiLCBfX2Z1bmNfXywKKwkJCQkgICAgKHVpbnRtYXhfdCl0cHRl
KSk7CisKKwkJCQkvKiBDbGVhciBQVEUgKi8KKwkJCQlpZiAoc3VwZXJwYWdlKQorCQkJCQlwdGVf
c3RvcmUocHRlLCAwKTsKKwkJCQllbHNlCisJCQkJCXB0ZV9zdG9yZShwdGUsIGlzX2tlcm5lbF9w
bWFwKHBtYXApID8KKwkJCQkJICAgIFBURV9HIDogMCk7CisKKwkJCQkvKgorCQkJCSAqIFVwZGF0
ZSB0aGUgdm1fcGFnZV90IGNsZWFuIGFuZCByZWZlcmVuY2UgYml0cworCQkJCSAqLworCQkJCWlm
IChwdGVfdGVzdCgmdHB0ZSwgUFRFX0QpICYmCisJCQkJICAgICFwdGVfdGVzdCgmdHB0ZSwgUFRF
X1JPKSkgeworCQkJCQlpZiAoc3VwZXJwYWdlKSB7CisJCQkJCQl2bV9wYWdlX3QgbXQ7CisKKwkJ
CQkJCWZvciAobXQgPSBtOyBtdCA8ICZtW05CUERSIC8gUEFHRV9TSVpFXTsgbXQrKykKKwkJCQkJ
CQl2bV9wYWdlX2RpcnR5KG10KTsKKwkJCQkJfSBlbHNlCisJCQkJCQl2bV9wYWdlX2RpcnR5KG0p
OworCQkJCX0KKworCQkJCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fVk1fUEFHRSgmbG9jaywgbSk7
CisKKwkJCQkvKiBNYXJrIGZyZWUgKi8KKwkJCQlwYy0+cGNfbWFwW2ZpZWxkXSB8PSBiaXRtYXNr
OworCQkJCWlmIChzdXBlcnBhZ2UpIHsKKwkJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1h
cCwgTkJQRFIgLyBQQUdFX1NJWkUpOworCQkJCQlwdmggPSBwYV90b19wdmgoVExCTE9fUFRFX1RP
X1BBKHRwdGUpKTsKKwkJCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0
KTsKKwkJCQkJcHZoLT5wdl9nZW4rKzsKKwkJCQkJaWYgKFRBSUxRX0VNUFRZKCZwdmgtPnB2X2xp
c3QpKSB7CisJCQkJCQlmb3IgKG10ID0gbTsgbXQgPCAmbVtOQlBEUiAvIFBBR0VfU0laRV07IG10
KyspCisJCQkJCQkJaWYgKFRBSUxRX0VNUFRZKCZtdC0+bWQucHZfbGlzdCkpCisJCQkJCQkJCXZt
X3BhZ2VfYWZsYWdfY2xlYXIobXQsIFBHQV9XUklURUFCTEUpOworCQkJCQl9CisJCQkJCW1wdGUg
PSBwbWFwX2xvb2t1cF9wdF9wYWdlKHBtYXAsIHB2LT5wdl92YSk7CisJCQkJCWlmIChtcHRlICE9
IE5VTEwpIHsKKwkJCQkJCXBtYXBfcmVtb3ZlX3B0X3BhZ2UocG1hcCwgbXB0ZSk7CisJCQkJCQlw
bWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwkJCQkJCUtBU1NFUlQobXB0ZS0+d2ly
ZV9jb3VudCA9PSBOUFRFUEcsCisJCQkJCQkgICAgKCIlczogcHRlIHBhZ2Ugd2lyZSBjb3VudCBl
cnJvciIsCisJCQkJCQkgICAgX19mdW5jX18pKTsKKwkJCQkJCW1wdGUtPndpcmVfY291bnQgPSAw
OworCQkJCQkJcG1hcF9hZGRfZGVsYXllZF9mcmVlX2xpc3QobXB0ZSwgJmZyZWUsIEZBTFNFKTsK
KwkJCQkJCWF0b21pY19zdWJ0cmFjdF9pbnQoJnZtX2NudC52X3dpcmVfY291bnQsIDEpOworCQkJ
CQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7
CisJCQkJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJCQlt
LT5tZC5wdl9nZW4rKzsKKwkJCQkJaWYgKChtLT5hZmxhZ3MgJiBQR0FfV1JJVEVBQkxFKSAhPSAw
ICYmCisJCQkJCSAgICBUQUlMUV9FTVBUWSgmbS0+bWQucHZfbGlzdCkgJiYKKwkJCQkJICAgICht
LT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsKKwkJCQkJCXB2aCA9IHBhX3RvX3B2aChW
TV9QQUdFX1RPX1BIWVMobSkpOworCQkJCQkJaWYgKFRBSUxRX0VNUFRZKCZwdmgtPnB2X2xpc3Qp
KQorCQkJCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7CisJCQkJCX0K
KwkJCQl9CisJCQkJcG1hcF91bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsIHB0ZXBkZSwgJmZyZWUp
OworCQkJCWZyZWVkKys7CisJCQl9CisJCX0KKwkJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2
X2VudHJ5X2ZyZWVzLCBmcmVlZCkpOworCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwdl9lbnRy
eV9zcGFyZSwgZnJlZWQpKTsKKwkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfbG9uZygmcHZfZW50
cnlfY291bnQsIGZyZWVkKSk7CisJCWlmIChhbGxmcmVlKSB7CisJCQlUQUlMUV9SRU1PVkUoJnBt
YXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJCWZyZWVfcHZfY2h1bmsocGMpOworCQl9
CisJfQorCWlmIChsb2NrICE9IE5VTEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CisJcG1hcF9pbnZh
bGlkYXRlX2FsbChwbWFwKTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyd19ydW5sb2NrKCZwdmhf
Z2xvYmFsX2xvY2spOworCXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKK30KKworLyoKKyAq
IENsZWFyIHRoZSB3cml0ZSBhbmQgbW9kaWZpZWQgYml0cyBpbiBlYWNoIG9mIHRoZSBnaXZlbiBw
YWdlJ3MgbWFwcGluZ3MuCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3dyaXRlKHZtX3BhZ2VfdCBt
KQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJdm1fb2Zmc2V0X3QgdmE7CisJcHZfZW50cnlf
dCBuZXh0X3B2OworCWludCBwdmhfZ2VuOworCXBtYXBfdCBwbWFwOworCXN0cnVjdCByd2xvY2sg
KmxvY2s7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3Qgb2xkcHRlLCAqcHRlOworCXB2
X2VudHJ5X3QgcHY7CisJaW50IG1kX2dlbjsKKworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19V
Tk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9yZW1vdmVfd3JpdGU6IHBhZ2UgJXAgaXMgbm90
IG1hbmFnZWQiLCBtKSk7CisKKwkvKgorCSAqIElmIHRoZSBwYWdlIGlzIG5vdCBleGNsdXNpdmUg
YnVzaWVkLCB0aGVuIFBHQV9XUklURUFCTEUgY2Fubm90IGJlCisJICogc2V0IGJ5IGFub3RoZXIg
dGhyZWFkIHdoaWxlIHRoZSBvYmplY3QgaXMgbG9ja2VkLiAgVGh1cywKKwkgKiBpZiBQR0FfV1JJ
VEVBQkxFIGlzIGNsZWFyLCBubyBwYWdlIHRhYmxlIGVudHJpZXMgbmVlZCB1cGRhdGluZy4KKwkg
Ki8KKwlWTV9PQkpFQ1RfQVNTRVJUX1dMT0NLRUQobS0+b2JqZWN0KTsKKwlpZiAoIXZtX3BhZ2Vf
eGJ1c2llZChtKSAmJiAobS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJu
OworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sgPSBWTV9QQUdFX1RPX1BWX0xJ
U1RfTE9DSyhtKTsKKwlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKK3JldHJ5
X3B2X2xvb3A6CisJcndfd2xvY2sobG9jayk7CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElP
VVMpICE9IDApCisJCWdvdG8gc21hbGxfbWFwcGluZ3M7CisJVEFJTFFfRk9SRUFDSF9TQUZFKHB2
LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0LCBuZXh0X3B2KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2
KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dl
bjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCQlyd193bG9j
ayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxP
Q0socG1hcCk7CisJCQkJcndfd3VubG9jayhsb2NrKTsKKwkJCQlnb3RvIHJldHJ5X3B2X2xvb3A7
CisJCQl9CisJCX0KKwkJdmEgPSBwdi0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZh
KTsKKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSAmJiAhcGRlX3Rlc3QocGRlLCBQVEVf
Uk8pKQorCQkJKHZvaWQpcG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHZhLCAmbG9j
ayk7CisJCUtBU1NFUlQobG9jayA9PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKSwKKwkJICAg
ICgiaW5jb25zaXN0ZW50IHB2IGxvY2sgJXAgJXAgZm9yIHBhZ2UgJXAiLAorCQkgICAgbG9jaywg
Vk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSksIG0pKTsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJ
fQorc21hbGxfbWFwcGluZ3M6CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2
X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFw
KSkgeworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJbWRfZ2VuID0gbS0+bWQucHZfZ2Vu
OworCQkJcndfd3VubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3dsb2Nr
KGxvY2spOworCQkJaWYgKHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4gfHwKKwkJCSAgICBtZF9nZW4g
IT0gbS0+bWQucHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJcndfd3VubG9j
ayhsb2NrKTsKKwkJCQlnb3RvIHJldHJ5X3B2X2xvb3A7CisJCQl9CisJCX0KKwkJcGRlID0gcG1h
cF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FTU0VSVCghcGRlX2lzX3N1cGVycGFnZShwZGUp
LAorCQkgICAgKCIlczogZm91bmQgYSBzdXBlcnBhZ2UgaW4gcGFnZSAlcCdzIHB2IGxpc3QiLAor
CQkgICAgX19mdW5jX18sIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgcHYtPnB2
X3ZhKTsKKwkJS0FTU0VSVChwdGUgIT0gTlVMTCAmJiBwdGVfaXNfdmFsaWQocHRlKSwKKwkJICAg
ICgiJXM6cGFnZSBvbiBwdl9saXN0IGhhcyBubyBwdGUiLCBfX2Z1bmNfXykpOworcmV0cnk6CisJ
CW9sZHB0ZSA9ICpwdGU7CisJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1JPKSkgeworCQkJ
aWYgKCFhdG9taWNfY21wc2V0X2xvbmcocHRlLCBvbGRwdGUsCisJCQkgICAgKChvbGRwdGUgJiB+
UFRFX0QpIHwgUFRFX1JPKSkpCisJCQkJZ290byByZXRyeTsKKwkJCWlmIChwdGVfdGVzdCgmb2xk
cHRlLCBQVEVfRCkpCisJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCXBtYXBfaW52YWxpZGF0ZV9w
YWdlKHBtYXAsIHB2LT5wdl92YSk7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCXZt
X3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7CisJcndfd3VubG9jayhsb2NrKTsK
Kwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworfQorCisjZGVmaW5lCVBNQVBfVFNfUkVG
RVJFTkNFRF9NQVgJNQorCisvKi0KKyAqCXBtYXBfdHNfcmVmZXJlbmNlZDoKKyAqCisgKiAgUmV0
dXJuIGEgY291bnQgb2YgcGFnZXMgdGhhdCBoYXZlIGJlZW4gcmVmZXJlbmNlZCwgYW5kIHJlc2V0
IHRoZQorICogIHJlZmVyZW5jZSBiaXQuICBJdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBldmVyeSBy
ZWZlcmVuY2UgYml0IHRvIGJlCisgKiAgcmVzZXQsIGJ1dCBpdCBpcyBuZWNlc3NhcnkgdGhhdCAw
IG9ubHkgYmUgcmV0dXJuZWQgd2hlbiB0aGVyZSBhcmUKKyAqICB0cnVseSBoYXZlIGJlZW4gcGFn
ZXMgcmVmZXJlbmNlZC4KKyAqCisgKiAgWFhYOiBUaGUgZXhhY3QgbnVtYmVyIG9mIGZsYWdzIHRv
IGNoZWNrIGFuZCByZXNldCBpcyBhIG1hdHRlciB0aGF0CisgKiAgc2hvdWxkIGJlIHRlc3RlZCBh
bmQgc3RhbmRhcmRpemVkIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSBmb3IKKyAqICBvcHRp
bWFsIGFnaW5nIG9mIHNoYXJlZCBwYWdlcy4KKyAqLworaW50CitwbWFwX3RzX3JlZmVyZW5jZWQo
dm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2LCBw
dmY7CisJcG1hcF90IHBtYXA7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlwZF9lbnRyeV90ICpw
ZGU7CisJcHRfZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHZhOworCXZtX3BhZGRyX3QgcGE7
CisJaW50IGNsZWFyZWQsIG1kX2dlbiwgbm90X2NsZWFyZWQsIHB2aF9nZW47CisKKwlLQVNTRVJU
KChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfdHNfcmVmZXJl
bmNlZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwljbGVhcmVkID0gMDsKKwlwYSA9
IFZNX1BBR0VfVE9fUEhZUyhtKTsKKwlsb2NrID0gUEhZU19UT19QVl9MSVNUX0xPQ0socGEpOwor
CXB2aCA9IHBhX3RvX3B2aChwYSk7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcndf
d2xvY2sobG9jayk7CityZXRyeToKKwlub3RfY2xlYXJlZCA9IDA7CisJaWYgKChtLT5mbGFncyAm
IFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwKKwkgICAgKHB2ZiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2
X2xpc3QpKSA9PSBOVUxMKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCXB2ID0gcHZmOworCWRv
IHsKKwkJaWYgKHB2ZiA9PSBOVUxMKQorCQkJcHZmID0gcHY7CisJCXBtYXAgPSBQVl9QTUFQKHB2
KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dl
bjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCQlyd193bG9j
ayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxP
Q0socG1hcCk7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKwkJfQorCQl2YSA9IHB2LT5wdl92YTsK
KwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKHB0ZV9pc19yZWYoKHB0
X2VudHJ5X3QgKilwZGUpKSB7CisJCQkvKgorCQkJICogU2luY2UgdGhpcyByZWZlcmVuY2UgYml0
IGlzIHNoYXJlZCBieSA1MTIgNEtCCisJCQkgKiBwYWdlcywgaXQgc2hvdWxkIG5vdCBiZSBjbGVh
cmVkIGV2ZXJ5IHRpbWUgaXQgaXMKKwkJCSAqIHRlc3RlZC4gIEFwcGx5IGEgc2ltcGxlICJoYXNo
IiBmdW5jdGlvbiBvbiB0aGUKKwkJCSAqIHBoeXNpY2FsIHBhZ2UgbnVtYmVyLCB0aGUgdmlydHVh
bCBzdXBlcnBhZ2UgbnVtYmVyLAorCQkJICogYW5kIHRoZSBwbWFwIGFkZHJlc3MgdG8gc2VsZWN0
IG9uZSA0S0IgcGFnZSBvdXQgb2YKKwkJCSAqIHRoZSA1MTIgb24gd2hpY2ggdGVzdGluZyB0aGUg
cmVmZXJlbmNlIGJpdCB3aWxsCisJCQkgKiByZXN1bHQgaW4gY2xlYXJpbmcgdGhhdCByZWZlcmVu
Y2UgYml0LiAgVGhpcworCQkJICogZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYXZvaWQgdGhlIHNl
bGVjdGlvbiBvZiB0aGUKKwkJCSAqIHNhbWUgNEtCIHBhZ2UgZm9yIGV2ZXJ5IDJNQiBwYWdlIG1h
cHBpbmcuCisJCQkgKgorCQkJICogT24gZGVtb3Rpb24sIGEgbWFwcGluZyB0aGF0IGhhc24ndCBi
ZWVuIHJlZmVyZW5jZWQKKwkJCSAqIGlzIHNpbXBseSBkZXN0cm95ZWQuICBUbyBhdm9pZCB0aGUg
cG9zc2liaWxpdHkgb2YgYQorCQkJICogc3Vic2VxdWVudCBwYWdlIGZhdWx0IG9uIGEgZGVtb3Rl
ZCB3aXJlZCBtYXBwaW5nLAorCQkJICogYWx3YXlzIGxlYXZlIGl0cyByZWZlcmVuY2UgYml0IHNl
dC4gIE1vcmVvdmVyLAorCQkJICogc2luY2UgdGhlIHN1cGVycGFnZSBpcyB3aXJlZCwgdGhlIGN1
cnJlbnQgc3RhdGUgb2YKKwkJCSAqIGl0cyByZWZlcmVuY2UgYml0IHdvbid0IGFmZmVjdCBwYWdl
IHJlcGxhY2VtZW50LgorCQkJICovCisJCQlpZiAoKCgocGEgPj4gUEFHRV9TSElGVCkgXiAocHYt
PnB2X3ZhID4+IFBEUlNISUZUKSBeCisJCQkgICAgKHVpbnRwdHJfdClwbWFwKSAmIChOUFRFUEcg
LSAxKSkgPT0gMCAmJgorCQkJICAgICFwZGVfdGVzdChwZGUsIFBURV9XKSkgeworCQkJCWF0b21p
Y19jbGVhcl9sb25nKChwdF9lbnRyeV90ICopcGRlLCBQVEVfUkVGKTsKKwkJCQlwbWFwX2ludmFs
aWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQkJCWNsZWFyZWQrKzsKKwkJCX0gZWxzZQor
CQkJCW5vdF9jbGVhcmVkKys7CisKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJLyogUm90
YXRlIHRoZSBQViBsaXN0IGlmIGl0IGhhcyBtb3JlIHRoYW4gb25lIGVudHJ5LiAqLworCQlpZiAo
cHYgIT0gTlVMTCAmJiBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSAhPSBOVUxMKSB7CisJCQlUQUlM
UV9SRU1PVkUoJnB2aC0+cHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJVEFJTFFfSU5TRVJUX1RB
SUwoJnB2aC0+cHZfbGlzdCwgcHYsIHB2X25leHQpOworCQl9CisJCWlmICgoY2xlYXJlZCArIG5v
dF9jbGVhcmVkKSA+PSBQTUFQX1RTX1JFRkVSRU5DRURfTUFYKQorCQkJZ290byBvdXQ7CisJfSB3
aGlsZSAoKHB2ID0gVEFJTFFfRklSU1QoJnB2aC0+cHZfbGlzdCkpICE9IHB2Zik7CitzbWFsbF9t
YXBwaW5nczoKKwlpZiAoKHB2ZiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KSkgPT0gTlVM
TCkKKwkJZ290byBvdXQ7CisJcHYgPSBwdmY7CisJZG8geworCQlpZiAocHZmID09IE5VTEwpCisJ
CQlwdmYgPSBwdjsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhw
bWFwKSkgeworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJbWRfZ2VuID0gbS0+bWQucHZf
Z2VuOworCQkJcndfd3VubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3ds
b2NrKGxvY2spOworCQkJaWYgKAorCQkJICAgIHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4gfHwKKwkJ
CSAgICBtZF9nZW4gIT0gbS0+bWQucHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJ
CQkJZ290byByZXRyeTsKKwkJCX0KKwkJfQorCisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5w
dl92YSk7CisJCUtBU1NFUlQoIXBkZV9pc19zdXBlcnBhZ2UocGRlKSwKKwkJICAgICgicG1hcF90
c19yZWZlcmVuY2VkOiBmb3VuZCBzdXBlcnBhZ2UgaW4gcGFnZSAlcCdzIHB2IGxpc3QiLAorCQkg
ICAgbSkpOworCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOworCQlpZiAo
cHRlX2lzX3JlZihwdGUpKSB7CisJCQlhdG9taWNfY2xlYXJfbG9uZygocHRfZW50cnlfdCAqKXBk
ZSwgUFRFX1JFRik7CisJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOwor
CQkJY2xlYXJlZCsrOworCQl9CisJCVBNQVBfVU5MT0NLKHBtYXApOworCQkvKiBSb3RhdGUgdGhl
IFBWIGxpc3QgaWYgaXQgaGFzIG1vcmUgdGhhbiBvbmUgZW50cnkuICovCisJCWlmIChwdiAhPSBO
VUxMICYmIFRBSUxRX05FWFQocHYsIHB2X25leHQpICE9IE5VTEwpIHsKKwkJCVRBSUxRX1JFTU9W
RSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJVEFJTFFfSU5TRVJUX1RBSUwoJm0t
Pm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCW0tPm1kLnB2X2dlbisrOworCQl9CisJfSB3
aGlsZSAoKHB2ID0gVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpKSAhPSBwdmYgJiYgY2xlYXJl
ZCArCisJICAgIG5vdF9jbGVhcmVkIDwgUE1BUF9UU19SRUZFUkVOQ0VEX01BWCk7CitvdXQ6CisJ
cndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVy
biAoY2xlYXJlZCArIG5vdF9jbGVhcmVkKTsKK30KKworc3RhdGljIGJvb2xlYW5fdAorcG1hcF9w
YWdlX3Rlc3RfbWFwcGluZ3Modm1fcGFnZV90IG0sIGJvb2xlYW5fdCBhY2Nlc3NlZCwgYm9vbGVh
bl90IG1vZGlmaWVkKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcHZfZW50cnlfdCBwdjsK
KwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXB0X2VudHJ5X3QgKnB0ZTsKKwlwbWFwX3QgcG1hcDsK
KwlpbnQgbWRfZ2VuLCBwdmhfZ2VuOworCWJvb2xlYW5fdCBydjsKKworCXJ2ID0gRkFMU0U7CisJ
cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M
T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworcmVzdGFydDoKKwlUQUlMUV9GT1JFQUNIKHB2LCAm
bS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgeworCQlwbWFwID0gUFZfUE1BUChwdik7CisJCWlmICgh
UE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkgbWRfZ2VuID0gbS0+bWQucHZfZ2VuOworCQkJIHJ3
X3J1bmxvY2sobG9jayk7CisJCQkgUE1BUF9MT0NLKHBtYXApOworCQkJIHJ3X3Jsb2NrKGxvY2sp
OworCQkJIGlmIChtZF9nZW4gIT0gbS0+bWQucHZfZ2VuKSB7CisJCQkJIFBNQVBfVU5MT0NLKHBt
YXApOworCQkJCSBnb3RvIHJlc3RhcnQ7CisJCQkgfQorCQl9CisJCXB0ZSA9IHBtYXBfcHRlKHBt
YXAsIHB2LT5wdl92YSk7CisJCWlmIChtb2RpZmllZCkgeworCQkJcnYgPSBwdGVfdGVzdChwdGUs
IFBURV9EKSAmJiAhcHRlX3Rlc3QocHRlLCBQVEVfUk8pOworCQkJaWYgKGFjY2Vzc2VkKQorCQkJ
CXJ2ID0gcnYgJiYgcHRlX2lzX3ZhbGlkKHB0ZSkgJiYgcHRlX2lzX3JlZihwdGUpOworCQl9IGVs
c2UgaWYgKGFjY2Vzc2VkKSB7CisJCQlydiA9IHB0ZV9pc192YWxpZChwdGUpICYmIHB0ZV9pc19y
ZWYocHRlKTsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJaWYgKHJ2KQorCQkJZ290byBv
dXQ7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCXB2aCA9
IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQlUQUlMUV9GT1JFQUNIKHB2LCAmcHZo
LT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCQlwbWFwID0gUFZfUE1BUChwdik7CisJCQlpZiAoIVBN
QVBfVFJZTE9DSyhwbWFwKSkgeworCQkJCW1kX2dlbiA9IG0tPm1kLnB2X2dlbjsKKwkJCQlwdmhf
Z2VuID0gcHZoLT5wdl9nZW47CisJCQkJcndfcnVubG9jayhsb2NrKTsKKwkJCQlQTUFQX0xPQ0so
cG1hcCk7CisJCQkJcndfcmxvY2sobG9jayk7CisJCQkJaWYgKG1kX2dlbiAhPSBtLT5tZC5wdl9n
ZW4gfHwKKwkJCQkgICAgcHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJCQlQTUFQX1VOTE9D
SyhwbWFwKTsKKwkJCQkJZ290byByZXN0YXJ0OworCQkJCX0KKwkJCX0KKwkJCXB0ZSA9IChwdF9l
bnRyeV90ICopcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCWlmIChtb2RpZmllZCkgewor
CQkJCXJ2ID0gcHRlX3Rlc3QocHRlLCBQVEVfRCkgJiYKKwkJCQkgICAgIXB0ZV90ZXN0KHB0ZSwg
UFRFX1JPKTsKKwkJCQlpZiAoYWNjZXNzZWQpCisJCQkJCXJ2ID0gcnYgJiYgcHRlX2lzX3ZhbGlk
KHB0ZSkgJiYKKwkJCQkJICAgIHB0ZV9pc19yZWYocHRlKTsKKwkJCX0gZWxzZSBpZiAoYWNjZXNz
ZWQpIHsKKwkJCQlydiA9IHB0ZV9pc192YWxpZChwdGUpICYmCisJCQkJICAgIHB0ZV9pc19yZWYo
cHRlKTsKKwkJCX0KKwkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJaWYgKHJ2KQorCQkJCWdvdG8g
b3V0OworCQl9CisJfQorb3V0OgorCXJ3X3J1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZo
X2dsb2JhbF9sb2NrKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworCisvKgorICoJcG1hcF9pc19tb2Rp
ZmllZDoKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBwaHlzaWNh
bCBwYWdlIHdhcyBtb2RpZmllZAorICoJaW4gYW55IHBoeXNpY2FsIG1hcHMuCisgKi8KK2Jvb2xl
YW5fdAorcG1hcF9pc19tb2RpZmllZCh2bV9wYWdlX3QgbSkKK3sKKworCUtBU1NFUlQoKG0tPm9m
bGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9pc19tb2RpZmllZDogcGFn
ZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKworCS8qCisJICogSWYgdGhlIHBhZ2UgaXMgbm90
IGV4Y2x1c2l2ZSBidXNpZWQsIHRoZW4gUEdBX1dSSVRFQUJMRSBjYW5ub3QgYmUKKwkgKiBjb25j
dXJyZW50bHkgc2V0IHdoaWxlIHRoZSBvYmplY3QgaXMgbG9ja2VkLiAgVGh1cywgaWYgUEdBX1dS
SVRFQUJMRQorCSAqIGlzIGNsZWFyLCBubyBQVEVzIGNhbiBoYXZlIFBURV9EIHNldC4KKwkgKi8K
KwlWTV9PQkpFQ1RfQVNTRVJUX1dMT0NLRUQobS0+b2JqZWN0KTsKKwlpZiAoIXZtX3BhZ2VfeGJ1
c2llZChtKSAmJiAobS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJuIChG
QUxTRSk7CisJcmV0dXJuIChwbWFwX3BhZ2VfdGVzdF9tYXBwaW5ncyhtLCBGQUxTRSwgVFJVRSkp
OworfQorCisvKgorICoJcG1hcF9pc19wcmVmYXVsdGFibGU6CisgKgorICoJUmV0dXJuIHdoZXRo
ZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIGlzIGVsZ2libGUKKyAqCWZv
ciBwcmVmYXVsdC4KKyAqLworYm9vbGVhbl90CitwbWFwX2lzX3ByZWZhdWx0YWJsZShwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3QgYWRkcikKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlf
dCAqcHRlOworCWJvb2xlYW5fdCBydjsKKworCXJ2ID0gRkFMU0U7CisJUE1BUF9MT0NLKHBtYXAp
OworCXBkZSA9IHBtYXBfcGRlKHBtYXAsIGFkZHIpOworCWlmIChwZGUgIT0gTlVMTCAmJiAqcGRl
ICE9IDApIHsKKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkKKwkJCXB0ZSA9IChwdF9l
bnRyeV90ICopcGRlOworCQllbHNlCisJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBhZGRy
KTsKKwkJcnYgPSAoKnB0ZSA9PSAwKSB8fCAoKnB0ZSA9PSBQVEVfRyk7CisJfQorCVBNQVBfVU5M
T0NLKHBtYXApOworCXJldHVybiAocnYpOworfQorCisvKgorICoJcG1hcF9pc19yZWZlcmVuY2Vk
OgorICoKKyAqCVJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHBh
Z2Ugd2FzIHJlZmVyZW5jZWQKKyAqCWluIGFueSBwaHlzaWNhbCBtYXBzLgorICovCitib29sZWFu
X3QKK3BtYXBfaXNfcmVmZXJlbmNlZCh2bV9wYWdlX3QgbSkKK3sKKworCUtBU1NFUlQoKG0tPm9m
bGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9pc19yZWZlcmVuY2VkOiBw
YWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCXJldHVybiAocG1hcF9wYWdlX3Rlc3RfbWFw
cGluZ3MobSwgVFJVRSwgRkFMU0UpKTsKK30KKworLyoKKyAqCUFwcGx5IHRoZSBnaXZlbiBhZHZp
Y2UgdG8gdGhlIHNwZWNpZmllZCByYW5nZSBvZiBhZGRyZXNzZXMgd2l0aGluIHRoZQorICoJZ2l2
ZW4gcG1hcC4gIERlcGVuZGluZyBvbiB0aGUgYWR2aWNlLCBjbGVhciB0aGUgcmVmZXJlbmNlZCBh
bmQvb3IKKyAqCW1vZGlmaWVkIGZsYWdzIGluIGVhY2ggbWFwcGluZyBhbmQgc2V0IHRoZSBtYXBw
ZWQgcGFnZSdzIGRpcnR5IGZpZWxkLgorICovCit2b2lkCitwbWFwX2FkdmlzZShwbWFwX3QgcG1h
cCwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEsIGludCBhZHZpY2UpCit7CisJc3Ry
dWN0IHJ3bG9jayAqbG9jazsKKwlwZF9lbnRyeV90ICpwZGUsICpwZHBlLCBvbGRwZGU7CisJcHRf
ZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisJdm1fcGFnZV90IG07CisJYm9v
bGVhbl90IGFueWNoYW5nZWQsIHB2X2xpc3RzX2xvY2tlZDsKKworCWlmIChhZHZpY2UgIT0gTUFE
Vl9ET05UTkVFRCAmJiBhZHZpY2UgIT0gTUFEVl9GUkVFKQorCQlyZXR1cm47CisKKwlwdl9saXN0
c19sb2NrZWQgPSBGQUxTRTsKK3Jlc3VtZToKKwlhbnljaGFuZ2VkID0gRkFMU0U7CisJUE1BUF9M
T0NLKHBtYXApOworCWZvciAoOyBzdmEgPCBldmE7IHN2YSA9IHZhX25leHQpIHsKKwkJcGRwZSA9
IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRwZSA9PSAwKSB7CisJCQl2YV9uZXh0
ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYgKHZhX25leHQgPCBzdmEpCisJCQkJ
dmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhX25leHQgPSAoc3ZhICsgTkJQ
RFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJdmFfbmV4dCA9IGV2YTsK
KworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2YSk7CisJCW9sZHBkZSA9ICpwZGU7
CisJCWlmIChwZGUgPT0gTlVMTCB8fCAqcGRlID09IDApCisJCQljb250aW51ZTsKKwkJZWxzZSBp
ZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlpZiAoIXBkZV90ZXN0KCZvbGRwZGUs
IFBURV9NQU5BR0VEKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghcHZfbGlzdHNfbG9ja2VkKSB7
CisJCQkJcHZfbGlzdHNfbG9ja2VkID0gVFJVRTsKKwkJCQlpZiAoIXJ3X3RyeV9ybG9jaygmcHZo
X2dsb2JhbF9sb2NrKSkgeworCQkJCQlpZiAoYW55Y2hhbmdlZCkKKwkJCQkJCXBtYXBfaW52YWxp
ZGF0ZV9hbGwocG1hcCk7CisJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCQlyd19ybG9jaygm
cHZoX2dsb2JhbF9sb2NrKTsKKwkJCQkJZ290byByZXN1bWU7CisJCQkJfQorCQkJfQorCQkJbG9j
ayA9IE5VTEw7CisJCQlpZiAoIXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGRlLCBzdmEs
ICZsb2NrKSkgeworCQkJCWlmIChsb2NrICE9IE5VTEwpCisJCQkJCXJ3X3d1bmxvY2sobG9jayk7
CisKKwkJCQkvKgorCQkJCSAqIFRoZSBzdXBlcnBhZ2UgbWFwcGluZyB3YXMgZGVzdHJveWVkLgor
CQkJCSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogVW5sZXNzIHRoZSBw
YWdlIG1hcHBpbmdzIGFyZSB3aXJlZCwgcmVtb3ZlIHRoZQorCQkJICogbWFwcGluZyB0byBhIHNp
bmdsZSBwYWdlIHNvIHRoYXQgYSBzdWJzZXF1ZW50CisJCQkgKiBhY2Nlc3MgbWF5IHJlcHJvbW90
ZS4gIFNpbmNlIHRoZSB1bmRlcmx5aW5nIHBhZ2UKKwkJCSAqIHRhYmxlIHBhZ2UgaXMgZnVsbHkg
cG9wdWxhdGVkLCB0aGlzIHJlbW92YWwgbmV2ZXIKKwkJCSAqIGZyZWVzIGEgcGFnZSB0YWJsZSBw
YWdlLgorCQkJICovCisJCQlpZiAoIXBkZV90ZXN0KCZvbGRwZGUsIFBURV9XKSkgeworCQkJCXB0
ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7CisJCQkJS0FTU0VSVChwdGVfdGVzdChwdGUs
IFBURV9WQUxJRCksCisJCQkJICAgICgicG1hcF9hZHZpc2U6IGludmFsaWQgUFRFIikpOworCQkJ
CXBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdGUsIHN2YSwgKnBkZSwgTlVMTCwKKwkJCQkgICAgJmxv
Y2spOworCQkJCWFueWNoYW5nZWQgPSBUUlVFOworCQkJfQorCQkJaWYgKGxvY2sgIT0gTlVMTCkK
KwkJCQlyd193dW5sb2NrKGxvY2spOworCQl9CisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRv
IGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2YSByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgY3VycmVu
dCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlCisJCSAqIHJhbmdlIGJlaW5n
IHdyaXRlIHByb3RlY3RlZC4KKwkJICovCisJCWlmICh2YV9uZXh0ID4gZXZhKQorCQkJdmFfbmV4
dCA9IGV2YTsKKworCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAh
PSB2YV9uZXh0OyBwdGUrKywKKwkJICAgIHN2YSArPSBQQUdFX1NJWkUpIHsKKwkJCWlmICghcHRl
X2lzX3ZhbGlkKHB0ZSkgfHwgIXB0ZV90ZXN0KHB0ZSwgUFRFX01BTkFHRUQpKQorCQkJCWNvbnRp
bnVlOworCQkJZWxzZSBpZiAocHRlX3Rlc3QocHRlLCBQVEVfRCkgJiYKKwkJCSAgICAhcHRlX3Rl
c3QocHRlLCBQVEVfUk8pKSB7CisJCQkJaWYgKGFkdmljZSA9PSBNQURWX0RPTlRORUVEKSB7CisJ
CQkJCS8qCisJCQkJCSAqIEZ1dHVyZSBjYWxscyB0byBwbWFwX2lzX21vZGlmaWVkKCkKKwkJCQkJ
ICogY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIHRoZSBwYWdlCisJCQkJCSAqIGRpcnR5IG5vdy4K
KwkJCQkJICovCisJCQkJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJCSAgICBUTEJMT19QVEVf
VE9fUEEoKnB0ZSkpOworCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCX0KKwkJCQlwdGVfYXRv
bWljX2NsZWFyKHB0ZSwgUFRFX0QgfCBQVEVfUkVGKTsKKwkJCX0gZWxzZSBpZiAocHRlX2lzX3Jl
ZihwdGUpKQorCQkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfUkVGKTsKKwkJCWVsc2UKKwkJ
CQljb250aW51ZTsKKwkJCWlmIChwdGVfdGVzdChwdGUsIFBURV9HKSkKKwkJCQlwbWFwX2ludmFs
aWRhdGVfcGFnZShwbWFwLCBzdmEpOworCQkJZWxzZQorCQkJCWFueWNoYW5nZWQgPSBUUlVFOwor
CQl9CisJfQorCWlmIChhbnljaGFuZ2VkKQorCQlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOwor
CWlmIChwdl9saXN0c19sb2NrZWQpIHsKKwkJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsK
Kwl9CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKglDbGVhciB0aGUgbW9kaWZ5IGJp
dHMgb24gdGhlIHNwZWNpZmllZCBwaHlzaWNhbCBwYWdlLgorICovCit2b2lkCitwbWFwX2NsZWFy
X21vZGlmeSh2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXBtYXBfdCBw
bWFwOworCXB2X2VudHJ5X3QgbmV4dF9wdiwgcHY7CisJcGRfZW50cnlfdCBvbGRwZGUsICpwZGU7
CisJcHRfZW50cnlfdCBvbGRwdGUsICpwdGU7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwl2bV9v
ZmZzZXRfdCB2YTsKKwlpbnQgbWRfZ2VuLCBwdmhfZ2VuOworCisJS0FTU0VSVCgobS0+b2ZsYWdz
ICYgVlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFwX2NsZWFyX21vZGlmeTogcGFnZSAl
cCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwlWTV9PQkpFQ1RfQVNTRVJUX1dMT0NLRUQobS0+b2Jq
ZWN0KTsKKwlLQVNTRVJUKCF2bV9wYWdlX3hidXNpZWQobSksCisJICAgICgicG1hcF9jbGVhcl9t
b2RpZnk6IHBhZ2UgJXAgaXMgZXhjbHVzaXZlIGJ1c2llZCIsIG0pKTsKKworCS8qCisJICogSWYg
dGhlIHBhZ2UgaXMgbm90IFBHQV9XUklURUFCTEUsIHRoZW4gbm8gUFRFcyBjYW4gaGF2ZSBQVEVf
RCBzZXQuCisJICogSWYgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwYWdlIGlzIGxvY2tlZCBh
bmQgdGhlIHBhZ2UgaXMgbm90CisJICogd3JpdGUgYnVzaWVkLCB0aGVuIFBHQV9XUklURUFCTEUg
Y2Fubm90IGJlIGNvbmN1cnJlbnRseSBzZXQuCisJICovCisJaWYgKChtLT5hZmxhZ3MgJiBQR0Ff
V1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm47CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9f
UEhZUyhtKSk7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0Vf
VE9fUFZfTElTVF9MT0NLKG0pOworCXJ3X3dsb2NrKGxvY2spOworcmVzdGFydDoKKwlpZiAoKG0t
PmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCkKKwkJZ290byBzbWFsbF9tYXBwaW5nczsKKwlU
QUlMUV9GT1JFQUNIX1NBRkUocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQsIG5leHRfcHYpIHsK
KwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJ
cHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJcndfd3VubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9D
SyhwbWFwKTsKKwkJCXJ3X3dsb2NrKGxvY2spOworCQkJaWYgKHB2aF9nZW4gIT0gcHZoLT5wdl9n
ZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJ
CX0KKwkJdmEgPSBwdi0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJb2xk
cGRlID0gKnBkZTsKKwkJaWYgKCFwZGVfdGVzdChwZGUsIFBURV9STykpIHsKKwkJCWlmIChwbWFw
X2RlbW90ZV9wZGVfbG9ja2VkKHBtYXAsIHBkZSwgdmEsICZsb2NrKSkgeworCQkJCWlmICghcGRl
X3Rlc3QoJm9sZHBkZSwgUFRFX1cpKSB7CisJCQkJCS8qCisJCQkJCSAqIFdyaXRlIHByb3RlY3Qg
dGhlIG1hcHBpbmcgdG8gYQorCQkJCQkgKiBzaW5nbGUgcGFnZSBzbyB0aGF0IGEgc3Vic2VxdWVu
dAorCQkJCQkgKiB3cml0ZSBhY2Nlc3MgbWF5IHJlcHJvbW90ZS4KKwkJCQkJICovCisJCQkJCXZh
ICs9IFZNX1BBR0VfVE9fUEhZUyhtKSAtCisJCQkJCSAgIFRMQkxPX1BERV9UT19QQShvbGRwZGUp
OworCQkJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCQkJCW9sZHB0ZSA9ICpw
dGU7CisJCQkJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1ZBTElEKSkgeworCQkJCQkJd2hp
bGUgKCFhdG9taWNfY21wc2V0X2xvbmcocHRlLAorCQkJCQkJICAgIG9sZHB0ZSwKKwkJCQkJCSAg
ICAob2xkcHRlICYgflBURV9EKSB8IFBURV9STykpCisJCQkJCQkJb2xkcHRlID0gKnB0ZTsKKwkJ
CQkJCXZtX3BhZ2VfZGlydHkobSk7CisJCQkJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2
YSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQor
c21hbGxfbWFwcGluZ3M6CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25l
eHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkg
eworCQkJbWRfZ2VuID0gbS0+bWQucHZfZ2VuOworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOwor
CQkJcndfd3VubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3dsb2NrKGxv
Y2spOworCQkJaWYgKG1kX2dlbiAhPSBtLT5tZC5wdl9nZW4gfHwgbWRfZ2VuICE9IG0tPm1kLnB2
X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0K
KwkJfQorCQlwZGUgPSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKCFwZGVf
aXNfc3VwZXJwYWdlKHBkZSksICgicG1hcF9jbGVhcl9tb2RpZnk6IGZvdW5kIgorCQkgICAgIiBh
IHN1cGVycGFnZSBpbiBwYWdlICVwJ3MgcHYgbGlzdCIsIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVf
dG9fcHRlKHBkZSwgcHYtPnB2X3ZhKTsKKwkJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmICFw
dGVfdGVzdChwdGUsIFBURV9STykpIHsKKwkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfRCk7
CisJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQl9CisJCVBNQVBf
VU5MT0NLKHBtYXApOworCX0KKwlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9n
bG9iYWxfbG9jayk7Cit9CisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIHN1cHBvcnQgcm91dGluZXMg
Zm9sbG93CisgKi8KKworLyoKKyAqIE1hcCBhIHNldCBvZiBwaHlzaWNhbCBtZW1vcnkgcGFnZXMg
aW50byB0aGUga2VybmVsIHZpcnR1YWwKKyAqIGFkZHJlc3Mgc3BhY2UuIFJldHVybiBhIHBvaW50
ZXIgdG8gd2hlcmUgaXQgaXMgbWFwcGVkLiBUaGlzCisgKiByb3V0aW5lIGlzIGludGVuZGVkIHRv
IGJlIHVzZWQgZm9yIG1hcHBpbmcgZGV2aWNlIG1lbW9yeSwKKyAqIE5PVCByZWFsIG1lbW9yeS4K
KyAqCisgKiBVc2UgWEtQSFlTIHVuY2FjaGVkIGZvciA2NCBiaXQuCisgKi8KK3ZvaWQgKgorcG1h
cF9tYXBkZXYodm1fcGFkZHJfdCBwYSwgdm1fc2l6ZV90IHNpemUpCit7CisKKwlyZXR1cm4gKCh2
b2lkICopTUlQU19QSFlTX1RPX0RJUkVDVF9VTkNBQ0hFRChwYSkpOworfQorCit2b2lkCitwbWFw
X3VubWFwZGV2KHZtX29mZnNldF90IHZhLCB2bV9zaXplX3Qgc2l6ZSkKK3sKKworCS8qIE5vdGhp
bmcgdG8gZG8gZm9yIG1pcHM2NC4gKi8KK30KKworLyoKKyAqIFNldHMgdGhlIG1lbW9yeSBhdHRy
aWJ1dGUgZm9yIHRoZSBzcGVjaWZpZWQgcGFnZS4KKyAqLwordm9pZAorcG1hcF9wYWdlX3NldF9t
ZW1hdHRyKHZtX3BhZ2VfdCBtLCB2bV9tZW1hdHRyX3QgbWEpCit7CisJLyoKKwkgKiBTZXQgdGhl
IG1lbWF0dHIgZmllbGQgc28gdGhlIGFwcHJvcHJpYXRlIGJpdHMgYXJlIHNldCBpbiB0aGUKKwkg
KiBQVEUgYXMgbWFwcGluZ3MgYXJlIGNyZWF0ZWQuCisJICovCisJbS0+bWQucHZfbWVtYXR0ciA9
IG1hOworCisJLyoKKwkgKiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5
IGNhbGxlZCBiZWZvcmUgYW55IG1hcHBpbmdzCisJICogYXJlIGVzdGFibGlzaGVkLiAgSWYgdGhp
cyBpcyBub3QgdGhlIGNhc2UgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwKKwkgKiBuZWVkIHRvIHdh
bGsgdGhlIHB2X2xpc3QgYW5kIG1ha2UgZWFjaCBvZiB0aGUgZXhpc3RpbmcgbWFwcGluZ3MKKwkg
KiB1bmNhY2hlYWJsZSwgc3luYyB0aGUgY2FjaGUgKHdpdGggbWlwc19pY2FjaGVfc3luY19hbGwo
KSBhbmQKKwkgKiBtaXBzX2RjYWNoZV93Ymludl9hbGwoKSkgYW5kIG1vc3QgbGlrZWx5IGludmFs
aWRhdGUgVExCIGVudHJpZXMgZm9yCisJICogYW55IG9mIHRoZSBjdXJyZW50IG1hcHBpbmdzIGl0
IG1vZGlmaWVzLgorCSAqLworCWlmIChUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkgIT0gTlVM
TCkKKwkJcGFuaWMoIkNhbid0IGNoYW5nZSBtZW1hdHRyIG9uIHBhZ2Ugd2l0aCBleGlzdGluZyBt
YXBwaW5ncyIpOworfQorCisvKgorICogcGVyZm9ybSB0aGUgcG1hcCB3b3JrIGZvciBtaW5jb3Jl
CisgKi8KK2ludAorcG1hcF9taW5jb3JlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBhZGRyLCB2
bV9wYWRkcl90ICpsb2NrZWRfcGEpCit7CisJcGRfZW50cnlfdCAqcGRlcDsKKwlwdF9lbnRyeV90
ICpwdGVwLCBwdGU7CisJdm1fcGFkZHJfdCBwYTsKKwlpbnQgdmFsOworCisJUE1BUF9MT0NLKHBt
YXApOworcmV0cnk6CisJcGRlcCA9IHBtYXBfcGRlKHBtYXAsIGFkZHIpOworCWlmIChwZGVwICE9
IE5VTEwpIHsKKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlcCkpIHsKKwkJCXB0ZSA9IChw
dF9lbnRyeV90KSpwZGVwOworCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKKwkJCXZhbCA9
IE1JTkNPUkVfU1VQRVI7CisJCX0gZWxzZSB7CisJCQlwdGVwID0gcG1hcF9wZGVfdG9fcHRlKHBk
ZXAsIGFkZHIpOworCQkJcHRlID0gKHB0ZXAgIT0gTlVMTCkgPyAqcHRlcCA6IDA7CisJCQlwYSA9
IFRMQkxPX1BURV9UT19QQShwdGUpOworCQkJdmFsID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXB0
ZSA9IDA7CisJCXBhID0gMDsKKwkJdmFsID0gMDsKKwl9CisJaWYgKHB0ZV9pc192YWxpZCgmcHRl
KSkgeworCQl2YWwgfD0gTUlOQ09SRV9JTkNPUkU7CisJCWlmIChwdGVfdGVzdCgmcHRlLCBQVEVf
RCkpCisJCQl2YWwgfD0gTUlOQ09SRV9NT0RJRklFRCB8IE1JTkNPUkVfTU9ESUZJRURfT1RIRVI7
CisJCWlmIChwdGVfaXNfcmVmKCZwdGUpKQorCQkJdmFsIHw9IE1JTkNPUkVfUkVGRVJFTkNFRCB8
IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUjsKKwl9CisJaWYgKCh2YWwgJiAoTUlOQ09SRV9NT0RJ
RklFRF9PVEhFUiB8IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUikpICE9CisJICAgIChNSU5DT1JF
X01PRElGSUVEX09USEVSIHwgTUlOQ09SRV9SRUZFUkVOQ0VEX09USEVSKSAmJgorCSAgICBwdGVf
dGVzdCgmcHRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJLyogRW5zdXJlIHRoYXQgIlBIWVNfVE9fVk1f
UEFHRShwYSktPm9iamVjdCIgZG9lc24ndCBjaGFuZ2UuICovCisJCWlmICh2bV9wYWdlX3BhX3Ry
eXJlbG9jayhwbWFwLCBwYSwgbG9ja2VkX3BhKSkKKwkJCWdvdG8gcmV0cnk7CisJfSBlbHNlCisJ
CVBBX1VOTE9DS19DT05EKCpsb2NrZWRfcGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVy
biAodmFsKTsKK30KKwordm9pZAorcG1hcF9hY3RpdmF0ZShzdHJ1Y3QgdGhyZWFkICp0ZCkKK3sK
KwlwbWFwX3QgcG1hcCwgb2xkcG1hcDsKKwlzdHJ1Y3QgcHJvYyAqcCA9IHRkLT50ZF9wcm9jOwor
CXVfaW50IGNwdWlkOworCisJY3JpdGljYWxfZW50ZXIoKTsKKworCXBtYXAgPSB2bXNwYWNlX3Bt
YXAocC0+cF92bXNwYWNlKTsKKwlvbGRwbWFwID0gUENQVV9HRVQoY3VycG1hcCk7CisJY3B1aWQg
PSBQQ1BVX0dFVChjcHVpZCk7CisKKwlpZiAob2xkcG1hcCkKKwkJQ1BVX0NMUl9BVE9NSUMoY3B1
aWQsICZvbGRwbWFwLT5wbV9hY3RpdmUpOworCUNQVV9TRVRfQVRPTUlDKGNwdWlkLCAmcG1hcC0+
cG1fYWN0aXZlKTsKKwlwbWFwX2FzaWRfYWxsb2MocG1hcCk7CisJaWYgKHRkID09IGN1cnRocmVh
ZCkgeworCQlQQ1BVX1NFVChzZWdiYXNlLCBwbWFwLT5wbV9zZWd0YWIpOworCQltaXBzX3dyX2Vu
dHJ5aGkocG1hcC0+cG1fYXNpZFtjcHVpZF0uYXNpZCk7CisJfQorCisJUENQVV9TRVQoY3VycG1h
cCwgcG1hcCk7CisJY3JpdGljYWxfZXhpdCgpOworfQorCit2b2lkCitwbWFwX3N5bmNfaWNhY2hl
KHBtYXBfdCBwbSwgdm1fb2Zmc2V0X3QgdmEsIHZtX3NpemVfdCBzeikKK3sKK30KKworLyoKKyAq
CUluY3JlYXNlIHRoZSBzdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGdpdmVuIG1hcHBp
bmcgaWYgYQorICoJZGlmZmVyZW50IGFsaWdubWVudCBtaWdodCByZXN1bHQgaW4gbW9yZSBzdXBl
cnBhZ2UgbWFwcGluZ3MuCisgKi8KK3ZvaWQKK3BtYXBfYWxpZ25fc3VwZXJwYWdlKHZtX29iamVj
dF90IG9iamVjdCwgdm1fb29mZnNldF90IG9mZnNldCwKKyAgICB2bV9vZmZzZXRfdCAqYWRkciwg
dm1fc2l6ZV90IHNpemUpCit7CisJdm1fb2Zmc2V0X3Qgc3VwZXJwYWdlX29mZnNldDsKKworCWlm
IChzaXplIDwgTkJTRUcpCisJCXJldHVybjsKKwlpZiAob2JqZWN0ICE9IE5VTEwgJiYgKG9iamVj
dC0+ZmxhZ3MgJiBPQkpfQ09MT1JFRCkgIT0gMCkKKwkJb2Zmc2V0ICs9IHB0b2Eob2JqZWN0LT5w
Z19jb2xvcik7CisJc3VwZXJwYWdlX29mZnNldCA9IG9mZnNldCAmIFNFR01BU0s7CisJaWYgKHNp
emUgLSAoKE5CU0VHIC0gc3VwZXJwYWdlX29mZnNldCkgJiBTRUdNQVNLKSA8IE5CU0VHIHx8CisJ
ICAgICgqYWRkciAmIFNFR01BU0spID09IHN1cGVycGFnZV9vZmZzZXQpCisJCXJldHVybjsKKwlp
ZiAoKCphZGRyICYgU0VHTUFTSykgPCBzdXBlcnBhZ2Vfb2Zmc2V0KQorCQkqYWRkciA9ICgqYWRk
ciAmIH5TRUdNQVNLKSArIHN1cGVycGFnZV9vZmZzZXQ7CisJZWxzZQorCQkqYWRkciA9ICgoKmFk
ZHIgKyBTRUdNQVNLKSAmIH5TRUdNQVNLKSArIHN1cGVycGFnZV9vZmZzZXQ7Cit9CisKKyNpZmRl
ZiBEREIKK0RCX1NIT1dfQ09NTUFORChwdGFibGUsIGRkYl9waWRfZHVtcCkKK3sKKwlwbWFwX3Qg
cG1hcDsKKwlzdHJ1Y3QgdGhyZWFkICp0ZCA9IE5VTEw7CisJc3RydWN0IHByb2MgKnA7CisJaW50
IGksIGosIGs7CisJdm1fcGFkZHJfdCBwYTsKKwl2bV9vZmZzZXRfdCB2YTsKKworCWlmIChoYXZl
X2FkZHIpIHsKKwkJdGQgPSBkYl9sb29rdXBfdGhyZWFkKGFkZHIsIFRSVUUpOworCQlpZiAodGQg
PT0gTlVMTCkgeworCQkJZGJfcHJpbnRmKCJJbnZhbGlkIHBpZCBvciB0aWQiKTsKKwkJCXJldHVy
bjsKKwkJfQorCQlwID0gdGQtPnRkX3Byb2M7CisJCWlmIChwLT5wX3Ztc3BhY2UgPT0gTlVMTCkg
eworCQkJZGJfcHJpbnRmKCJObyB2bXNwYWNlIGZvciBwcm9jZXNzIik7CisJCQlyZXR1cm47CisJ
CX0KKwkJCXBtYXAgPSB2bXNwYWNlX3BtYXAocC0+cF92bXNwYWNlKTsKKwl9IGVsc2UKKwkJcG1h
cCA9IGtlcm5lbF9wbWFwOworCisJZGJfcHJpbnRmKCJwbWFwOiVwIHNlZ3RhYjolcCBhc2lkOiV4
IGdlbmVyYXRpb246JXhcbiIsCisJICAgIHBtYXAsIHBtYXAtPnBtX3NlZ3RhYiwgcG1hcC0+cG1f
YXNpZFswXS5hc2lkLAorCSAgICBwbWFwLT5wbV9hc2lkWzBdLmdlbik7CisJZm9yIChpID0gMDsg
aSA8IE5QREVQRzsgaSsrKSB7CisJCXBkX2VudHJ5X3QgKnBkcGU7CisJCXB0X2VudHJ5X3QgKnBk
ZTsKKwkJcHRfZW50cnlfdCBwdGU7CisKKwkJcGRwZSA9IChwZF9lbnRyeV90ICopcG1hcC0+cG1f
c2VndGFiW2ldOworCQlpZiAocGRwZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWRiX3ByaW50
ZigiWyU0ZF0gJXBcbiIsIGksIHBkcGUpOworCQlmb3IgKGogPSAwOyBqIDwgTlBERVBHOyBqKysp
IHsKKwkJCXBkZSA9IChwdF9lbnRyeV90ICopcGRwZVtqXTsKKwkJCWlmIChwZGUgPT0gTlVMTCkK
KwkJCQljb250aW51ZTsKKwkJCWRiX3ByaW50ZigiXHRbJTRkXSAlcFxuIiwgaiwgcGRlKTsKKwkJ
CWZvciAoayA9IDA7IGsgPCBOUFRFUEc7IGsrKykgeworCQkJCXB0ZSA9IHBkZVtrXTsKKwkJCQlp
ZiAocHRlID09IDAgfHwgIXB0ZV9pc192YWxpZCgmcHRlKSkKKwkJCQkJY29udGludWU7CisJCQkJ
cGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKKwkJCQl2YSA9ICgodV9sb25nKWkgPDwgU0VHU0hJ
RlQpIHwgKGogPDwgUERSU0hJRlQpIHwgKGsgPDwgUEFHRV9TSElGVCk7CisJCQkJZGJfcHJpbnRm
KCJcdFx0WyUwNGRdIHZhOiAlcCBwdGU6ICU4anggcGE6JWp4XG4iLAorCQkJCSAgICAgICBrLCAo
dm9pZCAqKXZhLCAodWludG1heF90KXB0ZSwgKHVpbnRtYXhfdClwYSk7CisJCQl9CisJCX0KKwl9
Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUcpCisKK3N0YXRpYyB2b2lkIHBhZHMocG1h
cF90IHBtKTsKK3ZvaWQgcG1hcF9wdmR1bXAodm1fb2Zmc2V0X3QgcGEpOworCisvKiBwcmludCBh
ZGRyZXNzIHNwYWNlIG9mIHBtYXAqLworc3RhdGljIHZvaWQKK3BhZHMocG1hcF90IHBtKQorewor
CXVuc2lnbmVkIHZhLCBpLCBqOworCXB0X2VudHJ5X3QgKnB0ZXA7CisKKwlpZiAocG0gPT0ga2Vy
bmVsX3BtYXApCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgTlBURVBHOyBpKyspCisJCWlm
IChwbS0+cG1fc2VndGFiW2ldKQorCQkJZm9yIChqID0gMDsgaiA8IE5QVEVQRzsgaisrKSB7CisJ
CQkJdmEgPSAoaSA8PCBTRUdTSElGVCkgKyAoaiA8PCBQQUdFX1NISUZUKTsKKwkJCQlpZiAocG0g
PT0ga2VybmVsX3BtYXAgJiYgdmEgPCBLRVJOQkFTRSkKKwkJCQkJY29udGludWU7CisJCQkJaWYg
KHBtICE9IGtlcm5lbF9wbWFwICYmCisJCQkJICAgIHZhID49IFZNX01BWFVTRVJfQUREUkVTUykK
KwkJCQkJY29udGludWU7CisJCQkJcHRlcCA9IHBtYXBfcHRlKHBtLCB2YSk7CisJCQkJaWYgKHB0
ZV9pc192YWxpZChwdGVwKSkKKwkJCQkJcHJpbnRmKCIleDoleCAiLCB2YSwgKihpbnQgKilwdGVw
KTsKKwkJCX0KKworfQorCit2b2lkCitwbWFwX3B2ZHVtcCh2bV9vZmZzZXRfdCBwYSkKK3sKKwly
ZWdpc3RlciBwdl9lbnRyeV90IHB2OworCXZtX3BhZ2VfdCBtOworCisJcHJpbnRmKCJwYSAleCIs
IHBhKTsKKwltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwlmb3IgKHB2ID0gVEFJTFFfRklSU1Qo
Jm0tPm1kLnB2X2xpc3QpOyBwdjsKKwkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9saXN0KSkg
eworCQlwcmludGYoIiAtPiBwbWFwICVwLCB2YSAleCIsICh2b2lkICopcHYtPnB2X3BtYXAsIHB2
LT5wdl92YSk7CisJCXBhZHMocHYtPnB2X3BtYXApOworCX0KKwlwcmludGYoIiAiKTsKK30KKwor
LyogTi9DICovCisjZW5kaWYKKworCisvKgorICogQWxsb2NhdGUgVExCIGFkZHJlc3Mgc3BhY2Ug
dGFnIChjYWxsZWQgQVNJRCBvciBUTEJQSUQpIGFuZCByZXR1cm4gaXQuCisgKiBJdCB0YWtlcyBh
bG1vc3QgYXMgbXVjaCBvciBtb3JlIHRpbWUgdG8gc2VhcmNoIHRoZSBUTEIgZm9yIGEKKyAqIHNw
ZWNpZmljIEFTSUQgYW5kIGZsdXNoIHRob3NlIGVudHJpZXMgYXMgaXQgZG9lcyB0byBmbHVzaCB0
aGUgZW50aXJlIFRMQi4KKyAqIFRoZXJlZm9yZSwgd2hlbiB3ZSBhbGxvY2F0ZSBhIG5ldyBBU0lE
LCB3ZSBqdXN0IHRha2UgdGhlIG5leHQgbnVtYmVyLiBXaGVuCisgKiB3ZSBydW4gb3V0IG9mIG51
bWJlcnMsIHdlIGZsdXNoIHRoZSBUTEIsIGluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiBjb3VudAor
ICogYW5kIHN0YXJ0IG92ZXIuIEFTSUQgemVybyBpcyByZXNlcnZlZCBmb3Iga2VybmVsIHVzZS4K
KyAqLworc3RhdGljIHZvaWQKK3BtYXBfYXNpZF9hbGxvYyhwbWFwKQorCXBtYXBfdCBwbWFwOwor
eworCWlmIChwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uYXNpZCAhPSBQTUFQX0FTSURf
UkVTRVJWRUQgJiYKKwkgICAgcG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9PSBQ
Q1BVX0dFVChhc2lkX2dlbmVyYXRpb24pKTsKKwllbHNlIHsKKwkJaWYgKFBDUFVfR0VUKG5leHRf
YXNpZCkgPT0gcG1hcF9tYXhfYXNpZCkgeworCQkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIoTlVM
TCk7CisJCQlQQ1BVX1NFVChhc2lkX2dlbmVyYXRpb24sCisJCQkgICAgKFBDUFVfR0VUKGFzaWRf
Z2VuZXJhdGlvbikgKyAxKSAmIEFTSURHRU5fTUFTSyk7CisJCQlpZiAoUENQVV9HRVQoYXNpZF9n
ZW5lcmF0aW9uKSA9PSAwKSB7CisJCQkJUENQVV9TRVQoYXNpZF9nZW5lcmF0aW9uLCAxKTsKKwkJ
CX0KKwkJCVBDUFVfU0VUKG5leHRfYXNpZCwgMSk7CS8qIDAgbWVhbnMgaW52YWxpZCAqLworCQl9
CisJCXBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5hc2lkID0gUENQVV9HRVQobmV4dF9h
c2lkKTsKKwkJcG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9IFBDUFVfR0VUKGFz
aWRfZ2VuZXJhdGlvbik7CisJCVBDUFVfU0VUKG5leHRfYXNpZCwgUENQVV9HRVQobmV4dF9hc2lk
KSArIDEpOworCX0KK30KKworc3RhdGljIHB0X2VudHJ5X3QKK2luaXRfcHRlX3Byb3Qodm1fcGFn
ZV90IG0sIHZtX3Byb3RfdCBhY2Nlc3MsIHZtX3Byb3RfdCBwcm90KQoreworCXB0X2VudHJ5X3Qg
cnc7CisKKwlpZiAoIShwcm90ICYgVk1fUFJPVF9XUklURSkpCisJCXJ3ID0gUFRFX1ZBTElEIHwg
UFRFX1JPOworCWVsc2UgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwKSB7CisJ
CWlmICgoYWNjZXNzICYgVk1fUFJPVF9XUklURSkgIT0gMCkKKwkJCXJ3ID0gUFRFX1ZBTElEIHwg
UFRFX0Q7CisJCWVsc2UKKwkJCXJ3ID0gUFRFX1ZBTElEOworCX0gZWxzZSB7CisJCS8qCisJCSAq
IE5lZWRuJ3QgZW11bGF0ZSBhIHJlZmVyZW5jZS9tb2RpZmllZCBiaXQgZm9yIHVubWFuYWdlZAor
CQkgKiBwYWdlcy4KKwkJICovCisJCXJ3ID0gUFRFX1ZBTElEIHwgUFRFX0Q7CisJCXB0ZV9yZWZf
c2V0KCZydyk7CisJfQorCisJcmV0dXJuIChydyk7Cit9CisKKy8qCisgKiBwbWFwX2VtdWxhdGVf
bW9kaWZpZWQgOiBkbyBkaXJ0eSBiaXQgZW11bGF0aW9uCisgKgorICogT24gU01QLCB1cGRhdGUg
anVzdCB0aGUgbG9jYWwgVExCLCBvdGhlciBDUFVzIHdpbGwgdXBkYXRlIHRoZWlyCisgKiBUTEJz
IGZyb20gUFRFIGxhemlseSwgaWYgdGhleSBnZXQgdGhlIGV4Y2VwdGlvbi4KKyAqIFJldHVybnMg
MCBpbiBjYXNlIG9mIHN1Y2VzcywgMSBpZiB0aGUgcGFnZSBpcyByZWFkIG9ubHkgYW5kIHdlCisg
KiBuZWVkIHRvIGZhdWx0LgorICovCitpbnQKK3BtYXBfZW11bGF0ZV9tb2RpZmllZChwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3Qg
KnB0ZTsKKworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJ
aWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkKKwkJcHRlID0gKHB0X2VudHJ5X3QgKilwZGU7
CisJZWxzZQorCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJaWYgKHB0ZSA9PSBO
VUxMKQorCQlwYW5pYygicG1hcF9lbXVsYXRlX21vZGlmaWVkOiBjYW4ndCBmaW5kIFBURSIpOwor
I2lmZGVmIFNNUAorCS8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZSBvdGhlciBDUFUgY2hhbmdl
ZCBtLWJpdCAqLworCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkgfHwgcHRlX3Rlc3QocHRlLCBQVEVf
RCkpIHsKKwkJdGxiX3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJCVBNQVBfVU5MT0NLKHBtYXAp
OworCQlyZXR1cm4gKDApOworCX0KKyNlbHNlCisJaWYgKCFwdGVfaXNfdmFsaWQocHRlKSB8fCBw
dGVfdGVzdChwdGUsIFBURV9EKSkgeworCQl0bGJfdXBkYXRlKHBtYXAsIHZhLCAqcHRlKTsKKwkJ
UE1BUF9VTkxPQ0socG1hcCk7CisJCXJldHVybiAoMCk7CisJfQorI2VuZGlmCisJaWYgKHB0ZV90
ZXN0KHB0ZSwgUFRFX1JPKSkgeworCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJcmV0dXJuICgxKTsK
Kwl9CisJcHRlX2F0b21pY19zZXQocHRlLCBQVEVfRCk7IC8qIG1hcmsgaXQgcmVmZXJlbmNlZCBh
bmQgbW9kaWZpZWQgKi8KKwlwdGVfcmVmX2F0b21pY19zZXQocHRlKTsKKwl0bGJfdXBkYXRlKHBt
YXAsIHZhLCAqcHRlKTsKKwlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX01BTkFHRUQpKQorCQlwYW5p
YygicG1hcF9lbXVsYXRlX21vZGlmaWVkOiB1bm1hbmFnZWQgcGFnZSIpOworCVBNQVBfVU5MT0NL
KHBtYXApOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBwbWFwX2VtdWxhdGVfcmVmZXJlbmNl
ZDogZG8gcmVmZXJlbmNlIGJpdCBlbXVsYXRpb24KKyAqCisgKiBSZXR1cm5zIDAgaW4gY2FzZSBv
ZiBzdWNjZXNzLiAgUmV0dXJucyAxIGlmIHdlIG5lZWQgdG8gZmF1bHQuCisgKi8KK2ludAorcG1h
cF9lbXVsYXRlX3JlZmVyZW5jZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBk
X2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAo
cG1hcCkpCisJCXJldHVybiAoMSk7CisJUE1BUF9MT0NLKHBtYXApOworCXBkZSA9IHBtYXBfcGRl
KHBtYXAsIHZhKTsKKwlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSBOVUxMKSB7CisJCS8qIElu
dmFsaWQgcGFnZSBkaXJlY3RvcnkuICovCisJCWdvdG8gZG9mYXVsdDsKKwl9CisJaWYgKHBkZV9p
c18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQlwdGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwl9IGVs
c2UKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCWlmIChwdGUgPT0gTlVMTCkg
eworCQkvKiBJbnZhbGlkIHBhZ2UgdGFibGUuICovCisJCWdvdG8gZG9mYXVsdDsKKwl9CisJaWYg
KCFwdGVfaXNfdmFsaWQocHRlKSkgeworCQkvKiBJbnZhbGlkIFBURS4gKi8KKwkJZ290byBkb2Zh
dWx0OworCX0KKwkvKiBDaGVjayB0byBzZWUgaWYgYWxyZWFkeSBtYXJrZWQgYnkgb3RoZXIgQ1BV
LiAgKi8KKwlpZiAoIXB0ZV9pc19yZWYocHRlKSkKKwkJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSk7
CisKKwl0bGJfdXBkYXRlKHBtYXAsIHZhLCAqcHRlKTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwor
CXJldHVybiAoMCk7CisKK2RvZmF1bHQ6CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuICgx
KTsKK30KKwordm9pZAorcG1hcF9mbHVzaF9wdmNhY2hlKHZtX3BhZ2VfdCBtKQoreworCXB2X2Vu
dHJ5X3QgcHY7CisKKwlpZiAobSAhPSBOVUxMKSB7CisJCWZvciAocHYgPSBUQUlMUV9GSVJTVCgm
bS0+bWQucHZfbGlzdCk7IHB2OworCQkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSkg
eworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJWkUp
OworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy9wbWFwLmMgYi9zeXMvbWlw
cy9taXBzL3BtYXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3BtYXAuYworKysgYi9zeXMvbWlwcy9t
aXBzL3BtYXAuYwpAQCAtNzQsNiArNzQsNyBAQAogI2luY2x1ZGUgPHN5cy9wcm9jLmg+CiAjaW5j
bHVkZSA8c3lzL3J3bG9jay5oPgogI2luY2x1ZGUgPHN5cy9zY2hlZC5oPgorI2luY2x1ZGUgPHN5
cy9fdHlwZXMuaD4KICNpZmRlZiBTTVAKICNpbmNsdWRlIDxzeXMvc21wLmg+CiAjZWxzZQpAQCAt
MjMyLDcgKzIzMyw3IEBACiAJc3lzbSA9ICZzeXNtYXBfbG1lbVtjcHVdOwogCXN5c20tPnNhdmVk
X2ludHIgPSBpbnRyOwogCXZhID0gc3lzbS0+YmFzZTsKLQlucHRlID0gVExCTE9fUEFfVE9fUEZO
KHBoeXMpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WIHwgUFRFX0c7CisJbnB0ZSA9IFRM
QkxPX1BBX1RPX1BGTihwaHlzKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQ
VEVfRzsKIAlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOwogCSpwdGUgPSBucHRlOwog
CXN5c20tPnZhbGlkMSA9IDE7CkBAIC0yNTQsMTAgKzI1NSwxMCBAQAogCXN5c20tPnNhdmVkX2lu
dHIgPSBpbnRyOwogCXZhMSA9IHN5c20tPmJhc2U7CiAJdmEyID0gc3lzbS0+YmFzZSArIFBBR0Vf
U0laRTsKLQlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBoeXMxKSB8IFBURV9DX0NBQ0hFIHwgUFRF
X0QgfCBQVEVfViB8IFBURV9HOworCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5czEpIHwgUFRF
X0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9HOwogCXB0ZSA9IHBtYXBfcHRlKGtl
cm5lbF9wbWFwLCB2YTEpOwogCSpwdGUgPSBucHRlOwotCW5wdGUgPSBUTEJMT19QQV9UT19QRk4o
cGh5czIpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WIHwgUFRFX0c7CisJbnB0ZSA9IFRM
QkxPX1BBX1RPX1BGTihwaHlzMikgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1ZBTElEIHwg
UFRFX0c7CiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhMik7CiAJKnB0ZSA9IG5wdGU7
CiAJc3lzbS0+dmFsaWQxID0gMTsKQEAgLTU1Niw5ICs1NTcsMTUgQEAKIAltc2didWZpbml0KG1z
Z2J1ZnAsIG1zZ2J1ZnNpemUpOwogCiAJLyoKLQkgKiBTdGVhbCB0aHJlYWQwIGtzdGFjay4KKwkg
KiBTdGVhbCB0aHJlYWQwIGtzdGFjay4gIFRoaXMgbXVzdCBiZSBhbGlnbmVkIHRvCisJICogKEtT
VEFDS19QQUdFX1NJWkUgKiAyKSBzbyBpdCBjYW4gbWFwcGVkIHRvIGEgc2luZ2xlIFRMQiBlbnRy
eS4KKwkgKgorCSAqIFhYWCBUaGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgd2F5IG9mIGdldHRpbmcg
YWxpZ25lZCBtZW1vcnkKKwkgKiB3aXRoIHBtYXBfc3RlYWxfbWVtb3J5KCkuCiAJICovCi0Ja3N0
YWNrMCA9IHBtYXBfc3RlYWxfbWVtb3J5KEtTVEFDS19QQUdFUyA8PCBQQUdFX1NISUZUKTsKKwlr
c3RhY2swID0gcG1hcF9zdGVhbF9tZW1vcnkoKEtTVEFDS19QQUdFUyArIEtTVEFDS19HVUFSRF9Q
QUdFUykgXAorCQkJCQk8PCBQQUdFX1NISUZUKTsKKwlrc3RhY2swID0gcm91bmR1cDIoa3N0YWNr
MCwgKEtTVEFDS19QQUdFX1NJWkUgKiAyKSk7CiAKIAl2aXJ0dWFsX2F2YWlsID0gVk1fTUlOX0tF
Uk5FTF9BRERSRVNTOwogCXZpcnR1YWxfZW5kID0gVk1fTUFYX0tFUk5FTF9BRERSRVNTOwpAQCAt
NjA1LDYgKzYxMiw3IEBACiAKIAlUQUlMUV9JTklUKCZtLT5tZC5wdl9saXN0KTsKIAltLT5tZC5w
dl9mbGFncyA9IDA7CisJbS0+bWQucHZfbWVtYXR0ciA9IFZNX01FTUFUVFJfREVGQVVMVDsKIH0K
IAogLyoKQEAgLTgwMSw3ICs4MDksNyBAQAogCXB0ZXAgPSBwbWFwX3B0ZShwbWFwLCB2YSk7CiAJ
aWYgKHB0ZXAgIT0gTlVMTCkgewogCQlwdGUgPSAqcHRlcDsKLQkJaWYgKHB0ZV90ZXN0KCZwdGUs
IFBURV9WKSAmJiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKKwkJaWYgKHB0ZV90ZXN0KCZw
dGUsIFBURV9WQUxJRCkgJiYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfUk8pIHx8CiAJCSAgICAocHJv
dCAmIFZNX1BST1RfV1JJVEUpID09IDApKSB7CiAJCQlwdGVfcGEgPSBUTEJMT19QVEVfVE9fUEEo
cHRlKTsKIAkJCWlmICh2bV9wYWdlX3BhX3RyeXJlbG9jayhwbWFwLCBwdGVfcGEsICZwYSkpCkBA
IC04MzQsOSArODQyLDkgQEAKIAogCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CiAJ
b3B0ZSA9ICpwdGU7Ci0JbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0Qg
fCBQVEVfViB8IFBURV9HOworCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgYXR0ciB8IFBU
RV9EIHwgUFRFX1ZBTElEIHwgUFRFX0c7CiAJKnB0ZSA9IG5wdGU7Ci0JaWYgKHB0ZV90ZXN0KCZv
cHRlLCBQVEVfVikgJiYgb3B0ZSAhPSBucHRlKQorCWlmIChwdGVfdGVzdCgmb3B0ZSwgUFRFX1ZB
TElEKSAmJiBvcHRlICE9IG5wdGUpCiAJCXBtYXBfdXBkYXRlX3BhZ2Uoa2VybmVsX3BtYXAsIHZh
LCBucHRlKTsKIH0KIApAQCAtMTQ0OSw3ICsxNDU3LDcgQEAKIAkJCQlpZiAobS0+bWQucHZfZmxh
Z3MgJiBQVl9UQUJMRV9SRUYpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9SRUZFUkVO
Q0VEKTsKIAkJCQltLT5tZC5wdl9mbGFncyAmPSB+UFZfVEFCTEVfUkVGOwotCQkJCVRBSUxRX1JF
TU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJCVRBSUxRX1JFTU9WRSgmbS0+
bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQkJCWlmIChUQUlMUV9FTVBUWSgmbS0+bWQucHZf
bGlzdCkpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7CiAJCQkJ
cGMtPnBjX21hcFtmaWVsZF0gfD0gMVVMIDw8IGJpdDsKQEAgLTE2MjcsOSArMTYzNSw5IEBACiAJ
cHZfZW50cnlfdCBwdjsKIAogCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9XTE9DS0VE
KTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFf
Rk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCkgewogCQlpZiAocG1hcCA9PSBQVl9Q
TUFQKHB2KSAmJiB2YSA9PSBwdi0+cHZfdmEpIHsKLQkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9s
aXN0LCBwdiwgcHZfbGlzdCk7CisJCQlUQUlMUV9SRU1PVkUoJnB2aC0+cHZfbGlzdCwgcHYsIHB2
X25leHQpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xNjcxLDcgKzE2NzksNyBAQAogCVBNQVBf
TE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOwogCWlmICgocHYgPSBnZXRfcHZfZW50cnkocG1h
cCwgVFJVRSkpICE9IE5VTEwpIHsKIAkJcHYtPnB2X3ZhID0gdmE7Ci0JCVRBSUxRX0lOU0VSVF9U
QUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZt
LT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CiAJCXJldHVybiAoVFJVRSk7CiAJfSBlbHNlCiAJ
CXJldHVybiAoRkFMU0UpOwpAQCAtMTc0NCw3ICsxNzUyLDcgQEAKIAkvKgogCSAqIElmIHRoZXJl
IGlzIG5vIHB0ZSBmb3IgdGhpcyBhZGRyZXNzLCBqdXN0IHNraXAgaXQhCiAJICovCi0JaWYgKCFw
dGVfdGVzdChwdHEsIFBURV9WKSkKKwlpZiAoIXB0ZV90ZXN0KHB0cSwgUFRFX1ZBTElEKSkKIAkJ
cmV0dXJuOwogCiAJKHZvaWQpcG1hcF9yZW1vdmVfcHRlKHBtYXAsIHB0cSwgdmEsICpwZGUpOwpA
QCAtMTgxMCw3ICsxODE4LDcgQEAKIAkJdmEgPSB2YV9uZXh0OwogCQlmb3IgKHB0ZSA9IHBtYXBf
cGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJICAgIHN2YSAr
PSBQQUdFX1NJWkUpIHsKLQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikpIHsKKwkJCWlmICgh
cHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpKSB7CiAJCQkJaWYgKHZhICE9IHZhX25leHQpIHsKIAkJ
CQkJcG1hcF9pbnZhbGlkYXRlX3JhbmdlKHBtYXAsIHZhLCBzdmEpOwogCQkJCQl2YSA9IHZhX25l
eHQ7CkBAIC0xODY4LDcgKzE4NzYsNyBAQAogCQkgKiBJZiBpdCdzIGxhc3QgbWFwcGluZyB3cml0
ZWJhY2sgYWxsIGNhY2hlcyBmcm9tIAogCQkgKiB0aGUgcGFnZSBiZWluZyBkZXN0cm95ZWQKIAkg
CSAqLwotCQlpZiAoVEFJTFFfTkVYVChwdiwgcHZfbGlzdCkgPT0gTlVMTCkKKwkJaWYgKFRBSUxR
X05FWFQocHYsIHB2X25leHQpID09IE5VTEwpCiAJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9p
bmRleChwdi0+cHZfdmEsIFBBR0VfU0laRSk7CiAKIAkJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRf
Y291bnQtLTsKQEAgLTE4OTcsNyArMTkwNSw3IEBACiAJCX0KIAkJcG1hcF9pbnZhbGlkYXRlX3Bh
Z2UocG1hcCwgcHYtPnB2X3ZhKTsKIAotCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2
LCBwdl9saXN0KTsKKwkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7
CiAJCXBtYXBfdW51c2VfcHQocG1hcCwgcHYtPnB2X3ZhLCAqcGRlKTsKIAkJZnJlZV9wdl9lbnRy
eShwbWFwLCBwdik7CiAJCVBNQVBfVU5MT0NLKHBtYXApOwpAQCAtMTk1OSw3ICsxOTY3LDcgQEAK
IAkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsg
cHRlKyssCiAJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7CiAJCQlwYml0cyA9ICpwdGU7Ci0JCQlp
ZiAoIXB0ZV90ZXN0KCZwYml0cywgUFRFX1YpIHx8IHB0ZV90ZXN0KCZwYml0cywKKwkJCWlmICgh
cHRlX3Rlc3QoJnBiaXRzLCBQVEVfVkFMSUQpIHx8IHB0ZV90ZXN0KCZwYml0cywKIAkJCSAgICBQ
VEVfUk8pKSB7CiAJCQkJaWYgKHZhICE9IHZhX25leHQpIHsKIAkJCQkJcG1hcF9pbnZhbGlkYXRl
X3JhbmdlKHBtYXAsIHZhLCBzdmEpOwpAQCAtMjA3MSw3ICsyMDc5LDcgQEAKIAkvKgogCSAqIE1h
cHBpbmcgaGFzIG5vdCBjaGFuZ2VkLCBtdXN0IGJlIHByb3RlY3Rpb24gb3Igd2lyaW5nIGNoYW5n
ZS4KIAkgKi8KLQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9WKSAmJiBvcGEgPT0gcGEpIHsK
KwlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9WQUxJRCkgJiYgb3BhID09IHBhKSB7CiAJCS8q
CiAJCSAqIFdpcmluZyBjaGFuZ2UsIGp1c3QgdXBkYXRlIHN0YXRzLiBXZSBkb24ndCB3b3JyeSBh
Ym91dAogCQkgKiB3aXJpbmcgUFQgcGFnZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9u
ZyBhcyB0aGVyZQpAQCAtMjEzNSw3ICsyMTQzLDcgQEAKIAkJaWYgKHB2ID09IE5VTEwpCiAJCQlw
diA9IGdldF9wdl9lbnRyeShwbWFwLCBGQUxTRSk7CiAJCXB2LT5wdl92YSA9IHZhOwotCQlUQUlM
UV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQlUQUlMUV9JTlNF
UlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQluZXdwdGUgfD0gUFRFX01B
TkFHRUQ7CiAJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKIAkJCXZtX3BhZ2VfYWZs
YWdfc2V0KG0sIFBHQV9XUklURUFCTEUpOwpAQCAtMjE2MCw3ICsyMTY4LDcgQEAKIAkgKi8KIAlp
ZiAob3JpZ3B0ZSAhPSBuZXdwdGUpIHsKIAkJKnB0ZSA9IG5ld3B0ZTsKLQkJaWYgKHB0ZV90ZXN0
KCZvcmlncHRlLCBQVEVfVikpIHsKKwkJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVkFMSUQp
KSB7CiAJCQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSAmJiBvcGEgIT0gcGEp
IHsKIAkJCQlpZiAob20tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQogCQkJCQl2bV9wYWdl
X2FmbGFnX3NldChvbSwgUEdBX1JFRkVSRU5DRUQpOwpAQCAtMjI2OCw3ICsyMjc2LDcgQEAKIAl9
CiAKIAlwdGUgPSBwbWFwX3B0ZShwbWFwLCB2YSk7Ci0JaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1Yp
KSB7CisJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSkgewogCQlpZiAobXB0ZSAhPSBOVUxM
KSB7CiAJCQltcHRlLT53aXJlX2NvdW50LS07CiAJCQltcHRlID0gTlVMTDsKQEAgLTIyOTgsNyAr
MjMwNiw3IEBACiAJLyoKIAkgKiBOb3cgdmFsaWRhdGUgbWFwcGluZyB3aXRoIFJPIHByb3RlY3Rp
b24KIAkgKi8KLQkqcHRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9WOwor
CSpwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX1ZBTElEOwogCWlmICgo
bS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkKIAkJKnB0ZSB8PSBQVEVfTUFOQUdFRDsK
IApAQCAtMjM1Niw3ICsyMzY0LDcgQEAKIAkJY3B1ID0gUENQVV9HRVQoY3B1aWQpOwogCQlzeXNt
ID0gJnN5c21hcF9sbWVtW2NwdV07CiAJCS8qIFNpbmNlIHRoaXMgaXMgZm9yIHRoZSBkZWJ1Z2dl
ciwgbm8gbG9ja3Mgb3IgYW55IG90aGVyIGZ1biAqLwotCQlucHRlID0gVExCTE9fUEFfVE9fUEZO
KHBhKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8CisJCW5wdGUgPSBUTEJMT19QQV9U
T19QRk4ocGEpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WQUxJRCB8CiAJCSAgICBQVEVf
RzsKIAkJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHN5c20tPmJhc2UpOwogCQkqcHRlID0g
bnB0ZTsKQEAgLTI0ODQsNyArMjQ5Miw3IEBACiAJCQl2YV9uZXh0ID0gZXZhOwogCQlmb3IgKHB0
ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJ
ICAgIHN2YSArPSBQQUdFX1NJWkUpIHsKLQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikpCisJ
CQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSkKIAkJCQljb250aW51ZTsKIAkJCWlmICgh
cHRlX3Rlc3QocHRlLCBQVEVfVykpCiAJCQkJcGFuaWMoInBtYXBfdW53aXJlOiBwdGUgJSNqeCBp
cyBtaXNzaW5nIFBHX1ciLApAQCAtMjY2Niw3ICsyNjc0LDcgQEAKIAlLQVNTRVJUKHN5c20tPnZh
bGlkMSA9PSAwLCAoInBtYXBfcXVpY2tfZW50ZXJfcGFnZTogUFRFIGJ1c3kiKSk7CiAKIAlwdGUg
PSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgc3lzbS0+YmFzZSk7Ci0JKnB0ZSA9IFRMQkxPX1BBX1RP
X1BGTihwYSkgfCBQVEVfRCB8IFBURV9WIHwgUFRFX0cgfAorCSpwdGUgPSBUTEJMT19QQV9UT19Q
Rk4ocGEpIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRyB8CiAJICAgIChpc19jYWNoZWFibGVf
cGFnZShwYSwgbSkgPyBQVEVfQ19DQUNIRSA6IFBURV9DX1VOQ0FDSEVEKTsKIAlzeXNtLT52YWxp
ZDEgPSAxOwogCkBAIC0yNzE5LDcgKzI3MjcsNyBAQAogCSAgICAoInBtYXBfcGFnZV9leGlzdHNf
cXVpY2s6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CiAJcnYgPSBGQUxTRTsKIAlyd193
bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlz
dCwgcHZfbGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0
KSB7CiAJCWlmIChQVl9QTUFQKHB2KSA9PSBwbWFwKSB7CiAJCQlydiA9IFRSVUU7CiAJCQlicmVh
azsKQEAgLTI3NzIsNyArMjc4MCw3IEBACiAJCQkJS0FTU0VSVChwZGUgIT0gTlVMTCAmJiAqcGRl
ICE9IDAsCiAJCQkJICAgICgicG1hcF9yZW1vdmVfcGFnZXM6IHBkZSIpKTsKIAkJCQlwdGUgPSBw
bWFwX3BkZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOwotCQkJCWlmICghcHRlX3Rlc3QocHRlLCBQ
VEVfVikpCisJCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpCiAJCQkJCXBhbmljKCJw
bWFwX3JlbW92ZV9wYWdlczogYmFkIHB0ZSIpOwogCQkJCXRwdGUgPSAqcHRlOwogCkBAIC0yODAy
LDcgKzI4MTAsNyBAQAogCQkJCXB2X2VudHJ5X2NvdW50LS07CiAJCQkJcGMtPnBjX21hcFtmaWVs
ZF0gfD0gYml0bWFzazsKIAkJCQlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudC0tOwotCQkJ
CVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJCVRBSUxRX1JF
TU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQkJCWlmIChUQUlMUV9FTVBUWSgm
bS0+bWQucHZfbGlzdCkpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJM
RSk7CiAJCQkJcG1hcF91bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsICpwZGUpOwpAQCAtMjgzMyw3
ICsyODQxLDcgQEAKIAkJcmV0dXJuIChydik7CiAKIAlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9j
aywgUkFfV0xPQ0tFRCk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X2xp
c3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgewogCQlw
bWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRlID0gcG1hcF9wdGUo
cG1hcCwgcHYtPnB2X3ZhKTsKQEAgLTI4NjMsNyArMjg3MSw3IEBACiAJaWYgKChtLT5vZmxhZ3Mg
JiBWUE9fVU5NQU5BR0VEKSAhPSAwKQogCQlyZXR1cm4gKGNvdW50KTsKIAlyd193bG9jaygmcHZo
X2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlz
dCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCXBt
YXAgPSBQVl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShw
bWFwLCBwdi0+cHZfdmEpOwpAQCAtMjg5NywxMSArMjkwNSwxMSBAQAogCWlmICghdm1fcGFnZV94
YnVzaWVkKG0pICYmIChtLT5hZmxhZ3MgJiBQR0FfV1JJVEVBQkxFKSA9PSAwKQogCQlyZXR1cm47
CiAJcndfd2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1k
LnB2X2xpc3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwg
cHZfbmV4dCkgewogCQlwbWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJ
cHRlID0gcG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKLQkJS0FTU0VSVChwdGUgIT0gTlVMTCAm
JiBwdGVfdGVzdChwdGUsIFBURV9WKSwKKwkJS0FTU0VSVChwdGUgIT0gTlVMTCAmJiBwdGVfdGVz
dChwdGUsIFBURV9WQUxJRCksCiAJCSAgICAoInBhZ2Ugb24gcHZfbGlzdCBoYXMgbm8gcHRlIikp
OwogCQlwYml0cyA9ICpwdGU7CiAJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9EKSkgewpAQCAt
MzA0MCw3ICszMDQ4LDcgQEAKIAkJdmEgPSB2YV9uZXh0OwogCQlmb3IgKHB0ZSA9IHBtYXBfcGRl
X3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJICAgIHN2YSArPSBQ
QUdFX1NJWkUpIHsKLQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfTUFOQUdFRCB8IFBURV9WKSkg
eworCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VEIHwgUFRFX1ZBTElEKSkgewogCQkJ
CWlmICh2YSAhPSB2YV9uZXh0KSB7CiAJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2
YSwgc3ZhKTsKIAkJCQkJdmEgPSB2YV9uZXh0OwpAQCAtMzEwNiw3ICszMTE0LDcgQEAKIAlpZiAo
KG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCiAJCXJldHVybjsKIAlyd193bG9jaygm
cHZoX2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZf
bGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJ
CXBtYXAgPSBQVl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0
ZShwbWFwLCBwdi0+cHZfdmEpOwpAQCAtMzIwOCw3ICszMjE2LDcgQEAKIHJldHJ5OgogCXB0ZXAg
PSBwbWFwX3B0ZShwbWFwLCBhZGRyKTsKIAlwdGUgPSAocHRlcCAhPSBOVUxMKSA/ICpwdGVwIDog
MDsKLQlpZiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9WKSkgeworCWlmICghcHRlX3Rlc3QoJnB0ZSwg
UFRFX1ZBTElEKSkgewogCQl2YWwgPSAwOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zMzQ1LDcgKzMz
NTMsNyBAQAogI2VuZGlmCiAJCQlmb3IgKGsgPSAwOyBrIDwgTlBURVBHOyBrKyspIHsKIAkJCQlw
dGUgPSBwZGVba107Ci0JCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfdGVzdCgmcHRlLCBQVEVfVikp
CisJCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfdGVzdCgmcHRlLCBQVEVfVkFMSUQpKQogCQkJCQlj
b250aW51ZTsKIAkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGUpOwogCQkJCXZhID0gKCh1X2xv
bmcpaSA8PCBTRUdTSElGVCkgfCAoaiA8PCBQRFJTSElGVCkgfCAoayA8PCBQQUdFX1NISUZUKTsK
QEAgLTMzOTMsMTUgKzM0MDEsMTUgQEAKIAlwdF9lbnRyeV90IHJ3OwogCiAJaWYgKCEocHJvdCAm
IFZNX1BST1RfV1JJVEUpKQotCQlydyA9IFBURV9WIHwgUFRFX1JPOworCQlydyA9IFBURV9WQUxJ
RCB8IFBURV9STzsKIAllbHNlIGlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkg
ewogCQlpZiAoKGFjY2VzcyAmIFZNX1BST1RfV1JJVEUpICE9IDApCi0JCQlydyA9IFBURV9WIHwg
UFRFX0Q7CisJCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwogCQllbHNlCi0JCQlydyA9IFBURV9W
OworCQkJcncgPSBQVEVfVkFMSUQ7CiAJfSBlbHNlCiAJCS8qIE5lZWRuJ3QgZW11bGF0ZSBhIG1v
ZGlmaWVkIGJpdCBmb3IgdW5tYW5hZ2VkIHBhZ2VzLiAqLwotCQlydyA9IFBURV9WIHwgUFRFX0Q7
CisJCXJ3ID0gUFRFX1ZBTElEIHwgUFRFX0Q7CiAJcmV0dXJuIChydyk7CiB9CiAKQEAgLTM0MjQs
MTMgKzM0MzIsMTMgQEAKIAkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogY2FuJ3QgZmlu
ZCBQVEUiKTsKICNpZmRlZiBTTVAKIAkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgb3RoZXIg
Q1BVIGNoYW5nZWQgbS1iaXQgKi8KLQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpIHx8IHB0ZV90
ZXN0KHB0ZSwgUFRFX0QpKSB7CisJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkgfHwgcHRl
X3Rlc3QocHRlLCBQVEVfRCkpIHsKIAkJdGxiX3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CiAJCVBN
QVBfVU5MT0NLKHBtYXApOwogCQlyZXR1cm4gKDApOwogCX0KICNlbHNlCi0JaWYgKCFwdGVfdGVz
dChwdGUsIFBURV9WKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkKKwlpZiAoIXB0ZV90ZXN0KHB0
ZSwgUFRFX1ZBTElEKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkKIAkJcGFuaWMoInBtYXBfZW11
bGF0ZV9tb2RpZmllZDogaW52YWxpZCBwdGUiKTsKICNlbmRpZgogCWlmIChwdGVfdGVzdChwdGUs
IFBURV9STykpIHsKQEAgLTM0NDYsNiArMzQ1NCwxOCBAQAogfQogCiAvKgorICogcG1hcF9lbXVs
YXRlX3JlZmVyZW5jZWQKKyAqCisgKiBSZWZlcmVuY2UgYml0IGVtdWxhdGlvbiBpcyBub3Qgc3Vw
cG9ydGVkIGluIHRoaXMgcG1hcCBpbXBsZW1lbnRhdGlvbi4KKyAqLworaW50CitwbWFwX2VtdWxh
dGVfcmVmZXJlbmNlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisKKwkJcmV0dXJu
ICgxKTsKK30KKworLyoKICAqCVJvdXRpbmU6CXBtYXBfa2V4dHJhY3QKICAqCUZ1bmN0aW9uOgog
ICoJCUV4dHJhY3QgdGhlIHBoeXNpY2FsIHBhZ2UgYWRkcmVzcyBhc3NvY2lhdGVkCkBAIC0zNTIy
LDE3ICszNTQyLDI2IEBACiAKIAlpZiAobSAhPSBOVUxMKSB7CiAJCWZvciAocHYgPSBUQUlMUV9G
SVJTVCgmbS0+bWQucHZfbGlzdCk7IHB2OwotCQkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9s
aXN0KSkgeworCQkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSkgewogCQkJbWlwc19k
Y2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJWkUpOwogCQl9CiAJfQog
fQogCisvKgorICogU2V0cyB0aGUgbWVtb3J5IGF0dHJpYnV0ZSBmb3IgdGhlIHNwZWNpZmllZCBw
YWdlLgorICovCiB2b2lkCiBwbWFwX3BhZ2Vfc2V0X21lbWF0dHIodm1fcGFnZV90IG0sIHZtX21l
bWF0dHJfdCBtYSkKIHsKIAogCS8qCisJICogU2V0IHRoZSBtZW1hdHRyIGZpZWxkIHNvIHRoZSBh
cHByb3ByaWF0ZSBiaXRzIGFyZSBzZXQgaW4gdGhlCisJICogUFRFIGFzIG1hcHBpbmdzIGFyZSBj
cmVhdGVkLgorCSAqLworCW0tPm1kLnB2X21lbWF0dHIgPSBtYTsKKworCS8qCiAJICogSXQgYXBw
ZWFycyB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBhbnkgbWFw
cGluZ3MKIAkgKiBmb3IgdGhlIHBhZ2UgYXJlIGVzdGFibGlzaGVkLiAgSWYgdGhpcyBldmVyIGNo
YW5nZXMsIHRoaXMgY29kZSB3aWxsCiAJICogbmVlZCB0byB3YWxrIHRoZSBwdl9saXN0IGFuZCBt
YWtlIGVhY2ggb2YgdGhlIGV4aXN0aW5nIG1hcHBpbmdzCmRpZmYgLS1naXQgYS9zeXMvbWlwcy9t
aXBzL21pbmlkdW1wX21hY2hkZXAuYyBiL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5j
Ci0tLSBhL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21p
cHMvbWluaWR1bXBfbWFjaGRlcC5jCkBAIC0xNzksNyArMTc5LDcgQEAKIAkJcHRlID0gcG1hcF9w
dGUoa2VybmVsX3BtYXAsIHZhKTsKIAkJS0FTU0VSVChwdGUgIT0gTlVMTCwgKCJwdGUgZm9yICVq
eCBpcyBOVUxMIiwgKHVpbnRtYXhfdCl2YSkpOwogCQlmb3IgKGkgPSAwOyBpIDwgTlBURVBHOyBp
KyspIHsKLQkJCWlmIChwdGVfdGVzdCgmcHRlW2ldLCBQVEVfVikpIHsKKwkJCWlmIChwdGVfaXNf
dmFsaWQoJnB0ZVtpXSkpIHsKIAkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGVbaV0pOwogCQkJ
CWlmIChpc19kdW1wYWJsZShwYSkpCiAJCQkJCWR1bXBfYWRkX3BhZ2UocGEpOwpkaWZmIC0tZ2l0
IGEvc3lzL21pcHMvbWlwcy9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL21hY2hkZXAuYwotLS0g
YS9zeXMvbWlwcy9taXBzL21hY2hkZXAuYworKysgYi9zeXMvbWlwcy9taXBzL21hY2hkZXAuYwpA
QCAtMjgzLDkgKzI4Myw5IEBACiAjZW5kaWYKIAlwcm9jX2xpbmt1cDAoJnByb2MwLCAmdGhyZWFk
MCk7CiAKLQlLQVNTRVJUKChrc3RhY2swICYgUEFHRV9NQVNLKSA9PSAwLAotCQkoImtzdGFjazAg
aXMgbm90IGFsaWduZWQgb24gYSBwYWdlIGJvdW5kYXJ5OiAweCUwbHgiLAotCQkobG9uZylrc3Rh
Y2swKSk7CisJS0FTU0VSVCgoa3N0YWNrMCAmICgoS1NUQUNLX1BBR0VfU0laRSAqIDIpIC0gMSkp
ID09IDAsCisJCSgia3N0YWNrMCBpcyBub3QgYWxpZ25lZCBvbiBhIHBhZ2UgKDB4JTBseCkgYm91
bmRhcnk6IDB4JTBseCIsCisJCShsb25nKShLU1RBQ0tfUEFHRV9TSVpFICogMiksIChsb25nKWtz
dGFjazApKTsKIAl0aHJlYWQwLnRkX2tzdGFjayA9IGtzdGFjazA7CiAJdGhyZWFkMC50ZF9rc3Rh
Y2tfcGFnZXMgPSBLU1RBQ0tfUEFHRVM7CiAJLyogCkBAIC00NTksNyArNDU5LDcgQEAKIAkgKiBX
ZSB1c2UgYSB3aXJlZCB0bGIgaW5kZXggdG8gZG8gdGhpcyBvbmUtdGltZSBtYXBwaW5nLgogCSAq
LwogCXBhID0gdnRvcGh5cyhwY3B1KTsKLQlwdGUgPSBQVEVfRCB8IFBURV9WIHwgUFRFX0cgfCBQ
VEVfQ19DQUNIRTsKKwlwdGUgPSBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9SRUYgfCBQVEVfRyB8
IFBURV9DX0NBQ0hFOwogCXRsYl9pbnNlcnRfd2lyZWQoUENQVV9UTEJfRU5UUlksICh2bV9vZmZz
ZXRfdClwY3B1cCwKIAkJCSBUTEJMT19QQV9UT19QRk4ocGEpIHwgcHRlLAogCQkJIFRMQkxPX1BB
X1RPX1BGTihwYSArIFBBR0VfU0laRSkgfCBwdGUpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlw
cy9nZW5hc3N5bS5jIGIvc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCi0tLSBhL3N5cy9taXBzL21p
cHMvZ2VuYXNzeW0uYworKysgYi9zeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMKQEAgLTEwMiw2ICsx
MDIsOSBAQAogQVNTWU0oVERGX0FTVFBFTkRJTkcsIFRERl9BU1RQRU5ESU5HKTsKIEFTU1lNKE1B
WENPTUxFTiwgTUFYQ09NTEVOKTsKIEFTU1lNKE1EVERfQ09QMlVTRUQsIE1EVERfQ09QMlVTRUQp
OworI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCitBU1NZTShLU1RBQ0tfVExCTUFTS19NQVNLLCBL
U1RBQ0tfVExCTUFTS19NQVNLKTsKKyNlbmRpZgogCiBBU1NZTShNSVBTX0tTRUcwX1NUQVJULCBN
SVBTX0tTRUcwX1NUQVJUKTsKIEFTU1lNKE1JUFNfS1NFRzFfU1RBUlQsIE1JUFNfS1NFRzFfU1RB
UlQpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUyBiL3N5cy9taXBzL21p
cHMvZXhjZXB0aW9uLlMKLS0tIGEvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUworKysgYi9zeXMv
bWlwcy9taXBzL2V4Y2VwdGlvbi5TCkBAIC04NSw2ICs4NSwyOCBAQAogICovCiAjZGVmaW5lCUlO
VFJDTlRfQ09VTlQJMjU2CiAKKy8qCisgKiBHZW5lcmFsIE1JUFMgQ1BVIHN0YXRlIGZvciBleGNl
cHRpb25zOgorICoKKyAqIEVQQyBSZWdpc3RlciB3aWxsIHBvaW50IHRvIHRoZSBpbnN0cnVjdGlv
biB0aGF0IGNhdXNlZCBmYXVsdCwgdW5sZXNzIHRoZQorICogZmF1bHRpbmcgaW5zdHJ1Y3Rpb24g
d2FzIGluIGEgYnJhbmNoIGRlbGF5IHNsb3QuICBJbiB0aGF0IGNhc2UsIGl0IHdpbGwKKyAqIHBv
aW50IHRvIHRoZSBicmFuY2ggYmVmb3JlIHRoZSBicmFuY2ggZGVsYXkgc2xvdCBpbnN0cnVjdGlv
bi4KKyAqCisgKiBUaGUgY2F1c2UgcmVnaXN0ZXIgd2lsbCBjb250YWluIHdoYXQgY2F1c2VkIHRo
ZSBleGNlcHRpb24gYW5kIHNvbWUgc3RhdGUKKyAqIGFib3V0IHRoZSBpbnRlcnJ1cHQuCisgKgor
ICogVGhlIHN0YXR1cyByZWdpc3RlciBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3Rh
dHVzIG9mIHRoZSBDUFUgc3VjaAorICogYXM6IEtlcm5lbC9Vc2VyIG1vZGUgYml0LCBpbnRlcnJ1
cHQgZW5hYmxlIGJpdC4KKyAqCisgKiBUaGUgQmFkVmFkZHIgcmVnaXN0ZXIgY29udGFpbnMgdGhl
IHZpcnR1YWwgYWRkcmVzcyB0aGF0IGNhdXNlIHRoZSBsYXN0CisgKiBleGNlcHRpb24uCisgKgor
ICogVGhlIENvbnRleHQgcmVnaXN0ZXIgY29udGFpbnMgdGhlIGxvd2VyIDIyIGJpdHMgb2YgdGhl
IFZQTiAoc3RhcnRpbmcgYXQKKyAqIGJpdCA0KSB0aGF0IGNhdXNlIHRoZSBsYXN0IGV4Y2VwdGlv
biBleGNlcHQgYml0MCBhbmQgYml0MSBhcmUgemVyby4gVGhlCisgKiB1cHBlciBiaXRzIChiaXRz
IDIzIHRvIDMxIGZvciBNSVBTMzIgYW5kIGJpdHMgMjMgdG8gNjMpIGFyZSBzZXQgdW5kZXIKKyAq
IGtlcm5lbCBjb250cm9sIChpLmUuIHBvaW50IHRvIHRoZSBwYWdlIHRhYmxlKS4gVGhlIENvbnRl
eHQvWENvbnRleHQKKyAqIHJlZ2lzdGVycyBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGJ5IEZyZWVC
U0QuCisgKi8KIAogLyoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTEwLDEzICsxMzIsMjcg
QEAKIC8qCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCi0gKiBNaXBzRG9UTEJNaXNzIC0tCisg
KiBNaXBzRG9UTEJNaXNzIC0tICAoVVRMQiBtaXNzKQogICoKLSAqIFRoaXMgaXMgdGhlIHJlYWwg
VExCIE1pc3MgSGFuZGxlciBjb2RlLgorICogVGhpcyBpcyB0aGUgcmVhbCBUTEIgTWlzcyBIYW5k
bGVyIGNvZGUuICBBIG1pc3Mgd2FzIGdlbmVyYXRlZCB3aGVuIHRoZQorICogYWNjZXNzIGlzIHRv
IGt1c2VnIGFuZCB0aGVyZSB3YXMgbm90IG1hdGNoaW5nIG1hcHBpbmcgbG9hZGVkIGludG8gdGhl
IFRMQi4KICAqICdzZWdiYXNlJyBwb2ludHMgdG8gdGhlIGJhc2Ugb2YgdGhlIHNlZ21lbnQgdGFi
bGUgZm9yIHVzZXIgcHJvY2Vzc2VzLgogICoKKyAqIFRoZSBDUFUgZG9lcyB0aGUgZm9sbG93aW5n
IGZvciBhbiBVVExCIG1pc3M6CisgKiAtIFNldHMgdGhlIEVQQyByZWdpc3Rlci4KKyAqIC0gU2V0
cyB0aGUgQ2F1c2UgcmVnaXN0ZXIuCisgKiAtIFNldHMgdGhlIFN0YXR1cyByZWdpc3Rlci4gU2hp
ZnRzIEsvVSBhbmQgSUUgYml0cyBvdmVyIG9uZSBhbmQgY2xlYXJzCisgKiAgIHRoZSBjdXJyZW50
IEtlcm5lbC9Vc2VyIGFuZCBJbnRlcnJ1cHQgRW5hYmxlIGJpdHMuIFNvIHRoZSBwcm9jZXNzb3IK
KyAqICAgaXMgaW4ga2VybmVsIG1vZGUgd2l0aCB0aGUgaW50ZXJ1cHRzIHR1cm5lZCBvZmYuCisg
KiAtIFNldHMgQmFkVmFkZHIgcmVnaXN0ZXIuCisgKiAtIFNldHMgdGhlIENvbnRleHQvWENvbnRl
eHQgcmVnaXN0ZXIocykuCisgKiAtIFNldHMgdGhlIFRMQiBFbnRyeUhpIHJlZ2lzdGVyIHRvIGNv
bnRhaW4gVlBOIG9mIHRoZSBmYXVsdGluZyBhZGRyZXNzLgorICoKICAqIERvbid0IGNoZWNrIGZv
ciBpbnZhbGlkIHB0ZSdzIGhlcmUuIFdlIGxvYWQgdGhlbSBhcyB3ZWxsIGFuZAogICogbGV0IHRo
ZSBwcm9jZXNzb3IgdHJhcCB0byBsb2FkIHRoZSBjb3JyZWN0IHZhbHVlIGFmdGVyIHNlcnZpY2Uu
CisgKgorICogWFhYIFRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gYSBsaW5lYXIg
cGFnZSB0YWJsZSBhbmQgdXNlIHRoZQorICogQ29udGV4dCBhbmQgWENvbnRleHQgcmVnaXN0ZXJz
LiAgVGhhdCBpcyByZWFsbHkgd2hhdCBpdCB3YXMgZGVzaWduZWQgZm9yLgogICotLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCiAgKi8KICAJLnNldCBwdXNoCkBAIC0xMzcsMjUgKzE3Myw4OSBAQAogI2lmZGVm
IF9fbWlwc19uNjQKIAlQVFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJIyBrMD1WUE4K
IAlhbmRpCQlrMCwgazAsIFBERVBUUk1BU0sJCSMgazA9cGRlIG9mZnNldAotCVBUUl9BRERVCWsx
LCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCi0JUFRSX0wJCWsxLCAwKGsxKQkJCSMg
azE9cGRlIGVudHJ5Ci0JTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFk
ZHJlc3MgKGFnYWluKQorCVBUUl9BRERVCWswLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRy
ZXNzCisJUFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5CiAJYmVxCQlrMSwgemVybywg
MmYJCQkjID09MCAtLSBubyBwYWdlIHRhYmxlCisJbm9wCisKKyNpZmRlZiBNSVBTNjRfTkVXX1BN
QVAKKwkjIENoZWNrIGZvciBzdXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJIyBr
MT1zdXBlcnBhZ2UgaW5kZXggZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfc3VwZXJwYWdl
CQkjID09MCAtLSBub3Qgc3VwZXJwYWdlCisJUFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVu
dHJ5IChkZWxheSBzbG90KQorCisJIyBTZXQgdGhlIHJlZmVyZW5jZWQgYml0IGluIHRoZSBQREUg
aWYgdmFsaWQuCisJIworCSMgWFhYIFNldHRpbmcgdGhlIHJlZmVyZW5jZWQgYml0IGhlcmUgc2F2
ZXMgYSBmYXVsdCBsYXRlciBidXQgaXQKKwkjIG1heSBub3QgYmUgc2FmZSB0byBkbyBzby4gVGhl
cmVmb3JlLCBqdXN0IHRha2UgdGhlIGZhdWx0IHRvIHNldAorCSMgdGhlIHJlZmVyZW5jZSBiaXQu
CisjCUlGX1ZBTElEX1NFVF9SRUZCSVQoazEsIGswLCAwLCAxKQorCisJIyBUaGUgUERFIGlzIGFj
dHVhbGx5IGEgc3VwZXJwYWdlIFBURS4gIFN0b3JlIGl0IGluIHRoZSBUTEIgbG8wIHJlZy4KKwlD
TEVBUl9QVEVfU1dCSVRTKGsxKQorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMg
bG8wIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBDb21wdXRlIHRoZSBQRk4gZm9yIHRoZSBU
TEIgbG8xIHJlZ2lzdGVyIGZyb20gazEoPVBURSBmb3IgVExCIGxvMCkuCisJR0VUX09ERF8xTV9Q
Rk5fRlJPTV9FVkVOKGsxKQkJCSMgazE9T2RkIFBGTiBpbiBQVEUgcG9zdGlvbgorCisJIyBHZXQg
aGFyZCBUTEIgZmxhZyBiaXRzLgorCVBUUl9MCQlrMCwgMChrMCkJCQkjIGswPXBkZSBlbnRyeSAo
YWdhaW4pCisJR0VUX0hXX1RMQl9GTEFHUyhrMCkJCQkJIyBrMD1odyBUTEIgZmxhZyBiaXRzCisJ
b3IJCWsxLCBrMSwgazAJCQkjIGsxPVBURT1QRk4gfCBod2ZsZyBiaXRzCisJIyBMb2FkIGl0IGlu
dG8gdGhlIFRMQiBMbzEgcmVnaXN0ZXIuCisJI0NMRUFSX1BURV9TV0JJVFMoazEpCQkJCSMgTm8g
U1cgYml0cyB0byBjbGVhcgorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8x
IGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBMb2FkIHRoZSBUTEIgUGFnZU1hc2sgZm9yIDFN
IHBhZ2VzLgorCWRsaQkJazAsIFRMQk1BU0tfMU1fUEFHRQkJIyBQYWdlTWFzayBmb3IgMU0gUGFn
ZQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgUGFnZU1hc2sgaXMgbG9h
ZGVkCisJQ09QMF9TWU5DCisKKwl0bGJ3cgkJCQkJCSMgd3JpdGUgdG8gdGxiCisJSEFaQVJEX0RF
TEFZCisJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwkjIHplcm8gb3V0IFBh
Z2VNYXNrIHJlZworCUNPUDBfU1lOQworCWVyZXQJCQkJCQkjIHJldHVybiBmcm9tIGV4Y2VwdGlv
bgorCitub3Rfc3VwZXJwYWdlOgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLwogI2VuZGlm
CisJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWlu
KQogCVBUUl9TUkwJCWswLCBQQUdFX1NISUZUIC0gUFRFU0hJRlQJIzBiOiBrMD1WUE4gKGFrYSB2
YT4+MTApCiAJYW5kaQkJazAsIGswLCBQVEUyTUFTSwkJIzBjOiBrMD1wYWdlIHRhYiBvZmZzZXQK
IAlQVFJfQUREVQlrMSwgazEsIGswCQkJIzBkOiBrMT1wdGUgYWRkcmVzcwotCVBURV9MCQlrMCwg
MChrMSkJCQkjMGU6IGswPWxvMCBwdGUKLQlQVEVfTAkJazEsIFBURVNJWkUoazEpCQkJIzBmOiBr
MT1sbzAgcHRlCisKKwlQVEVfTAkJazAsIDAoazEpCQkJIyBrMD1sbzAgcHRlCisKKwkjIFNldCB0
aGUgcmVmZXJlbmNlZCBiaXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0dGlu
ZyB0aGUgcmVmZXJlbmNlZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAorCSMg
bWF5IG5vdCBiZSBzYWZlIHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1bHQg
dG8gc2V0CisJIyB0aGUgcmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChrMCwg
azEsIDAsIDIpCisKIAlDTEVBUl9QVEVfU1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBTX0NP
UF8wX1RMQl9MTzAJCSMxMjogbG8wIGlzIGxvYWRlZAogCUNPUDBfU1lOQwotCUNMRUFSX1BURV9T
V0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJIzE1OiBsbzEgaXMg
bG9hZGVkCisKKwlQVEVfTAkJazAsIFBURVNJWkUoazEpCQkJIyBrMD1sbzEgcHRlCisKKwkjIFNl
dCB0aGUgcmVmZXJlbmNlZCBiaXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0
dGluZyB0aGUgcmVmZXJlbmNlZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAor
CSMgbWF5IG5vdCBiZSBzYWZlIHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1
bHQgdG8gc2V0CisJIyB0aGUgcmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChr
MCwgazEsIDAsIDMpCisKKwlDTEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMwCWswLCBNSVBT
X0NPUF8wX1RMQl9MTzEJCSMxNTogbG8xIGlzIGxvYWRlZAogCUNPUDBfU1lOQwogCXRsYndyCQkJ
CQkJIzFhOiB3cml0ZSB0byB0bGIKIAlIQVpBUkRfREVMQVkKIAllcmV0CQkJCQkJIzFmOiByZXRV
cm4gZnJvbSBleGNlcHRpb24KKwogMToJagkJTWlwc1RMQk1pc3NFeGNlcHRpb24JCSMyMDoga2Vy
bmVsIGV4Y2VwdGlvbgogCW5vcAkJCQkJCSMyMTogYnJhbmNoIGRlbGF5IHNsb3QKIDI6CWoJCVNs
b3dGYXVsdAkJCSMyMjogbm8gcGFnZSB0YWJsZSBwcmVzZW50CkBAIC0yNjUsNyArMzY1LDcgQEAK
ICNlbmRpZgogCiAvKgotICogU2F2ZSBDUFUgYW5kIENQMCByZWdpc3RlciBzdGF0ZS4KKyAqIFNh
dmUgQ1BVIGFuZCBDUDAgcmVnaXN0ZXIgc3RhdGUgd2hlbiB0YWtpbmcgYW4gZXhjZXB0aW9uIGlu
IGtlcm5lbCBtb2RlLgogICoKICAqIFRoaXMgaXMgc3RyYWlnaHRmb3J3YXJkIGV4Y2VwdCBmb3Ig
c2F2aW5nIHRoZSBleGNlcHRpb24gcHJvZ3JhbQogICogY291bnRlci4gVGhlIGRkYiBiYWNrdHJh
Y2UgY29kZSBsb29rcyBmb3IgdGhlIGZpcnN0IGluc3RydWN0aW9uCkBAIC00MDYsNiArNTA2LDcg
QEAKIAlTQVZFX1JFRyhhMSwgU1IsIHNwKQogCVJFU1RPUkVfQ1BVCQkJIyB2MCBjb250YWlucyB0
aGUgcmV0dXJuIGFkZHJlc3MuCiAJc3luYworCiAJZXJldAogCS5zZXQJYXQKIEVORChNaXBzS2Vy
bkdlbkV4Y2VwdGlvbikKQEAgLTg4NCwyMSArOTg1LDYwIEBACiAJUFRSX1NSTAkJazAsIFBEUlNI
SUZUIC0gUFRSU0hJRlQJCSMgazA9cGRlIG9mZnNldCAoYWxtb3N0KQogCWJlcQkJazEsIHplcm8s
IE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5vIHBkZSB0YWIKIAlhbmRpCQlrMCwgazAs
IFBERVBUUk1BU0sJCSMgazA9cGRlIG9mZnNldAotCVBUUl9BRERVCWsxLCBrMCwgazEJCQkjIGsx
PXBkZSBlbnRyeSBhZGRyZXNzCi0JUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9cGRlIGVudHJ5CisJ
UFRSX0FERFUJazAsIGswLCBrMQkJCSMgazA9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEs
IDAoazApCQkJIyBrMT1wZGUgZW50cnkKIAogCS8qIFZhbGlkYXRlIHBkZSB0YWJsZSBwb2ludGVy
LiAgKi8KIAliZXF6CQlrMSwgM2YKIAlub3AKKworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCSMg
Q2hlY2sgZm9yIHN1cGVycGFnZQorCUdFVF9TVVBFUlBBR0VfSURYKGsxKQkJCQkjIGsxPXN1cGVy
cGFnZSBpbmRleCBmcm9tIFBURQorCWJlcQkJazEsIHplcm8sIG5vdF9zcGcJCSMgPT0wIC0tIG5v
dCBzdXBlcnBhZ2UKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUgZW50cnkgKGRlbGF5IHNs
b3QpCisKKwkvKiBWYWxpZGF0ZSBwYWdlIHRhYmxlIGVudHJ5LiAgKi8KKwlhbmRpCQlrMSwgUFRF
X1ZSCisJYmVxegkJazEsIDNmCisJbm9wCisKKwkjIFRoZSBQREUgaXMgYWN0dWFsbHkgYSBzdXBl
cnBhZ2UgUFRFLiAgU3RvcmUgaXQgaW4gdGhlIFRMQiBsbzAgcmVnLgorCUNMRUFSX1BURV9TV0JJ
VFMoazEpCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9hZGVk
CisJQ09QMF9TWU5DCisKKwkjIENvbXB1dGUgdGhlIFBGTiBmb3IgdGhlIFRMQiBsbzEgcmVnaXN0
ZXIgZnJvbSBrMSg9UFRFIGZvciBUTEIgbG8wKS4KKwlHRVRfT0REXzFNX1BGTl9GUk9NX0VWRU4o
azEpCQkJIyBrMT1PZGQgUEZOIGluIFBURSBwb3N0aW9uCisKKwkjIEdldCBoYXJkIFRMQiBmbGFn
IGJpdHMuCisJUFRSX0wJCWswLCAwKGswKQkJCSMgazA9cGRlIGVudHJ5IChhZ2FpbikKKwlHRVRf
SFdfVExCX0ZMQUdTKGswKQkJCQkjIGswPWh3IFRMQiBmbGFnIGJpdHMKKwlvcgkJazEsIGsxLCBr
MAkJCSMgazE9UFRFPVBGTiB8IGh3ZmxnIGJpdHMKKwkjIExvYWQgaXQgaW50byB0aGUgVExCIExv
MSByZWdpc3Rlci4KKwkjIENMRUFSX1BURV9TV0JJVFMoazEpCQkJCSMgTm8gU1cgYml0cyB0byBj
bGVhcgorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAor
CUNPUDBfU1lOQworCisJIyBMb2FkIHRoZSBUTEIgUGFnZU1hc2sgZm9yIDFNIHBhZ2VzLgorCWRs
aQkJazAsIFRMQk1BU0tfMU1fUEFHRQkJIyBQYWdlTWFzayBmb3IgMU0gUGFnZQorCVBURV9NVEMw
CWswLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgUGFnZU1hc2sgaXMgbG9hZGVkCisJQ09QMF9T
WU5DCisKKwliCQl0bGJfaW5zZXJ0X2VudHJ5CisJbm9wCisKK25vdF9zcGc6CisjZW5kaWYgLyog
TUlQUzY0X05FV19QTUFQICovCiAjZW5kaWYKIAlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFE
RFIJIyBrMD1iYWQgYWRkcmVzcyAoYWdhaW4pCiAJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQ
VEVTSElGVAkjIGswPVZQTgogCWFuZGkJCWswLCBrMCwgUFRFTUFTSwkJCSMgazA9cGFnZSB0YWIg
b2Zmc2V0CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKIAlQVEVfTAkJ
azAsIDAoazEpCQkJIyBrMD10aGlzIFBURQogCiAJLyogVmFsaWRhdGUgcGFnZSB0YWJsZSBlbnRy
eS4gICovCi0JYW5kaQkJazAsIFBURV9WCisJYW5kaQkJazAsIFBURV9WUgogCWJlcXoJCWswLCAz
ZgogCW5vcAogCkBAIC05MDgsMjUgKzEwNDgsMzEgQEAKIAlub3AKIAogCVBURV9MCQlrMCwgMChr
MSkKLQlQVEVfTAkJazEsIFBURVNJWkUoazEpCisKIAlDTEVBUl9QVEVfU1dCSVRTKGswKQogCVBU
RV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzAKIAlDT1AwX1NZTkMKLQlDTEVBUl9QVEVfU1dC
SVRTKGsxKQotCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEKKworCVBURV9MCQlrMCwg
UFRFU0laRShrMSkKKworCUNMRUFSX1BURV9TV0JJVFMoazApCisJUFRFX01UQzAJazAsIE1JUFNf
Q09QXzBfVExCX0xPMQogCUNPUDBfU1lOQwogCiAJYgkJdGxiX2luc2VydF9lbnRyeQogCW5vcAog
CiBvZGRfcGFnZToKIAlQVEVfTAkJazAsIC1QVEVTSVpFKGsxKQotCVBURV9MCQlrMSwgMChrMSkK
KwogCUNMRUFSX1BURV9TV0JJVFMoazApCiAJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xP
MAogCUNPUDBfU1lOQwotCUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1JUFNf
Q09QXzBfVExCX0xPMQorCisJUFRFX0wJCWswLCAwKGsxKQorCisJQ0xFQVJfUFRFX1NXQklUUyhr
MCkKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8xCiAJQ09QMF9TWU5DCiAKIHRsYl9p
bnNlcnRfZW50cnk6CkBAIC05MzYsMTEgKzEwODIsMTUgQEAKIAlibHR6CQlrMCwgdGxiX2luc2Vy
dF9yYW5kb20KIAlub3AKIAl0bGJ3aQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX1BH
X01BU0sKKwlDT1AwX1NZTkMKIAllcmV0CiAJc3Nub3AKIAogdGxiX2luc2VydF9yYW5kb206CiAJ
dGxid3IKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCisJQ09QMF9TWU5D
CiAJZXJldAogCXNzbm9wCiAKQEAgLTEwNTQsMjEgKzEyMDQsNjcgQEAKICNpZmRlZiBfX21pcHNf
bjY0CiAJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9VlBOCiAJYW5kaQkJ
azAsIGswLCBQREVQVFJNQVNLCQkjIGswPXBkZSBvZmZzZXQKLQlQVFJfQUREVQlrMSwgazAsIGsx
CQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcwotCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsxPXBkZSBl
bnRyeQorCVBUUl9BRERVCWswLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCisJUFRS
X0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5CisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAK
KwkjIENoZWNrIGZvciBzdXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJIyBrMT1z
dXBlcnBhZ2UgaW5kZXggZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfa3NwZwkJIyA9PTAg
LS0gbm90IHN1cGVycGFnZQorCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeSAoZGVs
YXkgc2xvdCkKKworCSMgWFhYIFJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisKKwkjIFRoZSBQREUg
aXMgYWN0dWFsbHkgYSBzdXBlcnBhZ2UgUFRFLiAgU3RvcmUgaXQgaW4gdGhlIFRMQiBsbzAgcmVn
LgorCUNMRUFSX1BURV9TV0JJVFMoazEpCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xP
MAkJIyBsbzAgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIENvbXB1dGUgdGhlIFBGTiBmb3Ig
dGhlIFRMQiBsbzEgcmVnaXN0ZXIgZnJvbSBrMSg9UFRFIGZvciBUTEIgbG8wKS4KKwlHRVRfT0RE
XzFNX1BGTl9GUk9NX0VWRU4oazEpCQkJIyBrMT1PZGQgUEZOIGluIFBURSBwb3N0aW9uCisKKwkj
IEdldCBoYXJkIFRMQiBmbGFnIGJpdHMuCisJUFRSX0wJCWswLCAwKGswKQkJCSMgazA9cGRlIGVu
dHJ5IChhZ2FpbikKKwlHRVRfSFdfVExCX0ZMQUdTKGswKQkJCQkjIGswPWh3IFRMQiBmbGFnIGJp
dHMKKwlvcgkJazEsIGsxLCBrMAkJCSMgazE9UFRFPVBGTiB8IGh3ZmxnIGJpdHMKKwkjIExvYWQg
aXQgaW50byB0aGUgVExCIExvMSByZWdpc3Rlci4KKwkjQ0xFQVJfUFRFX1NXQklUUyhrMSkJCQkJ
IyBObyBTVyBCaXRzIHRvIGNsZWFyCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJ
IyBsbzEgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIExvYWQgdGhlIFRMQiBQYWdlTWFzayBm
b3IgMU0gcGFnZXMuCisJZGxpCQlrMCwgVExCTUFTS18xTV9QQUdFCQkjIFBhZ2VNYXNrIGZvciAx
TSBQYWdlCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJIyBQYWdlTWFzayBp
cyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCXRsYndyCQkJCQkJIyB3cml0ZSB0byB0bGIKKwlIQVpB
UkRfREVMQVkKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgemVybyBv
dXQgUGFnZU1hc2sgcmVnCisJQ09QMF9TWU5DCisJZXJldAkJCQkJCSMgcmV0dXJuIGZyb20gZXhj
ZXB0aW9uCisKK25vdF9rc3BnOgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLworCiAJTUZD
MAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogICAJ
YmVxCQlrMSwgemVybywgTWlwc0tlcm5HZW5FeGNlcHRpb24JIyA9PTAgLS0gbm8gcGFnZSB0YWJs
ZQogI2VuZGlmCiAJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQVEVTSElGVAkjIGswPVZQTgog
CWFuZGkJCWswLCBrMCwgUFRFMk1BU0sJCSMgazA9cGFnZSB0YWIgb2Zmc2V0CiAJUFRSX0FERFUJ
azEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKKwogCVBURV9MCQlrMCwgMChrMSkJCQkjIGsw
PWxvMCBwdGUKLQlQVEVfTAkJazEsIFBURVNJWkUoazEpCQkJIyBrMT1sbzEgcHRlCisKKwkjIFhY
WCBSZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorCiAJQ0xFQVJfUFRFX1NXQklUUyhrMCkKIAlQVEVf
TVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8wCQkjIGxvMCBpcyBsb2FkZWQKIAlDT1AwX1NZTkMK
LQlDTEVBUl9QVEVfU1dCSVRTKGsxKQotCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJ
CSMgbG8xIGlzIGxvYWRlZAorCisJUFRFX0wJCWswLCBQVEVTSVpFKGsxKQkJCSMgazA9bG8xIHB0
ZQorCisJQ0xFQVJfUFRFX1NXQklUUyhrMCkKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJf
TE8xCQkjIGxvMSBpcyBsb2FkZWQKIAlDT1AwX1NZTkMKIAl0bGJ3cgkJCQkJIyB3cml0ZSB0byB0
bGIKIAlIQVpBUkRfREVMQVkKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvY3B1LmMgYi9zeXMv
bWlwcy9taXBzL2NwdS5jCi0tLSBhL3N5cy9taXBzL21pcHMvY3B1LmMKKysrIGIvc3lzL21pcHMv
bWlwcy9jcHUuYwpAQCAtMzEzLDYgKzMxMywyNSBAQAogCWNwdWluZm8tPmwyLmRjX3NpemUgPSBj
cHVpbmZvLT5sMi5kY19saW5lc2l6ZQogCSAgICAqIGNwdWluZm8tPmwyLmRjX25zZXRzICogY3B1
aW5mby0+bDIuZGNfbndheXM7CiAjZW5kaWYKKworCS8qCisJICogUHJvYmUgUGFnZU1hc2sgcmVn
aXN0ZXIgdG8gc2VlIHdoYXQgc2l6ZXMgb2YgcGFnZXMgYXJlIHN1cHBvcnRlZAorCSAqIGJ5IHdy
aXRpbmcgYWxsIG9uZSdzIGFuZCB0aGVuIHJlYWRpbmcgaXQgYmFjay4KKwkgKi8KKwltaXBzX3dy
X3BhZ2VtYXNrKH4wKTsKKwljcHVpbmZvLT50bGJfcGdtYXNrID0gbWlwc19yZF9wYWdlbWFzaygp
OworCW1pcHNfd3JfcGFnZW1hc2soTUlQUzNfUEdNQVNLXzRLKTsKKworI2lmZGVmIEtTVEFDS19M
QVJHRV9QQUdFCisJaWYgKChjcHVpbmZvLT50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzE2Sykg
PT0gMCkKKwkJcGFuaWMoIiVzOiAxNksgc2l6ZWQgcGFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkg
dGhpcyBDUFUuIiwKKwkJICAgIF9fZnVuY19fKTsKKyNlbmRpZiAvKiBLU1RBQ0tfTEFSR0VfUEFH
RSAqLworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCWlmICgoY3B1aW5mby0+dGxiX3BnbWFzayAm
IE1JUFMzX1BHTUFTS18xTSkgPT0gMCkKKwkJcGFuaWMoIiVzOiAxTSBzaXplZCBwYWdlcyBhcmUg
bm90IHN1cHBvcnRlZCBieSB0aGlzIENQVS4iLAorCQkgICAgX19mdW5jX18pOworI2VuZGlmIC8q
IE1JUFM2NF9ORVdfUE1BUCAqLwogfQogCiB2b2lkCkBAIC0zODksNiArNDA4LDMwIEBACiAJCQlw
cmludGYoIkZpeGVkIG1hcHBpbmciKTsKIAkJfQogCQlwcmludGYoIiwgJWQgZW50cmllcyAiLCBj
cHVpbmZvLnRsYl9uZW50cmllcyk7CisJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2spIHsKKwkJCXBy
aW50ZigiKCIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS19NQVNL
WCkKKwkJCQlwcmludGYoIjFLICIpOworCQkJcHJpbnRmKCI0SyAiKTsKKwkJCWlmIChjcHVpbmZv
LnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMTZLKQorCQkJCXByaW50ZigiMTZLICIpOworCQkJ
aWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS182NEspCisJCQkJcHJpbnRmKCI2
NEsgIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzI1NkspCisJ
CQkJcHJpbnRmKCIyNTZLICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BH
TUFTS18xTSkKKwkJCQlwcmludGYoIjFNICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAm
IE1JUFMzX1BHTUFTS180TSkKKwkJCQlwcmludGYoIjRNICIpOworCQkJaWYgKGNwdWluZm8udGxi
X3BnbWFzayAmIE1JUFMzX1BHTUFTS18xNk0pCisJCQkJcHJpbnRmKCIxNk0gIik7CisJCQlpZiAo
Y3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzY0TSkKKwkJCQlwcmludGYoIjY0TSAi
KTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMjU2TSkKKwkJCQlw
cmludGYoIjI1Nk0gIik7CisJCQlwcmludGYoInBnIHNpemVzKSIpOworCQl9CisJCXByaW50Zigi
XG4iKTsKIAl9CiAKIAlpZiAoY3B1aW5mby50bGJfcGdtYXNrKSB7CmRpZmYgLS1naXQgYS9zeXMv
bWlwcy9pbmNsdWRlL3ZtcGFyYW0uaCBiL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCi0tLSBh
L3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJh
bS5oCkBAIC0xMDAsMTUgKzEwMCw0NyBAQAogI2RlZmluZQlGUkVFQlNEMzJfVVNSU1RBQ0sJKCgo
dm1fb2Zmc2V0X3QpMHg4MDAwMDAwMCkgLSBQQUdFX1NJWkUpCiAjZW5kaWYKIAorI2lmZGVmIE1J
UFM2NF9ORVdfUE1BUAogLyoKLSAqIERpc2FibGUgc3VwZXJwYWdlIHJlc2VydmF0aW9ucy4gKG5v
dCBzdXJlIGlmIHRoaXMgaXMgcmlnaHQKLSAqIEkgY29waWVkIGl0IGZyb20gQVJNKQorICogRW5h
YmxlIHN1cGVycGFnZSByZXNlcnZhdGlvbnM6IDEgbGV2ZWwuCisgKgorICogVk1fTlJFU0VSVkxF
VkVMIHNwZWNpZmllcyBhIG51bWJlciBvZiBwcm9tb3Rpb24gbGV2ZWxzIGVuYWJsZWQuCisgKiBD
dXJyZW50bHkgbWlwczY0IG9ubHkgc3VwcG9ydHMgb25lIHNpemUgb3IgbGV2ZWwgKFZNX0xFVkVM
XzBfT1JERVIpIG9mCisgKiBzdXBlcnBhZ2VzICgyTUIpCisgKi8KKyNpZm5kZWYJVk1fTlJFU0VS
VkxFVkVMCisjZGVmaW5lCVZNX05SRVNFUlZMRVZFTAkJCTEKKyNlbmRpZgorCisvKgorICogTGV2
ZWwgMCByZXNlcnZhdGlvbnMgY29uc2lzdCBvZiA1MTIgKDJeOSkgcGFnZXMgKDJNQikuCisgKi8K
KyNpZm5kZWYJVk1fTEVWRUxfMF9PUkRFUgorI2RlZmluZQlWTV9MRVZFTF8wX09SREVSCQk5Cisj
ZW5kaWYKKworLyoKKyAqIFRoZSBsYXJnZXN0IGFsbG9jYXRpb24gc2l6ZSBpcyA0TUIuCisgKi8K
KyNkZWZpbmUJVk1fTkZSRUVPUkRFUgkJCTExCisKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQ
ICovCisKKy8qCisgKiBEaXNhYmxlIHN1cGVycGFnZSByZXNlcnZhdGlvbnMuCiAgKi8KICNpZm5k
ZWYJVk1fTlJFU0VSVkxFVkVMCiAjZGVmaW5lCVZNX05SRVNFUlZMRVZFTAkJMAogI2VuZGlmCiAK
IC8qCisgKiBUaGUgbGFyZ2VzdCBhbGxvY2F0aW9uIHNpemUgaXMgMU1CLgorICovCisjZGVmaW5l
CVZNX05GUkVFT1JERVIJCTkKKworI2VuZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCisKKy8q
CiAgKiBIb3cgbWFueSBwaHlzaWNhbCBwYWdlcyBwZXIga21lbSBhcmVuYSB2aXJ0dWFsIHBhZ2Uu
CiAgKi8KICNpZm5kZWYgVk1fS01FTV9TSVpFX1NDQUxFCkBAIC0xNzcsMTEgKzIwOSw2IEBACiAj
ZGVmaW5lCVZNX0xPV01FTV9CT1VOREFSWQkoKHZtX3BhZGRyX3QpMHgyMDAwMDAwMCkKICNlbmRp
ZgogCi0vKgotICogVGhlIGxhcmdlc3QgYWxsb2NhdGlvbiBzaXplIGlzIDFNQi4KLSAqLwotI2Rl
ZmluZQlWTV9ORlJFRU9SREVSCQk5Ci0KICNkZWZpbmUJWkVST19SRUdJT05fU0laRQkoNjQgKiAx
MDI0KQkvKiA2NEtCICovCiAKICNpZm5kZWYgX19taXBzX242NApkaWZmIC0tZ2l0IGEvc3lzL21p
cHMvaW5jbHVkZS9wdGUuaCBiL3N5cy9taXBzL2luY2x1ZGUvcHRlLmgKLS0tIGEvc3lzL21pcHMv
aW5jbHVkZS9wdGUuaAorKysgYi9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oCkBAIC0yOSw2ICsyOSwx
MCBAQAogI2lmbmRlZglfTUFDSElORV9QVEVfSF8KICNkZWZpbmUJX01BQ0hJTkVfUFRFX0hfCiAK
KyNpZiAhZGVmaW5lZChfS0VSTkVMKQorI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KKyNlbmRp
ZgorCiAjaWZuZGVmIF9MT0NPUkUKICNpZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQo
X19taXBzX24zMikgLyogIFBIWVNBRERSXzY0X0JJVCAqLwogdHlwZWRlZgl1aW50NjRfdCBwdF9l
bnRyeV90OwpAQCAtNzIsMjIgKzc2LDI1IEBACiAgKiBOT1RFOiBUaGlzIG1lYW5zIHRoYXQgZm9y
IDMyLWJpdCB1c2Ugb2YgQ1AwLCB3ZSBhcmVuJ3QgYWJsZSB0byBzZXQgdGhlIHRvcAogICogYml0
IG9mIFBGTiB0byBhIG5vbi16ZXJvIHZhbHVlLCBhcyBzb2Z0d2FyZSBpcyB1c2luZyBpdCEgIFRo
aXMgcGh5c2ljYWwKICAqIG1lbW9yeSBzaXplIGxpbWl0IG1heSBub3QgYmUgc3VmZmljaWVudGx5
IGVuZm9yY2VkIGVsc2V3aGVyZS4KKyAqCisgKiBYWFhSVzogT24gQ0hFUkksIGJpdHMgNjMgYW5k
IDYyIGFyZSB1c2VkIGZvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQKKyAqIHByZXZlbnQg
bG9hZGluZyBhbmQgc3RvcmluZyBvZiBjYXBhYmlsaXRpZXMsIHNvIHdlIGhhdmUgcmVkdWNlZCB0
aGUgNTUtYml0CisgKiBzaGlmdCB0byA1MyBiaXRzLgogICovCiAjaWYgZGVmaW5lZChfX21pcHNf
bjY0KSB8fCBkZWZpbmVkKF9fbWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KLSNkZWZp
bmUJVExCTE9fU1dCSVRTX1NISUZUCSg1NSkKLSNkZWZpbmUJVExCTE9fU1dCSVRTX0NMRUFSX1NI
SUZUCSg5KQotI2RlZmluZQlUTEJMT19QRk5fTUFTSwkJMHgzRkZGRkZGQzBVTEwKKyNkZWZpbmUJ
VExCTE9fU1dCSVRTX1NISUZUCSg1MykJCS8qIFhYWFJXOiBXYXMgNTUuICovCisjZGVmaW5lCVRM
QkxPX1JFRl9CSVRfU0hJRlQJKDYxKQorI2RlZmluZQlUTEJMT19TV0JJVFNfQ0xFQVJfU0hJRlQJ
KDExKQkvKiBYWFhTUzogV2FzIDkuICovCisjZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkweEZGRkZG
RkMwVUxMCisjZGVmaW5lCVRMQl8xTV9TVVBFUlBBR0VfU0hJRlQJKFBEUlNISUZUKQorI2RlZmlu
ZQlUTEJMT19TV0JJVFNfTUFTSwkoKHB0X2VudHJ5X3QpMHg3RiA8PCBUTEJMT19TV0JJVFNfU0hJ
RlQpCiAjZWxzZQogI2RlZmluZQlUTEJMT19TV0JJVFNfU0hJRlQJKDI5KQogI2RlZmluZQlUTEJM
T19TV0JJVFNfQ0xFQVJfU0hJRlQJKDMpCiAjZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkoMHgxRkZG
RkZDMCkKKyNkZWZpbmUJVExCTE9fU1dCSVRTX01BU0sJKChwdF9lbnRyeV90KTB4NyA8PCBUTEJM
T19TV0JJVFNfU0hJRlQpCiAjZW5kaWYKICNkZWZpbmUJVExCTE9fUEZOX1NISUZUCQkoNikKLSNk
ZWZpbmUJVExCTE9fU1dCSVRTX01BU0sJKChwdF9lbnRyeV90KTB4NyA8PCBUTEJMT19TV0JJVFNf
U0hJRlQpCi0jZGVmaW5lCVRMQkxPX1BBX1RPX1BGTihwYSkJKCgoKHBhKSA+PiBUTEJfUEFHRV9T
SElGVCkgPDwgVExCTE9fUEZOX1NISUZUKSAmIFRMQkxPX1BGTl9NQVNLKQotI2RlZmluZQlUTEJM
T19QRk5fVE9fUEEocGZuKQkoKHZtX3BhZGRyX3QpKChwZm4pID4+IFRMQkxPX1BGTl9TSElGVCkg
PDwgVExCX1BBR0VfU0hJRlQpCi0jZGVmaW5lCVRMQkxPX1BURV9UT19QRk4ocHRlKQkoKHB0ZSkg
JiBUTEJMT19QRk5fTUFTSykKLSNkZWZpbmUJVExCTE9fUFRFX1RPX1BBKHB0ZSkJKFRMQkxPX1BG
Tl9UT19QQShUTEJMT19QVEVfVE9fUEZOKChwdGUpKSkpCiAKIC8qCiAgKiBYWFggVGhpcyBjb21t
ZW50IGlzIG5vdCBjb3JyZWN0IGZvciBhbnl0aGluZyBtb3JlIG1vZGVybiB0aGFuIFI0Sy4KQEAg
LTEyMSwyNSArMTI4LDgzIEBACiAjZW5kaWYgLyogZGVmaW5lZChfX21pcHNfbjY0KSAqLwogCiAv
KgorICogUFRFIEhhcmR3YXJlIEJpdHMgKEVudHJ5TG8wLTEgcmVnaXN0ZXIgZmllbGRzKQorICoK
KyAqIExvd2VyIGJpdHMgb2YgYSAzMiBiaXQgUFRFOgorICoKKyAqICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIDI4IC0tLS0tLS0tLS0tLS0tLSA2IDUgLSAzICAyICAgMSAgIDAKKyAq
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg
ICAgICBQRk4gICAgICAgIHwgIEMgIHwgRCB8IFZSfCBHIHwKKyAqICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg
KgorICogTG93ZXIgYml0cyBvZiBhIDY0IGJpdCBQVEU6CisgKgorICogIDUyIC0tLS0tLS0tLS0t
LS0tLS0tLS0tIDM0ICAzMyAtLS0tLS0tLS0tLS0tLS0tLS0tIDYgNSAtIDMgIDIgICAxICAgMAor
ICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgUmVzZXJ2ZWQgKFplcm8pICAgICB8ICAgICAg
ICAgIFBGTiAgICAgICAgICAgfCAgQyAgfCBEIHwgVlJ8IEcgfAorICogIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
KyAqCiAgKiBUTEIgZmxhZ3MgbWFuYWdlZCBpbiBoYXJkd2FyZToKKyAqICAgIFBGTjoJUGFnZSBG
cmFtZSBOdW1iZXIuCiAgKiAJQzoJQ2FjaGUgYXR0cmlidXRlLgogICogCUQ6CURpcnR5IGJpdC4g
IFRoaXMgbWVhbnMgYSBwYWdlIGlzIHdyaXRhYmxlLiAgSXQgaXMgbm90CiAgKiAJCXNldCBhdCBm
aXJzdCwgYW5kIGEgd3JpdGUgaXMgdHJhcHBlZCwgYW5kIHRoZSBkaXJ0eQogICogCQliaXQgaXMg
c2V0LiAgU2VlIGFsc28gUFRFX1JPLgotICogCVY6CVZhbGlkIGJpdC4gIE9idmlvdXMsIGlzbid0
IGl0PworICogCVZSOglWYWxpZC9SZWZlcmVuY2UgYml0LiBTZWUgYWxzbyBQVEVfU1YuCiAgKiAJ
RzoJR2xvYmFsIGJpdC4gIFRoaXMgbWVhbnMgdGhhdCB0aGlzIG1hcHBpbmcgaXMgcHJlc2VudAog
ICogCQlpbiBFVkVSWSBhZGRyZXNzIHNwYWNlLCBhbmQgdG8gaWdub3JlIHRoZSBBU0lEIHdoZW4K
ICAqIAkJaXQgaXMgbWF0Y2hlZC4KICAqLwogI2RlZmluZQlQVEVfQyhhdHRyKQkJKChhdHRyICYg
MHgwNykgPDwgMykKICNkZWZpbmUJUFRFX0NfVU5DQUNIRUQJCShQVEVfQyhNSVBTX0NDQV9VTkNB
Q0hFRCkpCiAjZGVmaW5lCVBURV9DX0NBQ0hFCQkoUFRFX0MoTUlQU19DQ0FfQ0FDSEVEKSkKICNk
ZWZpbmUJUFRFX0QJCQkweDA0Ci0jZGVmaW5lCVBURV9WCQkJMHgwMgorI2RlZmluZQlQVEVfVlIJ
CQkweDAyCiAjZGVmaW5lCVBURV9HCQkJMHgwMQogCisjaWZkZWYgQ1BVX0NIRVJJCisvKgorICog
Q0hFUkkgRW50cnlMbyBleHRlbnNpb25zIHRoYXQgbGltaXQgc3RvcmluZyBsb2FkaW5nIGFuZCBz
dG9yaW5nIHRhZ2dlZAorICogdmFsdWVzLgorICovCisjZGVmaW5lCVBURV9TQwkJCSgweDFVTEwg
PDwgNjMpCisjZGVmaW5lCVBURV9MQwkJCSgweDFVTEwgPDwgNjIpCisjZW5kaWYKKwogLyoKKyAq
IFBURSBTb2Z0d2FyZSBCaXRzCisgKgorICogVXBwZXIgYml0cyBvZiBhIDMyIGJpdCBQVEU6Cisg
KgorICogICAgIDMxICAgMzAgICAyOQorICogICAgLS0tLS0tLS0tLS0tLS0KKyAqICAgfCBNTiB8
IFcgIHwgUk8gfAorICogICAgLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBVcHBlciBiaXRzIG9mIGEg
NjQgYml0IFBURToKKyAqCisgKiAgIDYzLTYyICAgNjEtNjAgIDU5ICAgNTggLS0gNTYgICAgNTUg
ICA1NCAgIDUzCisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQorICogIHwgIFJHICB8ICAgICAgfCBTViB8IFBHIFNaIElEWCB8IE1OIHwgVyAgfCBSTyB8
CisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoK
ICAqIFZNIGZsYWdzIG1hbmFnZWQgaW4gc29mdHdhcmU6CisgKglSRzoJUmVnaW9uLgkgKFJlc2Vy
dmVkLiBDdXJyZW50bHkgbm90IHVzZWQuKQorICoJU1Y6CVNvZnQgVmFsaWQgYml0LgorICoJUEcg
U1ogSURYOiBQYWdlIFNpemUgSW5kZXggKDAtNykuCisgKgkJSW5kZXgJUGFnZSBNYXNrIChCaW5h
cnkpCUhXIFBhZ2UgU2l6ZQorICoJCS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0JLS0tLS0tLS0t
LS0tCisgKgkJMAkwMDAwIDAwMDAgMDAwMCAwMDAwCSAgNEsKKyAqCQkxCTAwMDAgMDAwMCAwMDAw
IDAwMTEJIDE2SworICoJCTIJMDAwMCAwMDAwIDAwMDAgMTExMQkgNjRLCisgKgkJMwkwMDAwIDAw
MDAgMDAxMSAxMTExCTI1NksKKyAqCQk0CTAwMDAgMDAwMCAxMTExIDExMTEJICAxTQorICoJCTUJ
MDAwMCAwMDExIDExMTEgMTExMQkgIDRNCisgKgkJNgkwMDAwIDExMTEgMTExMSAxMTExCSAxNk0K
KyAqIChNSVBTIDM6KQorICoJCTcJMDAxMSAxMTExIDExMTEgMTExMQkgNjRNCisgKgkJOAkxMTEx
IDExMTEgMTExMSAxMTExCTI1Nk0gKE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkKQorICoKICAqIAlS
TzoJUmVhZCBvbmx5LiAgTmV2ZXIgc2V0IFBURV9EIG9uIHRoaXMgcGFnZSwgYW5kIGRvbid0CiAg
KiAJCWxpc3RlbiB0byByZXF1ZXN0cyB0byB3cml0ZSB0byBpdC4KICAqIAlXOglXaXJlZC4gID8/
PwpAQCAtMTUxLDEzICsyMTYsMjkxIEBACiAjZGVmaW5lCVBURV9STwkJCSgocHRfZW50cnlfdCkw
eDAxIDw8IFRMQkxPX1NXQklUU19TSElGVCkKICNkZWZpbmUJUFRFX1cJCQkoKHB0X2VudHJ5X3Qp
MHgwMiA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCiAjZGVmaW5lCVBURV9NQU5BR0VECQkoKHB0X2Vu
dHJ5X3QpMHgwNCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjaWYgZGVmaW5lZChfX21pcHNfbjY0
KSB8fCBkZWZpbmVkKF9fbWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KKyNkZWZpbmUJ
UFRFX1BTXzE2SwkJKChwdF9lbnRyeV90KTB4MDggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2Rl
ZmluZQlQVEVfUFNfNjRLCQkoKHB0X2VudHJ5X3QpMHgxMCA8PCBUTEJMT19TV0JJVFNfU0hJRlQp
CisjZGVmaW5lCVBURV9QU18yNTZLCQkoKHB0X2VudHJ5X3QpMHgxOCA8PCBUTEJMT19TV0JJVFNf
U0hJRlQpCisjZGVmaW5lCVBURV9QU18xTQkJKChwdF9lbnRyeV90KTB4MjAgPDwgVExCTE9fU1dC
SVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfNE0JCSgocHRfZW50cnlfdCkweDI4IDw8IFRMQkxP
X1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzE2TQkJKChwdF9lbnRyeV90KTB4MzAgPDwg
VExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfNjRNCQkoKHB0X2VudHJ5X3QpMHgz
OCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU19JRFhfTUFTSwkJKChwdF9l
bnRyeV90KTB4MzggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNJRFhfTkJJ
VFNfVE9fTEVGVAkJNQorI2RlZmluZQlQVEVfUFNJRFhfTkJJVFNfVE9fUklHSFQJNTYKKyNkZWZp
bmUJUFRFX1BGTl9OQklUU19UT19MRUZUCQkxMQorI2RlZmluZQlQVEVfUEZOX05CSVRTX1RPX1JJ
R0hUCQk2CisjZGVmaW5lCVBURV9IV0ZMQUdTX05CSVRTX1RPX0xFRlQJNTgKKyNkZWZpbmUJU1df
VkFMSUQJCTB4NDAKKyNkZWZpbmUJUFRFX1NWCQkJKChwdF9lbnRyeV90KVNXX1ZBTElEIDw8IFRM
QkxPX1NXQklUU19TSElGVCkKKyNlbHNlCisjZGVmaW5lCVBURV9QU19JRFhfTUFTSwkJMAorI2Rl
ZmluZQlQVEVfU1YJCQkwCisjZW5kaWYKKworLyoKKyAqIFByb21vdGlvbiB0byBhIDRNQiAoUERF
KSBwYWdlIG1hcHBpbmcgcmVxdWlyZXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyA0S0IKKyAqIChQ
VEUpIHBhZ2UgbWFwcGluZ3MgaGF2ZSBpZGVudGljYWwgc2V0dGluZ3MgZm9yIHRoZSBmb2xsb3dp
bmcgZmllbGRzOgorICovCisjZGVmaW5lCVBHX1BST01PVEVfTUFTSwkoUFRFX0cgfCBQVEVfVkFM
SUQgfCBQVEVfRCB8IFBURV9DX1VOQ0FDSEVEIHwgXAorCQkJUFRFX0NfQ0FDSEUgfCBQVEVfUk8g
fCBQVEVfVyB8IFBURV9NQU5BR0VEIHwgXAorCQkJUFRFX1JFRikKKworI2lmZGVmIE1JUFM2NF9O
RVdfUE1BUAorI2RlZmluZQlUTEJMT19QVEVfVE9fSURYKHB0ZSkJKCgocHRlKSAmIFBURV9QU19J
RFhfTUFTSykgPj4gNTYpCisjZGVmaW5lCVRMQk1BU0tfSURYX1RPX01BU0soaWR4KSAoKCgxIDw8
ICgoaWR4KSA8PCAxKSkgLSAxKSA8PCBUTEJNQVNLX1NISUZUKQorI2RlZmluZQlUTEJMT19QVEVf
VE9fTUFTSyhwdGUpCVRMQk1BU0tfSURYX1RPX01BU0soVExCTE9fUFRFX1RPX0lEWChwdGUpKQor
I2RlZmluZQlUTEJNQVNLXzRLX1BBR0UJCVRMQk1BU0tfSURYX1RPX01BU0soMCkKKyNkZWZpbmUJ
VExCTUFTS18xNktfUEFHRQlUTEJNQVNLX0lEWF9UT19NQVNLKDEpCisjZGVmaW5lCVRMQk1BU0tf
NjRLX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSygyKQorI2RlZmluZQlUTEJNQVNLXzI1NktfUEFH
RQlUTEJNQVNLX0lEWF9UT19NQVNLKDMpCisjZGVmaW5lCVRMQk1BU0tfMU1fUEFHRQkJVExCTUFT
S19JRFhfVE9fTUFTSyg0KQorI2RlZmluZQlUTEJNQVNLXzRNX1BBR0UJCVRMQk1BU0tfSURYX1RP
X01BU0soNSkKKyNkZWZpbmUJVExCTUFTS18xNk1fUEFHRQlUTEJNQVNLX0lEWF9UT19NQVNLKDYp
CisjZGVmaW5lCVRMQk1BU0tfNjRNX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSyg3KQorI2Vsc2Ug
LyogISBNSVBTNjRfTkVXX1BNQVAgKi8KKyNkZWZpbmUJVExCTE9fUFRFX1RPX0lEWChwdGUpIAkw
CisjZGVmaW5lCVRMQkxPX1BURV9UT19NQVNLKHB0ZSkJMAorI2VuZGlmIC8qICEgTUlQUzY0X05F
V19QTUFQICovCiAKIC8qCiAgKiBQVEUgbWFuYWdlbWVudCBmdW5jdGlvbnMgZm9yIGJpdHMgZGVm
aW5lZCBhYm92ZS4KICAqLwotI2RlZmluZQlwdGVfY2xlYXIocHRlLCBiaXQpCSgqKHB0ZSkgJj0g
fihiaXQpKQotI2RlZmluZQlwdGVfc2V0KHB0ZSwgYml0KQkoKihwdGUpIHw9IChiaXQpKQotI2Rl
ZmluZQlwdGVfdGVzdChwdGUsIGJpdCkJKCgqKHB0ZSkgJiAoYml0KSkgPT0gKGJpdCkpCisjaWZu
ZGVmIF9MT0NPUkUKK3N0YXRpYyBfX2lubGluZSB2b2lkCitwdGVfY2xlYXIocHRfZW50cnlfdCAq
cHRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCSpwdGUgJj0gKH5iaXQpOworfQorCitzdGF0aWMg
X19pbmxpbmUgdm9pZAorcHRlX3NldChwdF9lbnRyeV90ICpwdGUsIHB0X2VudHJ5X3QgYml0KQor
eworCisJKnB0ZSB8PSBiaXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV90ZXN0KHB0
X2VudHJ5X3QgKnB0ZSwgcHRfZW50cnlfdCBiaXQpCit7CisKKwlyZXR1cm4gKCgqcHRlICYgYml0
KSA9PSBiaXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcGRlX2NsZWFyKHBkX2VudHJ5
X3QgKnBkZSwgcHRfZW50cnlfdCBiaXQpCit7CisKKwkqKHB0X2VudHJ5X3QgKilwZGUgJj0gKH5i
aXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcGRlX3NldChwZF9lbnRyeV90ICpwZGUs
IHB0X2VudHJ5X3QgYml0KQoreworCisJKihwdF9lbnRyeV90ICopcGRlIHw9IGJpdDsKK30KKwor
c3RhdGljIF9faW5saW5lIGludAorcGRlX3Rlc3QocGRfZW50cnlfdCAqcGRlLCBwdF9lbnRyeV90
IGJpdCkKK3sKKworCXJldHVybiAoKCoocHRfZW50cnlfdCAqKXBkZSAmIGJpdCkgPT0gYml0KTsK
K30KKworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QKK1RMQkxPX1BBX1RPX1BGTih2bV9wYWRk
cl90IHBhKQoreworCisJcmV0dXJuICgoKHBhID4+IFRMQl9QQUdFX1NISUZUKSA8PCBUTEJMT19Q
Rk5fU0hJRlQpICYgVExCTE9fUEZOX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFk
ZHJfdAorVExCTE9fUEZOX1RPX1BBKHB0X2VudHJ5X3QgcGZuKQoreworCisJcmV0dXJuICgodm1f
cGFkZHJfdCkocGZuID4+IFRMQkxPX1BGTl9TSElGVCkgPDwgVExCX1BBR0VfU0hJRlQpOworfQor
CitzdGF0aWMgX19pbmxpbmUgcHRfZW50cnlfdAorVExCTE9fUFRFX1RPX1BGTihwdF9lbnRyeV90
IHB0ZSkKK3sKKworCXJldHVybiAocHRlICYgVExCTE9fUEZOX01BU0spOworfQorCisjaWZkZWYg
TUlQUzY0X05FV19QTUFQCisKKyNkZWZpbmUJUFRFX1JFRgkJUFRFX1ZSCisjZGVmaW5lCVBURV9W
QUxJRCAJUFRFX1NWCisKKyNkZWZpbmUJcHRlX2lzX3JlZihwdGUpCQkJcHRlX3Rlc3QoKHB0ZSks
IFBURV9SRUYpCisjZGVmaW5lCXB0ZV9yZWZfY2xlYXIocHRlKQkJcHRlX2NsZWFyKChwdGUpLCBQ
VEVfUkVGKQorI2RlZmluZQlwdGVfcmVmX3NldChwdGUpCQlwdGVfc2V0KChwdGUpLCBQVEVfUkVG
KQorI2RlZmluZQlwdGVfcmVmX2F0b21pY19jbGVhcihwdGUpCWF0b21pY19jbGVhcl9sb25nKChw
dGUpLCBQVEVfUkVGKQorI2RlZmluZQlwdGVfcmVmX2F0b21pY19zZXQocHRlKQkJYXRvbWljX3Nl
dF9sb25nKChwdGUpLCBQVEVfUkVGKQorCisjZWxzZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLwor
CisjZGVmaW5lCVBURV9SRUYJCTAKKyNkZWZpbmUJUFRFX1ZBTElECVBURV9WUgorCisjZGVmaW5l
CXB0ZV9pc19yZWYocHRlKQkJCTAKKyNkZWZpbmUJcHRlX3JlZl9jbGVhcihwdGUpCisjZGVmaW5l
CXB0ZV9yZWZfc2V0KHB0ZSkKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfY2xlYXIocHRlKQorI2Rl
ZmluZQlwdGVfcmVmX2F0b21pY19zZXQocHRlLCBiaXQpCisKKyNlbmRpZiAvKiAhIE1JUFM2NF9O
RVdfUE1BUCAqLworCisjZGVmaW5lCXB0ZV9pc192YWxpZChwdGUpCQlwdGVfdGVzdCgocHRlKSwg
UFRFX1ZBTElEKQorCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9fbWlwc19u
MzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KKworI2RlZmluZQlwdGVfYXRvbWljX2NsZWFyKHB0
ZSwgYml0KQlhdG9taWNfY2xlYXJfNjQoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2F0b21pY19z
ZXQocHRlLCBiaXQpCWF0b21pY19zZXRfNjQoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2xvYWRf
c3RvcmUocHRlcCwgcHRlKQlhdG9taWNfcmVhZGFuZHNldF82NChwdGVwLCBwdGUpCisjZGVmaW5l
CXBkZV9sb2FkX3N0b3JlKHBkZXAsIHBkZSkJKHBkX2VudHJ5X3QpYXRvbWljX3JlYWRhbmRzZXRf
NjQoXAorCQkJCQkJKHB0X2VudHJ5X3QgKilwZGVwLCBwZGUpCisKKyNkZWZpbmUJcHRlX2F0b21p
Y19zdG9yZShwdGVwLCBwdGUpCWF0b21pY19zdG9yZV9yZWxfNjQocHRlcCwgcHRlKQorI2RlZmlu
ZSBwdGVfc3RvcmUocHRlcCwgcHRlKQlkbyB7CQlcCisJKih1X2xvbmcgKikocHRlcCkgPSAodV9s
b25nKShwdGUpOwlcCit9IHdoaWxlICgwKQorI2RlZmluZQlwZGVfc3RvcmUocGRlcCwgcGRlKQkJ
cHRlX3N0b3JlKHBkZXAsIHBkZSkKKworCisjZWxzZSAvKiAhIFBIWVNBRERSXzY0X0JJVCAqLwor
CisjZGVmaW5lCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBiaXQpCWF0b21pY19jbGVhcl8zMigocHRl
KSwgYml0KQorI2RlZmluZQlwdGVfYXRvbWljX3NldChwdGUsIGJpdCkJYXRvbWljX3NldF8zMigo
cHRlKSwgYml0KQorI2RlZmluZQlwdGVfbG9hZF9zdG9yZShwdGVwLCBwdGUpCWF0b21pY19yZWFk
YW5kc2V0XzMyKHB0ZXAsIHB0ZSkKKyNkZWZpbmUJcGRlX2xvYWRfc3RvcmUocGRlcCwgcGRlKQko
cGRfZW50cnlfdClhdG9taWNfcmVhZGFuZHNldF8zMihcCisJCQkJCQkocHRfZW50cnlfdCAqKXBk
ZXAsIHBkZSkKKworI2RlZmluZQlwdGVfYXRvbWljX3N0b3JlKHB0ZXAsIHB0ZSkJYXRvbWljX3N0
b3JlX3JlbF8zMihwdGVwLCBwdGUpCisjZGVmaW5lIHB0ZV9zdG9yZShwdGVwLCBwdGUpCWRvIHsJ
CVwKKwkqKHVfaW50ICopKHB0ZXApID0gKHVfaW50KShwdGUpOwlcCit9IHdoaWxlICgwKQorI2Rl
ZmluZQlwZGVfc3RvcmUocGRlcCwgcGRlKQkJcHRlX3N0b3JlKHBkZXAsIHBkZSkKKworI2VuZGlm
IC8qICEgUEhZU0FERFJfNjRfQklUICovCisKKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8KKworI2lm
IGRlZmluZWQoX19taXBzX242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJf
NjRfQklUICovCisKKyNpZm5kZWYgX0xPQ09SRQorLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIFBE
RSBpcyBhY3R1YWxseSBhIHN1cGVycGFnZSAoUGFnZVNpemUgPiA0SykgUFRFLgorICoKKyAqIE9u
IF9fbWlwc19uNjQgdGhlIGtlcm5lbCB1c2VzIHRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzIHJh
bmdlIGZyb20KKyAqIFZNX01JTl9LRVJORUxfQUREUkVTUyAoMHhjMDAwMDAwMDAwMDAwMDAwKSB0
byBWTV9NQVhfS0VSTkVMX0FERFJFU1MKKyAqICgweGMwMDAwMDgwMDAwMDAwMDApLiBUaGVyZWZv
cmUsIGEgdmFsaWQgdmlydHVhbCBhZGRyZXNzIGluIHRoZSBQREUKKyAqIChhIHBvaW50ZXIgdG8g
YSBwYWdlIHRhYmxlKSB3aWxsIGhhdmUgYml0cyA2MSB0byA0MCBzZXQgdG8gemVyby4gQQorICog
c3VwZXJwYWdlIHdpbGwgaGF2ZSBvbmUgb2YgdGhlIHN1cGVycGFnZSBzaXplIGJpdHMgKGJpdHMg
NTggdG8gNTYpCisgKiBzZXQuCisgKi8KKworLyogSXMgdGhlIFBERSBhIHN1cGVycGFnZSBvZiBh
bnkgc2l6ZT8gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3BkZV9pc19zdXBlcnBhZ2UocGRfZW50
cnlfdCAqcGRlKQoreworCisJcmV0dXJuICgoKHB0X2VudHJ5X3QpKnBkZSAmIFBURV9QU19JRFhf
TUFTSykgIT0gMCk7Cit9CisKKy8qIElzIHRoZSBQVEUgYSBzdXBlcnBhZ2Ugb2YgYW55IHNpemU/
ICovCitzdGF0aWMgX19pbmxpbmUgaW50CitwdGVfaXNfc3VwZXJwYWdlKHB0X2VudHJ5X3QgKnB0
ZSkKK3sKKworCXJldHVybiAoKCpwdGUgJiBQVEVfUFNfSURYX01BU0spICE9IDApOworfQorCisv
KiBJcyB0aGUgUERFIGFuIDFNQiBzdXBlcnBhZ2U/ICovCitzdGF0aWMgX19pbmxpbmUgaW50Citw
ZGVfaXNfMW1fc3VwZXJwYWdlKHBkX2VudHJ5X3QgKnBkZSkKK3sKKworCXJldHVybiAoKChwdF9l
bnRyeV90KSpwZGUgJiBQVEVfUFNfMU0pID09IFBURV9QU18xTSk7Cit9CisKKy8qIElzIHRoZSBQ
VEUgYW4gMU1CIHN1cGVycGFnZT8gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV9pc18xbV9z
dXBlcnBhZ2UocHRfZW50cnlfdCAqcHRlKQoreworCisJcmV0dXJuICgoKnB0ZSAmIFBURV9QU18x
TSkgPT0gUFRFX1BTXzFNKTsKK30KKworLyogUGh5c2ljYWwgQWRkcmVzcyB0byBTdXBlcnBhZ2Ug
UGh5c2ljYWwgRnJhbWUgTnVtYmVyLiAqLworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QKK1RM
QkxPX1BBX1RPX1NQRk4odm1fcGFkZHJfdCBwYSkKK3sKKworCXJldHVybiAoKChwYSA+PiBUTEJf
MU1fU1VQRVJQQUdFX1NISUZUKSA8PCBUTEJMT19QRk5fU0hJRlQpICYKKwkgICAgVExCTE9fUEZO
X01BU0spOworfQorCisvKiBTdXBlcnBhZ2UgUGh5c2ljYWwgRnJhbWUgTnVtYmVyIHRvIFBoeXNp
Y2FsIEFkZHJlc3MuICovCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fU1BGTl9U
T19QQShwdF9lbnRyeV90IHNwZm4pCit7CisKKwlyZXR1cm4gKCh2bV9wYWRkcl90KShzcGZuID4+
IFRMQkxPX1BGTl9TSElGVCkgPDwKKwkgICAgVExCXzFNX1NVUEVSUEFHRV9TSElGVCk7Cit9CisK
Ky8qIFN1cGVycGFnZSBQYWdlIFRhYmxlIEVudHJ5IHRvIFBoeXNpY2FsIEFkZHJlc3MuICovCitz
dGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fU1BURV9UT19QQShwdF9lbnRyeV90IHB0
ZSkKK3sKKwlyZXR1cm4gKFRMQkxPX1NQRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTihwdGUpKSk7
Cit9CisKK3N0YXRpYyBfX2lubGluZSB2bV9wYWRkcl90CitUTEJMT19TUERFX1RPX1BBKHBkX2Vu
dHJ5X3QgcGRlKQoreworCXJldHVybiAoVExCTE9fU1BGTl9UT19QQShUTEJMT19QVEVfVE9fUEZO
KChwdF9lbnRyeV90KXBkZSkpKTsKK30KKworCisvKiBBbiA0S0IgUGFnZSBUYWJsZSBFbnRyeSB0
byBQaHlzaWNhbCBBZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RMQkxP
X1BURV9UT19QQShwdF9lbnRyeV90IHB0ZSkKK3sKKworCXJldHVybiAoVExCTE9fUEZOX1RPX1BB
KFRMQkxPX1BURV9UT19QRk4ocHRlKSkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJf
dAorVExCTE9fUERFX1RPX1BBKHBkX2VudHJ5X3QgcGRlKQoreworCisJcmV0dXJuIChUTEJMT19Q
Rk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTigocHRfZW50cnlfdClwZGUpKSk7Cit9CisjZW5kaWYg
LyogISBfTE9DT1JFICovCisKKyNlbHNlIC8qICEgUEhZU0FERFJfNjRfQklUICovCisKKyNkZWZp
bmUJcHRlX2lzX3JlZmVyZW5jZWQocHRlKQkJMAorI2RlZmluZQlwdGVfcmVmZXJlbmNlX3Jlc2V0
KHB0ZSkKKyNkZWZpbmUJcHRlX3JlZmVyZW5jZV9wYWdlKHB0ZSkKKyNkZWZpbmUJcGRlX2lzX3N1
cGVycGFnZShwZGUpCQkwCisjZGVmaW5lCXB0ZV9pc19zdXBlcnBhZ2UocGRlKQkJMAorI2RlZmlu
ZSBwZGVfaXNfMW1fc3VwZXJwYWdlKHB0ZSkJMAorI2RlZmluZSBwdGVfaXNfMW1fc3VwZXJwYWdl
KHB0ZSkJMAorCisjaWZuZGVmIF9MT0NPUkUKK3N0YXRpYyBfX2lubGluZSB2bV9wYWRkcl90CitU
TEJMT19QVEVfVE9fUEEocHRfZW50cnlfdCBwdGUpCit7CisKKwlyZXR1cm4gKFRMQkxPX1BGTl9U
T19QQShUTEJMT19QVEVfVE9fUEZOKHB0ZSkpKTsKK30KKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8K
KyNlbmRpZiAvKiAhIFBIWVNBRERSXzY0X0JJVCAqLwogCiAvKiBBc3NlbWJseSBzdXBwb3J0IGZv
ciBQVEUgYWNjZXNzKi8KICNpZmRlZiBMT0NPUkUKQEAgLTE2NywxNiArNTEwLDEwNCBAQAogI2Rl
ZmluZQlQVEVNQVNLCQkJMHhmZjgKICNkZWZpbmUJUFRFU0laRQkJCTgKICNkZWZpbmUJUFRFX0wJ
CQlsZAorI2RlZmluZQlQVEVfUwkJCXNkCiAjZGVmaW5lCVBURV9NVEMwCQlkbXRjMAotI2RlZmlu
ZQlDTEVBUl9QVEVfU1dCSVRTKHByKQotI2Vsc2UKKyNkZWZpbmUJQ0xFQVJfUFRFX1NXQklUUyhy
KQorCisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisKKy8qIFN1cGVycGFnZSBhbmQgcmVmZXJlbmNl
ZCBiaXQgZW11bGF0aW9uIEFTTSBtYWNyb3MuICovCisKKy8qCisgKiBHRVRfU1VQRVJQQUdFX0lE
WChyKQorICoKKyAqIEdldCB0aGUgc3VwZXJwYWdlIGluZGV4IGZyb20gdGhlIFBURSBieSBzaGlm
dGluZyBpdCBsZWZ0IGJ5CisgKiBQVEVfUFNJRFhfTkJJVFNfVE9fTEVGVCAoY2xlYXJpbmcgdGhl
IHVwcGVyIHNvZnRiaXRzKSBhbmQgdGhlbiBiYWNrIHRvIHRoZQorICogcmlnaHQgYnkgKFBURV9Q
U0lEWF9OQklUU19UT19SSUdIVCArIFBURV9QU0lEWF9OQklUU19UT19SSUdIVCkgY2xlYXJpbmcK
KyAqIGFsbCB0aGUgbG93ZXIgYml0cyBpbiB0aGUgcHJvY2Vzcy4KKyAqLworI2RlZmluZSBHRVRf
U1VQRVJQQUdFX0lEWChyKQkJCQlcCisJZHNsbAlyLCAoUFRFX1BTSURYX05CSVRTX1RPX0xFRlQp
OwkJXAorCWRzcmwzMglyLCAoUFRFX1BTSURYX05CSVRTX1RPX1JJR0hUICsgUFRFX1BTSURYX05C
SVRTX1RPX0xFRlQgLSAzMikKKworLyoKKyAqIEdFVF9IV19UTEJfRkxBR1MocikKKyAqCisgKiBH
ZXQgdGhlIGxvd2VyIGhhcmR3YXJlIFRMQiBmbGFncyBidXQgc2hpZnRpbmcgbGVmdCB0aGVuIHJp
Z2h0LgorICovCisjZGVmaW5lIEdFVF9IV19UTEJfRkxBR1MocikJCQkJXAorCWRzbGwzMglyLCAo
UFRFX0hXRkxBR1NfTkJJVFNfVE9fTEVGVCAtIDMyKTsJXAorCWRzcmwzMglyLCAoUFRFX0hXRkxB
R1NfTkJJVFNfVE9fTEVGVCAtIDMyKQorCisvKgorICogR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVO
KHIpCisgKgorICogR2V0IHRoZSBvZGQgMU0gUEZOIChUTEIgbG8xKSBmcm9tIHRoZSBldmVuIDFN
IFBURS4gIEZpcnN0LCBtYXNrIG91dCB0aGUgUEZOCisgKiBmcm9tIHRoZSBldmVuIFBURS4gVGhl
biBhZGQgMU0gd29ydGggb2YgcGFnZXMgdG8gaXQgKDI1NikuIEZpbmFsbHksIHNoaWZ0IGl0Cisg
KiBiYWNrIHRvIGl0cyBwb3NpdGlvbiBpbiB0aGUgUFRFLgorICovCisjZGVmaW5lIEdFVF9PRERf
MU1fUEZOX0ZST01fRVZFTihyKQkJCVwKKwlkc2xsCXIsIChQVEVfUEZOX05CSVRTX1RPX0xFRlQp
OwkJXAorCWRzcmwJciwgKFBURV9QRk5fTkJJVFNfVE9fTEVGVCArIFBURV9QRk5fTkJJVFNfVE9f
UklHSFQpOyBcCisJZGFkZGl1CXIsIHIsICgxMDI0ICogMTAyNCAvIFBBR0VfU0laRSk7CVwKKwlk
c2xsCXIsIChQVEVfUEZOX05CSVRTX1RPX1JJR0hUKQorCisvKgorICogSUZfVkFMSURfU0VUX1JF
RkJJVChyMCwgcjEsIG9mZnNldCwgdW5pcXVlKQorICoKKyAqIElmIGEgUERFIGlzIHZhbGlkIHRo
ZW4gc2V0IHRoZSByZWZlcmVuY2VkIGJpdCAoUFRFX1ZSKS4gIFRoZSBmaXJzdCB2ZXJzaW9uCisg
KiBkb2VzIGl0IGF0b21pY2FsbHkuCisgKi8KKyNkZWZpbmUgQVRPTUlDX1JFRkJJVF9VUERBVEUK
KyNpZmRlZiBBVE9NSUNfUkVGQklUX1VQREFURQorCisjZGVmaW5lIElGX1ZBTElEX1NFVF9SRUZC
SVQocjAsIHIxLCBvZmZzZXQsIHVuaXF1ZSkJXAordHJ5X2FnYWluICMjIHVuaXF1ZSAjIyA6IDsJ
CQkJXAorCWRzcmwzMglyMCwgKFRMQkxPX1NXQklUU19TSElGVCAtIDMyKTsJCVwKKwlhbmRpCXIw
LCByMCwgU1dfVkFMSUQ7CQkJXAorCWJlcXoJcjAsIG5vdF92YWxpZCAjIyB1bmlxdWUgOwkJXAor
CVBURV9MCXIwLCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorCWxsZAlyMCwgb2Zmc2V0ICMjIChyMSkg
OwkJCVwKKwlvcmkJcjAsIHIwLCBQVEVfVlIgOwkJCVwKKwlzY2QJcjAsIG9mZnNldCAjIyAocjEp
IDsJCQlcCisJYmVxeglyMCwgdHJ5X2FnYWluICMjIHVuaXF1ZSA7CQlcCisJUFRFX0wJcjAsIG9m
ZnNldCAjIyAocjEpIDsJCQlcCitub3RfdmFsaWQgIyMgdW5pcXVlICMjIDoKKworI2Vsc2UgLyog
ISBBVE9NSUNfUkVGQklUX1VQREFURSAqLworCisjZGVmaW5lIElGX1ZBTElEX1NFVF9SRUZCSVQo
cjAsIHIxLCBvZmZzZXQsIHVuaXF1ZSkJXAordHJ5X2FnYWluICMjIHVuaXF1ZSAjIyA6IDsJCQkJ
XAorCWRzcmwzMglyMCwgKFRMQkxPX1NXQklUU19TSElGVCAtIDMyKSA7CQlcCisJYW5kaQlyMCwg
cjAsIFNXX1ZBTElEIDsJCQlcCisJYmVxeglyMCwgbm90X3ZhbGlkICMjIHVuaXF1ZSA7CQlcCisJ
UFRFX0wJcjAsIG9mZnNldCAjIyAocjEpIDsJCQlcCisJb3JpCXIwLCByMCwgUFRFX1ZSIDsJCQlc
CisJUFRFX1MJcjAsIG9mZnNldCAjIyAocjEpIDsJCQlcCitub3RfdmFsaWQgIyMgdW5pcXVlICMj
IDoKKyNlbmRpZiAvKiAhIEFUT01JQ19SRUZCSVRfVVBEQVRFICovCisKKyNlbHNlIC8qICEgTUlQ
UzY0X05FV19QTUFQICovCisKKyNkZWZpbmUJR0VUX1NVUEVSUEFHRV9JRFgocikKKyNkZWZpbmUg
R0VUX0hXX1RMQl9GTEFHUyhyKQorI2RlZmluZQlJRl9WQUxJRF9TRVRfUkVGQklUKHIwLCByMSwg
b2Zmc2V0LCB1bmlxdWUpCisKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisjZWxz
ZSAvKiAhIExPQ09SRSAqLwogI2RlZmluZQlQVEVTSElGVAkJMgogI2RlZmluZQlQVEUyTUFTSwkJ
MHhmZjgJLyogZm9yIHRoZSAyLXBhZ2UgbG8wL2xvMSAqLwogI2RlZmluZQlQVEVNQVNLCQkJMHhm
ZmMKICNkZWZpbmUJUFRFU0laRQkJCTQKICNkZWZpbmUJUFRFX0wJCQlsdworI2RlZmluZQlQVEVf
UwkJCXN3CiAjZGVmaW5lCVBURV9NVEMwCQltdGMwCiAjZGVmaW5lCUNMRUFSX1BURV9TV0JJVFMo
cikJTE9OR19TTEwgciwgVExCTE9fU1dCSVRTX0NMRUFSX1NISUZUOyBMT05HX1NSTCByLCBUTEJM
T19TV0JJVFNfQ0xFQVJfU0hJRlQgLyogcmVtb3ZlIHN3Yml0cyAqLworCisjZGVmaW5lCUlTX1BU
RV9WQUxJRChyMCwgcjEsIG9mZnNldCwgbGFiZWwpCisjZGVmaW5lCVNFVF9SRUZfQklUKHIwLCBy
MSwgb2Zmc2V0KQorCiAjZW5kaWYgLyogZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9f
bWlwc19uMzIpICovCiAKICNpZiBkZWZpbmVkKF9fbWlwc19uNjQpCkBAIC0yMDEsNCArNjMyLDE3
IEBACiAjZGVmaW5lCU1JUFMzX1BHTUFTS182NE0JMHgwN2ZmZTAwMAogI2RlZmluZQlNSVBTM19Q
R01BU0tfMjU2TQkweDFmZmZlMDAwCiAKKworLyogUGFnZU1hc2sgUmVnaXN0ZXIgKENQMCBSZWdp
c3RlciA1LCBTZWxlY3QgMCkgVmFsdWVzICovCisjZGVmaW5lCU1JUFMzX1BHTUFTS19NQVNLWAkw
eDAwMDAxODAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS180SwkJMHgwMDAwMDAwMAorI2RlZmluZQlN
SVBTM19QR01BU0tfMTZLCTB4MDAwMDYwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzY0SwkweDAw
MDFlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18yNTZLCTB4MDAwN2UwMDAKKyNkZWZpbmUJTUlQ
UzNfUEdNQVNLXzFNCQkweDAwMWZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS180TQkJMHgwMDdm
ZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMTZNCTB4MDFmZmUwMDAKKyNkZWZpbmUJTUlQUzNf
UEdNQVNLXzY0TQkweDA3ZmZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18yNTZNCTB4MWZmZmUw
MDAKKwogI2VuZGlmIC8qICFfTUFDSElORV9QVEVfSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy9taXBz
L2luY2x1ZGUvcG1hcC5oIGIvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKLS0tIGEvc3lzL21pcHMv
aW5jbHVkZS9wbWFwLmgKKysrIGIvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKQEAgLTQ4LDYgKzQ4
LDcgQEAKIAogI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgogI2luY2x1ZGUgPG1hY2hpbmUv
cHRlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpZiBkZWZpbmVkKF9fbWlwc19uMzIp
IHx8IGRlZmluZWQoX19taXBzX242NCkgLyogUEhZU0FERFJfNjRCSVQgKi8KICNkZWZpbmUJTktQ
VAkJMjU2CS8qIG1lbSA+IDRHLCB2bV9wYWdlX3N0YXJ0dXAgbmVlZHMgbW9yZSBLUFRzICovCkBA
IC02MiwxNSArNjMsMjQgQEAKICNpbmNsdWRlIDxzeXMvX2xvY2suaD4KICNpbmNsdWRlIDxzeXMv
X211dGV4Lmg+CiAKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKyNpbmNsdWRlIDx2bS9fdm1fcmFk
aXguaD4KKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KKwogLyoKICAqIFBtYXAgc3R1ZmYK
ICAqLwogc3RydWN0IHB2X2VudHJ5Owogc3RydWN0IHB2X2NodW5rOwogCiBzdHJ1Y3QgbWRfcGFn
ZSB7Ci0JaW50IHB2X2ZsYWdzOwogCVRBSUxRX0hFQUQoLCBwdl9lbnRyeSkgcHZfbGlzdDsKKwl2
bV9tZW1hdHRyX3QgcHZfbWVtYXR0cjsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwlpbnQgcHZf
Z2VuOworI2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KKwlpbnQgcHZfZmxhZ3M7CisjZW5k
aWYgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIH07CiAKICNkZWZpbmUJUFZfVEFCTEVfUkVGCQkw
eDAyCS8qIHJlZmVyZW5jZWQgKi8KQEAgLTgxLDE1ICs5MSwxOCBAQAogI2RlZmluZQlBU0lER0VO
X01BU0sJCSgoMSA8PCBBU0lER0VOX0JJVFMpIC0gMSkKIAogc3RydWN0IHBtYXAgeworCXN0cnVj
dCBtdHggcG1fbXR4OwogCXBkX2VudHJ5X3QgKnBtX3NlZ3RhYjsJLyogS1ZBIG9mIHNlZ21lbnQg
dGFibGUgKi8KIAlUQUlMUV9IRUFEKCwgcHZfY2h1bmspCXBtX3B2Y2h1bms7CS8qIGxpc3Qgb2Yg
bWFwcGluZ3MgaW4gcG1hcCAqLwogCWNwdXNldF90CXBtX2FjdGl2ZTsJCS8qIGFjdGl2ZSBvbiBj
cHVzICovCiAJc3RydWN0IHsKIAkJdV9pbnQzMl90IGFzaWQ6QVNJRF9CSVRTOwkvKiBUTEIgYWRk
cmVzcyBzcGFjZSB0YWcgKi8KIAkJdV9pbnQzMl90IGdlbjpBU0lER0VOX0JJVFM7CS8qIGl0cyBn
ZW5lcmF0aW9uIG51bWJlciAqLwogCX0gICAgICBwbV9hc2lkW01BWFNNUENQVV07CiAJc3RydWN0
IHBtYXBfc3RhdGlzdGljcyBwbV9zdGF0czsJLyogcG1hcCBzdGF0aXN0aWNzICovCi0Jc3RydWN0
IG10eCBwbV9tdHg7CisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisJc3RydWN0IHZtX3JhZGl4IHBt
X3Jvb3Q7CQkvKiBzcGFyZSBwYWdlIHRhYmxlIHBhZ2VzICovCisjZW5kaWYgLyogTUlQUzY0X05F
V19QTUFQICovCiB9OwogCiB0eXBlZGVmIHN0cnVjdCBwbWFwICpwbWFwX3Q7CkBAIC0xMjEsNyAr
MTM0LDcgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgcHZfZW50cnkgewogCXZtX29mZnNldF90IHB2
X3ZhOwkvKiB2aXJ0dWFsIGFkZHJlc3MgZm9yIG1hcHBpbmcgKi8KLQlUQUlMUV9FTlRSWShwdl9l
bnRyeSkgcHZfbGlzdDsKKwlUQUlMUV9FTlRSWShwdl9lbnRyeSkgcHZfbmV4dDsKIH0gICAgICAg
KnB2X2VudHJ5X3Q7CiAKIC8qCkBAIC0xNjQsMTEgKzE3NywxNSBAQAogZXh0ZXJuIHZtX3BhZGRy
X3QgZHVtcF9hdmFpbFtQSFlTX0FWQUlMX0VOVFJJRVMgKyAyXTsKIAogI2RlZmluZQlwbWFwX3Bh
Z2VfZ2V0X21lbWF0dHIobSkJVk1fTUVNQVRUUl9ERUZBVUxUCi0jZGVmaW5lCXBtYXBfcGFnZV9p
c19tYXBwZWQobSkJKCFUQUlMUV9FTVBUWSgmKG0pLT5tZC5wdl9saXN0KSkKICNkZWZpbmUJcG1h
cF9wYWdlX2lzX3dyaXRlX21hcHBlZChtKQkoKChtKS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkg
IT0gMCkKIAogdm9pZCBwbWFwX2Jvb3RzdHJhcCh2b2lkKTsKIHZvaWQgKnBtYXBfbWFwZGV2KHZt
X3BhZGRyX3QsIHZtX3NpemVfdCk7CisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisjZGVmaW5lCXBt
YXBfcGFnZV9pc19tYXBwZWQobSkJKCFUQUlMUV9FTVBUWSgmKG0pLT5tZC5wdl9saXN0KSkKKyNl
bHNlCitib29sZWFuX3QgcG1hcF9wYWdlX2lzX21hcHBlZCh2bV9wYWdlX3QgbSk7CisjZW5kaWYK
IHZvaWQgcG1hcF91bm1hcGRldih2bV9vZmZzZXRfdCwgdm1fc2l6ZV90KTsKIHZtX29mZnNldF90
IHBtYXBfc3RlYWxfbWVtb3J5KHZtX3NpemVfdCBzaXplKTsKIHZvaWQgcG1hcF9rZW50ZXIodm1f
b2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEpOwpAQCAtMTc4LDYgKzE5NSw3IEBACiB2b2lkIHBt
YXBfa2VudGVyX3RlbXBvcmFyeV9mcmVlKHZtX3BhZGRyX3QgcGEpOwogdm9pZCBwbWFwX2ZsdXNo
X3B2Y2FjaGUodm1fcGFnZV90IG0pOwogaW50IHBtYXBfZW11bGF0ZV9tb2RpZmllZChwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3QgdmEpOworaW50IHBtYXBfZW11bGF0ZV9yZWZlcmVuY2VkKHBtYXBf
dCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CiB2b2lkIHBtYXBfcGFnZV9zZXRfbWVtYXR0cih2bV9w
YWdlX3QsIHZtX21lbWF0dHJfdCk7CiAKICNlbmRpZgkJCQkvKiBfS0VSTkVMICovCmRpZmYgLS1n
aXQgYS9zeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmggYi9zeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmgK
LS0tIGEvc3lzL21pcHMvaW5jbHVkZS9wYXJhbS5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvcGFy
YW0uaApAQCAtMTYzLDE3ICsxNjMsMzggQEAKIAogI2RlZmluZQlNQVhEVU1QUEdTCQkxCQkvKiB4
eHg6IHdoeSBpcyB0aGlzIG9ubHkgb25lPyAqLwogCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UK
Ky8qCisgKiBGb3IgYSBsYXJnZSBrZXJuZWwgc3RhY2sgcGFnZSB0aGUgS1NUQUNLX1NJWkUgbmVl
ZHMgdG8gYmUgYSBwYWdlIHNpemUKKyAqIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUgKGUuZy4g
MTZLKS4KKyAqLworI2RlZmluZQlLU1RBQ0tfU0laRQkJKDEgPDwgMTQpCS8qIFNpbmdsZSAxNksg
cGFnZSAqLworI2RlZmluZQlLU1RBQ0tfUEFHRV9TSVpFCUtTVEFDS19TSVpFCisjZGVmaW5lCUtT
VEFDS19QQUdFX01BU0sJKEtTVEFDS19QQUdFX1NJWkUgLSAxKQorI2RlZmluZQlLU1RBQ0tfUEFH
RVMJCShLU1RBQ0tfU0laRSAvIFBBR0VfU0laRSkKKyNkZWZpbmUJS1NUQUNLX1RMQk1BU0tfTUFT
SwkoKEtTVEFDS19QQUdFX01BU0sgPj4gKFRMQk1BU0tfU0hJRlQgLSAxKSkgXAorCQkJCQk8PCBU
TEJNQVNLX1NISUZUKQorI2RlZmluZQlLU1RBQ0tfR1VBUkRfUEFHRVMJKChLU1RBQ0tfUEFHRV9T
SVpFICogMikgLyBQQUdFX1NJWkUpCisKKyNlbHNlIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8K
KwogLyoKICAqIFRoZSBrZXJuZWwgc3RhY2sgbmVlZHMgdG8gYmUgYWxpZ25lZCBvbiBhIChQQUdF
X1NJWkUgKiAyKSBib3VuZGFyeS4KICAqLwogI2RlZmluZQlLU1RBQ0tfUEFHRVMJCTIJLyoga2Vy
bmVsIHN0YWNrICovCisjZGVmaW5lCUtTVEFDS19TSVpFCQkoS1NUQUNLX1BBR0VTICogUEFHRV9T
SVpFKQorI2RlZmluZQlLU1RBQ0tfUEFHRV9TSVpFCVBBR0VfU0laRQorI2RlZmluZQlLU1RBQ0tf
UEFHRV9NQVNLCShQQUdFX1NJWkUgLSAxKQogI2RlZmluZQlLU1RBQ0tfR1VBUkRfUEFHRVMJMgkv
KiBwYWdlcyBvZiBrc3RhY2sgZ3VhcmQ7IDAgZGlzYWJsZXMgKi8KKyNlbmRpZiAvKiAhIEtTVEFD
S19MQVJHRV9QQUdFICovCiAKIC8qCiAgKiBNYWNoIGRlcml2ZWQgY29udmVyc2lvbiBtYWNyb3MK
ICAqLwogI2RlZmluZQlyb3VuZF9wYWdlKHgpCQkoKCh4KSArIFBBR0VfTUFTSykgJiB+UEFHRV9N
QVNLKQogI2RlZmluZQl0cnVuY19wYWdlKHgpCQkoKHgpICYgflBBR0VfTUFTSykKKyNkZWZpbmUJ
cm91bmRfMm1wYWdlKHgpCQkoKCh4KSArIFBEUk1BU0spICYgflBEUk1BU0spCisjZGVmaW5lCXRy
dW5jXzJtcGFnZSh4KQkJKCh4KSAmIH5QRFJNQVNLKQogCiAjZGVmaW5lCWF0b3AoeCkJCQkoKHgp
ID4+IFBBR0VfU0hJRlQpCiAjZGVmaW5lCXB0b2EoeCkJCQkoKHgpIDw8IFBBR0VfU0hJRlQpCmRp
ZmYgLS1naXQgYS9zeXMvbWlwcy9jb25mL01BTFRBNjQgYi9zeXMvbWlwcy9jb25mL01BTFRBNjQK
LS0tIGEvc3lzL21pcHMvY29uZi9NQUxUQTY0CisrKyBiL3N5cy9taXBzL2NvbmYvTUFMVEE2NApA
QCAtMTEsMyArMTEsNSBAQAogbWFrZW9wdGlvbnMJQVJDSF9GTEFHUz0iLW1hcmNoPW1pcHM2NCAt
bWFiaT02NCIKICAKIG1ha2VvcHRpb25zIAlLRVJOTE9BREFERFI9MHhmZmZmZmZmZjgwMTAwMDAw
CisKK29wdGlvbnMJCU1JUFM2NF9ORVdfUE1BUApkaWZmIC0tZ2l0IGEvc3lzL2NvbmYvb3B0aW9u
cy5taXBzIGIvc3lzL2NvbmYvb3B0aW9ucy5taXBzCi0tLSBhL3N5cy9jb25mL29wdGlvbnMubWlw
cworKysgYi9zeXMvY29uZi9vcHRpb25zLm1pcHMKQEAgLTk3LDExICs5NywyNCBAQAogQkVSSV9M
QVJHRV9UTEIJCQlvcHRfZ2xvYmFsLmgKIAogIworIyBVc2UgdGhlIG5ldyBwbWFwIGZvciBNSVBT
NjQgdGhhdCBpbmNsdWRlcyByZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorIyBhbmQgc3VwZXJwYWdl
IHN1cHBvcnQuCisjCitNSVBTNjRfTkVXX1BNQVAJCQlvcHRfZ2xvYmFsLmgKKworIwogIyBPcHRp
b25zIHRoYXQgY29udHJvbCB0aGUgTmV0RlBHQS0xMEcgRW1iZWRkZWQgQ1BVIEV0aGVybmV0IENv
cmUuCiAjCiBORjEwQk1BQ182NEJJVAkJCW9wdF9uZXRmcGdhLmgKIAogIworIyBPcHRpb25zIGZv
ciBoYXJkd2FyZSB3aXRoIFBhZ2VNYXNrIHJlZ2lzdGVyIHN1cHBvcnQKKyMKKworIyBVc2Ugb25l
IGxhcmdlIHBhZ2UgKGN1cnJlbnRseSAxNkspIGZvciB0aGUga2VybmVsIHRocmVhZCBzdGFjawor
S1NUQUNLX0xBUkdFX1BBR0UgICAJCW9wdF9nbG9iYWwuaAorCisjCiAjIE9wdGlvbnMgdGhhdCBj
b250cm9sIHRoZSBBdGhlcm9zIFNvQyBwZXJpcGhlcmFscwogIwogQVJHRV9ERUJVRwkJCW9wdF9h
cmdlLmgKZGlmZiAtLWdpdCBhL3N5cy9jb25mL2ZpbGVzLm1pcHMgYi9zeXMvY29uZi9maWxlcy5t
aXBzCi0tLSBhL3N5cy9jb25mL2ZpbGVzLm1pcHMKKysrIGIvc3lzL2NvbmYvZmlsZXMubWlwcwpA
QCAtMzEsNyArMzEsOCBAQAogbWlwcy9taXBzL25leHVzLmMJCQlzdGFuZGFyZAogbWlwcy9taXBz
L29md19tYWNoZGVwLmMJCQlvcHRpb25hbAlmZHQKIG1pcHMvbWlwcy9wbV9tYWNoZGVwLmMJCQlz
dGFuZGFyZAotbWlwcy9taXBzL3BtYXAuYwkJCXN0YW5kYXJkCittaXBzL21pcHMvcG1hcC5jCQkJ
b3B0aW9uYWwJIW1pcHM2NF9uZXdfcG1hcAorbWlwcy9taXBzL3BtYXBfbWlwczY0LmMJCQlvcHRp
b25hbAltaXBzNjRfbmV3X3BtYXAKIG1pcHMvbWlwcy9wdHJhY2VfbWFjaGRlcC5jCQlzdGFuZGFy
ZAogbWlwcy9taXBzL3NjX21hY2hkZXAuYwkJCXN0YW5kYXJkCiBtaXBzL21pcHMvc3RhY2tfbWFj
aGRlcC5jCQlvcHRpb25hbAlkZGIgfCBzdGFjawpkaWZmIC0tZ2l0IGEvbGliL2xpYmt2bS9rdm1f
bWlwcy5oIGIvbGliL2xpYmt2bS9rdm1fbWlwcy5oCi0tLSBhL2xpYi9saWJrdm0va3ZtX21pcHMu
aAorKysgYi9saWIvbGlia3ZtL2t2bV9taXBzLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKICNkZWZpbmUJ
TUlQUzY0X0tTRUcxX0VORAkweGZmZmZmZmZmYmZmZmZmZmYKIAogI2RlZmluZQlNSVBTMzJfUEZO
X01BU0sJCSgweDFGRkZGRkMwKQotI2RlZmluZQlNSVBTNjRfUEZOX01BU0sJCTB4M0ZGRkZGRkMw
CisjZGVmaW5lCU1JUFM2NF9QRk5fTUFTSwkJMHhGRkZGRkZDMAogI2RlZmluZQlNSVBTX1BGTl9T
SElGVAkJKDYpCiAKICNkZWZpbmUJTUlQU19QRk5fVE9fUEEocGZuKQkoKChwZm4pID4+IE1JUFNf
UEZOX1NISUZUKSA8PCBNSVBTX1BBR0VfU0hJRlQpCgo=


--b1_0f329be06464796422fbdb79db4d9952--



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