--=_156c716f-6003-47a3-bcaa-20301ab51501
Content-Type: multipart/alternative;
boundary="=_1a8d4419-a4c3-4d94-96e2-c9d519481224"
--=_1a8d4419-a4c3-4d94-96e2-c9d519481224
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Hi guys,
I've spent some time working on UI Plugins proof-of-concept (PoC) implement=
ation, and thought I'd share my results with you. I've attached a patch tha=
t reflects the current progress.
The actual PoC implementation takes some inspiration from oVirt UI Plugins =
wiki page, and simplifies/streamlines/improves its main concepts. The goal =
is to have simple-to-use, yet flexible and robust plugin infrastructure. Ma=
jor changes to the original design are outlined below.
Each UI plugin runs within the context of an iframe, and therefore requires=
a plugin source page that executes the actual plugin code.
=E2=80=A2 iframe is essentially the sandbox for each plugin. We can dis=
able plugins by detaching their iframe elements from the main document duri=
ng WebAdmin runtime. This also allows us to implement features such as plug=
in safe mode (no plugins loaded on WebAdmin startup).
=E2=80=A2 Plugin source pages and WebAdmin host page share the same ori=
gin (protocol, domain, port), with plugin source pages being served through=
EngineManager application server (JBoss AS). This is to avoid cross-domain=
window/iframe communication issues, when the actual plugin code running in=
an iframe tries to register itself into WebAdmin main document's pluginApi=
object.
=E2=80=A2 There's a servlet designed to render plugin source page for a=
ll plugins ( PluginSourcePageServlet ). For the given plugin, it detects it=
s dependencies (3rd party JavaScript libraries) and configuration object (J=
SON data), reads the actual plugin code, and assembles everything into the =
resulting HTML page (to be evaluated by the plugin iframe).
=E2=80=A2 iframe isolates plugin dependencies (3rd party JavaScript lib=
raries) from other plugins and the main WebAdmin document. In practice, thi=
s means that plugin A can use jQuery 1.7 and plugin B can use jQuery 1.6 wi=
thout the fear of any clashes.
=E2=80=A2 Last but not least, writing plugins in Google Web Toolkit (GW=
T) should be as easy as providing your own plugin source page. Just deploy =
your GWT plugin application on JBoss AS (next to engine.ear ), and point to=
GWT plugin application host page.
The current PoC declares a simple plugin that gets loaded using hard-coded =
values in PluginSourcePageServlet . Actual plugin code registers the plugin=
into global pluginApi.plugins object, with one sample event handler functi=
on ( ActionButtonClick ). Just after that, the plugin reports in as ready b=
y calling pluginApi.ready function. This essentially puts the plugin into u=
se within WebAdmin.
To simulate extension point (application event to be consumed by plugins), =
when the user clicks "New server" button on "Virtual Machines" main
tab, Ac=
tionButtonClickEvent gets fired through WebAdmin event bus. PluginEventHand=
ler receives this event and invokes ActionButtonClick event handler functio=
n on all plugins.
(Note: for passing context objects from WebAdmin to plugin event handler fu=
nctions, I'm planning to experiment with gwt-exporter project [1]. This wou=
ld greatly simplify the way how WebAdmin exposes context-specific plugin AP=
I to event handler functions.)
As for the next step, I suggest to have some meeting (conference) to discus=
s the PoC in detail, and outline tasks for the near future. Also, please le=
t me know what you think of the PoC so far.
Cheers,
Vojtech
[1]
http://code.google.com/p/gwt-exporter/
--=_1a8d4419-a4c3-4d94-96e2-c9d519481224
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
<html><head><style type=3D'text/css'>p { margin: 0;
}</style></head><body><=
div style=3D'font-family: Times New Roman; font-size: 12pt; color: #000000'=
Hi guys,<br><br>I've spent some time working on UI
Plugins proof-of-concep=
t (PoC) implementation, and thought I'd share my
results with you. I've att=
ached a patch that reflects the current progress. <br><br>The actual PoC im=
plementation takes some inspiration from oVirt UI Plugins wiki page, and si=
mplifies/streamlines/improves its main concepts. The goal is to have simple=
-to-use, yet flexible and robust plugin infrastructure. Major changes to th=
e original design are outlined below.<br><br><strong>Each UI plugin runs
wi=
thin the context of an iframe, and therefore requires a </strong><span styl=
e=3D"font-style: italic; font-weight: bold;">plugin source
page</span><span=
style=3D"font-weight: bold;"> that executes the actual plugin
code.</span>=
<br><ul><li>iframe is essentially the sandbox for each plugin. We can
disab=
le plugins by detaching their iframe elements from the main document during=
WebAdmin runtime. This also allows us to implement features such as <em>pl=
ugin safe mode</em> (no plugins loaded on WebAdmin
startup).</li><li>Plugin=
source pages and WebAdmin host page share the same origin (protocol, domai=
n, port), with plugin source pages being served through EngineManager appli=
cation server (JBoss AS). This is to avoid cross-domain window/iframe commu=
nication issues, when the actual plugin code running in an iframe tries to =
register itself into WebAdmin main document's <span style=3D"font-style: it=
alic;">pluginApi</span> object.</li><li>There's a servlet
designed to rende=
r plugin source page for all plugins (<span style=3D"font-style:
italic;">P=
luginSourcePageServlet</span>). For the given plugin, it detects its depend=
encies (3rd party JavaScript libraries) and configuration object (JSON data=
), reads the actual plugin code, and assembles everything into the resultin=
g HTML page (to be evaluated by the plugin iframe).</li><li>iframe isolates=
plugin dependencies (3rd party JavaScript libraries) from other plugins an=
d the main WebAdmin document. In practice, this means that plugin A can use=
jQuery 1.7 and plugin B can use jQuery 1.6 without the fear of any clashes=
.</li><li>Last but not least, writing plugins in Google Web Toolkit (GWT) s=
hould be as easy as providing your own plugin source page. Just deploy your=
GWT plugin application on JBoss AS (next to <span style=3D"font-style: ita=
lic;">engine.ear</span>), and point to GWT plugin application host
page.<br=
</li></ul><p>The current PoC declares a simple
plugin that gets loaded usi=
ng hard-coded values in <span
style=3D"font-style: italic;">PluginSourcePag=
eServlet</span>. Actual plugin code registers the plugin into global <span =
style=3D"font-style: italic;">pluginApi.plugins</span> object, with one
sam=
ple event handler function (<span style=3D"font-style:
italic;">ActionButto=
nClick</span>). Just after that, the plugin reports in as ready by calling =
<span style=3D"font-style: italic;">pluginApi.ready</span> function.
This e=
ssentially puts the plugin into use within
WebAdmin.<br></p><p><br></p>To s=
imulate extension point (application event to be consumed by plugins), when=
the user clicks "New server" button on "Virtual Machines" main tab,
<span =
style=3D"font-style: italic;">ActionButtonClickEvent</span> gets fired
thro=
ugh WebAdmin event bus. <span style=3D"font-style:
italic;">PluginEventHand=
ler</span> receives this event and invokes <span style=3D"font-style:
itali=
c;">ActionButtonClick</span> event handler function on all
plugins.<br><p><=
br></p><p>(Note: for passing context objects from WebAdmin to plugin event
=
handler functions, I'm planning to experiment with gwt-exporter project [1]=
. This would greatly simplify the way how WebAdmin exposes context-specific=
plugin API to event handler functions.)</p><p><br></p><p>As
for the next s=
tep, I suggest to have some meeting (conference) to discuss the PoC in deta=
il, and outline tasks for the near future. Also, please let me know what yo=
u think of the PoC so
far.<br></p><br>Cheers,<br>Vojtech<br><br>[1]
http://=
code.google.com/p/gwt-exporter/<p><br></p><p><...
--=_1a8d4419-a4c3-4d94-96e2-c9d519481224--
--=_156c716f-6003-47a3-bcaa-20301ab51501
Content-Type: text/x-patch; name=WIP-UI-Plugins-PoC.patch
Content-Disposition: attachment; filename=WIP-UI-Plugins-PoC.patch
Content-Transfer-Encoding: base64
RnJvbSA5NGM0NThkYzk4NThlZTcyMjBhY2Y1MzMyNDU0NGI5ODE0MGM3NTJhIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBWb2p0ZWNoIFN6b2NzIDx2c3pvY3NAcmVkaGF0LmNvbT4KRGF0
ZTogVGh1LCAxOSBKdWwgMjAxMiAxNDo0ODo0MCArMDIwMApTdWJqZWN0OiBbUEFUQ0hdIFdJUDog
VUkgUGx1Z2lucyBQb0MKCkNoYW5nZS1JZDogSWQyODgxMmRkYmU5MDU3NGRlMDE3OGYwYzA3ZGE3
MTNmZTlmZDhjZGEKU2lnbmVkLW9mZi1ieTogVm9qdGVjaCBTem9jcyA8dnN6b2NzQHJlZGhhdC5j
b20+Ci0tLQogLi4uL3NlcnZlci9nd3QvUGx1Z2luU291cmNlUGFnZVNlcnZsZXQuamF2YSAgICAg
ICAgfCAgIDQxICsrKysrKwogLi4uL3NlcnZlci9nd3QvV2ViYWRtaW5EeW5hbWljSG9zdGluZ1Nl
cnZsZXQuamF2YSAgfCAgICA0ICsKIC4uLi9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vZ2luL1N5
c3RlbU1vZHVsZS5qYXZhIHwgICAgNCArCiAuLi4vdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkFw
aU1hbmFnZXIuamF2YSAgICAgICB8ICAxNDMgKysrKysrKysrKysrKysrKysrKysKIC4uLi91aS93
ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRGVmaW5pdGlvbnMuamF2YSAgICAgIHwgICAzMCArKysrCiAu
Li4vdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkV2ZW50SGFuZGxlci5qYXZhICAgICB8ICAgMjQg
KysrKwogLi4uL3dlYmFkbWluL3BsdWdpbi9ldmVudC9BY3Rpb25CdXR0b25DbGljay5qYXZhICAg
fCAgICA4ICsKIC4uLi9tYWluL3ZpZXcvdGFiL01haW5UYWJWaXJ0dWFsTWFjaGluZVZpZXcuamF2
YSAgIHwgICAgOCArCiAuLi4vd2ViYWRtaW4vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnht
bCAgICAgICB8ICAgMTAgKysKIDkgZmlsZXMgY2hhbmdlZCwgMjcyIGluc2VydGlvbnMoKyksIDAg
ZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl
cy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJvbnRlbmQvc2Vy
dmVyL2d3dC9QbHVnaW5Tb3VyY2VQYWdlU2VydmxldC5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQg
ZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmly
dC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkFwaU1hbmFnZXIuamF2YQogY3JlYXRl
IG1vZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4v
amF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5EZWZpbml0aW9u
cy5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJh
ZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1Bs
dWdpbkV2ZW50SGFuZGxlci5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRt
aW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2Vi
YWRtaW4vcGx1Z2luL2V2ZW50L0FjdGlvbkJ1dHRvbkNsaWNrLmphdmEKCmRpZmYgLS1naXQgYS9m
cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL2Zyb250ZW5kL3NyYy9tYWluL2phdmEvb3JnL292aXJ0
L2VuZ2luZS91aS9mcm9udGVuZC9zZXJ2ZXIvZ3d0L1BsdWdpblNvdXJjZVBhZ2VTZXJ2bGV0Lmph
dmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL2Zyb250ZW5kL3NyYy9tYWluL2phdmEvb3Jn
L292aXJ0L2VuZ2luZS91aS9mcm9udGVuZC9zZXJ2ZXIvZ3d0L1BsdWdpblNvdXJjZVBhZ2VTZXJ2
bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwOGQ4ZQotLS0g
L2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvZnJvbnRlbmQvc3JjL21h
aW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZlci9nd3QvUGx1Z2luU291
cmNlUGFnZVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIG9yZy5vdmlydC5l
bmdpbmUudWkuZnJvbnRlbmQuc2VydmVyLmd3dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRp
b247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQu
aHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRS
ZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwor
CisvKioKKyAqIFJlbmRlcnMgdGhlIEhUTUwgc291cmNlIHBhZ2UgZm9yIHRoZSBnaXZlbiBVSSBw
bHVnaW4uCisgKi8KK3B1YmxpYyBjbGFzcyBQbHVnaW5Tb3VyY2VQYWdlU2VydmxldCBleHRlbmRz
IEh0dHBTZXJ2bGV0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVy
c2lvblVJRCA9IDFMOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQo
SHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2Up
IHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3Bv
bnNlLmdldFdyaXRlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9o
dG1sOyBjaGFyc2V0PVVURi04Iik7IC8vJE5PTi1OTFMtMSQKKworICAgICAgICB3cml0ZXIuYXBw
ZW5kKCI8IURPQ1RZUEUgaHRtbD48aHRtbD48aGVhZD4iKTsgLy8kTk9OLU5MUy0xJAorICAgICAg
ICB3cml0ZXIuYXBwZW5kKCI8bWV0YSBodHRwLWVxdWl2PVwiY29udGVudC10eXBlXCIgY29udGVu
dD1cInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFwiPiIpOyAvLyROT04tTkxTLTEkCisgICAgICAg
IHdyaXRlci5hcHBlbmQoIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImh0
dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuNy4yL2pxdWVyeS5t
aW4uanNcIj48L3NjcmlwdD4iKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB3cml0ZXIuYXBwZW5k
KCI8L2hlYWQ+PGJvZHk+Iik7IC8vJE5PTi1OTFMtMSQKKworICAgICAgICB3cml0ZXIuYXBwZW5k
KCI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj4iKTsgLy8kTk9OLU5MUy0xJAorICAg
ICAgICB3cml0ZXIuYXBwZW5kKCIoZnVuY3Rpb24oIHBsdWdpbkFwaSwgcGx1Z2luQ29uZmlnICkg
eyIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIHdyaXRlci5hcHBlbmQoIiAgd2luZG93LmFsZXJ0
KCdJbnZva2luZyBhY3R1YWwgcGx1Z2luIGNvZGUhJyk7Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAg
ICAgd3JpdGVyLmFwcGVuZCgiICB3aW5kb3cuYWxlcnQoJ1JlYWRpbmcgcGx1Z2luIGNvbmZpZ3Vy
YXRpb246ICcgKyBwbHVnaW5Db25maWcuZm9vKTsiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB3
cml0ZXIuYXBwZW5kKCIgIHBsdWdpbkFwaS5wbHVnaW5zWydteVBsdWdpbiddID0geyIpOyAvLyRO
T04tTkxTLTEkCisgICAgICAgIHdyaXRlci5hcHBlbmQoIiAgICBBY3Rpb25CdXR0b25DbGljazog
ZnVuY3Rpb24oY29udGV4dE9iamVjdCkgeyB3aW5kb3cuYWxlcnQoJ1dvb2hvbyEnKTsgfSIpOyAv
LyROT04tTkxTLTEkCisgICAgICAgIHdyaXRlci5hcHBlbmQoIiAgfTsiKTsgLy8kTk9OLU5MUy0x
JAorICAgICAgICB3cml0ZXIuYXBwZW5kKCIgIHBsdWdpbkFwaS5yZWFkeSgnbXlQbHVnaW4nKTsi
KTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB3cml0ZXIuYXBwZW5kKCJ9KSAoIHBhcmVudC5wbHVn
aW5BcGksIHsgXCJmb29cIjogMTIzIH0gKTsiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB3cml0
ZXIuYXBwZW5kKCI8L3NjcmlwdD4iKTsgLy8kTk9OLU5MUy0xJAorCisgICAgICAgIHdyaXRlci5h
cHBlbmQoIjwvYm9keT48L2h0bWw+Iik7IC8vJE5PTi1OTFMtMSQKKyAgICB9CisKK30KZGlmZiAt
LWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9v
cmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZlci9nd3QvV2ViYWRtaW5EeW5hbWljSG9z
dGluZ1NlcnZsZXQuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvZnJvbnRlbmQvc3Jj
L21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZlci9nd3QvV2ViYWRt
aW5EeW5hbWljSG9zdGluZ1NlcnZsZXQuamF2YQppbmRleCA0MjhkY2M1Li5kY2FmNDlhIDEwMDY0
NAotLS0gYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL2Zyb250ZW5kL3NyYy9tYWluL2phdmEv
b3JnL292aXJ0L2VuZ2luZS91aS9mcm9udGVuZC9zZXJ2ZXIvZ3d0L1dlYmFkbWluRHluYW1pY0hv
c3RpbmdTZXJ2bGV0LmphdmEKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9mcm9udGVu
ZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJvbnRlbmQvc2VydmVyL2d3dC9X
ZWJhZG1pbkR5bmFtaWNIb3N0aW5nU2VydmxldC5qYXZhCkBAIC0zNiw2ICszNiwxMCBAQCBwdWJs
aWMgY2xhc3MgV2ViYWRtaW5EeW5hbWljSG9zdGluZ1NlcnZsZXQgZXh0ZW5kcyBHd3REeW5hbWlj
SG9zdFBhZ2VTZXJ2bGV0IHsKICAgICAgICAgICAgIGFwcE1vZGVEYXRhLnB1dCgidmFsdWUiLCBT
dHJpbmcudmFsdWVPZihhcHBsaWNhdGlvbk1vZGUpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAg
ICAgd3JpdGVKc09iamVjdCh3cml0ZXIsICJhcHBsaWNhdGlvbk1vZGUiLCBhcHBNb2RlRGF0YSk7
IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQorCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4g
cGx1Z2luRGVmaW5pdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAg
ICAgcGx1Z2luRGVmaW5pdGlvbnMucHV0KCJteVBsdWdpbiIsICIvd2ViYWRtaW4vd2ViYWRtaW4v
UGx1Z2luU291cmNlUGFnZT9wbHVnaW49bXlQbHVnaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04t
TkxTLTIkCisgICAgICAgIHdyaXRlSnNPYmplY3Qod3JpdGVyLCAicGx1Z2luRGVmaW5pdGlvbnMi
LCBwbHVnaW5EZWZpbml0aW9ucyk7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICBwcml2YXRl
IEludGVnZXIgZ2V0QXBwbGljYXRpb25Nb2RlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7
CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWlu
L2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vU3lzdGVtTW9kdWxlLmphdmEg
Yi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292
aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vU3lzdGVtTW9kdWxlLmphdmEKaW5kZXggMzA2OWI5
OS4uNzg5NjNhZCAxMDA2NDQKLS0tIGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1p
bi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vZ2luL1N5c3RlbU1v
ZHVsZS5qYXZhCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21h
aW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL2dpbi9TeXN0ZW1Nb2R1bGUuamF2
YQpAQCAtOSw2ICs5LDggQEAgaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uQXBw
bGljYXRpb25SZXNvdXJjZXM7CiBpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5B
cHBsaWNhdGlvblRlbXBsYXRlczsKIGltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWlu
LnBsYWNlLkFwcGxpY2F0aW9uUGxhY2VzOwogaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2Vi
YWRtaW4ucGxhY2UuV2ViQWRtaW5QbGFjZU1hbmFnZXI7CitpbXBvcnQgb3JnLm92aXJ0LmVuZ2lu
ZS51aS53ZWJhZG1pbi5wbHVnaW4uUGx1Z2luQXBpTWFuYWdlcjsKK2ltcG9ydCBvcmcub3ZpcnQu
ZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5QbHVnaW5FdmVudEhhbmRsZXI7CiBpbXBvcnQgb3Jn
Lm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zeXN0ZW0uQXBwbGljYXRpb25Jbml0OwogaW1wb3J0
IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uc3lzdGVtLkludGVybmFsQ29uZmlndXJhdGlv
bjsKIApAQCAtMzEsNiArMzMsOCBAQCBwdWJsaWMgY2xhc3MgU3lzdGVtTW9kdWxlIGV4dGVuZHMg
QmFzZVN5c3RlbU1vZHVsZSB7CiAgICAgICAgIGJpbmQoUGxhY2VNYW5hZ2VyLmNsYXNzKS50byhX
ZWJBZG1pblBsYWNlTWFuYWdlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKICAgICAgICAg
YmluZChBcHBsaWNhdGlvbkluaXQuY2xhc3MpLmFzRWFnZXJTaW5nbGV0b24oKTsKICAgICAgICAg
YmluZChJbnRlcm5hbENvbmZpZ3VyYXRpb24uY2xhc3MpLmFzRWFnZXJTaW5nbGV0b24oKTsKKyAg
ICAgICAgYmluZChQbHVnaW5BcGlNYW5hZ2VyLmNsYXNzKS5hc0VhZ2VyU2luZ2xldG9uKCk7Cisg
ICAgICAgIGJpbmQoUGx1Z2luRXZlbnRIYW5kbGVyLmNsYXNzKS5hc0VhZ2VyU2luZ2xldG9uKCk7
CiAgICAgfQogCiAgICAgdm9pZCBiaW5kQ29uZmlndXJhdGlvbigpIHsKZGlmZiAtLWdpdCBhL2Zy
b250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQv
ZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5BcGlNYW5hZ2VyLmphdmEgYi9mcm9udGVu
ZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2lu
ZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luQXBpTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYmRkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVu
ZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2lu
ZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luQXBpTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTQz
IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luOworCitpbXBv
cnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZh
LnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVu
dC5KYXZhU2NyaXB0T2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50Lkpz
QXJyYXlTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZG9tLmNsaWVudC5Eb2N1bWVudDsK
K2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LklGcmFtZUVsZW1lbnQ7CitpbXBvcnQg
Y29tLmdvb2dsZS5nd3QuZG9tLmNsaWVudC5TdHlsZS5Cb3JkZXJTdHlsZTsKK2ltcG9ydCBjb20u
Z29vZ2xlLmd3dC5kb20uY2xpZW50LlN0eWxlLlBvc2l0aW9uOworaW1wb3J0IGNvbS5nb29nbGUu
Z3d0LmRvbS5jbGllbnQuU3R5bGUuVW5pdDsKKworLyoqCisgKiBUaGUgbWFpbiBjb21wb25lbnQg
b2YgV2ViQWRtaW4gVUkgcGx1Z2luIGluZnJhc3RydWN0dXJlLgorICogPHA+CisgKiBTaG91bGQg
YmUgYm91bmQgYXMgR0lOIGVhZ2VyIHNpbmdsZXRvbiwgY3JlYXRlZCBlYXJseSBvbiBkdXJpbmcg
YXBwbGljYXRpb24gc3RhcnR1cC4KKyAqLworcHVibGljIGNsYXNzIFBsdWdpbkFwaU1hbmFnZXIg
eworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRM
b2dnZXIoUGx1Z2luQXBpTWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLy8gTWFwcyBw
bHVnaW4gbmFtZXMgdG8gY29ycmVzcG9uZGluZyBpZnJhbWUgZWxlbWVudHMKKyAgICBwcml2YXRl
IGZpbmFsIE1hcDxTdHJpbmcsIElGcmFtZUVsZW1lbnQ+IHBsdWdpbklGcmFtZXMgPSBuZXcgSGFz
aE1hcDxTdHJpbmcsIElGcmFtZUVsZW1lbnQ+KCk7CisKKyAgICAvLyBNYXBzIHBsdWdpbiBuYW1l
cyB0byBjb3JyZXNwb25kaW5nIHBsdWdpbiBvYmplY3RzIChvbmx5IGZvciBwbHVnaW5zIHdoaWNo
IGFyZSBjdXJyZW50bHkgcmVhZHkpCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBKYXZh
U2NyaXB0T2JqZWN0PiBwbHVnaW5PYmplY3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKYXZhU2Ny
aXB0T2JqZWN0PigpOworCisgICAgcHVibGljIFBsdWdpbkFwaU1hbmFnZXIoKSB7CisgICAgICAg
IGV4cG9zZVBsdWdpbkFwaSgpOworICAgICAgICBsb2FkUGx1Z2lucygpOworICAgIH0KKworICAg
IC8qKgorICAgICAqIEludm9rZXMgdGhlIGdpdmVuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gb24g
YWxsIHBsdWdpbnMgd2hpY2ggYXJlIGN1cnJlbnRseSByZWFkeS4KKyAgICAgKi8KKyAgICBwdWJs
aWMgdm9pZCBpbnZva2VQbHVnaW5zKFN0cmluZyBmdW5jdGlvbk5hbWUsIEphdmFTY3JpcHRPYmpl
Y3QgY29udGV4dE9iamVjdCkgeworICAgICAgICBmb3IgKEphdmFTY3JpcHRPYmplY3QgcGx1Z2lu
T2JqZWN0IDogcGx1Z2luT2JqZWN0cy52YWx1ZXMoKSkgeworICAgICAgICAgICAgaW52b2tlUGx1
Z2luKHBsdWdpbk9iamVjdCwgZnVuY3Rpb25OYW1lLCBjb250ZXh0T2JqZWN0KTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIG5hdGl2ZSB2b2lkIGludm9rZVBsdWdpbihKYXZhU2NyaXB0T2JqZWN0
IHBsdWdpbk9iamVjdCwgU3RyaW5nIGZ1bmN0aW9uTmFtZSwgSmF2YVNjcmlwdE9iamVjdCBjb250
ZXh0T2JqZWN0KSAvKi17CisgICAgICAgIGlmIChjb250ZXh0T2JqZWN0ICE9IG51bGwpIHsKKyAg
ICAgICAgICAgIHBsdWdpbk9iamVjdFtmdW5jdGlvbk5hbWVdKGNvbnRleHRPYmplY3QpOworICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGx1Z2luT2JqZWN0W2Z1bmN0aW9uTmFtZV0oKTsK
KyAgICAgICAgfQorICAgIH0tKi87CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbGwgcGx1Z2lu
cyB0aGF0IHdlcmUgZGV0ZWN0ZWQgd2hlbiBzZXJ2aW5nIFdlYkFkbWluIGhvc3QgcGFnZS4KKyAg
ICAgKi8KKyAgICB2b2lkIGxvYWRQbHVnaW5zKCkgeworICAgICAgICBQbHVnaW5EZWZpbml0aW9u
cyBkZWZzID0gUGx1Z2luRGVmaW5pdGlvbnMuaW5zdGFuY2UoKTsKKworICAgICAgICBpZiAoZGVm
cyAhPSBudWxsKSB7CisgICAgICAgICAgICBKc0FycmF5U3RyaW5nIHBsdWdpbk5hbWVzID0gZGVm
cy5nZXRQbHVnaW5OYW1lcygpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBs
dWdpbk5hbWVzLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9
IHBsdWdpbk5hbWVzLmdldChpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlUGFnZVVy
bCA9IGRlZnMuZ2V0UGx1Z2luU291cmNlUGFnZVVybChuYW1lKTsKKworICAgICAgICAgICAgICAg
IGxvZ2dlci5pbmZvKCJMb2FkaW5nIHBsdWdpbiBbIiArIG5hbWUgKyAiXSBmcm9tIFVSTCAiICsg
c291cmNlUGFnZVVybCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAg
ICAgIGxvYWRQbHVnaW4obmFtZSwgc291cmNlUGFnZVVybCk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhIHBsdWdpbiB1c2luZyBpdHMg
c291cmNlIHBhZ2UgKEhUTUwgcGFnZSB0aGF0IGV4ZWN1dGVzIHRoZSBhY3R1YWwgcGx1Z2luIGNv
ZGUpLgorICAgICAqIDxwPgorICAgICAqIFdlYkFkbWluIHJlcXVpcmVzIGFsbCBwbHVnaW5zIHRv
IGhhdmUgYSBzb3VyY2UgcGFnZSBiZWNhdXNlIGVhY2ggcGx1Z2luIHJ1bnMgd2l0aGluIHRoZSBj
b250ZXh0IG9mIGFuIGlmcmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgcGx1Z2lu
IHNvdXJjZSBwYWdlIFVSTHMgYXJlIGFsd2F5cyByZWxhdGl2ZSB0byBKQm9zcyBzZXJ2ZXIgcm9v
dCBwYXRoLiBTb3VyY2UgcGFnZSBVUkxzIG11c3QgdGhlcmVmb3JlCisgICAgICogYWx3YXlzIGJl
Z2luIHdpdGggc2xhc2ggKHtAY29kZSAvfSkgY2hhcmFjdGVyLiBUaGlzIGFsbG93cyBXZWJBZG1p
biBob3N0IHBhZ2UgYW5kIGluZGl2aWR1YWwgcGx1Z2luIHNvdXJjZSBwYWdlcworICAgICAqIHRv
IHNoYXJlIHRoZSBzYW1lIG9yaWdpbiAocHJvdG9jb2wsIGRvbWFpbiwgcG9ydCkgYW5kIGF2b2lk
IGNyb3NzLWRvbWFpbiB3aW5kb3cvaWZyYW1lIGNvbW11bmljYXRpb24gaXNzdWVzLgorICAgICAq
LworICAgIHZvaWQgbG9hZFBsdWdpbihTdHJpbmcgcGx1Z2luTmFtZSwgU3RyaW5nIHBsdWdpblNv
dXJjZVBhZ2VVcmwpIHsKKyAgICAgICAgaWYgKCFwbHVnaW5Tb3VyY2VQYWdlVXJsLnN0YXJ0c1dp
dGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBsb2dnZXIud2FybmluZygiQXR0
ZW1wdGluZyB0byBsb2FkIHBsdWdpbiBbIiArIHBsdWdpbk5hbWUgKyAiXSB1c2luZyBpbnZhbGlk
IFVSTCAiICsgcGx1Z2luU291cmNlUGFnZVVybCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0y
JAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBsdWdpbklG
cmFtZXMuY29udGFpbnNLZXkocGx1Z2luTmFtZSkpIHsKKyAgICAgICAgICAgIGxvZ2dlci53YXJu
aW5nKCJQbHVnaW4gWyIgKyBwbHVnaW5OYW1lICsgIl0gaXMgYWxyZWFkeSBsb2FkZWQiKTsgLy8k
Tk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KworICAgICAgICAvLyBDcmVhdGUgYW4gaWZyYW1lIHVzZWQgdG8gbG9hZCB0aGUgcGx1Z2luIHNv
dXJjZSBwYWdlCisgICAgICAgIElGcmFtZUVsZW1lbnQgaWZyYW1lID0gRG9jdW1lbnQuZ2V0KCku
Y3JlYXRlSUZyYW1lRWxlbWVudCgpOworICAgICAgICBpZnJhbWUuc2V0U3JjKHBsdWdpblNvdXJj
ZVBhZ2VVcmwpOworICAgICAgICBpZnJhbWUuc2V0RnJhbWVCb3JkZXIoMCk7CisgICAgICAgIGlm
cmFtZS5nZXRTdHlsZSgpLnNldFBvc2l0aW9uKFBvc2l0aW9uLkFCU09MVVRFKTsKKyAgICAgICAg
aWZyYW1lLmdldFN0eWxlKCkuc2V0V2lkdGgoMCwgVW5pdC5QVCk7CisgICAgICAgIGlmcmFtZS5n
ZXRTdHlsZSgpLnNldEhlaWdodCgwLCBVbml0LlBUKTsKKyAgICAgICAgaWZyYW1lLmdldFN0eWxl
KCkuc2V0Qm9yZGVyU3R5bGUoQm9yZGVyU3R5bGUuTk9ORSk7CisgICAgICAgIHBsdWdpbklGcmFt
ZXMucHV0KHBsdWdpbk5hbWUsIGlmcmFtZSk7CisKKyAgICAgICAgLy8gQXR0YWNoIHRoZSBpZnJh
bWUgdG8gRE9NIGRvY3VtZW50IGJvZHkKKyAgICAgICAgRG9jdW1lbnQuZ2V0KCkuZ2V0Qm9keSgp
LmFwcGVuZENoaWxkKGlmcmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVz
IHRoYXQgdGhlIGdpdmVuIHBsdWdpbiBpcyByZWFkeSBmb3IgdXNlLgorICAgICAqIDxwPgorICAg
ICAqIE5vdGUgdGhhdCBldmVudCBoYW5kbGVyIGZ1bmN0aW9ucyB3aWxsIGJlIGludm9rZWQgb25s
eSBvbiBwbHVnaW5zIHdoaWNoIGFyZSBjdXJyZW50bHkgcmVhZHkuCisgICAgICovCisgICAgdm9p
ZCBwbHVnaW5SZWFkeShTdHJpbmcgcGx1Z2luTmFtZSwgSmF2YVNjcmlwdE9iamVjdCBwbHVnaW5P
YmplY3QpIHsKKyAgICAgICAgaWYgKHBsdWdpbk5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAg
bG9nZ2VyLndhcm5pbmcoIlBsdWdpbiBuYW1lIGlzIG51bGwgb3IgdW5kZWZpbmVkIik7IC8vJE5P
Ti1OTFMtMSQKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgh
cGx1Z2luSUZyYW1lcy5jb250YWluc0tleShwbHVnaW5OYW1lKSkgeworICAgICAgICAgICAgbG9n
Z2VyLndhcm5pbmcoIlBsdWdpbiBbIiArIHBsdWdpbk5hbWUgKyAiXSByZXBvcnRzIGluIGFzIHJl
YWR5LCBidXQgaGFzIG5vIGlmcmFtZSBhc3NvY2lhdGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9O
LU5MUy0yJAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcGx1Z2lu
T2JqZWN0cy5wdXQocGx1Z2luTmFtZSwgcGx1Z2luT2JqZWN0KTsKKyAgICB9CisKKyAgICBuYXRp
dmUgdm9pZCBleHBvc2VQbHVnaW5BcGkoKSAvKi17CisgICAgICAgIHZhciBpbnN0YW5jZSA9IHRo
aXM7CisKKyAgICAgICAgLy8gRXhwb3NlIHRoZSBnbG9iYWwgcGx1Z2luQXBpIG9iamVjdAorICAg
ICAgICAkd25kLnBsdWdpbkFwaSA9IHsKKworICAgICAgICAgICAgLy8gUGx1Z2lucyB3aWxsIHJl
Z2lzdGVyIHRoZW1zZWx2ZXMgaW50byB0aGlzIG9iamVjdCBieSBhZGRpbmcgbmV3IHByb3BlcnR5
OgorICAgICAgICAgICAgLy8gLSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwbHVn
aW4KKyAgICAgICAgICAgIC8vIC0gcHJvcGVydHkgdmFsdWUgaXMgdGhlIHBsdWdpbiBvYmplY3Qg
Y29udGFpbmluZyBldmVudCBoYW5kbGVyIGZ1bmN0aW9ucworICAgICAgICAgICAgcGx1Z2luczog
e30sCisKKyAgICAgICAgICAgIHJlYWR5OiBmdW5jdGlvbihwbHVnaW5OYW1lKSB7CisgICAgICAg
ICAgICAgICAgdmFyIHBsdWdpbk9iamVjdCA9IHRoaXMucGx1Z2luc1twbHVnaW5OYW1lXTsKKyAg
ICAgICAgICAgICAgICBpbnN0YW5jZS5Ab3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVn
aW4uUGx1Z2luQXBpTWFuYWdlcjo6cGx1Z2luUmVhZHkoTGphdmEvbGFuZy9TdHJpbmc7TGNvbS9n
b29nbGUvZ3d0L2NvcmUvY2xpZW50L0phdmFTY3JpcHRPYmplY3Q7KShwbHVnaW5OYW1lLHBsdWdp
bk9iamVjdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKyAgICB9LSovOworCit9CmRp
ZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2ph
dmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRGVmaW5pdGlvbnMu
amF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9v
cmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5EZWZpbml0aW9ucy5qYXZh
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTE4Y2IKLS0tIC9kZXYvbnVs
bAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEv
b3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRGVmaW5pdGlvbnMuamF2
YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4u
cGx1Z2luOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9i
amVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5U3RyaW5nOwor
CisvKioKKyAqIE92ZXJsYXkgdHlwZSBmb3Ige0Bjb2RlIHBsdWdpbkRlZmluaXRpb25zfSBnbG9i
YWwgSlMgb2JqZWN0LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGx1Z2luRGVmaW5pdGlvbnMg
ZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKKworICAgIHByb3RlY3RlZCBQbHVnaW5EZWZpbml0
aW9ucygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBQbHVnaW5EZWZpbml0
aW9ucyBpbnN0YW5jZSgpIC8qLXsKKyAgICAgICAgcmV0dXJuICR3bmQucGx1Z2luRGVmaW5pdGlv
bnM7CisgICAgfS0qLzsKKworICAgIHB1YmxpYyBuYXRpdmUgSnNBcnJheVN0cmluZyBnZXRQbHVn
aW5OYW1lcygpIC8qLXsKKyAgICAgICAgdmFyIHBsdWdpbk5hbWVzID0gW107CisgICAgICAgIGZv
ciAodmFyIGtleSBpbiB0aGlzKSB7CisgICAgICAgICAgICBwbHVnaW5OYW1lcy5wdXNoKGtleSk7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBsdWdpbk5hbWVzOworICAgIH0tKi87CisKKyAg
ICBwdWJsaWMgbmF0aXZlIFN0cmluZyBnZXRQbHVnaW5Tb3VyY2VQYWdlVXJsKFN0cmluZyBwbHVn
aW5OYW1lKSAvKi17CisgICAgICAgIHJldHVybiB0aGlzW3BsdWdpbk5hbWVdOworICAgIH0tKi87
CisKK30KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3Jj
L21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVu
dEhhbmRsZXIuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21h
aW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVudEhh
bmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjUwMWFjCi0t
LSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMv
bWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkV2ZW50
SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS51
aS53ZWJhZG1pbi5wbHVnaW47CisKK2ltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWlu
LnBsdWdpbi5ldmVudC5BY3Rpb25CdXR0b25DbGlja0V2ZW50OworaW1wb3J0IG9yZy5vdmlydC5l
bmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLmV2ZW50LkFjdGlvbkJ1dHRvbkNsaWNrRXZlbnQuQWN0
aW9uQnV0dG9uQ2xpY2tIYW5kbGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hh
cmVkLkV2ZW50QnVzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworLyoqCisg
KiBIYW5kbGVzIFdlYkFkbWluIGFwcGxpY2F0aW9uIGV2ZW50cyB0byBiZSBjb25zdW1lZCBieSBV
SSBwbHVnaW5zLgorICovCitwdWJsaWMgY2xhc3MgUGx1Z2luRXZlbnRIYW5kbGVyIHsKKworICAg
IEBJbmplY3QKKyAgICBwdWJsaWMgUGx1Z2luRXZlbnRIYW5kbGVyKEV2ZW50QnVzIGV2ZW50QnVz
LCBmaW5hbCBQbHVnaW5BcGlNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgZXZlbnRCdXMuYWRk
SGFuZGxlcihBY3Rpb25CdXR0b25DbGlja0V2ZW50LmdldFR5cGUoKSwgbmV3IEFjdGlvbkJ1dHRv
bkNsaWNrSGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVi
bGljIHZvaWQgb25BY3Rpb25CdXR0b25DbGljayhBY3Rpb25CdXR0b25DbGlja0V2ZW50IGV2ZW50
KSB7CisgICAgICAgICAgICAgICAgbWFuYWdlci5pbnZva2VQbHVnaW5zKCJBY3Rpb25CdXR0b25D
bGljayIsIG51bGwpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9CisgICAgICAgIH0pOwor
ICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1p
bi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL2V2ZW50
L0FjdGlvbkJ1dHRvbkNsaWNrLmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFk
bWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vZXZl
bnQvQWN0aW9uQnV0dG9uQ2xpY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi42MTQ1YjNkCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl
cy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1
Z2luL2V2ZW50L0FjdGlvbkJ1dHRvbkNsaWNrLmphdmEKQEAgLTAsMCArMSw4IEBACitwYWNrYWdl
IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLmV2ZW50OworCitpbXBvcnQgY29t
Lmd3dHBsYXRmb3JtLmRpc3BhdGNoLmFubm90YXRpb24uR2VuRXZlbnQ7CisKK0BHZW5FdmVudAor
cHVibGljIGNsYXNzIEFjdGlvbkJ1dHRvbkNsaWNrIHsKKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRl
bmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdp
bmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ZpZXcvdGFiL01haW5UYWJWaXJ0dWFsTWFjaGlu
ZVZpZXcuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4v
amF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi92aWV3L3RhYi9N
YWluVGFiVmlydHVhbE1hY2hpbmVWaWV3LmphdmEKaW5kZXggODc4OGNjNy4uMDE4ZDMxYyAxMDA2
NDQKLS0tIGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZh
L29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ZpZXcvdGFiL01haW5U
YWJWaXJ0dWFsTWFjaGluZVZpZXcuamF2YQorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVz
L3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0
aW9uL21haW4vdmlldy90YWIvTWFpblRhYlZpcnR1YWxNYWNoaW5lVmlldy5qYXZhCkBAIC0xNyw2
ICsxNyw4IEBAIGltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLnVpY29tbW9ud2ViLm1vZGVscy52
bXMuQ29uc29sZU1vZGVsOwogaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkudWljb21tb253ZWIu
bW9kZWxzLnZtcy5WbUxpc3RNb2RlbDsKIGltcG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFk
bWluLkFwcGxpY2F0aW9uQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2Vi
YWRtaW4uQXBwbGljYXRpb25SZXNvdXJjZXM7CitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS53
ZWJhZG1pbi5naW4uQ2xpZW50R2luamVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLm92aXJ0LmVu
Z2luZS51aS53ZWJhZG1pbi5wbHVnaW4uZXZlbnQuQWN0aW9uQnV0dG9uQ2xpY2tFdmVudDsKIGlt
cG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIu
dGFiLk1haW5UYWJWaXJ0dWFsTWFjaGluZVByZXNlbnRlcjsKIGltcG9ydCBvcmcub3ZpcnQuZW5n
aW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi52aWV3LkFic3RyYWN0TWFpblRhYldpdGhEZXRh
aWxzVGFibGVWaWV3OwogaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4udWljb21t
b24uUmVwb3J0QWN0aW9uc0hlbHBlcjsKQEAgLTE2Myw2ICsxNjUsMTIgQEAgcHVibGljIGNsYXNz
IE1haW5UYWJWaXJ0dWFsTWFjaGluZVZpZXcgZXh0ZW5kcyBBYnN0cmFjdE1haW5UYWJXaXRoRGV0
YWlsc1RhYmxlVmkKICAgICAgICAgICAgIHByb3RlY3RlZCBVSUNvbW1hbmQgcmVzb2x2ZUNvbW1h
bmQoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE1haW5Nb2RlbCgpLmdldE5ld1NlcnZl
ckNvbW1hbmQoKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAg
ICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKExpc3Q8Vk0+IHNlbGVjdGVkSXRlbXMpIHsKKyAg
ICAgICAgICAgICAgICBzdXBlci5vbkNsaWNrKHNlbGVjdGVkSXRlbXMpOworICAgICAgICAgICAg
ICAgIEFjdGlvbkJ1dHRvbkNsaWNrRXZlbnQuZmlyZShDbGllbnRHaW5qZWN0b3JQcm92aWRlci5p
bnN0YW5jZSgpLmdldEV2ZW50QnVzKCkpOworICAgICAgICAgICAgfQogICAgICAgICB9KTsKICAg
ICAgICAgZ2V0VGFibGUoKS5hZGRBY3Rpb25CdXR0b24obmV3IFdlYkFkbWluQnV0dG9uRGVmaW5p
dGlvbjxWTT4oY29uc3RhbnRzLm5ld0Rlc2t0b3BWbSgpKSB7CiAgICAgICAgICAgICBAT3ZlcnJp
ZGUKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21h
aW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2Vi
YWRtaW4vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAppbmRleCBhNTBmOGFhLi42MmYw
MzEyIDEwMDY0NAotLS0gYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9t
YWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl
cy93ZWJhZG1pbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0yMyw2ICsyMywx
NiBAQAogCQk8dXJsLXBhdHRlcm4+L3dlYmFkbWluL1dlYkFkbWluLmh0bWw8L3VybC1wYXR0ZXJu
PgogCTwvc2VydmxldC1tYXBwaW5nPgogCisJPHNlcnZsZXQ+CisJCTxzZXJ2bGV0LW5hbWU+UGx1
Z2luU291cmNlUGFnZTwvc2VydmxldC1uYW1lPgorCQk8c2VydmxldC1jbGFzcz5vcmcub3ZpcnQu
ZW5naW5lLnVpLmZyb250ZW5kLnNlcnZlci5nd3QuUGx1Z2luU291cmNlUGFnZVNlcnZsZXQ8L3Nl
cnZsZXQtY2xhc3M+CisJPC9zZXJ2bGV0PgorCisJPHNlcnZsZXQtbWFwcGluZz4KKwkJPHNlcnZs
ZXQtbmFtZT5QbHVnaW5Tb3VyY2VQYWdlPC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4v
d2ViYWRtaW4vUGx1Z2luU291cmNlUGFnZTwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBp
bmc+CisKIAk8IS0tIERlZmF1bHQgcGFnZSB0byBzZXJ2ZSAtLT4KIAk8d2VsY29tZS1maWxlLWxp
c3Q+CiAJCTx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotLSAKMS43LjQu
NAoK
--=_156c716f-6003-47a3-bcaa-20301ab51501--