Updated download dialog patch

artur <[email protected]> Tue, 14 Dec 2010 20:54:13 +0100
Newsgroups gmane.network.freenet.frost.devel
Message-ID <[email protected]>
This is a multi-part message in MIME format.
--------------070101010302050001010502
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Hi,

I have reworked some of the code for the download dialog.

The Dialog should now appear in all places. Plus I have added the 
functionality to rename files, add a prefix and some minor fixes.

I hope you like it.

Cheers

artur

PS: If you wondered why it took me so long to get the next update ready: 
I got injured during a sports accident (I do skydiving) and could not 
use my PC for quite some time. Still haven't regained my full 
flexibility in my right arm...
In the same time I switched my employer and got some catchup to do 
there, and last but not least some other private stuff I had to spend 
time on.
So I hope next year will be better, and I will be able to do some more 
regular work on Frost.


--------------070101010302050001010502
Content-Type: text/plain;
 name="DownloadDialogNew.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="DownloadDialogNew.patch"

DQpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiAuDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpNb2RpZmllZDogc3Zu
Omlnbm9yZQ0KICAgLSAuc2V0dGluZ3MKYnVpbGQKX291dF8KLmdpdAoNCiAgICsgLmdpdAou
c2V0dGluZ3MKX291dF8KYnVpbGQKY29uZmlnCmRvd25sb2FkcwpleGVjCmZyb3N0MC5sb2cK
bG9jYWxkYXRhCnN0b3JlCg0KDQpJbmRleDogc291cmNlL2Zyb3N0L2ZpbGVUcmFuc2Zlci9k
b3dubG9hZC9Eb3dubG9hZE1hbmFnZXIuamF2YQ0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIHNvdXJj
ZS9mcm9zdC9maWxlVHJhbnNmZXIvZG93bmxvYWQvRG93bmxvYWRNYW5hZ2VyLmphdmEJKHJl
dmlzaW9uIDMxOTcpDQorKysgc291cmNlL2Zyb3N0L2ZpbGVUcmFuc2Zlci9kb3dubG9hZC9E
b3dubG9hZE1hbmFnZXIuamF2YQkod29ya2luZyBjb3B5KQ0KQEAgLTE0LDcgKzE0LDcgQEAN
CiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdy
aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNz
IEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKi8KKyAqLwogcGFja2FnZSBmcm9z
dC5maWxlVHJhbnNmZXIuZG93bmxvYWQ7CiAKIGltcG9ydCBqYXZhLmlvLio7CkBAIC0zMyw3
ICszMyw4IEBADQogCiBwdWJsaWMgY2xhc3MgRG93bmxvYWRNYW5hZ2VyIGltcGxlbWVudHMg
RXhpdFNhdmFibGUgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dl
ciA9IExvZ2dlci5nZXRMb2dnZXIoRG93bmxvYWRNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7
CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dn
ZXIoRG93bmxvYWRNYW5hZ2VyLmNsYXNzCisJCQkuZ2V0TmFtZSgpKTsKIAogCXByaXZhdGUg
RG93bmxvYWRNb2RlbCBtb2RlbDsKIAlwcml2YXRlIERvd25sb2FkUGFuZWwgcGFuZWw7CkBA
IC00OCw3ICs0OSw3IEBADQogCX0KIAogCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB0aHJv
d3MgU3RvcmFnZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFBhbmVsKCk7CisJCWdldFBhbmVs
KCk7CiAJCWdldE1vZGVsKCkuaW5pdGlhbGl6ZSgpOwogCX0KIApAQCAtNTYsODYgKzU3LDg5
IEBADQogCSAqIFN0YXJ0IGRvd25sb2FkIG5vdyAobWFudWFsbHkpLgogCSAqLwogCXB1Ymxp
YyBib29sZWFuIHN0YXJ0RG93bmxvYWQoZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVt
KSB7Ci0JICAgIGlmKCBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXRQZXJzaXN0ZW5j
ZU1hbmFnZXIoKSAhPSBudWxsICkgewotCSAgICAgICAgcmV0dXJuIEZpbGVUcmFuc2Zlck1h
bmFnZXIuaW5zdCgpLmdldFBlcnNpc3RlbmNlTWFuYWdlcigpLnN0YXJ0RG93bmxvYWQoZGxJ
dGVtKTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIHJldHVybiB0aWNrZXIuc3RhcnREb3du
bG9hZChkbEl0ZW0pOwotCSAgICB9CisJCWlmIChGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3Qo
KS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKSAhPSBudWxsKSB7CisJCQlyZXR1cm4gRmlsZVRy
YW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkKKwkJCQkJLnN0
YXJ0RG93bmxvYWQoZGxJdGVtKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aWNrZXIuc3Rh
cnREb3dubG9hZChkbEl0ZW0pOworCQl9CiAJfQogCiAJcHVibGljIHZvaWQgc3RhcnRUaWNr
ZXIoKSB7Ci0gICAgICAgIGlmIChDb3JlLmlzRnJlZW5ldE9ubGluZSgpKSB7Ci0gICAgICAg
ICAgICBnZXRUaWNrZXIoKS5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQorCQlpZiAoQ29y
ZS5pc0ZyZWVuZXRPbmxpbmUoKSkgeworCQkJZ2V0VGlja2VyKCkuc3RhcnQoKTsKKwkJfQor
CX0KIAotICAgIHB1YmxpYyB2b2lkIGV4aXRTYXZlKCkgdGhyb3dzIFN0b3JhZ2VFeGNlcHRp
b24gewotICAgICAgICBnZXRQYW5lbCgpLmdldFRhYmxlRm9ybWF0KCkuc2F2ZVRhYmxlTGF5
b3V0KCk7Ci0gICAgICAgIGdldE1vZGVsKCkuZXhpdFNhdmUoKTsKLSAgICB9CisJcHVibGlj
IHZvaWQgZXhpdFNhdmUoKSB0aHJvd3MgU3RvcmFnZUV4Y2VwdGlvbiB7CisJCWdldFBhbmVs
KCkuZ2V0VGFibGVGb3JtYXQoKS5zYXZlVGFibGVMYXlvdXQoKTsKKwkJZ2V0TW9kZWwoKS5l
eGl0U2F2ZSgpOworCX0KIAotICAgIHB1YmxpYyB2b2lkIGFkZFBhbmVsVG9NYWluRnJhbWUo
ZmluYWwgTWFpbkZyYW1lIG1haW5GcmFtZSkgewotICAgICAgICBtYWluRnJhbWUuYWRkUGFu
ZWwoIk1haW5GcmFtZS50YWJiZWRQYW5lLmRvd25sb2FkcyIsIGdldFBhbmVsKCkpOwotICAg
IH0KKwlwdWJsaWMgdm9pZCBhZGRQYW5lbFRvTWFpbkZyYW1lKGZpbmFsIE1haW5GcmFtZSBt
YWluRnJhbWUpIHsKKwkJbWFpbkZyYW1lLmFkZFBhbmVsKCJNYWluRnJhbWUudGFiYmVkUGFu
ZS5kb3dubG9hZHMiLCBnZXRQYW5lbCgpKTsKKwl9CiAKLSAgICAvKioKLSAgICAgKiBDb3Vu
dCBydW5uaW5nIGl0ZW1zIGluIG1vZGVsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVw
ZGF0ZUZpbGVUcmFuc2ZlckluZm9ybWF0aW9uKGZpbmFsIEZpbGVUcmFuc2ZlckluZm9ybWF0
aW9uIGluZm9zKSB7Ci0gICAgICAgIGludCB3YWl0aW5nSXRlbXMgPSAwOwotICAgICAgICBp
bnQgcnVubmluZ0l0ZW1zID0gMDsKLSAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBtb2Rl
bC5nZXRJdGVtQ291bnQoKTsgeCsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBGcm9zdERvd25s
b2FkSXRlbSBkbEl0ZW0gPSAoRnJvc3REb3dubG9hZEl0ZW0pIG1vZGVsLmdldEl0ZW1BdCh4
KTsKLSAgICAgICAgICAgIGlmKCBkbEl0ZW0gPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkbEl0ZW0uZ2V0
U3RhdGUoKSAhPSBGcm9zdERvd25sb2FkSXRlbS5TVEFURV9ET05FCi0gICAgICAgICAgICAg
ICAgICAgICYmIGRsSXRlbS5nZXRTdGF0ZSgpICE9IEZyb3N0RG93bmxvYWRJdGVtLlNUQVRF
X0ZBSUxFRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3YWl0aW5nSXRlbXMr
KzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkbEl0ZW0uZ2V0U3RhdGUoKSA9
PSBGcm9zdERvd25sb2FkSXRlbS5TVEFURV9QUk9HUkVTUykgewotICAgICAgICAgICAgICAg
IHJ1bm5pbmdJdGVtcysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlu
Zm9zLnNldERvd25sb2Fkc1J1bm5pbmcocnVubmluZ0l0ZW1zKTsKLSAgICAgICAgaW5mb3Mu
c2V0RG93bmxvYWRzV2FpdGluZyh3YWl0aW5nSXRlbXMpOwotICAgIH0KKwkvKioKKwkgKiBD
b3VudCBydW5uaW5nIGl0ZW1zIGluIG1vZGVsLgorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0
ZUZpbGVUcmFuc2ZlckluZm9ybWF0aW9uKAorCQkJZmluYWwgRmlsZVRyYW5zZmVySW5mb3Jt
YXRpb24gaW5mb3MpIHsKKwkJaW50IHdhaXRpbmdJdGVtcyA9IDA7CisJCWludCBydW5uaW5n
SXRlbXMgPSAwOworCQlmb3IgKGludCB4ID0gMDsgeCA8IG1vZGVsLmdldEl0ZW1Db3VudCgp
OyB4KyspIHsKKwkJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGRsSXRlbSA9IChGcm9zdERv
d25sb2FkSXRlbSkgbW9kZWwKKwkJCQkJLmdldEl0ZW1BdCh4KTsKKwkJCWlmIChkbEl0ZW0g
PT0gbnVsbCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGRsSXRlbS5nZXRTdGF0
ZSgpICE9IEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX0RPTkUKKwkJCQkJJiYgZGxJdGVtLmdl
dFN0YXRlKCkgIT0gRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfRkFJTEVEKSB7CisJCQkJd2Fp
dGluZ0l0ZW1zKys7CisJCQl9CisJCQlpZiAoZGxJdGVtLmdldFN0YXRlKCkgPT0gRnJvc3RE
b3dubG9hZEl0ZW0uU1RBVEVfUFJPR1JFU1MpIHsKKwkJCQlydW5uaW5nSXRlbXMrKzsKKwkJ
CX0KKwkJfQorCQlpbmZvcy5zZXREb3dubG9hZHNSdW5uaW5nKHJ1bm5pbmdJdGVtcyk7CisJ
CWluZm9zLnNldERvd25sb2Fkc1dhaXRpbmcod2FpdGluZ0l0ZW1zKTsKKwl9CiAKLSAgICAv
KioKLSAgICAgKiBDaGVja3MgaWYgYSBmaWxlIHdpdGggdGhpcyBuYW1lIGlzIGFscmVhZHkg
aW4gbW9kZWwsIGFuZCByZXR1cm5zCi0gICAgICogYSBuZXcgbmFtZSBpZiBuZWVkZWQuCi0g
ICAgICovCi0gICAgcHVibGljIFN0cmluZyBlbnN1cmVVbmlxdWVGaWxlbmFtZShmaW5hbCBT
dHJpbmcgZmlsZW5hbWUpIHsKKwkvKioKKwkgKiBDaGVja3MgaWYgYSBmaWxlIHdpdGggdGhp
cyBuYW1lIGlzIGFscmVhZHkgaW4gbW9kZWwsIGFuZCByZXR1cm5zIGEgbmV3CisJICogbmFt
ZSBpZiBuZWVkZWQuCisJICovCisJcHVibGljIFN0cmluZyBlbnN1cmVVbmlxdWVGaWxlbmFt
ZShmaW5hbCBTdHJpbmcgZmlsZW5hbWUpIHsKIAotICAgICAgICBTdHJpbmcgbmV3RmlsZW5h
bWUgPSBmaWxlbmFtZTsKLSAgICAgICAgaW50IGNvdW50ID0gMjsKKwkJU3RyaW5nIG5ld0Zp
bGVuYW1lID0gZmlsZW5hbWU7CisJCWludCBjb3VudCA9IDI7CiAKLSAgICAgICAgd2hpbGUo
dHJ1ZSkgewotICAgICAgICAgICAgYm9vbGVhbiBsb29wQWdhaW4gPSBmYWxzZTsKLSAgICAg
ICAgICAgIGZvcihpbnQgeD0wOyB4IDwgZ2V0TW9kZWwoKS5nZXRJdGVtQ291bnQoKTsgeCsr
KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtID0g
KEZyb3N0RG93bmxvYWRJdGVtKSBnZXRNb2RlbCgpLmdldEl0ZW1BdCh4KTsKLSAgICAgICAg
ICAgICAgICBpZiggZGxJdGVtLmdldEZpbGVuYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuZXdG
aWxlbmFtZSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvb3BBZ2FpbiA9IHRydWU7Ci0g
ICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBkdXBsaWNhdGUgZmlsZW5hbWUKLSAg
ICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgbmV3IGZpbGVuYW1lIGxpa2UgImZpbGVuYW1l
XzIuZXh0IgotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9zID0gZmlsZW5hbWUu
bGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBvcyA+IDAgKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYmVmb3JlRG90ID0gZmls
ZW5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5h
bCBTdHJpbmcgYWZ0ZXJEb3QgPSBmaWxlbmFtZS5zdWJzdHJpbmcocG9zKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIG5ld0ZpbGVuYW1lID0gYmVmb3JlRG90ICsgIl8iICsgKGNvdW50
KyspICsgYWZ0ZXJEb3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAvLyBubyAnLicgaW4gZmlsZW5hbWUKLSAgICAgICAgICAgICAg
ICAgICAgICAgIG5ld0ZpbGVuYW1lID0gZmlsZW5hbWUgKyAiXyIgKyAoY291bnQrKyk7Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBpZiggIWxvb3BBZ2FpbiApIHsKLSAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3RmlsZW5h
bWU7Ci0gICAgfQorCQl3aGlsZSAodHJ1ZSkgeworCQkJYm9vbGVhbiBsb29wQWdhaW4gPSBm
YWxzZTsKKwkJCWZvciAoaW50IHggPSAwOyB4IDwgZ2V0TW9kZWwoKS5nZXRJdGVtQ291bnQo
KTsgeCsrKSB7CisJCQkJZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtID0gKEZyb3N0
RG93bmxvYWRJdGVtKSBnZXRNb2RlbCgpCisJCQkJCQkuZ2V0SXRlbUF0KHgpOworCQkJCWlm
IChkbEl0ZW0uZ2V0RmlsZW5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5ld0ZpbGVuYW1lKSkg
eworCQkJCQlsb29wQWdhaW4gPSB0cnVlOworCQkJCQkvLyB3ZSBoYXZlIGEgZHVwbGljYXRl
IGZpbGVuYW1lCisJCQkJCS8vIGJ1aWxkIG5ldyBmaWxlbmFtZSBsaWtlICJmaWxlbmFtZV8y
LmV4dCIKKwkJCQkJZmluYWwgaW50IHBvcyA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJyk7
CisJCQkJCWlmIChwb3MgPiAwKSB7CisJCQkJCQlmaW5hbCBTdHJpbmcgYmVmb3JlRG90ID0g
ZmlsZW5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7CisJCQkJCQlmaW5hbCBTdHJpbmcgYWZ0ZXJE
b3QgPSBmaWxlbmFtZS5zdWJzdHJpbmcocG9zKTsKKwkJCQkJCW5ld0ZpbGVuYW1lID0gYmVm
b3JlRG90ICsgIl8iICsgKGNvdW50KyspICsgYWZ0ZXJEb3Q7CisJCQkJCX0gZWxzZSB7CisJ
CQkJCQkvLyBubyAnLicgaW4gZmlsZW5hbWUKKwkJCQkJCW5ld0ZpbGVuYW1lID0gZmlsZW5h
bWUgKyAiXyIgKyAoY291bnQrKyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoIWxv
b3BBZ2FpbikgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBuZXdGaWxlbmFt
ZTsKKwl9CiAKIAlwdWJsaWMgRG93bmxvYWRQYW5lbCBnZXRQYW5lbCgpIHsKIAkJaWYgKHBh
bmVsID09IG51bGwpIHsKQEAgLTE4Miw3ICsxODYsOSBAQA0KIAl9CiAKIAlwdWJsaWMgdm9p
ZCBhZGRSZWNlbnREb3dubG9hZERpcihmaW5hbCBTdHJpbmcgZG93bmxvYWREaXIpIHsKLQkJ
ZmluYWwgU3RyaW5nIGRlZmF1bHREbERpciA9IEZpbGVBY2Nlc3MuYXBwZW5kU2VwYXJhdG9y
KENvcmUuZnJvc3RTZXR0aW5ncy5nZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkRJUl9ET1dOTE9B
RCkpOworCQlmaW5hbCBTdHJpbmcgZGVmYXVsdERsRGlyID0gRmlsZUFjY2VzcworCQkJCS5h
cHBlbmRTZXBhcmF0b3IoQ29yZS5mcm9zdFNldHRpbmdzCisJCQkJCQkuZ2V0VmFsdWUoU2V0
dGluZ3NDbGFzcy5ESVJfRE9XTkxPQUQpKTsKIAkJZmluYWwgU3RyaW5nIGRsRGlyID0gRmls
ZUFjY2Vzcy5hcHBlbmRTZXBhcmF0b3IoZG93bmxvYWREaXIpOwogCQlmaW5hbCBMaXN0SXRl
cmF0b3I8U3RyaW5nPiBpID0gcmVjZW50RG93bmxvYWREaXJzLmxpc3RJdGVyYXRvcigpOwog
CQlib29sZWFuIGZvdW5kID0gZmFsc2U7CkBAIC0yMjAsNDA2ICsyMjYsNDMwIEBADQogCiAJ
LyoqCiAJICogQWRkIGEgbmV3IGRvd25sb2FkIGl0ZW0gdG8gdGhlIGRvd25sb2FkIHRhYmxl
IG1vZGVsLgotCSAqIEBwYXJhbSBrZXkgICAgICAgIGNvbXBsZXRlIGtleSBvZiBkb3dubG9h
ZCBpdGVtCi0JICogQHBhcmFtIGZpbGVOYW1lICAgZmlsZSBuYW1lCisJICogCisJICogQHBh
cmFtIGtleQorCSAqICAgICAgICAgICAgY29tcGxldGUga2V5IG9mIGRvd25sb2FkIGl0ZW0K
KwkgKiBAcGFyYW0gZmlsZU5hbWUKKwkgKiAgICAgICAgICAgIGZpbGUgbmFtZQogCSAqLwot
CXB1YmxpYyBGcm9zdERvd25sb2FkSXRlbSBhZGROZXdEb3dubG9hZChmaW5hbCBTdHJpbmcg
a2V5LCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUsIGZpbmFsIFN0cmluZyBkbERpciwgZmluYWwg
U3RyaW5nIHByZWZpeCkgewotCSAgICAvLyBUT0RPOiBlbmhhbmNlbWVudDogc2VhcmNoIGZv
ciBrZXkgaW4gc2hhcmVkIGZpbGVzLCBtYXliZSBhZGQgYXMgc2hhcmVkIGZpbGUKLSAgICAg
ICAgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtID0gbmV3IEZyb3N0RG93bmxvYWRJ
dGVtKGZpbGVOYW1lLCBrZXkpOworCXB1YmxpYyBGcm9zdERvd25sb2FkSXRlbSBhZGROZXdE
b3dubG9hZChmaW5hbCBTdHJpbmcga2V5LAorCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lLCBm
aW5hbCBTdHJpbmcgZGxEaXIsIGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKKwkJLy8gVE9ETzog
ZW5oYW5jZW1lbnQ6IHNlYXJjaCBmb3Iga2V5IGluIHNoYXJlZCBmaWxlcywgbWF5YmUgYWRk
IGFzCisJCS8vIHNoYXJlZCBmaWxlCisJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGRsSXRl
bSA9IG5ldyBGcm9zdERvd25sb2FkSXRlbShmaWxlTmFtZSwga2V5KTsKIAkJZGxJdGVtLnNl
dERvd25sb2FkRGlyKGRsRGlyKTsKIAkJZGxJdGVtLnNldEZpbGVuYW1lUHJlZml4KHByZWZp
eCk7Ci0gICAgICAgIG1vZGVsLmFkZERvd25sb2FkSXRlbShkbEl0ZW0pOyAvLyBmYWxzZSBp
ZiBmaWxlIGlzIGFscmVhZHkgaW4gdGFibGUKKwkJbW9kZWwuYWRkRG93bmxvYWRJdGVtKGRs
SXRlbSk7IC8vIGZhbHNlIGlmIGZpbGUgaXMgYWxyZWFkeSBpbiB0YWJsZQogCQlyZXR1cm4g
ZGxJdGVtOwogCX0KIAotCXB1YmxpYyBGcm9zdERvd25sb2FkSXRlbSBhZGROZXdEb3dubG9h
ZChmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUsIGZpbmFsIFN0cmlu
ZyBkbERpcikgeworCXB1YmxpYyBGcm9zdERvd25sb2FkSXRlbSBhZGROZXdEb3dubG9hZChm
aW5hbCBTdHJpbmcga2V5LAorCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lLCBmaW5hbCBTdHJp
bmcgZGxEaXIpIHsKIAkJcmV0dXJuIGFkZE5ld0Rvd25sb2FkKGtleSwgZmlsZU5hbWUsIGRs
RGlyLCBudWxsKTsKIAl9CiAKLQlwdWJsaWMgRnJvc3REb3dubG9hZEl0ZW0gYWRkTmV3RG93
bmxvYWQoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgU3RyaW5nIGZpbGVOYW1lKSB7CisJcHVi
bGljIEZyb3N0RG93bmxvYWRJdGVtIGFkZE5ld0Rvd25sb2FkKGZpbmFsIFN0cmluZyBrZXks
CisJCQlmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHsKIAkJcmV0dXJuIGFkZE5ld0Rvd25sb2Fk
KGtleSwgZmlsZU5hbWUsIG51bGwsIG51bGwpOwogCX0KKwkKKwlwdWJsaWMgc3RhdGljIExp
c3Q8RnJvc3REb3dubG9hZEl0ZW0+IHBhcnNlS2V5cyhmaW5hbCBTdHJpbmcgdGV4dCkgewor
CQlMaXN0PEZyb3N0RG93bmxvYWRJdGVtPiBmcm9zdERvd25sb2FkSXRlbUxpc3QgPSBuZXcg
TGlua2VkTGlzdDxGcm9zdERvd25sb2FkSXRlbT4oKTsKKwkJCisJCWZpbmFsIFN0cmluZ1td
IGtleUxpc3QgPSB0ZXh0LnRyaW0oKS5zcGxpdCgiWztcbl0iKTsKKwkJaWYgKGtleUxpc3Qg
PT0gbnVsbCB8fCBrZXlMaXN0Lmxlbmd0aCA9PSAwKSB7CisJCQlyZXR1cm4gZnJvc3REb3du
bG9hZEl0ZW1MaXN0OworCQl9CiAKLQlwdWJsaWMgdm9pZCBhZGRLZXlzKGZpbmFsIFN0cmlu
ZyB0ZXh0LCBmaW5hbCBTdHJpbmcgZGxEaXIsIGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLQkJ
dHJ5IHsKLQkJCWZpbmFsIFN0cmluZyBrZXlzID0gdGV4dC50cmltKCk7CisJCWZvciAoZmlu
YWwgU3RyaW5nIGVsZW1lbnQgOiBrZXlMaXN0KSB7CisJCQlTdHJpbmcga2V5ID0gZWxlbWVu
dC50cmltKCk7CiAKLQkJCWZpbmFsIFN0cmluZ1tdIGtleUxpc3QgPSBrZXlzLnNwbGl0KCJb
O1xuXSIpOwotCQkJaWYoIGtleUxpc3QgPT0gbnVsbCB8fCBrZXlMaXN0Lmxlbmd0aCA9PSAw
ICkgewotCQkJCXJldHVybjsKKwkJCWlmIChrZXkubGVuZ3RoKCkgPCA1KSB7CisJCQkJY29u
dGludWU7CiAJCQl9CiAKLQkJCWZvciggZmluYWwgU3RyaW5nIGVsZW1lbnQgOiBrZXlMaXN0
ICkgewotCQkJCVN0cmluZyBrZXkgPSBlbGVtZW50LnRyaW0oKTsKLQotCQkJCWlmKCBrZXku
bGVuZ3RoKCkgPCA1ICkgewotCQkJCQljb250aW51ZTsKKwkJCS8vIG1heWJlIGNvbnZlcnQg
aHRtbCBjb2RlcyAoZS5nLiAlMmMgLT4gLCApCisJCQlpZiAoa2V5LmluZGV4T2YoIiUiKSA+
IDApIHsKKwkJCQl0cnkgeworCQkJCQlrZXkgPSBqYXZhLm5ldC5VUkxEZWNvZGVyLmRlY29k
ZShrZXksICJVVEYtOCIpOworCQkJCX0gY2F0Y2ggKGZpbmFsIGphdmEuaW8uVW5zdXBwb3J0
ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworCQkJCQlsb2dnZXIubG9nKExldmVsLlNFVkVS
RSwgIkRlY29kZSBvZiBIVE1MIGNvZGUgZmFpbGVkIiwgZXgpOwogCQkJCX0KKwkJCX0KIAot
CQkJCS8vIG1heWJlIGNvbnZlcnQgaHRtbCBjb2RlcyAoZS5nLiAlMmMgLT4gLCApCi0JCQkJ
aWYoIGtleS5pbmRleE9mKCIlIikgPiAwICkgewotCQkJCQl0cnkgewotCQkJCQkJa2V5ID0g
amF2YS5uZXQuVVJMRGVjb2Rlci5kZWNvZGUoa2V5LCAiVVRGLTgiKTsKLQkJCQkJfSBjYXRj
aCAoZmluYWwgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0J
CQkJCQlsb2dnZXIubG9nKExldmVsLlNFVkVSRSwgIkRlY29kZSBvZiBIVE1MIGNvZGUgZmFp
bGVkIiwgZXgpOwotCQkJCQl9CisJCQkvLyBmaW5kIGtleSB0eXBlIChjaGssc3NrLC4uLikK
KwkJCWludCBwb3MgPSAtMTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgRnJlZW5ldEtleXMu
Z2V0RnJlZW5ldEtleVR5cGVzKCkubGVuZ3RoOyBpKyspIHsKKwkJCQlmaW5hbCBTdHJpbmcg
c3RyaW5nID0gRnJlZW5ldEtleXMuZ2V0RnJlZW5ldEtleVR5cGVzKClbaV07CisJCQkJcG9z
ID0ga2V5LmluZGV4T2Yoc3RyaW5nKTsKKwkJCQlpZiAocG9zID49IDApIHsKKwkJCQkJYnJl
YWs7CiAJCQkJfQorCQkJfQorCQkJaWYgKHBvcyA8IDApIHsKKwkJCQkvLyBubyB2YWxpZCBr
ZXl0eXBlIGZvdW5kCisJCQkJY29udGludWU7CisJCQl9CiAKLQkJCQkvLyBmaW5kIGtleSB0
eXBlIChjaGssc3NrLC4uLikKLQkJCQlpbnQgcG9zID0gLTE7Ci0JCQkJZm9yKCBpbnQgaSA9
IDA7IGkgPCBGcmVlbmV0S2V5cy5nZXRGcmVlbmV0S2V5VHlwZXMoKS5sZW5ndGg7IGkrKyAp
IHsKLQkJCQkJZmluYWwgU3RyaW5nIHN0cmluZyA9IEZyZWVuZXRLZXlzLmdldEZyZWVuZXRL
ZXlUeXBlcygpW2ldOwotCQkJCQlwb3MgPSBrZXkuaW5kZXhPZihzdHJpbmcpOwotCQkJCQlp
ZiggcG9zID49IDAgKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZigg
cG9zIDwgMCApIHsKLQkJCQkJLy8gbm8gdmFsaWQga2V5dHlwZSBmb3VuZAotCQkJCQkvL3No
b3dJbnZhbGlkS2V5RXJyb3JEaWFsb2coa2V5KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQor
CQkJLy8gc3RyaXAgYWxsIGJlZm9yZSBrZXkgdHlwZQorCQkJaWYgKHBvcyA+IDApIHsKKwkJ
CQlrZXkgPSBrZXkuc3Vic3RyaW5nKHBvcyk7CisJCQl9CiAKLQkJCQkvLyBzdHJpcCBhbGwg
YmVmb3JlIGtleSB0eXBlCi0JCQkJaWYoIHBvcyA+IDAgKSB7Ci0JCQkJCWtleSA9IGtleS5z
dWJzdHJpbmcocG9zKTsKLQkJCQl9CisJCQlpZiAoa2V5Lmxlbmd0aCgpIDwgNSkgeworCQkJ
CS8vIGF0IGxlYXN0IHRoZSBTU0tAPyBpcyBuZWVkZWQKKwkJCQljb250aW51ZTsKKwkJCX0K
IAotCQkJCWlmKCBrZXkubGVuZ3RoKCkgPCA1ICkgewotCQkJCQkvLyBhdCBsZWFzdCB0aGUg
U1NLQD8gaXMgbmVlZGVkCi0JCQkJCS8vc2hvd0ludmFsaWRLZXlFcnJvckRpYWxvZyhrZXkp
OwotCQkJCQljb250aW51ZTsKLQkJCQl9CisJCQkvLyB0YWtlIHRoZSBmaWxlbmFtZSBmcm9t
IHRoZSBsYXN0IHBhcnQgb2YgdGhlIGtleQorCQkJU3RyaW5nIGZpbGVOYW1lOworCQkJZmlu
YWwgaW50IHNlcEluZGV4ID0ga2V5Lmxhc3RJbmRleE9mKCIvIik7CisJCQlpZiAoc2VwSW5k
ZXggPiAtMSkgeworCQkJCWZpbGVOYW1lID0ga2V5LnN1YnN0cmluZyhzZXBJbmRleCArIDEp
OworCQkJfSBlbHNlIHsKKwkJCQkvLyBmYWxsYmFjazogdXNlIGtleSBhcyBmaWxlbmFtZQor
CQkJCWZpbGVOYW1lID0ga2V5LnN1YnN0cmluZyg0KTsKKwkJCX0KIAotCQkJCS8vIHRha2Ug
dGhlIGZpbGVuYW1lIGZyb20gdGhlIGxhc3QgcGFydCBvZiB0aGUga2V5Ci0JCQkJU3RyaW5n
IGZpbGVOYW1lOwotCQkJCWZpbmFsIGludCBzZXBJbmRleCA9IGtleS5sYXN0SW5kZXhPZigi
LyIpOwotCQkJCWlmICggc2VwSW5kZXggPiAtMSApIHsKLQkJCQkJZmlsZU5hbWUgPSBrZXku
c3Vic3RyaW5nKHNlcEluZGV4ICsgMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZmFsbGJh
Y2s6IHVzZSBrZXkgYXMgZmlsZW5hbWUKLQkJCQkJZmlsZU5hbWUgPSBrZXkuc3Vic3RyaW5n
KDQpOwotCQkJCX0KKwkJCVN0cmluZyBjaGVja0tleSA9IGtleTsKKwkJCS8vIHJlbW92ZSBm
aWxlbmFtZSBmcm9tIENISyBrZXkKKwkJCWlmIChrZXkuc3RhcnRzV2l0aCgiQ0hLQCIpICYm
IGtleS5pbmRleE9mKCIvIikgPiAtMSkgeworCQkJCWNoZWNrS2V5ID0ga2V5LnN1YnN0cmlu
ZygwLCBrZXkuaW5kZXhPZigiLyIpKTsKKwkJCX0KIAotCQkJCVN0cmluZyBjaGVja0tleSA9
IGtleTsKLQkJCQkvLyByZW1vdmUgZmlsZW5hbWUgZnJvbSBDSEsga2V5Ci0JCQkJaWYgKGtl
eS5zdGFydHNXaXRoKCJDSEtAIikgJiYga2V5LmluZGV4T2YoIi8iKSA+IC0xICkgewotCQkJ
CQljaGVja0tleSA9IGtleS5zdWJzdHJpbmcoMCwga2V5LmluZGV4T2YoIi8iKSk7Ci0JCQkJ
fQorCQkJLy8gT24gMC43IHdlIHJlbWVtYmVyIHRoZSBmdWxsIHByb3ZpZGVkIGRvd25sb2Fk
IHVyaSBhcyBrZXkuCisJCQkvLyBJZiB0aGUgbm9kZSByZXBvcnRzIGRvd25sb2FkIGZhaWxl
ZCwgZXJyb3IgY29kZSAxMSBsYXRlciwKKwkJCS8vIHRoZW4gd2Ugc3RyaXAgdGhlIGZpbGVu
YW1lCisJCQkvLyBmcm9tIHRoZSB1cmkgYW5kIGtlZXAgdHJ5aW5nIHdpdGggY2hrIG9ubHkK
IAotCQkJCS8vIE9uIDAuNyB3ZSByZW1lbWJlciB0aGUgZnVsbCBwcm92aWRlZCBkb3dubG9h
ZCB1cmkgYXMga2V5LgotCQkJCS8vIElmIHRoZSBub2RlIHJlcG9ydHMgZG93bmxvYWQgZmFp
bGVkLCBlcnJvciBjb2RlIDExIGxhdGVyLCB0aGVuIHdlIHN0cmlwIHRoZSBmaWxlbmFtZQot
CQkJCS8vIGZyb20gdGhlIHVyaSBhbmQga2VlcCB0cnlpbmcgd2l0aCBjaGsgb25seQorCQkJ
Ly8gZmluYWxseSBjaGVjayBpZiB0aGUga2V5IGlzIHZhbGlkIGZvciB0aGlzIG5ldHdvcmsK
KwkJCWlmICghRnJlZW5ldEtleXMuaXNWYWxpZEtleShjaGVja0tleSkpIHsKKwkJCQkvLyBz
aG93SW52YWxpZEtleUVycm9yRGlhbG9nKGtleSk7CisJCQkJY29udGludWU7CisJCQl9CiAK
LQkJCQkvLyBmaW5hbGx5IGNoZWNrIGlmIHRoZSBrZXkgaXMgdmFsaWQgZm9yIHRoaXMgbmV0
d29yawotCQkJCWlmKCAhRnJlZW5ldEtleXMuaXNWYWxpZEtleShjaGVja0tleSkgKSB7Ci0J
CQkJCS8vc2hvd0ludmFsaWRLZXlFcnJvckRpYWxvZyhrZXkpOwotCQkJCQljb250aW51ZTsK
LQkJCQl9Ci0KLQkJCQkvLyBhZGQgdmFsaWQga2V5IHRvIGRvd25sb2FkIHRhYmxlCi0JCQkJ
ZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtID0gYWRkTmV3RG93bmxvYWQoa2V5LCBm
aWxlTmFtZSwgZGxEaXIpOwotCi0JCQkJZGxJdGVtLnNldEZpbGVuYW1lUHJlZml4KHByZWZp
eCk7Ci0KLQkJCQlmaW5hbCBGcm9zdE1lc3NhZ2VPYmplY3QgbXNnID0gTWFpbkZyYW1lLmdl
dEluc3RhbmNlKCkuZ2V0TWVzc2FnZVBhbmVsKCkuZ2V0U2VsZWN0ZWRNZXNzYWdlKCk7Ci0J
CQkJaWYgKG1zZyAhPSBudWxsICYmICFtc2cuaXNEdW1teSgpKSB7Ci0JCQkJCWRsSXRlbS5h
c3NvY2lhdGVXaXRoRnJvc3RNZXNzYWdlT2JqZWN0KG1zZyk7Ci0JCQkJfQotCQkJfQotCQl9
IGNhdGNoKGZpbmFsIFRocm93YWJsZSBleCkgewotCQkJbG9nZ2VyLmxvZyhMZXZlbC5TRVZF
UkUsICJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGV4KTsKLQkJCS8vc2hvd0ludmFsaWRLZXlF
cnJvckRpYWxvZygiPz8/Iik7CisJCQkvLyBhZGQgdmFsaWQga2V5IHRvIGRvd25sb2FkIHRh
YmxlCisJCQlmcm9zdERvd25sb2FkSXRlbUxpc3QuYWRkKCBuZXcgRnJvc3REb3dubG9hZEl0
ZW0oZmlsZU5hbWUsIGtleSkpOwogCQl9CisJCXJldHVybiBmcm9zdERvd25sb2FkSXRlbUxp
c3Q7CiAJfQorCQogCi0JcHVibGljIHZvaWQgYWRkS2V5cyhmaW5hbCBTdHJpbmcgdGV4dCwg
ZmluYWwgU3RyaW5nIGRsRGlyKSB7Ci0JCWFkZEtleXModGV4dCwgZGxEaXIsIG51bGwpOwot
CX0KKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgcmVxdWVzdCBzaG91bGQgYmUgcmV0cmll
ZAorCSAqLworCXB1YmxpYyBib29sZWFuIG5vdGlmeURvd25sb2FkRmluaXNoZWQoZmluYWwg
RnJvc3REb3dubG9hZEl0ZW0gZG93bmxvYWRJdGVtLAorCQkJZmluYWwgRmNwUmVzdWx0R2V0
IHJlc3VsdCwgZmluYWwgRmlsZSB0YXJnZXRGaWxlKSB7CiAKLQlwdWJsaWMgdm9pZCBhZGRL
ZXlzKGZpbmFsIFN0cmluZyB0ZXh0KSB7Ci0JCWFkZEtleXModGV4dCwgbnVsbCwgbnVsbCk7
Ci0JfQorCQlmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSBkb3dubG9hZEl0ZW0uZ2V0RmlsZW5h
bWUoKTsKKwkJZmluYWwgU3RyaW5nIGtleSA9IGRvd25sb2FkSXRlbS5nZXRLZXkoKTsKIAot
ICAgIC8qKgotICAgICAqIEByZXR1cm4gIHRydWUgaWYgcmVxdWVzdCBzaG91bGQgYmUgcmV0
cmllZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG5vdGlmeURvd25sb2FkRmluaXNo
ZWQoZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZG93bmxvYWRJdGVtLCBmaW5hbCBGY3BSZXN1
bHRHZXQgcmVzdWx0LCBmaW5hbCBGaWxlIHRhcmdldEZpbGUpIHsKKwkJYm9vbGVhbiByZXRy
eUltbWVkaWF0ZWx5ID0gZmFsc2U7CiAKLSAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVuYW1l
ID0gZG93bmxvYWRJdGVtLmdldEZpbGVuYW1lKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBr
ZXkgPSBkb3dubG9hZEl0ZW0uZ2V0S2V5KCk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCBy
ZXN1bHQuaXNTdWNjZXNzKCkgPT0gZmFsc2UpIHsKKwkJCS8vIGRvd25sb2FkIGZhaWxlZAog
Ci0gICAgICAgIGJvb2xlYW4gcmV0cnlJbW1lZGlhdGVseSA9IGZhbHNlOworCQkJaWYgKHJl
c3VsdCAhPSBudWxsKSB7CisJCQkJZG93bmxvYWRJdGVtLnNldEVycm9yQ29kZURlc2NyaXB0
aW9uKHJlc3VsdAorCQkJCQkJLmdldENvZGVEZXNjcmlwdGlvbigpKTsKKwkJCX0KIAotICAg
ICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzU3VjY2VzcygpID09IGZhbHNl
KSB7Ci0gICAgICAgICAgICAvLyBkb3dubG9hZCBmYWlsZWQKKwkJCWlmIChyZXN1bHQgIT0g
bnVsbCAmJiByZXN1bHQuZ2V0UmV0dXJuQ29kZSgpID09IDUKKwkJCQkJJiYga2V5LnN0YXJ0
c1dpdGgoIkNIS0AiKSAmJiBrZXkuaW5kZXhPZigiLyIpID4gMCkgeworCQkJCS8vIDUgLSBB
cmNoaXZlIGZhaWx1cmUKKwkJCQkvLyBub2RlIHRyaWVzIHRvIGFjY2VzcyB0aGUgZmlsZSBh
cyBhIC56aXAgZmlsZSwgdHJ5IGRvd25sb2FkCisJCQkJLy8gYWdhaW4gd2l0aG91dCBhbnkg
cGF0aAorCQkJCWZpbmFsIFN0cmluZyBuZXdLZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5p
bmRleE9mKCIvIikpOworCQkJCWRvd25sb2FkSXRlbS5zZXRLZXkobmV3S2V5KTsKKwkJCQlk
b3dubG9hZEl0ZW0uc2V0U3RhdGUoRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfV0FJVElORyk7
CisJCQkJZG93bmxvYWRJdGVtLnNldExhc3REb3dubG9hZFN0b3BUaW1lKDApOworCQkJCWRv
d25sb2FkSXRlbS5zZXRJbnRlcm5hbFJlbW92ZUV4cGVjdGVkKHRydWUpOworCQkJCXJldHJ5
SW1tZWRpYXRlbHkgPSB0cnVlOwogCi0gICAgICAgICAgICBpZiggcmVzdWx0ICE9IG51bGwg
KSB7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldEVycm9yQ29kZURlc2NyaXB0
aW9uKHJlc3VsdC5nZXRDb2RlRGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICB9CisJCQkJ
bG9nZ2VyLndhcm5pbmcoIlJlbW92ZWQgYWxsIHBhdGggbGV2ZWxzIGZyb20ga2V5OiAiICsg
a2V5CisJCQkJCQkrICIgOyAiICsgbmV3S2V5KTsKIAotICAgICAgICAgICAgaWYoIHJlc3Vs
dCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdC5nZXRSZXR1cm5Db2Rl
KCkgPT0gNQotICAgICAgICAgICAgICAgICAgICAmJiBrZXkuc3RhcnRzV2l0aCgiQ0hLQCIp
Ci0gICAgICAgICAgICAgICAgICAgICYmIGtleS5pbmRleE9mKCIvIikgPiAwICkKLSAgICAg
ICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyA1IC0gQXJjaGl2ZSBmYWlsdXJlCi0gICAg
ICAgICAgICAgICAgLy8gbm9kZSB0cmllcyB0byBhY2Nlc3MgdGhlIGZpbGUgYXMgYSAuemlw
IGZpbGUsIHRyeSBkb3dubG9hZCBhZ2FpbiB3aXRob3V0IGFueSBwYXRoCi0gICAgICAgICAg
ICAgICAgZmluYWwgU3RyaW5nIG5ld0tleSA9IGtleS5zdWJzdHJpbmcoMCwga2V5LmluZGV4
T2YoIi8iKSk7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldEtleShuZXdLZXkp
OwotICAgICAgICAgICAgICAgIGRvd25sb2FkSXRlbS5zZXRTdGF0ZShGcm9zdERvd25sb2Fk
SXRlbS5TVEFURV9XQUlUSU5HKTsKLSAgICAgICAgICAgICAgICBkb3dubG9hZEl0ZW0uc2V0
TGFzdERvd25sb2FkU3RvcFRpbWUoMCk7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVt
LnNldEludGVybmFsUmVtb3ZlRXhwZWN0ZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0
cnlJbW1lZGlhdGVseSA9IHRydWU7CisJCQl9IGVsc2UgaWYgKHJlc3VsdCAhPSBudWxsICYm
IHJlc3VsdC5nZXRSZXR1cm5Db2RlKCkgPT0gMTEKKwkJCQkJJiYga2V5LnN0YXJ0c1dpdGgo
IkNIS0AiKSAmJiBrZXkuaW5kZXhPZigiLyIpID4gMCkgeworCQkJCS8vIDExIC0gVGhlIFVS
SSBoYXMgbW9yZSBtZXRhc3RyaW5ncyBhbmQgSSBjYW4ndCBkZWFsIHdpdGggdGhlbQorCQkJ
CS8vIHJlbW92ZSBvbmUgcGF0aCBsZXZlbCBmcm9tIENISworCQkJCWZpbmFsIFN0cmluZyBu
ZXdLZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5sYXN0SW5kZXhPZigiLyIpKTsKKwkJCQlk
b3dubG9hZEl0ZW0uc2V0S2V5KG5ld0tleSk7CisJCQkJZG93bmxvYWRJdGVtLnNldFN0YXRl
KEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX1dBSVRJTkcpOworCQkJCWRvd25sb2FkSXRlbS5z
ZXRMYXN0RG93bmxvYWRTdG9wVGltZSgwKTsKKwkJCQlkb3dubG9hZEl0ZW0uc2V0SW50ZXJu
YWxSZW1vdmVFeHBlY3RlZCh0cnVlKTsKKwkJCQlyZXRyeUltbWVkaWF0ZWx5ID0gdHJ1ZTsK
IAotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJSZW1vdmVkIGFsbCBwYXRoIGxl
dmVscyBmcm9tIGtleTogIitrZXkrIiA7ICIrbmV3S2V5KTsKKwkJCQlsb2dnZXIud2Fybmlu
ZygiUmVtb3ZlZCBvbmUgcGF0aCBsZXZlbCBmcm9tIGtleTogIiArIGtleQorCQkJCQkJKyAi
IDsgIiArIG5ld0tleSk7CiAKLSAgICAgICAgICAgIH0gZWxzZSBpZiggcmVzdWx0ICE9IG51
bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgcmVzdWx0LmdldFJldHVybkNvZGUoKSA9PSAx
MQotICAgICAgICAgICAgICAgICAgICAmJiBrZXkuc3RhcnRzV2l0aCgiQ0hLQCIpCi0gICAg
ICAgICAgICAgICAgICAgICYmIGtleS5pbmRleE9mKCIvIikgPiAwICkKLSAgICAgICAgICAg
IHsKLSAgICAgICAgICAgICAgICAvLyAxMSAtIFRoZSBVUkkgaGFzIG1vcmUgbWV0YXN0cmlu
Z3MgYW5kIEkgY2FuJ3QgZGVhbCB3aXRoIHRoZW0KLSAgICAgICAgICAgICAgICAvLyByZW1v
dmUgb25lIHBhdGggbGV2ZWwgZnJvbSBDSEsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJp
bmcgbmV3S2V5ID0ga2V5LnN1YnN0cmluZygwLCBrZXkubGFzdEluZGV4T2YoIi8iKSk7Ci0g
ICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldEtleShuZXdLZXkpOwotICAgICAgICAg
ICAgICAgIGRvd25sb2FkSXRlbS5zZXRTdGF0ZShGcm9zdERvd25sb2FkSXRlbS5TVEFURV9X
QUlUSU5HKTsKLSAgICAgICAgICAgICAgICBkb3dubG9hZEl0ZW0uc2V0TGFzdERvd25sb2Fk
U3RvcFRpbWUoMCk7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldEludGVybmFs
UmVtb3ZlRXhwZWN0ZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0cnlJbW1lZGlhdGVs
eSA9IHRydWU7CisJCQl9IGVsc2UgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5nZXRS
ZXR1cm5Db2RlKCkgPT0gMjcKKwkJCQkJJiYgcmVzdWx0LmdldFJlZGlyZWN0VVJJKCkgIT0g
bnVsbCkgeworCQkJCS8vIHBlcm1hbmVudCByZWRpcmVjdCwgdXNlIG5ldyB1cmkKKwkJCQlk
b3dubG9hZEl0ZW0uc2V0S2V5KHJlc3VsdC5nZXRSZWRpcmVjdFVSSSgpKTsKKwkJCQlkb3du
bG9hZEl0ZW0uc2V0U3RhdGUoRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfV0FJVElORyk7CisJ
CQkJZG93bmxvYWRJdGVtLnNldEludGVybmFsUmVtb3ZlRXhwZWN0ZWQodHJ1ZSk7CisJCQkJ
cmV0cnlJbW1lZGlhdGVseSA9IHRydWU7CiAKLSAgICAgICAgICAgICAgICBsb2dnZXIud2Fy
bmluZygiUmVtb3ZlZCBvbmUgcGF0aCBsZXZlbCBmcm9tIGtleTogIitrZXkrIiA7ICIrbmV3
S2V5KTsKKwkJCQlsb2dnZXIud2FybmluZygiUmVkaXJlY3RlZCB0byBVUkk6ICIgKyByZXN1
bHQuZ2V0UmVkaXJlY3RVUkkoKSk7CiAKLSAgICAgICAgICAgIH0gZWxzZSBpZiggcmVzdWx0
ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdC5nZXRSZXR1cm5D
b2RlKCkgPT0gMjcKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdC5nZXRSZWRp
cmVjdFVSSSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8g
cGVybWFuZW50IHJlZGlyZWN0LCB1c2UgbmV3IHVyaQotICAgICAgICAgICAgICAgIGRvd25s
b2FkSXRlbS5zZXRLZXkocmVzdWx0LmdldFJlZGlyZWN0VVJJKCkpOwotICAgICAgICAgICAg
ICAgIGRvd25sb2FkSXRlbS5zZXRTdGF0ZShGcm9zdERvd25sb2FkSXRlbS5TVEFURV9XQUlU
SU5HKTsKLSAgICAgICAgICAgICAgICBkb3dubG9hZEl0ZW0uc2V0SW50ZXJuYWxSZW1vdmVF
eHBlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICByZXRyeUltbWVkaWF0ZWx5ID0gdHJ1
ZTsKKwkJCX0gZWxzZSBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmlzRmF0YWwoKSkg
eworCQkJCS8vIGZhdGFsLCBkb24ndCByZXRyeQorCQkJCS8vIGRvd25sb2FkSXRlbS5zZXRF
bmFibGVkKEJvb2xlYW4uRkFMU0UpOyAvLyBrZWVwIGVuYWJsZWQgdG8KKwkJCQkvLyBhbGxv
dyBzZW5kaW5nIG9mIHJlcXVlc3RzIGZvciBzaGFyZWQgZmlsZXMKKwkJCQlkb3dubG9hZEl0
ZW0uc2V0U3RhdGUoRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfRkFJTEVEKTsKKwkJCQlsb2dn
ZXIud2FybmluZygiRklMRUROOiBEb3dubG9hZCBvZiAiICsgZmlsZW5hbWUKKwkJCQkJCSsg
IiBmYWlsZWQgRkFUQUxMWS4iKTsKKwkJCX0gZWxzZSB7CisJCQkJZG93bmxvYWRJdGVtLnNl
dFJldHJpZXMoZG93bmxvYWRJdGVtLmdldFJldHJpZXMoKSArIDEpOwogCi0gICAgICAgICAg
ICAgICAgbG9nZ2VyLndhcm5pbmcoIlJlZGlyZWN0ZWQgdG8gVVJJOiAiK3Jlc3VsdC5nZXRS
ZWRpcmVjdFVSSSgpKTsKKwkJCQlsb2dnZXIud2FybmluZygiRklMRUROOiBEb3dubG9hZCBv
ZiAiICsgZmlsZW5hbWUgKyAiIGZhaWxlZC4iKTsKKwkJCQkvLyBzZXQgbmV3IHN0YXRlIC0+
IGZhaWxlZCBvciB3YWl0aW5nIGZvciBhbm90aGVyIHRyeQorCQkJCWlmIChkb3dubG9hZEl0
ZW0uZ2V0UmV0cmllcygpID4gQ29yZS5mcm9zdFNldHRpbmdzCisJCQkJCQkuZ2V0SW50VmFs
dWUoU2V0dGluZ3NDbGFzcy5ET1dOTE9BRF9NQVhfUkVUUklFUykpIHsKKwkJCQkJLy8gZG93
bmxvYWRJdGVtLnNldEVuYWJsZWQoQm9vbGVhbi52YWx1ZU9mKGZhbHNlKSk7IC8vIGtlZXAK
KwkJCQkJLy8gZW5hYmxlZCB0byBhbGxvdyBzZW5kaW5nIG9mIHJlcXVlc3RzIGZvciBzaGFy
ZWQgZmlsZXMKKwkJCQkJZG93bmxvYWRJdGVtLnNldFN0YXRlKEZyb3N0RG93bmxvYWRJdGVt
LlNUQVRFX0ZBSUxFRCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZG93bmxvYWRJdGVtLnNldFN0
YXRlKEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX1dBSVRJTkcpOworCQkJCX0KKwkJCX0KKwkJ
fSBlbHNlIHsKIAotICAgICAgICAgICAgfSBlbHNlIGlmKCByZXN1bHQgIT0gbnVsbCAmJiBy
ZXN1bHQuaXNGYXRhbCgpICkgewotICAgICAgICAgICAgICAgIC8vIGZhdGFsLCBkb24ndCBy
ZXRyeQotLy8gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldEVuYWJsZWQoQm9vbGVh
bi5GQUxTRSk7ICAvLyBrZWVwIGVuYWJsZWQgdG8gYWxsb3cgc2VuZGluZyBvZiByZXF1ZXN0
cyBmb3Igc2hhcmVkIGZpbGVzCi0gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldFN0
YXRlKEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX0ZBSUxFRCk7Ci0gICAgICAgICAgICAgICAg
bG9nZ2VyLndhcm5pbmcoIkZJTEVETjogRG93bmxvYWQgb2YgIiArIGZpbGVuYW1lICsgIiBm
YWlsZWQgRkFUQUxMWS4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgZG93bmxvYWRJdGVtLnNldFJldHJpZXMoZG93bmxvYWRJdGVtLmdldFJldHJpZXMoKSAr
IDEpOworCQkJbG9nZ2VyLmluZm8oIkZJTEVETjogRG93bmxvYWQgb2YgIiArIGZpbGVuYW1l
ICsgIiB3YXMgc3VjY2Vzc2Z1bC4iKTsKIAotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJu
aW5nKCJGSUxFRE46IERvd25sb2FkIG9mICIgKyBmaWxlbmFtZSArICIgZmFpbGVkLiIpOwot
ICAgICAgICAgICAgICAgIC8vIHNldCBuZXcgc3RhdGUgLT4gZmFpbGVkIG9yIHdhaXRpbmcg
Zm9yIGFub3RoZXIgdHJ5Ci0gICAgICAgICAgICAgICAgaWYgKGRvd25sb2FkSXRlbS5nZXRS
ZXRyaWVzKCkgPiBDb3JlLmZyb3N0U2V0dGluZ3MuZ2V0SW50VmFsdWUoU2V0dGluZ3NDbGFz
cy5ET1dOTE9BRF9NQVhfUkVUUklFUykpIHsKLS8vICAgICAgICAgICAgICAgICAgICBkb3du
bG9hZEl0ZW0uc2V0RW5hYmxlZChCb29sZWFuLnZhbHVlT2YoZmFsc2UpKTsgLy8ga2VlcCBl
bmFibGVkIHRvIGFsbG93IHNlbmRpbmcgb2YgcmVxdWVzdHMgZm9yIHNoYXJlZCBmaWxlcwot
ICAgICAgICAgICAgICAgICAgICBkb3dubG9hZEl0ZW0uc2V0U3RhdGUoRnJvc3REb3dubG9h
ZEl0ZW0uU1RBVEVfRkFJTEVEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICBkb3dubG9hZEl0ZW0uc2V0U3RhdGUoRnJvc3REb3dubG9hZEl0ZW0u
U1RBVEVfV0FJVElORyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAg
ICAgICB9IGVsc2UgeworCQkJLy8gZG93bmxvYWQgc3VjY2Vzc2Z1bAorCQkJZG93bmxvYWRJ
dGVtLnNldEZpbGVTaXplKG5ldyBMb25nKHRhcmdldEZpbGUubGVuZ3RoKCkpKTsKKwkJCWRv
d25sb2FkSXRlbS5zZXRTdGF0ZShGcm9zdERvd25sb2FkSXRlbS5TVEFURV9ET05FKTsKKwkJ
CWRvd25sb2FkSXRlbS5zZXRFbmFibGVkKEJvb2xlYW4udmFsdWVPZihmYWxzZSkpOwogCi0g
ICAgICAgICAgICBsb2dnZXIuaW5mbygiRklMRUROOiBEb3dubG9hZCBvZiAiICsgZmlsZW5h
bWUgKyAiIHdhcyBzdWNjZXNzZnVsLiIpOworCQkJZG93bmxvYWRJdGVtLnNldERvd25sb2Fk
RmluaXNoZWRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKIAotICAgICAgICAg
ICAgLy8gZG93bmxvYWQgc3VjY2Vzc2Z1bAotICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNl
dEZpbGVTaXplKG5ldyBMb25nKHRhcmdldEZpbGUubGVuZ3RoKCkpKTsKLSAgICAgICAgICAg
IGRvd25sb2FkSXRlbS5zZXRTdGF0ZShGcm9zdERvd25sb2FkSXRlbS5TVEFURV9ET05FKTsK
LSAgICAgICAgICAgIGRvd25sb2FkSXRlbS5zZXRFbmFibGVkKEJvb2xlYW4udmFsdWVPZihm
YWxzZSkpOworCQkJLy8gdXBkYXRlIGxhc3REb3dubG9hZGVkIHRpbWUgaW4gZmlsZWxpc3QK
KwkJCWlmIChkb3dubG9hZEl0ZW0uaXNTaGFyZWRGaWxlKCkpIHsKKwkJCQlGaWxlTGlzdFN0
b3JhZ2UuaW5zdCgpCisJCQkJCQkudXBkYXRlRnJvc3RGaWxlTGlzdEZpbGVPYmplY3RBZnRl
ckRvd25sb2FkKAorCQkJCQkJCQlkb3dubG9hZEl0ZW0uZ2V0RmlsZUxpc3RGaWxlT2JqZWN0
KCkuZ2V0U2hhKCksCisJCQkJCQkJCVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKwkJ
CX0KIAotICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldERvd25sb2FkRmluaXNoZWRUaW1l
KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKwkJCS8vIG1heWJlIHRyYWNrIGRvd25s
b2FkCisJCQlpZiAoQ29yZS5mcm9zdFNldHRpbmdzCisJCQkJCS5nZXRCb29sVmFsdWUoU2V0
dGluZ3NDbGFzcy5UUkFDS19ET1dOTE9BRFNfRU5BQkxFRCkKKwkJCQkJJiYgIWRvd25sb2Fk
SXRlbS5pc1RyYWNrZWQoKSkgeworCQkJCVRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSB0cmFj
a0Rvd25sb2FkS2V5c1N0b3JhZ2UgPSBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UKKwkJCQkJ
CS5pbnN0KCk7CisJCQkJdHJhY2tEb3dubG9hZEtleXNTdG9yYWdlLnN0b3JlSXRlbShuZXcg
VHJhY2tEb3dubG9hZEtleXMoCisJCQkJCQlkb3dubG9hZEl0ZW0uZ2V0S2V5KCksIGRvd25s
b2FkSXRlbS5nZXRGaWxlbmFtZSgpLAorCQkJCQkJZG93bmxvYWRJdGVtLmdldEFzc29jaWF0
ZWRCb2FyZE5hbWUoKSwgZG93bmxvYWRJdGVtCisJCQkJCQkJCS5nZXRGaWxlU2l6ZSgpLCBk
b3dubG9hZEl0ZW0KKwkJCQkJCQkJLmdldERvd25sb2FkRmluaXNoZWRNaWxsaXMoKSkpOwor
CQkJCWRvd25sb2FkSXRlbS5zZXRUcmFja2VkKHRydWUpOworCQkJfQogCi0gICAgICAgICAg
ICAvLyB1cGRhdGUgbGFzdERvd25sb2FkZWQgdGltZSBpbiBmaWxlbGlzdAotICAgICAgICAg
ICAgaWYoIGRvd25sb2FkSXRlbS5pc1NoYXJlZEZpbGUoKSApIHsKLSAgICAgICAgICAgICAg
ICBGaWxlTGlzdFN0b3JhZ2UuaW5zdCgpLnVwZGF0ZUZyb3N0RmlsZUxpc3RGaWxlT2JqZWN0
QWZ0ZXJEb3dubG9hZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkSXRlbS5n
ZXRGaWxlTGlzdEZpbGVPYmplY3QoKS5nZXRTaGEoKSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAKLSAgICAgICAgICAgIC8vIG1heWJlIHRyYWNrIGRvd25sb2FkCi0gICAgICAg
ICAgICBpZiggQ29yZS5mcm9zdFNldHRpbmdzLmdldEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNz
LlRSQUNLX0RPV05MT0FEU19FTkFCTEVEKSAmJiAhZG93bmxvYWRJdGVtLmlzVHJhY2tlZCgp
ICkgewotICAgICAgICAgICAgICAgIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSB0cmFja0Rv
d25sb2FkS2V5c1N0b3JhZ2UgPSBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UuaW5zdCgpOwot
ICAgICAgICAgICAgICAgIHRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5zdG9yZUl0ZW0oIAot
ICAgICAgICAgICAgICAgICAgICBuZXcgVHJhY2tEb3dubG9hZEtleXMoIGRvd25sb2FkSXRl
bS5nZXRLZXkoKSwgZG93bmxvYWRJdGVtLmdldEZpbGVuYW1lKCksIGRvd25sb2FkSXRlbS5n
ZXRBc3NvY2lhdGVkQm9hcmROYW1lKCksIGRvd25sb2FkSXRlbS5nZXRGaWxlU2l6ZSgpLCBk
b3dubG9hZEl0ZW0uZ2V0RG93bmxvYWRGaW5pc2hlZE1pbGxpcygpICkKLSAgICAgICAgICAg
ICAgICApOwotICAgICAgICAgICAgICAgIGRvd25sb2FkSXRlbS5zZXRUcmFja2VkKHRydWUp
OwotICAgICAgICAgICAgfQorCQkJLy8gbWF5YmUgbG9nIHN1Y2Nlc3NmdWwgZG93bmxvYWQg
dG8gZmlsZSBsb2NhbGRhdGEvZG93bmxvYWRzLnR4dAorCQkJaWYgKENvcmUuZnJvc3RTZXR0
aW5ncworCQkJCQkuZ2V0Qm9vbFZhbHVlKFNldHRpbmdzQ2xhc3MuTE9HX0RPV05MT0FEU19F
TkFCTEVEKQorCQkJCQkmJiAhZG93bmxvYWRJdGVtLmlzTG9nZ2VkVG9GaWxlKCkpIHsKKwkJ
CQlmaW5hbCBTdHJpbmcgbGluZSA9IGRvd25sb2FkSXRlbS5nZXRLZXkoKSArICIvIgorCQkJ
CQkJKyBkb3dubG9hZEl0ZW0uZ2V0RmlsZW5hbWUoKTsKKwkJCQlmaW5hbCBTdHJpbmcgZmls
ZU5hbWUgPSBDb3JlLmZyb3N0U2V0dGluZ3MKKwkJCQkJCS5nZXRWYWx1ZShTZXR0aW5nc0Ns
YXNzLkRJUl9MT0NBTERBVEEpCisJCQkJCQkrICJGcm9zdC1Eb3dubG9hZHMubG9nIjsKKwkJ
CQlmaW5hbCBGaWxlIHRhcmdldExvZ0ZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7CisJCQkJ
RmlsZUFjY2Vzcy5hcHBlbmRMaW5lVG9UZXh0ZmlsZSh0YXJnZXRMb2dGaWxlLCBsaW5lKTsK
KwkJCQlkb3dubG9hZEl0ZW0uc2V0TG9nZ2VkVG9GaWxlKHRydWUpOworCQkJfQogCi0gICAg
ICAgICAgICAvLyBtYXliZSBsb2cgc3VjY2Vzc2Z1bCBkb3dubG9hZCB0byBmaWxlIGxvY2Fs
ZGF0YS9kb3dubG9hZHMudHh0Ci0gICAgICAgICAgICBpZiggQ29yZS5mcm9zdFNldHRpbmdz
LmdldEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNzLkxPR19ET1dOTE9BRFNfRU5BQkxFRCkgJiYg
IWRvd25sb2FkSXRlbS5pc0xvZ2dlZFRvRmlsZSgpICkgewotICAgICAgICAgICAgICAgIGZp
bmFsIFN0cmluZyBsaW5lID0gZG93bmxvYWRJdGVtLmdldEtleSgpICsgIi8iICsgZG93bmxv
YWRJdGVtLmdldEZpbGVuYW1lKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZp
bGVOYW1lID0gQ29yZS5mcm9zdFNldHRpbmdzLmdldFZhbHVlKFNldHRpbmdzQ2xhc3MuRElS
X0xPQ0FMREFUQSkgKyAiRnJvc3QtRG93bmxvYWRzLmxvZyI7Ci0gICAgICAgICAgICAgICAg
ZmluYWwgRmlsZSB0YXJnZXRMb2dGaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotICAgICAg
ICAgICAgICAgIEZpbGVBY2Nlc3MuYXBwZW5kTGluZVRvVGV4dGZpbGUodGFyZ2V0TG9nRmls
ZSwgbGluZSk7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldExvZ2dlZFRvRmls
ZSh0cnVlKTsKLSAgICAgICAgICAgIH0KKwkJCWZpbmFsIFN0cmluZyBleGVjUHJvZyA9IENv
cmUuZnJvc3RTZXR0aW5ncworCQkJCQkuZ2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5FWEVDX09O
X0RPV05MT0FEKTsKKwkJCWlmIChleGVjUHJvZyAhPSBudWxsICYmIGV4ZWNQcm9nLmxlbmd0
aCgpID4gMAorCQkJCQkmJiAhZG93bmxvYWRJdGVtLmlzRXh0ZXJuYWwoKQorCQkJCQkmJiAh
ZG93bmxvYWRJdGVtLmlzQ29tcGxldGlvblByb2dSdW4oKSkgeworCQkJCWZpbmFsIEZpbGUg
ZGlyID0gbmV3IEZpbGUoZG93bmxvYWRJdGVtLmdldERvd25sb2FkRGlyKCkpOworCQkJCWZp
bmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gb2xkRW52ID0gU3lzdGVtLmdldGVudigpOworCQkJ
CWZpbmFsIFN0cmluZ1tdIG5ld0VudiA9IG5ldyBTdHJpbmdbb2xkRW52LnNpemUoKSArIDVd
OworCQkJCWZpbmFsIFN0cmluZyBhcmdzW10gPSBuZXcgU3RyaW5nWzZdOworCQkJCWludCBp
OwogCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhlY1Byb2cgPSBDb3JlLmZyb3N0U2V0
dGluZ3MuZ2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5FWEVDX09OX0RPV05MT0FEKTsKLSAgICAg
ICAgICAgIGlmKCBleGVjUHJvZyAhPSBudWxsICYmIGV4ZWNQcm9nLmxlbmd0aCgpID4gMCAm
JiAhZG93bmxvYWRJdGVtLmlzRXh0ZXJuYWwoKSAmJiAhZG93bmxvYWRJdGVtLmlzQ29tcGxl
dGlvblByb2dSdW4oKSApIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGRpciA9IG5l
dyBGaWxlKGRvd25sb2FkSXRlbS5nZXREb3dubG9hZERpcigpKTsKLSAgICAgICAgICAgICAg
ICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG9sZEVudiA9IFN5c3RlbS5nZXRlbnYoKTsK
LSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBuZXdFbnYgPSBuZXcgU3RyaW5nW29s
ZEVudi5zaXplKCkgKyA1XTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnc1td
ID0gbmV3IFN0cmluZ1s2XTsKLSAgICAgICAgICAgICAgICBpbnQgaTsKKwkJCQlhcmdzWzBd
ID0gZXhlY1Byb2c7CisJCQkJYXJnc1sxXSA9IGRvd25sb2FkSXRlbS5nZXRGaWxlbmFtZSgp
OworCQkJCWFyZ3NbMl0gPSBkb3dubG9hZEl0ZW0uZ2V0RmlsZW5hbWVQcmVmaXgoKTsKKwkJ
CQlhcmdzWzNdID0gZG93bmxvYWRJdGVtLmdldEtleSgpOworCQkJCWFyZ3NbNF0gPSBkb3du
bG9hZEl0ZW0uZ2V0QXNzb2NpYXRlZEJvYXJkTmFtZSgpOworCQkJCWFyZ3NbNV0gPSBkb3du
bG9hZEl0ZW0uZ2V0QXNzb2NpYXRlZE1lc3NhZ2VJZCgpOwogCi0gICAgICAgICAgICAgICAg
YXJnc1swXSA9IGV4ZWNQcm9nOwotICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSBkb3dubG9h
ZEl0ZW0uZ2V0RmlsZW5hbWUoKTsKLSAgICAgICAgICAgICAgICBhcmdzWzJdID0gZG93bmxv
YWRJdGVtLmdldEZpbGVuYW1lUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgYXJnc1szXSA9
IGRvd25sb2FkSXRlbS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBhcmdzWzRdID0gZG93
bmxvYWRJdGVtLmdldEFzc29jaWF0ZWRCb2FyZE5hbWUoKTsKLSAgICAgICAgICAgICAgICBh
cmdzWzVdID0gZG93bmxvYWRJdGVtLmdldEFzc29jaWF0ZWRNZXNzYWdlSWQoKTsKKwkJCQlm
b3IgKGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoYXJnc1tpXSA9
PSBudWxsKSB7CisJCQkJCQlhcmdzW2ldID0gIiI7CisJCQkJCX0KKwkJCQl9CiAKLSAgICAg
ICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKyApIHsKLSAgICAg
ICAgICAgICAgICAgICAgaWYoIGFyZ3NbaV0gPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGFyZ3NbaV0gPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIH0KKwkJCQlpID0gMDsKKwkJCQlmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJp
bmcsIFN0cmluZz4gZW50cnkgOiBvbGRFbnYuZW50cnlTZXQoKSkgeworCQkJCQluZXdFbnZb
aSsrXSA9IGVudHJ5LmdldEtleSgpICsgIj0iICsgZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQl9
CisJCQkJbmV3RW52W2krK10gPSAiRlJPU1RfRklMRU5BTUU9IiArIGRvd25sb2FkSXRlbS5n
ZXRGaWxlbmFtZSgpOworCQkJCW5ld0VudltpKytdID0gIkZST1NUX0ZJTEVOQU1FX1BSRUZJ
WD0iCisJCQkJCQkrIGRvd25sb2FkSXRlbS5nZXRGaWxlbmFtZVByZWZpeCgpOworCQkJCW5l
d0VudltpKytdID0gIkZST1NUX0tFWT0iICsgZG93bmxvYWRJdGVtLmdldEtleSgpOworCQkJ
CW5ld0VudltpKytdID0gIkZST1NUX0FTU09DX0JPQVJEX05BTUU9IgorCQkJCQkJKyBkb3du
bG9hZEl0ZW0uZ2V0QXNzb2NpYXRlZEJvYXJkTmFtZSgpOworCQkJCW5ld0VudltpKytdID0g
IkZST1NUX0FTU09DX01TR19JRD0iCisJCQkJCQkrIGRvd25sb2FkSXRlbS5nZXRBc3NvY2lh
dGVkTWVzc2FnZUlkKCk7CiAKLSAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAg
ICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBvbGRF
bnYuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXdFbnZbaSsrXSA9IGVu
dHJ5LmdldEtleSgpICsgIj0iICsgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgbmV3RW52W2krK10gPSAiRlJPU1RfRklMRU5BTUU9IiAr
IGRvd25sb2FkSXRlbS5nZXRGaWxlbmFtZSgpOwotICAgICAgICAgICAgICAgIG5ld0Vudltp
KytdID0gIkZST1NUX0ZJTEVOQU1FX1BSRUZJWD0iICsgZG93bmxvYWRJdGVtLmdldEZpbGVu
YW1lUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgbmV3RW52W2krK10gPSAiRlJPU1RfS0VZ
PSIgKyBkb3dubG9hZEl0ZW0uZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgbmV3RW52W2kr
K10gPSAiRlJPU1RfQVNTT0NfQk9BUkRfTkFNRT0iICsgZG93bmxvYWRJdGVtLmdldEFzc29j
aWF0ZWRCb2FyZE5hbWUoKTsKLSAgICAgICAgICAgICAgICBuZXdFbnZbaSsrXSA9ICJGUk9T
VF9BU1NPQ19NU0dfSUQ9IiArIGRvd25sb2FkSXRlbS5nZXRBc3NvY2lhdGVkTWVzc2FnZUlk
KCk7CisJCQkJdHJ5IHsKKwkJCQkJUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhhcmdzLCBu
ZXdFbnYsIGRpcik7CisJCQkJfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkJCQkJ
U3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgZXhlYyAiICsgZXhlY1Byb2cgKyAiOiAi
CisJCQkJCQkJKyBlLmdldE1lc3NhZ2UoKSk7CisJCQkJfQorCQkJfQogCi0gICAgICAgICAg
ICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCku
ZXhlYyhhcmdzLCBuZXdFbnYsIGRpcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoZmlu
YWwgRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmlu
dGxuKCJDb3VsZCBub3QgZXhlYyAiICsgZXhlY1Byb2cgKyAiOiAiICsgZS5nZXRNZXNzYWdl
KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKwkJCWRvd25sb2FkSXRl
bS5zZXRDb21wbGV0aW9uUHJvZ1J1bih0cnVlKTsKIAotICAgICAgICAgICAgZG93bmxvYWRJ
dGVtLnNldENvbXBsZXRpb25Qcm9nUnVuKHRydWUpOworCQkJLy8gbWF5YmUgcmVtb3ZlIGZp
bmlzaGVkIGRvd25sb2FkIGltbWVkaWF0ZWx5CisJCQlpZiAoQ29yZS5mcm9zdFNldHRpbmdz
CisJCQkJCS5nZXRCb29sVmFsdWUoU2V0dGluZ3NDbGFzcy5ET1dOTE9BRF9SRU1PVkVfRklO
SVNIRUQpKSB7CisJCQkJRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0RG93bmxvYWRN
YW5hZ2VyKCkuZ2V0TW9kZWwoKQorCQkJCQkJLnJlbW92ZUZpbmlzaGVkRG93bmxvYWRzKCk7
CisJCQl9CisJCX0KIAotICAgICAgICAgICAgLy8gbWF5YmUgcmVtb3ZlIGZpbmlzaGVkIGRv
d25sb2FkIGltbWVkaWF0ZWx5Ci0gICAgICAgICAgICBpZiggQ29yZS5mcm9zdFNldHRpbmdz
LmdldEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNzLkRPV05MT0FEX1JFTU9WRV9GSU5JU0hFRCkg
KSB7Ci0gICAgICAgICAgICAgICAgRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0RG93
bmxvYWRNYW5hZ2VyKCkuZ2V0TW9kZWwoKS5yZW1vdmVGaW5pc2hlZERvd25sb2FkcygpOwot
ICAgICAgICAgICAgfQotICAgICAgICB9CisJCWlmIChyZXRyeUltbWVkaWF0ZWx5KSB7CisJ
CQlkb3dubG9hZEl0ZW0uc2V0TGFzdERvd25sb2FkU3RvcFRpbWUoLTEpOworCQl9IGVsc2Ug
eworCQkJZG93bmxvYWRJdGVtLnNldExhc3REb3dubG9hZFN0b3BUaW1lKFN5c3RlbS5jdXJy
ZW50VGltZU1pbGxpcygpKTsKKwkJfQogCi0gICAgICAgIGlmKCByZXRyeUltbWVkaWF0ZWx5
ICkgewotICAgICAgICAgICAgZG93bmxvYWRJdGVtLnNldExhc3REb3dubG9hZFN0b3BUaW1l
KC0xKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRvd25sb2FkSXRlbS5zZXRM
YXN0RG93bmxvYWRTdG9wVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAg
ICAgIH0KKwkJcmV0dXJuIHJldHJ5SW1tZWRpYXRlbHk7CisJfQogCi0gICAgICAgIHJldHVy
biByZXRyeUltbWVkaWF0ZWx5OwotICAgIH0KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVj
a2VkIikKKwlwdWJsaWMgTGlzdDxGcm9zdERvd25sb2FkSXRlbT4gZ2V0RG93bmxvYWRJdGVt
TGlzdCgpIHsKKwkJcmV0dXJuIGdldE1vZGVsKCkuZ2V0SXRlbXMoKTsKKwl9CiAKLSAgICBA
U3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgTGlzdDxGcm9zdERv
d25sb2FkSXRlbT4gZ2V0RG93bmxvYWRJdGVtTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIGdl
dE1vZGVsKCkuZ2V0SXRlbXMoKTsKLSAgICB9CisJLyoqCisJICogQ2hvb3NlcyBuZXh0IGRv
d25sb2FkIGl0ZW0gdG8gc3RhcnQgZnJvbSBkb3dubG9hZCB0YWJsZS4KKwkgKiAKKwkgKiBA
cmV0dXJuIHRoZSBuZXh0IGRvd25sb2FkIGl0ZW0gdG8gc3RhcnQgZG93bmxvYWRpbmcgb3Ig
bnVsbCBpZiBhIHN1aXRhYmxlCisJICogICAgICAgICBvbmUgd2FzIG5vdCBmb3VuZC4KKwkg
Ki8KKwlwdWJsaWMgRnJvc3REb3dubG9hZEl0ZW0gc2VsZWN0TmV4dERvd25sb2FkSXRlbSgp
IHsKIAotICAgIC8qKgotICAgICAqIENob29zZXMgbmV4dCBkb3dubG9hZCBpdGVtIHRvIHN0
YXJ0IGZyb20gZG93bmxvYWQgdGFibGUuCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBkb3du
bG9hZCBpdGVtIHRvIHN0YXJ0IGRvd25sb2FkaW5nIG9yIG51bGwgaWYgYSBzdWl0YWJsZQot
ICAgICAqICAgICAgICAgIG9uZSB3YXMgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1Ymxp
YyBGcm9zdERvd25sb2FkSXRlbSBzZWxlY3ROZXh0RG93bmxvYWRJdGVtKCkgeworCQkvLyBn
ZXQgdGhlIGl0ZW0gd2l0aCBzdGF0ZSAiV2FpdGluZyIKKwkJZmluYWwgQXJyYXlMaXN0PEZy
b3N0RG93bmxvYWRJdGVtPiB3YWl0aW5nSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEZyb3N0RG93
bmxvYWRJdGVtPigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGVsLmdldEl0ZW1Db3Vu
dCgpOyBpKyspIHsKKwkJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGRsSXRlbSA9IChGcm9z
dERvd25sb2FkSXRlbSkgbW9kZWwKKwkJCQkJLmdldEl0ZW1BdChpKTsKKwkJCWZpbmFsIGJv
b2xlYW4gaXRlbUlzRW5hYmxlZCA9IChkbEl0ZW0uaXNFbmFibGVkKCkgPT0gbnVsbCA/IHRy
dWUKKwkJCQkJOiBkbEl0ZW0uaXNFbmFibGVkKCkuYm9vbGVhblZhbHVlKCkpOworCQkJaWYg
KCFpdGVtSXNFbmFibGVkKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZGxJdGVt
LmlzRXh0ZXJuYWwoKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGRsSXRlbS5n
ZXRLZXkoKSA9PSBudWxsKSB7CisJCQkJLy8gc3RpbGwgbm8ga2V5LCB3YWl0CisJCQkJY29u
dGludWU7CisJCQl9CiAKLSAgICAgICAgLy8gZ2V0IHRoZSBpdGVtIHdpdGggc3RhdGUgIldh
aXRpbmciCi0gICAgICAgIGZpbmFsIEFycmF5TGlzdDxGcm9zdERvd25sb2FkSXRlbT4gd2Fp
dGluZ0l0ZW1zID0gbmV3IEFycmF5TGlzdDxGcm9zdERvd25sb2FkSXRlbT4oKTsKLSAgICAg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbC5nZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0g
ICAgICAgICAgICBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBkbEl0ZW0gPSAoRnJvc3REb3du
bG9hZEl0ZW0pIG1vZGVsLmdldEl0ZW1BdChpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xl
YW4gaXRlbUlzRW5hYmxlZCA9IChkbEl0ZW0uaXNFbmFibGVkKCk9PW51bGw/dHJ1ZTpkbEl0
ZW0uaXNFbmFibGVkKCkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgaWYoICFpdGVt
SXNFbmFibGVkICkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgaWYoIGRsSXRlbS5pc0V4dGVybmFsKCkgKSB7Ci0gICAgICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiggZGxJdGVt
LmdldEtleSgpID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgLy8gc3RpbGwgbm8ga2V5
LCB3YWl0Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9CisJCQlp
ZiAoZGxJdGVtLmdldFN0YXRlKCkgIT0gRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfV0FJVElO
RykgeworCQkJCWNvbnRpbnVlOworCQkJfQogCi0gICAgICAgICAgICBpZiggZGxJdGVtLmdl
dFN0YXRlKCkgIT0gRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfV0FJVElORyApIHsKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KKwkJCS8vIGNoZWNrIGlmIHdh
aXR0aW1lIGlzIGV4cGlyZWQKKwkJCWZpbmFsIGxvbmcgd2FpdHRpbWVNaWxsaXMgPSBDb3Jl
LmZyb3N0U2V0dGluZ3MKKwkJCQkJLmdldEludFZhbHVlKFNldHRpbmdzQ2xhc3MuRE9XTkxP
QURfV0FJVFRJTUUpICogNjBMICogMTAwMEw7CisJCQkvLyBtaW4tPm1pbGxpc2VjCisJCQlp
ZiAoZGxJdGVtLmdldExhc3REb3dubG9hZFN0b3BUaW1lKCkgPT0gMCAvLyBuZXZlciBzdGFy
dGVkCisJCQkJCXx8IChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGRsSXRlbQorCQkJ
CQkJCS5nZXRMYXN0RG93bmxvYWRTdG9wVGltZSgpKSA+IHdhaXR0aW1lTWlsbGlzKSB7CisJ
CQkJd2FpdGluZ0l0ZW1zLmFkZChkbEl0ZW0pOworCQkJfQorCQl9CiAKLSAgICAgICAgICAg
IC8vIGNoZWNrIGlmIHdhaXR0aW1lIGlzIGV4cGlyZWQKLSAgICAgICAgICAgIGZpbmFsIGxv
bmcgd2FpdHRpbWVNaWxsaXMgPSBDb3JlLmZyb3N0U2V0dGluZ3MuZ2V0SW50VmFsdWUoU2V0
dGluZ3NDbGFzcy5ET1dOTE9BRF9XQUlUVElNRSkgKiA2MEwgKiAxMDAwTDsKLSAgICAgICAg
ICAgIC8vIG1pbi0+bWlsbGlzZWMKLSAgICAgICAgICAgIGlmIChkbEl0ZW0uZ2V0TGFzdERv
d25sb2FkU3RvcFRpbWUoKSA9PSAwIC8vIG5ldmVyIHN0YXJ0ZWQKLSAgICAgICAgICAgICAg
ICB8fCAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBkbEl0ZW0uZ2V0TGFzdERvd25s
b2FkU3RvcFRpbWUoKSkgPiB3YWl0dGltZU1pbGxpcykKLSAgICAgICAgICAgIHsKLSAgICAg
ICAgICAgICAgICB3YWl0aW5nSXRlbXMuYWRkKGRsSXRlbSk7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KKwkJaWYgKHdhaXRpbmdJdGVtcy5zaXplKCkgPT0gMCkgeworCQkJcmV0dXJu
IG51bGw7CisJCX0KIAotICAgICAgICBpZiAod2FpdGluZ0l0ZW1zLnNpemUoKSA9PSAwKSB7
Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQorCQlpZiAod2FpdGluZ0l0
ZW1zLnNpemUoKSA+IDEpIHsgLy8gcGVyZm9ybWFuY2UgaXNzdWVzCisJCQlDb2xsZWN0aW9u
cy5zb3J0KHdhaXRpbmdJdGVtcywgbmV4dEl0ZW1DbXApOworCQl9CisJCXJldHVybiB3YWl0
aW5nSXRlbXMuZ2V0KDApOworCX0KIAotICAgICAgICBpZiAod2FpdGluZ0l0ZW1zLnNpemUo
KSA+IDEpIHsgLy8gcGVyZm9ybWFuY2UgaXNzdWVzCi0gICAgICAgICAgICBDb2xsZWN0aW9u
cy5zb3J0KHdhaXRpbmdJdGVtcywgbmV4dEl0ZW1DbXApOwotICAgICAgICB9Ci0gICAgICAg
IHJldHVybiB3YWl0aW5nSXRlbXMuZ2V0KDApOwotICAgIH0KKwlwdWJsaWMgdm9pZCBub3Rp
ZnlEb3dubG9hZEl0ZW1FbmFibGVkU3RhdGVDaGFuZ2VkKAorCQkJZmluYWwgRnJvc3REb3du
bG9hZEl0ZW0gZGxJdGVtKSB7CisJCS8vIGZvciBwZXJzaXN0ZW50IGl0ZW1zLCBzZXQgcHJp
b3JpdHkgdG8gNiAocGF1c2UpIHdoZW4gZGlzYWJsZWQ7IGFuZCB0bworCQkvLyBjb25maWd1
cmVkIGRlZmF1bHQgaWYgZW5hYmxlZAorCQlpZiAoRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0
KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9
CisJCWlmIChkbEl0ZW0uaXNFeHRlcm5hbCgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYg
KGRsSXRlbS5nZXRTdGF0ZSgpICE9IEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX1BST0dSRVNT
KSB7CisJCQkvLyBub3QgcnVubmluZywgbm90IGluIHF1ZXVlCisJCQlyZXR1cm47CisJCX0K
KwkJZmluYWwgYm9vbGVhbiBpdGVtSXNFbmFibGVkID0gKGRsSXRlbS5pc0VuYWJsZWQoKSA9
PSBudWxsID8gdHJ1ZQorCQkJCTogZGxJdGVtLmlzRW5hYmxlZCgpLmJvb2xlYW5WYWx1ZSgp
KTsKKwkJaWYgKGl0ZW1Jc0VuYWJsZWQpIHsKKwkJCS8vIGl0ZW0gaXMgbm93IGVuYWJsZWQK
KwkJCWZpbmFsIGludCBwcmlvID0gQ29yZS5mcm9zdFNldHRpbmdzCisJCQkJCS5nZXRJbnRW
YWx1ZShTZXR0aW5nc0NsYXNzLkZDUDJfREVGQVVMVF9QUklPX0ZJTEVfRE9XTkxPQUQpOwor
CQkJRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkK
KwkJCQkJLmNoYW5nZUl0ZW1Qcmlvcml0ZXMobmV3IE1vZGVsSXRlbVtdIHsgZGxJdGVtIH0s
IHByaW8pOworCQl9IGVsc2UgeworCQkJLy8gaXRlbSBpcyBub3cgZGlzYWJsZWQKKwkJCUZp
bGVUcmFuc2Zlck1hbmFnZXIuaW5zdCgpLmdldFBlcnNpc3RlbmNlTWFuYWdlcigpCisJCQkJ
CS5jaGFuZ2VJdGVtUHJpb3JpdGVzKG5ldyBNb2RlbEl0ZW1bXSB7IGRsSXRlbSB9LCA2KTsK
KwkJfQorCX0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURvd25sb2FkSXRlbUVuYWJsZWRT
dGF0ZUNoYW5nZWQoZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtKSB7Ci0gICAgICAg
IC8vIGZvciBwZXJzaXN0ZW50IGl0ZW1zLCBzZXQgcHJpb3JpdHkgdG8gNiAocGF1c2UpIHdo
ZW4gZGlzYWJsZWQ7IGFuZCB0byBjb25maWd1cmVkIGRlZmF1bHQgaWYgZW5hYmxlZAotICAg
ICAgICBpZiggRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5h
Z2VyKCkgPT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAg
ICAgICBpZiggZGxJdGVtLmlzRXh0ZXJuYWwoKSApIHsKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgfQotICAgICAgICBpZiggZGxJdGVtLmdldFN0YXRlKCkgIT0gRnJvc3REb3du
bG9hZEl0ZW0uU1RBVEVfUFJPR1JFU1MgKSB7Ci0gICAgICAgICAgICAvLyBub3QgcnVubmlu
Zywgbm90IGluIHF1ZXVlCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAg
ICAgZmluYWwgYm9vbGVhbiBpdGVtSXNFbmFibGVkID0gKGRsSXRlbS5pc0VuYWJsZWQoKT09
bnVsbD90cnVlOmRsSXRlbS5pc0VuYWJsZWQoKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAg
IGlmKCBpdGVtSXNFbmFibGVkICkgewotICAgICAgICAgICAgLy8gaXRlbSBpcyBub3cgZW5h
YmxlZAotICAgICAgICAgICAgZmluYWwgaW50IHByaW8gPSBDb3JlLmZyb3N0U2V0dGluZ3Mu
Z2V0SW50VmFsdWUoU2V0dGluZ3NDbGFzcy5GQ1AyX0RFRkFVTFRfUFJJT19GSUxFX0RPV05M
T0FEKTsKLSAgICAgICAgICAgIEZpbGVUcmFuc2Zlck1hbmFnZXIuaW5zdCgpLmdldFBlcnNp
c3RlbmNlTWFuYWdlcigpLmNoYW5nZUl0ZW1Qcmlvcml0ZXMobmV3IE1vZGVsSXRlbVtdIHtk
bEl0ZW19LCBwcmlvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGl0ZW0g
aXMgbm93IGRpc2FibGVkCi0gICAgICAgICAgICBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3Qo
KS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKS5jaGFuZ2VJdGVtUHJpb3JpdGVzKG5ldyBNb2Rl
bEl0ZW1bXSB7ZGxJdGVtfSwgNik7Ci0gICAgICAgIH0KLSAgICB9CisJLyoqCisJICogVXNl
ZCB0byBzb3J0IEZyb3N0RG93bmxvYWRJdGVtcyBieSBsYXN0VXBkYXRlU3RhcnRUaW1lTWls
bGlzIGFzY2VuZGluZy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9y
PEZyb3N0RG93bmxvYWRJdGVtPiBuZXh0SXRlbUNtcCA9IG5ldyBDb21wYXJhdG9yPEZyb3N0
RG93bmxvYWRJdGVtPigpIHsKKwkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIEZyb3N0RG93
bmxvYWRJdGVtIHZhbHVlMSwKKwkJCQlmaW5hbCBGcm9zdERvd25sb2FkSXRlbSB2YWx1ZTIp
IHsKIAotICAgIC8qKgotICAgICAqIFVzZWQgdG8gc29ydCBGcm9zdERvd25sb2FkSXRlbXMg
YnkgbGFzdFVwZGF0ZVN0YXJ0VGltZU1pbGxpcyBhc2NlbmRpbmcuCi0gICAgICovCi0gICAg
cHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxGcm9zdERvd25sb2FkSXRlbT4gbmV4
dEl0ZW1DbXAgPSBuZXcgQ29tcGFyYXRvcjxGcm9zdERvd25sb2FkSXRlbT4oKSB7Ci0gICAg
ICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBGcm9zdERvd25sb2FkSXRlbSB2YWx1ZTEs
IGZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIHZhbHVlMikgeworCQkJLy8gY2hvb3NlIGl0ZW0g
dGhhdCB3aXRoIGxvd2VzdCBhZGRlZFRpbWUKKwkJCWZpbmFsIGludCBjbXAxID0gTWl4ZWQu
Y29tcGFyZUxvbmcodmFsdWUxLmdldERvd25sb2FkQWRkZWRNaWxsaXMoKSwKKwkJCQkJdmFs
dWUyLmdldERvd25sb2FkQWRkZWRNaWxsaXMoKSk7CisJCQlpZiAoY21wMSAhPSAwKSB7CisJ
CQkJcmV0dXJuIGNtcDE7CisJCQl9CiAKLSAgICAgICAgICAgIC8vIGNob29zZSBpdGVtIHRo
YXQgd2l0aCBsb3dlc3QgYWRkZWRUaW1lCi0gICAgICAgICAgICBmaW5hbCBpbnQgY21wMSA9
IE1peGVkLmNvbXBhcmVMb25nKHZhbHVlMS5nZXREb3dubG9hZEFkZGVkTWlsbGlzKCksIHZh
bHVlMi5nZXREb3dubG9hZEFkZGVkTWlsbGlzKCkpOwotICAgICAgICAgICAgaWYoIGNtcDEg
IT0gMCApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY21wMTsKLSAgICAgICAgICAgIH0K
KwkJCS8vIGVxdWFsIGFkZGVkVGltZXMsIGNob29zZSBieSBibG9ja3NSZW1haW5pbmcKKwkJ
CWludCBibG9ja3NUb2RvMTsKKwkJCWludCBibG9ja3NUb2RvMjsKIAotICAgICAgICAgICAg
Ly8gZXF1YWwgYWRkZWRUaW1lcywgY2hvb3NlIGJ5IGJsb2Nrc1JlbWFpbmluZwotICAgICAg
ICAgICAgaW50IGJsb2Nrc1RvZG8xOwotICAgICAgICAgICAgaW50IGJsb2Nrc1RvZG8yOwor
CQkJLy8gY29tcHV0ZSByZW1haW5pbmcgYmxvY2tzCisJCQlpZiAodmFsdWUxLmdldFJlcXVp
cmVkQmxvY2tzKCkgPiAwICYmIHZhbHVlMS5nZXREb25lQmxvY2tzKCkgPiAwKSB7CisJCQkJ
YmxvY2tzVG9kbzEgPSB2YWx1ZTEuZ2V0UmVxdWlyZWRCbG9ja3MoKQorCQkJCQkJLSB2YWx1
ZTEuZ2V0RG9uZUJsb2NrcygpOworCQkJfSBlbHNlIHsKKwkJCQlibG9ja3NUb2RvMSA9IElu
dGVnZXIuTUFYX1ZBTFVFOyAvLyBuZXZlciBzdGFydGVkCisJCQl9CisJCQlpZiAodmFsdWUy
LmdldFJlcXVpcmVkQmxvY2tzKCkgPiAwICYmIHZhbHVlMi5nZXREb25lQmxvY2tzKCkgPiAw
KSB7CisJCQkJYmxvY2tzVG9kbzIgPSB2YWx1ZTIuZ2V0UmVxdWlyZWRCbG9ja3MoKQorCQkJ
CQkJLSB2YWx1ZTIuZ2V0RG9uZUJsb2NrcygpOworCQkJfSBlbHNlIHsKKwkJCQlibG9ja3NU
b2RvMiA9IEludGVnZXIuTUFYX1ZBTFVFOyAvLyBuZXZlciBzdGFydGVkCisJCQl9CiAKLSAg
ICAgICAgICAgIC8vIGNvbXB1dGUgcmVtYWluaW5nIGJsb2NrcwotICAgICAgICAgICAgaWYo
IHZhbHVlMS5nZXRSZXF1aXJlZEJsb2NrcygpID4gMCAmJiB2YWx1ZTEuZ2V0RG9uZUJsb2Nr
cygpID4gMCApIHsKLSAgICAgICAgICAgICAgICBibG9ja3NUb2RvMSA9IHZhbHVlMS5nZXRS
ZXF1aXJlZEJsb2NrcygpIC0gdmFsdWUxLmdldERvbmVCbG9ja3MoKTsKLSAgICAgICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmxvY2tzVG9kbzEgPSBJbnRlZ2VyLk1BWF9W
QUxVRTsgLy8gbmV2ZXIgc3RhcnRlZAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYo
IHZhbHVlMi5nZXRSZXF1aXJlZEJsb2NrcygpID4gMCAmJiB2YWx1ZTIuZ2V0RG9uZUJsb2Nr
cygpID4gMCApIHsKLSAgICAgICAgICAgICAgICBibG9ja3NUb2RvMiA9IHZhbHVlMi5nZXRS
ZXF1aXJlZEJsb2NrcygpIC0gdmFsdWUyLmdldERvbmVCbG9ja3MoKTsKLSAgICAgICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmxvY2tzVG9kbzIgPSBJbnRlZ2VyLk1BWF9W
QUxVRTsgLy8gbmV2ZXIgc3RhcnRlZAotICAgICAgICAgICAgfQorCQkJZmluYWwgaW50IGNt
cDIgPSBNaXhlZC5jb21wYXJlSW50KGJsb2Nrc1RvZG8xLCBibG9ja3NUb2RvMik7CisJCQlp
ZiAoY21wMiAhPSAwKSB7CisJCQkJcmV0dXJuIGNtcDI7CisJCQl9CiAKLSAgICAgICAgICAg
IGZpbmFsIGludCBjbXAyID0gTWl4ZWQuY29tcGFyZUludChibG9ja3NUb2RvMSwgYmxvY2tz
VG9kbzIpOwotICAgICAgICAgICAgaWYoIGNtcDIgIT0gMCApIHsKLSAgICAgICAgICAgICAg
ICByZXR1cm4gY21wMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZXF1YWwg
cmVtYWluaW5nQmxvY2tzLCBjaG9vc2Ugc21hbGxlciBmaWxlIChmaWxlc2l6ZSBjYW4gYmUg
LTEpCi0gICAgICAgICAgICByZXR1cm4gTWl4ZWQuY29tcGFyZUxvbmcodmFsdWUxLmdldEZp
bGVTaXplKCksIHZhbHVlMi5nZXRGaWxlU2l6ZSgpKTsKLSAgICAgICAgfQotICAgIH07CisJ
CQkvLyBlcXVhbCByZW1haW5pbmdCbG9ja3MsIGNob29zZSBzbWFsbGVyIGZpbGUgKGZpbGVz
aXplIGNhbiBiZSAtMSkKKwkJCXJldHVybiBNaXhlZAorCQkJCQkuY29tcGFyZUxvbmcodmFs
dWUxLmdldEZpbGVTaXplKCksIHZhbHVlMi5nZXRGaWxlU2l6ZSgpKTsKKwkJfQorCX07CiB9
CkluZGV4OiBzb3VyY2UvZnJvc3QvZmlsZVRyYW5zZmVyL2Rvd25sb2FkL0Rvd25sb2FkUGFu
ZWwuamF2YQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIHNvdXJjZS9mcm9zdC9maWxlVHJhbnNmZXIv
ZG93bmxvYWQvRG93bmxvYWRQYW5lbC5qYXZhCShyZXZpc2lvbiAzMTk3KQ0KKysrIHNvdXJj
ZS9mcm9zdC9maWxlVHJhbnNmZXIvZG93bmxvYWQvRG93bmxvYWRQYW5lbC5qYXZhCSh3b3Jr
aW5nIGNvcHkpDQpAQCAtMTQsNyArMTQsNyBAQA0KICAgWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgYWxvbmcg
d2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK
ICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5
LCBVU0EuCi0qLworICovCiBwYWNrYWdlIGZyb3N0LmZpbGVUcmFuc2Zlci5kb3dubG9hZDsK
IAogaW1wb3J0IGphdmEuYXd0Lio7CkBAIC0zNyw2ICszNyw3IEBADQogaW1wb3J0IGZyb3N0
LmZjcC4qOwogaW1wb3J0IGZyb3N0LmZpbGVUcmFuc2Zlci4qOwogaW1wb3J0IGZyb3N0LmZp
bGVUcmFuc2Zlci5jb21tb24uKjsKK2ltcG9ydCBmcm9zdC5ndWkuQWRkTmV3RG93bmxvYWRz
RGlhbG9nOwogaW1wb3J0IGZyb3N0LnN0b3JhZ2UucGVyc3QuVHJhY2tEb3dubG9hZEtleXNT
dG9yYWdlOwogaW1wb3J0IGZyb3N0LnV0aWwuKjsKIGltcG9ydCBmcm9zdC51dGlsLmd1aS4q
OwpAQCAtNjAsMjEgKzYxLDIxIEBADQogCXByaXZhdGUgZmluYWwgSlRvb2xCYXIgZG93bmxv
YWRUb29sQmFyID0gbmV3IEpUb29sQmFyKCk7CiAJcHJpdmF0ZSBmaW5hbCBKQnV0dG9uIGRv
d25sb2FkUGFzdGVCdXR0b24gPSBuZXcgSkJ1dHRvbihNaXNjVG9vbGtpdC5sb2FkSW1hZ2VJ
Y29uKCIvZGF0YS90b29sYmFyL2VkaXQtcGFzdGUucG5nIikpOwogCXByaXZhdGUgZmluYWwg
SkJ1dHRvbiBkb3dubG9hZEFjdGl2YXRlQnV0dG9uID0gbmV3IEpCdXR0b24oTWlzY1Rvb2xr
aXQubG9hZEltYWdlSWNvbigiL2RhdGEvdG9vbGJhci9tZWRpYS1wbGF5YmFjay1zdGFydC5w
bmciKSk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBKQnV0dG9uIGRvd25sb2FkUGF1c2VCdXR0b24g
PSBuZXcgSkJ1dHRvbihNaXNjVG9vbGtpdC5sb2FkSW1hZ2VJY29uKCIvZGF0YS90b29sYmFy
L21lZGlhLXBsYXliYWNrLXBhdXNlLnBuZyIpKTsKLSAgICBwcml2YXRlIGZpbmFsIEpCdXR0
b24gZG93bmxvYWRQcmVmaXhBcHBseUJ1dHRvbiA9IG5ldyBKQnV0dG9uKE1pc2NUb29sa2l0
LmxvYWRJbWFnZUljb24oIi9kYXRhL3Rvb2xiYXIvdmlldy1yZWZyZXNoLnBuZyIpKTsKLSAg
ICBwcml2YXRlIGZpbmFsIEpCdXR0b24gZG93bmxvYWREaXJTZWxlY3RCdXR0b24gPSBuZXcg
SkJ1dHRvbihNaXNjVG9vbGtpdC5sb2FkSW1hZ2VJY29uKCIvZGF0YS90b29sYmFyL2ZvbGRl
ci1vcGVuLnBuZyIpKTsKLSAgICBwcml2YXRlIGZpbmFsIEpCdXR0b24gZG93bmxvYWREaXJD
cmVhdGVCdXR0b24gPSBuZXcgSkJ1dHRvbihNaXNjVG9vbGtpdC5sb2FkSW1hZ2VJY29uKCIv
ZGF0YS90b29sYmFyL2ZvbGRlci1uZXcucG5nIikpOwotICAgIHByaXZhdGUgZmluYWwgSkJ1
dHRvbiBkb3dubG9hZERpckFwcGx5QnV0dG9uID0gbmV3IEpCdXR0b24oTWlzY1Rvb2xraXQu
bG9hZEltYWdlSWNvbigiL2RhdGEvdG9vbGJhci92aWV3LXJlZnJlc2gucG5nIikpOworCXBy
aXZhdGUgZmluYWwgSkJ1dHRvbiBkb3dubG9hZFBhdXNlQnV0dG9uID0gbmV3IEpCdXR0b24o
TWlzY1Rvb2xraXQubG9hZEltYWdlSWNvbigiL2RhdGEvdG9vbGJhci9tZWRpYS1wbGF5YmFj
ay1wYXVzZS5wbmciKSk7CisJcHJpdmF0ZSBmaW5hbCBKQnV0dG9uIGRvd25sb2FkUHJlZml4
QXBwbHlCdXR0b24gPSBuZXcgSkJ1dHRvbihNaXNjVG9vbGtpdC5sb2FkSW1hZ2VJY29uKCIv
ZGF0YS90b29sYmFyL3ZpZXctcmVmcmVzaC5wbmciKSk7CisJcHJpdmF0ZSBmaW5hbCBKQnV0
dG9uIGRvd25sb2FkRGlyU2VsZWN0QnV0dG9uID0gbmV3IEpCdXR0b24oTWlzY1Rvb2xraXQu
bG9hZEltYWdlSWNvbigiL2RhdGEvdG9vbGJhci9mb2xkZXItb3Blbi5wbmciKSk7CisJcHJp
dmF0ZSBmaW5hbCBKQnV0dG9uIGRvd25sb2FkRGlyQ3JlYXRlQnV0dG9uID0gbmV3IEpCdXR0
b24oTWlzY1Rvb2xraXQubG9hZEltYWdlSWNvbigiL2RhdGEvdG9vbGJhci9mb2xkZXItbmV3
LnBuZyIpKTsKKwlwcml2YXRlIGZpbmFsIEpCdXR0b24gZG93bmxvYWREaXJBcHBseUJ1dHRv
biA9IG5ldyBKQnV0dG9uKE1pc2NUb29sa2l0LmxvYWRJbWFnZUljb24oIi9kYXRhL3Rvb2xi
YXIvdmlldy1yZWZyZXNoLnBuZyIpKTsKIAlwcml2YXRlIGZpbmFsIEpNZW51IGRvd25sb2Fk
RGlyUmVjZW50TWVudSA9IG5ldyBKTWVudSgpOwotICAgIHByaXZhdGUgZmluYWwgSlRleHRG
aWVsZCBkb3dubG9hZFByZWZpeFRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDMwKTsKKwlw
cml2YXRlIGZpbmFsIEpUZXh0RmllbGQgZG93bmxvYWRQcmVmaXhUZXh0RmllbGQgPSBuZXcg
SlRleHRGaWVsZCgzMCk7CiAJcHJpdmF0ZSBmaW5hbCBKVGV4dEZpZWxkIGRvd25sb2FkRGly
VGV4dEZpZWxkID0gbmV3IEpUZXh0RmllbGQoMzApOwogCXByaXZhdGUgZmluYWwgSlRleHRG
aWVsZCBkb3dubG9hZFRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDMwKTsKIAlwcml2YXRl
IGZpbmFsIEpMYWJlbCBkb3dubG9hZEl0ZW1Db3VudExhYmVsID0gbmV3IEpMYWJlbCgpOwog
CXByaXZhdGUgZmluYWwgSkxhYmVsIGRvd25sb2FkUXVpY2tsb2FkTGFiZWwgPSBuZXcgSkxh
YmVsKCk7CiAJcHJpdmF0ZSBmaW5hbCBKTGFiZWwgZG93bmxvYWRQcmVmaXhMYWJlbCA9IG5l
dyBKTGFiZWwoKTsKIAlwcml2YXRlIGZpbmFsIEpMYWJlbCBkb3dubG9hZERpckxhYmVsID0g
bmV3IEpMYWJlbCgpOwotICAgIHByaXZhdGUgZmluYWwgSkNoZWNrQm94IHJlbW92ZUZpbmlz
aGVkRG93bmxvYWRzQ2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCk7Ci0gICAgcHJpdmF0ZSBm
aW5hbCBKQ2hlY2tCb3ggc2hvd0V4dGVybmFsR2xvYmFsUXVldWVJdGVtcyA9IG5ldyBKQ2hl
Y2tCb3goKTsKKwlwcml2YXRlIGZpbmFsIEpDaGVja0JveCByZW1vdmVGaW5pc2hlZERvd25s
b2Fkc0NoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOworCXByaXZhdGUgZmluYWwgSkNoZWNr
Qm94IHNob3dFeHRlcm5hbEdsb2JhbFF1ZXVlSXRlbXMgPSBuZXcgSkNoZWNrQm94KCk7CiAJ
cHJpdmF0ZSBDb2xvciBkb3dubG9hZERpckRlZmF1bHRCYWNrZ3JvdW5kOwogCXByaXZhdGUg
U29ydGVkTW9kZWxUYWJsZSBtb2RlbFRhYmxlOwogCkBAIC04NSwyOSArODYsMjkgQEANCiAK
IAlwdWJsaWMgRG93bmxvYWRQYW5lbCgpIHsKIAkJc3VwZXIoKTsKLSAgICAgICAgQ29yZS5m
cm9zdFNldHRpbmdzLmFkZFVwZGF0ZXIodGhpcyk7CisJCUNvcmUuZnJvc3RTZXR0aW5ncy5h
ZGRVcGRhdGVyKHRoaXMpOwogCiAJCWxhbmd1YWdlID0gTGFuZ3VhZ2UuZ2V0SW5zdGFuY2Uo
KTsKIAkJbGFuZ3VhZ2UuYWRkTGFuZ3VhZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CiAJfQogCi0g
ICAgcHVibGljIERvd25sb2FkVGFibGVGb3JtYXQgZ2V0VGFibGVGb3JtYXQoKSB7Ci0gICAg
ICAgIHJldHVybiAoRG93bmxvYWRUYWJsZUZvcm1hdCkgbW9kZWxUYWJsZS5nZXRUYWJsZUZv
cm1hdCgpOwotICAgIH0KKwlwdWJsaWMgRG93bmxvYWRUYWJsZUZvcm1hdCBnZXRUYWJsZUZv
cm1hdCgpIHsKKwkJcmV0dXJuIChEb3dubG9hZFRhYmxlRm9ybWF0KSBtb2RlbFRhYmxlLmdl
dFRhYmxlRm9ybWF0KCk7CisJfQogCi0gICAgLyoqCi0gICAgICogVGhpcyBEb2N1bWVudCBj
aGFuZ2VzIGFsbCBuZXdsaW5lcyBpbiB0aGUgdGV4dCBpbnRvIHNlbWljb2xvbnMuCi0gICAg
ICogTmVlZGVkIGlmIHRoZSB1c2VyIHBhc3RlcyBtdWx0aXBsZSBkb3dubG9hZCBrZXlzLCBl
YWNoIG9uIGEgbGluZSwKLSAgICAgKiBpbnRvIHRoZSBkb3dubG9hZCB0ZXh0IGZpZWxkLgot
ICAgICAqLwotICAgIHByb3RlY3RlZCBjbGFzcyBIYW5kbGVNdWx0aUxpbmVLZXlzRG9jdW1l
bnQgZXh0ZW5kcyBQbGFpbkRvY3VtZW50IHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAg
IHB1YmxpYyB2b2lkIGluc2VydFN0cmluZyhmaW5hbCBpbnQgb2ZmcywgU3RyaW5nIHN0ciwg
ZmluYWwgQXR0cmlidXRlU2V0IGEpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0g
ICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgnXG4nLCAnOycpOwotICAgICAgICAgICAg
c3RyID0gc3RyLnJlcGxhY2UoJ1xyJywgJyAnKTsKLSAgICAgICAgICAgIHN1cGVyLmluc2Vy
dFN0cmluZyhvZmZzLCBzdHIsIGEpOwotICAgICAgICB9Ci0gICAgfQorCS8qKgorCSAqIFRo
aXMgRG9jdW1lbnQgY2hhbmdlcyBhbGwgbmV3bGluZXMgaW4gdGhlIHRleHQgaW50byBzZW1p
Y29sb25zLgorCSAqIE5lZWRlZCBpZiB0aGUgdXNlciBwYXN0ZXMgbXVsdGlwbGUgZG93bmxv
YWQga2V5cywgZWFjaCBvbiBhIGxpbmUsCisJICogaW50byB0aGUgZG93bmxvYWQgdGV4dCBm
aWVsZC4KKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgSGFuZGxlTXVsdGlMaW5lS2V5c0RvY3Vt
ZW50IGV4dGVuZHMgUGxhaW5Eb2N1bWVudCB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9p
ZCBpbnNlcnRTdHJpbmcoZmluYWwgaW50IG9mZnMsIFN0cmluZyBzdHIsIGZpbmFsIEF0dHJp
YnV0ZVNldCBhKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24geworCQkJc3RyID0gc3Ry
LnJlcGxhY2UoJ1xuJywgJzsnKTsKKwkJCXN0ciA9IHN0ci5yZXBsYWNlKCdccicsICcgJyk7
CisJCQlzdXBlci5pbnNlcnRTdHJpbmcob2Zmcywgc3RyLCBhKTsKKwkJfQorCX0KIAogCXB1
YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CiAJCWlmICghaW5pdGlhbGl6ZWQpIHsKQEAgLTEz
MiwyMyArMTMzLDIzIEBADQogCQkJbWVudS5hZGQoZG93bmxvYWREaXJSZWNlbnRNZW51KTsK
IAkJCWRvd25sb2FkRGlyUmVjZW50TWVudS5hZGRNZW51TGlzdGVuZXIobGlzdGVuZXIpOwog
Ci0gICAgICAgICAgICBkb3dubG9hZFRvb2xCYXIuc2V0Um9sbG92ZXIodHJ1ZSk7Ci0gICAg
ICAgICAgICBkb3dubG9hZFRvb2xCYXIuc2V0RmxvYXRhYmxlKGZhbHNlKTsKKwkJCWRvd25s
b2FkVG9vbEJhci5zZXRSb2xsb3Zlcih0cnVlKTsKKwkJCWRvd25sb2FkVG9vbEJhci5zZXRG
bG9hdGFibGUoZmFsc2UpOwogCi0gICAgICAgICAgICByZW1vdmVGaW5pc2hlZERvd25sb2Fk
c0NoZWNrQm94LnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgICAgICBzaG93RXh0ZXJuYWxH
bG9iYWxRdWV1ZUl0ZW1zLnNldE9wYXF1ZShmYWxzZSk7CisJCQlyZW1vdmVGaW5pc2hlZERv
d25sb2Fkc0NoZWNrQm94LnNldE9wYXF1ZShmYWxzZSk7CisJCQlzaG93RXh0ZXJuYWxHbG9i
YWxRdWV1ZUl0ZW1zLnNldE9wYXF1ZShmYWxzZSk7CiAKLSAgICAgICAgICAgIGZpbmFsIEpQ
YW5lbCBwYW5lbEhlYWRlciA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKKwkJ
CWZpbmFsIEpQYW5lbCBwYW5lbEhlYWRlciA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91
dCgpKTsKIAogCQkJLy8gVG9vbGJhcgogCQkJZG93bmxvYWRUb29sQmFyLmFkZChkb3dubG9h
ZEFjdGl2YXRlQnV0dG9uKTsKIAkJCWRvd25sb2FkVG9vbEJhci5hZGQoZG93bmxvYWRQYXVz
ZUJ1dHRvbik7Ci0gICAgICAgICAgICBkb3dubG9hZFRvb2xCYXIuYWRkKEJveC5jcmVhdGVS
aWdpZEFyZWEobmV3IERpbWVuc2lvbig4LCAwKSkpOwotICAgICAgICAgICAgZG93bmxvYWRU
b29sQmFyLmFkZChyZW1vdmVGaW5pc2hlZERvd25sb2Fkc0NoZWNrQm94KTsKLSAgICAgICAg
ICAgIGlmKCBQZXJzaXN0ZW5jZU1hbmFnZXIuaXNQZXJzaXN0ZW5jZUVuYWJsZWQoKSApIHsK
LSAgICAgICAgICAgICAgICBkb3dubG9hZFRvb2xCYXIuYWRkKEJveC5jcmVhdGVSaWdpZEFy
ZWEobmV3IERpbWVuc2lvbig4LCAwKSkpOwotICAgICAgICAgICAgICAgIGRvd25sb2FkVG9v
bEJhci5hZGQoc2hvd0V4dGVybmFsR2xvYmFsUXVldWVJdGVtcyk7Ci0gICAgICAgICAgICB9
CisJCQlkb3dubG9hZFRvb2xCYXIuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVu
c2lvbig4LCAwKSkpOworCQkJZG93bmxvYWRUb29sQmFyLmFkZChyZW1vdmVGaW5pc2hlZERv
d25sb2Fkc0NoZWNrQm94KTsKKwkJCWlmKCBQZXJzaXN0ZW5jZU1hbmFnZXIuaXNQZXJzaXN0
ZW5jZUVuYWJsZWQoKSApIHsKKwkJCQlkb3dubG9hZFRvb2xCYXIuYWRkKEJveC5jcmVhdGVS
aWdpZEFyZWEobmV3IERpbWVuc2lvbig4LCAwKSkpOworCQkJCWRvd25sb2FkVG9vbEJhci5h
ZGQoc2hvd0V4dGVybmFsR2xvYmFsUXVldWVJdGVtcyk7CisJCQl9CiAJCQlkb3dubG9hZFRv
b2xCYXIuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsR2x1ZSgpKTsKIAkJCWRvd25sb2FkVG9v
bEJhci5hZGQoZG93bmxvYWRJdGVtQ291bnRMYWJlbCk7CiAKQEAgLTIwOSw3ICsyMTAsNyBA
QA0KIAkJCWRvd25sb2FkUHJlZml4VGV4dEZpZWxkLnNldE1pbmltdW1TaXplKGRvd25sb2Fk
VGV4dEZpZWxkLmdldFByZWZlcnJlZFNpemUoKSk7CiAJCQlkb3dubG9hZERpclRleHRGaWVs
ZC5zZXRNaW5pbXVtU2l6ZShkb3dubG9hZFRleHRGaWVsZC5nZXRQcmVmZXJyZWRTaXplKCkp
OwogCi0gICAgICAgICAgICBkb3dubG9hZFRleHRGaWVsZC5zZXREb2N1bWVudChuZXcgSGFu
ZGxlTXVsdGlMaW5lS2V5c0RvY3VtZW50KCkpOworCQkJZG93bmxvYWRUZXh0RmllbGQuc2V0
RG9jdW1lbnQobmV3IEhhbmRsZU11bHRpTGluZUtleXNEb2N1bWVudCgpKTsKIAkJCWRvd25s
b2FkRGlyVGV4dEZpZWxkLnNldFRleHQoQ29yZS5mcm9zdFNldHRpbmdzLmdldFZhbHVlKFNl
dHRpbmdzQ2xhc3MuRElSX0RPV05MT0FEKSk7CiAKIAkJCWRvd25sb2FkRGlyRGVmYXVsdEJh
Y2tncm91bmQgPSBkb3dubG9hZERpclRleHRGaWVsZC5nZXRCYWNrZ3JvdW5kKCk7CkBAIC0y
MTcsNyArMjE4LDcgQEANCiAKIAkJCS8vIGNyZWF0ZSB0aGUgbWFpbiBkb3dubG9hZCBwYW5l
bAogCQkJbW9kZWxUYWJsZSA9IG5ldyBTb3J0ZWRNb2RlbFRhYmxlKG1vZGVsKTsKLSAgICAg
ICAgICAgIG5ldyBUYWJsZUZpbmRBY3Rpb24oKS5pbnN0YWxsKG1vZGVsVGFibGUuZ2V0VGFi
bGUoKSk7CisJCQluZXcgVGFibGVGaW5kQWN0aW9uKCkuaW5zdGFsbChtb2RlbFRhYmxlLmdl
dFRhYmxlKCkpOwogCQkJc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CiAJCQlwYW5l
bEhlYWRlci5hZGQoZG93bmxvYWRUb29sQmFyLCBCb3JkZXJMYXlvdXQuUEFHRV9TVEFSVCk7
CiAJCQlwYW5lbEhlYWRlci5hZGQoZ2IsIEJvcmRlckxheW91dC5DRU5URVIpOwpAQCAtMjI2
LDcgKzIyNyw3IEBADQogCQkJYWRkKG1vZGVsVGFibGUuZ2V0U2Nyb2xsUGFuZSgpLCBCb3Jk
ZXJMYXlvdXQuQ0VOVEVSKTsKIAkJCWZvbnRDaGFuZ2VkKCk7CiAKLSAgICAgICAgICAgIG1v
ZGVsVGFibGUuZ2V0VGFibGUoKS5zZXREZWZhdWx0UmVuZGVyZXIoT2JqZWN0LmNsYXNzLCBu
ZXcgQ2VsbFJlbmRlcmVyKCkpOworCQkJbW9kZWxUYWJsZS5nZXRUYWJsZSgpLnNldERlZmF1
bHRSZW5kZXJlcihPYmplY3QuY2xhc3MsIG5ldyBDZWxsUmVuZGVyZXIoKSk7CiAKIAkJCS8v
IGxpc3RlbmVycwogCQkJZG93bmxvYWRUZXh0RmllbGQuYWRkQWN0aW9uTGlzdGVuZXIobGlz
dGVuZXIpOwpAQCAtMjM2LDIxICsyMzcsMjEgQEANCiAJCQltb2RlbFRhYmxlLmdldFNjcm9s
bFBhbmUoKS5hZGRNb3VzZUxpc3RlbmVyKGxpc3RlbmVyKTsKIAkJCW1vZGVsVGFibGUuZ2V0
VGFibGUoKS5hZGRLZXlMaXN0ZW5lcihsaXN0ZW5lcik7CiAJCQltb2RlbFRhYmxlLmdldFRh
YmxlKCkuYWRkTW91c2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICByZW1vdmVG
aW5pc2hlZERvd25sb2Fkc0NoZWNrQm94LmFkZEl0ZW1MaXN0ZW5lcihsaXN0ZW5lcik7Ci0g
ICAgICAgICAgICBzaG93RXh0ZXJuYWxHbG9iYWxRdWV1ZUl0ZW1zLmFkZEl0ZW1MaXN0ZW5l
cihsaXN0ZW5lcik7CisJCQlyZW1vdmVGaW5pc2hlZERvd25sb2Fkc0NoZWNrQm94LmFkZEl0
ZW1MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQlzaG93RXh0ZXJuYWxHbG9iYWxRdWV1ZUl0ZW1z
LmFkZEl0ZW1MaXN0ZW5lcihsaXN0ZW5lcik7CiAJCQlkb3dubG9hZFByZWZpeEFwcGx5QnV0
dG9uLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKIAkJCWRvd25sb2FkRGlyVGV4dEZp
ZWxkLmFkZEtleUxpc3RlbmVyKGxpc3RlbmVyKTsKIAkJCWRvd25sb2FkRGlyVGV4dEZpZWxk
LmFkZEZvY3VzTGlzdGVuZXIobGlzdGVuZXIpOwogCQkJZG93bmxvYWREaXJTZWxlY3RCdXR0
b24uYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwogCQkJZG93bmxvYWREaXJDcmVhdGVC
dXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwogCQkJZG93bmxvYWREaXJBcHBs
eUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICBDb3Jl
LmZyb3N0U2V0dGluZ3MuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTZXR0aW5nc0NsYXNz
LkZJTEVfTElTVF9GT05UX05BTUUsIGxpc3RlbmVyKTsKLSAgICAgICAgICAgIENvcmUuZnJv
c3RTZXR0aW5ncy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNldHRpbmdzQ2xhc3MuRklM
RV9MSVNUX0ZPTlRfU0laRSwgbGlzdGVuZXIpOwotICAgICAgICAgICAgQ29yZS5mcm9zdFNl
dHRpbmdzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2V0dGluZ3NDbGFzcy5GSUxFX0xJ
U1RfRk9OVF9TVFlMRSwgbGlzdGVuZXIpOworCQkJQ29yZS5mcm9zdFNldHRpbmdzLmFkZFBy
b3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2V0dGluZ3NDbGFzcy5GSUxFX0xJU1RfRk9OVF9OQU1F
LCBsaXN0ZW5lcik7CisJCQlDb3JlLmZyb3N0U2V0dGluZ3MuYWRkUHJvcGVydHlDaGFuZ2VM
aXN0ZW5lcihTZXR0aW5nc0NsYXNzLkZJTEVfTElTVF9GT05UX1NJWkUsIGxpc3RlbmVyKTsK
KwkJCUNvcmUuZnJvc3RTZXR0aW5ncy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNldHRp
bmdzQ2xhc3MuRklMRV9MSVNUX0ZPTlRfU1RZTEUsIGxpc3RlbmVyKTsKIAogCQkJLy9TZXR0
aW5ncwotICAgICAgICAgICAgcmVtb3ZlRmluaXNoZWREb3dubG9hZHNDaGVja0JveC5zZXRT
ZWxlY3RlZChDb3JlLmZyb3N0U2V0dGluZ3MuZ2V0Qm9vbFZhbHVlKFNldHRpbmdzQ2xhc3Mu
RE9XTkxPQURfUkVNT1ZFX0ZJTklTSEVEKSk7Ci0gICAgICAgICAgICBzaG93RXh0ZXJuYWxH
bG9iYWxRdWV1ZUl0ZW1zLnNldFNlbGVjdGVkKENvcmUuZnJvc3RTZXR0aW5ncy5nZXRCb29s
VmFsdWUoU2V0dGluZ3NDbGFzcy5HUV9TSE9XX0VYVEVSTkFMX0lURU1TX0RPV05MT0FEKSk7
CisJCQlyZW1vdmVGaW5pc2hlZERvd25sb2Fkc0NoZWNrQm94LnNldFNlbGVjdGVkKENvcmUu
ZnJvc3RTZXR0aW5ncy5nZXRCb29sVmFsdWUoU2V0dGluZ3NDbGFzcy5ET1dOTE9BRF9SRU1P
VkVfRklOSVNIRUQpKTsKKwkJCXNob3dFeHRlcm5hbEdsb2JhbFF1ZXVlSXRlbXMuc2V0U2Vs
ZWN0ZWQoQ29yZS5mcm9zdFNldHRpbmdzLmdldEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNzLkdR
X1NIT1dfRVhURVJOQUxfSVRFTVNfRE9XTkxPQUQpKTsKIAkJCXNldERvd25sb2FkaW5nQWN0
aXZhdGVkKENvcmUuZnJvc3RTZXR0aW5ncy5nZXRCb29sVmFsdWUoU2V0dGluZ3NDbGFzcy5E
T1dOTE9BRElOR19BQ1RJVkFURUQpKTsKIAogCQkJYXNzaWduSG90a2V5cygpOwpAQCAtMjY4
LDIwICsyNjksMjAgQEANCiAJcHJpdmF0ZSB2b2lkIHJlZnJlc2hMYW5ndWFnZSgpIHsKIAkJ
ZG93bmxvYWRQYXN0ZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChsYW5ndWFnZS5nZXRTdHJpbmco
IkRvd25sb2FkUGFuZS50b29sYmFyLnRvb2x0aXAucGFzdGVLZXlzIikpOwogCQlkb3dubG9h
ZEFjdGl2YXRlQnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93
bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5hY3RpdmF0ZURvd25sb2FkaW5nIikpOwotICAg
ICAgICBkb3dubG9hZFBhdXNlQnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdlLmdldFN0
cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5wYXVzZURvd25sb2FkaW5nIikp
OwotICAgICAgICByZW1vdmVGaW5pc2hlZERvd25sb2Fkc0NoZWNrQm94LnNldFRleHQobGFu
Z3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUucmVtb3ZlRmluaXNoZWREb3dubG9hZHMi
KSk7Ci0gICAgICAgIHNob3dFeHRlcm5hbEdsb2JhbFF1ZXVlSXRlbXMuc2V0VGV4dChsYW5n
dWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS5zaG93RXh0ZXJuYWxHbG9iYWxRdWV1ZUl0
ZW1zIikpOworCQlkb3dubG9hZFBhdXNlQnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdl
LmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5wYXVzZURvd25sb2Fk
aW5nIikpOworCQlyZW1vdmVGaW5pc2hlZERvd25sb2Fkc0NoZWNrQm94LnNldFRleHQobGFu
Z3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUucmVtb3ZlRmluaXNoZWREb3dubG9hZHMi
KSk7CisJCXNob3dFeHRlcm5hbEdsb2JhbFF1ZXVlSXRlbXMuc2V0VGV4dChsYW5ndWFnZS5n
ZXRTdHJpbmcoIkRvd25sb2FkUGFuZS5zaG93RXh0ZXJuYWxHbG9iYWxRdWV1ZUl0ZW1zIikp
OwogCi0gICAgICAgIGRvd25sb2FkVGV4dEZpZWxkLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdl
LmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5hZGRLZXlzIikpOwot
ICAgICAgICBkb3dubG9hZFByZWZpeFRleHRGaWVsZC5zZXRUb29sVGlwVGV4dChsYW5ndWFn
ZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS50b29sYmFyLnRvb2x0aXAuZG93bmxvYWRQcmVm
aXgiKSk7Ci0gICAgICAgIGRvd25sb2FkRGlyVGV4dEZpZWxkLnNldFRvb2xUaXBUZXh0KGxh
bmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5kb3dubG9h
ZERpciIpKTsKKwkJZG93bmxvYWRUZXh0RmllbGQuc2V0VG9vbFRpcFRleHQobGFuZ3VhZ2Uu
Z2V0U3RyaW5nKCJEb3dubG9hZFBhbmUudG9vbGJhci50b29sdGlwLmFkZEtleXMiKSk7CisJ
CWRvd25sb2FkUHJlZml4VGV4dEZpZWxkLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdlLmdldFN0
cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5kb3dubG9hZFByZWZpeCIpKTsK
KwkJZG93bmxvYWREaXJUZXh0RmllbGQuc2V0VG9vbFRpcFRleHQobGFuZ3VhZ2UuZ2V0U3Ry
aW5nKCJEb3dubG9hZFBhbmUudG9vbGJhci50b29sdGlwLmRvd25sb2FkRGlyIikpOwogCi0g
ICAgICAgIGRvd25sb2FkUHJlZml4QXBwbHlCdXR0b24uc2V0VG9vbFRpcFRleHQobGFuZ3Vh
Z2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUudG9vbGJhci50b29sdGlwLmFwcGx5RG93bmxv
YWRQcmVmaXgiKSk7Ci0gICAgICAgIGRvd25sb2FkRGlyU2VsZWN0QnV0dG9uLnNldFRvb2xU
aXBUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRp
cC5zZWxlY3REb3dubG9hZERpciIpKTsKLSAgICAgICAgZG93bmxvYWREaXJDcmVhdGVCdXR0
b24uc2V0VG9vbFRpcFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUudG9v
bGJhci50b29sdGlwLmNyZWF0ZURvd25sb2FkRGlyIikpOwotICAgICAgICBkb3dubG9hZERp
ckFwcGx5QnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxv
YWRQYW5lLnRvb2xiYXIudG9vbHRpcC5hcHBseURvd25sb2FkRGlyIikpOworCQlkb3dubG9h
ZFByZWZpeEFwcGx5QnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdlLmdldFN0cmluZygi
RG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5hcHBseURvd25sb2FkUHJlZml4IikpOwor
CQlkb3dubG9hZERpclNlbGVjdEJ1dHRvbi5zZXRUb29sVGlwVGV4dChsYW5ndWFnZS5nZXRT
dHJpbmcoIkRvd25sb2FkUGFuZS50b29sYmFyLnRvb2x0aXAuc2VsZWN0RG93bmxvYWREaXIi
KSk7CisJCWRvd25sb2FkRGlyQ3JlYXRlQnV0dG9uLnNldFRvb2xUaXBUZXh0KGxhbmd1YWdl
LmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIudG9vbHRpcC5jcmVhdGVEb3dubG9h
ZERpciIpKTsKKwkJZG93bmxvYWREaXJBcHBseUJ1dHRvbi5zZXRUb29sVGlwVGV4dChsYW5n
dWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS50b29sYmFyLnRvb2x0aXAuYXBwbHlEb3du
bG9hZERpciIpKTsKIAotICAgICAgICBkb3dubG9hZERpclJlY2VudE1lbnUuc2V0VGV4dChs
YW5ndWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS50b29sYmFyLmRvd25sb2FkRGlyTWVu
dS5zZXREb3dubG9hZERpclRvIikpOworCQlkb3dubG9hZERpclJlY2VudE1lbnUuc2V0VGV4
dChsYW5ndWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS50b29sYmFyLmRvd25sb2FkRGly
TWVudS5zZXREb3dubG9hZERpclRvIikpOwogCiAJCWRvd25sb2FkUXVpY2tsb2FkTGFiZWwu
c2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS50b29sYmFyLmxhYmVs
LmRvd25sb2FkUXVpY2tsb2FkIikgKyAiOiAiKTsKIAkJZG93bmxvYWRQcmVmaXhMYWJlbC5z
ZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIubGFiZWwu
ZG93bmxvYWRQcmVmaXgiKSArICI6ICIpOwpAQCAtMjk5LDg2NyArMzAwLDg4NiBAQA0KIAl9
CiAKIAlwcml2YXRlIHZvaWQgdXBkYXRlRG93bmxvYWREaXJUZXh0RmllbGRCYWNrZ3JvdW5k
KCkgewotCSAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZShkb3dubG9hZERpclRleHRG
aWVsZC5nZXRUZXh0KCkpOwotCSAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JICAg
ICAgICBkb3dubG9hZERpclRleHRGaWVsZC5zZXRCYWNrZ3JvdW5kKGRvd25sb2FkRGlyRGVm
YXVsdEJhY2tncm91bmQpOwotCSAgICB9IGVsc2UgewotCSAgICAgICAgZG93bmxvYWREaXJU
ZXh0RmllbGQuc2V0QmFja2dyb3VuZChDb2xvci5SRUQpOwotCSAgICB9CisJCWZpbmFsIEZp
bGUgZmlsZSA9IG5ldyBGaWxlKGRvd25sb2FkRGlyVGV4dEZpZWxkLmdldFRleHQoKSk7CisJ
CWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKwkJCWRvd25sb2FkRGlyVGV4dEZpZWxkLnNl
dEJhY2tncm91bmQoZG93bmxvYWREaXJEZWZhdWx0QmFja2dyb3VuZCk7CisJCX0gZWxzZSB7
CisJCQlkb3dubG9hZERpclRleHRGaWVsZC5zZXRCYWNrZ3JvdW5kKENvbG9yLlJFRCk7CisJ
CX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgZG93bmxvYWREaXJUZXh0RmllbGRfa2V5UmVsZWFz
ZWQoZmluYWwgS2V5RXZlbnQgZSkgewotCSAgICB1cGRhdGVEb3dubG9hZERpclRleHRGaWVs
ZEJhY2tncm91bmQoKTsKKwkJdXBkYXRlRG93bmxvYWREaXJUZXh0RmllbGRCYWNrZ3JvdW5k
KCk7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIGRvd25sb2FkRGlyVGV4dEZpZWxkX2ZvY3VzTG9z
dChmaW5hbCBGb2N1c0V2ZW50IGUpIHsKLQkgICAgZmluYWwgU3RyaW5nIGRpciA9IGRvd25s
b2FkRGlyVGV4dEZpZWxkLmdldFRleHQoKTsKKwkJZmluYWwgU3RyaW5nIGRpciA9IGRvd25s
b2FkRGlyVGV4dEZpZWxkLmdldFRleHQoKTsKIAotCSAgICB1cGRhdGVEb3dubG9hZERpclRl
eHRGaWVsZEJhY2tncm91bmQoKTsKLSAgICAgICAgICAgIH0KKwkJdXBkYXRlRG93bmxvYWRE
aXJUZXh0RmllbGRCYWNrZ3JvdW5kKCk7CisJfQogCiAJcHJpdmF0ZSBmaW5hbCBTdHJpbmcg
Z2V0RG93bmxvYWRQcmVmaXgoKSB7CiAJCXJldHVybiBkb3dubG9hZFByZWZpeFRleHRGaWVs
ZC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICB9CisJfQogCiAJcHJpdmF0ZSBmaW5hbCBTdHJp
bmcgZ2V0RG93bmxvYWREaXIoKSB7CiAJCWZpbmFsIFN0cmluZyBkaXIgPSBkb3dubG9hZERp
clRleHRGaWVsZC5nZXRUZXh0KCk7CiAKLSAgICAgICAgaWYgKGRpci5sZW5ndGgoKSA9PSAw
KSB7Ci0gICAgICAgIAlyZXR1cm4gbnVsbDsKKwkJaWYgKGRpci5sZW5ndGgoKSA9PSAwKSB7
CisJCQlyZXR1cm4gbnVsbDsKIAkJfSBlbHNlIHsKLSAgICAgICAgCXJldHVybiBkaXI7Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisJCQlyZXR1cm4gZGly
OworCQl9CisJfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRvd25sb2FkRGlyU2VsZWN0QnV0dG9u
X2FjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIGZpbmFs
IEpGaWxlQ2hvb3NlciBmYyA9IG5ldyBKRmlsZUNob29zZXIoRmlsZUFjY2Vzcy5hcHBlbmRT
ZXBhcmF0b3IoZG93bmxvYWREaXJUZXh0RmllbGQuZ2V0VGV4dCgpKSk7Ci0gICAgICAgIGZj
LnNldERpYWxvZ1RpdGxlKGxhbmd1YWdlLmdldFN0cmluZygiT3B0aW9ucy5kb3dubG9hZHMu
ZmlsZWNob29zZXIudGl0bGUiKSk7Ci0gICAgICAgIGZjLnNldEZpbGVIaWRpbmdFbmFibGVk
KHRydWUpOwotICAgICAgICBmYy5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIu
RElSRUNUT1JJRVNfT05MWSk7Ci0gICAgICAgIGZjLnNldE11bHRpU2VsZWN0aW9uRW5hYmxl
ZChmYWxzZSk7CisJcHJpdmF0ZSB2b2lkIGRvd25sb2FkRGlyU2VsZWN0QnV0dG9uX2FjdGlv
blBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7CisJCWZpbmFsIEpGaWxlQ2hvb3Nl
ciBmYyA9IG5ldyBKRmlsZUNob29zZXIoRmlsZUFjY2Vzcy5hcHBlbmRTZXBhcmF0b3IoZG93
bmxvYWREaXJUZXh0RmllbGQuZ2V0VGV4dCgpKSk7CisJCWZjLnNldERpYWxvZ1RpdGxlKGxh
bmd1YWdlLmdldFN0cmluZygiT3B0aW9ucy5kb3dubG9hZHMuZmlsZWNob29zZXIudGl0bGUi
KSk7CisJCWZjLnNldEZpbGVIaWRpbmdFbmFibGVkKHRydWUpOworCQlmYy5zZXRGaWxlU2Vs
ZWN0aW9uTW9kZShKRmlsZUNob29zZXIuRElSRUNUT1JJRVNfT05MWSk7CisJCWZjLnNldE11
bHRpU2VsZWN0aW9uRW5hYmxlZChmYWxzZSk7CiAKLSAgICAgICAgZmluYWwgaW50IHJldHVy
blZhbCA9IGZjLnNob3dPcGVuRGlhbG9nKHRoaXMpOwotICAgICAgICBpZiAocmV0dXJuVmFs
ID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgZmluYWwg
RmlsZSBmaWxlID0gZmMuZ2V0U2VsZWN0ZWRGaWxlKCk7Ci0gICAgICAgICAgICBDb3JlLmZy
b3N0U2V0dGluZ3Muc2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5ESVJfTEFTVF9VU0VELCBmaWxl
LmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgIGRvd25sb2FkRGlyVGV4dEZpZWxkLnNldFRl
eHQoZmlsZS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgdXBkYXRlRG93bmxvYWREaXJUZXh0
RmllbGRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICB9CisJCWZpbmFsIGludCByZXR1cm5WYWwgPSBmYy5zaG93T3BlbkRpYWxvZyh0aGlz
KTsKKwkJaWYgKHJldHVyblZhbCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsK
KwkJCWZpbmFsIEZpbGUgZmlsZSA9IGZjLmdldFNlbGVjdGVkRmlsZSgpOworCQkJQ29yZS5m
cm9zdFNldHRpbmdzLnNldFZhbHVlKFNldHRpbmdzQ2xhc3MuRElSX0xBU1RfVVNFRCwgZmls
ZS5nZXRQYXJlbnQoKSk7CisJCQlkb3dubG9hZERpclRleHRGaWVsZC5zZXRUZXh0KGZpbGUu
Z2V0UGF0aCgpKTsKKwkJCXVwZGF0ZURvd25sb2FkRGlyVGV4dEZpZWxkQmFja2dyb3VuZCgp
OworCQl9CisJfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRvd25sb2FkRGlyQ3JlYXRlQnV0dG9u
X2FjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7Ci0gICAgCUZpbGUgZGly
ID0gbmV3IEZpbGUoZG93bmxvYWREaXJUZXh0RmllbGQuZ2V0VGV4dCgpKTsKKwlwcml2YXRl
IHZvaWQgZG93bmxvYWREaXJDcmVhdGVCdXR0b25fYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFj
dGlvbkV2ZW50IGUpIHsKKwkJRmlsZSBkaXIgPSBuZXcgRmlsZShkb3dubG9hZERpclRleHRG
aWVsZC5nZXRUZXh0KCkpOwogCi0gICAgCXRyeSB7Ci0gICAgCQlkaXIubWtkaXJzKCk7Ci0g
ICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBmb28pIHsKLSAgICAgICAgICAgICAgICB9CisJCXRy
eSB7CisJCQlkaXIubWtkaXJzKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBmb28pIHsKKwkJ
fQogCi0gICAgCXVwZGF0ZURvd25sb2FkRGlyVGV4dEZpZWxkQmFja2dyb3VuZCgpOwotICAg
ICAgICAgICAgICAgIH0KKwkJdXBkYXRlRG93bmxvYWREaXJUZXh0RmllbGRCYWNrZ3JvdW5k
KCk7CisJfQogCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5RG93bmxvYWRQcmVmaXhUb1NlbGVj
dGVkRG93bmxvYWRzKCkgewotICAgICAgICBmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0
ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7CisJcHJpdmF0ZSB2b2lkIGFw
cGx5RG93bmxvYWRQcmVmaXhUb1NlbGVjdGVkRG93bmxvYWRzKCkgeworCQlmaW5hbCBNb2Rl
bEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7
CiAKLSAgICAgICAgZm9yIChmaW5hbCBNb2RlbEl0ZW0gbWkgOiBzZWxlY3RlZEl0ZW1zKSB7
Ci0gICAgICAgICAgICBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpID0gKEZyb3N0RG93bmxv
YWRJdGVtKW1pOworCQlmb3IgKGZpbmFsIE1vZGVsSXRlbSBtaSA6IHNlbGVjdGVkSXRlbXMp
IHsKKwkJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGkgPSAoRnJvc3REb3dubG9hZEl0ZW0p
bWk7CiAKLSAgICAgICAgICAgIGlmICghaS5pc0V4dGVybmFsKCkpIHsKLSAgICAgICAgICAg
IAlpLnNldEZpbGVuYW1lUHJlZml4KGdldERvd25sb2FkUHJlZml4KCkpOwotICAgICAgICAg
ICAgICAgIGkuZmlyZVZhbHVlQ2hhbmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgIHByaXZhdGUgdm9p
ZCBhcHBseURvd25sb2FkRGlyVG9TZWxlY3RlZERvd25sb2FkcygpIHsKLSAgICAgICAgZmlu
YWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJ
dGVtcygpOworCQkJaWYgKCFpLmlzRXh0ZXJuYWwoKSkgeworCQkJCWkuc2V0RmlsZW5hbWVQ
cmVmaXgoZ2V0RG93bmxvYWRQcmVmaXgoKSk7CisJCQkJaS5maXJlVmFsdWVDaGFuZ2VkKCk7
CisJCQl9CisJCX0KKwl9CiAKLSAgICAgICAgZm9yIChmaW5hbCBNb2RlbEl0ZW0gbWkgOiBz
ZWxlY3RlZEl0ZW1zKSB7Ci0gICAgICAgICAgICBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBp
ID0gKEZyb3N0RG93bmxvYWRJdGVtKW1pOworCXByaXZhdGUgdm9pZCBhcHBseURvd25sb2Fk
RGlyVG9TZWxlY3RlZERvd25sb2FkcygpIHsKKwkJZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0
ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOwogCi0gICAgICAgICAg
ICBpZiAoIWkuaXNFeHRlcm5hbCgpKSB7Ci0gICAgICAgICAgICAgICAgaS5zZXREb3dubG9h
ZERpcihnZXREb3dubG9hZERpcigpKTsKLSAgICAgICAgICAgICAgICBpLmZpcmVWYWx1ZUNo
YW5nZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQlmb3IgKGZpbmFsIE1vZGVs
SXRlbSBtaSA6IHNlbGVjdGVkSXRlbXMpIHsKKwkJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVt
IGkgPSAoRnJvc3REb3dubG9hZEl0ZW0pbWk7CisKKwkJCWlmICghaS5pc0V4dGVybmFsKCkp
IHsKKwkJCQlpLnNldERvd25sb2FkRGlyKGdldERvd25sb2FkRGlyKCkpOworCQkJCWkuZmly
ZVZhbHVlQ2hhbmdlZCgpOworCQkJfQorCQl9CiAJfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRv
d25sb2FkRGlyQXBwbHlCdXR0b25fYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50
IGUpIHsKLSAgICAgICAgYXBwbHlEb3dubG9hZERpclRvU2VsZWN0ZWREb3dubG9hZHMoKTsK
LSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGRvd25sb2FkUHJlZml4QXBwbHlCdXR0
b25fYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgYXBw
bHlEb3dubG9hZFByZWZpeFRvU2VsZWN0ZWREb3dubG9hZHMoKTsKLSAgICB9CisJcHJpdmF0
ZSB2b2lkIGRvd25sb2FkRGlyQXBwbHlCdXR0b25fYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFj
dGlvbkV2ZW50IGUpIHsKKwkJYXBwbHlEb3dubG9hZERpclRvU2VsZWN0ZWREb3dubG9hZHMo
KTsKKwl9CiAKKwlwcml2YXRlIHZvaWQgZG93bmxvYWRQcmVmaXhBcHBseUJ1dHRvbl9hY3Rp
b25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgeworCQlhcHBseURvd25sb2FkUHJl
Zml4VG9TZWxlY3RlZERvd25sb2FkcygpOworCX0KKwkKKwkKKwogCS8qKgogCSAqIGRvd25s
b2FkVGV4dEZpZWxkIEFjdGlvbiBMaXN0ZW5lciAoRG93bmxvYWQvUXVpY2tsb2FkKQotICAg
ICAqIFRoZSB0ZXh0ZmllbGQgY2FuIGNvbnRhaW4gMSBrZXkgdG8gZG93bmxvYWQgb3IgbXVs
dGlwbGUga2V5cyBzZXBhcmF0ZWQgYnkgJzsnLgorCSAqIFRoZSB0ZXh0ZmllbGQgY2FuIGNv
bnRhaW4gMSBrZXkgdG8gZG93bmxvYWQgb3IgbXVsdGlwbGUga2V5cyBzZXBhcmF0ZWQgYnkg
JzsnLgogCSAqLwotCXByaXZhdGUgdm9pZCBkb3dubG9hZFRleHRGaWVsZF9hY3Rpb25QZXJm
b3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgewotCQlEb3dubG9hZE1hbmFnZXIgZGxNYW5h
Z2VyID0gRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0RG93bmxvYWRNYW5hZ2VyKCk7
CisJIHByaXZhdGUgdm9pZCBkb3dubG9hZFRleHRGaWVsZF9hY3Rpb25QZXJmb3JtZWQoZmlu
YWwgQWN0aW9uRXZlbnQgZSkgeworCQkgCisJCSBTdHJpbmcga2V5bGlzdCA9IGRvd25sb2Fk
VGV4dEZpZWxkLmdldFRleHQoKTsKKwkJIAorCQkgTGlzdDxGcm9zdERvd25sb2FkSXRlbT4g
ZnJvc3REb3dubG9hZEl0ZW1MaXN0ID0gRG93bmxvYWRNYW5hZ2VyLnBhcnNlS2V5cyhrZXls
aXN0KTsKIAotCQlkbE1hbmFnZXIuYWRkUmVjZW50RG93bmxvYWREaXIoZ2V0RG93bmxvYWRE
aXIoKSk7Ci0gICAgCWRsTWFuYWdlci5hZGRLZXlzKGRvd25sb2FkVGV4dEZpZWxkLmdldFRl
eHQoKSwgZ2V0RG93bmxvYWREaXIoKSwgZ2V0RG93bmxvYWRQcmVmaXgoKSk7Ci0gICAgICAg
IGRvd25sb2FkVGV4dEZpZWxkLnNldFRleHQoIiIpOwotICAgIH0KKwkJIGZpbmFsIEFkZE5l
d0Rvd25sb2Fkc0RpYWxvZyBhZGROZXdEb3dubG9hZHNEaWFsb2cgPSBuZXcgQWRkTmV3RG93
bmxvYWRzRGlhbG9nKAorCQkJCSBNYWluRnJhbWUuZ2V0SW5zdGFuY2UoKSwgZnJvc3REb3du
bG9hZEl0ZW1MaXN0KTsKKwkJIGZyb3N0RG93bmxvYWRJdGVtTGlzdCA9IGFkZE5ld0Rvd25s
b2Fkc0RpYWxvZy5zdGFydERpYWxvZyhmcm9zdERvd25sb2FkSXRlbUxpc3QpOwogCi0JLyoq
Ci0JICogR2V0IGtleVR5cGVkIGZvciBkb3dubG9hZFRhYmxlCi0JICovCi0JcHJpdmF0ZSB2
b2lkIGRvd25sb2FkVGFibGVfa2V5UHJlc3NlZChmaW5hbCBLZXlFdmVudCBlKSB7Ci0JCWZp
bmFsIGNoYXIga2V5ID0gZS5nZXRLZXlDaGFyKCk7Ci0JCWlmIChrZXkgPT0gS2V5RXZlbnQu
VktfREVMRVRFICYmICFtb2RlbFRhYmxlLmdldFRhYmxlKCkuaXNFZGl0aW5nKCkpIHsKLSAg
ICAgICAgICAgIHJlbW92ZVNlbGVjdGVkRG93bmxvYWRzKCk7Ci0JCX0KLQl9CiAKLSAgICBw
cml2YXRlIHZvaWQgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHMoKSB7Ci0gICAgICAgIGZpbmFs
IE1vZGVsSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSBtb2RlbFRhYmxlLmdldFNlbGVjdGVkSXRl
bXMoKTsKKwkJIERvd25sb2FkTW9kZWwgZG93bmxvYWRNb2RlbCA9IEZpbGVUcmFuc2Zlck1h
bmFnZXIuaW5zdCgpLmdldERvd25sb2FkTWFuYWdlcigpLmdldE1vZGVsKCk7CisJCSBmb3Io
ZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZnJvc3REb3dubG9hZEl0ZW0gOiBmcm9zdERvd25s
b2FkSXRlbUxpc3QgKSB7CisJCQkgZG93bmxvYWRNb2RlbC5hZGREb3dubG9hZEl0ZW0oZnJv
c3REb3dubG9hZEl0ZW0pOworCQkgfQorCSB9CiAKLSAgICAgICAgZmluYWwgTGlzdDxTdHJp
bmc+IGV4dGVybmFsUmVxdWVzdHNUb1JlbW92ZSA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4o
KTsKLSAgICAgICAgZmluYWwgTGlzdDxNb2RlbEl0ZW0+IHJlcXVlc3RzVG9SZW1vdmUgPSBu
ZXcgTGlua2VkTGlzdDxNb2RlbEl0ZW0+KCk7Ci0gICAgICAgIGZvciggZmluYWwgTW9kZWxJ
dGVtIG1pIDogc2VsZWN0ZWRJdGVtcyApIHsKLSAgICAgICAgICAgIGZpbmFsIEZyb3N0RG93
bmxvYWRJdGVtIGkgPSAoRnJvc3REb3dubG9hZEl0ZW0pbWk7Ci0gICAgICAgICAgICByZXF1
ZXN0c1RvUmVtb3ZlLmFkZChtaSk7Ci0gICAgICAgICAgICBpZiggaS5pc0V4dGVybmFsKCkg
KSB7Ci0gICAgICAgICAgICAgICAgZXh0ZXJuYWxSZXF1ZXN0c1RvUmVtb3ZlLmFkZChpLmdl
dEdxSWRlbnRpZmllcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCSAvKioKKwkg
ICogR2V0IGtleVR5cGVkIGZvciBkb3dubG9hZFRhYmxlCisJICAqLworCSBwcml2YXRlIHZv
aWQgZG93bmxvYWRUYWJsZV9rZXlQcmVzc2VkKGZpbmFsIEtleUV2ZW50IGUpIHsKKwkJIGZp
bmFsIGNoYXIga2V5ID0gZS5nZXRLZXlDaGFyKCk7CisJCSBpZiAoa2V5ID09IEtleUV2ZW50
LlZLX0RFTEVURSAmJiAhbW9kZWxUYWJsZS5nZXRUYWJsZSgpLmlzRWRpdGluZygpKSB7CisJ
CQkgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHMoKTsKKwkJIH0KKwkgfQogCi0gICAgICAgIGZp
bmFsIE1vZGVsSXRlbVtdIHJpID0gcmVxdWVzdHNUb1JlbW92ZS50b0FycmF5KG5ldyBNb2Rl
bEl0ZW1bcmVxdWVzdHNUb1JlbW92ZS5zaXplKCldKTsKLSAgICAgICAgbW9kZWwucmVtb3Zl
SXRlbXMocmkpOworCSBwcml2YXRlIHZvaWQgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHMoKSB7
CisJCSBmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRT
ZWxlY3RlZEl0ZW1zKCk7CiAKLSAgICAgICAgbW9kZWxUYWJsZS5nZXRUYWJsZSgpLmNsZWFy
U2VsZWN0aW9uKCk7CisJCSBmaW5hbCBMaXN0PFN0cmluZz4gZXh0ZXJuYWxSZXF1ZXN0c1Rv
UmVtb3ZlID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworCQkgZmluYWwgTGlzdDxNb2Rl
bEl0ZW0+IHJlcXVlc3RzVG9SZW1vdmUgPSBuZXcgTGlua2VkTGlzdDxNb2RlbEl0ZW0+KCk7
CisJCSBmb3IoIGZpbmFsIE1vZGVsSXRlbSBtaSA6IHNlbGVjdGVkSXRlbXMgKSB7CisJCQkg
ZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaSA9IChGcm9zdERvd25sb2FkSXRlbSltaTsKKwkJ
CSByZXF1ZXN0c1RvUmVtb3ZlLmFkZChtaSk7CisJCQkgaWYoIGkuaXNFeHRlcm5hbCgpICkg
eworCQkJCSBleHRlcm5hbFJlcXVlc3RzVG9SZW1vdmUuYWRkKGkuZ2V0R3FJZGVudGlmaWVy
KCkpOworCQkJIH0KKwkJIH0KIAotICAgICAgICBpZiggRmlsZVRyYW5zZmVyTWFuYWdlci5p
bnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkgIT0gbnVsbCAmJiBleHRlcm5hbFJlcXVl
c3RzVG9SZW1vdmUuc2l6ZSgpID4gMCApIHsKLSAgICAgICAgICAgIG5ldyBUaHJlYWQoKSB7
Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZv
aWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBGaWxlVHJhbnNmZXJNYW5hZ2VyLmlu
c3QoKS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKS5yZW1vdmVSZXF1ZXN0cyhleHRlcm5hbFJl
cXVlc3RzVG9SZW1vdmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0uc3Rh
cnQoKTsKLSAgICAgICAgfQotICAgIH0KKwkJIGZpbmFsIE1vZGVsSXRlbVtdIHJpID0gcmVx
dWVzdHNUb1JlbW92ZS50b0FycmF5KG5ldyBNb2RlbEl0ZW1bcmVxdWVzdHNUb1JlbW92ZS5z
aXplKCldKTsKKwkJIG1vZGVsLnJlbW92ZUl0ZW1zKHJpKTsKIAotCXB1YmxpYyBib29sZWFu
IGlzRG93bmxvYWRpbmdBY3RpdmF0ZWQoKSB7Ci0JCXJldHVybiBkb3dubG9hZGluZ0FjdGl2
YXRlZDsKLQl9CisJCSBtb2RlbFRhYmxlLmdldFRhYmxlKCkuY2xlYXJTZWxlY3Rpb24oKTsK
IAotCXB1YmxpYyB2b2lkIHNldERvd25sb2FkaW5nQWN0aXZhdGVkKGZpbmFsIGJvb2xlYW4g
YikgewotCQlkb3dubG9hZGluZ0FjdGl2YXRlZCA9IGI7CisJCSBpZiggRmlsZVRyYW5zZmVy
TWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkgIT0gbnVsbCAmJiBleHRl
cm5hbFJlcXVlc3RzVG9SZW1vdmUuc2l6ZSgpID4gMCApIHsKKwkJCSBuZXcgVGhyZWFkKCkg
eworCQkJCSBAT3ZlcnJpZGUKKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkgRmls
ZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkucmVtb3Zl
UmVxdWVzdHMoZXh0ZXJuYWxSZXF1ZXN0c1RvUmVtb3ZlKTsKKwkJCQkgfQorCQkJIH0uc3Rh
cnQoKTsKKwkJIH0KKwkgfQogCi0gICAgICAgIGRvd25sb2FkQWN0aXZhdGVCdXR0b24uc2V0
RW5hYmxlZCghZG93bmxvYWRpbmdBY3RpdmF0ZWQpOwotICAgICAgICBkb3dubG9hZFBhdXNl
QnV0dG9uLnNldEVuYWJsZWQoZG93bmxvYWRpbmdBY3RpdmF0ZWQpOwotCX0KKwkgcHVibGlj
IGJvb2xlYW4gaXNEb3dubG9hZGluZ0FjdGl2YXRlZCgpIHsKKwkJIHJldHVybiBkb3dubG9h
ZGluZ0FjdGl2YXRlZDsKKwkgfQogCi0JcHVibGljIHZvaWQgc2V0RG93bmxvYWRJdGVtQ291
bnQoZmluYWwgaW50IG5ld0Rvd25sb2FkSXRlbUNvdW50KSB7Ci0JCWRvd25sb2FkSXRlbUNv
dW50ID0gbmV3RG93bmxvYWRJdGVtQ291bnQ7CisJIHB1YmxpYyB2b2lkIHNldERvd25sb2Fk
aW5nQWN0aXZhdGVkKGZpbmFsIGJvb2xlYW4gYikgeworCQkgZG93bmxvYWRpbmdBY3RpdmF0
ZWQgPSBiOwogCi0JCWZpbmFsIFN0cmluZyBzID0KLQkJCW5ldyBTdHJpbmdCdWlsZGVyKCkK
LQkJCQkuYXBwZW5kKGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLnRvb2xiYXIu
d2FpdGluZyIpKQotCQkJCS5hcHBlbmQoIjogIikKLQkJCQkuYXBwZW5kKGRvd25sb2FkSXRl
bUNvdW50KQotCQkJCS50b1N0cmluZygpOwotCQlkb3dubG9hZEl0ZW1Db3VudExhYmVsLnNl
dFRleHQocyk7Ci0JfQorCQkgZG93bmxvYWRBY3RpdmF0ZUJ1dHRvbi5zZXRFbmFibGVkKCFk
b3dubG9hZGluZ0FjdGl2YXRlZCk7CisJCSBkb3dubG9hZFBhdXNlQnV0dG9uLnNldEVuYWJs
ZWQoZG93bmxvYWRpbmdBY3RpdmF0ZWQpOworCSB9CiAKLQlwcml2YXRlIFBvcHVwTWVudURv
d25sb2FkIGdldFBvcHVwTWVudURvd25sb2FkKCkgewotCQlpZiAocG9wdXBNZW51RG93bmxv
YWQgPT0gbnVsbCkgewotCQkJcG9wdXBNZW51RG93bmxvYWQgPSBuZXcgUG9wdXBNZW51RG93
bmxvYWQoKTsKLQkJCWxhbmd1YWdlLmFkZExhbmd1YWdlTGlzdGVuZXIocG9wdXBNZW51RG93
bmxvYWQpOwotCQl9Ci0JCXJldHVybiBwb3B1cE1lbnVEb3dubG9hZDsKLQl9CisJIHB1Ymxp
YyB2b2lkIHNldERvd25sb2FkSXRlbUNvdW50KGZpbmFsIGludCBuZXdEb3dubG9hZEl0ZW1D
b3VudCkgeworCQkgZG93bmxvYWRJdGVtQ291bnQgPSBuZXdEb3dubG9hZEl0ZW1Db3VudDsK
IAotCXByaXZhdGUgdm9pZCBzaG93RG93bmxvYWRUYWJsZVBvcHVwTWVudShmaW5hbCBNb3Vz
ZUV2ZW50IGUpIHsKLSAgICAgICAgLy8gc2VsZWN0IHJvdyB3aGVyZSByaWdodGNsaWNrIG9j
Y3VycmVkIGlmIHJvdyB1bmRlciBtb3VzZSBpcyBOT1Qgc2VsZWN0ZWQKLSAgICAgICAgZmlu
YWwgUG9pbnQgcCA9IGUuZ2V0UG9pbnQoKTsKLSAgICAgICAgZmluYWwgaW50IHkgPSBtb2Rl
bFRhYmxlLmdldFRhYmxlKCkucm93QXRQb2ludChwKTsKLSAgICAgICAgaWYoIHkgPCAwICkg
ewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmKCAhbW9kZWxU
YWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbk1vZGVsKCkuaXNTZWxlY3RlZEluZGV4KHkp
ICkgewotICAgICAgICAgICAgbW9kZWxUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbk1v
ZGVsKCkuc2V0U2VsZWN0aW9uSW50ZXJ2YWwoeSwgeSk7Ci0gICAgICAgIH0KLQkJZ2V0UG9w
dXBNZW51RG93bmxvYWQoKS5zaG93KGUuZ2V0Q29tcG9uZW50KCksIGUuZ2V0WCgpLCBlLmdl
dFkoKSk7Ci0JfQorCQkgZmluYWwgU3RyaW5nIHMgPQorCQkJIG5ldyBTdHJpbmdCdWlsZGVy
KCkKKwkJCQkgLmFwcGVuZChsYW5ndWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS50b29s
YmFyLndhaXRpbmciKSkKKwkJCQkgLmFwcGVuZCgiOiAiKQorCQkJCSAuYXBwZW5kKGRvd25s
b2FkSXRlbUNvdW50KQorCQkJCSAudG9TdHJpbmcoKTsKKwkJIGRvd25sb2FkSXRlbUNvdW50
TGFiZWwuc2V0VGV4dChzKTsKKwkgfQogCi0JcHJpdmF0ZSB2b2lkIGZvbnRDaGFuZ2VkKCkg
ewotCQlmaW5hbCBTdHJpbmcgZm9udE5hbWUgPSBDb3JlLmZyb3N0U2V0dGluZ3MuZ2V0VmFs
dWUoU2V0dGluZ3NDbGFzcy5GSUxFX0xJU1RfRk9OVF9OQU1FKTsKLQkJZmluYWwgaW50IGZv
bnRTdHlsZSA9IENvcmUuZnJvc3RTZXR0aW5ncy5nZXRJbnRWYWx1ZShTZXR0aW5nc0NsYXNz
LkZJTEVfTElTVF9GT05UX1NUWUxFKTsKLQkJZmluYWwgaW50IGZvbnRTaXplID0gQ29yZS5m
cm9zdFNldHRpbmdzLmdldEludFZhbHVlKFNldHRpbmdzQ2xhc3MuRklMRV9MSVNUX0ZPTlRf
U0laRSk7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGZvbnROYW1lLCBmb250U3R5bGUsIGZv
bnRTaXplKTsKLQkJaWYgKCFmb250LmdldEZhbWlseSgpLmVxdWFscyhmb250TmFtZSkpIHsK
LQkJCWxvZ2dlci5zZXZlcmUoIlRoZSBzZWxlY3RlZCBmb250IHdhcyBub3QgZm91bmQgaW4g
eW91ciBzeXN0ZW1cbiIgKwotCQkJCQkJICAgIlRoYXQgc2VsZWN0aW9uIHdpbGwgYmUgY2hh
bmdlZCB0byBcIlNhbnNTZXJpZlwiLiIpOwotICAgICAgICAgICAgQ29yZS5mcm9zdFNldHRp
bmdzLnNldFZhbHVlKFNldHRpbmdzQ2xhc3MuRklMRV9MSVNUX0ZPTlRfTkFNRSwgIlNhbnNT
ZXJpZiIpOwotCQkJZm9udCA9IG5ldyBGb250KCJTYW5zU2VyaWYiLCBmb250U3R5bGUsIGZv
bnRTaXplKTsKLQkJfQotCQltb2RlbFRhYmxlLnNldEZvbnQoZm9udCk7Ci0JfQorCSBwcml2
YXRlIFBvcHVwTWVudURvd25sb2FkIGdldFBvcHVwTWVudURvd25sb2FkKCkgeworCQkgaWYg
KHBvcHVwTWVudURvd25sb2FkID09IG51bGwpIHsKKwkJCSBwb3B1cE1lbnVEb3dubG9hZCA9
IG5ldyBQb3B1cE1lbnVEb3dubG9hZCgpOworCQkJIGxhbmd1YWdlLmFkZExhbmd1YWdlTGlz
dGVuZXIocG9wdXBNZW51RG93bmxvYWQpOworCQkgfQorCQkgcmV0dXJuIHBvcHVwTWVudURv
d25sb2FkOworCSB9CiAKLQlwcml2YXRlIHZvaWQgZG93bmxvYWRQYXN0ZUJ1dHRvblByZXNz
ZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgewotCQlUcmFuc2ZlcmFibGUgdCA9IFRvb2xraXQu
Z2V0RGVmYXVsdFRvb2xraXQoKS5nZXRTeXN0ZW1DbGlwYm9hcmQoKS5nZXRDb250ZW50cyhu
dWxsKTsKLQkJU3RyaW5nIHRleHQ7CisJIHByaXZhdGUgdm9pZCBzaG93RG93bmxvYWRUYWJs
ZVBvcHVwTWVudShmaW5hbCBNb3VzZUV2ZW50IGUpIHsKKwkJIC8vIHNlbGVjdCByb3cgd2hl
cmUgcmlnaHRjbGljayBvY2N1cnJlZCBpZiByb3cgdW5kZXIgbW91c2UgaXMgTk9UIHNlbGVj
dGVkCisJCSBmaW5hbCBQb2ludCBwID0gZS5nZXRQb2ludCgpOworCQkgZmluYWwgaW50IHkg
PSBtb2RlbFRhYmxlLmdldFRhYmxlKCkucm93QXRQb2ludChwKTsKKwkJIGlmKCB5IDwgMCAp
IHsKKwkJCSByZXR1cm47CisJCSB9CisJCSBpZiggIW1vZGVsVGFibGUuZ2V0VGFibGUoKS5n
ZXRTZWxlY3Rpb25Nb2RlbCgpLmlzU2VsZWN0ZWRJbmRleCh5KSApIHsKKwkJCSBtb2RlbFRh
YmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRTZWxlY3Rpb25JbnRlcnZh
bCh5LCB5KTsKKwkJIH0KKwkJIGdldFBvcHVwTWVudURvd25sb2FkKCkuc2hvdyhlLmdldENv
bXBvbmVudCgpLCBlLmdldFgoKSwgZS5nZXRZKCkpOworCSB9CiAKLQkJaWYgKHQgPT0gbnVs
bCkKLQkJCXJldHVybjsKKwkgcHJpdmF0ZSB2b2lkIGZvbnRDaGFuZ2VkKCkgeworCQkgZmlu
YWwgU3RyaW5nIGZvbnROYW1lID0gQ29yZS5mcm9zdFNldHRpbmdzLmdldFZhbHVlKFNldHRp
bmdzQ2xhc3MuRklMRV9MSVNUX0ZPTlRfTkFNRSk7CisJCSBmaW5hbCBpbnQgZm9udFN0eWxl
ID0gQ29yZS5mcm9zdFNldHRpbmdzLmdldEludFZhbHVlKFNldHRpbmdzQ2xhc3MuRklMRV9M
SVNUX0ZPTlRfU1RZTEUpOworCQkgZmluYWwgaW50IGZvbnRTaXplID0gQ29yZS5mcm9zdFNl
dHRpbmdzLmdldEludFZhbHVlKFNldHRpbmdzQ2xhc3MuRklMRV9MSVNUX0ZPTlRfU0laRSk7
CisJCSBGb250IGZvbnQgPSBuZXcgRm9udChmb250TmFtZSwgZm9udFN0eWxlLCBmb250U2l6
ZSk7CisJCSBpZiAoIWZvbnQuZ2V0RmFtaWx5KCkuZXF1YWxzKGZvbnROYW1lKSkgeworCQkJ
IGxvZ2dlci5zZXZlcmUoIlRoZSBzZWxlY3RlZCBmb250IHdhcyBub3QgZm91bmQgaW4geW91
ciBzeXN0ZW1cbiIgKworCQkJICJUaGF0IHNlbGVjdGlvbiB3aWxsIGJlIGNoYW5nZWQgdG8g
XCJTYW5zU2VyaWZcIi4iKTsKKwkJCSBDb3JlLmZyb3N0U2V0dGluZ3Muc2V0VmFsdWUoU2V0
dGluZ3NDbGFzcy5GSUxFX0xJU1RfRk9OVF9OQU1FLCAiU2Fuc1NlcmlmIik7CisJCQkgZm9u
dCA9IG5ldyBGb250KCJTYW5zU2VyaWYiLCBmb250U3R5bGUsIGZvbnRTaXplKTsKKwkJIH0K
KwkJIG1vZGVsVGFibGUuc2V0Rm9udChmb250KTsKKwkgfQogCi0JCXRyeSB7Ci0JCQlpZiAo
IXQuaXNEYXRhRmxhdm9yU3VwcG9ydGVkKERhdGFGbGF2b3Iuc3RyaW5nRmxhdm9yKSkKLQkJ
CQlyZXR1cm47Ci0JCQl0ZXh0ID0gKFN0cmluZyl0LmdldFRyYW5zZmVyRGF0YShEYXRhRmxh
dm9yLnN0cmluZ0ZsYXZvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBzdGZ1KSB7Ci0JCQly
ZXR1cm47Ci0JCX0KKwkgcHJpdmF0ZSB2b2lkIGRvd25sb2FkUGFzdGVCdXR0b25QcmVzc2Vk
KGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsKKwkJIFRyYW5zZmVyYWJsZSB0ID0gVG9vbGtpdC5n
ZXREZWZhdWx0VG9vbGtpdCgpLmdldFN5c3RlbUNsaXBib2FyZCgpLmdldENvbnRlbnRzKG51
bGwpOworCQkgU3RyaW5nIHRleHQ7CiAKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJRmls
ZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0RG93bmxvYWRNYW5hZ2VyKCkuYWRkUmVjZW50
RG93bmxvYWREaXIoZ2V0RG93bmxvYWREaXIoKSk7Ci0JCQlGaWxlVHJhbnNmZXJNYW5hZ2Vy
Lmluc3QoKS5nZXREb3dubG9hZE1hbmFnZXIoKS5hZGRLZXlzKHRleHQsIGdldERvd25sb2Fk
RGlyKCkpOwotCQl9Ci0JfQorCQkgaWYgKHQgPT0gbnVsbCkKKwkJCSByZXR1cm47CiAKLQlw
cml2YXRlIHZvaWQgZG93bmxvYWRBY3RpdmF0ZUJ1dHRvblByZXNzZWQoZmluYWwgQWN0aW9u
RXZlbnQgZSkgewotCQlzZXREb3dubG9hZGluZ0FjdGl2YXRlZCh0cnVlKTsKLQl9CisJCSB0
cnkgeworCQkJIGlmICghdC5pc0RhdGFGbGF2b3JTdXBwb3J0ZWQoRGF0YUZsYXZvci5zdHJp
bmdGbGF2b3IpKQorCQkJCSByZXR1cm47CisJCQkgdGV4dCA9IChTdHJpbmcpdC5nZXRUcmFu
c2ZlckRhdGEoRGF0YUZsYXZvci5zdHJpbmdGbGF2b3IpOworCQkgfSBjYXRjaCAoRXhjZXB0
aW9uIHN0ZnUpIHsKKwkJCSByZXR1cm47CisJCSB9CiAKLSAgICBwcml2YXRlIHZvaWQgZG93
bmxvYWRQYXVzZUJ1dHRvblByZXNzZWQoZmluYWwgQWN0aW9uRXZlbnQgZSkgewotICAgICAg
ICBzZXREb3dubG9hZGluZ0FjdGl2YXRlZChmYWxzZSk7Ci0gICAgfQorCQkgaWYgKHRleHQg
IT0gbnVsbCkgeworCQkJIExpc3Q8RnJvc3REb3dubG9hZEl0ZW0+IGZyb3N0RG93bmxvYWRJ
dGVtTGlzdCA9IERvd25sb2FkTWFuYWdlci5wYXJzZUtleXModGV4dCk7CisJCQkgCisJCQkg
ZmluYWwgQWRkTmV3RG93bmxvYWRzRGlhbG9nIGFkZE5ld0Rvd25sb2Fkc0RpYWxvZyA9IG5l
dyBBZGROZXdEb3dubG9hZHNEaWFsb2coCisJCQkJCSBNYWluRnJhbWUuZ2V0SW5zdGFuY2Uo
KSwgZnJvc3REb3dubG9hZEl0ZW1MaXN0KTsKKwkJCSBmcm9zdERvd25sb2FkSXRlbUxpc3Qg
PSBhZGROZXdEb3dubG9hZHNEaWFsb2cuc3RhcnREaWFsb2coZnJvc3REb3dubG9hZEl0ZW1M
aXN0KTsKIAotCXByaXZhdGUgdm9pZCBkb3dubG9hZFRhYmxlRG91YmxlQ2xpY2soZmluYWwg
TW91c2VFdmVudCBlKSB7Ci0JCWZpbmFsIGludCBjbGlja2VkQ29sID0gbW9kZWxUYWJsZS5n
ZXRUYWJsZSgpLmNvbHVtbkF0UG9pbnQoZS5nZXRQb2ludCgpKTsKLQkJZmluYWwgaW50IG1v
ZGVsSXggPSBtb2RlbFRhYmxlLmdldFRhYmxlKCkuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1
bW4oY2xpY2tlZENvbCkuZ2V0TW9kZWxJbmRleCgpOwotCQlpZiAobW9kZWxJeCA9PSAwKSB7
Ci0JCQlyZXR1cm47Ci0JCX0KKwkJCSBEb3dubG9hZE1vZGVsIGRvd25sb2FkTW9kZWwgPSBG
aWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXREb3dubG9hZE1hbmFnZXIoKS5nZXRNb2Rl
bCgpOworCQkJIGZvcihmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBmcm9zdERvd25sb2FkSXRl
bSA6IGZyb3N0RG93bmxvYWRJdGVtTGlzdCApIHsKKwkJCQkgZG93bmxvYWRNb2RlbC5hZGRE
b3dubG9hZEl0ZW0oZnJvc3REb3dubG9hZEl0ZW0pOworCQkJIH0KKwkJIH0KKwkgfQogCi0J
CWZpbmFsIE1vZGVsSXRlbSBzZWxlY3RlZEl0ZW0gPSBtb2RlbFRhYmxlLmdldFNlbGVjdGVk
SXRlbSgpOwotCQlpZiAoc2VsZWN0ZWRJdGVtICE9IG51bGwpIHsKLQkJCWZpbmFsIEZyb3N0
RG93bmxvYWRJdGVtIGRsSXRlbSA9IChGcm9zdERvd25sb2FkSXRlbSkgc2VsZWN0ZWRJdGVt
OwotICAgICAgICAgICAgZmluYWwgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoZGxJdGVt
LmdldERvd25sb2FkRmlsZW5hbWUoKSk7Ci0gICAgICAgICAgICBpZiggIXRhcmdldEZpbGUu
aXNGaWxlKCkgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQot
CQkJbG9nZ2VyLmluZm8oIkV4ZWN1dGluZzogIiArIHRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQ
YXRoKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIAlFeGVjdXRlRG9jdW1l
bnQub3BlbkRvY3VtZW50KHRhcmdldEZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaChmaW5h
bCBUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNz
YWdlRGlhbG9nKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IG9w
ZW4gdGhlIGZpbGU6ICIrdGFyZ2V0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSsiXG4iK3QudG9T
dHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciIsCi0gICAgICAgICAg
ICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAg
IH0KLQkJfQotCX0KKwkgcHJpdmF0ZSB2b2lkIGRvd25sb2FkQWN0aXZhdGVCdXR0b25QcmVz
c2VkKGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsKKwkJIHNldERvd25sb2FkaW5nQWN0aXZhdGVk
KHRydWUpOworCSB9CiAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBmcm9zdC5TZXR0
aW5nc1VwZGF0ZXIjdXBkYXRlU2V0dGluZ3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0
ZVNldHRpbmdzKCkgewotICAgICAgICBDb3JlLmZyb3N0U2V0dGluZ3Muc2V0VmFsdWUoU2V0
dGluZ3NDbGFzcy5ET1dOTE9BRElOR19BQ1RJVkFURUQsIGlzRG93bmxvYWRpbmdBY3RpdmF0
ZWQoKSk7Ci0JfQorCSBwcml2YXRlIHZvaWQgZG93bmxvYWRQYXVzZUJ1dHRvblByZXNzZWQo
ZmluYWwgQWN0aW9uRXZlbnQgZSkgeworCQkgc2V0RG93bmxvYWRpbmdBY3RpdmF0ZWQoZmFs
c2UpOworCSB9CiAKLSAgICBwcml2YXRlIHZvaWQgYXNzaWduSG90a2V5cygpIHsKKwkgcHJp
dmF0ZSB2b2lkIGRvd25sb2FkVGFibGVEb3VibGVDbGljayhmaW5hbCBNb3VzZUV2ZW50IGUp
IHsKKwkJIGZpbmFsIGludCBjbGlja2VkQ29sID0gbW9kZWxUYWJsZS5nZXRUYWJsZSgpLmNv
bHVtbkF0UG9pbnQoZS5nZXRQb2ludCgpKTsKKwkJIGZpbmFsIGludCBtb2RlbEl4ID0gbW9k
ZWxUYWJsZS5nZXRUYWJsZSgpLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKGNsaWNrZWRD
b2wpLmdldE1vZGVsSW5kZXgoKTsKKwkJIGlmIChtb2RlbEl4ID09IDApIHsKKwkJCSByZXR1
cm47CisJCSB9CiAKLSAgICAvLyBhc3NpZ24ga2V5cyAxLTYgLSBzZXQgcHJpb3JpdHkgb2Yg
c2VsZWN0ZWQgaXRlbXMKLSAgICAgICAgZmluYWwgQWN0aW9uIHNldFByaW9yaXR5QWN0aW9u
ID0gbmV3IEFic3RyYWN0QWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0
aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAg
ICAgZmluYWwgaW50IHByaW8gPSBuZXcgSW50ZWdlcihldmVudC5nZXRBY3Rpb25Db21tYW5k
KCkpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTW9kZWxJdGVtW10gc2Vs
ZWN0ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOwotICAgICAgICAg
ICAgICAgIEZpbGVUcmFuc2Zlck1hbmFnZXIuaW5zdCgpLmdldFBlcnNpc3RlbmNlTWFuYWdl
cigpLmNoYW5nZUl0ZW1Qcmlvcml0ZXMoc2VsZWN0ZWRJdGVtcywgcHJpbyk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGdldElucHV0TWFwKEpDb21wb25lbnQuV0hF
Tl9BTkNFU1RPUl9PRl9GT0NVU0VEX0NPTVBPTkVOVCkucHV0KEtleVN0cm9rZS5nZXRLZXlT
dHJva2UoS2V5RXZlbnQuVktfMSwgMCksICJTRVRQUklPIik7Ci0gICAgICAgIGdldElucHV0
TWFwKEpDb21wb25lbnQuV0hFTl9BTkNFU1RPUl9PRl9GT0NVU0VEX0NPTVBPTkVOVCkucHV0
KEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfMiwgMCksICJTRVRQUklPIik7
Ci0gICAgICAgIGdldElucHV0TWFwKEpDb21wb25lbnQuV0hFTl9BTkNFU1RPUl9PRl9GT0NV
U0VEX0NPTVBPTkVOVCkucHV0KEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktf
MywgMCksICJTRVRQUklPIik7Ci0gICAgICAgIGdldElucHV0TWFwKEpDb21wb25lbnQuV0hF
Tl9BTkNFU1RPUl9PRl9GT0NVU0VEX0NPTVBPTkVOVCkucHV0KEtleVN0cm9rZS5nZXRLZXlT
dHJva2UoS2V5RXZlbnQuVktfNCwgMCksICJTRVRQUklPIik7Ci0gICAgICAgIGdldElucHV0
TWFwKEpDb21wb25lbnQuV0hFTl9BTkNFU1RPUl9PRl9GT0NVU0VEX0NPTVBPTkVOVCkucHV0
KEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfNSwgMCksICJTRVRQUklPIik7
Ci0gICAgICAgIGdldElucHV0TWFwKEpDb21wb25lbnQuV0hFTl9BTkNFU1RPUl9PRl9GT0NV
U0VEX0NPTVBPTkVOVCkucHV0KEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktf
NiwgMCksICJTRVRQUklPIik7Ci0gICAgICAgIGdldEFjdGlvbk1hcCgpLnB1dCgiU0VUUFJJ
TyIsIHNldFByaW9yaXR5QWN0aW9uKTsKLSAgICB9CisJCSBmaW5hbCBNb2RlbEl0ZW0gc2Vs
ZWN0ZWRJdGVtID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW0oKTsKKwkJIGlmIChzZWxl
Y3RlZEl0ZW0gIT0gbnVsbCkgeworCQkJIGZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGRsSXRl
bSA9IChGcm9zdERvd25sb2FkSXRlbSkgc2VsZWN0ZWRJdGVtOworCQkJIGZpbmFsIEZpbGUg
dGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGRsSXRlbS5nZXREb3dubG9hZEZpbGVuYW1lKCkpOwor
CQkJIGlmKCAhdGFyZ2V0RmlsZS5pc0ZpbGUoKSApIHsKKwkJCQkgcmV0dXJuOworCQkJIH0K
KwkJCSBsb2dnZXIuaW5mbygiRXhlY3V0aW5nOiAiICsgdGFyZ2V0RmlsZS5nZXRBYnNvbHV0
ZVBhdGgoKSk7CisJCQkgdHJ5IHsKKwkJCQkgRXhlY3V0ZURvY3VtZW50Lm9wZW5Eb2N1bWVu
dCh0YXJnZXRGaWxlKTsKKwkJCSB9IGNhdGNoKGZpbmFsIFRocm93YWJsZSB0KSB7CisJCQkJ
IEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsCisJCQkJCQkgIkNvdWxkIG5v
dCBvcGVuIHRoZSBmaWxlOiAiK3RhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkrIlxuIit0
LnRvU3RyaW5nKCksCisJCQkJCQkgIkVycm9yIiwKKwkJCQkJCSBKT3B0aW9uUGFuZS5FUlJP
Ul9NRVNTQUdFKTsKKwkJCSB9CisJCSB9CisJIH0KIAotICAgIC8qKgotICAgICAqIFJlbmRl
cmVyIGRyYXdzIGJhY2tncm91bmQgb2YgRE9ORSBpdGVtcyBpbiBncmVlbi4KLSAgICAgKi8K
LSAgICBwcml2YXRlIGNsYXNzIENlbGxSZW5kZXJlciBleHRlbmRzIERlZmF1bHRUYWJsZUNl
bGxSZW5kZXJlciB7CisJIC8qIChub24tSmF2YWRvYykKKwkgICogQHNlZSBmcm9zdC5TZXR0
aW5nc1VwZGF0ZXIjdXBkYXRlU2V0dGluZ3MoKQorCSAgKi8KKwkgcHVibGljIHZvaWQgdXBk
YXRlU2V0dGluZ3MoKSB7CisJCSBDb3JlLmZyb3N0U2V0dGluZ3Muc2V0VmFsdWUoU2V0dGlu
Z3NDbGFzcy5ET1dOTE9BRElOR19BQ1RJVkFURUQsIGlzRG93bmxvYWRpbmdBY3RpdmF0ZWQo
KSk7CisJIH0KIAotICAgICAgICBwcml2YXRlIGZpbmFsIENvbG9yIGNvbF9ncmVlbiAgICA9
IG5ldyBDb2xvcigweDAwLCAweDgwLCAweDAwKTsKKwkgcHJpdmF0ZSB2b2lkIGFzc2lnbkhv
dGtleXMoKSB7CiAKLSAgICAgICAgcHVibGljIENlbGxSZW5kZXJlcigpIHsKLSAgICAgICAg
ICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KKwkJIC8vIGFzc2lnbiBrZXlzIDEtNiAtIHNldCBw
cmlvcml0eSBvZiBzZWxlY3RlZCBpdGVtcworCQkgZmluYWwgQWN0aW9uIHNldFByaW9yaXR5
QWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCkgeworCQkJIHB1YmxpYyB2b2lkIGFjdGlv
blBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBldmVudCkgeworCQkJCSBmaW5hbCBpbnQg
cHJpbyA9IG5ldyBJbnRlZ2VyKGV2ZW50LmdldEFjdGlvbkNvbW1hbmQoKSkuaW50VmFsdWUo
KTsKKwkJCQkgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IG1vZGVsVGFibGUu
Z2V0U2VsZWN0ZWRJdGVtcygpOworCQkJCSBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5n
ZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKS5jaGFuZ2VJdGVtUHJpb3JpdGVzKHNlbGVjdGVkSXRl
bXMsIHByaW8pOworCQkJIH0KKwkJIH07CisJCSBnZXRJbnB1dE1hcChKQ29tcG9uZW50LldI
RU5fQU5DRVNUT1JfT0ZfRk9DVVNFRF9DT01QT05FTlQpLnB1dChLZXlTdHJva2UuZ2V0S2V5
U3Ryb2tlKEtleUV2ZW50LlZLXzEsIDApLCAiU0VUUFJJTyIpOworCQkgZ2V0SW5wdXRNYXAo
SkNvbXBvbmVudC5XSEVOX0FOQ0VTVE9SX09GX0ZPQ1VTRURfQ09NUE9ORU5UKS5wdXQoS2V5
U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS18yLCAwKSwgIlNFVFBSSU8iKTsKKwkJ
IGdldElucHV0TWFwKEpDb21wb25lbnQuV0hFTl9BTkNFU1RPUl9PRl9GT0NVU0VEX0NPTVBP
TkVOVCkucHV0KEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfMywgMCksICJT
RVRQUklPIik7CisJCSBnZXRJbnB1dE1hcChKQ29tcG9uZW50LldIRU5fQU5DRVNUT1JfT0Zf
Rk9DVVNFRF9DT01QT05FTlQpLnB1dChLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50
LlZLXzQsIDApLCAiU0VUUFJJTyIpOworCQkgZ2V0SW5wdXRNYXAoSkNvbXBvbmVudC5XSEVO
X0FOQ0VTVE9SX09GX0ZPQ1VTRURfQ09NUE9ORU5UKS5wdXQoS2V5U3Ryb2tlLmdldEtleVN0
cm9rZShLZXlFdmVudC5WS181LCAwKSwgIlNFVFBSSU8iKTsKKwkJIGdldElucHV0TWFwKEpD
b21wb25lbnQuV0hFTl9BTkNFU1RPUl9PRl9GT0NVU0VEX0NPTVBPTkVOVCkucHV0KEtleVN0
cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfNiwgMCksICJTRVRQUklPIik7CisJCSBn
ZXRBY3Rpb25NYXAoKS5wdXQoIlNFVFBSSU8iLCBzZXRQcmlvcml0eUFjdGlvbik7CisJIH0K
IAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRUYWJs
ZUNlbGxSZW5kZXJlckNvbXBvbmVudCgKLSAgICAgICAgICAgIGZpbmFsIEpUYWJsZSB0YWJs
ZSwKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKLSAgICAgICAgICAgIGZpbmFs
IGJvb2xlYW4gaXNTZWxlY3RlZCwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzRm9j
dXMsCi0gICAgICAgICAgICBmaW5hbCBpbnQgcm93LAotICAgICAgICAgICAgZmluYWwgaW50
IGNvbHVtbikgeworCSAvKioKKwkgICogUmVuZGVyZXIgZHJhd3MgYmFja2dyb3VuZCBvZiBE
T05FIGl0ZW1zIGluIGdyZWVuLgorCSAgKi8KKwkgcHJpdmF0ZSBjbGFzcyBDZWxsUmVuZGVy
ZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVDZWxsUmVuZGVyZXIgewogCi0gICAgICAgICAgICBz
dXBlci5nZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudCh0YWJsZSwgdmFsdWUsIGlzU2Vs
ZWN0ZWQsIC8qaGFzRm9jdXMqLyBmYWxzZSwgcm93LCBjb2x1bW4pOworCQkgcHJpdmF0ZSBm
aW5hbCBDb2xvciBjb2xfZ3JlZW4gICAgPSBuZXcgQ29sb3IoMHgwMCwgMHg4MCwgMHgwMCk7
CiAKLSAgICAgICAgICAgIGZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGl0ZW0gPSAoRnJvc3RE
b3dubG9hZEl0ZW0pbW9kZWwuZ2V0SXRlbUF0KHJvdyk7CisJCSBwdWJsaWMgQ2VsbFJlbmRl
cmVyKCkgeworCQkJIHN1cGVyKCk7CisJCSB9CiAKLSAgICAgICAgICAgIC8vIHNldCBiYWNr
Z3JvdW5kIG9mIERPTkUgZG93bmxvYWRzIGdyZWVuCi0gICAgICAgICAgICBpZiggaXRlbS5n
ZXRTdGF0ZSgpID09IEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX0RPTkUgKSB7Ci0gICAgICAg
ICAgICAgICAgc2V0QmFja2dyb3VuZChjb2xfZ3JlZW4pOwotICAgICAgICAgICAgfSBlbHNl
IHsKLSAgICAgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kKG1vZGVsVGFibGUuZ2V0VGFibGUo
KS5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICAgICAgfQorCQkgQE92ZXJyaWRlCisJCSBw
dWJsaWMgQ29tcG9uZW50IGdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KAorCQkJCSBm
aW5hbCBKVGFibGUgdGFibGUsCisJCQkJIGZpbmFsIE9iamVjdCB2YWx1ZSwKKwkJCQkgZmlu
YWwgYm9vbGVhbiBpc1NlbGVjdGVkLAorCQkJCSBmaW5hbCBib29sZWFuIGhhc0ZvY3VzLAor
CQkJCSBmaW5hbCBpbnQgcm93LAorCQkJCSBmaW5hbCBpbnQgY29sdW1uKSB7CiAKLSAgICAg
ICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgfQorCQkJIHN1cGVyLmdldFRh
YmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KHRhYmxlLCB2YWx1ZSwgaXNTZWxlY3RlZCwgLypo
YXNGb2N1cyovIGZhbHNlLCByb3csIGNvbHVtbik7CiAKLSAgICBwcml2YXRlIGNsYXNzIFBv
cHVwTWVudURvd25sb2FkIGV4dGVuZHMgSlNraW5uYWJsZVBvcHVwTWVudQotICAgIGltcGxl
bWVudHMgQWN0aW9uTGlzdGVuZXIsIExhbmd1YWdlTGlzdGVuZXIgeworCQkJIGZpbmFsIEZy
b3N0RG93bmxvYWRJdGVtIGl0ZW0gPSAoRnJvc3REb3dubG9hZEl0ZW0pbW9kZWwuZ2V0SXRl
bUF0KHJvdyk7CiAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gZGV0YWlsc0l0
ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSk1lbnVJdGVt
IGNvcHlLZXlzQW5kTmFtZXNJdGVtID0gbmV3IEpNZW51SXRlbSgpOwotICAgICAgICBwcml2
YXRlIGZpbmFsIEpNZW51SXRlbSBjb3B5RXh0ZW5kZWRJbmZvSXRlbSA9IG5ldyBKTWVudUl0
ZW0oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gZGlzYWJsZUFsbERvd25s
b2Fkc0l0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSk1l
bnVJdGVtIGRpc2FibGVTZWxlY3RlZERvd25sb2Fkc0l0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7
Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSk1lbnVJdGVtIGVuYWJsZUFsbERvd25sb2Fkc0l0
ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSk1lbnVJdGVt
IGVuYWJsZVNlbGVjdGVkRG93bmxvYWRzSXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKLSAgICAg
ICAgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gaW52ZXJ0RW5hYmxlZEFsbEl0ZW0gPSBuZXcg
Sk1lbnVJdGVtKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSk1lbnVJdGVtIGludmVydEVu
YWJsZWRTZWxlY3RlZEl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgIHByaXZhdGUg
ZmluYWwgSk1lbnVJdGVtIHJlbW92ZVNlbGVjdGVkRG93bmxvYWRzSXRlbSA9IG5ldyBKTWVu
dUl0ZW0oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gcmVzdGFydFNlbGVj
dGVkRG93bmxvYWRzSXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJCSAvLyBzZXQgYmFja2dy
b3VuZCBvZiBET05FIGRvd25sb2FkcyBncmVlbgorCQkJIGlmKCBpdGVtLmdldFN0YXRlKCkg
PT0gRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVfRE9ORSApIHsKKwkJCQkgc2V0QmFja2dyb3Vu
ZChjb2xfZ3JlZW4pOworCQkJIH0gZWxzZSB7CisJCQkJIHNldEJhY2tncm91bmQobW9kZWxU
YWJsZS5nZXRUYWJsZSgpLmdldEJhY2tncm91bmQoKSk7CisJCQkgfQogCi0gICAgICAgIHBy
aXZhdGUgZmluYWwgSk1lbnVJdGVtIHN0YXJ0U2VsZWN0ZWREb3dubG9hZHNOb3cgPSBuZXcg
Sk1lbnVJdGVtKCk7CisJCQkgcmV0dXJuIHRoaXM7CisJCSB9CisJIH0KIAotICAgICAgICBw
cml2YXRlIGZpbmFsIEpNZW51SXRlbSB1c2VUaGlzRG93bmxvYWREaXJJdGVtID0gbmV3IEpN
ZW51SXRlbSgpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBqdW1wVG9Bc3Nv
Y2lhdGVkTWVzc2FnZSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkgcHJpdmF0ZSBjbGFzcyBQb3B1
cE1lbnVEb3dubG9hZCBleHRlbmRzIEpTa2lubmFibGVQb3B1cE1lbnUKKwkgaW1wbGVtZW50
cyBBY3Rpb25MaXN0ZW5lciwgTGFuZ3VhZ2VMaXN0ZW5lciB7CiAKLSAgICAgICAgcHJpdmF0
ZSBKTWVudSBjaGFuZ2VQcmlvcml0eU1lbnUgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpN
ZW51SXRlbSBwcmlvMEl0ZW0gPSBudWxsOwotICAgICAgICBwcml2YXRlIEpNZW51SXRlbSBw
cmlvMUl0ZW0gPSBudWxsOwotICAgICAgICBwcml2YXRlIEpNZW51SXRlbSBwcmlvMkl0ZW0g
PSBudWxsOwotICAgICAgICBwcml2YXRlIEpNZW51SXRlbSBwcmlvM0l0ZW0gPSBudWxsOwot
ICAgICAgICBwcml2YXRlIEpNZW51SXRlbSBwcmlvNEl0ZW0gPSBudWxsOwotICAgICAgICBw
cml2YXRlIEpNZW51SXRlbSBwcmlvNUl0ZW0gPSBudWxsOwotICAgICAgICBwcml2YXRlIEpN
ZW51SXRlbSBwcmlvNkl0ZW0gPSBudWxsOwotICAgICAgICBwcml2YXRlIEpNZW51SXRlbSBy
ZW1vdmVGcm9tR3FJdGVtID0gbnVsbDsKKwkJIHByaXZhdGUgZmluYWwgSk1lbnVJdGVtIGRl
dGFpbHNJdGVtID0gbmV3IEpNZW51SXRlbSgpOworCQkgcHJpdmF0ZSBmaW5hbCBKTWVudUl0
ZW0gY29weUtleXNBbmROYW1lc0l0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCSBwcml2YXRl
IGZpbmFsIEpNZW51SXRlbSBjb3B5RXh0ZW5kZWRJbmZvSXRlbSA9IG5ldyBKTWVudUl0ZW0o
KTsKKwkJIHByaXZhdGUgZmluYWwgSk1lbnVJdGVtIGRpc2FibGVBbGxEb3dubG9hZHNJdGVt
ID0gbmV3IEpNZW51SXRlbSgpOworCQkgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gZGlzYWJs
ZVNlbGVjdGVkRG93bmxvYWRzSXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJIHByaXZhdGUg
ZmluYWwgSk1lbnVJdGVtIGVuYWJsZUFsbERvd25sb2Fkc0l0ZW0gPSBuZXcgSk1lbnVJdGVt
KCk7CisJCSBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBlbmFibGVTZWxlY3RlZERvd25sb2Fk
c0l0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCSBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBp
bnZlcnRFbmFibGVkQWxsSXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJIHByaXZhdGUgZmlu
YWwgSk1lbnVJdGVtIGludmVydEVuYWJsZWRTZWxlY3RlZEl0ZW0gPSBuZXcgSk1lbnVJdGVt
KCk7CisJCSBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSByZW1vdmVTZWxlY3RlZERvd25sb2Fk
c0l0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCSBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBy
ZXN0YXJ0U2VsZWN0ZWREb3dubG9hZHNJdGVtID0gbmV3IEpNZW51SXRlbSgpOwogCi0gICAg
ICAgIHByaXZhdGUgSk1lbnVJdGVtIHJldHJpZXZlRGlyZWN0RXh0ZXJuYWxEb3dubG9hZHMg
PSBudWxsOworCQkgcHJpdmF0ZSBmaW5hbCBKTWVudUl0ZW0gc3RhcnRTZWxlY3RlZERvd25s
b2Fkc05vdyA9IG5ldyBKTWVudUl0ZW0oKTsKIAotICAgICAgICBwdWJsaWMgUG9wdXBNZW51
RG93bmxvYWQoKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgaW5pdGlh
bGl6ZSgpOwotICAgICAgICB9CisJCSBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSB1c2VUaGlz
RG93bmxvYWREaXJJdGVtID0gbmV3IEpNZW51SXRlbSgpOworCQkgcHJpdmF0ZSBmaW5hbCBK
TWVudUl0ZW0ganVtcFRvQXNzb2NpYXRlZE1lc3NhZ2UgPSBuZXcgSk1lbnVJdGVtKCk7CiAK
LSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7CisJCSBwcml2YXRlIEpNZW51
IGNoYW5nZVByaW9yaXR5TWVudSA9IG51bGw7CisJCSBwcml2YXRlIEpNZW51SXRlbSBwcmlv
MEl0ZW0gPSBudWxsOworCQkgcHJpdmF0ZSBKTWVudUl0ZW0gcHJpbzFJdGVtID0gbnVsbDsK
KwkJIHByaXZhdGUgSk1lbnVJdGVtIHByaW8ySXRlbSA9IG51bGw7CisJCSBwcml2YXRlIEpN
ZW51SXRlbSBwcmlvM0l0ZW0gPSBudWxsOworCQkgcHJpdmF0ZSBKTWVudUl0ZW0gcHJpbzRJ
dGVtID0gbnVsbDsKKwkJIHByaXZhdGUgSk1lbnVJdGVtIHByaW81SXRlbSA9IG51bGw7CisJ
CSBwcml2YXRlIEpNZW51SXRlbSBwcmlvNkl0ZW0gPSBudWxsOworCQkgcHJpdmF0ZSBKTWVu
dUl0ZW0gcmVtb3ZlRnJvbUdxSXRlbSA9IG51bGw7CiAKLSAgICAgICAgICAgIGlmKCBQZXJz
aXN0ZW5jZU1hbmFnZXIuaXNQZXJzaXN0ZW5jZUVuYWJsZWQoKSApIHsKLSAgICAgICAgICAg
ICAgICBjaGFuZ2VQcmlvcml0eU1lbnUgPSBuZXcgSk1lbnUoKTsKLSAgICAgICAgICAgICAg
ICBwcmlvMEl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgICAgICAgICAgcHJpbzFJ
dGVtID0gbmV3IEpNZW51SXRlbSgpOwotICAgICAgICAgICAgICAgIHByaW8ySXRlbSA9IG5l
dyBKTWVudUl0ZW0oKTsKLSAgICAgICAgICAgICAgICBwcmlvM0l0ZW0gPSBuZXcgSk1lbnVJ
dGVtKCk7Ci0gICAgICAgICAgICAgICAgcHJpbzRJdGVtID0gbmV3IEpNZW51SXRlbSgpOwot
ICAgICAgICAgICAgICAgIHByaW81SXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKLSAgICAgICAg
ICAgICAgICBwcmlvNkl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgICAgICAgICAg
cmVtb3ZlRnJvbUdxSXRlbSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJIHByaXZhdGUgSk1lbnVJ
dGVtIHJldHJpZXZlRGlyZWN0RXh0ZXJuYWxEb3dubG9hZHMgPSBudWxsOwogCi0gICAgICAg
ICAgICAgICAgY2hhbmdlUHJpb3JpdHlNZW51LmFkZChwcmlvMEl0ZW0pOwotICAgICAgICAg
ICAgICAgIGNoYW5nZVByaW9yaXR5TWVudS5hZGQocHJpbzFJdGVtKTsKLSAgICAgICAgICAg
ICAgICBjaGFuZ2VQcmlvcml0eU1lbnUuYWRkKHByaW8ySXRlbSk7Ci0gICAgICAgICAgICAg
ICAgY2hhbmdlUHJpb3JpdHlNZW51LmFkZChwcmlvM0l0ZW0pOwotICAgICAgICAgICAgICAg
IGNoYW5nZVByaW9yaXR5TWVudS5hZGQocHJpbzRJdGVtKTsKLSAgICAgICAgICAgICAgICBj
aGFuZ2VQcmlvcml0eU1lbnUuYWRkKHByaW81SXRlbSk7Ci0gICAgICAgICAgICAgICAgY2hh
bmdlUHJpb3JpdHlNZW51LmFkZChwcmlvNkl0ZW0pOworCQkgcHVibGljIFBvcHVwTWVudURv
d25sb2FkKCkgeworCQkJIHN1cGVyKCk7CisJCQkgaW5pdGlhbGl6ZSgpOworCQkgfQogCi0g
ICAgICAgICAgICAgICAgcHJpbzBJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAg
ICAgICAgICAgICAgIHByaW8xSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAg
ICAgICAgICAgICBwcmlvMkl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAg
ICAgICAgICAgcHJpbzNJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAg
ICAgICAgIHByaW80SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAg
ICAgICBwcmlvNUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAg
ICAgcHJpbzZJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICAg
IHJlbW92ZUZyb21HcUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCSBwcml2YXRl
IHZvaWQgaW5pdGlhbGl6ZSgpIHsKIAotICAgICAgICAgICAgICAgIHJldHJpZXZlRGlyZWN0
RXh0ZXJuYWxEb3dubG9hZHMgPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgICAgICAgICAg
cmV0cmlldmVEaXJlY3RFeHRlcm5hbERvd25sb2Fkcy5hZGRBY3Rpb25MaXN0ZW5lcih0aGlz
KTsKLSAgICAgICAgICAgIH0KKwkJCSBpZiggUGVyc2lzdGVuY2VNYW5hZ2VyLmlzUGVyc2lz
dGVuY2VFbmFibGVkKCkgKSB7CisJCQkJIGNoYW5nZVByaW9yaXR5TWVudSA9IG5ldyBKTWVu
dSgpOworCQkJCSBwcmlvMEl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCQkJIHByaW8xSXRl
bSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkJCQkgcHJpbzJJdGVtID0gbmV3IEpNZW51SXRlbSgp
OworCQkJCSBwcmlvM0l0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCQkJIHByaW80SXRlbSA9
IG5ldyBKTWVudUl0ZW0oKTsKKwkJCQkgcHJpbzVJdGVtID0gbmV3IEpNZW51SXRlbSgpOwor
CQkJCSBwcmlvNkl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCQkJIHJlbW92ZUZyb21HcUl0
ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CiAKLSAgICAgICAgICAgIHJlZnJlc2hMYW5ndWFnZSgp
OworCQkJCSBjaGFuZ2VQcmlvcml0eU1lbnUuYWRkKHByaW8wSXRlbSk7CisJCQkJIGNoYW5n
ZVByaW9yaXR5TWVudS5hZGQocHJpbzFJdGVtKTsKKwkJCQkgY2hhbmdlUHJpb3JpdHlNZW51
LmFkZChwcmlvMkl0ZW0pOworCQkJCSBjaGFuZ2VQcmlvcml0eU1lbnUuYWRkKHByaW8zSXRl
bSk7CisJCQkJIGNoYW5nZVByaW9yaXR5TWVudS5hZGQocHJpbzRJdGVtKTsKKwkJCQkgY2hh
bmdlUHJpb3JpdHlNZW51LmFkZChwcmlvNUl0ZW0pOworCQkJCSBjaGFuZ2VQcmlvcml0eU1l
bnUuYWRkKHByaW82SXRlbSk7CiAKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBj
YW5jZWwgb2YgZG93bmxvYWRzCisJCQkJIHByaW8wSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0
aGlzKTsKKwkJCQkgcHJpbzFJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCSBw
cmlvMkl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJIHByaW8zSXRlbS5hZGRB
Y3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkgcHJpbzRJdGVtLmFkZEFjdGlvbkxpc3RlbmVy
KHRoaXMpOworCQkJCSBwcmlvNUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJ
IHByaW82SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkgcmVtb3ZlRnJvbUdx
SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKIAotICAgICAgICAgICAgY29weUtleXNB
bmROYW1lc0l0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBjb3B5
RXh0ZW5kZWRJbmZvSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAg
IHJlc3RhcnRTZWxlY3RlZERvd25sb2Fkc0l0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7
Ci0gICAgICAgICAgICByZW1vdmVTZWxlY3RlZERvd25sb2Fkc0l0ZW0uYWRkQWN0aW9uTGlz
dGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBlbmFibGVBbGxEb3dubG9hZHNJdGVtLmFkZEFj
dGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgZGlzYWJsZUFsbERvd25sb2Fkc0l0
ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBlbmFibGVTZWxlY3Rl
ZERvd25sb2Fkc0l0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBk
aXNhYmxlU2VsZWN0ZWREb3dubG9hZHNJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwot
ICAgICAgICAgICAgaW52ZXJ0RW5hYmxlZEFsbEl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhp
cyk7Ci0gICAgICAgICAgICBpbnZlcnRFbmFibGVkU2VsZWN0ZWRJdGVtLmFkZEFjdGlvbkxp
c3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgZGV0YWlsc0l0ZW0uYWRkQWN0aW9uTGlzdGVu
ZXIodGhpcyk7Ci0gICAgICAgICAgICBzdGFydFNlbGVjdGVkRG93bmxvYWRzTm93LmFkZEFj
dGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgdXNlVGhpc0Rvd25sb2FkRGlySXRl
bS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIGp1bXBUb0Fzc29jaWF0
ZWRNZXNzYWdlLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9CisJCQkJIHJl
dHJpZXZlRGlyZWN0RXh0ZXJuYWxEb3dubG9hZHMgPSBuZXcgSk1lbnVJdGVtKCk7CisJCQkJ
IHJldHJpZXZlRGlyZWN0RXh0ZXJuYWxEb3dubG9hZHMuYWRkQWN0aW9uTGlzdGVuZXIodGhp
cyk7CisJCQkgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCByZWZyZXNoTGFuZ3VhZ2UoKSB7
Ci0gICAgICAgICAgICBkZXRhaWxzSXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygi
Q29tbW9uLmRldGFpbHMiKSk7Ci0gICAgICAgICAgICBjb3B5S2V5c0FuZE5hbWVzSXRlbS5z
ZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLmNvcHlUb0NsaXBCb2FyZC5jb3B5
S2V5c1dpdGhGaWxlbmFtZXMiKSk7Ci0gICAgICAgICAgICBjb3B5RXh0ZW5kZWRJbmZvSXRl
bS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLmNvcHlUb0NsaXBCb2FyZC5j
b3B5RXh0ZW5kZWRJbmZvIikpOwotICAgICAgICAgICAgcmVzdGFydFNlbGVjdGVkRG93bmxv
YWRzSXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLmZpbGVU
YWJsZS5wb3B1cG1lbnUucmVzdGFydFNlbGVjdGVkRG93bmxvYWRzIikpOwotICAgICAgICAg
ICAgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHNJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3Ry
aW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5yZW1vdmUucmVtb3ZlU2Vs
ZWN0ZWREb3dubG9hZHMiKSk7Ci0gICAgICAgICAgICBlbmFibGVBbGxEb3dubG9hZHNJdGVt
LnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBv
cHVwbWVudS5lbmFibGVEb3dubG9hZHMuZW5hYmxlQWxsRG93bmxvYWRzIikpOwotICAgICAg
ICAgICAgZGlzYWJsZUFsbERvd25sb2Fkc0l0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJp
bmcoIkRvd25sb2FkUGFuZS5maWxlVGFibGUucG9wdXBtZW51LmVuYWJsZURvd25sb2Fkcy5k
aXNhYmxlQWxsRG93bmxvYWRzIikpOwotICAgICAgICAgICAgZW5hYmxlU2VsZWN0ZWREb3du
bG9hZHNJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUuZmls
ZVRhYmxlLnBvcHVwbWVudS5lbmFibGVEb3dubG9hZHMuZW5hYmxlU2VsZWN0ZWREb3dubG9h
ZHMiKSk7Ci0gICAgICAgICAgICBkaXNhYmxlU2VsZWN0ZWREb3dubG9hZHNJdGVtLnNldFRl
eHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVu
dS5lbmFibGVEb3dubG9hZHMuZGlzYWJsZVNlbGVjdGVkRG93bmxvYWRzIikpOwotICAgICAg
ICAgICAgaW52ZXJ0RW5hYmxlZEFsbEl0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmco
IkRvd25sb2FkUGFuZS5maWxlVGFibGUucG9wdXBtZW51LmVuYWJsZURvd25sb2Fkcy5pbnZl
cnRFbmFibGVkU3RhdGVGb3JBbGxEb3dubG9hZHMiKSk7Ci0gICAgICAgICAgICBpbnZlcnRF
bmFibGVkU2VsZWN0ZWRJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9h
ZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5lbmFibGVEb3dubG9hZHMuaW52ZXJ0RW5hYmxl
ZFN0YXRlRm9yU2VsZWN0ZWREb3dubG9hZHMiKSk7Ci0gICAgICAgICAgICBzdGFydFNlbGVj
dGVkRG93bmxvYWRzTm93LnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBh
bmUuZmlsZVRhYmxlLnBvcHVwbWVudS5zdGFydFNlbGVjdGVkRG93bmxvYWRzTm93IikpOwot
ICAgICAgICAgICAgdXNlVGhpc0Rvd25sb2FkRGlySXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdl
dFN0cmluZygiRG93bmxvYWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUudXNlVGhpc0Rvd25s
b2FkRGlyIikpOwotICAgICAgICAgICAganVtcFRvQXNzb2NpYXRlZE1lc3NhZ2Uuc2V0VGV4
dChsYW5ndWFnZS5nZXRTdHJpbmcoIkRvd25sb2FkUGFuZS5maWxlVGFibGUucG9wdXBtZW51
Lmp1bXBUb0Fzc29jaWF0ZWRNZXNzYWdlIikpOworCQkJIHJlZnJlc2hMYW5ndWFnZSgpOwog
Ci0gICAgICAgICAgICBpZiggUGVyc2lzdGVuY2VNYW5hZ2VyLmlzUGVyc2lzdGVuY2VFbmFi
bGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlUHJpb3JpdHlNZW51LnNldFRleHQo
bGFuZ3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24ucHJpb3JpdHkuY2hhbmdlUHJpb3JpdHkiKSk7
Ci0gICAgICAgICAgICAgICAgcHJpbzBJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5n
KCJDb21tb24ucHJpb3JpdHkucHJpb3JpdHkwIikpOwotICAgICAgICAgICAgICAgIHByaW8x
SXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLnByaW9yaXR5LnByaW9y
aXR5MSIpKTsKLSAgICAgICAgICAgICAgICBwcmlvMkl0ZW0uc2V0VGV4dChsYW5ndWFnZS5n
ZXRTdHJpbmcoIkNvbW1vbi5wcmlvcml0eS5wcmlvcml0eTIiKSk7Ci0gICAgICAgICAgICAg
ICAgcHJpbzNJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24ucHJpb3Jp
dHkucHJpb3JpdHkzIikpOwotICAgICAgICAgICAgICAgIHByaW80SXRlbS5zZXRUZXh0KGxh
bmd1YWdlLmdldFN0cmluZygiQ29tbW9uLnByaW9yaXR5LnByaW9yaXR5NCIpKTsKLSAgICAg
ICAgICAgICAgICBwcmlvNUl0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIkNvbW1v
bi5wcmlvcml0eS5wcmlvcml0eTUiKSk7Ci0gICAgICAgICAgICAgICAgcHJpbzZJdGVtLnNl
dFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24ucHJpb3JpdHkucHJpb3JpdHk2Iikp
OwotICAgICAgICAgICAgICAgIHJlbW92ZUZyb21HcUl0ZW0uc2V0VGV4dChsYW5ndWFnZS5n
ZXRTdHJpbmcoIkRvd25sb2FkUGFuZS5maWxlVGFibGUucG9wdXBtZW51LnJlbW92ZUZyb21H
bG9iYWxRdWV1ZSIpKTsKKwkJCSAvLyBUT0RPOiBpbXBsZW1lbnQgY2FuY2VsIG9mIGRvd25s
b2FkcwogCi0gICAgICAgICAgICAgICAgcmV0cmlldmVEaXJlY3RFeHRlcm5hbERvd25sb2Fk
cy5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLmZpbGVUYWJsZS5w
b3B1cG1lbnUucmV0cmlldmVEaXJlY3RFeHRlcm5hbERvd25sb2FkcyIpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQorCQkJIGNvcHlLZXlzQW5kTmFtZXNJdGVtLmFkZEFjdGlvbkxp
c3RlbmVyKHRoaXMpOworCQkJIGNvcHlFeHRlbmRlZEluZm9JdGVtLmFkZEFjdGlvbkxpc3Rl
bmVyKHRoaXMpOworCQkJIHJlc3RhcnRTZWxlY3RlZERvd25sb2Fkc0l0ZW0uYWRkQWN0aW9u
TGlzdGVuZXIodGhpcyk7CisJCQkgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHNJdGVtLmFkZEFj
dGlvbkxpc3RlbmVyKHRoaXMpOworCQkJIGVuYWJsZUFsbERvd25sb2Fkc0l0ZW0uYWRkQWN0
aW9uTGlzdGVuZXIodGhpcyk7CisJCQkgZGlzYWJsZUFsbERvd25sb2Fkc0l0ZW0uYWRkQWN0
aW9uTGlzdGVuZXIodGhpcyk7CisJCQkgZW5hYmxlU2VsZWN0ZWREb3dubG9hZHNJdGVtLmFk
ZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJIGRpc2FibGVTZWxlY3RlZERvd25sb2Fkc0l0
ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkgaW52ZXJ0RW5hYmxlZEFsbEl0ZW0u
YWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkgaW52ZXJ0RW5hYmxlZFNlbGVjdGVkSXRl
bS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCSBkZXRhaWxzSXRlbS5hZGRBY3Rpb25M
aXN0ZW5lcih0aGlzKTsKKwkJCSBzdGFydFNlbGVjdGVkRG93bmxvYWRzTm93LmFkZEFjdGlv
bkxpc3RlbmVyKHRoaXMpOworCQkJIHVzZVRoaXNEb3dubG9hZERpckl0ZW0uYWRkQWN0aW9u
TGlzdGVuZXIodGhpcyk7CisJCQkganVtcFRvQXNzb2NpYXRlZE1lc3NhZ2UuYWRkQWN0aW9u
TGlzdGVuZXIodGhpcyk7CisJCSB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVy
Zm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIGlmIChlLmdldFNv
dXJjZSgpID09IGNvcHlLZXlzQW5kTmFtZXNJdGVtKSB7Ci0gICAgICAgICAgICAgICAgQ29w
eVRvQ2xpcGJvYXJkLmNvcHlLZXlzQW5kRmlsZW5hbWVzKG1vZGVsVGFibGUuZ2V0U2VsZWN0
ZWRJdGVtcygpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBj
b3B5RXh0ZW5kZWRJbmZvSXRlbSkgewotICAgICAgICAgICAgICAgIENvcHlUb0NsaXBib2Fy
ZC5jb3B5RXh0ZW5kZWRJbmZvKG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLSAg
ICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSByZXN0YXJ0U2VsZWN0ZWRE
b3dubG9hZHNJdGVtKSB7Ci0gICAgICAgICAgICAgICAgcmVzdGFydFNlbGVjdGVkRG93bmxv
YWRzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gdXNlVGhp
c0Rvd25sb2FkRGlySXRlbSkgewotICAgICAgICAgICAgICAgIHVzZVRoaXNEb3dubG9hZERp
cmVjdG9yeSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IGp1
bXBUb0Fzc29jaWF0ZWRNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAganVtcFRvQXNzb2Np
YXRlZE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9
PSByZW1vdmVTZWxlY3RlZERvd25sb2Fkc0l0ZW0pIHsKLSAgICAgICAgICAgICAgICByZW1v
dmVTZWxlY3RlZERvd25sb2FkcygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNv
dXJjZSgpID09IGVuYWJsZUFsbERvd25sb2Fkc0l0ZW0pIHsKLSAgICAgICAgICAgICAgICBl
bmFibGVBbGxEb3dubG9hZHMoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3Vy
Y2UoKSA9PSBkaXNhYmxlQWxsRG93bmxvYWRzSXRlbSkgewotICAgICAgICAgICAgICAgIGRp
c2FibGVBbGxEb3dubG9hZHMoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3Vy
Y2UoKSA9PSBlbmFibGVTZWxlY3RlZERvd25sb2Fkc0l0ZW0pIHsKLSAgICAgICAgICAgICAg
ICBlbmFibGVTZWxlY3RlZERvd25sb2FkcygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChl
LmdldFNvdXJjZSgpID09IGRpc2FibGVTZWxlY3RlZERvd25sb2Fkc0l0ZW0pIHsKLSAgICAg
ICAgICAgICAgICBkaXNhYmxlU2VsZWN0ZWREb3dubG9hZHMoKTsKLSAgICAgICAgICAgIH0g
ZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBpbnZlcnRFbmFibGVkQWxsSXRlbSkgewotICAg
ICAgICAgICAgICAgIGludmVydEVuYWJsZWRBbGwoKTsKLSAgICAgICAgICAgIH0gZWxzZSBp
ZiAoZS5nZXRTb3VyY2UoKSA9PSBpbnZlcnRFbmFibGVkU2VsZWN0ZWRJdGVtKSB7Ci0gICAg
ICAgICAgICAgICAgaW52ZXJ0RW5hYmxlZFNlbGVjdGVkKCk7Ci0gICAgICAgICAgICB9IGVs
c2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gZGV0YWlsc0l0ZW0pIHsKLSAgICAgICAgICAgICAg
ICBzaG93RGV0YWlscygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgp
ID09IHByaW8wSXRlbSkgewotICAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5KDApOwot
ICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IHByaW8xSXRlbSkgewot
ICAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5KDEpOwotICAgICAgICAgICAgfSBlbHNl
IGlmIChlLmdldFNvdXJjZSgpID09IHByaW8ySXRlbSkgewotICAgICAgICAgICAgICAgIGNo
YW5nZVByaW9yaXR5KDIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgp
ID09IHByaW8zSXRlbSkgewotICAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5KDMpOwot
ICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IHByaW80SXRlbSkgewot
ICAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5KDQpOwotICAgICAgICAgICAgfSBlbHNl
IGlmIChlLmdldFNvdXJjZSgpID09IHByaW81SXRlbSkgewotICAgICAgICAgICAgICAgIGNo
YW5nZVByaW9yaXR5KDUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgp
ID09IHByaW82SXRlbSkgewotICAgICAgICAgICAgICAgIGNoYW5nZVByaW9yaXR5KDYpOwot
ICAgICAgICAgICAgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IHJlbW92ZUZyb21HcUl0
ZW0pIHsKLSAgICAgICAgICAgICAgICByZW1vdmVTZWxlY3RlZFVwbG9hZHNGcm9tR2xvYmFs
UXVldWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSByZXRy
aWV2ZURpcmVjdEV4dGVybmFsRG93bmxvYWRzKSB7Ci0gICAgICAgICAgICAgICAgcmV0cmll
dmVEaXJlY3RFeHRlcm5hbERvd25sb2FkcygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChl
LmdldFNvdXJjZSgpID09IHN0YXJ0U2VsZWN0ZWREb3dubG9hZHNOb3cgKSB7Ci0gICAgICAg
ICAgICAgICAgc3RhcnRTZWxlY3RlZERvd25sb2Fkc05vdygpOwotICAgICAgICAgICAgfQot
ICAgICAgICB9CisJCSBwcml2YXRlIHZvaWQgcmVmcmVzaExhbmd1YWdlKCkgeworCQkJIGRl
dGFpbHNJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24uZGV0YWlscyIp
KTsKKwkJCSBjb3B5S2V5c0FuZE5hbWVzSXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmlu
ZygiQ29tbW9uLmNvcHlUb0NsaXBCb2FyZC5jb3B5S2V5c1dpdGhGaWxlbmFtZXMiKSk7CisJ
CQkgY29weUV4dGVuZGVkSW5mb0l0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIkNv
bW1vbi5jb3B5VG9DbGlwQm9hcmQuY29weUV4dGVuZGVkSW5mbyIpKTsKKwkJCSByZXN0YXJ0
U2VsZWN0ZWREb3dubG9hZHNJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3du
bG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5yZXN0YXJ0U2VsZWN0ZWREb3dubG9hZHMi
KSk7CisJCQkgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHNJdGVtLnNldFRleHQobGFuZ3VhZ2Uu
Z2V0U3RyaW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5yZW1vdmUucmVt
b3ZlU2VsZWN0ZWREb3dubG9hZHMiKSk7CisJCQkgZW5hYmxlQWxsRG93bmxvYWRzSXRlbS5z
ZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLmZpbGVUYWJsZS5wb3B1
cG1lbnUuZW5hYmxlRG93bmxvYWRzLmVuYWJsZUFsbERvd25sb2FkcyIpKTsKKwkJCSBkaXNh
YmxlQWxsRG93bmxvYWRzSXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxv
YWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUuZW5hYmxlRG93bmxvYWRzLmRpc2FibGVBbGxE
b3dubG9hZHMiKSk7CisJCQkgZW5hYmxlU2VsZWN0ZWREb3dubG9hZHNJdGVtLnNldFRleHQo
bGFuZ3VhZ2UuZ2V0U3RyaW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5l
bmFibGVEb3dubG9hZHMuZW5hYmxlU2VsZWN0ZWREb3dubG9hZHMiKSk7CisJCQkgZGlzYWJs
ZVNlbGVjdGVkRG93bmxvYWRzSXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93
bmxvYWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUuZW5hYmxlRG93bmxvYWRzLmRpc2FibGVT
ZWxlY3RlZERvd25sb2FkcyIpKTsKKwkJCSBpbnZlcnRFbmFibGVkQWxsSXRlbS5zZXRUZXh0
KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxvYWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUu
ZW5hYmxlRG93bmxvYWRzLmludmVydEVuYWJsZWRTdGF0ZUZvckFsbERvd25sb2FkcyIpKTsK
KwkJCSBpbnZlcnRFbmFibGVkU2VsZWN0ZWRJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3Ry
aW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5lbmFibGVEb3dubG9hZHMu
aW52ZXJ0RW5hYmxlZFN0YXRlRm9yU2VsZWN0ZWREb3dubG9hZHMiKSk7CisJCQkgc3RhcnRT
ZWxlY3RlZERvd25sb2Fkc05vdy5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiRG93bmxv
YWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUuc3RhcnRTZWxlY3RlZERvd25sb2Fkc05vdyIp
KTsKKwkJCSB1c2VUaGlzRG93bmxvYWREaXJJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3Ry
aW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS51c2VUaGlzRG93bmxvYWRE
aXIiKSk7CisJCQkganVtcFRvQXNzb2NpYXRlZE1lc3NhZ2Uuc2V0VGV4dChsYW5ndWFnZS5n
ZXRTdHJpbmcoIkRvd25sb2FkUGFuZS5maWxlVGFibGUucG9wdXBtZW51Lmp1bXBUb0Fzc29j
aWF0ZWRNZXNzYWdlIikpOwogCi0gICAgICAgIHByaXZhdGUgdm9pZCByZW1vdmVTZWxlY3Rl
ZFVwbG9hZHNGcm9tR2xvYmFsUXVldWUoKSB7Ci0gICAgICAgICAgICBpZiggRmlsZVRyYW5z
ZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkgPT0gbnVsbCApIHsK
LSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBm
aW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3Rl
ZEl0ZW1zKCk7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmVxdWVzdHNUb1Jl
bW92ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgZmluYWwgTGlz
dDxGcm9zdERvd25sb2FkSXRlbT4gaXRlbXNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3Q8RnJv
c3REb3dubG9hZEl0ZW0+KCk7Ci0gICAgICAgICAgICBmb3IoZmluYWwgTW9kZWxJdGVtIG1p
IDogc2VsZWN0ZWRJdGVtcykgewotICAgICAgICAgICAgICAgIGZpbmFsIEZyb3N0RG93bmxv
YWRJdGVtIGl0ZW0gPSAoRnJvc3REb3dubG9hZEl0ZW0pIG1pOwotICAgICAgICAgICAgICAg
IGlmKCBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIo
KS5pc0l0ZW1Jbkdsb2JhbFF1ZXVlKGl0ZW0pICkgewotICAgICAgICAgICAgICAgICAgICBy
ZXF1ZXN0c1RvUmVtb3ZlLmFkZCggaXRlbS5nZXRHcUlkZW50aWZpZXIoKSApOwotICAgICAg
ICAgICAgICAgICAgICBpdGVtc1RvVXBkYXRlLmFkZChpdGVtKTsKLSAgICAgICAgICAgICAg
ICAgICAgaXRlbS5zZXRJbnRlcm5hbFJlbW92ZUV4cGVjdGVkKHRydWUpOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGVUcmFuc2Zlck1hbmFn
ZXIuaW5zdCgpLmdldFBlcnNpc3RlbmNlTWFuYWdlcigpLnJlbW92ZVJlcXVlc3RzKHJlcXVl
c3RzVG9SZW1vdmUpOwotICAgICAgICAgICAgLy8gYWZ0ZXIgcmVtb3ZlLCB1cGRhdGUgc3Rh
dGUgb2YgcmVtb3ZlZCBpdGVtcwotICAgICAgICAgICAgZm9yKGZpbmFsIEZyb3N0RG93bmxv
YWRJdGVtIGl0ZW0gOiBpdGVtc1RvVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgaXRlbS5z
ZXRTdGF0ZShGcm9zdERvd25sb2FkSXRlbS5TVEFURV9XQUlUSU5HKTsKLSAgICAgICAgICAg
ICAgICBpdGVtLnNldEVuYWJsZWQoQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgICAgICAgICAg
aXRlbS5zZXRQcmlvcml0eSgtMSk7Ci0gICAgICAgICAgICAgICAgaXRlbS5maXJlVmFsdWVD
aGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJCSBpZiggUGVyc2lzdGVu
Y2VNYW5hZ2VyLmlzUGVyc2lzdGVuY2VFbmFibGVkKCkgKSB7CisJCQkJIGNoYW5nZVByaW9y
aXR5TWVudS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLnByaW9yaXR5LmNo
YW5nZVByaW9yaXR5IikpOworCQkJCSBwcmlvMEl0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRT
dHJpbmcoIkNvbW1vbi5wcmlvcml0eS5wcmlvcml0eTAiKSk7CisJCQkJIHByaW8xSXRlbS5z
ZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLnByaW9yaXR5LnByaW9yaXR5MSIp
KTsKKwkJCQkgcHJpbzJJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24u
cHJpb3JpdHkucHJpb3JpdHkyIikpOworCQkJCSBwcmlvM0l0ZW0uc2V0VGV4dChsYW5ndWFn
ZS5nZXRTdHJpbmcoIkNvbW1vbi5wcmlvcml0eS5wcmlvcml0eTMiKSk7CisJCQkJIHByaW80
SXRlbS5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLnByaW9yaXR5LnByaW9y
aXR5NCIpKTsKKwkJCQkgcHJpbzVJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJD
b21tb24ucHJpb3JpdHkucHJpb3JpdHk1IikpOworCQkJCSBwcmlvNkl0ZW0uc2V0VGV4dChs
YW5ndWFnZS5nZXRTdHJpbmcoIkNvbW1vbi5wcmlvcml0eS5wcmlvcml0eTYiKSk7CisJCQkJ
IHJlbW92ZUZyb21HcUl0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIkRvd25sb2Fk
UGFuZS5maWxlVGFibGUucG9wdXBtZW51LnJlbW92ZUZyb21HbG9iYWxRdWV1ZSIpKTsKIAot
ICAgICAgICBwcml2YXRlIHZvaWQgcmV0cmlldmVEaXJlY3RFeHRlcm5hbERvd25sb2Fkcygp
IHsKLSAgICAgICAgICAgIGlmKCBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXRQZXJz
aXN0ZW5jZU1hbmFnZXIoKSA9PSBudWxsICkgewotICAgICAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIE1vZGVsSXRlbVtdIHNlbGVjdGVk
SXRlbXMgPSBtb2RlbFRhYmxlLmdldFNlbGVjdGVkSXRlbXMoKTsKLSAgICAgICAgICAgIGZv
cihmaW5hbCBNb2RlbEl0ZW0gbWkgOiBzZWxlY3RlZEl0ZW1zKSB7Ci0gICAgICAgICAgICAg
ICAgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERvd25sb2FkSXRlbSkg
bWk7Ci0gICAgICAgICAgICAgICAgaWYoIGl0ZW0uaXNFeHRlcm5hbCgpICYmIGl0ZW0uaXNE
aXJlY3QoKSAmJiBpdGVtLmdldFN0YXRlKCkgPT0gRnJvc3REb3dubG9hZEl0ZW0uU1RBVEVf
RE9ORSApIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBleHBlY3RlZEZpbGVT
aXplID0gaXRlbS5nZXRGaWxlU2l6ZSgpOyAvLyBzZXQgZnJvbSBnbG9iYWwgcXVldWUKLSAg
ICAgICAgICAgICAgICAgICAgRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lz
dGVuY2VNYW5hZ2VyKCkubWF5YmVFbnF1ZXVlRGlyZWN0R2V0KGl0ZW0sIGV4cGVjdGVkRmls
ZVNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQor
CQkJCSByZXRyaWV2ZURpcmVjdEV4dGVybmFsRG93bmxvYWRzLnNldFRleHQobGFuZ3VhZ2Uu
Z2V0U3RyaW5nKCJEb3dubG9hZFBhbmUuZmlsZVRhYmxlLnBvcHVwbWVudS5yZXRyaWV2ZURp
cmVjdEV4dGVybmFsRG93bmxvYWRzIikpOworCQkJIH0KKwkJIH0KIAotICAgICAgICBwcml2
YXRlIHZvaWQgc3RhcnRTZWxlY3RlZERvd25sb2Fkc05vdygpIHsKLSAgICAgICAgICAgIGZp
bmFsIE1vZGVsSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSBtb2RlbFRhYmxlLmdldFNlbGVjdGVk
SXRlbXMoKTsKKwkJIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25F
dmVudCBlKSB7CisJCQkgaWYgKGUuZ2V0U291cmNlKCkgPT0gY29weUtleXNBbmROYW1lc0l0
ZW0pIHsKKwkJCQkgQ29weVRvQ2xpcGJvYXJkLmNvcHlLZXlzQW5kRmlsZW5hbWVzKG1vZGVs
VGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKKwkJCSB9IGVsc2UgaWYgKGUuZ2V0U291cmNl
KCkgPT0gY29weUV4dGVuZGVkSW5mb0l0ZW0pIHsKKwkJCQkgQ29weVRvQ2xpcGJvYXJkLmNv
cHlFeHRlbmRlZEluZm8obW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCkpOworCQkJIH0g
ZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSByZXN0YXJ0U2VsZWN0ZWREb3dubG9hZHNJdGVt
KSB7CisJCQkJIHJlc3RhcnRTZWxlY3RlZERvd25sb2FkcygpOworCQkJIH0gZWxzZSBpZiAo
ZS5nZXRTb3VyY2UoKSA9PSB1c2VUaGlzRG93bmxvYWREaXJJdGVtKSB7CisJCQkJIHVzZVRo
aXNEb3dubG9hZERpcmVjdG9yeSgpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9
PSBqdW1wVG9Bc3NvY2lhdGVkTWVzc2FnZSkgeworCQkJCSBqdW1wVG9Bc3NvY2lhdGVkTWVz
c2FnZSgpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSByZW1vdmVTZWxlY3Rl
ZERvd25sb2Fkc0l0ZW0pIHsKKwkJCQkgcmVtb3ZlU2VsZWN0ZWREb3dubG9hZHMoKTsKKwkJ
CSB9IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gZW5hYmxlQWxsRG93bmxvYWRzSXRlbSkg
eworCQkJCSBlbmFibGVBbGxEb3dubG9hZHMoKTsKKwkJCSB9IGVsc2UgaWYgKGUuZ2V0U291
cmNlKCkgPT0gZGlzYWJsZUFsbERvd25sb2Fkc0l0ZW0pIHsKKwkJCQkgZGlzYWJsZUFsbERv
d25sb2FkcygpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBlbmFibGVTZWxl
Y3RlZERvd25sb2Fkc0l0ZW0pIHsKKwkJCQkgZW5hYmxlU2VsZWN0ZWREb3dubG9hZHMoKTsK
KwkJCSB9IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gZGlzYWJsZVNlbGVjdGVkRG93bmxv
YWRzSXRlbSkgeworCQkJCSBkaXNhYmxlU2VsZWN0ZWREb3dubG9hZHMoKTsKKwkJCSB9IGVs
c2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gaW52ZXJ0RW5hYmxlZEFsbEl0ZW0pIHsKKwkJCQkg
aW52ZXJ0RW5hYmxlZEFsbCgpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBp
bnZlcnRFbmFibGVkU2VsZWN0ZWRJdGVtKSB7CisJCQkJIGludmVydEVuYWJsZWRTZWxlY3Rl
ZCgpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBkZXRhaWxzSXRlbSkgewor
CQkJCSBzaG93RGV0YWlscygpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBw
cmlvMEl0ZW0pIHsKKwkJCQkgY2hhbmdlUHJpb3JpdHkoMCk7CisJCQkgfSBlbHNlIGlmIChl
LmdldFNvdXJjZSgpID09IHByaW8xSXRlbSkgeworCQkJCSBjaGFuZ2VQcmlvcml0eSgxKTsK
KwkJCSB9IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gcHJpbzJJdGVtKSB7CisJCQkJIGNo
YW5nZVByaW9yaXR5KDIpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBwcmlv
M0l0ZW0pIHsKKwkJCQkgY2hhbmdlUHJpb3JpdHkoMyk7CisJCQkgfSBlbHNlIGlmIChlLmdl
dFNvdXJjZSgpID09IHByaW80SXRlbSkgeworCQkJCSBjaGFuZ2VQcmlvcml0eSg0KTsKKwkJ
CSB9IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gcHJpbzVJdGVtKSB7CisJCQkJIGNoYW5n
ZVByaW9yaXR5KDUpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBwcmlvNkl0
ZW0pIHsKKwkJCQkgY2hhbmdlUHJpb3JpdHkoNik7CisJCQkgfSBlbHNlIGlmIChlLmdldFNv
dXJjZSgpID09IHJlbW92ZUZyb21HcUl0ZW0pIHsKKwkJCQkgcmVtb3ZlU2VsZWN0ZWRVcGxv
YWRzRnJvbUdsb2JhbFF1ZXVlKCk7CisJCQkgfSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09
IHJldHJpZXZlRGlyZWN0RXh0ZXJuYWxEb3dubG9hZHMpIHsKKwkJCQkgcmV0cmlldmVEaXJl
Y3RFeHRlcm5hbERvd25sb2FkcygpOworCQkJIH0gZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9
PSBzdGFydFNlbGVjdGVkRG93bmxvYWRzTm93ICkgeworCQkJCSBzdGFydFNlbGVjdGVkRG93
bmxvYWRzTm93KCk7CisJCQkgfQorCQkgfQogCi0gICAgICAgICAgICBmaW5hbCBMaXN0PEZy
b3N0RG93bmxvYWRJdGVtPiBpdGVtc1RvU3RhcnQgPSBuZXcgTGlua2VkTGlzdDxGcm9zdERv
d25sb2FkSXRlbT4oKTsKLSAgICAgICAgICAgIGZvciggZmluYWwgTW9kZWxJdGVtIG1pIDog
c2VsZWN0ZWRJdGVtcyApIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBGcm9zdERvd25sb2Fk
SXRlbSBpID0gKEZyb3N0RG93bmxvYWRJdGVtKW1pOwotICAgICAgICAgICAgICAgIGlmKCBp
LmlzRXh0ZXJuYWwoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKCBpLmdldFN0YXRlKCkgIT0gRnJv
c3REb3dubG9hZEl0ZW0uU1RBVEVfV0FJVElORyApIHsKLSAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKCBpLmdl
dEtleSgpID09IG51bGwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpdGVtc1RvU3RhcnQuYWRkKGkpOwot
ICAgICAgICAgICAgfQorCQkgcHJpdmF0ZSB2b2lkIHJlbW92ZVNlbGVjdGVkVXBsb2Fkc0Zy
b21HbG9iYWxRdWV1ZSgpIHsKKwkJCSBpZiggRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCku
Z2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkgPT0gbnVsbCApIHsKKwkJCQkgcmV0dXJuOworCQkJ
IH0KKwkJCSBmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5n
ZXRTZWxlY3RlZEl0ZW1zKCk7CisJCQkgZmluYWwgTGlzdDxTdHJpbmc+IHJlcXVlc3RzVG9S
ZW1vdmUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJCSBmaW5hbCBMaXN0PEZyb3N0
RG93bmxvYWRJdGVtPiBpdGVtc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdDxGcm9zdERvd25s
b2FkSXRlbT4oKTsKKwkJCSBmb3IoZmluYWwgTW9kZWxJdGVtIG1pIDogc2VsZWN0ZWRJdGVt
cykgeworCQkJCSBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVtID0gKEZyb3N0RG93bmxv
YWRJdGVtKSBtaTsKKwkJCQkgaWYoIEZpbGVUcmFuc2Zlck1hbmFnZXIuaW5zdCgpLmdldFBl
cnNpc3RlbmNlTWFuYWdlcigpLmlzSXRlbUluR2xvYmFsUXVldWUoaXRlbSkgKSB7CisJCQkJ
CSByZXF1ZXN0c1RvUmVtb3ZlLmFkZCggaXRlbS5nZXRHcUlkZW50aWZpZXIoKSApOworCQkJ
CQkgaXRlbXNUb1VwZGF0ZS5hZGQoaXRlbSk7CisJCQkJCSBpdGVtLnNldEludGVybmFsUmVt
b3ZlRXhwZWN0ZWQodHJ1ZSk7CisJCQkJIH0KKwkJCSB9CisJCQkgRmlsZVRyYW5zZmVyTWFu
YWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkucmVtb3ZlUmVxdWVzdHMocmVx
dWVzdHNUb1JlbW92ZSk7CisJCQkgLy8gYWZ0ZXIgcmVtb3ZlLCB1cGRhdGUgc3RhdGUgb2Yg
cmVtb3ZlZCBpdGVtcworCQkJIGZvcihmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVtIDog
aXRlbXNUb1VwZGF0ZSkgeworCQkJCSBpdGVtLnNldFN0YXRlKEZyb3N0RG93bmxvYWRJdGVt
LlNUQVRFX1dBSVRJTkcpOworCQkJCSBpdGVtLnNldEVuYWJsZWQoQm9vbGVhbi5GQUxTRSk7
CisJCQkJIGl0ZW0uc2V0UHJpb3JpdHkoLTEpOworCQkJCSBpdGVtLmZpcmVWYWx1ZUNoYW5n
ZWQoKTsKKwkJCSB9CisJCSB9CiAKLSAgICAgICAgICAgIGZvcihmaW5hbCBGcm9zdERvd25s
b2FkSXRlbSBkbEl0ZW0gOiBpdGVtc1RvU3RhcnQpIHsKLSAgICAgICAgICAgICAgICBkbEl0
ZW0uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBGaWxlVHJhbnNmZXJNYW5h
Z2VyLmluc3QoKS5nZXREb3dubG9hZE1hbmFnZXIoKS5zdGFydERvd25sb2FkKGRsSXRlbSk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJIHByaXZhdGUgdm9pZCByZXRyaWV2ZURp
cmVjdEV4dGVybmFsRG93bmxvYWRzKCkgeworCQkJIGlmKCBGaWxlVHJhbnNmZXJNYW5hZ2Vy
Lmluc3QoKS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKSA9PSBudWxsICkgeworCQkJCSByZXR1
cm47CisJCQkgfQorCQkJIGZpbmFsIE1vZGVsSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSBtb2Rl
bFRhYmxlLmdldFNlbGVjdGVkSXRlbXMoKTsKKwkJCSBmb3IoZmluYWwgTW9kZWxJdGVtIG1p
IDogc2VsZWN0ZWRJdGVtcykgeworCQkJCSBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVt
ID0gKEZyb3N0RG93bmxvYWRJdGVtKSBtaTsKKwkJCQkgaWYoIGl0ZW0uaXNFeHRlcm5hbCgp
ICYmIGl0ZW0uaXNEaXJlY3QoKSAmJiBpdGVtLmdldFN0YXRlKCkgPT0gRnJvc3REb3dubG9h
ZEl0ZW0uU1RBVEVfRE9ORSApIHsKKwkJCQkJIGZpbmFsIGxvbmcgZXhwZWN0ZWRGaWxlU2l6
ZSA9IGl0ZW0uZ2V0RmlsZVNpemUoKTsgLy8gc2V0IGZyb20gZ2xvYmFsIHF1ZXVlCisJCQkJ
CSBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKS5t
YXliZUVucXVldWVEaXJlY3RHZXQoaXRlbSwgZXhwZWN0ZWRGaWxlU2l6ZSk7CisJCQkJIH0K
KwkJCSB9CisJCSB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZVByaW9yaXR5KGZp
bmFsIGludCBwcmlvKSB7Ci0gICAgICAgICAgICBpZiggRmlsZVRyYW5zZmVyTWFuYWdlci5p
bnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkgPT0gbnVsbCApIHsKLSAgICAgICAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBNb2RlbEl0
ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0g
ICAgICAgICAgICBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXRQZXJzaXN0ZW5jZU1h
bmFnZXIoKS5jaGFuZ2VJdGVtUHJpb3JpdGVzKHNlbGVjdGVkSXRlbXMsIHByaW8pOwotICAg
ICAgICB9CisJCSBwcml2YXRlIHZvaWQgc3RhcnRTZWxlY3RlZERvd25sb2Fkc05vdygpIHsK
KwkJCSBmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRT
ZWxlY3RlZEl0ZW1zKCk7CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNob3dEZXRhaWxzKCkg
ewotICAgICAgICAgICAgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IG1vZGVs
VGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOwotICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRl
bXMubGVuZ3RoICE9IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVtID0gKEZyb3N0
RG93bmxvYWRJdGVtKSBzZWxlY3RlZEl0ZW1zWzBdOwotICAgICAgICAgICAgaWYoICFpdGVt
LmlzU2hhcmVkRmlsZSgpICkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIG5ldyBGaWxlTGlzdEZpbGVEZXRhaWxzRGlhbG9nKE1haW5G
cmFtZS5nZXRJbnN0YW5jZSgpKS5zdGFydERpYWxvZyhpdGVtLmdldEZpbGVMaXN0RmlsZU9i
amVjdCgpKTsKLSAgICAgICAgfQorCQkJIGZpbmFsIExpc3Q8RnJvc3REb3dubG9hZEl0ZW0+
IGl0ZW1zVG9TdGFydCA9IG5ldyBMaW5rZWRMaXN0PEZyb3N0RG93bmxvYWRJdGVtPigpOwor
CQkJIGZvciggZmluYWwgTW9kZWxJdGVtIG1pIDogc2VsZWN0ZWRJdGVtcyApIHsKKwkJCQkg
ZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaSA9IChGcm9zdERvd25sb2FkSXRlbSltaTsKKwkJ
CQkgaWYoIGkuaXNFeHRlcm5hbCgpICkgeworCQkJCQkgY29udGludWU7CisJCQkJIH0KKwkJ
CQkgaWYoIGkuZ2V0U3RhdGUoKSAhPSBGcm9zdERvd25sb2FkSXRlbS5TVEFURV9XQUlUSU5H
ICkgeworCQkJCQkgY29udGludWU7CisJCQkJIH0KKwkJCQkgaWYoIGkuZ2V0S2V5KCkgPT0g
bnVsbCApIHsKKwkJCQkJIGNvbnRpbnVlOworCQkJCSB9CisJCQkJIGl0ZW1zVG9TdGFydC5h
ZGQoaSk7CisJCQkgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbnZlcnRFbmFibGVkU2Vs
ZWN0ZWQoKSB7Ci0gICAgICAgICAgICBmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0ZW1z
ID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0gICAgICAgICAgICBtb2RlbC5z
ZXRJdGVtc0VuYWJsZWQobnVsbCwgc2VsZWN0ZWRJdGVtcyk7Ci0gICAgICAgIH0KKwkJCSBm
b3IoZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gZGxJdGVtIDogaXRlbXNUb1N0YXJ0KSB7CisJ
CQkJIGRsSXRlbS5zZXRFbmFibGVkKHRydWUpOworCQkJCSBGaWxlVHJhbnNmZXJNYW5hZ2Vy
Lmluc3QoKS5nZXREb3dubG9hZE1hbmFnZXIoKS5zdGFydERvd25sb2FkKGRsSXRlbSk7CisJ
CQkgfQorCQkgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbnZlcnRFbmFibGVkQWxsKCkg
ewotICAgICAgICAgICAgbW9kZWwuc2V0QWxsSXRlbXNFbmFibGVkKG51bGwpOwotICAgICAg
ICB9CisJCSBwcml2YXRlIHZvaWQgY2hhbmdlUHJpb3JpdHkoZmluYWwgaW50IHByaW8pIHsK
KwkJCSBpZiggRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5h
Z2VyKCkgPT0gbnVsbCApIHsKKwkJCQkgcmV0dXJuOworCQkJIH0KKwkJCSBmaW5hbCBNb2Rl
bEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7
CisJCQkgRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2Vy
KCkuY2hhbmdlSXRlbVByaW9yaXRlcyhzZWxlY3RlZEl0ZW1zLCBwcmlvKTsKKwkJIH0KIAot
ICAgICAgICBwcml2YXRlIHZvaWQgZGlzYWJsZVNlbGVjdGVkRG93bmxvYWRzKCkgewotICAg
ICAgICAgICAgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IG1vZGVsVGFibGUu
Z2V0U2VsZWN0ZWRJdGVtcygpOwotICAgICAgICAgICAgbW9kZWwuc2V0SXRlbXNFbmFibGVk
KEJvb2xlYW4uRkFMU0UsIHNlbGVjdGVkSXRlbXMpOwotICAgICAgICB9CisJCSBwcml2YXRl
IHZvaWQgc2hvd0RldGFpbHMoKSB7CisJCQkgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJ
dGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOworCQkJIGlmIChzZWxlY3Rl
ZEl0ZW1zLmxlbmd0aCAhPSAxKSB7CisJCQkJIHJldHVybjsKKwkJCSB9CisJCQkgZmluYWwg
RnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERvd25sb2FkSXRlbSkgc2VsZWN0ZWRJ
dGVtc1swXTsKKwkJCSBpZiggIWl0ZW0uaXNTaGFyZWRGaWxlKCkgKSB7CisJCQkJIHJldHVy
bjsKKwkJCSB9CisJCQkgbmV3IEZpbGVMaXN0RmlsZURldGFpbHNEaWFsb2coTWFpbkZyYW1l
LmdldEluc3RhbmNlKCkpLnN0YXJ0RGlhbG9nKGl0ZW0uZ2V0RmlsZUxpc3RGaWxlT2JqZWN0
KCkpOworCQkgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbmFibGVTZWxlY3RlZERvd25s
b2FkcygpIHsKLSAgICAgICAgICAgIGZpbmFsIE1vZGVsSXRlbVtdIHNlbGVjdGVkSXRlbXMg
PSBtb2RlbFRhYmxlLmdldFNlbGVjdGVkSXRlbXMoKTsKLSAgICAgICAgICAgIG1vZGVsLnNl
dEl0ZW1zRW5hYmxlZChCb29sZWFuLlRSVUUsIHNlbGVjdGVkSXRlbXMpOwotICAgICAgICB9
CisJCSBwcml2YXRlIHZvaWQgaW52ZXJ0RW5hYmxlZFNlbGVjdGVkKCkgeworCQkJIGZpbmFs
IE1vZGVsSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSBtb2RlbFRhYmxlLmdldFNlbGVjdGVkSXRl
bXMoKTsKKwkJCSBtb2RlbC5zZXRJdGVtc0VuYWJsZWQobnVsbCwgc2VsZWN0ZWRJdGVtcyk7
CisJCSB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVBbGxEb3dubG9hZHMoKSB7
Ci0gICAgICAgICAgICBtb2RlbC5zZXRBbGxJdGVtc0VuYWJsZWQoQm9vbGVhbi5GQUxTRSk7
Ci0gICAgICAgIH0KKwkJIHByaXZhdGUgdm9pZCBpbnZlcnRFbmFibGVkQWxsKCkgeworCQkJ
IG1vZGVsLnNldEFsbEl0ZW1zRW5hYmxlZChudWxsKTsKKwkJIH0KIAotICAgICAgICBwcml2
YXRlIHZvaWQgZW5hYmxlQWxsRG93bmxvYWRzKCkgewotICAgICAgICAgICAgbW9kZWwuc2V0
QWxsSXRlbXNFbmFibGVkKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0KKwkJIHByaXZhdGUg
dm9pZCBkaXNhYmxlU2VsZWN0ZWREb3dubG9hZHMoKSB7CisJCQkgZmluYWwgTW9kZWxJdGVt
W10gc2VsZWN0ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOworCQkJ
IG1vZGVsLnNldEl0ZW1zRW5hYmxlZChCb29sZWFuLkZBTFNFLCBzZWxlY3RlZEl0ZW1zKTsK
KwkJIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgcmVzdGFydFNlbGVjdGVkRG93bmxvYWRz
KCkgewotICAgICAgICAgICAgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IG1v
ZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOwotICAgICAgICAgICAgbW9kZWwucmVzdGFy
dEl0ZW1zKHNlbGVjdGVkSXRlbXMpOwotICAgICAgICB9CisJCSBwcml2YXRlIHZvaWQgZW5h
YmxlU2VsZWN0ZWREb3dubG9hZHMoKSB7CisJCQkgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0
ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOworCQkJIG1vZGVsLnNl
dEl0ZW1zRW5hYmxlZChCb29sZWFuLlRSVUUsIHNlbGVjdGVkSXRlbXMpOworCQkgfQogCi0g
ICAgICAgIHByaXZhdGUgdm9pZCB1c2VUaGlzRG93bmxvYWREaXJlY3RvcnkoKSB7Ci0gICAg
ICAgIAlmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRT
ZWxlY3RlZEl0ZW1zKCk7Ci0gICAgICAgIAlpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAw
KSB7Ci0gICAgICAgIAkJZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERv
d25sb2FkSXRlbSlzZWxlY3RlZEl0ZW1zWzBdOworCQkgcHJpdmF0ZSB2b2lkIGRpc2FibGVB
bGxEb3dubG9hZHMoKSB7CisJCQkgbW9kZWwuc2V0QWxsSXRlbXNFbmFibGVkKEJvb2xlYW4u
RkFMU0UpOworCQkgfQogCi0gICAgICAgIAkJZG93bmxvYWREaXJUZXh0RmllbGQuc2V0VGV4
dChpdGVtLmdldERvd25sb2FkRGlyKCkpOwotICAgICAgICAJfQotICAgICAgICB9CisJCSBw
cml2YXRlIHZvaWQgZW5hYmxlQWxsRG93bmxvYWRzKCkgeworCQkJIG1vZGVsLnNldEFsbEl0
ZW1zRW5hYmxlZChCb29sZWFuLlRSVUUpOworCQkgfQogCi0gICAgICAgIHByaXZhdGUgdm9p
ZCBqdW1wVG9Bc3NvY2lhdGVkTWVzc2FnZSgpIHsKLSAgICAgICAgICAgIGZpbmFsIE1vZGVs
SXRlbVtdIHNlbGVjdGVkSXRlbXMgPSBtb2RlbFRhYmxlLmdldFNlbGVjdGVkSXRlbXMoKTsK
LSAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHsKLSAgICAgICAg
ICAgIAlmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVtID0gKEZyb3N0RG93bmxvYWRJdGVt
KXNlbGVjdGVkSXRlbXNbMF07Ci0JCQkJZmluYWwgU3RyaW5nIGJvYXJkTmFtZSA9IGl0ZW0u
Z2V0QXNzb2NpYXRlZEJvYXJkTmFtZSgpOwotCQkJCWZpbmFsIFN0cmluZyBtZXNzYWdlSWQg
PSBpdGVtLmdldEFzc29jaWF0ZWRNZXNzYWdlSWQoKTsKKwkJIHByaXZhdGUgdm9pZCByZXN0
YXJ0U2VsZWN0ZWREb3dubG9hZHMoKSB7CisJCQkgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0
ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOworCQkJIG1vZGVsLnJl
c3RhcnRJdGVtcyhzZWxlY3RlZEl0ZW1zKTsKKwkJIH0KIAotCQkJCWlmIChib2FyZE5hbWUg
IT0gbnVsbCAmJiBtZXNzYWdlSWQgIT0gbnVsbCkgewotCQkJCQlmaW5hbCBCb2FyZCBib2Fy
ZCA9IE1haW5GcmFtZS5nZXRJbnN0YW5jZSgpLmdldEZyb3N0TWVzc2FnZVRhYigpLmdldFRv
ZlRyZWVNb2RlbCgpLmdldEJvYXJkQnlOYW1lKGJvYXJkTmFtZSk7Ci0JCQkJCWZpbmFsIFRv
ZlRyZWUgdCA9IE1haW5GcmFtZS5nZXRJbnN0YW5jZSgpLmdldEZyb3N0TWVzc2FnZVRhYigp
LmdldFRvZlRyZWUoKTsKKwkJIHByaXZhdGUgdm9pZCB1c2VUaGlzRG93bmxvYWREaXJlY3Rv
cnkoKSB7CisJCQkgZmluYWwgTW9kZWxJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IG1vZGVsVGFi
bGUuZ2V0U2VsZWN0ZWRJdGVtcygpOworCQkJIGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+
IDApIHsKKwkJCQkgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERvd25s
b2FkSXRlbSlzZWxlY3RlZEl0ZW1zWzBdOwogCi0JCQkJCWlmIChib2FyZCAhPSBudWxsICYm
IHQgIT0gbnVsbCkgewotCQkJCQkJdC5jbGVhclNlbGVjdGlvbigpOwotCQkJCQkJTWFpbkZy
YW1lLmdldEluc3RhbmNlKCkuZ2V0RnJvc3RNZXNzYWdlVGFiKCkuZm9yY2VTZWxlY3RNZXNz
YWdlSWQobWVzc2FnZUlkKTsKLQkJCQkJCXQuc2V0U2VsZWN0aW9uUGF0aChuZXcgVHJlZVBh
dGgoYm9hcmQuZ2V0UGF0aCgpKSk7Ci0JCQkJCQlNYWluRnJhbWUuZ2V0SW5zdGFuY2UoKS5z
ZWxlY3RUYWJiZWRQYW5lVGFiKCJNYWluRnJhbWUudGFiYmVkUGFuZS5uZXdzIik7Ci0JCQkJ
CX0KLQkJCQl9Ci0JCQl9Ci0gICAgICAgIH0KKwkJCQkgZG93bmxvYWREaXJUZXh0RmllbGQu
c2V0VGV4dChpdGVtLmdldERvd25sb2FkRGlyKCkpOworCQkJIH0KKwkJIH0KIAotICAgICAg
ICBwdWJsaWMgdm9pZCBsYW5ndWFnZUNoYW5nZWQoZmluYWwgTGFuZ3VhZ2VFdmVudCBldmVu
dCkgewotICAgICAgICAgICAgcmVmcmVzaExhbmd1YWdlKCk7Ci0gICAgICAgIH0KKwkJIHBy
aXZhdGUgdm9pZCBqdW1wVG9Bc3NvY2lhdGVkTWVzc2FnZSgpIHsKKwkJCSBmaW5hbCBNb2Rl
bEl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7
CisJCQkgaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkgeworCQkJCSBmaW5hbCBGcm9z
dERvd25sb2FkSXRlbSBpdGVtID0gKEZyb3N0RG93bmxvYWRJdGVtKXNlbGVjdGVkSXRlbXNb
MF07CisJCQkJIGZpbmFsIFN0cmluZyBib2FyZE5hbWUgPSBpdGVtLmdldEFzc29jaWF0ZWRC
b2FyZE5hbWUoKTsKKwkJCQkgZmluYWwgU3RyaW5nIG1lc3NhZ2VJZCA9IGl0ZW0uZ2V0QXNz
b2NpYXRlZE1lc3NhZ2VJZCgpOwogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJs
aWMgdm9pZCBzaG93KGZpbmFsIENvbXBvbmVudCBpbnZva2VyLCBmaW5hbCBpbnQgeCwgZmlu
YWwgaW50IHkpIHsKLSAgICAgICAgICAgIHJlbW92ZUFsbCgpOworCQkJCSBpZiAoYm9hcmRO
YW1lICE9IG51bGwgJiYgbWVzc2FnZUlkICE9IG51bGwpIHsKKwkJCQkJIGZpbmFsIEJvYXJk
IGJvYXJkID0gTWFpbkZyYW1lLmdldEluc3RhbmNlKCkuZ2V0RnJvc3RNZXNzYWdlVGFiKCku
Z2V0VG9mVHJlZU1vZGVsKCkuZ2V0Qm9hcmRCeU5hbWUoYm9hcmROYW1lKTsKKwkJCQkJIGZp
bmFsIFRvZlRyZWUgdCA9IE1haW5GcmFtZS5nZXRJbnN0YW5jZSgpLmdldEZyb3N0TWVzc2Fn
ZVRhYigpLmdldFRvZlRyZWUoKTsKIAotICAgICAgICAgICAgZmluYWwgTW9kZWxJdGVtW10g
c2VsZWN0ZWRJdGVtcyA9IG1vZGVsVGFibGUuZ2V0U2VsZWN0ZWRJdGVtcygpOworCQkJCQkg
aWYgKGJvYXJkICE9IG51bGwgJiYgdCAhPSBudWxsKSB7CisJCQkJCQkgdC5jbGVhclNlbGVj
dGlvbigpOworCQkJCQkJIE1haW5GcmFtZS5nZXRJbnN0YW5jZSgpLmdldEZyb3N0TWVzc2Fn
ZVRhYigpLmZvcmNlU2VsZWN0TWVzc2FnZUlkKG1lc3NhZ2VJZCk7CisJCQkJCQkgdC5zZXRT
ZWxlY3Rpb25QYXRoKG5ldyBUcmVlUGF0aChib2FyZC5nZXRQYXRoKCkpKTsKKwkJCQkJCSBN
YWluRnJhbWUuZ2V0SW5zdGFuY2UoKS5zZWxlY3RUYWJiZWRQYW5lVGFiKCJNYWluRnJhbWUu
dGFiYmVkUGFuZS5uZXdzIik7CisJCQkJCSB9CisJCQkJIH0KKwkJCSB9CisJCSB9CiAKLSAg
ICAgICAgICAgIGlmKCBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PSAwICkgewotICAgICAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KKwkJIHB1YmxpYyB2b2lkIGxhbmd1YWdl
Q2hhbmdlZChmaW5hbCBMYW5ndWFnZUV2ZW50IGV2ZW50KSB7CisJCQkgcmVmcmVzaExhbmd1
YWdlKCk7CisJCSB9CiAKLSAgICAgICAgICAgIGFkZChjb3B5S2V5c0FuZE5hbWVzSXRlbSk7
Ci0gICAgICAgICAgICBhZGQoY29weUV4dGVuZGVkSW5mb0l0ZW0pOwotICAgICAgICAgICAg
YWRkU2VwYXJhdG9yKCk7Ci0gICAgICAgICAgICBhZGQoc3RhcnRTZWxlY3RlZERvd25sb2Fk
c05vdyk7Ci0gICAgICAgICAgICBhZGQocmVzdGFydFNlbGVjdGVkRG93bmxvYWRzSXRlbSk7
Ci0gICAgICAgICAgICBhZGRTZXBhcmF0b3IoKTsKKwkJIEBPdmVycmlkZQorCQkgcHVibGlj
IHZvaWQgc2hvdyhmaW5hbCBDb21wb25lbnQgaW52b2tlciwgZmluYWwgaW50IHgsIGZpbmFs
IGludCB5KSB7CisJCQkgcmVtb3ZlQWxsKCk7CiAKLSAgICAgICAgICAgIGlmKCBQZXJzaXN0
ZW5jZU1hbmFnZXIuaXNQZXJzaXN0ZW5jZUVuYWJsZWQoKSApIHsKLSAgICAgICAgICAgICAg
ICBhZGQoY2hhbmdlUHJpb3JpdHlNZW51KTsKLSAgICAgICAgICAgICAgICBhZGRTZXBhcmF0
b3IoKTsKLSAgICAgICAgICAgIH0KKwkJCSBmaW5hbCBNb2RlbEl0ZW1bXSBzZWxlY3RlZEl0
ZW1zID0gbW9kZWxUYWJsZS5nZXRTZWxlY3RlZEl0ZW1zKCk7CiAKLSAgICAgICAgICAgIGZp
bmFsIEpNZW51IGVuYWJsZWRTdWJNZW51ID0gbmV3IEpNZW51KGxhbmd1YWdlLmdldFN0cmlu
ZygiRG93bmxvYWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUuZW5hYmxlRG93bmxvYWRzIikg
KyAiLi4uIik7Ci0gICAgICAgICAgICBlbmFibGVkU3ViTWVudS5hZGQoZW5hYmxlU2VsZWN0
ZWREb3dubG9hZHNJdGVtKTsKLSAgICAgICAgICAgIGVuYWJsZWRTdWJNZW51LmFkZChkaXNh
YmxlU2VsZWN0ZWREb3dubG9hZHNJdGVtKTsKLSAgICAgICAgICAgIGVuYWJsZWRTdWJNZW51
LmFkZChpbnZlcnRFbmFibGVkU2VsZWN0ZWRJdGVtKTsKLSAgICAgICAgICAgIGVuYWJsZWRT
dWJNZW51LmFkZFNlcGFyYXRvcigpOworCQkJIGlmKCBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA9
PSAwICkgeworCQkJCSByZXR1cm47CisJCQkgfQogCi0gICAgICAgICAgICBlbmFibGVkU3Vi
TWVudS5hZGQoZW5hYmxlQWxsRG93bmxvYWRzSXRlbSk7Ci0gICAgICAgICAgICBlbmFibGVk
U3ViTWVudS5hZGQoZGlzYWJsZUFsbERvd25sb2Fkc0l0ZW0pOwotICAgICAgICAgICAgZW5h
YmxlZFN1Yk1lbnUuYWRkKGludmVydEVuYWJsZWRBbGxJdGVtKTsKLSAgICAgICAgICAgIGFk
ZChlbmFibGVkU3ViTWVudSk7CisJCQkgYWRkKGNvcHlLZXlzQW5kTmFtZXNJdGVtKTsKKwkJ
CSBhZGQoY29weUV4dGVuZGVkSW5mb0l0ZW0pOworCQkJIGFkZFNlcGFyYXRvcigpOworCQkJ
IGFkZChzdGFydFNlbGVjdGVkRG93bmxvYWRzTm93KTsKKwkJCSBhZGQocmVzdGFydFNlbGVj
dGVkRG93bmxvYWRzSXRlbSk7CisJCQkgYWRkU2VwYXJhdG9yKCk7CiAKLSAgICAgICAgICAg
IC8vIHdlIG9ubHkgZmluZCBleHRlcm5hbCBpdGVtcyBpZiBwZXJzaXN0ZW5jZSBpcyBlbmFi
bGVkCi0gICAgICAgICAgICBpZiggUGVyc2lzdGVuY2VNYW5hZ2VyLmlzUGVyc2lzdGVuY2VF
bmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGZpbmFsIE1vZGVsSXRlbSBtaSA6
IHNlbGVjdGVkSXRlbXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgRnJvc3REb3du
bG9hZEl0ZW0gaXRlbSA9IChGcm9zdERvd25sb2FkSXRlbSkgbWk7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmKCBpdGVtLmlzRXh0ZXJuYWwoKSAmJiBpdGVtLmlzRGlyZWN0KCkgJiYgaXRl
bS5nZXRTdGF0ZSgpID09IEZyb3N0RG93bmxvYWRJdGVtLlNUQVRFX0RPTkUgKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBhZGQocmV0cmlldmVEaXJlY3RFeHRlcm5hbERvd25sb2Fk
cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFk
ZChyZW1vdmVTZWxlY3RlZERvd25sb2Fkc0l0ZW0pOwotICAgICAgICAgICAgaWYoICBGaWxl
VHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXRQZXJzaXN0ZW5jZU1hbmFnZXIoKSAhPSBudWxs
ICYmIHNlbGVjdGVkSXRlbXMgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQg
b25seSBpZiB0aGVyZSBhcmUgcmVtb3ZhYmxlIGl0ZW1zIHNlbGVjdGVkCi0gICAgICAgICAg
ICAgICAgZm9yKGZpbmFsIE1vZGVsSXRlbSBtaSA6IHNlbGVjdGVkSXRlbXMpIHsKLSAgICAg
ICAgICAgICAgICAgICAgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERv
d25sb2FkSXRlbSkgbWk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAgRmlsZVRyYW5zZmVy
TWFuYWdlci5pbnN0KCkuZ2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkuaXNJdGVtSW5HbG9iYWxR
dWV1ZShpdGVtKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZChyZW1vdmVGcm9t
R3FJdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgaWYoIHNlbGVjdGVkSXRlbXMubGVuZ3RoID09IDEgKSB7Ci0gICAgICAgICAgICAgICAg
ZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERvd25sb2FkSXRlbSkgc2Vs
ZWN0ZWRJdGVtc1swXTsKLSAgICAgICAgICAgICAgICBpZiggaXRlbS5pc1NoYXJlZEZpbGUo
KSApIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkU2VwYXJhdG9yKCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGFkZChkZXRhaWxzSXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIGFkZFNlcGFyYXRvcigpOwotCQkJCWFkZCh1c2VUaGlzRG93bmxvYWREaXJJ
dGVtKTsKLQkJCQlpZiAoaXRlbS5nZXRBc3NvY2lhdGVkTWVzc2FnZUlkKCkgIT0gbnVsbCkg
ewotCQkJCQlhZGRTZXBhcmF0b3IoKTsKLQkJCQkJYWRkKGp1bXBUb0Fzc29jaWF0ZWRNZXNz
YWdlKTsKLQkJCQl9Ci0gICAgICAgICAgICB9CisJCQkgaWYoIFBlcnNpc3RlbmNlTWFuYWdl
ci5pc1BlcnNpc3RlbmNlRW5hYmxlZCgpICkgeworCQkJCSBhZGQoY2hhbmdlUHJpb3JpdHlN
ZW51KTsKKwkJCQkgYWRkU2VwYXJhdG9yKCk7CisJCQkgfQogCi0gICAgICAgICAgICBzdXBl
ci5zaG93KGludm9rZXIsIHgsIHkpOwotICAgICAgICB9Ci0gICAgfQorCQkJIGZpbmFsIEpN
ZW51IGVuYWJsZWRTdWJNZW51ID0gbmV3IEpNZW51KGxhbmd1YWdlLmdldFN0cmluZygiRG93
bmxvYWRQYW5lLmZpbGVUYWJsZS5wb3B1cG1lbnUuZW5hYmxlRG93bmxvYWRzIikgKyAiLi4u
Iik7CisJCQkgZW5hYmxlZFN1Yk1lbnUuYWRkKGVuYWJsZVNlbGVjdGVkRG93bmxvYWRzSXRl
bSk7CisJCQkgZW5hYmxlZFN1Yk1lbnUuYWRkKGRpc2FibGVTZWxlY3RlZERvd25sb2Fkc0l0
ZW0pOworCQkJIGVuYWJsZWRTdWJNZW51LmFkZChpbnZlcnRFbmFibGVkU2VsZWN0ZWRJdGVt
KTsKKwkJCSBlbmFibGVkU3ViTWVudS5hZGRTZXBhcmF0b3IoKTsKIAotICAgIHByaXZhdGUg
Y2xhc3MgTGlzdGVuZXIKLSAgICAgICAgZXh0ZW5kcyBNb3VzZUFkYXB0ZXIKLSAgICAgICAg
aW1wbGVtZW50cyBMYW5ndWFnZUxpc3RlbmVyLCBBY3Rpb25MaXN0ZW5lciwgS2V5TGlzdGVu
ZXIsIE1vdXNlTGlzdGVuZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIEl0ZW1MaXN0ZW5l
ciwgRm9jdXNMaXN0ZW5lciwgTWVudUxpc3RlbmVyIHsKKwkJCSBlbmFibGVkU3ViTWVudS5h
ZGQoZW5hYmxlQWxsRG93bmxvYWRzSXRlbSk7CisJCQkgZW5hYmxlZFN1Yk1lbnUuYWRkKGRp
c2FibGVBbGxEb3dubG9hZHNJdGVtKTsKKwkJCSBlbmFibGVkU3ViTWVudS5hZGQoaW52ZXJ0
RW5hYmxlZEFsbEl0ZW0pOworCQkJIGFkZChlbmFibGVkU3ViTWVudSk7CiAKLSAgICAgICAg
cHVibGljIExpc3RlbmVyKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgfQor
CQkJIC8vIHdlIG9ubHkgZmluZCBleHRlcm5hbCBpdGVtcyBpZiBwZXJzaXN0ZW5jZSBpcyBl
bmFibGVkCisJCQkgaWYoIFBlcnNpc3RlbmNlTWFuYWdlci5pc1BlcnNpc3RlbmNlRW5hYmxl
ZCgpICkgeworCQkJCSBmb3IoZmluYWwgTW9kZWxJdGVtIG1pIDogc2VsZWN0ZWRJdGVtcykg
eworCQkJCQkgZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaXRlbSA9IChGcm9zdERvd25sb2Fk
SXRlbSkgbWk7CisJCQkJCSBpZiggaXRlbS5pc0V4dGVybmFsKCkgJiYgaXRlbS5pc0RpcmVj
dCgpICYmIGl0ZW0uZ2V0U3RhdGUoKSA9PSBGcm9zdERvd25sb2FkSXRlbS5TVEFURV9ET05F
ICkgeworCQkJCQkJIGFkZChyZXRyaWV2ZURpcmVjdEV4dGVybmFsRG93bmxvYWRzKTsKKwkJ
CQkJCSBicmVhazsKKwkJCQkJIH0KKwkJCQkgfQorCQkJIH0KKwkJCSBhZGQocmVtb3ZlU2Vs
ZWN0ZWREb3dubG9hZHNJdGVtKTsKKwkJCSBpZiggIEZpbGVUcmFuc2Zlck1hbmFnZXIuaW5z
dCgpLmdldFBlcnNpc3RlbmNlTWFuYWdlcigpICE9IG51bGwgJiYgc2VsZWN0ZWRJdGVtcyAh
PSBudWxsICkgeworCQkJCSAvLyBhZGQgb25seSBpZiB0aGVyZSBhcmUgcmVtb3ZhYmxlIGl0
ZW1zIHNlbGVjdGVkCisJCQkJIGZvcihmaW5hbCBNb2RlbEl0ZW0gbWkgOiBzZWxlY3RlZEl0
ZW1zKSB7CisJCQkJCSBmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBpdGVtID0gKEZyb3N0RG93
bmxvYWRJdGVtKSBtaTsKKwkJCQkJIGlmKCAgRmlsZVRyYW5zZmVyTWFuYWdlci5pbnN0KCku
Z2V0UGVyc2lzdGVuY2VNYW5hZ2VyKCkuaXNJdGVtSW5HbG9iYWxRdWV1ZShpdGVtKSApIHsK
KwkJCQkJCSBhZGQocmVtb3ZlRnJvbUdxSXRlbSk7CisJCQkJCQkgYnJlYWs7CisJCQkJCSB9
CisJCQkJIH0KKwkJCSB9CisJCQkgaWYoIHNlbGVjdGVkSXRlbXMubGVuZ3RoID09IDEgKSB7
CisJCQkJIGZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGl0ZW0gPSAoRnJvc3REb3dubG9hZEl0
ZW0pIHNlbGVjdGVkSXRlbXNbMF07CisJCQkJIGlmKCBpdGVtLmlzU2hhcmVkRmlsZSgpICkg
eworCQkJCQkgYWRkU2VwYXJhdG9yKCk7CisJCQkJCSBhZGQoZGV0YWlsc0l0ZW0pOworCQkJ
CSB9CisJCQkJIGFkZFNlcGFyYXRvcigpOworCQkJCSBhZGQodXNlVGhpc0Rvd25sb2FkRGly
SXRlbSk7CisJCQkJIGlmIChpdGVtLmdldEFzc29jaWF0ZWRNZXNzYWdlSWQoKSAhPSBudWxs
KSB7CisJCQkJCSBhZGRTZXBhcmF0b3IoKTsKKwkJCQkJIGFkZChqdW1wVG9Bc3NvY2lhdGVk
TWVzc2FnZSk7CisJCQkJIH0KKwkJCSB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgbGFuZ3Vh
Z2VDaGFuZ2VkKGZpbmFsIExhbmd1YWdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIHJl
ZnJlc2hMYW5ndWFnZSgpOwotICAgICAgICB9CisJCQkgc3VwZXIuc2hvdyhpbnZva2VyLCB4
LCB5KTsKKwkJIH0KKwkgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1l
ZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICBpZiAoZS5nZXRTb3VyY2Uo
KSA9PSBkb3dubG9hZERpclNlbGVjdEJ1dHRvbikgewotICAgICAgICAgICAgICAgIGRvd25s
b2FkRGlyU2VsZWN0QnV0dG9uX2FjdGlvblBlcmZvcm1lZChlKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IGRvd25sb2FkRGlyQ3JlYXRlQnV0
dG9uKSB7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWREaXJDcmVhdGVCdXR0b25fYWN0aW9u
UGVyZm9ybWVkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGUuZ2V0U291
cmNlKCkgPT0gZG93bmxvYWRQcmVmaXhBcHBseUJ1dHRvbikgewotICAgICAgICAgICAgICAg
IGRvd25sb2FkUHJlZml4QXBwbHlCdXR0b25fYWN0aW9uUGVyZm9ybWVkKGUpOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgaWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWREaXJB
cHBseUJ1dHRvbikgewotICAgICAgICAgICAgICAgIGRvd25sb2FkRGlyQXBwbHlCdXR0b25f
YWN0aW9uUGVyZm9ybWVkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGUu
Z2V0U291cmNlKCkgPT0gZG93bmxvYWRUZXh0RmllbGQpIHsKLSAgICAgICAgICAgICAgICBk
b3dubG9hZFRleHRGaWVsZF9hY3Rpb25QZXJmb3JtZWQoZSk7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IGRvd25sb2FkUGFzdGVCdXR0
b24pIHsKLSAgICAgICAgICAgICAgICBkb3dubG9hZFBhc3RlQnV0dG9uUHJlc3NlZChlKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0g
ZG93bmxvYWRBY3RpdmF0ZUJ1dHRvbikgewotICAgICAgICAgICAgICAgIGRvd25sb2FkQWN0
aXZhdGVCdXR0b25QcmVzc2VkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxz
ZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBkb3dubG9hZFBhdXNlQnV0dG9uKSB7Ci0gICAgICAg
ICAgICAgICAgZG93bmxvYWRQYXVzZUJ1dHRvblByZXNzZWQoZSk7Ci0gICAgICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgCWZvciAoaW50IGkgPSAwOyBpIDwgZG93bmxvYWREaXJS
ZWNlbnRNZW51LmdldEl0ZW1Db3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIAkJZmluYWwg
Sk1lbnVJdGVtIGl0ZW0gPSBkb3dubG9hZERpclJlY2VudE1lbnUuZ2V0SXRlbShpKTsKLSAg
ICAgICAgICAgIAkJaWYgKGUuZ2V0U291cmNlKCkgPT0gaXRlbSkgewotICAgICAgICAgICAg
CQkJZG93bmxvYWREaXJUZXh0RmllbGQuc2V0VGV4dChpdGVtLmdldFRleHQoKSk7Ci0gICAg
ICAgICAgICAJCX0KLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkgcHJpdmF0
ZSBjbGFzcyBMaXN0ZW5lcgorCSBleHRlbmRzIE1vdXNlQWRhcHRlcgorCSBpbXBsZW1lbnRz
IExhbmd1YWdlTGlzdGVuZXIsIEFjdGlvbkxpc3RlbmVyLCBLZXlMaXN0ZW5lciwgTW91c2VM
aXN0ZW5lciwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgSXRlbUxpc3RlbmVyLCBGb2N1c0xp
c3RlbmVyLCBNZW51TGlzdGVuZXIgewogCi0gICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNz
ZWQoZmluYWwgS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgaWYgKGUuZ2V0U291cmNlKCkg
PT0gbW9kZWxUYWJsZS5nZXRUYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgZG93bmxvYWRU
YWJsZV9rZXlQcmVzc2VkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisJCSBwdWJs
aWMgTGlzdGVuZXIoKSB7CisJCQkgc3VwZXIoKTsKKwkJIH0KIAotICAgICAgICBwdWJsaWMg
dm9pZCBrZXlSZWxlYXNlZChmaW5hbCBLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICBpZiAo
ZS5nZXRTb3VyY2UoKSA9PSBkb3dubG9hZERpclRleHRGaWVsZCkgewotICAgICAgICAgICAg
ICAgIGRvd25sb2FkRGlyVGV4dEZpZWxkX2tleVJlbGVhc2VkKGUpOwotICAgICAgICAgICAg
fQotICAgICAgICB9CisJCSBwdWJsaWMgdm9pZCBsYW5ndWFnZUNoYW5nZWQoZmluYWwgTGFu
Z3VhZ2VFdmVudCBldmVudCkgeworCQkJIHJlZnJlc2hMYW5ndWFnZSgpOworCQkgfQogCi0g
ICAgICAgIHB1YmxpYyB2b2lkIGtleVR5cGVkKGZpbmFsIEtleUV2ZW50IGUpIHsKLSAgICAg
ICAgfQorCQkgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50
IGUpIHsKKwkJCSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBkb3dubG9hZERpclNlbGVjdEJ1dHRv
bikgeworCQkJCSBkb3dubG9hZERpclNlbGVjdEJ1dHRvbl9hY3Rpb25QZXJmb3JtZWQoZSk7
CisJCQkgfQorCQkJIGlmIChlLmdldFNvdXJjZSgpID09IGRvd25sb2FkRGlyQ3JlYXRlQnV0
dG9uKSB7CisJCQkJIGRvd25sb2FkRGlyQ3JlYXRlQnV0dG9uX2FjdGlvblBlcmZvcm1lZChl
KTsKKwkJCSB9CisJCQkgaWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWRQcmVmaXhBcHBs
eUJ1dHRvbikgeworCQkJCSBkb3dubG9hZFByZWZpeEFwcGx5QnV0dG9uX2FjdGlvblBlcmZv
cm1lZChlKTsKKwkJCSB9CisJCQkgaWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWREaXJB
cHBseUJ1dHRvbikgeworCQkJCSBkb3dubG9hZERpckFwcGx5QnV0dG9uX2FjdGlvblBlcmZv
cm1lZChlKTsKKwkJCSB9CisJCQkgaWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWRUZXh0
RmllbGQpIHsKKwkJCQkgZG93bmxvYWRUZXh0RmllbGRfYWN0aW9uUGVyZm9ybWVkKGUpOwor
CQkJIH0KKwkJCSBlbHNlIGlmIChlLmdldFNvdXJjZSgpID09IGRvd25sb2FkUGFzdGVCdXR0
b24pIHsKKwkJCQkgZG93bmxvYWRQYXN0ZUJ1dHRvblByZXNzZWQoZSk7CisJCQkgfQorCQkJ
IGVsc2UgaWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWRBY3RpdmF0ZUJ1dHRvbikgewor
CQkJCSBkb3dubG9hZEFjdGl2YXRlQnV0dG9uUHJlc3NlZChlKTsKKwkJCSB9CisJCQkgZWxz
ZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBkb3dubG9hZFBhdXNlQnV0dG9uKSB7CisJCQkJIGRv
d25sb2FkUGF1c2VCdXR0b25QcmVzc2VkKGUpOworCQkJIH0gZWxzZSB7CisJCQkJIGZvciAo
aW50IGkgPSAwOyBpIDwgZG93bmxvYWREaXJSZWNlbnRNZW51LmdldEl0ZW1Db3VudCgpOyBp
KyspIHsKKwkJCQkJIGZpbmFsIEpNZW51SXRlbSBpdGVtID0gZG93bmxvYWREaXJSZWNlbnRN
ZW51LmdldEl0ZW0oaSk7CisJCQkJCSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBpdGVtKSB7CisJ
CQkJCQkgZG93bmxvYWREaXJUZXh0RmllbGQuc2V0VGV4dChpdGVtLmdldFRleHQoKSk7CisJ
CQkJCSB9CisJCQkJIH0KKwkJCSB9CisJCSB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgZm9j
dXNHYWluZWQoZmluYWwgRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgIH0KKwkJIHB1YmxpYyB2
b2lkIGtleVByZXNzZWQoZmluYWwgS2V5RXZlbnQgZSkgeworCQkJIGlmIChlLmdldFNvdXJj
ZSgpID09IG1vZGVsVGFibGUuZ2V0VGFibGUoKSkgeworCQkJCSBkb3dubG9hZFRhYmxlX2tl
eVByZXNzZWQoZSk7CisJCQkgfQorCQkgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGZvY3Vz
TG9zdChmaW5hbCBGb2N1c0V2ZW50IGUpIHsKLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJj
ZSgpID09IGRvd25sb2FkRGlyVGV4dEZpZWxkKSB7Ci0gICAgICAgICAgICAgICAgZG93bmxv
YWREaXJUZXh0RmllbGRfZm9jdXNMb3N0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9
CisJCSBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChmaW5hbCBLZXlFdmVudCBlKSB7CisJCQkg
aWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWREaXJUZXh0RmllbGQpIHsKKwkJCQkgZG93
bmxvYWREaXJUZXh0RmllbGRfa2V5UmVsZWFzZWQoZSk7CisJCQkgfQorCQkgfQogCi0gICAg
ICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoZmluYWwg
TW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICBpZiAoZS5nZXRDbGlja0NvdW50KCkgPT0g
MikgewotICAgICAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IG1vZGVsVGFibGUu
Z2V0VGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBmaWxlIGZyb20g
ZG93bmxvYWQgdGFibGUuIElzIHRoaXMgYSBnb29kIGlkZWE/Ci0gICAgICAgICAgICAgICAg
ICAgIGRvd25sb2FkVGFibGVEb3VibGVDbGljayhlKTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9IGVsc2UgaWYgKGUuaXNQb3B1cFRyaWdnZXIoKSkgewotICAgICAgICAg
ICAgICAgIGlmICgoZS5nZXRTb3VyY2UoKSA9PSBtb2RlbFRhYmxlLmdldFRhYmxlKCkpCi0g
ICAgICAgICAgICAgICAgICAgIHx8IChlLmdldFNvdXJjZSgpID09IG1vZGVsVGFibGUuZ2V0
U2Nyb2xsUGFuZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBzaG93RG93bmxvYWRUYWJs
ZVBvcHVwTWVudShlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KKwkJIHB1YmxpYyB2b2lkIGtleVR5cGVkKGZpbmFsIEtleUV2ZW50IGUpIHsKKwkJ
IH0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxl
YXNlZChmaW5hbCBNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIGlmICgoZS5nZXRDbGlj
a0NvdW50KCkgPT0gMSkgJiYgKGUuaXNQb3B1cFRyaWdnZXIoKSkpIHsKKwkJIHB1YmxpYyB2
b2lkIGZvY3VzR2FpbmVkKGZpbmFsIEZvY3VzRXZlbnQgZSkgeworCQkgfQogCi0gICAgICAg
ICAgICAgICAgaWYgKChlLmdldFNvdXJjZSgpID09IG1vZGVsVGFibGUuZ2V0VGFibGUoKSkK
LSAgICAgICAgICAgICAgICAgICAgfHwgKGUuZ2V0U291cmNlKCkgPT0gbW9kZWxUYWJsZS5n
ZXRTY3JvbGxQYW5lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dEb3dubG9hZFRh
YmxlUG9wdXBNZW51KGUpOwotICAgICAgICAgICAgICAgIH0KKwkJIHB1YmxpYyB2b2lkIGZv
Y3VzTG9zdChmaW5hbCBGb2N1c0V2ZW50IGUpIHsKKwkJCSBpZiAoZS5nZXRTb3VyY2UoKSA9
PSBkb3dubG9hZERpclRleHRGaWVsZCkgeworCQkJCSBkb3dubG9hZERpclRleHRGaWVsZF9m
b2N1c0xvc3QoZSk7CisJCQkgfQorCQkgfQogCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
KwkJIEBPdmVycmlkZQorCQkgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKGZpbmFsIE1vdXNl
RXZlbnQgZSkgeworCQkJIGlmIChlLmdldENsaWNrQ291bnQoKSA9PSAyKSB7CisJCQkJIGlm
IChlLmdldFNvdXJjZSgpID09IG1vZGVsVGFibGUuZ2V0VGFibGUoKSkgeworCQkJCQkgLy8g
U3RhcnQgZmlsZSBmcm9tIGRvd25sb2FkIHRhYmxlLiBJcyB0aGlzIGEgZ29vZCBpZGVhPwor
CQkJCQkJCSBkb3dubG9hZFRhYmxlRG91YmxlQ2xpY2soZSk7CisJCQkJIH0KKwkJCSB9IGVs
c2UgaWYgKGUuaXNQb3B1cFRyaWdnZXIoKSkgeworCQkJCSBpZiAoKGUuZ2V0U291cmNlKCkg
PT0gbW9kZWxUYWJsZS5nZXRUYWJsZSgpKQorCQkJCQkJIHx8IChlLmdldFNvdXJjZSgpID09
IG1vZGVsVGFibGUuZ2V0U2Nyb2xsUGFuZSgpKSkgeworCQkJCQkgc2hvd0Rvd25sb2FkVGFi
bGVQb3B1cE1lbnUoZSk7CisJCQkJIH0KKwkJCSB9CisJCSB9CiAKLSAgICAgICAgcHVibGlj
IHZvaWQgcHJvcGVydHlDaGFuZ2UoZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsK
LSAgICAgICAgICAgIGlmIChldnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFNldHRpbmdz
Q2xhc3MuRklMRV9MSVNUX0ZPTlRfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBmb250Q2hh
bmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGV2dC5nZXRQcm9wZXJ0
eU5hbWUoKS5lcXVhbHMoU2V0dGluZ3NDbGFzcy5GSUxFX0xJU1RfRk9OVF9TSVpFKSkgewot
ICAgICAgICAgICAgICAgIGZvbnRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBpZiAoZXZ0LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhTZXR0aW5nc0NsYXNzLkZJ
TEVfTElTVF9GT05UX1NUWUxFKSkgewotICAgICAgICAgICAgICAgIGZvbnRDaGFuZ2VkKCk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJIEBPdmVycmlkZQorCQkgcHVibGljIHZv
aWQgbW91c2VSZWxlYXNlZChmaW5hbCBNb3VzZUV2ZW50IGUpIHsKKwkJCSBpZiAoKGUuZ2V0
Q2xpY2tDb3VudCgpID09IDEpICYmIChlLmlzUG9wdXBUcmlnZ2VyKCkpKSB7CiAKLSAgICAg
ICAgcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChmaW5hbCBJdGVtRXZlbnQgZSkgewot
ICAgICAgICAgICAgaWYoIHJlbW92ZUZpbmlzaGVkRG93bmxvYWRzQ2hlY2tCb3guaXNTZWxl
Y3RlZCgpICkgewotICAgICAgICAgICAgICAgIENvcmUuZnJvc3RTZXR0aW5ncy5zZXRWYWx1
ZShTZXR0aW5nc0NsYXNzLkRPV05MT0FEX1JFTU9WRV9GSU5JU0hFRCwgdHJ1ZSk7Ci0gICAg
ICAgICAgICAgICAgbW9kZWwucmVtb3ZlRmluaXNoZWREb3dubG9hZHMoKTsKLSAgICAgICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ29yZS5mcm9zdFNldHRpbmdzLnNldFZh
bHVlKFNldHRpbmdzQ2xhc3MuRE9XTkxPQURfUkVNT1ZFX0ZJTklTSEVELCBmYWxzZSk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiggc2hvd0V4dGVybmFsR2xvYmFsUXVldWVJ
dGVtcy5pc1NlbGVjdGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgQ29yZS5mcm9zdFNldHRp
bmdzLnNldFZhbHVlKFNldHRpbmdzQ2xhc3MuR1FfU0hPV19FWFRFUk5BTF9JVEVNU19ET1dO
TE9BRCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENv
cmUuZnJvc3RTZXR0aW5ncy5zZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkdRX1NIT1dfRVhURVJO
QUxfSVRFTVNfRE9XTkxPQUQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5yZW1v
dmVFeHRlcm5hbERvd25sb2FkcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisJCQkJ
IGlmICgoZS5nZXRTb3VyY2UoKSA9PSBtb2RlbFRhYmxlLmdldFRhYmxlKCkpCisJCQkJCQkg
fHwgKGUuZ2V0U291cmNlKCkgPT0gbW9kZWxUYWJsZS5nZXRTY3JvbGxQYW5lKCkpKSB7CisJ
CQkJCSBzaG93RG93bmxvYWRUYWJsZVBvcHVwTWVudShlKTsKKwkJCQkgfQogCi0gICAgCXB1
YmxpYyB2b2lkIG1lbnVDYW5jZWxlZChNZW51RXZlbnQgZSkgewotICAgIAl9CisJCQkgfQor
CQkgfQogCi0gICAgCXB1YmxpYyB2b2lkIG1lbnVEZXNlbGVjdGVkKE1lbnVFdmVudCBlKSB7
Ci0gICAgCX0KKwkJIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKGZpbmFsIFByb3BlcnR5
Q2hhbmdlRXZlbnQgZXZ0KSB7CisJCQkgaWYgKGV2dC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVh
bHMoU2V0dGluZ3NDbGFzcy5GSUxFX0xJU1RfRk9OVF9OQU1FKSkgeworCQkJCSBmb250Q2hh
bmdlZCgpOworCQkJIH0KKwkJCSBpZiAoZXZ0LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhT
ZXR0aW5nc0NsYXNzLkZJTEVfTElTVF9GT05UX1NJWkUpKSB7CisJCQkJIGZvbnRDaGFuZ2Vk
KCk7CisJCQkgfQorCQkJIGlmIChldnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFNldHRp
bmdzQ2xhc3MuRklMRV9MSVNUX0ZPTlRfU1RZTEUpKSB7CisJCQkJIGZvbnRDaGFuZ2VkKCk7
CisJCQkgfQorCQkgfQogCi0gICAgCXB1YmxpYyB2b2lkIG1lbnVTZWxlY3RlZChNZW51RXZl
bnQgZSkgewotICAgIAkJaWYgKGUuZ2V0U291cmNlKCkgPT0gZG93bmxvYWREaXJSZWNlbnRN
ZW51KSB7Ci0gICAgCQkJSk1lbnVJdGVtIGl0ZW07CisJCSBwdWJsaWMgdm9pZCBpdGVtU3Rh
dGVDaGFuZ2VkKGZpbmFsIEl0ZW1FdmVudCBlKSB7CisJCQkgaWYoIHJlbW92ZUZpbmlzaGVk
RG93bmxvYWRzQ2hlY2tCb3guaXNTZWxlY3RlZCgpICkgeworCQkJCSBDb3JlLmZyb3N0U2V0
dGluZ3Muc2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5ET1dOTE9BRF9SRU1PVkVfRklOSVNIRUQs
IHRydWUpOworCQkJCSBtb2RlbC5yZW1vdmVGaW5pc2hlZERvd25sb2FkcygpOworCQkJIH0g
ZWxzZSB7CisJCQkJIENvcmUuZnJvc3RTZXR0aW5ncy5zZXRWYWx1ZShTZXR0aW5nc0NsYXNz
LkRPV05MT0FEX1JFTU9WRV9GSU5JU0hFRCwgZmFsc2UpOworCQkJIH0KKwkJCSBpZiggc2hv
d0V4dGVybmFsR2xvYmFsUXVldWVJdGVtcy5pc1NlbGVjdGVkKCkgKSB7CisJCQkJIENvcmUu
ZnJvc3RTZXR0aW5ncy5zZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkdRX1NIT1dfRVhURVJOQUxf
SVRFTVNfRE9XTkxPQUQsIHRydWUpOworCQkJIH0gZWxzZSB7CisJCQkJIENvcmUuZnJvc3RT
ZXR0aW5ncy5zZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkdRX1NIT1dfRVhURVJOQUxfSVRFTVNf
RE9XTkxPQUQsIGZhbHNlKTsKKwkJCQkgbW9kZWwucmVtb3ZlRXh0ZXJuYWxEb3dubG9hZHMo
KTsKKwkJCSB9CisJCSB9CiAKLSAgICAgICAgICAgCQlkb3dubG9hZERpclJlY2VudE1lbnUu
cmVtb3ZlQWxsKCk7CisJCSBwdWJsaWMgdm9pZCBtZW51Q2FuY2VsZWQoTWVudUV2ZW50IGUp
IHsKKwkJIH0KIAotICAgICAgICAgICAJCWl0ZW0gPSBuZXcgSk1lbnVJdGVtKENvcmUuZnJv
c3RTZXR0aW5ncy5nZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkRJUl9ET1dOTE9BRCkpOwotICAg
ICAgICAgICAJCWRvd25sb2FkRGlyUmVjZW50TWVudS5hZGQoaXRlbSk7Ci0gICAgICAgICAg
IAkJaXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgCQkKLSAgICAg
ICAgICAgCQlkb3dubG9hZERpclJlY2VudE1lbnUuYWRkU2VwYXJhdG9yKCk7Ci0gICAgICAg
ICAgIAkJZmluYWwgTGlua2VkTGlzdDxTdHJpbmc+IGRpcnMgPSBGaWxlVHJhbnNmZXJNYW5h
Z2VyLmluc3QoKS5nZXREb3dubG9hZE1hbmFnZXIoKS5nZXRSZWNlbnREb3dubG9hZERpcnMo
KTsKLSAgICAgICAgICAgCQlmaW5hbCBMaXN0SXRlcmF0b3IgaXRlciA9IGRpcnMubGlzdEl0
ZXJhdG9yKGRpcnMuc2l6ZSgpKTsKLSAgICAgICAgICAgCQl3aGlsZSAoaXRlci5oYXNQcmV2
aW91cygpKSB7Ci0gICAgICAgICAgIAkJICAgIGZpbmFsIFN0cmluZyBkaXIgPSAoU3RyaW5n
KWl0ZXIucHJldmlvdXMoKTsKKwkJIHB1YmxpYyB2b2lkIG1lbnVEZXNlbGVjdGVkKE1lbnVF
dmVudCBlKSB7CisJCSB9CiAKLQkJCQkJaXRlbSA9IG5ldyBKTWVudUl0ZW0oZGlyKTsKLQkJ
CQkJZG93bmxvYWREaXJSZWNlbnRNZW51LmFkZChpdGVtKTsKLQkJCQkJaXRlbS5hZGRBY3Rp
b25MaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICB9CisJCSBwdWJsaWMg
dm9pZCBtZW51U2VsZWN0ZWQoTWVudUV2ZW50IGUpIHsKKwkJCSBpZiAoZS5nZXRTb3VyY2Uo
KSA9PSBkb3dubG9hZERpclJlY2VudE1lbnUpIHsKKwkJCQkgSk1lbnVJdGVtIGl0ZW07CisK
KwkJCQkgZG93bmxvYWREaXJSZWNlbnRNZW51LnJlbW92ZUFsbCgpOworCisJCQkJIGl0ZW0g
PSBuZXcgSk1lbnVJdGVtKENvcmUuZnJvc3RTZXR0aW5ncy5nZXRWYWx1ZShTZXR0aW5nc0Ns
YXNzLkRJUl9ET1dOTE9BRCkpOworCQkJCSBkb3dubG9hZERpclJlY2VudE1lbnUuYWRkKGl0
ZW0pOworCQkJCSBpdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCisJCQkJIGRvd25s
b2FkRGlyUmVjZW50TWVudS5hZGRTZXBhcmF0b3IoKTsKKwkJCQkgZmluYWwgTGlua2VkTGlz
dDxTdHJpbmc+IGRpcnMgPSBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXREb3dubG9h
ZE1hbmFnZXIoKS5nZXRSZWNlbnREb3dubG9hZERpcnMoKTsKKwkJCQkgZmluYWwgTGlzdEl0
ZXJhdG9yPFN0cmluZz4gaXRlciA9IGRpcnMubGlzdEl0ZXJhdG9yKGRpcnMuc2l6ZSgpKTsK
KwkJCQkgd2hpbGUgKGl0ZXIuaGFzUHJldmlvdXMoKSkgeworCQkJCQkgZmluYWwgU3RyaW5n
IGRpciA9IChTdHJpbmcpaXRlci5wcmV2aW91cygpOworCisJCQkJCSBpdGVtID0gbmV3IEpN
ZW51SXRlbShkaXIpOworCQkJCQkgZG93bmxvYWREaXJSZWNlbnRNZW51LmFkZChpdGVtKTsK
KwkJCQkJIGl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJIH0KKwkJCSB9CisJ
CSB9CisJIH0KIH0KSW5kZXg6IHNvdXJjZS9mcm9zdC9ndWkvQWRkTmV3RG93bmxvYWRzRGlh
bG9nLmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzb3VyY2UvZnJvc3QvZ3VpL0FkZE5ld0Rv
d25sb2Fkc0RpYWxvZy5qYXZhCShyZXZpc2lvbiAzMTk3KQ0KKysrIHNvdXJjZS9mcm9zdC9n
dWkvQWRkTmV3RG93bmxvYWRzRGlhbG9nLmphdmEJKHdvcmtpbmcgY29weSkNCkBAIC0xODUs
NiArMTg1LDIyIEBADQogCXByaXZhdGUgdm9pZCBpbml0UG9wdXBNZW51KCkgewogCQl0YWJs
ZVBvcHVwTWVudSA9IG5ldyBKU2tpbm5hYmxlUG9wdXBNZW51KCk7CiAKKwkJLy8gUmVuYW1l
IGZpbGUKKwkJZmluYWwgSk1lbnVJdGVtIHJlbmFtZUZpbGUgPSBuZXcgSk1lbnVJdGVtKGxh
bmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLmJ1dHRvbi5yZW5hbWVG
aWxlIikpOworCQlyZW5hbWVGaWxlLmFkZEFjdGlvbkxpc3RlbmVyKCBuZXcgamF2YS5hd3Qu
ZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3Jt
ZWQoZmluYWwgQWN0aW9uRXZlbnQgYWN0aW9uRXZlbnQpIHsKKwkJCQlyZW5hbWVGaWxlX2Fj
dGlvblBlcmZvcm1lZChhY3Rpb25FdmVudCk7CisJCQl9CisJCX0pOworCQkKKwkJLy8gcHJl
Zml4IEZpbGVuYW1lCisJCWZpbmFsIEpNZW51SXRlbSBwcmVmaXhGaWxlbmFtZSA9IG5ldyBK
TWVudUl0ZW0obGFuZ3VhZ2UuZ2V0U3RyaW5nKCJBZGROZXdEb3dubG9hZHNEaWFsb2cuYnV0
dG9uLnByZWZpeEZpbGVuYW1lIikpOworCQlwcmVmaXhGaWxlbmFtZS5hZGRBY3Rpb25MaXN0
ZW5lciggbmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGlj
IHZvaWQgYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGFjdGlvbkV2ZW50KSB7
CisJCQkJcHJlZml4RmlsZW5hbWVfYWN0aW9uUGVyZm9ybWVkKGFjdGlvbkV2ZW50KTsKKwkJ
CX0KKwkJfSk7CisKIAkJLy8gQ2hhbmdlIERvd25sb2FkIERpcmVjdG9yeQogCQlmaW5hbCBK
TWVudUl0ZW0gY2hhbmdlRG93bmxvYWREaXIgPSBuZXcgSk1lbnVJdGVtKGxhbmd1YWdlLmdl
dFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLmJ1dHRvbi5jaGFuZ2VEb3dubG9hZERp
ciIpKTsKIAkJY2hhbmdlRG93bmxvYWREaXIuYWRkQWN0aW9uTGlzdGVuZXIoIG5ldyBqYXZh
LmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKQEAgLTE5Miw2ICsyMDgsNyBAQA0KIAkJ
CQljaGFuZ2VEb3dubG9hZERpcl9hY3Rpb25QZXJmb3JtZWQoYWN0aW9uRXZlbnQpOwogCQkJ
fQogCQl9KTsKKwkJCiAKIAkJLy8gUmVtb3ZlIGl0ZW0gZnJvbSBsaXN0CiAJCWZpbmFsIEpN
ZW51SXRlbSByZW1vdmVEb3dubG9hZCA9IG5ldyBKTWVudUl0ZW0obGFuZ3VhZ2UuZ2V0U3Ry
aW5nKCJBZGROZXdEb3dubG9hZHNEaWFsb2cuYnV0dG9uLnJlbW92ZURvd25sb2FkIikpOwpA
QCAtMjE4LDYgKzIzNSw5IEBADQogCQl9CiAKIAkJLy8gQ29tcG9zZSBwb3B1cCBtZW51CisJ
CXRhYmxlUG9wdXBNZW51LmFkZChyZW5hbWVGaWxlKTsKKwkJdGFibGVQb3B1cE1lbnUuYWRk
KHByZWZpeEZpbGVuYW1lKTsKKwkJdGFibGVQb3B1cE1lbnUuYWRkU2VwYXJhdG9yKCk7CiAJ
CXRhYmxlUG9wdXBNZW51LmFkZChjaGFuZ2VEb3dubG9hZERpcik7CiAJCXRhYmxlUG9wdXBN
ZW51LmFkZFNlcGFyYXRvcigpOwogCQl0YWJsZVBvcHVwTWVudS5hZGQocmVtb3ZlRG93bmxv
YWQpOwpAQCAtMjUxLDcgKzI3MSw3MiBAQA0KIAkJfQogCQlhZGROZXdEb3dubG9hZHNUYWJs
ZS5jbGVhclNlbGVjdGlvbigpOwogCX0KKwkKKwlwcml2YXRlIHZvaWQgcmVuYW1lRmlsZV9h
Y3Rpb25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgYWN0aW9uRXZlbnQpIHsKKwkJZmlu
YWwgaW50W10gc2VsZWN0ZWRSb3dzID0gYWRkTmV3RG93bmxvYWRzVGFibGUuZ2V0U2VsZWN0
ZWRSb3dzKCk7CiAKKwkJaWYoIHNlbGVjdGVkUm93cy5sZW5ndGggPiAwICkgeworCQkJCisJ
CQlmb3IoIGZpbmFsIGludCByb3dJbmRleCA6IHNlbGVjdGVkUm93cyApIHsKKwkJCQlpZigg
cm93SW5kZXggPj0gYWRkTmV3RG93bmxvYWRzVGFibGUuZ2V0Um93Q291bnQoKSApIHsKKwkJ
CQkJY29udGludWU7IC8vIHBhcmFub2lhCisJCQkJfQorCQkJCQorCQkJCS8vIGFkZCB0aGUg
Ym9hcmQocykgdG8gYm9hcmQgdHJlZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGFibGUKKwkJCQlm
aW5hbCBBZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlciByb3cgPSAoQWRkTmV3RG93bmxvYWRz
VGFibGVNZW1iZXIpIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93KHJvd0luZGV4
KTsKKwkJCQlTdHJpbmcgbmV3TmFtZSA9IGFza0Zvck5ld25hbWUocm93LmdldERvd25sb2Fk
SXRlbSgpLmdldFVucHJlZml4ZWRGaWxlbmFtZSgpKTsKKwkJCQlpZiggbmV3TmFtZSAhPSBu
dWxsICkgeworCQkJCQlyb3cuZ2V0RG93bmxvYWRJdGVtKCkuc2V0RmlsZU5hbWUobmV3TmFt
ZSk7CisJCQkJfQorCQkJCXJvdy51cGRhdGVFeGlzdHNDaGVjaygpOworCQkJfQorCQkJYWRk
TmV3RG93bmxvYWRzVGFibGUuY2xlYXJTZWxlY3Rpb24oKTsKKwkJfQorCX0KKwkKKwlwcml2
YXRlIFN0cmluZyBhc2tGb3JOZXduYW1lKGZpbmFsIFN0cmluZyBvbGROYW1lKSB7CisJCXJl
dHVybiAoU3RyaW5nKSBKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coCisJCQkJdGhpcywK
KwkJCQlsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy5yZW5hbWVG
aWxlRGlhbG9nLmRpYWxvZ0JvZHkiKSwKKwkJCQlsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5l
d0Rvd25sb2Fkc0RpYWxvZy5yZW5hbWVGaWxlRGlhbG9nLmRpYWxvZ1RpdGxlIiksCisJCQkJ
Sk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRSwKKwkJCQludWxsLAorCQkJCW51bGwsCisJ
CQkJb2xkTmFtZQorCQkpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgcHJlZml4RmlsZW5hbWVf
YWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGFjdGlvbkV2ZW50KSB7CisJCWZp
bmFsIGludFtdIHNlbGVjdGVkUm93cyA9IGFkZE5ld0Rvd25sb2Fkc1RhYmxlLmdldFNlbGVj
dGVkUm93cygpOworCisJCWlmKCBzZWxlY3RlZFJvd3MubGVuZ3RoID4gMCApIHsKKwkJCQor
CQkJZmluYWwgU3RyaW5nIHByZWZpeCA9IGFza0ZvclByZWZpeCgpOworCQkJCisJCQlmb3Io
IGZpbmFsIGludCByb3dJbmRleCA6IHNlbGVjdGVkUm93cyApIHsKKwkJCQlpZiggcm93SW5k
ZXggPj0gYWRkTmV3RG93bmxvYWRzVGFibGUuZ2V0Um93Q291bnQoKSApIHsKKwkJCQkJY29u
dGludWU7IC8vIHBhcmFub2lhCisJCQkJfQorCQkJCQorCQkJCS8vIGFkZCB0aGUgYm9hcmQo
cykgdG8gYm9hcmQgdHJlZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGFibGUKKwkJCQlmaW5hbCBB
ZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlciByb3cgPSAoQWRkTmV3RG93bmxvYWRzVGFibGVN
ZW1iZXIpIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93KHJvd0luZGV4KTsKKwkJ
CQlyb3cuZ2V0RG93bmxvYWRJdGVtKCkuc2V0RmlsZW5hbWVQcmVmaXgocHJlZml4KTsKKwkJ
CQlyb3cudXBkYXRlRXhpc3RzQ2hlY2soKTsKKwkJCX0KKwkJCWFkZE5ld0Rvd25sb2Fkc1Rh
YmxlLmNsZWFyU2VsZWN0aW9uKCk7CisJCX0KKwl9CisJCisJCisJcHJpdmF0ZSBmaW5hbCBT
dHJpbmcgYXNrRm9yUHJlZml4KCkgeworCQlyZXR1cm4gKFN0cmluZykgSk9wdGlvblBhbmUu
c2hvd0lucHV0RGlhbG9nKAorCQkJCXRoaXMsCisJCQkJbGFuZ3VhZ2UuZ2V0U3RyaW5nKCJB
ZGROZXdEb3dubG9hZHNEaWFsb2cucHJlZml4RmlsZW5hbWVEaWFsb2cuZGlhbG9nQm9keSIp
LAorCQkJCWxhbmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLnByZWZp
eEZpbGVuYW1lRGlhbG9nLmRpYWxvZ1RpdGxlIiksCisJCQkJSk9wdGlvblBhbmUuUVVFU1RJ
T05fTUVTU0FHRQorCQkpOworCX0KKwogCXByaXZhdGUgdm9pZCBjaGFuZ2VEb3dubG9hZERp
cl9hY3Rpb25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgYWN0aW9uRXZlbnQpIHsKIAkJ
ZmluYWwgaW50W10gc2VsZWN0ZWRSb3dzID0gYWRkTmV3RG93bmxvYWRzVGFibGUuZ2V0U2Vs
ZWN0ZWRSb3dzKCk7CiAKQEAgLTI4NCw3ICszNjksNyBAQA0KIAkJCWFkZE5ld0Rvd25sb2Fk
c1RhYmxlLmNsZWFyU2VsZWN0aW9uKCk7CiAJCX0KIAl9Ci0KKwkKIAlwcml2YXRlIHZvaWQg
cmVtb3ZlRG93bmxvYWRfYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlvbkV2ZW50IGUpIHsK
IAkJZmluYWwgaW50W10gc2VsZWN0ZWRSb3dzID0gYWRkTmV3RG93bmxvYWRzVGFibGUuZ2V0
U2VsZWN0ZWRSb3dzKCk7CiAKSW5kZXg6IHNvdXJjZS9mcm9zdC9tZXNzYWdpbmcvZnJvc3Qv
Z3VpL01lc3NhZ2VUZXh0UGFuZS5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc291cmNlL2Zy
b3N0L21lc3NhZ2luZy9mcm9zdC9ndWkvTWVzc2FnZVRleHRQYW5lLmphdmEJKHJldmlzaW9u
IDMxOTcpDQorKysgc291cmNlL2Zyb3N0L21lc3NhZ2luZy9mcm9zdC9ndWkvTWVzc2FnZVRl
eHRQYW5lLmphdmEJKHdvcmtpbmcgY29weSkNCkBAIC01MTIsNyArNTEyLDcgQEANCiAKICAg
ICAgICAgS25vd25Cb2FyZHNNYW5hZ2VyLmFkZE5ld0tub3duQm9hcmRzKGFkZEJvYXJkcyk7
CiAgICAgfQotCisgICAgCiAgICAgLyoqCiAgICAgICogQWRkcyBhbGwgYm9hcmRzIGZyb20g
dGhlIGF0dGFjaGVkQm9hcmRzVGFibGUgdG8gYm9hcmQgbGlzdC4KICAgICAgKiBJZiB0YXJn
ZXRGb2xkZXIgaXMgbnVsbCB0aGUgYm9hcmRzIGFyZSBhZGRlZCB0byB0aGUgcm9vdCBmb2xk
ZXIuCkBAIC01OTksNyArNTk5LDkgQEANCiAgICAgICAgIH0KICAgICAgICAgcG9wdXBNZW51
VG9mVGV4dC5zaG93KGUuZ2V0Q29tcG9uZW50KCksIGUuZ2V0WCgpLCBlLmdldFkoKSk7CiAg
ICAgfQotCisgICAgCisgICAgCisgICAKICAgICBwcml2YXRlIGNsYXNzIFBvcHVwTWVudUF0
dGFjaG1lbnRCb2FyZAogICAgIGV4dGVuZHMgSlNraW5uYWJsZVBvcHVwTWVudQogICAgIGlt
cGxlbWVudHMgQWN0aW9uTGlzdGVuZXIsIExhbmd1YWdlTGlzdGVuZXIgewpAQCAtODI4LDgg
KzgzMCw4IEBADQogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbGlja2VkS2V5KGZpbmFsIFN0
cmluZyBzKSB7CiAgICAgICAgICAgICBjbGlja2VkS2V5ID0gczsKICAgICAgICAgfQotICAg
ICAgICBwdWJsaWMgdm9pZCBzZXRBbGxLZXlzKGZpbmFsIExpc3Q8U3RyaW5nPiBsKSB7Ci0g
ICAgICAgICAgICBhbGxLZXlzID0gbDsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWxsS2V5
cyhmaW5hbCBMaXN0PFN0cmluZz4gbGlzdEFsbEtleXMpIHsKKyAgICAgICAgICAgIGFsbEtl
eXMgPSBsaXN0QWxsS2V5czsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGFj
dGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBlKSB7CkBAIC05MjQsOCArOTI2LDYg
QEANCiAgICAgICAgICAgICAJCWNvbnRpbnVlOwogICAgICAgICAgICAgCX0KICAgICAgICAg
ICAgIAkKLQotICAgICAgICAgICAgCQogICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0g
a2V5LnN1YnN0cmluZyhrZXkubGFzdEluZGV4T2YoIi8iKSsxKTsKICAgICAgICAgICAgICAg
ICAvLyBtYXliZSBjb252ZXJ0IGh0bWwgY29kZXMgKGUuZy4gJTJjIC0+ICwgKQogICAgICAg
ICAgICAgICAgIGlmKCBuYW1lLmluZGV4T2YoIiUiKSA+IDAgKSB7CkBAIC05OTgsNDcgKzk5
OCwxNiBAQA0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgU3RyaW5nIGFza0Zv
clByZWZpeCgpIHsKLSAgICAJIHJldHVybiBKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2co
Ci0gICAgCQl0aGlzLAotICAgIAkJbGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNZXNzYWdlUGFuZS5t
ZXNzYWdlVGV4dC5kb3dubG9hZFByZWZpeERpYWxvZy5ib2R5IiksCi0gICAgCQlsYW5ndWFn
ZS5nZXRTdHJpbmcoIk1lc3NhZ2VQYW5lLm1lc3NhZ2VUZXh0LmRvd25sb2FkUHJlZml4RGlh
bG9nLnRpdGxlIiksCi0gICAgCQlKT3B0aW9uUGFuZS5RVUVTVElPTl9NRVNTQUdFCi0JCSk7
Ci0gICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGJyb3dzZUl0ZW1fYWN0aW9uUGVyZm9ybWVk
KGZpbmFsIFN0cmluZyBrZXlzKSB7Ci0gICAgICAgIERvd25sb2FkTWFuYWdlciBkbE1hbmFn
ZXIgPSBGaWxlVHJhbnNmZXJNYW5hZ2VyLmluc3QoKS5nZXREb3dubG9hZE1hbmFnZXIoKTsK
LQkJZmluYWwgSkZpbGVDaG9vc2VyIGZjID0gbmV3IEpGaWxlQ2hvb3NlcihDb3JlLmZyb3N0
U2V0dGluZ3MuZ2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5ESVJfTEFTVF9VU0VEKSk7Ci0JCWZj
LnNldERpYWxvZ1RpdGxlKGxhbmd1YWdlLmdldFN0cmluZygiT3B0aW9ucy5kb3dubG9hZHMu
ZmlsZWNob29zZXIudGl0bGUiKSk7Ci0JCWZjLnNldEZpbGVIaWRpbmdFbmFibGVkKHRydWUp
OwotCQlmYy5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIuRElSRUNUT1JJRVNf
T05MWSk7Ci0JCWZjLnNldE11bHRpU2VsZWN0aW9uRW5hYmxlZChmYWxzZSk7CisgICAgcHJp
dmF0ZSBjbGFzcyBQb3B1cE1lbnVUb2ZUZXh0IGV4dGVuZHMgSlNraW5uYWJsZVBvcHVwTWVu
dSBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyLCBMYW5ndWFnZUxpc3RlbmVyIHsKIAotCQlm
aW5hbCBpbnQgcmV0dXJuVmFsID0gZmMuc2hvd09wZW5EaWFsb2codGhpcyk7Ci0JCWlmIChy
ZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0JCQlmaW5hbCBT
dHJpbmcgZmlsZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0
b3IiKTsKLQkJCWZpbmFsIEZpbGUgZmlsZSA9IGZjLmdldFNlbGVjdGVkRmlsZSgpOwotCQkJ
ZmluYWwgU3RyaW5nIHByZWZpeCA9IGFza0ZvclByZWZpeCgpOworCQlwcml2YXRlIHN0YXRp
YyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAotCQkJQ29yZS5mcm9zdFNl
dHRpbmdzLnNldFZhbHVlKFNldHRpbmdzQ2xhc3MuRElSX0xBU1RfVVNFRCwgZmlsZS5nZXRQ
YXJlbnQoKSk7Ci0JCQlkbE1hbmFnZXIuYWRkUmVjZW50RG93bmxvYWREaXIoZmlsZS5nZXRQ
YXRoKCkgKyBmaWxlU2VwYXJhdG9yKTsKLQkJCWRsTWFuYWdlci5hZGRLZXlzKGtleXMsIGZp
bGUuZ2V0UGF0aCgpICsgZmlsZVNlcGFyYXRvciwgcHJlZml4KTsKLQkJfQotICAgIH0KKwkJ
cHJpdmF0ZSBmaW5hbCBKVGV4dENvbXBvbmVudCBzb3VyY2VUZXh0Q29tcG9uZW50OwogCi0g
ICAgcHJpdmF0ZSBjbGFzcyBQb3B1cE1lbnVUb2ZUZXh0Ci0gICAgZXh0ZW5kcyBKU2tpbm5h
YmxlUG9wdXBNZW51Ci0gICAgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lciwgTGFuZ3VhZ2VM
aXN0ZW5lciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBKVGV4dENvbXBvbmVudCBzb3Vy
Y2VUZXh0Q29tcG9uZW50OwotCiAgICAgICAgIHByaXZhdGUgZmluYWwgSk1lbnVJdGVtIGNv
cHlJdGVtID0gbmV3IEpNZW51SXRlbSgpOwogICAgICAgICBwcml2YXRlIGZpbmFsIEpNZW51
SXRlbSBzYXZlTWVzc2FnZUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgIHByaXZh
dGUgZmluYWwgSk1lbnUgZG93bmxvYWRLZXlzSXRlbSA9IG5ldyBKTWVudSgpOwotICAgICAg
ICBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBkZWZhdWx0RGxEaXJJdGVtID0gbmV3IEpNZW51
SXRlbSgpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEpNZW51SXRlbSBicm93c2VJdGVtID0g
bmV3IEpNZW51SXRlbSgpOwotICAgICAgICBwcml2YXRlIEpNZW51SXRlbSByZWNlbnREbERp
ckl0ZW1zW107CisgICAgICAgIHByaXZhdGUgZmluYWwgSk1lbnVJdGVtIGRvd25sb2FkS2V5
cyA9IG5ldyBKTWVudUl0ZW0oKTsKIAogICAgICAgICBwdWJsaWMgUG9wdXBNZW51VG9mVGV4
dChmaW5hbCBKVGV4dENvbXBvbmVudCBzb3VyY2VUZXh0Q29tcG9uZW50KSB7CiAgICAgICAg
ICAgICBzdXBlcigpOwpAQCAtMTA0NywyOSArMTAxNiwyNCBAQA0KICAgICAgICAgfQogCiAg
ICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBl
KSB7Ci0JICAgICAgICBEb3dubG9hZE1hbmFnZXIgZGxNYW5hZ2VyID0gRmlsZVRyYW5zZmVy
TWFuYWdlci5pbnN0KCkuZ2V0RG93bmxvYWRNYW5hZ2VyKCk7Ci0KICAgICAgICAgICAgIGlm
IChlLmdldFNvdXJjZSgpID09IHNhdmVNZXNzYWdlSXRlbSkgewogICAgICAgICAgICAgICAg
IHNhdmVNZXNzYWdlQnV0dG9uX2FjdGlvblBlcmZvcm1lZCgpOwogICAgICAgICAgICAgfSBl
bHNlIGlmIChlLmdldFNvdXJjZSgpID09IGNvcHlJdGVtKSB7CiAgICAgICAgICAgICAgICAg
Ly8gY29weSBzZWxlY3RlZCB0ZXh0CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRl
eHQgPSBzb3VyY2VUZXh0Q29tcG9uZW50LmdldFNlbGVjdGVkVGV4dCgpOwogICAgICAgICAg
ICAgICAgIENvcHlUb0NsaXBib2FyZC5jb3B5VGV4dCh0ZXh0KTsKLSAgICAgICAgICAgIH0g
ZWxzZSBpZiAoZS5nZXRTb3VyY2UoKSA9PSBkZWZhdWx0RGxEaXJJdGVtKSB7Ci0gICAgICAg
ICAgICAJZmluYWwgU3RyaW5nIHByZWZpeCA9IGFza0ZvclByZWZpeCgpOworICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgfSBpZihlLmdldFNvdXJjZSgpID09IGRvd25sb2FkS2V5
cyApIHsKKyAgICAgICAgICAgIAkKKyAgICAgICAgICAgIAlMaXN0PEZyb3N0RG93bmxvYWRJ
dGVtPiBmcm9zdERvd25sb2FkSXRlbUxpc3QgPSBEb3dubG9hZE1hbmFnZXIucGFyc2VLZXlz
KHNvdXJjZVRleHRDb21wb25lbnQuZ2V0U2VsZWN0ZWRUZXh0KCkpOwogCi0gICAgICAgICAg
ICAJZGxNYW5hZ2VyLmFkZEtleXMoc291cmNlVGV4dENvbXBvbmVudC5nZXRTZWxlY3RlZFRl
eHQoKSwgbnVsbCwgcHJlZml4KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRTb3Vy
Y2UoKSA9PSBicm93c2VJdGVtKSB7Ci0gICAgICAgICAgICAJYnJvd3NlSXRlbV9hY3Rpb25Q
ZXJmb3JtZWQoc291cmNlVGV4dENvbXBvbmVudC5nZXRTZWxlY3RlZFRleHQoKSk7Ci0JCQl9
IGVsc2UgewotICAgICAgICAgICAgCWZvciAoZmluYWwgSk1lbnVJdGVtIGl0ZW0gOiByZWNl
bnREbERpckl0ZW1zKSB7Ci0gICAgICAgICAgICAJCWlmIChlLmdldFNvdXJjZSgpID09IGl0
ZW0pIHsKLQkJCQkJCWZpbmFsIFN0cmluZyBwcmVmaXggPSBhc2tGb3JQcmVmaXgoKTsKKyAg
ICAgICAgICAgIAlmaW5hbCBBZGROZXdEb3dubG9hZHNEaWFsb2cgYWRkTmV3RG93bmxvYWRz
RGlhbG9nID0gbmV3IEFkZE5ld0Rvd25sb2Fkc0RpYWxvZygKKyAgICAgICAgICAgIAkJCU1h
aW5GcmFtZS5nZXRJbnN0YW5jZSgpLCBmcm9zdERvd25sb2FkSXRlbUxpc3QpOworICAgICAg
ICAgICAgCWZyb3N0RG93bmxvYWRJdGVtTGlzdCA9IGFkZE5ld0Rvd25sb2Fkc0RpYWxvZy5z
dGFydERpYWxvZyhmcm9zdERvd25sb2FkSXRlbUxpc3QpOwogCi0gICAgICAgICAgICAJCQlk
bE1hbmFnZXIuYWRkUmVjZW50RG93bmxvYWREaXIoaXRlbS5nZXRUZXh0KCkpOwotICAgICAg
ICAgICAgCQkJZGxNYW5hZ2VyLmFkZEtleXMoc291cmNlVGV4dENvbXBvbmVudC5nZXRTZWxl
Y3RlZFRleHQoKSwgaXRlbS5nZXRUZXh0KCksIHByZWZpeCk7Ci0gICAgICAgICAgICAJCQli
cmVhazsKLSAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCURvd25sb2FkTW9kZWwgZG93
bmxvYWRNb2RlbCA9IEZpbGVUcmFuc2Zlck1hbmFnZXIuaW5zdCgpLmdldERvd25sb2FkTWFu
YWdlcigpLmdldE1vZGVsKCk7CisgICAgICAgICAgICAJZm9yKGZpbmFsIEZyb3N0RG93bmxv
YWRJdGVtIGZyb3N0RG93bmxvYWRJdGVtIDogZnJvc3REb3dubG9hZEl0ZW1MaXN0ICkgewor
ICAgICAgICAgICAgCQlkb3dubG9hZE1vZGVsLmFkZERvd25sb2FkSXRlbShmcm9zdERvd25s
b2FkSXRlbSk7CiAgICAgICAgICAgICAJfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBA
IC0xMDc5LDUwICsxMDQzLDE5IEBADQogCiAgICAgICAgICAgICBjb3B5SXRlbS5hZGRBY3Rp
b25MaXN0ZW5lcih0aGlzKTsKICAgICAgICAgICAgIHNhdmVNZXNzYWdlSXRlbS5hZGRBY3Rp
b25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAJCWRlZmF1bHREbERpckl0ZW0uYWRkQWN0aW9u
TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgCQlicm93c2VJdGVtLmFkZEFjdGlvbkxpc3RlbmVy
KHRoaXMpOworICAgICAgICAgICAgZG93bmxvYWRLZXlzLmFkZEFjdGlvbkxpc3RlbmVyKHRo
aXMpOwogCiAgICAgICAgICAgICBhZGQoY29weUl0ZW0pOwogICAgICAgICAgICAgYWRkU2Vw
YXJhdG9yKCk7CiAgICAgICAgICAgICBhZGQoc2F2ZU1lc3NhZ2VJdGVtKTsKICAgICAgICAg
ICAgIGFkZFNlcGFyYXRvcigpOwotICAgICAgICAgICAgYWRkKGRvd25sb2FkS2V5c0l0ZW0p
OworICAgICAgICAgICAgYWRkKGRvd25sb2FkS2V5cyk7CiAgICAgICAgIH0KIAotICAgICAg
ICBwcml2YXRlIHZvaWQgcG9wdWxhdGVEb3dubG9hZEtleXMoKSB7Ci0gICAgICAgIAlmaW5h
bCBMaW5rZWRMaXN0PFN0cmluZz4gZGlycyA9IEZpbGVUcmFuc2Zlck1hbmFnZXIuaW5zdCgp
LmdldERvd25sb2FkTWFuYWdlcigpLmdldFJlY2VudERvd25sb2FkRGlycygpOwotICAgICAg
ICAJaW50IGkgPSAwOwotCi0gICAgICAgIAlkb3dubG9hZEtleXNJdGVtLnJlbW92ZUFsbCgp
OwotICAgICAgICAJZG93bmxvYWRLZXlzSXRlbS5hZGQoZGVmYXVsdERsRGlySXRlbSk7Ci0g
ICAgICAgIAlkZWZhdWx0RGxEaXJJdGVtLnNldFRleHQoQ29yZS5mcm9zdFNldHRpbmdzLmdl
dFZhbHVlKFNldHRpbmdzQ2xhc3MuRElSX0RPV05MT0FEKSk7Ci0KLSAgICAgICAgCWlmIChk
aXJzLnNpemUoKSA+IDApIHsKLSAgICAgICAgCQlkb3dubG9hZEtleXNJdGVtLmFkZFNlcGFy
YXRvcigpOwotCi0JICAgICAgICAJcmVjZW50RGxEaXJJdGVtcyA9IG5ldyBKTWVudUl0ZW1b
ZGlycy5zaXplKCldOwotCi0gICAgICAgIAkgICAgZmluYWwgTGlzdEl0ZXJhdG9yIGl0ZXIg
PSBkaXJzLmxpc3RJdGVyYXRvcihkaXJzLnNpemUoKSk7Ci0JICAgICAgICAJd2hpbGUgKGl0
ZXIuaGFzUHJldmlvdXMoKSkgewotCSAgICAgICAgCSAgICBmaW5hbCBTdHJpbmcgZGlyID0g
KFN0cmluZylpdGVyLnByZXZpb3VzKCk7Ci0KLQkgICAgICAgIAkJcmVjZW50RGxEaXJJdGVt
c1tpXSA9IG5ldyBKTWVudUl0ZW0oKTsKLQkgICAgICAgIAkJcmVjZW50RGxEaXJJdGVtc1tp
XS5zZXRUZXh0KGRpcik7Ci0JICAgICAgICAJCXJlY2VudERsRGlySXRlbXNbaV0uYWRkQWN0
aW9uTGlzdGVuZXIodGhpcyk7Ci0JICAgICAgICAJCWRvd25sb2FkS2V5c0l0ZW0uYWRkKHJl
Y2VudERsRGlySXRlbXNbaV0pOwotCSAgICAgICAgCQlpKys7Ci0JCQkJfQotCQkJfQotCi0g
ICAgICAgCQlkb3dubG9hZEtleXNJdGVtLmFkZFNlcGFyYXRvcigpOwotICAgICAgIAkJZG93
bmxvYWRLZXlzSXRlbS5hZGQoYnJvd3NlSXRlbSk7Ci0gICAgICAgIH0KLQogICAgICAgICBw
dWJsaWMgdm9pZCBsYW5ndWFnZUNoYW5nZWQoZmluYWwgTGFuZ3VhZ2VFdmVudCBldmVudCkg
ewogICAgICAgICAgICAgY29weUl0ZW0uc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIk1l
c3NhZ2VQYW5lLm1lc3NhZ2VUZXh0LnBvcHVwbWVudS5jb3B5IikpOwogICAgICAgICAgICAg
c2F2ZU1lc3NhZ2VJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNZXNzYWdlUGFu
ZS5tZXNzYWdlVGV4dC5wb3B1cG1lbnUuc2F2ZU1lc3NhZ2VUb0Rpc2siKSk7Ci0gICAgICAg
ICAgICBkb3dubG9hZEtleXNJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNZXNz
YWdlUGFuZS5tZXNzYWdlVGV4dC5wb3B1cG1lbnUuZG93bmxvYWRLZXlzVG8iKSk7Ci0gICAg
ICAgICAgICBicm93c2VJdGVtLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNZXNzYWdl
UGFuZS5tZXNzYWdlVGV4dC5wb3B1cG1lbnUuYnJvd3NlIikpOworICAgICAgICAgICAgZG93
bmxvYWRLZXlzLnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJNZXNzYWdlUGFuZS5tZXNz
YWdlVGV4dC5wb3B1cG1lbnUuZG93bmxvYWRLZXlzIikpOwogICAgICAgICB9CiAKICAgICAg
ICAgQE92ZXJyaWRlCkBAIC0xMTMwLDExICsxMDYzLDEwIEBADQogICAgICAgICAgICAgaWYg
KChzZWxlY3RlZE1lc3NhZ2UgIT0gbnVsbCkgJiYgKHNlbGVjdGVkTWVzc2FnZS5nZXRDb250
ZW50KCkgIT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgICBpZiAoc291cmNlVGV4dENvbXBv
bmVudC5nZXRTZWxlY3RlZFRleHQoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAg
IGNvcHlJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRvd25s
b2FkS2V5c0l0ZW0uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgcG9w
dWxhdGVEb3dubG9hZEtleXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRLZXlz
LnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAg
ICAgICAgICAgICAgY29weUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAg
ICAgICAgIGRvd25sb2FkS2V5c0l0ZW0uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAg
ICAgICAgICAgIGRvd25sb2FkS2V5cy5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAg
ICAgICB9CiAgICAgICAgICAgICAgICAgc3VwZXIuc2hvdyhpbnZva2VyLCB4LCB5KTsKICAg
ICAgICAgICAgIH0KQEAgLTExNDUsNyArMTA3Nyw3IEBADQogICAgICAgICByZXR1cm4gRmls
ZVRyYW5zZmVyTWFuYWdlci5pbnN0KCkuZ2V0RG93bmxvYWRNYW5hZ2VyKCkuZ2V0TW9kZWwo
KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBwcm90ZWN0ZWQg
dm9pZCBjbG9zZSgpIHsKICAgICAgICAgQ29yZS5mcm9zdFNldHRpbmdzLnJlbW92ZVByb3Bl
cnR5Q2hhbmdlTGlzdGVuZXIoU2V0dGluZ3NDbGFzcy5NRVNTQUdFX0JPRFlfRk9OVF9OQU1F
LCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKICAgICAgICAgQ29yZS5mcm9zdFNldHRpbmdz
LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2V0dGluZ3NDbGFzcy5NRVNTQUdFX0JP
RFlfRk9OVF9TSVpFLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKICAgICAgICAgQ29yZS5m
cm9zdFNldHRpbmdzLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2V0dGluZ3NDbGFz
cy5NRVNTQUdFX0JPRFlfRk9OVF9TVFlMRSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Cklu
ZGV4OiBzb3VyY2UvaTE4bi9sYW5ncmVzLnByb3BlcnRpZXMNCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0t
LSBzb3VyY2UvaTE4bi9sYW5ncmVzLnByb3BlcnRpZXMJKHJldmlzaW9uIDMxOTcpDQorKysg
c291cmNlL2kxOG4vbGFuZ3Jlcy5wcm9wZXJ0aWVzCSh3b3JraW5nIGNvcHkpDQpAQCAtOCw4
ICs4LDE0IEBADQogQWJvdXRCb3gudGV4dC53aW5kb3dzSW5zdGFsbGVyPVdpbmRvd3MgSW5z
dGFsbGVyOgogQWJvdXRCb3gudGl0bGU9QWJvdXQKIEFkZE5ld0Rvd25sb2Fkc0RpYWxvZy50
aXRsZT1BZGQgbmV3IEZpbGVzIHRvIGRvd25sb2FkIGxpc3QKK0FkZE5ld0Rvd25sb2Fkc0Rp
YWxvZy5idXR0b24ucmVuYW1lRmlsZT1SZW5hbWUgZmlsZQorQWRkTmV3RG93bmxvYWRzRGlh
bG9nLmJ1dHRvbi5wcmVmaXhGaWxlbmFtZT1BZGQgcHJlZml4IHRvIGZpbGVuYW1lCiBBZGRO
ZXdEb3dubG9hZHNEaWFsb2cuYnV0dG9uLmNoYW5nZURvd25sb2FkRGlyPUNoYW5nZSBkb3du
bG9hZCB0YXJnZXQgZGlyZWN0b3J5CiBBZGROZXdEb3dubG9hZHNEaWFsb2cuYnV0dG9uLnJl
bW92ZURvd25sb2FkPVJlbW92ZQorQWRkTmV3RG93bmxvYWRzRGlhbG9nLnJlbmFtZUZpbGVE
aWFsb2cuZGlhbG9nVGl0bGU9UmVuYW1lIGZpbGUKK0FkZE5ld0Rvd25sb2Fkc0RpYWxvZy5y
ZW5hbWVGaWxlRGlhbG9nLmRpYWxvZ0JvZHk9RW50ZXIgbmV3IGZpbGVuYW1lCitBZGROZXdE
b3dubG9hZHNEaWFsb2cucHJlZml4RmlsZW5hbWVEaWFsb2cuZGlhbG9nVGl0bGU9UHJlZml4
IGZpbGUKK0FkZE5ld0Rvd25sb2Fkc0RpYWxvZy5wcmVmaXhGaWxlbmFtZURpYWxvZy5kaWFs
b2dCb2R5PUVudGVyIHByZWZpeCBmb3IgZmlsZW5hbWUKIEFkZE5ld0Rvd25sb2Fkc0RpYWxv
Zy5jaGFuZ2VEaXJEaWFsb2cudGl0bGU9Q2hhbmdlIHRhcmdldCBkaXJlY3RvcnkKIEFkZE5l
d0Rvd25sb2Fkc0RpYWxvZy50YWJsZS5uYW1lPU5hbWUKIEFkZE5ld0Rvd25sb2Fkc0RpYWxv
Zy50YWJsZS5rZXk9S2V5CkBAIC00OTIsMTAgKzQ5OCwxMSBAQA0KIE1lc3NhZ2VQYW5lLm1l
c3NhZ2VUZXh0LnBvcHVwbWVudS5jb3B5PUNvcHkKIE1lc3NhZ2VQYW5lLm1lc3NhZ2VUZXh0
LnBvcHVwbWVudS5zYXZlTWVzc2FnZVRvRGlzaz1TYXZlIG1lc3NhZ2UgdG8gZGlzawogTWVz
c2FnZVBhbmUubWVzc2FnZVRleHQuc2F2ZURpYWxvZy50aXRsZT1TYXZlIG1lc3NhZ2UgdG8g
ZGlzawotTWVzc2FnZVBhbmUubWVzc2FnZVRleHQuZG93bmxvYWRQcmVmaXhEaWFsb2cudGl0
bGU9RmlsZW5hbWUgcHJlZml4Ci1NZXNzYWdlUGFuZS5tZXNzYWdlVGV4dC5wb3B1cG1lbnUu
ZG93bmxvYWRLZXlzVG89RG93bmxvYWQga2V5cyB0by4uLgotTWVzc2FnZVBhbmUubWVzc2Fn
ZVRleHQucG9wdXBtZW51LmJyb3dzZT1Ccm93c2UuLi4KLU1lc3NhZ2VQYW5lLm1lc3NhZ2VU
ZXh0LmRvd25sb2FkUHJlZml4RGlhbG9nLmJvZHk9RW50ZXIgdGV4dCB0byBwcmVmaXggZmls
ZW5hbWVzIHdpdGgsIG9yIGxlYXZlIGVtcHR5IGZvciBubyBwcmVmaXgKK01lc3NhZ2VQYW5l
Lm1lc3NhZ2VUZXh0LnBvcHVwbWVudS5kb3dubG9hZEtleXM9RG93bmxvYWQgc2VsZWN0ZWQg
a2V5cworI01lc3NhZ2VQYW5lLm1lc3NhZ2VUZXh0LmRvd25sb2FkUHJlZml4RGlhbG9nLnRp
dGxlPUZpbGVuYW1lIHByZWZpeAorI01lc3NhZ2VQYW5lLm1lc3NhZ2VUZXh0LnBvcHVwbWVu
dS5kb3dubG9hZEtleXNUbz1Eb3dubG9hZCBrZXlzIHRvLi4uCisjTWVzc2FnZVBhbmUubWVz
c2FnZVRleHQucG9wdXBtZW51LmJyb3dzZT1Ccm93c2UuLi4KKyNNZXNzYWdlUGFuZS5tZXNz
YWdlVGV4dC5kb3dubG9hZFByZWZpeERpYWxvZy5ib2R5PUVudGVyIHRleHQgdG8gcHJlZml4
IGZpbGVuYW1lcyB3aXRoLCBvciBsZWF2ZSBlbXB0eSBmb3Igbm8gcHJlZml4CiBNZXNzYWdl
UGFuZS5taXNzaW5nQm9hcmRFcnJvci50ZXh0PUNhbid0IHJlcGx5LCB0aGUgdGFyZ2V0IGJv
YXJkICcnezB9JycgaXMgbm90IGluIHlvdXIgYm9hcmRsaXN0LgogTWVzc2FnZVBhbmUubWlz
c2luZ0JvYXJkRXJyb3IudGl0bGU9RXJyb3IKIE1lc3NhZ2VQYW5lLm1pc3NpbmdMb2NhbElk
ZW50aXR5RXJyb3IudGV4dD1DYW4ndCByZXBseSBlbmNyeXB0ZWQsIHlvdXIgaWRlbnRpdHkg
Jyd7MH0nJyB0aGF0IHJlY2VpdmVkIHRoZSBvcmlnaW5hbCBtZXNzYWdlIGlzIG1pc3Npbmch
Cg==
--------------070101010302050001010502
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
--------------070101010302050001010502
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Jtcfrost-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jtcfrost-devl

--------------070101010302050001010502--