[Engine-devel] Update on UI Plugins: PoC patch revision 4

Previously, plugin meta-data was embedded into WebAdmin host page as a sim=
Now, plugin meta-data is embedded into WebAdmin host page as a JavaScript = array, like so:<br></p><p><br></p><p style=3D"font-family: courier new,cour= ier,monaco,monospace,sans-serif;">var pluginDefinitions =3D [</p><p style= =3D"font-family: courier new,courier,monaco,monospace,sans-serif;"> {= name: "myPlugin", url: "<URL>", config: { "foo": 1, "bar": "whatever= " } },</p><p style=3D"font-family: courier new,courier,monaco,monospace,san= s-serif;"> { name: "anotherPlugin", url: "<URL>" }<br></p><p st= yle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">];</p= <p><br></p><p>As you can see, <span style=3D"font-style: italic;">pluginDe= finitions</span> is now an array of JavaScript objects, with each object re=
------=_Part_15477537_1702327251.1346339532819 Content-Type: multipart/alternative; boundary="----=_Part_15477538_89478576.1346339532819" ------=_Part_15477538_89478576.1346339532819 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Hello everyone, as a follow-up to my last email on improving plugin API, here comes the latest revision of UI Plugins proof-of-concept patch (please find it attached). This patch is focused on improving JavaScript plugin API, along with important changes and improvements made to plugin infrastructure ( PluginManager ). Let's walk through the changes step by step. Improved plugin API, taking some inspiration from jQuery Following is a sample plugin code that uses new plugin API: var myPlugin = pluginApi('myPlugin'); // Obtain plugin API instance for 'myPlugin' var myPluginConfig = myPlugin.configObject(); // Obtain plugin-specific configuration // Register event handler functions to be invoked by WebAdmin // Note: all functions are optional, the plugin only defines functions for events it wants to handle myPlugin.register({ UiInit: function() { var testUrl = 'http://www.example.com/' + myPluginConfig.foo; // Assume plugin configuration has 'foo' attribute myPlugin.ui.addMainTab('Custom Tab', 'custom-tab', testUrl); // Invoke some operation using plugin API } }); myPlugin.ready(); // Event handler functions are registered, we are now ready to get initialized (UiInit) UI plugin life-cycle, enforced by plugin infrastructure The PluginState enumeration lists possible states of a plugin during its runtime: * DEFINED : This is the initial state for all plugins. Plugin meta-data has been read by PluginManager and the corresponding iframe element has been created for the plugin. Note that at this point, the iframe element is not attached to DOM yet. * LOADING : The iframe element for the plugin has been attached to DOM, which causes plugin host page (previously known as plugin source page) to be fetched asynchronously in the background. We are now waiting for plugin to report in as ready. In practice, due to JavaScript runtime being single-threaded, WebAdmin startup logic will continue to execute until the JavaScript runtime is "idle" (browser event loop returns), and at this point JavaScript plugin code gets invoked through the plugin host page. * READY : The plugin has indicated that it is ready for use. We assume the plugin has already registered its event handler object (object containing various event handler functions to be called by WebAdmin) at this point. We can now proceed with plugin initialization. * INITIALIZED : The plugin has been initialized by calling UiInit function on its event handler object. We can now call other event handler functions, the plugin is now initialized and in use. Note on plugin initialization: the UiInit function will be called just once during the lifetime of the plugin, after the plugin reports in as ready AND WebAdmin enters the state that allows plugins to be invoked (entering main section for logged-in users), and before other event handler functions are invoked by the plugin infrastructure. Plugin meta-data is now passed to client using different format Previously, plugin meta-data was embedded into WebAdmin host page as a simple JavaScript object, like so: var pluginDefinitions = { myPlugin: "<URL>", anotherPlugin: "<URL>" } Now, plugin meta-data is embedded into WebAdmin host page as a JavaScript array, like so: var pluginDefinitions = [ { name: "myPlugin", url: "<URL>", config: { "foo": 1, "bar": "whatever" } }, { name: "anotherPlugin", url: "<URL>" } ]; As you can see, pluginDefinitions is now an array of JavaScript objects, with each object representing plugin meta-data . The "name" and "url" attributes are mandatory (we need to check them when loading plugin descriptors). "config" is the plugin configuration (JSON) object, obtained by merging default plugin configuration (defined in plugin descriptor) with custom plugin configuration (defined in external plugin configuration file) . Note that the "config" attribute is optional. In terms of Java classes, pluginDefinitions is mapped to PluginDefinitions overlay type, and each meta-data object within the array is mapped to PluginMetaData overlay type. Note on using assert statements in client code : you might notice that I'm using a lot of assert statements in Plugin class. This is to ensure consistency and guard against corrupted state during development. In GWT, assert statements work in a different way than in standard Java VM. When debugging GWT application using Development Mode, assert statements are checked and throw assertion errors during runtime (they are displayed in Development Mode console). However, when compiling GWT application to JavaScript (Production Mode), assert statements are removed by GWT compiler, so they don't affect the application running in Production Mode. Let me know what you think guys. Cheers, Vojtech ------=_Part_15477538_89478576.1346339532819 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,new york,times,serif; font-size: = 12pt; color: #000000'>Hello everyone,<br><br>as a follow-up to my last emai= l on improving plugin API, here comes the latest revision of UI Plugins pro= of-of-concept patch (please find it attached).<br><br>This patch is focused= on improving JavaScript plugin API, along with important changes and impro= vements made to plugin infrastructure (<em>PluginManager</em>). Let's walk = through the changes step by step.<br><br><hr style=3D"width: 100%; height: = 2px;"><br><strong>Improved plugin API, taking some inspiration from jQuery<= /strong><br style=3D"font-weight: bold;"><br>Following is a sample plugin c= ode that uses new plugin API:<br><br><span style=3D"font-family: courier ne= w,courier,monaco,monospace,sans-serif;">var myPlugin =3D pluginApi('myPlugi= n'); // Obtain plugin API instance for 'myPlugin'</span><br style=3D"font-f= amily: courier new,courier,monaco,monospace,sans-serif;"><span style=3D"fon= t-family: courier new,courier,monaco,monospace,sans-serif;">var myPluginCon= fig =3D myPlugin.configObject(); // Obtain plugin-specific configuration</s= pan><br style=3D"font-family: courier new,courier,monaco,monospace,sans-ser= if;"><br style=3D"font-family: courier new,courier,monaco,monospace,sans-se= rif;"><span style=3D"font-family: courier new,courier,monaco,monospace,sans= -serif;">// Register event handler functions to be invoked by WebAdmin</spa= n><br style=3D"font-family: courier new,courier,monaco,monospace,sans-serif= ;"><span style=3D"font-family: courier new,courier,monaco,monospace,sans-se= rif;">// Note: all functions are optional, the plugin only defines function= s for events it wants to handle</span><br style=3D"font-family: courier new= ,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: courier = new,courier,monaco,monospace,sans-serif;">myPlugin.register({</span><br sty= le=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span = style=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">&nb= sp; UiInit: function() {</span><br style=3D"font-family: courier new,courie= r,monaco,monospace,sans-serif;"><span style=3D"font-family: courier new,cou= rier,monaco,monospace,sans-serif;"> var testUrl =3D 'http= ://www.example.com/' + myPluginConfig.foo; // Assume plugin configuration h= as 'foo' attribute</span><br style=3D"font-family: courier new,courier,mona= co,monospace,sans-serif;"><span style=3D"font-family: courier new,courier,m= onaco,monospace,sans-serif;"> myPlugin.ui.addMainTab('Cus= tom Tab', 'custom-tab', testUrl); // Invoke some operation using plugin API= </span><br style=3D"font-family: courier new,courier,monaco,monospace,sans-= serif;"><span style=3D"font-family: courier new,courier,monaco,monospace,sa= ns-serif;"> }</span><br style=3D"font-family: courier new,courier,mon= aco,monospace,sans-serif;"><span style=3D"font-family: courier new,courier,= monaco,monospace,sans-serif;">});</span><br style=3D"font-family: courier n= ew,courier,monaco,monospace,sans-serif;"><br style=3D"font-family: courier = new,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: couri= er new,courier,monaco,monospace,sans-serif;">myPlugin.ready(); // Event han= dler functions are registered, we are now ready to get initialized (UiInit)= </span><br style=3D"font-family: courier new,courier,monaco,monospace,sans-= serif;"><br><hr style=3D"width: 100%; height: 2px;"><br><span style=3D"font= -weight: bold;">UI plugin life-cycle, enforced by plugin infrastructure</sp= an><br style=3D"font-weight: bold;"><br>The <span style=3D"font-style: ital= ic;">PluginState</span> enumeration lists possible states of a plugin durin= g its runtime:<br><ul><li><span style=3D"font-weight: bold;">DEFINED</span>= : This is the initial state for all plugins. Plugin meta-data has been read= by <span style=3D"font-style: italic;">PluginManager</span> and the corres= ponding iframe element has been created for the plugin. Note that at this p= oint, the iframe element is not attached to DOM yet.<br><br></li><li><span = style=3D"font-weight: bold;">LOADING</span>: The iframe element for the plu= gin has been attached to DOM, which causes <u>plugin host page</u> (previou= sly known as plugin source page) to be fetched asynchronously in the backgr= ound. We are now waiting for plugin to report in as ready. In practice, due= to JavaScript runtime being single-threaded, WebAdmin startup logic will c= ontinue to execute until the JavaScript runtime is "idle" (browser event lo= op returns), and at this point JavaScript plugin code gets invoked through = the plugin host page.<br><br></li><li><span style=3D"font-weight: bold;">RE= ADY</span>: The plugin has indicated that it is ready for use. We assume th= e plugin has already registered its event handler object (object containing= various event handler functions to be called by WebAdmin) at this point. W= e can now proceed with plugin initialization.<br><br></li><li><span style= =3D"font-weight: bold;">INITIALIZED</span>: The plugin has been initialized= by calling <span style=3D"font-style: italic;">UiInit</span> function on i= ts event handler object. We can now call other event handler functions, the= plugin is now initialized and in use.</li></ul><p><span style=3D"font-styl= e: italic; text-decoration: underline;">Note on plugin initialization:</spa= n> the <span style=3D"font-style: italic;">UiInit</span> function will be c= alled just once during the lifetime of the plugin, after the plugin reports= in as ready AND WebAdmin enters the state that allows plugins to be invoke= d (entering main section for logged-in users), and before other event handl= er functions are invoked by the plugin infrastructure.</p><p><br></p><hr st= yle=3D"width: 100%; height: 2px;"><br><p style=3D"font-weight: bold;">Plugi= n meta-data is now passed to client using different format</p><p><br></p><p= ple JavaScript object, like so:</p><p><br></p><p style=3D"font-family: cour= ier new,courier,monaco,monospace,sans-serif;">var pluginDefinitions =3D { m= yPlugin: "<URL>", anotherPlugin: "<URL>" }<br></p><p><br></p><p= presenting plugin meta-data. The "name" and "url" attributes are mandatory = (we need to check them when loading plugin descriptors). "config" is the pl= ugin configuration (JSON) object, obtained by merging default plugin config= uration (defined in plugin descriptor) with custom plugin configuration (de= fined in external plugin configuration file). Note that the "config" attrib= ute is optional.<br></p><p><br></p><p>In terms of Java classes, <span style= =3D"font-style: italic;">pluginDefinitions</span> is mapped to <span style= =3D"font-style: italic;">PluginDefinitions</span> overlay type, and each me= ta-data object within the array is mapped to <span style=3D"font-style: ita= lic;">PluginMetaData</span> overlay type.<br></p><p><br></p><hr style=3D"wi= dth: 100%; height: 2px;"><br><p><span style=3D"font-style: italic; text-dec= oration: underline;">Note on using assert statements in client code:</span>= you might notice that I'm using a lot of assert statements in <span style= =3D"font-style: italic;">Plugin</span> class. This is to ensure consistency= and guard against corrupted state during development. In GWT, assert state= ments work in a different way than in standard Java VM. When debugging GWT = application using Development Mode, assert statements are checked and throw= assertion errors during runtime (they are displayed in Development Mode co= nsole). However, when compiling GWT application to JavaScript (Production M= ode), assert statements are removed by GWT compiler, so they don't affect t= he application running in Production Mode.<br></p><p><br></p><p>Let me know= what you think guys.<br></p><p><br></p><p>Cheers,</p><p>Vojtech</p><p><br>= </p><p></p></div></body></html> ------=_Part_15477538_89478576.1346339532819-- ------=_Part_15477537_1702327251.1346339532819 Content-Type: text/x-patch; name=WIP-UI-Plugins-PoC-revision-4.patch Content-Disposition: attachment; filename=WIP-UI-Plugins-PoC-revision-4.patch Content-Transfer-Encoding: base64 RnJvbSBlYjQ3NzlkYTZjODUxMmIwNjA3Mzk5ZTg4MzAwMWQxYmUwMzA1OGI4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBWb2p0ZWNoIFN6b2NzIDx2c3pvY3NAcmVkaGF0LmNvbT4KRGF0 ZTogVGh1LCAxOSBKdWwgMjAxMiAxNDo0ODo0MCArMDIwMApTdWJqZWN0OiBbUEFUQ0hdIFdJUDog VUkgUGx1Z2lucyBQb0MsIHJldmlzaW9uIDQKCkNoYW5nZS1JZDogSWJiZjc2NTlmMDIzZDg5Mjlm YjBhODMwMzA2MTg1MWJiN2VlNTU1YmMKU2lnbmVkLW9mZi1ieTogVm9qdGVjaCBTem9jcyA8dnN6 b2NzQHJlZGhhdC5jb20+Ci0tLQogLi4uL3NlcnZlci9nd3QvR3d0RHluYW1pY0hvc3RQYWdlU2Vy dmxldC5qYXZhICAgICAgfCAgICAxICsKIC4uLi9zZXJ2ZXIvZ3d0L1BsdWdpblNvdXJjZVBhZ2VT ZXJ2bGV0LmphdmEgICAgICAgIHwgIDEwNiArKysrKysrCiAuLi4vc2VydmVyL2d3dC9XZWJhZG1p bkR5bmFtaWNIb3N0aW5nU2VydmxldC5qYXZhICB8ICAgIDggKy0KIC4uLi9lbmdpbmUvdWkvd2Vi YWRtaW4vZ2luL0NsaWVudEdpbmplY3Rvci5qYXZhICAgIHwgICAgMiArLQogLi4uL292aXJ0L2Vu Z2luZS91aS93ZWJhZG1pbi9naW4vUGx1Z2luTW9kdWxlLmphdmEgfCAgIDMwICsrCiAuLi4vb3Zp cnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW4uamF2YSAgICB8ICAgNjcgKysrKysK IC4uLi91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRGVmaW5pdGlvbnMuamF2YSAgICAgIHwgICAy NCArKwogLi4uL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVudEhhbmRsZXIuamF2YSAgICAg fCAgIDE5ICsrCiAuLi4vZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5NYW5hZ2VyLmph dmEgICB8ICAyOTEgKysrKysrKysrKysrKysrKysrKysKIC4uLi9lbmdpbmUvdWkvd2ViYWRtaW4v cGx1Z2luL1BsdWdpbk1ldGFEYXRhLmphdmEgIHwgICAzNiArKysKIC4uLi9lbmdpbmUvdWkvd2Vi YWRtaW4vcGx1Z2luL1BsdWdpblN0YXRlLmphdmEgICAgIHwgICAzMyArKysKIC4uLi91aS93ZWJh ZG1pbi9wbHVnaW4vUGx1Z2luVWlGdW5jdGlvbnMuamF2YSAgICAgIHwgICAyNiArKwogLi4uL21h aW4vcHJlc2VudGVyL01haW5TZWN0aW9uUHJlc2VudGVyLmphdmEgICAgICAgfCAgIDE3ICstCiAu Li4vbWFpbi9wcmVzZW50ZXIvTWFpblRhYlBhbmVsUHJlc2VudGVyLmphdmEgICAgICB8ICAgMTAg KwogLi4uL21haW4vcHJlc2VudGVyL3RhYi9NYWluVGFiQ3VzdG9tUHJlc2VudGVyLmphdmEgfCAg IDQzICsrKwogLi4uL3RhYi9NYWluVGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIuamF2YSAgICAg ICAgfCAgIDQ3ICsrKysKIC4uLi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByb3h5 LmphdmEgICAgIHwgICA0NSArKysKIC4uLi9wcmVzZW50ZXIvdGFiL01haW5UYWJDdXN0b21Qcm94 eUZhY3RvcnkuamF2YSAgIHwgICAzNCArKysKIC4uLi9zZWN0aW9uL21haW4vdmlldy90YWIvTWFp blRhYkN1c3RvbVZpZXcuamF2YSAgIHwgICAzMiArKysKIC4uLi9zZWN0aW9uL21haW4vdmlldy90 YWIvTWFpblRhYkN1c3RvbVZpZXcudWkueG1sIHwgICAxMCArCiAuLi4vd2ViYWRtaW4vc3JjL21h aW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCAgICAgICB8ICAgMTAgKwogMjEgZmlsZXMgY2hhbmdl ZCwgODg3IGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQg ZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmly dC9lbmdpbmUvdWkvZnJvbnRlbmQvc2VydmVyL2d3dC9QbHVnaW5Tb3VyY2VQYWdlU2VydmxldC5q YXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1p bi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vZ2luL1BsdWdpbk1v ZHVsZS5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93 ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2lu L1BsdWdpbi5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl cy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1 Z2luL1BsdWdpbkRlZmluaXRpb25zLmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93 ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91 aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRXZlbnRIYW5kbGVyLmphdmEKIGNyZWF0ZSBtb2RlIDEw MDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3Jn L292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luTWFuYWdlci5qYXZhCiBjcmVh dGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFp bi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbk1ldGFEYXRh LmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFk bWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1 Z2luU3RhdGUuamF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWluL21vZHVs ZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3Bs dWdpbi9QbHVnaW5VaUZ1bmN0aW9ucy5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQv d2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUv dWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNl bnRlci5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93 ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlv bi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNlbnRlclByb3ZpZGVyLmphdmEK IGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3Ny Yy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJl c2VudGVyL3RhYi9NYWluVGFiQ3VzdG9tUHJveHkuamF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZy b250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQv ZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvdGFiL01haW5UYWJDdXN0 b21Qcm94eUZhY3RvcnkuamF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWlu L21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFk bWluL3NlY3Rpb24vbWFpbi92aWV3L3RhYi9NYWluVGFiQ3VzdG9tVmlldy5qYXZhCiBjcmVhdGUg bW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9q YXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ZpZXcvdGFiL01h aW5UYWJDdXN0b21WaWV3LnVpLnhtbAoKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21v ZHVsZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5k L3NlcnZlci9nd3QvR3d0RHluYW1pY0hvc3RQYWdlU2VydmxldC5qYXZhIGIvZnJvbnRlbmQvd2Vi YWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkv ZnJvbnRlbmQvc2VydmVyL2d3dC9Hd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0LmphdmEKaW5kZXgg ZjE5NzM5YS4uNjg1ZTY4NSAxMDA2NDQKLS0tIGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9m cm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJvbnRlbmQvc2VydmVy L2d3dC9Hd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0LmphdmEKKysrIGIvZnJvbnRlbmQvd2ViYWRt aW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJv bnRlbmQvc2VydmVyL2d3dC9Hd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0LmphdmEKQEAgLTQ2LDYg KzQ2LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIEd3dER5bmFtaWNIb3N0UGFnZVNlcnZsZXQg ZXh0ZW5kcyBIdHRwU2VydmxldCB7CiAgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZs ZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJ T0V4Y2VwdGlvbiB7CiAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdy aXRlcigpOwogICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sOyBjaGFy c2V0PVVURi04Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJD YWNoZS1Db250cm9sIiwgIm5vLWNhY2hlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAog CiAgICAgICAgIHdyaXRlci5hcHBlbmQoIjwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPiIpOyAv LyROT04tTkxTLTEkCiAgICAgICAgIHdyaXRlci5hcHBlbmQoIjxtZXRhIGh0dHAtZXF1aXY9XCJj b250ZW50LXR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XCI+Iik7IC8v JE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvZnJvbnRl bmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZlci9nd3Qv UGx1Z2luU291cmNlUGFnZVNlcnZsZXQuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv ZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZl ci9nd3QvUGx1Z2luU291cmNlUGFnZVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwLi4xNTlmYWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRt aW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJv bnRlbmQvc2VydmVyL2d3dC9QbHVnaW5Tb3VyY2VQYWdlU2VydmxldC5qYXZhCkBAIC0wLDAgKzEs MTA2IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkuZnJvbnRlbmQuc2VydmVyLmd3dDsK KworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJl ZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRT dHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0 U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0 IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRp bC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0 Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0 UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsK KworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBh Y2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIFJlbmRlcnMgdGhlIEhU TUwgc291cmNlIHBhZ2UgZm9yIHRoZSBnaXZlbiBVSSBwbHVnaW4uCisgKi8KK3B1YmxpYyBjbGFz cyBQbHVnaW5Tb3VyY2VQYWdlU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHBy aXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgcHJp dmF0ZSBzdGF0aWMgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBsdWdpblNvdXJjZVBh Z2VTZXJ2bGV0LmNsYXNzKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRv R2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3Bv bnNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBSZWFkIHBsdWdpbiBuYW1lIGFz IEhUVFAgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgICAgICAgU3RyaW5nIHBsdWdpbk5hbWUgPSByZXF1 ZXN0LmdldFBhcmFtZXRlcigicGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgaWYgKHBs dWdpbk5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJNaXNzaW5nIHBs dWdpbiBuYW1lIHJlcXVlc3QgcGFyYW1ldGVyIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAg IHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsK KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvY2F0ZSBwbHVn aW4gY29kZSBpbiBsb2NhbCBmaWxlIHN5c3RlbQorICAgICAgICAvLyBUT0RPIGhhcmQtY29kZWQg cGx1Z2luIGxvY2F0aW9uCisgICAgICAgIEZpbGUgcGx1Z2luQ29kZUxvY2F0aW9uID0gbmV3IEZp bGUoIi9ob21lL3Zzem9jcy9Eb3dubG9hZHMiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBGaWxl IHBsdWdpbkNvZGVGaWxlID0gbmV3IEZpbGUocGx1Z2luQ29kZUxvY2F0aW9uLCBwbHVnaW5OYW1l ICsgIi5qcyIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIGlmICghcGx1Z2luQ29kZUZpbGUuaXNG aWxlKCkgfHwgIXBsdWdpbkNvZGVGaWxlLmNhblJlYWQoKSkgeworICAgICAgICAgICAgbG9nZ2Vy LmVycm9yKCJDYW5ub3QgcmVhZCBwbHVnaW4gY29kZTogIiArIHBsdWdpbkNvZGVGaWxlLmdldEFi c29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVy cm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgICAgIHJldHVy bjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE8gc2ltdWxhdGUgcGx1Z2luIGRlcGVuZGVu Y2llcworICAgICAgICBMaXN0PFN0cmluZz4gcGx1Z2luRGVwZW5kZW5jeUxpc3QgPQorICAgICAg ICAgICAgICAgIEFycmF5cy5hc0xpc3QoImh0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4 L2xpYnMvanF1ZXJ5LzEuNy4yL2pxdWVyeS5taW4uanMiKTsgLy8kTk9OLU5MUy0xJAorCisgICAg ICAgIC8vIFJlbmRlciBIVE1MIHNvdXJjZSBwYWdlIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgcmVz cG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIpOyAvLyROT04t TkxTLTEkCisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsICJuby1j YWNoZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworICAgICAgICBSZWFkZXIgaW4g PSBudWxsOworICAgICAgICBXcml0ZXIgb3V0ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAg ICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG5l dyBGaWxlSW5wdXRTdHJlYW0ocGx1Z2luQ29kZUZpbGUpLCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMt MSQKKyAgICAgICAgICAgIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFt V3JpdGVyKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMt MSQKKworICAgICAgICAgICAgcmVuZGVyUGx1Z2luU291cmNlUGFnZShpbiwgcGx1Z2luRGVwZW5k ZW5jeUxpc3QsIG91dCk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgfSBmaW5h bGx5IHsKKyAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW4u Y2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVu ZGVyUGx1Z2luU291cmNlUGFnZShSZWFkZXIgcGx1Z2luQ29kZUlucHV0LCBMaXN0PFN0cmluZz4g cGx1Z2luRGVwZW5kZW5jeUxpc3QsIFdyaXRlciBvdXRwdXQpCisgICAgICAgICAgICB0aHJvd3Mg SU9FeGNlcHRpb24geworICAgICAgICBvdXRwdXQud3JpdGUoIjwhRE9DVFlQRSBodG1sPjxodG1s PjxoZWFkPiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIG91dHB1dC53cml0ZSgiPG1ldGEgaHR0 cC1lcXVpdj1cImNvbnRlbnQtdHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRG LThcIj4iKTsgLy8kTk9OLU5MUy0xJAorCisgICAgICAgIGZvciAoU3RyaW5nIGRlcGVuZGVuY3kg OiBwbHVnaW5EZXBlbmRlbmN5TGlzdCkgeworICAgICAgICAgICAgb3V0cHV0LndyaXRlKCI8c2Ny aXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCIiKTsgLy8kTk9OLU5MUy0xJAorICAg ICAgICAgICAgb3V0cHV0LndyaXRlKGRlcGVuZGVuY3kpOworICAgICAgICAgICAgb3V0cHV0Lndy aXRlKCJcIj48L3NjcmlwdD4iKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisKKyAgICAgICAg b3V0cHV0LndyaXRlKCI8L2hlYWQ+PGJvZHk+Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgb3V0 cHV0LndyaXRlKCI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj4iKTsgLy8kTk9OLU5M Uy0xJAorICAgICAgICBvdXRwdXQud3JpdGUoIihmdW5jdGlvbiggcGx1Z2luQXBpICkgeyIpOyAv LyROT04tTkxTLTEkCisKKyAgICAgICAgY29weUNoYXJzKHBsdWdpbkNvZGVJbnB1dCwgb3V0cHV0 KTsKKworICAgICAgICBvdXRwdXQud3JpdGUoIn0pICggcGFyZW50LnBsdWdpbkFwaSApOyIpOyAv LyROT04tTkxTLTEkCisgICAgICAgIG91dHB1dC53cml0ZSgiPC9zY3JpcHQ+Iik7IC8vJE5PTi1O TFMtMSQKKyAgICAgICAgb3V0cHV0LndyaXRlKCI8L2JvZHk+PC9odG1sPiIpOyAvLyROT04tTkxT LTEkCisgICAgfQorCisgICAgdm9pZCBjb3B5Q2hhcnMoUmVhZGVyIGluLCBXcml0ZXIgb3V0KSB0 aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbNCAq IDEwMjRdOyAvLyBVc2UgNCBrQiBidWZmZXIKKyAgICAgICAgaW50IG51bVJlYWQgPSAwOworCisg ICAgICAgIHdoaWxlICgobnVtUmVhZCA9IGluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3Ro KSkgPiAwKSB7CisgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBudW1SZWFkKTsKKyAg ICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl cy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJvbnRlbmQvc2Vy dmVyL2d3dC9XZWJhZG1pbkR5bmFtaWNIb3N0aW5nU2VydmxldC5qYXZhIGIvZnJvbnRlbmQvd2Vi YWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkv ZnJvbnRlbmQvc2VydmVyL2d3dC9XZWJhZG1pbkR5bmFtaWNIb3N0aW5nU2VydmxldC5qYXZhCmlu ZGV4IDQyOGRjYzUuLjY4M2NiNjggMTAwNjQ0Ci0tLSBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVs ZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3Nl cnZlci9nd3QvV2ViYWRtaW5EeW5hbWljSG9zdGluZ1NlcnZsZXQuamF2YQorKysgYi9mcm9udGVu ZC93ZWJhZG1pbi9tb2R1bGVzL2Zyb250ZW5kL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2lu ZS91aS9mcm9udGVuZC9zZXJ2ZXIvZ3d0L1dlYmFkbWluRHluYW1pY0hvc3RpbmdTZXJ2bGV0Lmph dmEKQEAgLTMwLDE4ICszMCwyMiBAQCBwdWJsaWMgY2xhc3MgV2ViYWRtaW5EeW5hbWljSG9zdGlu Z1NlcnZsZXQgZXh0ZW5kcyBHd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0IHsKICAgICAgICAgc3Vw ZXIud3JpdGVBZGRpdGlvbmFsSnNEYXRhKHJlcXVlc3QsIHdyaXRlcik7CiAKICAgICAgICAgSW50 ZWdlciBhcHBsaWNhdGlvbk1vZGUgPSBnZXRBcHBsaWNhdGlvbk1vZGUocmVxdWVzdCk7Ci0KICAg ICAgICAgaWYgKGFwcGxpY2F0aW9uTW9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBNYXA8U3Ry aW5nLCBTdHJpbmc+IGFwcE1vZGVEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7 CiAgICAgICAgICAgICBhcHBNb2RlRGF0YS5wdXQoInZhbHVlIiwgU3RyaW5nLnZhbHVlT2YoYXBw bGljYXRpb25Nb2RlKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIHdyaXRlSnNPYmplY3Qo d3JpdGVyLCAiYXBwbGljYXRpb25Nb2RlIiwgYXBwTW9kZURhdGEpOyAvLyROT04tTkxTLTEkCiAg ICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWlsZGVyIHBsdWdpbkRlZmluaXRpb25zID0gbmV3 IFN0cmluZ0J1aWxkZXIoIiB2YXIgcGx1Z2luRGVmaW5pdGlvbnMgPSBbICIpOyAvLyROT04tTkxT LTEkCisgICAgICAgIHBsdWdpbkRlZmluaXRpb25zLmFwcGVuZCgieyBuYW1lOiBcIm15UGx1Z2lu XCIsIHVybDogXCIvd2ViYWRtaW4vd2ViYWRtaW4vUGx1Z2luU291cmNlUGFnZT9wbHVnaW49bXlQ bHVnaW5cIiwgY29uZmlnOiB7IFwiZm9vXCI6IDEgfSB9Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAg ICAgcGx1Z2luRGVmaW5pdGlvbnMuYXBwZW5kKCIgXTsgIik7IC8vJE5PTi1OTFMtMSQKKyAgICAg ICAgd3JpdGVyLmFwcGVuZChwbHVnaW5EZWZpbml0aW9ucy50b1N0cmluZygpKTsKICAgICB9CiAK ICAgICBwcml2YXRlIEludGVnZXIgZ2V0QXBwbGljYXRpb25Nb2RlKEh0dHBTZXJ2bGV0UmVxdWVz dCByZXF1ZXN0KSB7CiAgICAgICAgIHJldHVybiAoSW50ZWdlcikgcnVuUHVibGljUXVlcnkoVmRj UXVlcnlUeXBlLkdldENvbmZpZ3VyYXRpb25WYWx1ZSwKICAgICAgICAgICAgICAgICBuZXcgR2V0 Q29uZmlndXJhdGlvblZhbHVlUGFyYW1ldGVycyhDb25maWd1cmF0aW9uVmFsdWVzLkFwcGxpY2F0 aW9uTW9kZSwKLSAgICAgICAgICAgICAgICBDb25maWcuRGVmYXVsdENvbmZpZ3VyYXRpb25WZXJz aW9uKSwgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuRGVmYXVsdENv bmZpZ3VyYXRpb25WZXJzaW9uKSwgcmVxdWVzdCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9m cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0 L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vQ2xpZW50R2luamVjdG9yLmphdmEgYi9mcm9udGVuZC93 ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91 aS93ZWJhZG1pbi9naW4vQ2xpZW50R2luamVjdG9yLmphdmEKaW5kZXggZDI3MmMyYi4uYmFiZGRm MSAxMDA2NDQKLS0tIGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFp bi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vZ2luL0NsaWVudEdpbmplY3Rvci5q YXZhCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2 YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL2dpbi9DbGllbnRHaW5qZWN0b3IuamF2YQpA QCAtOSw3ICs5LDcgQEAgaW1wb3J0IGNvbS5nd3RwbGF0Zm9ybS5tdnAuY2xpZW50LmFubm90YXRp b25zLkRlZmF1bHRHYXRla2VlcGVyOwogLyoqCiAgKiBDbGllbnQtc2lkZSBpbmplY3RvciBjb25m aWd1cmF0aW9uIHVzZWQgdG8gYm9vdHN0cmFwIEdJTi4KICAqLwotQEdpbk1vZHVsZXMoeyBTeXN0 ZW1Nb2R1bGUuY2xhc3MsIFByZXNlbnRlck1vZHVsZS5jbGFzcywgVWlDb21tb25Nb2R1bGUuY2xh c3MgfSkKK0BHaW5Nb2R1bGVzKHsgU3lzdGVtTW9kdWxlLmNsYXNzLCBQcmVzZW50ZXJNb2R1bGUu Y2xhc3MsIFVpQ29tbW9uTW9kdWxlLmNsYXNzLCBQbHVnaW5Nb2R1bGUuY2xhc3MgfSkKIHB1Ymxp YyBpbnRlcmZhY2UgQ2xpZW50R2luamVjdG9yIGV4dGVuZHMgQmFzZUNsaWVudEdpbmplY3Rvciwg TWFuYWdlZENvbXBvbmVudHMgewogCiAgICAgQERlZmF1bHRHYXRla2VlcGVyCmRpZmYgLS1naXQg YS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292 aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vUGx1Z2luTW9kdWxlLmphdmEgYi9mcm9udGVuZC93 ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91 aS93ZWJhZG1pbi9naW4vUGx1Z2luTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMC4uMzU4NDRjMAotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWlu L21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFk bWluL2dpbi9QbHVnaW5Nb2R1bGUuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIG9yZy5v dmlydC5lbmdpbmUudWkud2ViYWRtaW4uZ2luOworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51 aS53ZWJhZG1pbi5wbHVnaW4uUGx1Z2luRXZlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLlBsdWdpbk1hbmFnZXI7CitpbXBvcnQgb3JnLm92aXJ0 LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW4uUGx1Z2luVWlGdW5jdGlvbnM7CitpbXBvcnQgb3Jn Lm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zZWN0aW9uLm1haW4ucHJlc2VudGVyLnRhYi5NYWlu VGFiQ3VzdG9tUHJlc2VudGVyOworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4u c2VjdGlvbi5tYWluLnByZXNlbnRlci50YWIuTWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeTsKK2lt cG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi52aWV3LnRhYi5N YWluVGFiQ3VzdG9tVmlldzsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmluamVjdC5jbGllbnQu QWJzdHJhY3RHaW5Nb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwor CisvKioKKyAqIEdJTiBtb2R1bGUgY29udGFpbmluZyBXZWJBZG1pbiBVSSBwbHVnaW4gaW5mcmFz dHJ1Y3R1cmUgYmluZGluZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBQbHVnaW5Nb2R1bGUgZXh0ZW5k cyBBYnN0cmFjdEdpbk1vZHVsZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9p ZCBjb25maWd1cmUoKSB7CisgICAgICAgIGJpbmQoUGx1Z2luTWFuYWdlci5jbGFzcykuYXNFYWdl clNpbmdsZXRvbigpOworICAgICAgICBiaW5kKFBsdWdpbkV2ZW50SGFuZGxlci5jbGFzcykuYXNF YWdlclNpbmdsZXRvbigpOworICAgICAgICBiaW5kKFBsdWdpblVpRnVuY3Rpb25zLmNsYXNzKS5p bihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgIC8vIEJpbmQgTWFpblRhYkN1c3RvbVZpZXcg dG8gaXRzIHZpZXcgaW50ZXJmYWNlIGFzIG5vbi1zaW5nbGV0b24sIHdpdGhvdXQgcHJlc2VudGVy IGJpbmRpbmcKKyAgICAgICAgLy8gKE1haW5UYWJDdXN0b21QcmVzZW50ZXIgaXMgY3JlYXRlZCBt YW51YWxseSBkdXJpbmcgcnVudGltZSBieSBNYWluVGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIp CisgICAgICAgIGJpbmQoTWFpblRhYkN1c3RvbVByZXNlbnRlci5WaWV3RGVmLmNsYXNzKS50byhN YWluVGFiQ3VzdG9tVmlldy5jbGFzcyk7CisgICAgICAgIGJpbmQoTWFpblRhYkN1c3RvbVByb3h5 RmFjdG9yeS5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICB9CisKK30KZGlmZiAtLWdp dCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcv b3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW4uamF2YSBiL2Zyb250ZW5kL3dl YmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Vp L3dlYmFkbWluL3BsdWdpbi9QbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi41NjI0YjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9k dWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4v cGx1Z2luL1BsdWdpbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2Ugb3JnLm92aXJ0LmVu Z2luZS51aS53ZWJhZG1pbi5wbHVnaW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNs aWVudC5KYXZhU2NyaXB0T2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQu SUZyYW1lRWxlbWVudDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgVUkgcGx1Z2luLCBjb250YWlu aW5nIG1ldGEtZGF0YSBhcyB3ZWxsIGFzIHJ1bnRpbWUgc3RhdGUuCisgKi8KK3B1YmxpYyBjbGFz cyBQbHVnaW4geworCisgICAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5NZXRhRGF0YSBtZXRhRGF0YTsK KyAgICBwcml2YXRlIFBsdWdpblN0YXRlIHN0YXRlOworCisgICAgLy8gVGhlIGlmcmFtZSBlbGVt ZW50IHVzZWQgdG8gbG9hZCB0aGUgcGx1Z2luIGhvc3QgcGFnZQorICAgIHByaXZhdGUgZmluYWwg SUZyYW1lRWxlbWVudCBpZnJhbWU7CisKKyAgICAvLyBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgcGx1 Z2luIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zCisgICAgcHJpdmF0ZSBKYXZhU2NyaXB0T2JqZWN0 IGV2ZW50SGFuZGxlck9iamVjdDsKKworICAgIHB1YmxpYyBQbHVnaW4oUGx1Z2luTWV0YURhdGEg bWV0YURhdGEsIElGcmFtZUVsZW1lbnQgaWZyYW1lKSB7CisgICAgICAgIGFzc2VydCBtZXRhRGF0 YSAhPSBudWxsIDogIlBsdWdpbiBtZXRhLWRhdGEgY2Fubm90IGJlIG51bGwiOyAvLyROT04tTkxT LTEkCisgICAgICAgIGFzc2VydCBpZnJhbWUgIT0gbnVsbCA6ICJQbHVnaW4gaWZyYW1lIGVsZW1l bnQgY2Fubm90IGJlIG51bGwiOyAvLyROT04tTkxTLTEkCisgICAgICAgIGFzc2VydCBpZnJhbWUu Z2V0UGFyZW50RWxlbWVudCgpID09IG51bGwgOiAiUGx1Z2luIGlmcmFtZSBlbGVtZW50IG11c3Qg YmUgZGV0YWNoZWQgZnJvbSBET00iOyAvLyROT04tTkxTLTEkCisgICAgICAgIHRoaXMubWV0YURh dGEgPSBtZXRhRGF0YTsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IFBsdWdpblN0YXRlLkRFRklORUQ7 CisgICAgICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lOworICAgIH0KKworICAgIHB1YmxpYyBQbHVn aW5NZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFEYXRhOworICAg IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5TdGF0ZShQbHVnaW5TdGF0ZSBzdGF0ZSkgewor ICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PSBzdGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMg dm9pZCBtYXJrQXNMb2FkaW5nKCkgeworICAgICAgICBhc3NlcnQgc3RhdGUgPT0gUGx1Z2luU3Rh dGUuREVGSU5FRCA6ICJVbmV4cGVjdGVkIHN0YXRlIHRyYW5zaXRpb24iOyAvLyROT04tTkxTLTEk CisgICAgICAgIGFzc2VydCBpZnJhbWUuZ2V0UGFyZW50RWxlbWVudCgpICE9IG51bGwgOiAiUGx1 Z2luIGlmcmFtZSBlbGVtZW50IG11c3QgYmUgYXR0YWNoZWQgdG8gRE9NIjsgLy8kTk9OLU5MUy0x JAorICAgICAgICBzdGF0ZSA9IFBsdWdpblN0YXRlLkxPQURJTkc7CisgICAgfQorCisgICAgcHVi bGljIHZvaWQgbWFya0FzUmVhZHkoKSB7CisgICAgICAgIGFzc2VydCBzdGF0ZSA9PSBQbHVnaW5T dGF0ZS5MT0FESU5HIDogIlVuZXhwZWN0ZWQgc3RhdGUgdHJhbnNpdGlvbiI7IC8vJE5PTi1OTFMt MSQKKyAgICAgICAgYXNzZXJ0IGV2ZW50SGFuZGxlck9iamVjdCAhPSBudWxsIDogIkV2ZW50IGhh bmRsZXIgb2JqZWN0IG11c3QgYmUgYXNzaWduZWQiOyAvLyROT04tTkxTLTEkCisgICAgICAgIHN0 YXRlID0gUGx1Z2luU3RhdGUuUkVBRFk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFya0Fz SW5pdGlhbGl6ZWQoKSB7CisgICAgICAgIGFzc2VydCBzdGF0ZSA9PSBQbHVnaW5TdGF0ZS5SRUFE WSA6ICJVbmV4cGVjdGVkIHN0YXRlIHRyYW5zaXRpb24iOyAvLyROT04tTkxTLTEkCisgICAgICAg IHN0YXRlID0gUGx1Z2luU3RhdGUuSU5JVElBTElaRUQ7CisgICAgfQorCisgICAgcHVibGljIElG cmFtZUVsZW1lbnQgZ2V0SUZyYW1lRWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGlmcmFtZTsK KyAgICB9CisKKyAgICBwdWJsaWMgSmF2YVNjcmlwdE9iamVjdCBnZXRFdmVudEhhbmRsZXJPYmpl Y3QoKSB7CisgICAgICAgIHJldHVybiBldmVudEhhbmRsZXJPYmplY3Q7CisgICAgfQorCisgICAg cHVibGljIHZvaWQgc2V0RXZlbnRIYW5kbGVyT2JqZWN0KEphdmFTY3JpcHRPYmplY3QgZXZlbnRI YW5kbGVyT2JqZWN0KSB7CisgICAgICAgIGFzc2VydCBldmVudEhhbmRsZXJPYmplY3QgIT0gbnVs bCA6ICJFdmVudCBoYW5kbGVyIG9iamVjdCBjYW5ub3QgYmUgbnVsbCI7IC8vJE5PTi1OTFMtMSQK KyAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJPYmplY3QgPSBldmVudEhhbmRsZXJPYmplY3Q7Cisg ICAgfQorCit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWlu L3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2lu RGVmaW5pdGlvbnMuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3Jj L21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5EZWZp bml0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYzhkOTgK LS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3Ny Yy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRGVm aW5pdGlvbnMuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUu dWkud2ViYWRtaW4ucGx1Z2luOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQu SmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0Fy cmF5OworCisvKioKKyAqIE92ZXJsYXkgdHlwZSBmb3Ige0Bjb2RlIHBsdWdpbkRlZmluaXRpb25z fSBnbG9iYWwgSlMgb2JqZWN0LgorICogPHA+CisgKiBTZXJ2ZXMgYXMge0BsaW5rIFBsdWdpbk1l dGFEYXRhfSBhZ2dyZWdhdGUgb2JqZWN0ICh1c2luZyBuYXRpdmUgYXJyYXkgcmVwcmVzZW50YXRp b24pLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGx1Z2luRGVmaW5pdGlvbnMgZXh0ZW5kcyBK YXZhU2NyaXB0T2JqZWN0IHsKKworICAgIHByb3RlY3RlZCBQbHVnaW5EZWZpbml0aW9ucygpIHsK KyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBQbHVnaW5EZWZpbml0aW9ucyBpbnN0 YW5jZSgpIC8qLXsKKyAgICAgICAgcmV0dXJuICR3bmQucGx1Z2luRGVmaW5pdGlvbnM7CisgICAg fS0qLzsKKworICAgIHB1YmxpYyBuYXRpdmUgSnNBcnJheTxQbHVnaW5NZXRhRGF0YT4gZ2V0TWV0 YURhdGFBcnJheSgpICAvKi17CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0tKi87CisKK30K ZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4v amF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVudEhhbmRs ZXIuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2 YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVudEhhbmRsZXIu amF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjVmYzc1Ci0tLSAvZGV2 L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9q YXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkV2ZW50SGFuZGxl ci5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJh ZG1pbi5wbHVnaW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuRXZlbnRC dXM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIEhhbmRsZXMg V2ViQWRtaW4gYXBwbGljYXRpb24gZXZlbnRzIChleHRlbnNpb24gcG9pbnRzKSB0byBiZSBjb25z dW1lZCBieSBVSSBwbHVnaW5zLgorICogPHA+CisgKiBTaG91bGQgYmUgYm91bmQgYXMgR0lOIGVh Z2VyIHNpbmdsZXRvbiwgY3JlYXRlZCBlYXJseSBvbiBkdXJpbmcgYXBwbGljYXRpb24gc3RhcnR1 cC4KKyAqLworcHVibGljIGNsYXNzIFBsdWdpbkV2ZW50SGFuZGxlciB7CisKKyAgICBASW5qZWN0 CisgICAgcHVibGljIFBsdWdpbkV2ZW50SGFuZGxlcihFdmVudEJ1cyBldmVudEJ1cywgUGx1Z2lu TWFuYWdlciBtYW5hZ2VyKSB7CisgICAgICAgIC8vIFRPRE8gY2FsbCBFdmVudEJ1cy5hZGRIYW5k bGVyIGZvciBlYWNoIGV4dGVuc2lvbiBwb2ludCAoZXZlbnQpLAorICAgICAgICAvLyB3aXRoIHRo ZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uIHVzaW5nIFBsdWdpbk1hbmFnZXIgdG8gY2FsbCBwbHVn aW5zCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dl YmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4v UGx1Z2luTWFuYWdlci5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9z cmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbk1h bmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmIzZTM0Ci0t LSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMv bWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbk1hbmFn ZXIuamF2YQpAQCAtMCwwICsxLDI5MSBAQAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLndl YmFkbWluLnBsdWdpbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGph dmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGls LmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2 YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5 OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQuRG9jdW1lbnQ7CitpbXBvcnQgY29t Lmdvb2dsZS5nd3QuZG9tLmNsaWVudC5JRnJhbWVFbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUu Z3d0LmRvbS5jbGllbnQuU3R5bGUuQm9yZGVyU3R5bGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Qu ZG9tLmNsaWVudC5TdHlsZS5Qb3NpdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xp ZW50LlN0eWxlLlVuaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCisvKioK KyAqIFRoZSBtYWluIGNvbXBvbmVudCBvZiBXZWJBZG1pbiBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1 cmUuCisgKiA8cD4KKyAqIFNob3VsZCBiZSBib3VuZCBhcyBHSU4gZWFnZXIgc2luZ2xldG9uLCBj cmVhdGVkIGVhcmx5IG9uIGR1cmluZyBhcHBsaWNhdGlvbiBzdGFydHVwLgorICovCitwdWJsaWMg Y2xhc3MgUGx1Z2luTWFuYWdlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIg bG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihQbHVnaW5NYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7 CisKKyAgICAvLyBNYXBzIHBsdWdpbiBuYW1lcyB0byBjb3JyZXNwb25kaW5nIG9iamVjdCByZXBy ZXNlbnRhdGlvbnMKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFBsdWdpbj4gcGx1Z2lu cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGx1Z2luPigpOworCisgICAgLy8gQ29udHJvbHMgcGx1 Z2luIGludm9jYXRpb24sIGFsbG93aW5nIFdlYkFkbWluIHRvIGNhbGwgcGx1Z2lucyBvbmx5IGlu IGEgc3BlY2lmaWMgY29udGV4dAorICAgIHByaXZhdGUgYm9vbGVhbiBjYW5JbnZva2VQbHVnaW5z ID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGZpbmFsIFBsdWdpblVpRnVuY3Rpb25zIHVpRnVuY3Rp b25zOworCisgICAgQEluamVjdAorICAgIHB1YmxpYyBQbHVnaW5NYW5hZ2VyKFBsdWdpblVpRnVu Y3Rpb25zIHVpRnVuY3Rpb25zKSB7CisgICAgICAgIHRoaXMudWlGdW5jdGlvbnMgPSB1aUZ1bmN0 aW9uczsKKyAgICAgICAgZXhwb3NlUGx1Z2luQXBpKCk7CisgICAgICAgIGRlZmluZUFuZExvYWRQ bHVnaW5zKCk7CisgICAgfQorCisgICAgUGx1Z2luIGdldFBsdWdpbihTdHJpbmcgcGx1Z2luTmFt ZSkgeworICAgICAgICByZXR1cm4gcGx1Z2lucy5nZXQocGx1Z2luTmFtZSk7CisgICAgfQorCisg ICAgQ29sbGVjdGlvbjxQbHVnaW4+IGdldFBsdWdpbnMoKSB7CisgICAgICAgIHJldHVybiBwbHVn aW5zLnZhbHVlcygpOworICAgIH0KKworICAgIHZvaWQgYWRkUGx1Z2luKFN0cmluZyBwbHVnaW5O YW1lLCBQbHVnaW4gcGx1Z2luKSB7CisgICAgICAgIHBsdWdpbnMucHV0KHBsdWdpbk5hbWUsIHBs dWdpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyBhbGwgcGx1Z2lucyB0aGF0 IHdlcmUgZGV0ZWN0ZWQgd2hlbiBzZXJ2aW5nIFdlYkFkbWluIGhvc3QgcGFnZSBhbmQgbG9hZHMg dGhlbSBhcyBuZWNlc3NhcnkuCisgICAgICovCisgICAgdm9pZCBkZWZpbmVBbmRMb2FkUGx1Z2lu cygpIHsKKyAgICAgICAgUGx1Z2luRGVmaW5pdGlvbnMgZGVmaW5pdGlvbnMgPSBQbHVnaW5EZWZp bml0aW9ucy5pbnN0YW5jZSgpOworCisgICAgICAgIGlmIChkZWZpbml0aW9ucyAhPSBudWxsKSB7 CisgICAgICAgICAgICBKc0FycmF5PFBsdWdpbk1ldGFEYXRhPiBtZXRhRGF0YUFycmF5ID0gZGVm aW5pdGlvbnMuZ2V0TWV0YURhdGFBcnJheSgpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0g MDsgaSA8IG1ldGFEYXRhQXJyYXkubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFBs dWdpbk1ldGFEYXRhIHBsdWdpbk1ldGFEYXRhID0gbWV0YURhdGFBcnJheS5nZXQoaSk7CisKKyAg ICAgICAgICAgICAgICBpZiAocGx1Z2luTWV0YURhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAg ICAgICAgICBkZWZpbmVBbmRMb2FkUGx1Z2luKHBsdWdpbk1ldGFEYXRhKTsKKyAgICAgICAgICAg ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAg KiBEZWZpbmVzIGEgcGx1Z2luIGZyb20gdGhlIGdpdmVuIG1ldGEtZGF0YSBhbmQgbG9hZHMgaXQg YXMgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHZvaWQgZGVmaW5lQW5kTG9hZFBsdWdpbihQbHVn aW5NZXRhRGF0YSBwbHVnaW5NZXRhRGF0YSkgeworICAgICAgICBTdHJpbmcgcGx1Z2luTmFtZSA9 IHBsdWdpbk1ldGFEYXRhLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHBsdWdpbkhvc3RQYWdl VXJsID0gcGx1Z2luTWV0YURhdGEuZ2V0SG9zdFBhZ2VVcmwoKTsKKworICAgICAgICBpZiAoZ2V0 UGx1Z2luKHBsdWdpbk5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuaW5n KCJQbHVnaW4gIiArIHBsdWdpbk5hbWUgKyAiIGlzIGFscmVhZHkgZGVmaW5lZCIpOyAvLyROT04t TkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisg ICAgICAgIC8vIENyZWF0ZSBhbiBpZnJhbWUgZWxlbWVudCB1c2VkIHRvIGxvYWQgdGhlIHBsdWdp biBob3N0IHBhZ2UKKyAgICAgICAgSUZyYW1lRWxlbWVudCBpZnJhbWUgPSBEb2N1bWVudC5nZXQo KS5jcmVhdGVJRnJhbWVFbGVtZW50KCk7CisgICAgICAgIGlmcmFtZS5zZXRTcmMocGx1Z2luSG9z dFBhZ2VVcmwpOworICAgICAgICBpZnJhbWUuc2V0RnJhbWVCb3JkZXIoMCk7CisgICAgICAgIGlm cmFtZS5nZXRTdHlsZSgpLnNldFBvc2l0aW9uKFBvc2l0aW9uLkFCU09MVVRFKTsKKyAgICAgICAg aWZyYW1lLmdldFN0eWxlKCkuc2V0V2lkdGgoMCwgVW5pdC5QVCk7CisgICAgICAgIGlmcmFtZS5n ZXRTdHlsZSgpLnNldEhlaWdodCgwLCBVbml0LlBUKTsKKyAgICAgICAgaWZyYW1lLmdldFN0eWxl KCkuc2V0Qm9yZGVyU3R5bGUoQm9yZGVyU3R5bGUuTk9ORSk7CisKKyAgICAgICAgUGx1Z2luIHBs dWdpbiA9IG5ldyBQbHVnaW4ocGx1Z2luTWV0YURhdGEsIGlmcmFtZSk7CisgICAgICAgIGFkZFBs dWdpbihwbHVnaW5OYW1lLCBwbHVnaW4pOworICAgICAgICBsb2dnZXIuaW5mbygiUGx1Z2luICIg KyBwbHVnaW5OYW1lICsgIiBpcyBkZWZpbmVkIHRvIGJlIGxvYWRlZCBmcm9tIFVSTCAiICsgcGx1 Z2luSG9zdFBhZ2VVcmwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworICAgICAgICAv LyBUT0RPIGludHJvZHVjZSBzb21lICdsb2FkT25TdGFydHVwJyBhdHRyaWJ1dGUgaW4gZnV0dXJl CisgICAgICAgIGxvYWRQbHVnaW4ocGx1Z2luKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBM b2FkcyB0aGUgZ2l2ZW4gcGx1Z2luIGJ5IGF0dGFjaGluZyB0aGUgY29ycmVzcG9uZGluZyBpZnJh bWUgZWxlbWVudCB0byBET00uCisgICAgICovCisgICAgdm9pZCBsb2FkUGx1Z2luKFBsdWdpbiBw bHVnaW4pIHsKKyAgICAgICAgaWYgKHBsdWdpbi5pc0luU3RhdGUoUGx1Z2luU3RhdGUuREVGSU5F RCkpIHsKKyAgICAgICAgICAgIERvY3VtZW50LmdldCgpLmdldEJvZHkoKS5hcHBlbmRDaGlsZChw bHVnaW4uZ2V0SUZyYW1lRWxlbWVudCgpKTsKKyAgICAgICAgICAgIHBsdWdpbi5tYXJrQXNMb2Fk aW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBX ZWJBZG1pbiBlbnRlcnMgdGhlIHN0YXRlIHRoYXQgYWxsb3dzIHBsdWdpbnMgdG8gYmUgaW52b2tl ZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmFibGVQbHVnaW5JbnZvY2F0aW9uKCkgewor ICAgICAgICBjYW5JbnZva2VQbHVnaW5zID0gdHJ1ZTsKKworICAgICAgICAvLyBUcnkgdG8gaW5p dGlhbGl6ZSBhbGwgcGx1Z2lucyB3aGljaCBhcmUgY3VycmVudGx5IHJlYWR5CisgICAgICAgIGZv ciAoUGx1Z2luIHBsdWdpbiA6IGdldFBsdWdpbnMoKSkgeworICAgICAgICAgICAgaWYgKHBsdWdp bi5pc0luU3RhdGUoUGx1Z2luU3RhdGUuUkVBRFkpKSB7CisgICAgICAgICAgICAgICAgaW5pdFBs dWdpbihwbHVnaW4uZ2V0TWV0YURhdGEoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAg ICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gV2ViQWRtaW4gbGVh dmVzIHRoZSBzdGF0ZSB0aGF0IGFsbG93cyBwbHVnaW5zIHRvIGJlIGludm9rZWQuCisgICAgICov CisgICAgcHVibGljIHZvaWQgZGlzYWJsZVBsdWdpbkludm9jYXRpb24oKSB7CisgICAgICAgIGNh bkludm9rZVBsdWdpbnMgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2Vz IGFuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gb24gYWxsIHBsdWdpbnMgd2hpY2ggYXJlIGN1cnJl bnRseSBpbml0aWFsaXplZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUge0Bjb2RlIGNvbnRleHRP YmplY3R9IHJlcHJlc2VudHMgdGhlIGxvY2FsIGNvbnRleHQgb2YgdGhlIGdpdmVuIGZ1bmN0aW9u IGNhbGwsIHVzZWQgdG8gcGFzcyBhZGRpdGlvbmFsCisgICAgICogY29udGV4dC1zZW5zaXRpdmUg aW5mb3JtYXRpb24gYXMgbmVjZXNzYXJ5IChjYW4gYmUge0Bjb2RlIG51bGx9KS4KKyAgICAgKi8K KyAgICBwdWJsaWMgdm9pZCBpbnZva2VQbHVnaW5zKFN0cmluZyBmdW5jdGlvbk5hbWUsIEphdmFT Y3JpcHRPYmplY3QgY29udGV4dE9iamVjdCkgeworICAgICAgICBpZiAoY2FuSW52b2tlUGx1Z2lu cykgeworICAgICAgICAgICAgZm9yIChQbHVnaW4gcGx1Z2luIDogZ2V0UGx1Z2lucygpKSB7Cisg ICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5pc0luU3RhdGUoUGx1Z2luU3RhdGUuSU5JVElBTEla RUQpKSB7CisgICAgICAgICAgICAgICAgICAgIGludm9rZVBsdWdpbihwbHVnaW4uZ2V0RXZlbnRI YW5kbGVyT2JqZWN0KCksIGZ1bmN0aW9uTmFtZSwgY29udGV4dE9iamVjdCk7CisgICAgICAgICAg ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAg ICogSW52b2tlcyBhbiBldmVudCBoYW5kbGVyIGZ1bmN0aW9uIG9uIHRoZSBnaXZlbiBvYmplY3Qu CisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbnZva2VQbHVnaW4oSmF2YVNjcmlw dE9iamVjdCBwbHVnaW5FdmVudEhhbmRsZXJPYmplY3QsIFN0cmluZyBmdW5jdGlvbk5hbWUsIEph dmFTY3JpcHRPYmplY3QgY29udGV4dE9iamVjdCkgLyoteworICAgICAgICB2YXIgaGFuZGxlckZ1 bmN0aW9uID0gcGx1Z2luRXZlbnRIYW5kbGVyT2JqZWN0W2Z1bmN0aW9uTmFtZV07CisKKyAgICAg ICAgaWYgKHR5cGVvZiBoYW5kbGVyRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAg ICAgIGlmIChjb250ZXh0T2JqZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVy RnVuY3Rpb24oY29udGV4dE9iamVjdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg ICAgICAgIGhhbmRsZXJGdW5jdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg fS0qLzsKKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IHdoZW4gcGx1Z2lu IGludm9jYXRpb24gaXMgZW5hYmxlZCBhbmQgdGhlIGdpdmVuIHBsdWdpbiBoYXMgYmVlbiBpbml0 aWFsaXplZC4KKyAgICAgKi8KKyAgICBib29sZWFuIGNhbkRvUGx1Z2luQWN0aW9uKFN0cmluZyBw bHVnaW5OYW1lKSB7CisgICAgICAgIFBsdWdpbiBwbHVnaW4gPSBnZXRQbHVnaW4ocGx1Z2luTmFt ZSk7CisgICAgICAgIHJldHVybiBjYW5JbnZva2VQbHVnaW5zICYmIHBsdWdpbiAhPSBudWxsICYm IHBsdWdpbi5pc0luU3RhdGUoUGx1Z2luU3RhdGUuSU5JVElBTElaRUQpOworICAgIH0KKworICAg IC8qKgorICAgICAqIFJlZ2lzdGVycyBhbiBldmVudCBoYW5kbGVyIG9iamVjdCAob2JqZWN0IGNv bnRhaW5pbmcgcGx1Z2luIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zKSBmb3IgdGhlIGdpdmVuIHBs dWdpbi4KKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyUGx1Z2luRXZlbnRIYW5kbGVyT2JqZWN0 KFN0cmluZyBwbHVnaW5OYW1lLCBKYXZhU2NyaXB0T2JqZWN0IHBsdWdpbkV2ZW50SGFuZGxlck9i amVjdCkgeworICAgICAgICBQbHVnaW4gcGx1Z2luID0gZ2V0UGx1Z2luKHBsdWdpbk5hbWUpOwor CisgICAgICAgIGlmIChwbHVnaW4gIT0gbnVsbCAmJiBwbHVnaW5FdmVudEhhbmRsZXJPYmplY3Qg IT0gbnVsbCkgeworICAgICAgICAgICAgcGx1Z2luLnNldEV2ZW50SGFuZGxlck9iamVjdChwbHVn aW5FdmVudEhhbmRsZXJPYmplY3QpOworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlBsdWdpbiAi ICsgcGx1Z2luTmFtZSArICIgaGFzIHJlZ2lzdGVyZWQgdGhlIGV2ZW50IGhhbmRsZXIgb2JqZWN0 Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICB9CisgICAgfQorCisgICAg LyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGdpdmVuIHBsdWdpbiBpcyByZWFkeSBmb3Ig dXNlLgorICAgICAqLworICAgIHZvaWQgcGx1Z2luUmVhZHkoU3RyaW5nIHBsdWdpbk5hbWUpIHsK KyAgICAgICAgUGx1Z2luIHBsdWdpbiA9IGdldFBsdWdpbihwbHVnaW5OYW1lKTsKKworICAgICAg ICBpZiAocGx1Z2luICE9IG51bGwgJiYgcGx1Z2luLmlzSW5TdGF0ZShQbHVnaW5TdGF0ZS5MT0FE SU5HKSkgeworICAgICAgICAgICAgaWYgKHBsdWdpbi5nZXRFdmVudEhhbmRsZXJPYmplY3QoKSA9 PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIlBsdWdpbiAiICsgcGx1 Z2luTmFtZSAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgICAgICArICIgcmVwb3J0 cyBpbiBhcyByZWFkeSwgYnV0IGhhcyBubyBldmVudCBoYW5kbGVyIG9iamVjdCBhc3NpZ25lZCIp OyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQor CisgICAgICAgICAgICBwbHVnaW4ubWFya0FzUmVhZHkoKTsKKyAgICAgICAgICAgIGxvZ2dlci5p bmZvKCJQbHVnaW4gIiArIHBsdWdpbk5hbWUgKyAiIHJlcG9ydHMgaW4gYXMgcmVhZHkiKTsgLy8k Tk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICBpbml0UGx1Z2luKHBsdWdpbk5h bWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gaW5p dGlhbGl6ZSB0aGUgZ2l2ZW4gcGx1Z2luIGJ5IGNhbGxpbmcgVWlJbml0IGV2ZW50IGhhbmRsZXIg ZnVuY3Rpb24gb24gdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQKKyAgICAgKiBoYW5kbGVyIG9iamVj dC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgVWlJbml0IGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVk IGp1c3Qgb25jZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGEgcGx1Z2luLiBNb3JlIHByZWNpc2Vs eSwgVWlJbml0IGZ1bmN0aW9uCisgICAgICogd2lsbCBiZSBjYWxsZWQ6CisgICAgICogPHVsPgor ICAgICAqIDxsaT5hZnRlciB0aGUgcGx1Z2luIHJlcG9ydHMgaW4gYXMgcmVhZHkgYW5kIFdlYkFk bWluIGVudGVycyB0aGUgc3RhdGUgdGhhdCBhbGxvd3MgcGx1Z2lucyB0byBiZSBpbnZva2VkCisg ICAgICogPGxpPmJlZm9yZSBhbnkgb3RoZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMgYXJlIGlu dm9rZWQgYnkgdGhlIHBsdWdpbiBpbmZyYXN0cnVjdHVyZQorICAgICAqIDwvdWw+CisgICAgICov CisgICAgdm9pZCBpbml0UGx1Z2luKFN0cmluZyBwbHVnaW5OYW1lKSB7CisgICAgICAgIFBsdWdp biBwbHVnaW4gPSBnZXRQbHVnaW4ocGx1Z2luTmFtZSk7CisKKyAgICAgICAgaWYgKGNhbkludm9r ZVBsdWdpbnMgJiYgcGx1Z2luICE9IG51bGwgJiYgcGx1Z2luLmlzSW5TdGF0ZShQbHVnaW5TdGF0 ZS5SRUFEWSkpIHsKKyAgICAgICAgICAgIHBsdWdpbi5tYXJrQXNJbml0aWFsaXplZCgpOworICAg ICAgICAgICAgaW52b2tlUGx1Z2luKHBsdWdpbi5nZXRFdmVudEhhbmRsZXJPYmplY3QoKSwgIlVp SW5pdCIsIG51bGwpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiUGx1 Z2luICIgKyBwbHVnaW5OYW1lICsgIiBpcyBpbml0aWFsaXplZCBhbmQgaW4gdXNlIG5vdyIpOyAv LyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgor ICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0 aGUgZ2l2ZW4gcGx1Z2luLCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gc3VjaCBvYmplY3QgZXhpc3Rz LgorICAgICAqLworICAgIEphdmFTY3JpcHRPYmplY3QgZ2V0Q29uZmlnT2JqZWN0KFN0cmluZyBw bHVnaW5OYW1lKSB7CisgICAgICAgIFBsdWdpbiBwbHVnaW4gPSBnZXRQbHVnaW4ocGx1Z2luTmFt ZSk7CisgICAgICAgIHJldHVybiBwbHVnaW4gIT0gbnVsbCA/IHBsdWdpbi5nZXRNZXRhRGF0YSgp LmdldENvbmZpZ09iamVjdCgpIDogbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2 b2lkIGV4cG9zZVBsdWdpbkFwaSgpIC8qLXsKKyAgICAgICAgdmFyIGN0eCA9IHRoaXM7CisgICAg ICAgIHZhciB1aUZ1bmN0aW9ucyA9IGN0eC5Ab3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5w bHVnaW4uUGx1Z2luTWFuYWdlcjo6dWlGdW5jdGlvbnM7CisKKyAgICAgICAgdmFyIGNhbkRvUGx1 Z2luQWN0aW9uID0gZnVuY3Rpb24ocGx1Z2luTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGN0 eC5Ab3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW4uUGx1Z2luTWFuYWdlcjo6Y2Fu RG9QbHVnaW5BY3Rpb24oTGphdmEvbGFuZy9TdHJpbmc7KShwbHVnaW5OYW1lKTsKKyAgICAgICAg fTsKKworICAgICAgICAvLyBEZWZpbmUgcGx1Z2luQXBpIGZ1bmN0aW9uIHVzZWQgdG8gY29uc3Ry dWN0IHNwZWNpZmljIFBsdWdpbiBBUEkgaW5zdGFuY2VzCisgICAgICAgIHZhciBwbHVnaW5BcGkg PSBmdW5jdGlvbihwbHVnaW5OYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IHBsdWdpbkFw aS5mbi5pbml0KHBsdWdpbk5hbWUpOworICAgICAgICB9OworCisgICAgICAgIC8vIERlZmluZSBw bHVnaW5BcGkuZm4gYXMgYW4gYWxpYXMgdG8gcGx1Z2luQXBpIHByb3RvdHlwZQorICAgICAgICBw bHVnaW5BcGkuZm4gPSBwbHVnaW5BcGkucHJvdG90eXBlID0geworCisgICAgICAgICAgICBwbHVn aW5OYW1lOiBudWxsLCAvLyBJbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBmdW5jdGlvbgorCisg ICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICAgICAgICAgICAgaW5pdDogZnVu Y3Rpb24ocGx1Z2luTmFtZSkgeworICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luTmFtZSA9IHBs dWdpbk5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy51aS5vd25lciA9IHRoaXM7CisgICAgICAg ICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBS ZWdpc3RlcnMgcGx1Z2luIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGZvciBsYXRlciBpbnZvY2F0 aW9uCisgICAgICAgICAgICByZWdpc3RlcjogZnVuY3Rpb24ocGx1Z2luRXZlbnRIYW5kbGVyT2Jq ZWN0KSB7CisgICAgICAgICAgICAgICAgY3R4LkBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWlu LnBsdWdpbi5QbHVnaW5NYW5hZ2VyOjpyZWdpc3RlclBsdWdpbkV2ZW50SGFuZGxlck9iamVjdChM amF2YS9sYW5nL1N0cmluZztMY29tL2dvb2dsZS9nd3QvY29yZS9jbGllbnQvSmF2YVNjcmlwdE9i amVjdDspKHRoaXMucGx1Z2luTmFtZSxwbHVnaW5FdmVudEhhbmRsZXJPYmplY3QpOworICAgICAg ICAgICAgfSwKKworICAgICAgICAgICAgLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHBsdWdpbiBpcyBy ZWFkeSBmb3IgdXNlCisgICAgICAgICAgICByZWFkeTogZnVuY3Rpb24oKSB7CisgICAgICAgICAg ICAgICAgY3R4LkBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5QbHVnaW5NYW5h Z2VyOjpwbHVnaW5SZWFkeShMamF2YS9sYW5nL1N0cmluZzspKHRoaXMucGx1Z2luTmFtZSk7Cisg ICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9u IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHBsdWdpbgorICAgICAgICAgICAgY29uZmlnT2Jq ZWN0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3R4LkBvcmcub3ZpcnQu ZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5QbHVnaW5NYW5hZ2VyOjpnZXRDb25maWdPYmplY3Qo TGphdmEvbGFuZy9TdHJpbmc7KSh0aGlzLnBsdWdpbk5hbWUpOworICAgICAgICAgICAgfSwKKwor ICAgICAgICAgICAgLy8gTmFtZXNwYWNlIGZvciBpbnZva2luZyBQbHVnaW5VaUZ1bmN0aW9ucwor ICAgICAgICAgICAgdWk6IHsKKworICAgICAgICAgICAgICAgIGFkZE1haW5UYWI6IGZ1bmN0aW9u KGxhYmVsLCBoaXN0b3J5VG9rZW4sIGNvbnRlbnRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAg aWYgKGNhbkRvUGx1Z2luQWN0aW9uKHRoaXMub3duZXIucGx1Z2luTmFtZSkpIHsKKyAgICAgICAg ICAgICAgICAgICAgICAgIHVpRnVuY3Rpb25zLkBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWlu LnBsdWdpbi5QbHVnaW5VaUZ1bmN0aW9uczo6YWRkTWFpblRhYihMamF2YS9sYW5nL1N0cmluZztM amF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspKGxhYmVsLGhpc3RvcnlUb2tlbixj b250ZW50VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwor ICAgICAgICAgICAgfQorCisgICAgICAgIH07CisKKyAgICAgICAgLy8gR2l2ZSBpbml0IGZ1bmN0 aW9uIHRoZSBwbHVnaW5BcGkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCisgICAg ICAgIHBsdWdpbkFwaS5mbi5pbml0LnByb3RvdHlwZSA9IHBsdWdpbkFwaS5mbjsKKworICAgICAg ICAvLyBFeHBvc2UgcGx1Z2luQXBpIGZ1bmN0aW9uIGFzIGEgZ2xvYmFsIG9iamVjdAorICAgICAg ICAkd25kLnBsdWdpbkFwaSA9IHBsdWdpbkFwaTsKKyAgICB9LSovOworCit9CmRpZmYgLS1naXQg YS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292 aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luTWV0YURhdGEuamF2YSBiL2Zyb250 ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5n aW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5NZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZjMxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVu ZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2lu ZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luTWV0YURhdGEuamF2YQpAQCAtMCwwICsxLDM2IEBA CitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luOworCitpbXBvcnQg Y29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKKworLyoqCisgKiBD b250YWlucyBtZXRhLWRhdGEgZGVzY3JpYmluZyBhIFVJIHBsdWdpbi4KKyAqIDxwPgorICogV2Ug ZXhwZWN0IHRoZSBtZXRhLWRhdGEgdG8gYmUgcmVhZCBkdXJpbmcgV2ViQWRtaW4gc3RhcnR1cCBh cyBwYXJ0IG9mIHtAbGluayBQbHVnaW5EZWZpbml0aW9uc30uCisgKi8KK3B1YmxpYyBmaW5hbCBj bGFzcyBQbHVnaW5NZXRhRGF0YSBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworCisgICAgcHJv dGVjdGVkIFBsdWdpbk1ldGFEYXRhKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbmFt ZSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHBsdWdpbiAobWFuZGF0b3J5KS4KKyAgICAg Ki8KKyAgICBwdWJsaWMgbmF0aXZlIFN0cmluZyBnZXROYW1lKCkgIC8qLXsKKyAgICAgICAgcmV0 dXJuIHRoaXMubmFtZTsKKyAgICB9LSovOworCisgICAgLyoqCisgICAgICogVVJMIG9mIHBsdWdp biBob3N0IHBhZ2UgdGhhdCBpbnZva2VzIHRoZSBwbHVnaW4gY29kZSAobWFuZGF0b3J5KS4KKyAg ICAgKi8KKyAgICBwdWJsaWMgbmF0aXZlIFN0cmluZyBnZXRIb3N0UGFnZVVybCgpIC8qLXsKKyAg ICAgICAgcmV0dXJuIHRoaXMudXJsOworICAgIH0tKi87CisKKyAgICAvKioKKyAgICAgKiBDb25m aWd1cmF0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHBsdWdpbiAob3B0aW9uYWwpLgor ICAgICAqLworICAgIHB1YmxpYyBuYXRpdmUgSmF2YVNjcmlwdE9iamVjdCBnZXRDb25maWdPYmpl Y3QoKSAvKi17CisgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZzsKKyAgICB9LSovOworCit9CmRp ZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2ph dmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luU3RhdGUuamF2YSBi L2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3Zp cnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5TdGF0ZS5qYXZhCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YzZiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9u dGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2Vu Z2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luU3RhdGUuamF2YQpAQCAtMCwwICsxLDMzIEBA CitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luOworCisvKioKKyAq IEVudW1lcmF0ZXMgcG9zc2libGUgc3RhdGVzIGR1cmluZyB0aGUgcnVudGltZSBvZiBhIFVJIHBs dWdpbi4KKyAqLworcHVibGljIGVudW0gUGx1Z2luU3RhdGUgeworCisgICAgLyoqCisgICAgICog VGhlIHBsdWdpbiBoYXMgYmVlbiBkZWZpbmVkIHRocm91Z2ggaXRzIG1ldGEtZGF0YSBhbmQgdGhl IGNvcnJlc3BvbmRpbmcgaWZyYW1lIGVsZW1lbnQgaGFzIGJlZW4gY3JlYXRlZC4KKyAgICAgKiA8 cD4KKyAgICAgKiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlIGZvciBhbGwgcGx1Z2lucy4KKyAg ICAgKi8KKyAgICBERUZJTkVELAorCisgICAgLyoqCisgICAgICogVGhlIGlmcmFtZSBlbGVtZW50 IGhhcyBiZWVuIGF0dGFjaGVkIHRvIERPTSwgd2l0aCBwbHVnaW4gaG9zdCBwYWdlIGJlaW5nIGZl dGNoZWQgYXN5bmNocm9ub3VzbHkgaW4gdGhlCisgICAgICogYmFja2dyb3VuZC4gV2UgYXJlIG5v dyB3YWl0aW5nIGZvciB0aGUgcGx1Z2luIHRvIHJlcG9ydCBpbiBhcyByZWFkeS4KKyAgICAgKi8K KyAgICBMT0FESU5HLAorCisgICAgLyoqCisgICAgICogVGhlIHBsdWdpbiBoYXMgaW5kaWNhdGVk IHRoYXQgaXQgaXMgcmVhZHkgZm9yIHVzZS4gV2UgZXhwZWN0IHRoZSBldmVudCBoYW5kbGVyIG9i amVjdCAob2JqZWN0IGNvbnRhaW5pbmcgcGx1Z2luCisgICAgICogZXZlbnQgaGFuZGxlciBmdW5j dGlvbnMpIHRvIGJlIHJlZ2lzdGVyZWQgYXQgdGhpcyBwb2ludC4gV2UgY2FuIG5vdyBwcm9jZWVk IHdpdGggcGx1Z2luIGluaXRpYWxpemF0aW9uLgorICAgICAqLworICAgIFJFQURZLAorCisgICAg LyoqCisgICAgICogVGhlIHBsdWdpbiBoYXMgYmVlbiBpbml0aWFsaXplZCBieSBjYWxsaW5nIFVp SW5pdCBldmVudCBoYW5kbGVyIGZ1bmN0aW9uLiBXZSBjYW4gbm93IGNhbGwgb3RoZXIgZXZlbnQg aGFuZGxlcgorICAgICAqIGZ1bmN0aW9ucyAodGhlIHBsdWdpbiBpcyBpbiB1c2UpLgorICAgICAq LworICAgIElOSVRJQUxJWkVECisKK30KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21v ZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWlu L3BsdWdpbi9QbHVnaW5VaUZ1bmN0aW9ucy5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl cy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1 Z2luL1BsdWdpblVpRnVuY3Rpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMC4uZGE1NTBmNgotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVs ZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3Bs dWdpbi9QbHVnaW5VaUZ1bmN0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2Ugb3Jn Lm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW47CisKK2ltcG9ydCBvcmcub3ZpcnQuZW5n aW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIudGFiLk1haW5UYWJDdXN0b21Q cm94eUZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKKy8qKgor ICogQ29udGFpbnMgVUkgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IGV4cG9zZWQgdG8gVUkgcGx1Z2lu cy4KKyAqLworcHVibGljIGNsYXNzIFBsdWdpblVpRnVuY3Rpb25zIHsKKworICAgIHByaXZhdGUg ZmluYWwgTWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeSBtYWluVGFiQ3VzdG9tUHJveHlGYWN0b3J5 OworCisgICAgQEluamVjdAorICAgIHB1YmxpYyBQbHVnaW5VaUZ1bmN0aW9ucyhNYWluVGFiQ3Vz dG9tUHJveHlGYWN0b3J5IG1haW5UYWJDdXN0b21Qcm94eUZhY3RvcnkpIHsKKyAgICAgICAgdGhp cy5tYWluVGFiQ3VzdG9tUHJveHlGYWN0b3J5ID0gbWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeTsK KyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIG5ldyBtYWluIHRhYiB0aGF0IHNob3dzIGNv bnRlbnRzIG9mIHRoZSBnaXZlbiBVUkwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWFp blRhYihTdHJpbmcgbGFiZWwsIFN0cmluZyBoaXN0b3J5VG9rZW4sIFN0cmluZyBjb250ZW50VXJs KSB7CisgICAgICAgIG1haW5UYWJDdXN0b21Qcm94eUZhY3RvcnkuY3JlYXRlKGxhYmVsLCBoaXN0 b3J5VG9rZW4sIGNvbnRlbnRVcmwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQv d2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUv dWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci9NYWluU2VjdGlvblByZXNlbnRlci5q YXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29y Zy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci9NYWluU2Vj dGlvblByZXNlbnRlci5qYXZhCmluZGV4IDcxOGQ4ZmMuLjE1Yjg4N2MgMTAwNjQ0Ci0tLSBhL2Zy b250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQv ZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvTWFpblNlY3Rpb25QcmVz ZW50ZXIuamF2YQorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9t YWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJlc2Vu dGVyL01haW5TZWN0aW9uUHJlc2VudGVyLmphdmEKQEAgLTEsNSArMSw3IEBACiBwYWNrYWdlIG9y Zy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uc2VjdGlvbi5tYWluLnByZXNlbnRlcjsKIAoraW1w b3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLlBsdWdpbk1hbmFnZXI7CisK IGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuRXZlbnRCdXM7CiBpbXBvcnQgY29t Lmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkd3dEV2ZW50LlR5cGU7CiBpbXBvcnQgY29tLmdvb2ds ZS5pbmplY3QuSW5qZWN0OwpAQCAtMjgsMTEgKzMwLDEzIEBAIHB1YmxpYyBjbGFzcyBNYWluU2Vj dGlvblByZXNlbnRlciBleHRlbmRzIFByZXNlbnRlcjxNYWluU2VjdGlvblByZXNlbnRlci5WaWV3 RGVmCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlPFJldmVhbENvbnRlbnRIYW5kbGVyPD8+ PiBUWVBFX1NldE1haW5Db250ZW50ID0gbmV3IFR5cGU8UmV2ZWFsQ29udGVudEhhbmRsZXI8Pz4+ KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIEhlYWRlclByZXNlbnRlcldpZGdldCBoZWFkZXI7Cisg ICAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5NYW5hZ2VyIHBsdWdpbk1hbmFnZXI7CiAKICAgICBASW5q ZWN0Ci0gICAgcHVibGljIE1haW5TZWN0aW9uUHJlc2VudGVyKEV2ZW50QnVzIGV2ZW50QnVzLCBW aWV3RGVmIHZpZXcsIFByb3h5RGVmIHByb3h5LCBIZWFkZXJQcmVzZW50ZXJXaWRnZXQgaGVhZGVy KSB7CisgICAgcHVibGljIE1haW5TZWN0aW9uUHJlc2VudGVyKEV2ZW50QnVzIGV2ZW50QnVzLCBW aWV3RGVmIHZpZXcsIFByb3h5RGVmIHByb3h5LCBIZWFkZXJQcmVzZW50ZXJXaWRnZXQgaGVhZGVy LCBQbHVnaW5NYW5hZ2VyIHBsdWdpbk1hbmFnZXIpIHsKICAgICAgICAgc3VwZXIoZXZlbnRCdXMs IHZpZXcsIHByb3h5KTsKICAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CisgICAgICAgIHRo aXMucGx1Z2luTWFuYWdlciA9IHBsdWdpbk1hbmFnZXI7CiAgICAgICAgIGdldFZpZXcoKS5zZXRV aUhhbmRsZXJzKGhlYWRlcik7CiAgICAgfQogCkBAIC00Niw2ICs1MCwxNyBAQCBwdWJsaWMgY2xh c3MgTWFpblNlY3Rpb25QcmVzZW50ZXIgZXh0ZW5kcyBQcmVzZW50ZXI8TWFpblNlY3Rpb25QcmVz ZW50ZXIuVmlld0RlZgogICAgICAgICBzdXBlci5vblJldmVhbCgpOwogCiAgICAgICAgIHNldElu U2xvdChUWVBFX1NldEhlYWRlciwgaGVhZGVyKTsKKworICAgICAgICAvLyBFbmFibGUgcGx1Z2lu IGludm9jYXRpb24gd2l0aGluIHRoZSBzY29wZSBvZiBtYWluIHNlY3Rpb24KKyAgICAgICAgcGx1 Z2luTWFuYWdlci5lbmFibGVQbHVnaW5JbnZvY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJy aWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25IaWRlKCkgeworICAgICAgICBzdXBlci5vbkhpZGUo KTsKKworICAgICAgICAvLyBEaXNhYmxlIHBsdWdpbiBpbnZvY2F0aW9uIG91dHNpZGUgdGhlIHNj b3BlIG9mIG1haW4gc2VjdGlvbgorICAgICAgICBwbHVnaW5NYW5hZ2VyLmRpc2FibGVQbHVnaW5J bnZvY2F0aW9uKCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9t b2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1p bi9zZWN0aW9uL21haW4vcHJlc2VudGVyL01haW5UYWJQYW5lbFByZXNlbnRlci5qYXZhIGIvZnJv bnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l bmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci9NYWluVGFiUGFuZWxQcmVz ZW50ZXIuamF2YQppbmRleCBhYzA0MDAxLi42MTEyZDM4IDEwMDY0NAotLS0gYS9mcm9udGVuZC93 ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91 aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJlc2VudGVyL01haW5UYWJQYW5lbFByZXNlbnRlci5q YXZhCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2 YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvTWFp blRhYlBhbmVsUHJlc2VudGVyLmphdmEKQEAgLTUsNiArNSw3IEBAIGltcG9ydCBvcmcub3ZpcnQu ZW5naW5lLnVpLmNvbW1vbi53aWRnZXQudGFiLkFic3RyYWN0SGVhZGxlc3NUYWJQYW5lbC5UYWJX aWRnZXRICiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkV2ZW50QnVzOwogaW1w b3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5Hd3RFdmVudC5UeXBlOwogaW1wb3J0IGNv bS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ3d0cGxhdGZvcm0ubXZwLmNsaWVu dC5SZXF1ZXN0VGFic0V2ZW50OwogaW1wb3J0IGNvbS5nd3RwbGF0Zm9ybS5tdnAuY2xpZW50LlJl cXVlc3RUYWJzSGFuZGxlcjsKIGltcG9ydCBjb20uZ3d0cGxhdGZvcm0ubXZwLmNsaWVudC5UYWJD b250YWluZXJQcmVzZW50ZXI7CiBpbXBvcnQgY29tLmd3dHBsYXRmb3JtLm12cC5jbGllbnQuVGFi VmlldzsKQEAgLTQ1LDQgKzQ2LDEzIEBAIHB1YmxpYyBjbGFzcyBNYWluVGFiUGFuZWxQcmVzZW50 ZXIgZXh0ZW5kcyBUYWJDb250YWluZXJQcmVzZW50ZXI8TWFpblRhYlBhbmVsUHJlCiAgICAgICAg IFJldmVhbENvbnRlbnRFdmVudC5maXJlKHRoaXMsIE1haW5Db250ZW50UHJlc2VudGVyLlRZUEVf U2V0TWFpblRhYlBhbmVsQ29udGVudCwgdGhpcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisg ICAgcHJvdGVjdGVkIHZvaWQgb25SZXZlYWwoKSB7CisgICAgICAgIHN1cGVyLm9uUmV2ZWFsKCk7 CisKKyAgICAgICAgLy8gUmVmcmVzaCB0YWJzIGVhY2ggdGltZSB0aGlzIHRhYiBjb250YWluZXIg aXMgcmV2ZWFsZWQKKyAgICAgICAgZ2V0VmlldygpLnJlbW92ZVRhYnMoKTsKKyAgICAgICAgUmVx dWVzdFRhYnNFdmVudC5maXJlKHRoaXMsIFRZUEVfUmVxdWVzdFRhYnMsIHRoaXMpOworICAgIH0K KwogfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMv bWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNl bnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNlbnRlci5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4v bW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRt aW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNlbnRlci5qYXZh Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOWMyZjUKLS0tIC9kZXYvbnVs bAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEv b3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJlc2VudGVyL3RhYi9N YWluVGFiQ3VzdG9tUHJlc2VudGVyLmphdmEKQEAgLTAsMCArMSw0MyBAQAorcGFja2FnZSBvcmcu b3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIudGFiOworCitp bXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zZWN0aW9uLm1haW4ucHJlc2VudGVy Lk1haW5UYWJQYW5lbFByZXNlbnRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNo YXJlZC5FdmVudEJ1czsKK2ltcG9ydCBjb20uZ3d0cGxhdGZvcm0ubXZwLmNsaWVudC5QcmVzZW50 ZXI7CitpbXBvcnQgY29tLmd3dHBsYXRmb3JtLm12cC5jbGllbnQuVmlldzsKK2ltcG9ydCBjb20u Z3d0cGxhdGZvcm0ubXZwLmNsaWVudC5wcm94eS5SZXZlYWxDb250ZW50RXZlbnQ7CitpbXBvcnQg Y29tLmd3dHBsYXRmb3JtLm12cC5jbGllbnQucHJveHkuVGFiQ29udGVudFByb3h5UGxhY2U7CisK K3B1YmxpYyBjbGFzcyBNYWluVGFiQ3VzdG9tUHJlc2VudGVyIGV4dGVuZHMgUHJlc2VudGVyPE1h aW5UYWJDdXN0b21QcmVzZW50ZXIuVmlld0RlZiwgTWFpblRhYkN1c3RvbVByZXNlbnRlci5Qcm94 eURlZj4geworCisgICAgLy8gTm8gbmVlZCBmb3IgQFByb3h5Q29kZVNwbGl0LCB3ZSB3aWxsIHBy b3ZpZGUgb3VyIG93biBwcm94eSBpbXBsZW1lbnRhdGlvbgorICAgIHB1YmxpYyBpbnRlcmZhY2Ug UHJveHlEZWYgZXh0ZW5kcyBUYWJDb250ZW50UHJveHlQbGFjZTxNYWluVGFiQ3VzdG9tUHJlc2Vu dGVyPiB7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBWaWV3RGVmIGV4dGVuZHMgVmll dyB7CisKKyAgICAgICAgdm9pZCBzZXRDb250ZW50VXJsKFN0cmluZyB1cmwpOworCisgICAgfQor CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGVudFVybDsKKworICAgIC8vIE5vIG5lZWQg Zm9yIEBJbmplY3QsIHRoaXMgcHJlc2VudGVyIHdpbGwgYmUgY3JlYXRlZCBtYW51YWxseSBieSBN YWluVGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIKKyAgICBwdWJsaWMgTWFpblRhYkN1c3RvbVBy ZXNlbnRlcihFdmVudEJ1cyBldmVudEJ1cywgVmlld0RlZiB2aWV3LCBQcm94eURlZiBwcm94eSwg U3RyaW5nIGNvbnRlbnRVcmwpIHsKKyAgICAgICAgc3VwZXIoZXZlbnRCdXMsIHZpZXcsIHByb3h5 KTsKKyAgICAgICAgdGhpcy5jb250ZW50VXJsID0gY29udGVudFVybDsKKyAgICB9CisKKyAgICBA T3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXZlYWxJblBhcmVudCgpIHsKKyAgICAgICAg UmV2ZWFsQ29udGVudEV2ZW50LmZpcmUodGhpcywgTWFpblRhYlBhbmVsUHJlc2VudGVyLlRZUEVf U2V0VGFiQ29udGVudCwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVj dGVkIHZvaWQgb25CaW5kKCkgeworICAgICAgICBzdXBlci5vbkJpbmQoKTsKKworICAgICAgICBn ZXRWaWV3KCkuc2V0Q29udGVudFVybChjb250ZW50VXJsKTsKKyAgICB9CisKK30KZGlmZiAtLWdp dCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcv b3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvdGFiL01haW5U YWJDdXN0b21QcmVzZW50ZXJQcm92aWRlci5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl cy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2Vj dGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNlbnRlclByb3ZpZGVyLmph dmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwYmU1NAotLS0gL2Rldi9u dWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2 YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvdGFi L01haW5UYWJDdXN0b21QcmVzZW50ZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3Bh Y2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zZWN0aW9uLm1haW4ucHJlc2VudGVy LnRhYjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5FdmVudEJ1czsKK2lt cG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3Qu UHJvdmlkZXI7CisKKy8qKgorICogUHJvdmlkZXIgb2Yge0BsaW5rIE1haW5UYWJDdXN0b21QcmVz ZW50ZXJ9IGluc3RhbmNlcyAobm9uLXNpbmdsZXRvbikuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWlu VGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxNYWluVGFiQ3Vz dG9tUHJlc2VudGVyPiB7CisKKyAgICBwcml2YXRlIE1haW5UYWJDdXN0b21QcmVzZW50ZXIgcHJl c2VudGVyOworICAgIHByaXZhdGUgTWFpblRhYkN1c3RvbVByZXNlbnRlci5Qcm94eURlZiBwcm94 eTsKKworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8TWFpblRhYkN1c3RvbVByZXNlbnRlci5W aWV3RGVmPiB2aWV3UHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBFdmVudEJ1cyBldmVudEJ1 czsKKworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRVcmw7CisKKyAgICBASW5qZWN0CisgICAg cHVibGljIE1haW5UYWJDdXN0b21QcmVzZW50ZXJQcm92aWRlcihQcm92aWRlcjxNYWluVGFiQ3Vz dG9tUHJlc2VudGVyLlZpZXdEZWY+IHZpZXdQcm92aWRlciwgRXZlbnRCdXMgZXZlbnRCdXMpIHsK KyAgICAgICAgdGhpcy52aWV3UHJvdmlkZXIgPSB2aWV3UHJvdmlkZXI7CisgICAgICAgIHRoaXMu ZXZlbnRCdXMgPSBldmVudEJ1czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMg TWFpblRhYkN1c3RvbVByZXNlbnRlciBnZXQoKSB7CisgICAgICAgIGFzc2VydCBwcm94eSAhPSBu dWxsIDogIllvdSBtdXN0IGNhbGwgc2V0UHJveHkgZmlyc3QiOyAvLyROT04tTkxTLTEkCisKKyAg ICAgICAgaWYgKHByZXNlbnRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYW5k IGJpbmQgdGhlIHByZXNlbnRlcgorICAgICAgICAgICAgcHJlc2VudGVyID0gbmV3IE1haW5UYWJD dXN0b21QcmVzZW50ZXIoZXZlbnRCdXMsIHZpZXdQcm92aWRlci5nZXQoKSwgcHJveHksIGNvbnRl bnRVcmwpOworICAgICAgICAgICAgcHJlc2VudGVyLmJpbmQoKTsKKyAgICAgICAgfQorCisgICAg ICAgIHJldHVybiBwcmVzZW50ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJveHko TWFpblRhYkN1c3RvbVByZXNlbnRlci5Qcm94eURlZiBwcm94eSkgeworICAgICAgICB0aGlzLnBy b3h5ID0gcHJveHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFVybChTdHJp bmcgY29udGVudFVybCkgeworICAgICAgICB0aGlzLmNvbnRlbnRVcmwgPSBjb250ZW50VXJsOwor ICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1p bi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWlu L3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByb3h5LmphdmEgYi9mcm9udGVuZC93ZWJhZG1p bi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJh ZG1pbi9zZWN0aW9uL21haW4vcHJlc2VudGVyL3RhYi9NYWluVGFiQ3VzdG9tUHJveHkuamF2YQpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDYzMjhjCi0tLSAvZGV2L251bGwK KysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29y Zy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFp blRhYkN1c3RvbVByb3h5LmphdmEKQEAgLTAsMCArMSw0NSBAQAorcGFja2FnZSBvcmcub3ZpcnQu ZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIudGFiOworCitpbXBvcnQg b3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5naW4uQ2xpZW50R2luamVjdG9yOworaW1wb3J0 IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uc2VjdGlvbi5tYWluLnByZXNlbnRlci5NYWlu VGFiUGFuZWxQcmVzZW50ZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQu RXZlbnRCdXM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29t Lmd3dHBsYXRmb3JtLmNvbW1vbi5jbGllbnQuU3RhbmRhcmRQcm92aWRlcjsKK2ltcG9ydCBjb20u Z3d0cGxhdGZvcm0ubXZwLmNsaWVudC5UYWJEYXRhQmFzaWM7CitpbXBvcnQgY29tLmd3dHBsYXRm b3JtLm12cC5jbGllbnQucHJveHkuUGxhY2VNYW5hZ2VyOworaW1wb3J0IGNvbS5nd3RwbGF0Zm9y bS5tdnAuY2xpZW50LnByb3h5LlBsYWNlV2l0aEdhdGVrZWVwZXI7CitpbXBvcnQgY29tLmd3dHBs YXRmb3JtLm12cC5jbGllbnQucHJveHkuVGFiQ29udGVudFByb3h5SW1wbDsKK2ltcG9ydCBjb20u Z3d0cGxhdGZvcm0ubXZwLmNsaWVudC5wcm94eS5UYWJDb250ZW50UHJveHlQbGFjZUltcGw7CisK Ky8qKgorICogQ3VzdG9tIHtAbGluayBNYWluVGFiQ3VzdG9tUHJlc2VudGVyfSBwcm94eSBpbXBs ZW1lbnRhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIE1haW5UYWJDdXN0b21Qcm94eSBleHRlbmRz IFRhYkNvbnRlbnRQcm94eVBsYWNlSW1wbDxNYWluVGFiQ3VzdG9tUHJlc2VudGVyPiBpbXBsZW1l bnRzIE1haW5UYWJDdXN0b21QcmVzZW50ZXIuUHJveHlEZWYgeworCisgICAgcHVibGljIHN0YXRp YyBjbGFzcyBXcmFwcGVkUHJveHkgZXh0ZW5kcyBUYWJDb250ZW50UHJveHlJbXBsPE1haW5UYWJD dXN0b21QcmVzZW50ZXI+IHsKKworICAgICAgICBwdWJsaWMgV3JhcHBlZFByb3h5KFBsYWNlTWFu YWdlciBwbGFjZU1hbmFnZXIsIEV2ZW50QnVzIGV2ZW50QnVzLAorICAgICAgICAgICAgICAgIFBy b3ZpZGVyPE1haW5UYWJDdXN0b21QcmVzZW50ZXI+IHByZXNlbnRlclByb3ZpZGVyLAorICAgICAg ICAgICAgICAgIFN0cmluZyBsYWJlbCwgZmxvYXQgcHJpb3JpdHksIFN0cmluZyBoaXN0b3J5VG9r ZW4pIHsKKyAgICAgICAgICAgIGJpbmQocGxhY2VNYW5hZ2VyLCBldmVudEJ1cyk7CisgICAgICAg ICAgICByZXF1ZXN0VGFic0V2ZW50VHlwZSA9IE1haW5UYWJQYW5lbFByZXNlbnRlci5UWVBFX1Jl cXVlc3RUYWJzOworICAgICAgICAgICAgdGFiRGF0YSA9IG5ldyBUYWJEYXRhQmFzaWMobGFiZWws IHByaW9yaXR5KTsKKyAgICAgICAgICAgIHRhcmdldEhpc3RvcnlUb2tlbiA9IGhpc3RvcnlUb2tl bjsKKyAgICAgICAgICAgIGFkZFJlcXVlc3RUYWJzSGFuZGxlcigpOworICAgICAgICAgICAgcHJl c2VudGVyID0gbmV3IFN0YW5kYXJkUHJvdmlkZXI8TWFpblRhYkN1c3RvbVByZXNlbnRlcj4ocHJl c2VudGVyUHJvdmlkZXIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgTWFpblRh YkN1c3RvbVByb3h5KENsaWVudEdpbmplY3RvciBnaW5qZWN0b3IsCisgICAgICAgICAgICBNYWlu VGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIgcHJlc2VudGVyUHJvdmlkZXIsCisgICAgICAgICAg ICBTdHJpbmcgbGFiZWwsIGZsb2F0IHByaW9yaXR5LCBTdHJpbmcgaGlzdG9yeVRva2VuKSB7Cisg ICAgICAgIGJpbmQoZ2luamVjdG9yLmdldFBsYWNlTWFuYWdlcigpLCBnaW5qZWN0b3IuZ2V0RXZl bnRCdXMoKSk7CisgICAgICAgIHByb3h5ID0gbmV3IFdyYXBwZWRQcm94eShnaW5qZWN0b3IuZ2V0 UGxhY2VNYW5hZ2VyKCksIGdpbmplY3Rvci5nZXRFdmVudEJ1cygpLAorICAgICAgICAgICAgICAg IHByZXNlbnRlclByb3ZpZGVyLCBsYWJlbCwgcHJpb3JpdHksIGhpc3RvcnlUb2tlbik7CisgICAg ICAgIHBsYWNlID0gbmV3IFBsYWNlV2l0aEdhdGVrZWVwZXIoaGlzdG9yeVRva2VuLCBnaW5qZWN0 b3IuZ2V0RGVmYXVsdEdhdGVrZWVwZXIoKSk7CisgICAgICAgIHByZXNlbnRlclByb3ZpZGVyLnNl dFByb3h5KHRoaXMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4v bW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRt aW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeS5q YXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29y Zy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFp blRhYkN1c3RvbVByb3h5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAuLmYxNjdjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1 bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9z ZWN0aW9uL21haW4vcHJlc2VudGVyL3RhYi9NYWluVGFiQ3VzdG9tUHJveHlGYWN0b3J5LmphdmEK QEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNl Y3Rpb24ubWFpbi5wcmVzZW50ZXIudGFiOworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS53 ZWJhZG1pbi5naW4uQ2xpZW50R2luamVjdG9yOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3Qu SW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCisvKioKKyAqIENy ZWF0ZXMgYW5kIGJpbmRzIHtAbGluayBNYWluVGFiQ3VzdG9tUHJveHl9IGluc3RhbmNlcy4KKyAq LworcHVibGljIGNsYXNzIE1haW5UYWJDdXN0b21Qcm94eUZhY3RvcnkgeworCisgICAgcHJpdmF0 ZSBmaW5hbCBDbGllbnRHaW5qZWN0b3IgZ2luamVjdG9yOworICAgIHByaXZhdGUgZmluYWwgUHJv dmlkZXI8TWFpblRhYkN1c3RvbVByZXNlbnRlclByb3ZpZGVyPiBwcm92aWRlcjsKKworICAgIEBJ bmplY3QKKyAgICBwdWJsaWMgTWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeShDbGllbnRHaW5qZWN0 b3IgZ2luamVjdG9yLAorICAgICAgICAgICAgUHJvdmlkZXI8TWFpblRhYkN1c3RvbVByZXNlbnRl clByb3ZpZGVyPiBwcm92aWRlcikgeworICAgICAgICB0aGlzLmdpbmplY3RvciA9IGdpbmplY3Rv cjsKKyAgICAgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOworICAgIH0KKworICAgIHB1Ymxp YyBNYWluVGFiQ3VzdG9tUHJveHkgY3JlYXRlKFN0cmluZyBsYWJlbCwgU3RyaW5nIGhpc3RvcnlU b2tlbiwgU3RyaW5nIGNvbnRlbnRVcmwpIHsKKyAgICAgICAgTWFpblRhYkN1c3RvbVByZXNlbnRl clByb3ZpZGVyIHByZXNlbnRlclByb3ZpZGVyID0gcHJvdmlkZXIuZ2V0KCk7CisgICAgICAgIHBy ZXNlbnRlclByb3ZpZGVyLnNldENvbnRlbnRVcmwoY29udGVudFVybCk7CisKKyAgICAgICAgLy8g Q3JlYXRlIGFuZCBiaW5kIHRoZSBwcm94eSBpbnN0YW5jZQorICAgICAgICBNYWluVGFiQ3VzdG9t UHJveHkgcHJveHkgPSBuZXcgTWFpblRhYkN1c3RvbVByb3h5KAorICAgICAgICAgICAgICAgIGdp bmplY3RvciwgcHJlc2VudGVyUHJvdmlkZXIsIGxhYmVsLCBGbG9hdC5NQVhfVkFMVUUsIGhpc3Rv cnlUb2tlbik7CisKKyAgICAgICAgcmV0dXJuIHByb3h5OworICAgIH0KKworfQpkaWZmIC0tZ2l0 IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9v dmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ZpZXcvdGFiL01haW5UYWJDdXN0 b21WaWV3LmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWlu L2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vdmlldy90YWIv TWFpblRhYkN1c3RvbVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li5jOGU5NjgzCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93 ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlv bi9tYWluL3ZpZXcvdGFiL01haW5UYWJDdXN0b21WaWV3LmphdmEKQEAgLTAsMCArMSwzMiBAQAor cGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi52aWV3LnRh YjsKKworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLnZpZXcuQWJzdHJhY3RWaWV3 OworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uc2VjdGlvbi5tYWluLnByZXNl bnRlci50YWIuTWFpblRhYkN1c3RvbVByZXNlbnRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0 LmNvcmUuY2xpZW50LkdXVDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51aWJpbmRlci5jbGllbnQu VWlCaW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudWliaW5kZXIuY2xpZW50LlVpRmllbGQ7 CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW5saW5lTGFiZWw7CitpbXBv cnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuV2lkZ2V0OworaW1wb3J0IGNvbS5nb29n bGUuaW5qZWN0LkluamVjdDsKKworcHVibGljIGNsYXNzIE1haW5UYWJDdXN0b21WaWV3IGV4dGVu ZHMgQWJzdHJhY3RWaWV3IGltcGxlbWVudHMgTWFpblRhYkN1c3RvbVByZXNlbnRlci5WaWV3RGVm IHsKKworICAgIGludGVyZmFjZSBWaWV3VWlCaW5kZXIgZXh0ZW5kcyBVaUJpbmRlcjxXaWRnZXQs IE1haW5UYWJDdXN0b21WaWV3PiB7CisgICAgICAgIFZpZXdVaUJpbmRlciB1aUJpbmRlciA9IEdX VC5jcmVhdGUoVmlld1VpQmluZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVWlGaWVsZAorICAg IElubGluZUxhYmVsIHVybExhYmVsOworCisgICAgQEluamVjdAorICAgIHB1YmxpYyBNYWluVGFi Q3VzdG9tVmlldygpIHsKKyAgICAgICAgaW5pdFdpZGdldChWaWV3VWlCaW5kZXIudWlCaW5kZXIu Y3JlYXRlQW5kQmluZFVpKHRoaXMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJs aWMgdm9pZCBzZXRDb250ZW50VXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgdXJsTGFiZWwuc2V0 VGV4dCh1cmwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9k dWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4v c2VjdGlvbi9tYWluL3ZpZXcvdGFiL01haW5UYWJDdXN0b21WaWV3LnVpLnhtbCBiL2Zyb250ZW5k L3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5l L3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi92aWV3L3RhYi9NYWluVGFiQ3VzdG9tVmlldy51aS54 bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczMWJlMgotLS0gL2Rldi9u dWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2 YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi92aWV3L3RhYi9NYWlu VGFiQ3VzdG9tVmlldy51aS54bWwKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4w IiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSB1aTpVaUJpbmRlciBTWVNURU0gImh0dHA6 Ly9kbC5nb29nbGUuY29tL2d3dC9EVEQveGh0bWwuZW50Ij4KKzx1aTpVaUJpbmRlciB4bWxuczp1 aT0idXJuOnVpOmNvbS5nb29nbGUuZ3d0LnVpYmluZGVyIiB4bWxuczpnPSJ1cm46aW1wb3J0OmNv bS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpIj4KKworCTxnOkhUTUxQYW5lbD4KKwkJVE9ETyBk aXNwbGF5IHRoaXMgVVJMOgorCQk8ZzpJbmxpbmVMYWJlbCB1aTpmaWVsZD0idXJsTGFiZWwiIC8+ CisJPC9nOkhUTUxQYW5lbD4KKworPC91aTpVaUJpbmRlcj4KZGlmZiAtLWdpdCBhL2Zyb250ZW5k L3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnht bCBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vd2ViYXBwL1dF Qi1JTkYvd2ViLnhtbAppbmRleCA1MzlkM2Q4Li5kYmY5M2EyIDEwMDY0NAotLS0gYS9mcm9udGVu ZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54 bWwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi93ZWJh cHAvV0VCLUlORi93ZWIueG1sCkBAIC0yMyw2ICsyMywxNiBAQAogCQk8dXJsLXBhdHRlcm4+L3dl YmFkbWluL1dlYkFkbWluLmh0bWw8L3VybC1wYXR0ZXJuPgogCTwvc2VydmxldC1tYXBwaW5nPgog CisJPHNlcnZsZXQ+CisJCTxzZXJ2bGV0LW5hbWU+UGx1Z2luU291cmNlUGFnZTwvc2VydmxldC1u YW1lPgorCQk8c2VydmxldC1jbGFzcz5vcmcub3ZpcnQuZW5naW5lLnVpLmZyb250ZW5kLnNlcnZl ci5nd3QuUGx1Z2luU291cmNlUGFnZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisJPC9zZXJ2bGV0 PgorCisJPHNlcnZsZXQtbWFwcGluZz4KKwkJPHNlcnZsZXQtbmFtZT5QbHVnaW5Tb3VyY2VQYWdl PC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vd2ViYWRtaW4vUGx1Z2luU291cmNlUGFn ZTwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBpbmc+CisKIAk8IS0tIERlZmF1bHQgcGFn ZSB0byBzZXJ2ZSAtLT4KIAk8d2VsY29tZS1maWxlLWxpc3Q+CiAJCTx3ZWxjb21lLWZpbGU+aW5k ZXguaHRtbDwvd2VsY29tZS1maWxlPgotLSAKMS43LjQuNAoK ------=_Part_15477537_1702327251.1346339532819--

UI plugin life-cycle, enforced by plugin infrastructure</strong><br style= =3D"font-weight: bold;"><br>The <em>PluginState</em> enumeration lists poss= ible states of a plugin during its runtime:<br><ul><li><span style=3D"font-= weight: bold;">DEFINED</span>: This is the initial state for all plugins. P= lugin meta-data has been read by <span style=3D"font-style: italic;">Plugin= Manager</span> and the corresponding iframe element has been created for th= e plugin. Note that at this point, the iframe element is not attached to DO= M yet.<br><br></li><li><span style=3D"font-weight: bold;">LOADING</span>: T= he iframe element for the plugin has been attached to DOM, which causes <u>=
------=_Part_15487246_1395069322.1346341179024 Content-Type: multipart/alternative; boundary="----=_Part_15487247_703636908.1346341179024" ------=_Part_15487247_703636908.1346341179024 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Hello everyone, as a follow-up to my last email on improving plugin API, here comes the latest revision of UI Plugins proof-of-concept patch (please find it attached). This patch is focused on improving JavaScript plugin API, along with important changes and improvements made to plugin infrastructure ( PluginManager ). Let's walk through the changes step by step. Improved plugin API, taking some inspiration from jQuery Following is a sample plugin code that uses new plugin API: var myPlugin = pluginApi('myPlugin'); // Obtain plugin API instance for 'myPlugin' var myPluginConfig = myPlugin.configObject(); // Obtain plugin-specific configuration // Register event handler functions to be invoked by WebAdmin // Note: all functions are optional, the plugin only defines functions for events it wants to handle myPlugin.register({ UiInit: function() { var testUrl = 'http://www.example.com/' + myPluginConfig.foo; // Assume plugin configuration has 'foo' attribute myPlugin.ui.addMainTab('Custom Tab', 'custom-tab', testUrl); // Invoke some operation using plugin API } }); myPlugin.ready(); // Event handler functions are registered, we are now ready to get initialized (UiInit) UI plugin life-cycle, enforced by plugin infrastructure The PluginState enumeration lists possible states of a plugin during its runtime: * DEFINED : This is the initial state for all plugins. Plugin meta-data has been read by PluginManager and the corresponding iframe element has been created for the plugin. Note that at this point, the iframe element is not attached to DOM yet. * LOADING : The iframe element for the plugin has been attached to DOM, which causes plugin host page (previously known as plugin source page) to be fetched asynchronously in the background. We are now waiting for plugin to report in as ready. In practice, due to JavaScript runtime being single-threaded, WebAdmin startup logic will continue to execute until the JavaScript runtime is "idle" (browser event loop returns), and at this point JavaScript plugin code gets invoked through the plugin host page. * READY : The plugin has indicated that it is ready for use. We assume the plugin has already registered its event handler object (object containing various event handler functions to be called by WebAdmin) at this point. We can now proceed with plugin initialization. * INITIALIZED : The plugin has been initialized by calling UiInit function on its event handler object. We can now call other event handler functions, the plugin is now initialized and in use. Note on plugin initialization: the UiInit function will be called just once during the lifetime of the plugin, after the plugin reports in as ready AND WebAdmin enters the state that allows plugins to be invoked (entering main section for logged-in users), and before other event handler functions are invoked by the plugin infrastructure. Plugin meta-data is now passed to client using different format Previously, plugin meta-data was embedded into WebAdmin host page as a simple JavaScript object, like so: var pluginDefinitions = { myPlugin: "<URL>", anotherPlugin: "<URL>" } Now, plugin meta-data is embedded into WebAdmin host page as a JavaScript array, like so: var pluginDefinitions = [ { name: "myPlugin", url: "<URL>", config: { "foo": 1, "bar": "whatever" } }, { name: "anotherPlugin", url: "<URL>" } ]; As you can see, pluginDefinitions is now an array of JavaScript objects, with each object representing plugin meta-data. The "name" and "url" attributes are mandatory (we need to check them when loading plugin descriptors). "config" is the plugin configuration (JSON) object, obtained by merging default plugin configuration (defined in plugin descriptor) with custom plugin configuration (defined in external plugin configuration file). Note that the "config" attribute is optional. In terms of Java classes, pluginDefinitions is mapped to PluginDefinitions overlay type, and each meta-data object within the array is mapped to PluginMetaData overlay type. Note on using assert statements in client code: you might notice that I'm using a lot of assert statements in Plugin class. This is to ensure consistency and guard against corrupted state during development. In GWT, assert statements work in a different way than in standard Java VM. When debugging GWT application using Development Mode, assert statements are checked and throw assertion errors during runtime (they are displayed in Development Mode console). However, when compiling GWT application to JavaScript (Production Mode), assert statements are removed by GWT compiler, so they don't affect the application running in Production Mode. Cheers, Vojtech ------=_Part_15487247_703636908.1346341179024 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,new york,times,serif; font-size: = 12pt; color: #000000'><div style=3D"color:#000;font-weight:normal;font-styl= e:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-s= ize:12pt;"><div style=3D"font-family: times new roman,new york,times,serif;= font-size: 12pt; color: #000000">Hello everyone,<br><br>as a follow-up to = my last email on improving plugin API, here comes the latest revision of UI= Plugins proof-of-concept patch (please find it attached).<br><br>This patc= h is focused on improving JavaScript plugin API, along with important chang= es and improvements made to plugin infrastructure (<em>PluginManager</em>).= Let's walk through the changes step by step.<br><br><hr style=3D"width: 10= 0%; height: 2px;"><br><strong>Improved plugin API, taking some inspiration = from jQuery</strong><br style=3D"font-weight: bold;"><br>Following is a sam= ple plugin code that uses new plugin API:<br><br><span style=3D"font-family= : courier new,courier,monaco,monospace,sans-serif;">var myPlugin =3D plugin= Api('myPlugin'); // Obtain plugin API instance for 'myPlugin'</span><br sty= le=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><span = style=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">var= myPluginConfig =3D myPlugin.configObject(); // Obtain plugin-specific conf= iguration</span><br style=3D"font-family: courier new,courier,monaco,monosp= ace,sans-serif;"><br style=3D"font-family: courier new,courier,monaco,monos= pace,sans-serif;"><span style=3D"font-family: courier new,courier,monaco,mo= nospace,sans-serif;">// Register event handler functions to be invoked by W= ebAdmin</span><br style=3D"font-family: courier new,courier,monaco,monospac= e,sans-serif;"><span style=3D"font-family: courier new,courier,monaco,monos= pace,sans-serif;">// Note: all functions are optional, the plugin only defi= nes functions for events it wants to handle</span><br style=3D"font-family:= courier new,courier,monaco,monospace,sans-serif;"><span style=3D"font-fami= ly: courier new,courier,monaco,monospace,sans-serif;">myPlugin.register({</= span><br style=3D"font-family: courier new,courier,monaco,monospace,sans-se= rif;"><span style=3D"font-family: courier new,courier,monaco,monospace,sans= -serif;"> UiInit: function() {</span><br style=3D"font-family: courie= r new,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: cou= rier new,courier,monaco,monospace,sans-serif;"> var testU= rl =3D 'http://www.example.com/' + myPluginConfig.foo; // Assume plugin con= figuration has 'foo' attribute</span><br style=3D"font-family: courier new,= courier,monaco,monospace,sans-serif;"><span style=3D"font-family: courier n= ew,courier,monaco,monospace,sans-serif;"> myPlugin.ui.add= MainTab('Custom Tab', 'custom-tab', testUrl); // Invoke some operation usin= g plugin API</span><br style=3D"font-family: courier new,courier,monaco,mon= ospace,sans-serif;"><span style=3D"font-family: courier new,courier,monaco,= monospace,sans-serif;"> }</span><br style=3D"font-family: courier new= ,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: courier = new,courier,monaco,monospace,sans-serif;">});</span><br style=3D"font-famil= y: courier new,courier,monaco,monospace,sans-serif;"><br style=3D"font-fami= ly: courier new,courier,monaco,monospace,sans-serif;"><span style=3D"font-f= amily: courier new,courier,monaco,monospace,sans-serif;">myPlugin.ready(); = // Event handler functions are registered, we are now ready to get initiali= zed (UiInit)</span><br style=3D"font-family: courier new,courier,monaco,mon= ospace,sans-serif;"><br><hr style=3D"width: 100%; height: 2px;"><br><strong= plugin host page</u> (previously known as plugin source page) to be fetched= asynchronously in the background. We are now waiting for plugin to report = in as ready. In practice, due to JavaScript runtime being single-threaded, = WebAdmin startup logic will continue to execute until the JavaScript runtim= e is "idle" (browser event loop returns), and at this point JavaScript plug= in code gets invoked through the plugin host page.<br><br></li><li><span st= yle=3D"font-weight: bold;">READY</span>: The plugin has indicated that it i= s ready for use. We assume the plugin has already registered its event hand= ler object (object containing various event handler functions to be called = by WebAdmin) at this point. We can now proceed with plugin initialization.<= br><br></li><li><span style=3D"font-weight: bold;">INITIALIZED</span>: The = plugin has been initialized by calling <span style=3D"font-style: italic;">= UiInit</span> function on its event handler object. We can now call other e= vent handler functions, the plugin is now initialized and in use.</li></ul>= <p><span style=3D"font-style: italic; text-decoration: underline;">Note on = plugin initialization:</span> the <span style=3D"font-style: italic;">UiIni= t</span> function will be called just once during the lifetime of the plugi= n, after the plugin reports in as ready AND WebAdmin enters the state that = allows plugins to be invoked (entering main section for logged-in users), a= nd before other event handler functions are invoked by the plugin infrastru= cture.</p><p><br></p><hr style=3D"width: 100%; height: 2px;"><br><p style= =3D"font-weight: bold;">Plugin meta-data is now passed to client using diff= erent format</p><p><br></p><p>Previously, plugin meta-data was embedded int= o WebAdmin host page as a simple JavaScript object, like so:</p><p><br></p>= <p style=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">= var pluginDefinitions =3D { myPlugin: "<URL>", anotherPlugin: "<UR= L>" }<br></p><p><br></p><p>Now, plugin meta-data is embedded into WebAdm= in host page as a JavaScript array, like so:<br></p><p><br></p><p style=3D"= font-family: courier new,courier,monaco,monospace,sans-serif;">var pluginDe= finitions =3D [</p><p style=3D"font-family: courier new,courier,monaco,mono= space,sans-serif;"> { name: "myPlugin", url: "<URL>", config: {= "foo": 1, "bar": "whatever" } },</p><p style=3D"font-family: courier new,c= ourier,monaco,monospace,sans-serif;"> { name: "anotherPlugin", url: "= <URL>" }<br></p><p style=3D"font-family: courier new,courier,monaco,m= onospace,sans-serif;">];</p><p><br></p><p>As you can see, <span style=3D"fo= nt-style: italic;">pluginDefinitions</span> is now an array of JavaScript o= bjects, with each object representing plugin meta-data. The "name" and "url= " attributes are mandatory (we need to check them when loading plugin descr= iptors). "config" is the plugin configuration (JSON) object, obtained by me= rging default plugin configuration (defined in plugin descriptor) with cust= om plugin configuration (defined in external plugin configuration file). No= te that the "config" attribute is optional.<br></p><p><br></p><p>In terms o= f Java classes, <span style=3D"font-style: italic;">pluginDefinitions</span=
is mapped to <span style=3D"font-style: italic;">PluginDefinitions</span>= overlay type, and each meta-data object within the array is mapped to <spa= n style=3D"font-style: italic;">PluginMetaData</span> overlay type.<br></p>= <p><br></p><hr style=3D"width: 100%; height: 2px;"><br><p><span style=3D"fo= nt-style: italic; text-decoration: underline;">Note on using assert stateme= nts in client code:</span> you might notice that I'm using a lot of assert = statements in <span style=3D"font-style: italic;">Plugin</span> class. This= is to ensure consistency and guard against corrupted state during developm= ent. In GWT, assert statements work in a different way than in standard Jav= a VM. When debugging GWT application using Development Mode, assert stateme= nts are checked and throw assertion errors during runtime (they are display= ed in Development Mode console). However, when compiling GWT application to= JavaScript (Production Mode), assert statements are removed by GWT compile= r, so they don't affect the application running in Production Mode.<br></p>= <p><br></p><p>Cheers,</p><p>Vojtech</p><p><br></p></div></div></div></body>= </html> ------=_Part_15487247_703636908.1346341179024--
------=_Part_15487246_1395069322.1346341179024 Content-Type: text/x-patch; name=WIP-UI-Plugins-PoC-revision-4.patch Content-Disposition: attachment; filename=WIP-UI-Plugins-PoC-revision-4.patch Content-Transfer-Encoding: base64 RnJvbSBlYjQ3NzlkYTZjODUxMmIwNjA3Mzk5ZTg4MzAwMWQxYmUwMzA1OGI4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBWb2p0ZWNoIFN6b2NzIDx2c3pvY3NAcmVkaGF0LmNvbT4KRGF0 ZTogVGh1LCAxOSBKdWwgMjAxMiAxNDo0ODo0MCArMDIwMApTdWJqZWN0OiBbUEFUQ0hdIFdJUDog VUkgUGx1Z2lucyBQb0MsIHJldmlzaW9uIDQKCkNoYW5nZS1JZDogSWJiZjc2NTlmMDIzZDg5Mjlm YjBhODMwMzA2MTg1MWJiN2VlNTU1YmMKU2lnbmVkLW9mZi1ieTogVm9qdGVjaCBTem9jcyA8dnN6 b2NzQHJlZGhhdC5jb20+Ci0tLQogLi4uL3NlcnZlci9nd3QvR3d0RHluYW1pY0hvc3RQYWdlU2Vy dmxldC5qYXZhICAgICAgfCAgICAxICsKIC4uLi9zZXJ2ZXIvZ3d0L1BsdWdpblNvdXJjZVBhZ2VT ZXJ2bGV0LmphdmEgICAgICAgIHwgIDEwNiArKysrKysrCiAuLi4vc2VydmVyL2d3dC9XZWJhZG1p bkR5bmFtaWNIb3N0aW5nU2VydmxldC5qYXZhICB8ICAgIDggKy0KIC4uLi9lbmdpbmUvdWkvd2Vi YWRtaW4vZ2luL0NsaWVudEdpbmplY3Rvci5qYXZhICAgIHwgICAgMiArLQogLi4uL292aXJ0L2Vu Z2luZS91aS93ZWJhZG1pbi9naW4vUGx1Z2luTW9kdWxlLmphdmEgfCAgIDMwICsrCiAuLi4vb3Zp cnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW4uamF2YSAgICB8ICAgNjcgKysrKysK IC4uLi91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRGVmaW5pdGlvbnMuamF2YSAgICAgIHwgICAy NCArKwogLi4uL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVudEhhbmRsZXIuamF2YSAgICAg fCAgIDE5ICsrCiAuLi4vZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5NYW5hZ2VyLmph dmEgICB8ICAyOTEgKysrKysrKysrKysrKysrKysrKysKIC4uLi9lbmdpbmUvdWkvd2ViYWRtaW4v cGx1Z2luL1BsdWdpbk1ldGFEYXRhLmphdmEgIHwgICAzNiArKysKIC4uLi9lbmdpbmUvdWkvd2Vi YWRtaW4vcGx1Z2luL1BsdWdpblN0YXRlLmphdmEgICAgIHwgICAzMyArKysKIC4uLi91aS93ZWJh ZG1pbi9wbHVnaW4vUGx1Z2luVWlGdW5jdGlvbnMuamF2YSAgICAgIHwgICAyNiArKwogLi4uL21h aW4vcHJlc2VudGVyL01haW5TZWN0aW9uUHJlc2VudGVyLmphdmEgICAgICAgfCAgIDE3ICstCiAu Li4vbWFpbi9wcmVzZW50ZXIvTWFpblRhYlBhbmVsUHJlc2VudGVyLmphdmEgICAgICB8ICAgMTAg KwogLi4uL21haW4vcHJlc2VudGVyL3RhYi9NYWluVGFiQ3VzdG9tUHJlc2VudGVyLmphdmEgfCAg IDQzICsrKwogLi4uL3RhYi9NYWluVGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIuamF2YSAgICAg ICAgfCAgIDQ3ICsrKysKIC4uLi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByb3h5 LmphdmEgICAgIHwgICA0NSArKysKIC4uLi9wcmVzZW50ZXIvdGFiL01haW5UYWJDdXN0b21Qcm94 eUZhY3RvcnkuamF2YSAgIHwgICAzNCArKysKIC4uLi9zZWN0aW9uL21haW4vdmlldy90YWIvTWFp blRhYkN1c3RvbVZpZXcuamF2YSAgIHwgICAzMiArKysKIC4uLi9zZWN0aW9uL21haW4vdmlldy90 YWIvTWFpblRhYkN1c3RvbVZpZXcudWkueG1sIHwgICAxMCArCiAuLi4vd2ViYWRtaW4vc3JjL21h aW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCAgICAgICB8ICAgMTAgKwogMjEgZmlsZXMgY2hhbmdl ZCwgODg3IGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQg ZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmly dC9lbmdpbmUvdWkvZnJvbnRlbmQvc2VydmVyL2d3dC9QbHVnaW5Tb3VyY2VQYWdlU2VydmxldC5q YXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1p bi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vZ2luL1BsdWdpbk1v ZHVsZS5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93 ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2lu L1BsdWdpbi5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl cy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1 Z2luL1BsdWdpbkRlZmluaXRpb25zLmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93 ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91 aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRXZlbnRIYW5kbGVyLmphdmEKIGNyZWF0ZSBtb2RlIDEw MDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3Jn L292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luTWFuYWdlci5qYXZhCiBjcmVh dGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFp bi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbk1ldGFEYXRh LmphdmEKIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFk bWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1 Z2luU3RhdGUuamF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWluL21vZHVs ZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3Bs dWdpbi9QbHVnaW5VaUZ1bmN0aW9ucy5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQv d2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUv dWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNl bnRlci5qYXZhCiBjcmVhdGUgbW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93 ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlv bi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNlbnRlclByb3ZpZGVyLmphdmEK IGNyZWF0ZSBtb2RlIDEwMDY0NCBmcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3Ny Yy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJl c2VudGVyL3RhYi9NYWluVGFiQ3VzdG9tUHJveHkuamF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZy b250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQv ZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvdGFiL01haW5UYWJDdXN0 b21Qcm94eUZhY3RvcnkuamF2YQogY3JlYXRlIG1vZGUgMTAwNjQ0IGZyb250ZW5kL3dlYmFkbWlu L21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFk bWluL3NlY3Rpb24vbWFpbi92aWV3L3RhYi9NYWluVGFiQ3VzdG9tVmlldy5qYXZhCiBjcmVhdGUg bW9kZSAxMDA2NDQgZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9q YXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ZpZXcvdGFiL01h aW5UYWJDdXN0b21WaWV3LnVpLnhtbAoKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21v ZHVsZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5k L3NlcnZlci9nd3QvR3d0RHluYW1pY0hvc3RQYWdlU2VydmxldC5qYXZhIGIvZnJvbnRlbmQvd2Vi YWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkv ZnJvbnRlbmQvc2VydmVyL2d3dC9Hd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0LmphdmEKaW5kZXgg ZjE5NzM5YS4uNjg1ZTY4NSAxMDA2NDQKLS0tIGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy9m cm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJvbnRlbmQvc2VydmVy L2d3dC9Hd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0LmphdmEKKysrIGIvZnJvbnRlbmQvd2ViYWRt aW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJv bnRlbmQvc2VydmVyL2d3dC9Hd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0LmphdmEKQEAgLTQ2LDYg KzQ2LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIEd3dER5bmFtaWNIb3N0UGFnZVNlcnZsZXQg ZXh0ZW5kcyBIdHRwU2VydmxldCB7CiAgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZs ZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJ T0V4Y2VwdGlvbiB7CiAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdy aXRlcigpOwogICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sOyBjaGFy c2V0PVVURi04Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJD YWNoZS1Db250cm9sIiwgIm5vLWNhY2hlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAog CiAgICAgICAgIHdyaXRlci5hcHBlbmQoIjwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPiIpOyAv LyROT04tTkxTLTEkCiAgICAgICAgIHdyaXRlci5hcHBlbmQoIjxtZXRhIGh0dHAtZXF1aXY9XCJj b250ZW50LXR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XCI+Iik7IC8v JE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvZnJvbnRl bmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZlci9nd3Qv UGx1Z2luU291cmNlUGFnZVNlcnZsZXQuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMv ZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3NlcnZl ci9nd3QvUGx1Z2luU291cmNlUGFnZVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwLi4xNTlmYWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRt aW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJv bnRlbmQvc2VydmVyL2d3dC9QbHVnaW5Tb3VyY2VQYWdlU2VydmxldC5qYXZhCkBAIC0wLDAgKzEs MTA2IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkuZnJvbnRlbmQuc2VydmVyLmd3dDsK KworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJl ZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRT dHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0 U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0 IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRp bC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0 Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0 UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsK KworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBh Y2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisvKioKKyAqIFJlbmRlcnMgdGhlIEhU TUwgc291cmNlIHBhZ2UgZm9yIHRoZSBnaXZlbiBVSSBwbHVnaW4uCisgKi8KK3B1YmxpYyBjbGFz cyBQbHVnaW5Tb3VyY2VQYWdlU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHBy aXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgcHJp dmF0ZSBzdGF0aWMgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBsdWdpblNvdXJjZVBh Z2VTZXJ2bGV0LmNsYXNzKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRv R2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3Bv bnNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBSZWFkIHBsdWdpbiBuYW1lIGFz IEhUVFAgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgICAgICAgU3RyaW5nIHBsdWdpbk5hbWUgPSByZXF1 ZXN0LmdldFBhcmFtZXRlcigicGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgaWYgKHBs dWdpbk5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJNaXNzaW5nIHBs dWdpbiBuYW1lIHJlcXVlc3QgcGFyYW1ldGVyIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAg IHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsK KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvY2F0ZSBwbHVn aW4gY29kZSBpbiBsb2NhbCBmaWxlIHN5c3RlbQorICAgICAgICAvLyBUT0RPIGhhcmQtY29kZWQg cGx1Z2luIGxvY2F0aW9uCisgICAgICAgIEZpbGUgcGx1Z2luQ29kZUxvY2F0aW9uID0gbmV3IEZp bGUoIi9ob21lL3Zzem9jcy9Eb3dubG9hZHMiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBGaWxl IHBsdWdpbkNvZGVGaWxlID0gbmV3IEZpbGUocGx1Z2luQ29kZUxvY2F0aW9uLCBwbHVnaW5OYW1l ICsgIi5qcyIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIGlmICghcGx1Z2luQ29kZUZpbGUuaXNG aWxlKCkgfHwgIXBsdWdpbkNvZGVGaWxlLmNhblJlYWQoKSkgeworICAgICAgICAgICAgbG9nZ2Vy LmVycm9yKCJDYW5ub3QgcmVhZCBwbHVnaW4gY29kZTogIiArIHBsdWdpbkNvZGVGaWxlLmdldEFi c29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVy cm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgICAgIHJldHVy bjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE8gc2ltdWxhdGUgcGx1Z2luIGRlcGVuZGVu Y2llcworICAgICAgICBMaXN0PFN0cmluZz4gcGx1Z2luRGVwZW5kZW5jeUxpc3QgPQorICAgICAg ICAgICAgICAgIEFycmF5cy5hc0xpc3QoImh0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4 L2xpYnMvanF1ZXJ5LzEuNy4yL2pxdWVyeS5taW4uanMiKTsgLy8kTk9OLU5MUy0xJAorCisgICAg ICAgIC8vIFJlbmRlciBIVE1MIHNvdXJjZSBwYWdlIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgcmVz cG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIpOyAvLyROT04t TkxTLTEkCisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsICJuby1j YWNoZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworICAgICAgICBSZWFkZXIgaW4g PSBudWxsOworICAgICAgICBXcml0ZXIgb3V0ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAg ICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG5l dyBGaWxlSW5wdXRTdHJlYW0ocGx1Z2luQ29kZUZpbGUpLCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMt MSQKKyAgICAgICAgICAgIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFt V3JpdGVyKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMt MSQKKworICAgICAgICAgICAgcmVuZGVyUGx1Z2luU291cmNlUGFnZShpbiwgcGx1Z2luRGVwZW5k ZW5jeUxpc3QsIG91dCk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgfSBmaW5h bGx5IHsKKyAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW4u Y2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVu ZGVyUGx1Z2luU291cmNlUGFnZShSZWFkZXIgcGx1Z2luQ29kZUlucHV0LCBMaXN0PFN0cmluZz4g cGx1Z2luRGVwZW5kZW5jeUxpc3QsIFdyaXRlciBvdXRwdXQpCisgICAgICAgICAgICB0aHJvd3Mg SU9FeGNlcHRpb24geworICAgICAgICBvdXRwdXQud3JpdGUoIjwhRE9DVFlQRSBodG1sPjxodG1s PjxoZWFkPiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIG91dHB1dC53cml0ZSgiPG1ldGEgaHR0 cC1lcXVpdj1cImNvbnRlbnQtdHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRG LThcIj4iKTsgLy8kTk9OLU5MUy0xJAorCisgICAgICAgIGZvciAoU3RyaW5nIGRlcGVuZGVuY3kg OiBwbHVnaW5EZXBlbmRlbmN5TGlzdCkgeworICAgICAgICAgICAgb3V0cHV0LndyaXRlKCI8c2Ny aXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCIiKTsgLy8kTk9OLU5MUy0xJAorICAg ICAgICAgICAgb3V0cHV0LndyaXRlKGRlcGVuZGVuY3kpOworICAgICAgICAgICAgb3V0cHV0Lndy aXRlKCJcIj48L3NjcmlwdD4iKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisKKyAgICAgICAg b3V0cHV0LndyaXRlKCI8L2hlYWQ+PGJvZHk+Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgb3V0 cHV0LndyaXRlKCI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj4iKTsgLy8kTk9OLU5M Uy0xJAorICAgICAgICBvdXRwdXQud3JpdGUoIihmdW5jdGlvbiggcGx1Z2luQXBpICkgeyIpOyAv LyROT04tTkxTLTEkCisKKyAgICAgICAgY29weUNoYXJzKHBsdWdpbkNvZGVJbnB1dCwgb3V0cHV0 KTsKKworICAgICAgICBvdXRwdXQud3JpdGUoIn0pICggcGFyZW50LnBsdWdpbkFwaSApOyIpOyAv LyROT04tTkxTLTEkCisgICAgICAgIG91dHB1dC53cml0ZSgiPC9zY3JpcHQ+Iik7IC8vJE5PTi1O TFMtMSQKKyAgICAgICAgb3V0cHV0LndyaXRlKCI8L2JvZHk+PC9odG1sPiIpOyAvLyROT04tTkxT LTEkCisgICAgfQorCisgICAgdm9pZCBjb3B5Q2hhcnMoUmVhZGVyIGluLCBXcml0ZXIgb3V0KSB0 aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbNCAq IDEwMjRdOyAvLyBVc2UgNCBrQiBidWZmZXIKKyAgICAgICAgaW50IG51bVJlYWQgPSAwOworCisg ICAgICAgIHdoaWxlICgobnVtUmVhZCA9IGluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3Ro KSkgPiAwKSB7CisgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBudW1SZWFkKTsKKyAg ICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl cy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvZnJvbnRlbmQvc2Vy dmVyL2d3dC9XZWJhZG1pbkR5bmFtaWNIb3N0aW5nU2VydmxldC5qYXZhIGIvZnJvbnRlbmQvd2Vi YWRtaW4vbW9kdWxlcy9mcm9udGVuZC9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkv ZnJvbnRlbmQvc2VydmVyL2d3dC9XZWJhZG1pbkR5bmFtaWNIb3N0aW5nU2VydmxldC5qYXZhCmlu ZGV4IDQyOGRjYzUuLjY4M2NiNjggMTAwNjQ0Ci0tLSBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVs ZXMvZnJvbnRlbmQvc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL2Zyb250ZW5kL3Nl cnZlci9nd3QvV2ViYWRtaW5EeW5hbWljSG9zdGluZ1NlcnZsZXQuamF2YQorKysgYi9mcm9udGVu ZC93ZWJhZG1pbi9tb2R1bGVzL2Zyb250ZW5kL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2lu ZS91aS9mcm9udGVuZC9zZXJ2ZXIvZ3d0L1dlYmFkbWluRHluYW1pY0hvc3RpbmdTZXJ2bGV0Lmph dmEKQEAgLTMwLDE4ICszMCwyMiBAQCBwdWJsaWMgY2xhc3MgV2ViYWRtaW5EeW5hbWljSG9zdGlu Z1NlcnZsZXQgZXh0ZW5kcyBHd3REeW5hbWljSG9zdFBhZ2VTZXJ2bGV0IHsKICAgICAgICAgc3Vw ZXIud3JpdGVBZGRpdGlvbmFsSnNEYXRhKHJlcXVlc3QsIHdyaXRlcik7CiAKICAgICAgICAgSW50 ZWdlciBhcHBsaWNhdGlvbk1vZGUgPSBnZXRBcHBsaWNhdGlvbk1vZGUocmVxdWVzdCk7Ci0KICAg ICAgICAgaWYgKGFwcGxpY2F0aW9uTW9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBNYXA8U3Ry aW5nLCBTdHJpbmc+IGFwcE1vZGVEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7 CiAgICAgICAgICAgICBhcHBNb2RlRGF0YS5wdXQoInZhbHVlIiwgU3RyaW5nLnZhbHVlT2YoYXBw bGljYXRpb25Nb2RlKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIHdyaXRlSnNPYmplY3Qo d3JpdGVyLCAiYXBwbGljYXRpb25Nb2RlIiwgYXBwTW9kZURhdGEpOyAvLyROT04tTkxTLTEkCiAg ICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWlsZGVyIHBsdWdpbkRlZmluaXRpb25zID0gbmV3 IFN0cmluZ0J1aWxkZXIoIiB2YXIgcGx1Z2luRGVmaW5pdGlvbnMgPSBbICIpOyAvLyROT04tTkxT LTEkCisgICAgICAgIHBsdWdpbkRlZmluaXRpb25zLmFwcGVuZCgieyBuYW1lOiBcIm15UGx1Z2lu XCIsIHVybDogXCIvd2ViYWRtaW4vd2ViYWRtaW4vUGx1Z2luU291cmNlUGFnZT9wbHVnaW49bXlQ bHVnaW5cIiwgY29uZmlnOiB7IFwiZm9vXCI6IDEgfSB9Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAg ICAgcGx1Z2luRGVmaW5pdGlvbnMuYXBwZW5kKCIgXTsgIik7IC8vJE5PTi1OTFMtMSQKKyAgICAg ICAgd3JpdGVyLmFwcGVuZChwbHVnaW5EZWZpbml0aW9ucy50b1N0cmluZygpKTsKICAgICB9CiAK ICAgICBwcml2YXRlIEludGVnZXIgZ2V0QXBwbGljYXRpb25Nb2RlKEh0dHBTZXJ2bGV0UmVxdWVz dCByZXF1ZXN0KSB7CiAgICAgICAgIHJldHVybiAoSW50ZWdlcikgcnVuUHVibGljUXVlcnkoVmRj UXVlcnlUeXBlLkdldENvbmZpZ3VyYXRpb25WYWx1ZSwKICAgICAgICAgICAgICAgICBuZXcgR2V0 Q29uZmlndXJhdGlvblZhbHVlUGFyYW1ldGVycyhDb25maWd1cmF0aW9uVmFsdWVzLkFwcGxpY2F0 aW9uTW9kZSwKLSAgICAgICAgICAgICAgICBDb25maWcuRGVmYXVsdENvbmZpZ3VyYXRpb25WZXJz aW9uKSwgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuRGVmYXVsdENv bmZpZ3VyYXRpb25WZXJzaW9uKSwgcmVxdWVzdCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9m cm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0 L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vQ2xpZW50R2luamVjdG9yLmphdmEgYi9mcm9udGVuZC93 ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91 aS93ZWJhZG1pbi9naW4vQ2xpZW50R2luamVjdG9yLmphdmEKaW5kZXggZDI3MmMyYi4uYmFiZGRm MSAxMDA2NDQKLS0tIGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFp bi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vZ2luL0NsaWVudEdpbmplY3Rvci5q YXZhCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2 YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL2dpbi9DbGllbnRHaW5qZWN0b3IuamF2YQpA QCAtOSw3ICs5LDcgQEAgaW1wb3J0IGNvbS5nd3RwbGF0Zm9ybS5tdnAuY2xpZW50LmFubm90YXRp b25zLkRlZmF1bHRHYXRla2VlcGVyOwogLyoqCiAgKiBDbGllbnQtc2lkZSBpbmplY3RvciBjb25m aWd1cmF0aW9uIHVzZWQgdG8gYm9vdHN0cmFwIEdJTi4KICAqLwotQEdpbk1vZHVsZXMoeyBTeXN0 ZW1Nb2R1bGUuY2xhc3MsIFByZXNlbnRlck1vZHVsZS5jbGFzcywgVWlDb21tb25Nb2R1bGUuY2xh c3MgfSkKK0BHaW5Nb2R1bGVzKHsgU3lzdGVtTW9kdWxlLmNsYXNzLCBQcmVzZW50ZXJNb2R1bGUu Y2xhc3MsIFVpQ29tbW9uTW9kdWxlLmNsYXNzLCBQbHVnaW5Nb2R1bGUuY2xhc3MgfSkKIHB1Ymxp YyBpbnRlcmZhY2UgQ2xpZW50R2luamVjdG9yIGV4dGVuZHMgQmFzZUNsaWVudEdpbmplY3Rvciwg TWFuYWdlZENvbXBvbmVudHMgewogCiAgICAgQERlZmF1bHRHYXRla2VlcGVyCmRpZmYgLS1naXQg YS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292 aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9naW4vUGx1Z2luTW9kdWxlLmphdmEgYi9mcm9udGVuZC93 ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91 aS93ZWJhZG1pbi9naW4vUGx1Z2luTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMC4uMzU4NDRjMAotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWlu L21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFk bWluL2dpbi9QbHVnaW5Nb2R1bGUuamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIG9yZy5v dmlydC5lbmdpbmUudWkud2ViYWRtaW4uZ2luOworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51 aS53ZWJhZG1pbi5wbHVnaW4uUGx1Z2luRXZlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5vdmlydC5l bmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLlBsdWdpbk1hbmFnZXI7CitpbXBvcnQgb3JnLm92aXJ0 LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW4uUGx1Z2luVWlGdW5jdGlvbnM7CitpbXBvcnQgb3Jn Lm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zZWN0aW9uLm1haW4ucHJlc2VudGVyLnRhYi5NYWlu VGFiQ3VzdG9tUHJlc2VudGVyOworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4u c2VjdGlvbi5tYWluLnByZXNlbnRlci50YWIuTWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeTsKK2lt cG9ydCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi52aWV3LnRhYi5N YWluVGFiQ3VzdG9tVmlldzsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmluamVjdC5jbGllbnQu QWJzdHJhY3RHaW5Nb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwor CisvKioKKyAqIEdJTiBtb2R1bGUgY29udGFpbmluZyBXZWJBZG1pbiBVSSBwbHVnaW4gaW5mcmFz dHJ1Y3R1cmUgYmluZGluZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBQbHVnaW5Nb2R1bGUgZXh0ZW5k cyBBYnN0cmFjdEdpbk1vZHVsZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9p ZCBjb25maWd1cmUoKSB7CisgICAgICAgIGJpbmQoUGx1Z2luTWFuYWdlci5jbGFzcykuYXNFYWdl clNpbmdsZXRvbigpOworICAgICAgICBiaW5kKFBsdWdpbkV2ZW50SGFuZGxlci5jbGFzcykuYXNF YWdlclNpbmdsZXRvbigpOworICAgICAgICBiaW5kKFBsdWdpblVpRnVuY3Rpb25zLmNsYXNzKS5p bihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgIC8vIEJpbmQgTWFpblRhYkN1c3RvbVZpZXcg dG8gaXRzIHZpZXcgaW50ZXJmYWNlIGFzIG5vbi1zaW5nbGV0b24sIHdpdGhvdXQgcHJlc2VudGVy IGJpbmRpbmcKKyAgICAgICAgLy8gKE1haW5UYWJDdXN0b21QcmVzZW50ZXIgaXMgY3JlYXRlZCBt YW51YWxseSBkdXJpbmcgcnVudGltZSBieSBNYWluVGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIp CisgICAgICAgIGJpbmQoTWFpblRhYkN1c3RvbVByZXNlbnRlci5WaWV3RGVmLmNsYXNzKS50byhN YWluVGFiQ3VzdG9tVmlldy5jbGFzcyk7CisgICAgICAgIGJpbmQoTWFpblRhYkN1c3RvbVByb3h5 RmFjdG9yeS5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICB9CisKK30KZGlmZiAtLWdp dCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcv b3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW4uamF2YSBiL2Zyb250ZW5kL3dl YmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3Vp L3dlYmFkbWluL3BsdWdpbi9QbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi41NjI0YjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9k dWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4v cGx1Z2luL1BsdWdpbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2Ugb3JnLm92aXJ0LmVu Z2luZS51aS53ZWJhZG1pbi5wbHVnaW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNs aWVudC5KYXZhU2NyaXB0T2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQu SUZyYW1lRWxlbWVudDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgVUkgcGx1Z2luLCBjb250YWlu aW5nIG1ldGEtZGF0YSBhcyB3ZWxsIGFzIHJ1bnRpbWUgc3RhdGUuCisgKi8KK3B1YmxpYyBjbGFz cyBQbHVnaW4geworCisgICAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5NZXRhRGF0YSBtZXRhRGF0YTsK KyAgICBwcml2YXRlIFBsdWdpblN0YXRlIHN0YXRlOworCisgICAgLy8gVGhlIGlmcmFtZSBlbGVt ZW50IHVzZWQgdG8gbG9hZCB0aGUgcGx1Z2luIGhvc3QgcGFnZQorICAgIHByaXZhdGUgZmluYWwg SUZyYW1lRWxlbWVudCBpZnJhbWU7CisKKyAgICAvLyBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgcGx1 Z2luIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zCisgICAgcHJpdmF0ZSBKYXZhU2NyaXB0T2JqZWN0 IGV2ZW50SGFuZGxlck9iamVjdDsKKworICAgIHB1YmxpYyBQbHVnaW4oUGx1Z2luTWV0YURhdGEg bWV0YURhdGEsIElGcmFtZUVsZW1lbnQgaWZyYW1lKSB7CisgICAgICAgIGFzc2VydCBtZXRhRGF0 YSAhPSBudWxsIDogIlBsdWdpbiBtZXRhLWRhdGEgY2Fubm90IGJlIG51bGwiOyAvLyROT04tTkxT LTEkCisgICAgICAgIGFzc2VydCBpZnJhbWUgIT0gbnVsbCA6ICJQbHVnaW4gaWZyYW1lIGVsZW1l bnQgY2Fubm90IGJlIG51bGwiOyAvLyROT04tTkxTLTEkCisgICAgICAgIGFzc2VydCBpZnJhbWUu Z2V0UGFyZW50RWxlbWVudCgpID09IG51bGwgOiAiUGx1Z2luIGlmcmFtZSBlbGVtZW50IG11c3Qg YmUgZGV0YWNoZWQgZnJvbSBET00iOyAvLyROT04tTkxTLTEkCisgICAgICAgIHRoaXMubWV0YURh dGEgPSBtZXRhRGF0YTsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IFBsdWdpblN0YXRlLkRFRklORUQ7 CisgICAgICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lOworICAgIH0KKworICAgIHB1YmxpYyBQbHVn aW5NZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFEYXRhOworICAg IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5TdGF0ZShQbHVnaW5TdGF0ZSBzdGF0ZSkgewor ICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PSBzdGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMg dm9pZCBtYXJrQXNMb2FkaW5nKCkgeworICAgICAgICBhc3NlcnQgc3RhdGUgPT0gUGx1Z2luU3Rh dGUuREVGSU5FRCA6ICJVbmV4cGVjdGVkIHN0YXRlIHRyYW5zaXRpb24iOyAvLyROT04tTkxTLTEk CisgICAgICAgIGFzc2VydCBpZnJhbWUuZ2V0UGFyZW50RWxlbWVudCgpICE9IG51bGwgOiAiUGx1 Z2luIGlmcmFtZSBlbGVtZW50IG11c3QgYmUgYXR0YWNoZWQgdG8gRE9NIjsgLy8kTk9OLU5MUy0x JAorICAgICAgICBzdGF0ZSA9IFBsdWdpblN0YXRlLkxPQURJTkc7CisgICAgfQorCisgICAgcHVi bGljIHZvaWQgbWFya0FzUmVhZHkoKSB7CisgICAgICAgIGFzc2VydCBzdGF0ZSA9PSBQbHVnaW5T dGF0ZS5MT0FESU5HIDogIlVuZXhwZWN0ZWQgc3RhdGUgdHJhbnNpdGlvbiI7IC8vJE5PTi1OTFMt MSQKKyAgICAgICAgYXNzZXJ0IGV2ZW50SGFuZGxlck9iamVjdCAhPSBudWxsIDogIkV2ZW50IGhh bmRsZXIgb2JqZWN0IG11c3QgYmUgYXNzaWduZWQiOyAvLyROT04tTkxTLTEkCisgICAgICAgIHN0 YXRlID0gUGx1Z2luU3RhdGUuUkVBRFk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFya0Fz SW5pdGlhbGl6ZWQoKSB7CisgICAgICAgIGFzc2VydCBzdGF0ZSA9PSBQbHVnaW5TdGF0ZS5SRUFE WSA6ICJVbmV4cGVjdGVkIHN0YXRlIHRyYW5zaXRpb24iOyAvLyROT04tTkxTLTEkCisgICAgICAg IHN0YXRlID0gUGx1Z2luU3RhdGUuSU5JVElBTElaRUQ7CisgICAgfQorCisgICAgcHVibGljIElG cmFtZUVsZW1lbnQgZ2V0SUZyYW1lRWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGlmcmFtZTsK KyAgICB9CisKKyAgICBwdWJsaWMgSmF2YVNjcmlwdE9iamVjdCBnZXRFdmVudEhhbmRsZXJPYmpl Y3QoKSB7CisgICAgICAgIHJldHVybiBldmVudEhhbmRsZXJPYmplY3Q7CisgICAgfQorCisgICAg cHVibGljIHZvaWQgc2V0RXZlbnRIYW5kbGVyT2JqZWN0KEphdmFTY3JpcHRPYmplY3QgZXZlbnRI YW5kbGVyT2JqZWN0KSB7CisgICAgICAgIGFzc2VydCBldmVudEhhbmRsZXJPYmplY3QgIT0gbnVs bCA6ICJFdmVudCBoYW5kbGVyIG9iamVjdCBjYW5ub3QgYmUgbnVsbCI7IC8vJE5PTi1OTFMtMSQK KyAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJPYmplY3QgPSBldmVudEhhbmRsZXJPYmplY3Q7Cisg ICAgfQorCit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWlu L3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2lu RGVmaW5pdGlvbnMuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3Jj L21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5EZWZp bml0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYzhkOTgK LS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3Ny Yy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luRGVm aW5pdGlvbnMuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUu dWkud2ViYWRtaW4ucGx1Z2luOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQu SmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0Fy cmF5OworCisvKioKKyAqIE92ZXJsYXkgdHlwZSBmb3Ige0Bjb2RlIHBsdWdpbkRlZmluaXRpb25z fSBnbG9iYWwgSlMgb2JqZWN0LgorICogPHA+CisgKiBTZXJ2ZXMgYXMge0BsaW5rIFBsdWdpbk1l dGFEYXRhfSBhZ2dyZWdhdGUgb2JqZWN0ICh1c2luZyBuYXRpdmUgYXJyYXkgcmVwcmVzZW50YXRp b24pLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGx1Z2luRGVmaW5pdGlvbnMgZXh0ZW5kcyBK YXZhU2NyaXB0T2JqZWN0IHsKKworICAgIHByb3RlY3RlZCBQbHVnaW5EZWZpbml0aW9ucygpIHsK KyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBQbHVnaW5EZWZpbml0aW9ucyBpbnN0 YW5jZSgpIC8qLXsKKyAgICAgICAgcmV0dXJuICR3bmQucGx1Z2luRGVmaW5pdGlvbnM7CisgICAg fS0qLzsKKworICAgIHB1YmxpYyBuYXRpdmUgSnNBcnJheTxQbHVnaW5NZXRhRGF0YT4gZ2V0TWV0 YURhdGFBcnJheSgpICAvKi17CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0tKi87CisKK30K ZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4v amF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVudEhhbmRs ZXIuamF2YSBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2 YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5FdmVudEhhbmRsZXIu amF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjVmYzc1Ci0tLSAvZGV2 L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9q YXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbkV2ZW50SGFuZGxl ci5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJh ZG1pbi5wbHVnaW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuRXZlbnRC dXM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIEhhbmRsZXMg V2ViQWRtaW4gYXBwbGljYXRpb24gZXZlbnRzIChleHRlbnNpb24gcG9pbnRzKSB0byBiZSBjb25z dW1lZCBieSBVSSBwbHVnaW5zLgorICogPHA+CisgKiBTaG91bGQgYmUgYm91bmQgYXMgR0lOIGVh Z2VyIHNpbmdsZXRvbiwgY3JlYXRlZCBlYXJseSBvbiBkdXJpbmcgYXBwbGljYXRpb24gc3RhcnR1 cC4KKyAqLworcHVibGljIGNsYXNzIFBsdWdpbkV2ZW50SGFuZGxlciB7CisKKyAgICBASW5qZWN0 CisgICAgcHVibGljIFBsdWdpbkV2ZW50SGFuZGxlcihFdmVudEJ1cyBldmVudEJ1cywgUGx1Z2lu TWFuYWdlciBtYW5hZ2VyKSB7CisgICAgICAgIC8vIFRPRE8gY2FsbCBFdmVudEJ1cy5hZGRIYW5k bGVyIGZvciBlYWNoIGV4dGVuc2lvbiBwb2ludCAoZXZlbnQpLAorICAgICAgICAvLyB3aXRoIHRo ZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uIHVzaW5nIFBsdWdpbk1hbmFnZXIgdG8gY2FsbCBwbHVn aW5zCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dl YmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4v UGx1Z2luTWFuYWdlci5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9z cmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbk1h bmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmIzZTM0Ci0t LSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMv bWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1Z2luL1BsdWdpbk1hbmFn ZXIuamF2YQpAQCAtMCwwICsxLDI5MSBAQAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLndl YmFkbWluLnBsdWdpbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGph dmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGls LmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2 YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5 OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQuRG9jdW1lbnQ7CitpbXBvcnQgY29t Lmdvb2dsZS5nd3QuZG9tLmNsaWVudC5JRnJhbWVFbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUu Z3d0LmRvbS5jbGllbnQuU3R5bGUuQm9yZGVyU3R5bGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Qu ZG9tLmNsaWVudC5TdHlsZS5Qb3NpdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xp ZW50LlN0eWxlLlVuaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCisvKioK KyAqIFRoZSBtYWluIGNvbXBvbmVudCBvZiBXZWJBZG1pbiBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1 cmUuCisgKiA8cD4KKyAqIFNob3VsZCBiZSBib3VuZCBhcyBHSU4gZWFnZXIgc2luZ2xldG9uLCBj cmVhdGVkIGVhcmx5IG9uIGR1cmluZyBhcHBsaWNhdGlvbiBzdGFydHVwLgorICovCitwdWJsaWMg Y2xhc3MgUGx1Z2luTWFuYWdlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIg bG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihQbHVnaW5NYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7 CisKKyAgICAvLyBNYXBzIHBsdWdpbiBuYW1lcyB0byBjb3JyZXNwb25kaW5nIG9iamVjdCByZXBy ZXNlbnRhdGlvbnMKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFBsdWdpbj4gcGx1Z2lu cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGx1Z2luPigpOworCisgICAgLy8gQ29udHJvbHMgcGx1 Z2luIGludm9jYXRpb24sIGFsbG93aW5nIFdlYkFkbWluIHRvIGNhbGwgcGx1Z2lucyBvbmx5IGlu IGEgc3BlY2lmaWMgY29udGV4dAorICAgIHByaXZhdGUgYm9vbGVhbiBjYW5JbnZva2VQbHVnaW5z ID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGZpbmFsIFBsdWdpblVpRnVuY3Rpb25zIHVpRnVuY3Rp b25zOworCisgICAgQEluamVjdAorICAgIHB1YmxpYyBQbHVnaW5NYW5hZ2VyKFBsdWdpblVpRnVu Y3Rpb25zIHVpRnVuY3Rpb25zKSB7CisgICAgICAgIHRoaXMudWlGdW5jdGlvbnMgPSB1aUZ1bmN0 aW9uczsKKyAgICAgICAgZXhwb3NlUGx1Z2luQXBpKCk7CisgICAgICAgIGRlZmluZUFuZExvYWRQ bHVnaW5zKCk7CisgICAgfQorCisgICAgUGx1Z2luIGdldFBsdWdpbihTdHJpbmcgcGx1Z2luTmFt ZSkgeworICAgICAgICByZXR1cm4gcGx1Z2lucy5nZXQocGx1Z2luTmFtZSk7CisgICAgfQorCisg ICAgQ29sbGVjdGlvbjxQbHVnaW4+IGdldFBsdWdpbnMoKSB7CisgICAgICAgIHJldHVybiBwbHVn aW5zLnZhbHVlcygpOworICAgIH0KKworICAgIHZvaWQgYWRkUGx1Z2luKFN0cmluZyBwbHVnaW5O YW1lLCBQbHVnaW4gcGx1Z2luKSB7CisgICAgICAgIHBsdWdpbnMucHV0KHBsdWdpbk5hbWUsIHBs dWdpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyBhbGwgcGx1Z2lucyB0aGF0 IHdlcmUgZGV0ZWN0ZWQgd2hlbiBzZXJ2aW5nIFdlYkFkbWluIGhvc3QgcGFnZSBhbmQgbG9hZHMg dGhlbSBhcyBuZWNlc3NhcnkuCisgICAgICovCisgICAgdm9pZCBkZWZpbmVBbmRMb2FkUGx1Z2lu cygpIHsKKyAgICAgICAgUGx1Z2luRGVmaW5pdGlvbnMgZGVmaW5pdGlvbnMgPSBQbHVnaW5EZWZp bml0aW9ucy5pbnN0YW5jZSgpOworCisgICAgICAgIGlmIChkZWZpbml0aW9ucyAhPSBudWxsKSB7 CisgICAgICAgICAgICBKc0FycmF5PFBsdWdpbk1ldGFEYXRhPiBtZXRhRGF0YUFycmF5ID0gZGVm aW5pdGlvbnMuZ2V0TWV0YURhdGFBcnJheSgpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0g MDsgaSA8IG1ldGFEYXRhQXJyYXkubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFBs dWdpbk1ldGFEYXRhIHBsdWdpbk1ldGFEYXRhID0gbWV0YURhdGFBcnJheS5nZXQoaSk7CisKKyAg ICAgICAgICAgICAgICBpZiAocGx1Z2luTWV0YURhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAg ICAgICAgICBkZWZpbmVBbmRMb2FkUGx1Z2luKHBsdWdpbk1ldGFEYXRhKTsKKyAgICAgICAgICAg ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAg KiBEZWZpbmVzIGEgcGx1Z2luIGZyb20gdGhlIGdpdmVuIG1ldGEtZGF0YSBhbmQgbG9hZHMgaXQg YXMgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHZvaWQgZGVmaW5lQW5kTG9hZFBsdWdpbihQbHVn aW5NZXRhRGF0YSBwbHVnaW5NZXRhRGF0YSkgeworICAgICAgICBTdHJpbmcgcGx1Z2luTmFtZSA9 IHBsdWdpbk1ldGFEYXRhLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHBsdWdpbkhvc3RQYWdl VXJsID0gcGx1Z2luTWV0YURhdGEuZ2V0SG9zdFBhZ2VVcmwoKTsKKworICAgICAgICBpZiAoZ2V0 UGx1Z2luKHBsdWdpbk5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuaW5n KCJQbHVnaW4gIiArIHBsdWdpbk5hbWUgKyAiIGlzIGFscmVhZHkgZGVmaW5lZCIpOyAvLyROT04t TkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisg ICAgICAgIC8vIENyZWF0ZSBhbiBpZnJhbWUgZWxlbWVudCB1c2VkIHRvIGxvYWQgdGhlIHBsdWdp biBob3N0IHBhZ2UKKyAgICAgICAgSUZyYW1lRWxlbWVudCBpZnJhbWUgPSBEb2N1bWVudC5nZXQo KS5jcmVhdGVJRnJhbWVFbGVtZW50KCk7CisgICAgICAgIGlmcmFtZS5zZXRTcmMocGx1Z2luSG9z dFBhZ2VVcmwpOworICAgICAgICBpZnJhbWUuc2V0RnJhbWVCb3JkZXIoMCk7CisgICAgICAgIGlm cmFtZS5nZXRTdHlsZSgpLnNldFBvc2l0aW9uKFBvc2l0aW9uLkFCU09MVVRFKTsKKyAgICAgICAg aWZyYW1lLmdldFN0eWxlKCkuc2V0V2lkdGgoMCwgVW5pdC5QVCk7CisgICAgICAgIGlmcmFtZS5n ZXRTdHlsZSgpLnNldEhlaWdodCgwLCBVbml0LlBUKTsKKyAgICAgICAgaWZyYW1lLmdldFN0eWxl KCkuc2V0Qm9yZGVyU3R5bGUoQm9yZGVyU3R5bGUuTk9ORSk7CisKKyAgICAgICAgUGx1Z2luIHBs dWdpbiA9IG5ldyBQbHVnaW4ocGx1Z2luTWV0YURhdGEsIGlmcmFtZSk7CisgICAgICAgIGFkZFBs dWdpbihwbHVnaW5OYW1lLCBwbHVnaW4pOworICAgICAgICBsb2dnZXIuaW5mbygiUGx1Z2luICIg KyBwbHVnaW5OYW1lICsgIiBpcyBkZWZpbmVkIHRvIGJlIGxvYWRlZCBmcm9tIFVSTCAiICsgcGx1 Z2luSG9zdFBhZ2VVcmwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworICAgICAgICAv LyBUT0RPIGludHJvZHVjZSBzb21lICdsb2FkT25TdGFydHVwJyBhdHRyaWJ1dGUgaW4gZnV0dXJl CisgICAgICAgIGxvYWRQbHVnaW4ocGx1Z2luKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBM b2FkcyB0aGUgZ2l2ZW4gcGx1Z2luIGJ5IGF0dGFjaGluZyB0aGUgY29ycmVzcG9uZGluZyBpZnJh bWUgZWxlbWVudCB0byBET00uCisgICAgICovCisgICAgdm9pZCBsb2FkUGx1Z2luKFBsdWdpbiBw bHVnaW4pIHsKKyAgICAgICAgaWYgKHBsdWdpbi5pc0luU3RhdGUoUGx1Z2luU3RhdGUuREVGSU5F RCkpIHsKKyAgICAgICAgICAgIERvY3VtZW50LmdldCgpLmdldEJvZHkoKS5hcHBlbmRDaGlsZChw bHVnaW4uZ2V0SUZyYW1lRWxlbWVudCgpKTsKKyAgICAgICAgICAgIHBsdWdpbi5tYXJrQXNMb2Fk aW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBX ZWJBZG1pbiBlbnRlcnMgdGhlIHN0YXRlIHRoYXQgYWxsb3dzIHBsdWdpbnMgdG8gYmUgaW52b2tl ZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmFibGVQbHVnaW5JbnZvY2F0aW9uKCkgewor ICAgICAgICBjYW5JbnZva2VQbHVnaW5zID0gdHJ1ZTsKKworICAgICAgICAvLyBUcnkgdG8gaW5p dGlhbGl6ZSBhbGwgcGx1Z2lucyB3aGljaCBhcmUgY3VycmVudGx5IHJlYWR5CisgICAgICAgIGZv ciAoUGx1Z2luIHBsdWdpbiA6IGdldFBsdWdpbnMoKSkgeworICAgICAgICAgICAgaWYgKHBsdWdp bi5pc0luU3RhdGUoUGx1Z2luU3RhdGUuUkVBRFkpKSB7CisgICAgICAgICAgICAgICAgaW5pdFBs dWdpbihwbHVnaW4uZ2V0TWV0YURhdGEoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAg ICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gV2ViQWRtaW4gbGVh dmVzIHRoZSBzdGF0ZSB0aGF0IGFsbG93cyBwbHVnaW5zIHRvIGJlIGludm9rZWQuCisgICAgICov CisgICAgcHVibGljIHZvaWQgZGlzYWJsZVBsdWdpbkludm9jYXRpb24oKSB7CisgICAgICAgIGNh bkludm9rZVBsdWdpbnMgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2Vz IGFuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gb24gYWxsIHBsdWdpbnMgd2hpY2ggYXJlIGN1cnJl bnRseSBpbml0aWFsaXplZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUge0Bjb2RlIGNvbnRleHRP YmplY3R9IHJlcHJlc2VudHMgdGhlIGxvY2FsIGNvbnRleHQgb2YgdGhlIGdpdmVuIGZ1bmN0aW9u IGNhbGwsIHVzZWQgdG8gcGFzcyBhZGRpdGlvbmFsCisgICAgICogY29udGV4dC1zZW5zaXRpdmUg aW5mb3JtYXRpb24gYXMgbmVjZXNzYXJ5IChjYW4gYmUge0Bjb2RlIG51bGx9KS4KKyAgICAgKi8K KyAgICBwdWJsaWMgdm9pZCBpbnZva2VQbHVnaW5zKFN0cmluZyBmdW5jdGlvbk5hbWUsIEphdmFT Y3JpcHRPYmplY3QgY29udGV4dE9iamVjdCkgeworICAgICAgICBpZiAoY2FuSW52b2tlUGx1Z2lu cykgeworICAgICAgICAgICAgZm9yIChQbHVnaW4gcGx1Z2luIDogZ2V0UGx1Z2lucygpKSB7Cisg ICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5pc0luU3RhdGUoUGx1Z2luU3RhdGUuSU5JVElBTEla RUQpKSB7CisgICAgICAgICAgICAgICAgICAgIGludm9rZVBsdWdpbihwbHVnaW4uZ2V0RXZlbnRI YW5kbGVyT2JqZWN0KCksIGZ1bmN0aW9uTmFtZSwgY29udGV4dE9iamVjdCk7CisgICAgICAgICAg ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAg ICogSW52b2tlcyBhbiBldmVudCBoYW5kbGVyIGZ1bmN0aW9uIG9uIHRoZSBnaXZlbiBvYmplY3Qu CisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbnZva2VQbHVnaW4oSmF2YVNjcmlw dE9iamVjdCBwbHVnaW5FdmVudEhhbmRsZXJPYmplY3QsIFN0cmluZyBmdW5jdGlvbk5hbWUsIEph dmFTY3JpcHRPYmplY3QgY29udGV4dE9iamVjdCkgLyoteworICAgICAgICB2YXIgaGFuZGxlckZ1 bmN0aW9uID0gcGx1Z2luRXZlbnRIYW5kbGVyT2JqZWN0W2Z1bmN0aW9uTmFtZV07CisKKyAgICAg ICAgaWYgKHR5cGVvZiBoYW5kbGVyRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAg ICAgIGlmIChjb250ZXh0T2JqZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVy RnVuY3Rpb24oY29udGV4dE9iamVjdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg ICAgICAgIGhhbmRsZXJGdW5jdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg fS0qLzsKKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IHdoZW4gcGx1Z2lu IGludm9jYXRpb24gaXMgZW5hYmxlZCBhbmQgdGhlIGdpdmVuIHBsdWdpbiBoYXMgYmVlbiBpbml0 aWFsaXplZC4KKyAgICAgKi8KKyAgICBib29sZWFuIGNhbkRvUGx1Z2luQWN0aW9uKFN0cmluZyBw bHVnaW5OYW1lKSB7CisgICAgICAgIFBsdWdpbiBwbHVnaW4gPSBnZXRQbHVnaW4ocGx1Z2luTmFt ZSk7CisgICAgICAgIHJldHVybiBjYW5JbnZva2VQbHVnaW5zICYmIHBsdWdpbiAhPSBudWxsICYm IHBsdWdpbi5pc0luU3RhdGUoUGx1Z2luU3RhdGUuSU5JVElBTElaRUQpOworICAgIH0KKworICAg IC8qKgorICAgICAqIFJlZ2lzdGVycyBhbiBldmVudCBoYW5kbGVyIG9iamVjdCAob2JqZWN0IGNv bnRhaW5pbmcgcGx1Z2luIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zKSBmb3IgdGhlIGdpdmVuIHBs dWdpbi4KKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyUGx1Z2luRXZlbnRIYW5kbGVyT2JqZWN0 KFN0cmluZyBwbHVnaW5OYW1lLCBKYXZhU2NyaXB0T2JqZWN0IHBsdWdpbkV2ZW50SGFuZGxlck9i amVjdCkgeworICAgICAgICBQbHVnaW4gcGx1Z2luID0gZ2V0UGx1Z2luKHBsdWdpbk5hbWUpOwor CisgICAgICAgIGlmIChwbHVnaW4gIT0gbnVsbCAmJiBwbHVnaW5FdmVudEhhbmRsZXJPYmplY3Qg IT0gbnVsbCkgeworICAgICAgICAgICAgcGx1Z2luLnNldEV2ZW50SGFuZGxlck9iamVjdChwbHVn aW5FdmVudEhhbmRsZXJPYmplY3QpOworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlBsdWdpbiAi ICsgcGx1Z2luTmFtZSArICIgaGFzIHJlZ2lzdGVyZWQgdGhlIGV2ZW50IGhhbmRsZXIgb2JqZWN0 Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICB9CisgICAgfQorCisgICAg LyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGdpdmVuIHBsdWdpbiBpcyByZWFkeSBmb3Ig dXNlLgorICAgICAqLworICAgIHZvaWQgcGx1Z2luUmVhZHkoU3RyaW5nIHBsdWdpbk5hbWUpIHsK KyAgICAgICAgUGx1Z2luIHBsdWdpbiA9IGdldFBsdWdpbihwbHVnaW5OYW1lKTsKKworICAgICAg ICBpZiAocGx1Z2luICE9IG51bGwgJiYgcGx1Z2luLmlzSW5TdGF0ZShQbHVnaW5TdGF0ZS5MT0FE SU5HKSkgeworICAgICAgICAgICAgaWYgKHBsdWdpbi5nZXRFdmVudEhhbmRsZXJPYmplY3QoKSA9 PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIlBsdWdpbiAiICsgcGx1 Z2luTmFtZSAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgICAgICArICIgcmVwb3J0 cyBpbiBhcyByZWFkeSwgYnV0IGhhcyBubyBldmVudCBoYW5kbGVyIG9iamVjdCBhc3NpZ25lZCIp OyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQor CisgICAgICAgICAgICBwbHVnaW4ubWFya0FzUmVhZHkoKTsKKyAgICAgICAgICAgIGxvZ2dlci5p bmZvKCJQbHVnaW4gIiArIHBsdWdpbk5hbWUgKyAiIHJlcG9ydHMgaW4gYXMgcmVhZHkiKTsgLy8k Tk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICBpbml0UGx1Z2luKHBsdWdpbk5h bWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gaW5p dGlhbGl6ZSB0aGUgZ2l2ZW4gcGx1Z2luIGJ5IGNhbGxpbmcgVWlJbml0IGV2ZW50IGhhbmRsZXIg ZnVuY3Rpb24gb24gdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQKKyAgICAgKiBoYW5kbGVyIG9iamVj dC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgVWlJbml0IGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVk IGp1c3Qgb25jZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGEgcGx1Z2luLiBNb3JlIHByZWNpc2Vs eSwgVWlJbml0IGZ1bmN0aW9uCisgICAgICogd2lsbCBiZSBjYWxsZWQ6CisgICAgICogPHVsPgor ICAgICAqIDxsaT5hZnRlciB0aGUgcGx1Z2luIHJlcG9ydHMgaW4gYXMgcmVhZHkgYW5kIFdlYkFk bWluIGVudGVycyB0aGUgc3RhdGUgdGhhdCBhbGxvd3MgcGx1Z2lucyB0byBiZSBpbnZva2VkCisg ICAgICogPGxpPmJlZm9yZSBhbnkgb3RoZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMgYXJlIGlu dm9rZWQgYnkgdGhlIHBsdWdpbiBpbmZyYXN0cnVjdHVyZQorICAgICAqIDwvdWw+CisgICAgICov CisgICAgdm9pZCBpbml0UGx1Z2luKFN0cmluZyBwbHVnaW5OYW1lKSB7CisgICAgICAgIFBsdWdp biBwbHVnaW4gPSBnZXRQbHVnaW4ocGx1Z2luTmFtZSk7CisKKyAgICAgICAgaWYgKGNhbkludm9r ZVBsdWdpbnMgJiYgcGx1Z2luICE9IG51bGwgJiYgcGx1Z2luLmlzSW5TdGF0ZShQbHVnaW5TdGF0 ZS5SRUFEWSkpIHsKKyAgICAgICAgICAgIHBsdWdpbi5tYXJrQXNJbml0aWFsaXplZCgpOworICAg ICAgICAgICAgaW52b2tlUGx1Z2luKHBsdWdpbi5nZXRFdmVudEhhbmRsZXJPYmplY3QoKSwgIlVp SW5pdCIsIG51bGwpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiUGx1 Z2luICIgKyBwbHVnaW5OYW1lICsgIiBpcyBpbml0aWFsaXplZCBhbmQgaW4gdXNlIG5vdyIpOyAv LyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgor ICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0 aGUgZ2l2ZW4gcGx1Z2luLCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gc3VjaCBvYmplY3QgZXhpc3Rz LgorICAgICAqLworICAgIEphdmFTY3JpcHRPYmplY3QgZ2V0Q29uZmlnT2JqZWN0KFN0cmluZyBw bHVnaW5OYW1lKSB7CisgICAgICAgIFBsdWdpbiBwbHVnaW4gPSBnZXRQbHVnaW4ocGx1Z2luTmFt ZSk7CisgICAgICAgIHJldHVybiBwbHVnaW4gIT0gbnVsbCA/IHBsdWdpbi5nZXRNZXRhRGF0YSgp LmdldENvbmZpZ09iamVjdCgpIDogbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2 b2lkIGV4cG9zZVBsdWdpbkFwaSgpIC8qLXsKKyAgICAgICAgdmFyIGN0eCA9IHRoaXM7CisgICAg ICAgIHZhciB1aUZ1bmN0aW9ucyA9IGN0eC5Ab3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5w bHVnaW4uUGx1Z2luTWFuYWdlcjo6dWlGdW5jdGlvbnM7CisKKyAgICAgICAgdmFyIGNhbkRvUGx1 Z2luQWN0aW9uID0gZnVuY3Rpb24ocGx1Z2luTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGN0 eC5Ab3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW4uUGx1Z2luTWFuYWdlcjo6Y2Fu RG9QbHVnaW5BY3Rpb24oTGphdmEvbGFuZy9TdHJpbmc7KShwbHVnaW5OYW1lKTsKKyAgICAgICAg fTsKKworICAgICAgICAvLyBEZWZpbmUgcGx1Z2luQXBpIGZ1bmN0aW9uIHVzZWQgdG8gY29uc3Ry dWN0IHNwZWNpZmljIFBsdWdpbiBBUEkgaW5zdGFuY2VzCisgICAgICAgIHZhciBwbHVnaW5BcGkg PSBmdW5jdGlvbihwbHVnaW5OYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IHBsdWdpbkFw aS5mbi5pbml0KHBsdWdpbk5hbWUpOworICAgICAgICB9OworCisgICAgICAgIC8vIERlZmluZSBw bHVnaW5BcGkuZm4gYXMgYW4gYWxpYXMgdG8gcGx1Z2luQXBpIHByb3RvdHlwZQorICAgICAgICBw bHVnaW5BcGkuZm4gPSBwbHVnaW5BcGkucHJvdG90eXBlID0geworCisgICAgICAgICAgICBwbHVn aW5OYW1lOiBudWxsLCAvLyBJbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBmdW5jdGlvbgorCisg ICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICAgICAgICAgICAgaW5pdDogZnVu Y3Rpb24ocGx1Z2luTmFtZSkgeworICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luTmFtZSA9IHBs dWdpbk5hbWU7CisgICAgICAgICAgICAgICAgdGhpcy51aS5vd25lciA9IHRoaXM7CisgICAgICAg ICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBS ZWdpc3RlcnMgcGx1Z2luIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGZvciBsYXRlciBpbnZvY2F0 aW9uCisgICAgICAgICAgICByZWdpc3RlcjogZnVuY3Rpb24ocGx1Z2luRXZlbnRIYW5kbGVyT2Jq ZWN0KSB7CisgICAgICAgICAgICAgICAgY3R4LkBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWlu LnBsdWdpbi5QbHVnaW5NYW5hZ2VyOjpyZWdpc3RlclBsdWdpbkV2ZW50SGFuZGxlck9iamVjdChM amF2YS9sYW5nL1N0cmluZztMY29tL2dvb2dsZS9nd3QvY29yZS9jbGllbnQvSmF2YVNjcmlwdE9i amVjdDspKHRoaXMucGx1Z2luTmFtZSxwbHVnaW5FdmVudEhhbmRsZXJPYmplY3QpOworICAgICAg ICAgICAgfSwKKworICAgICAgICAgICAgLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHBsdWdpbiBpcyBy ZWFkeSBmb3IgdXNlCisgICAgICAgICAgICByZWFkeTogZnVuY3Rpb24oKSB7CisgICAgICAgICAg ICAgICAgY3R4LkBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5QbHVnaW5NYW5h Z2VyOjpwbHVnaW5SZWFkeShMamF2YS9sYW5nL1N0cmluZzspKHRoaXMucGx1Z2luTmFtZSk7Cisg ICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9u IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHBsdWdpbgorICAgICAgICAgICAgY29uZmlnT2Jq ZWN0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3R4LkBvcmcub3ZpcnQu ZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5QbHVnaW5NYW5hZ2VyOjpnZXRDb25maWdPYmplY3Qo TGphdmEvbGFuZy9TdHJpbmc7KSh0aGlzLnBsdWdpbk5hbWUpOworICAgICAgICAgICAgfSwKKwor ICAgICAgICAgICAgLy8gTmFtZXNwYWNlIGZvciBpbnZva2luZyBQbHVnaW5VaUZ1bmN0aW9ucwor ICAgICAgICAgICAgdWk6IHsKKworICAgICAgICAgICAgICAgIGFkZE1haW5UYWI6IGZ1bmN0aW9u KGxhYmVsLCBoaXN0b3J5VG9rZW4sIGNvbnRlbnRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAg aWYgKGNhbkRvUGx1Z2luQWN0aW9uKHRoaXMub3duZXIucGx1Z2luTmFtZSkpIHsKKyAgICAgICAg ICAgICAgICAgICAgICAgIHVpRnVuY3Rpb25zLkBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWlu LnBsdWdpbi5QbHVnaW5VaUZ1bmN0aW9uczo6YWRkTWFpblRhYihMamF2YS9sYW5nL1N0cmluZztM amF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspKGxhYmVsLGhpc3RvcnlUb2tlbixj b250ZW50VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwor ICAgICAgICAgICAgfQorCisgICAgICAgIH07CisKKyAgICAgICAgLy8gR2l2ZSBpbml0IGZ1bmN0 aW9uIHRoZSBwbHVnaW5BcGkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCisgICAg ICAgIHBsdWdpbkFwaS5mbi5pbml0LnByb3RvdHlwZSA9IHBsdWdpbkFwaS5mbjsKKworICAgICAg ICAvLyBFeHBvc2UgcGx1Z2luQXBpIGZ1bmN0aW9uIGFzIGEgZ2xvYmFsIG9iamVjdAorICAgICAg ICAkd25kLnBsdWdpbkFwaSA9IHBsdWdpbkFwaTsKKyAgICB9LSovOworCit9CmRpZmYgLS1naXQg YS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292 aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luTWV0YURhdGEuamF2YSBiL2Zyb250 ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5n aW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5NZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZjMxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVu ZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2lu ZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luTWV0YURhdGEuamF2YQpAQCAtMCwwICsxLDM2IEBA CitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luOworCitpbXBvcnQg Y29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKKworLyoqCisgKiBD b250YWlucyBtZXRhLWRhdGEgZGVzY3JpYmluZyBhIFVJIHBsdWdpbi4KKyAqIDxwPgorICogV2Ug ZXhwZWN0IHRoZSBtZXRhLWRhdGEgdG8gYmUgcmVhZCBkdXJpbmcgV2ViQWRtaW4gc3RhcnR1cCBh cyBwYXJ0IG9mIHtAbGluayBQbHVnaW5EZWZpbml0aW9uc30uCisgKi8KK3B1YmxpYyBmaW5hbCBj bGFzcyBQbHVnaW5NZXRhRGF0YSBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworCisgICAgcHJv dGVjdGVkIFBsdWdpbk1ldGFEYXRhKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbmFt ZSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHBsdWdpbiAobWFuZGF0b3J5KS4KKyAgICAg Ki8KKyAgICBwdWJsaWMgbmF0aXZlIFN0cmluZyBnZXROYW1lKCkgIC8qLXsKKyAgICAgICAgcmV0 dXJuIHRoaXMubmFtZTsKKyAgICB9LSovOworCisgICAgLyoqCisgICAgICogVVJMIG9mIHBsdWdp biBob3N0IHBhZ2UgdGhhdCBpbnZva2VzIHRoZSBwbHVnaW4gY29kZSAobWFuZGF0b3J5KS4KKyAg ICAgKi8KKyAgICBwdWJsaWMgbmF0aXZlIFN0cmluZyBnZXRIb3N0UGFnZVVybCgpIC8qLXsKKyAg ICAgICAgcmV0dXJuIHRoaXMudXJsOworICAgIH0tKi87CisKKyAgICAvKioKKyAgICAgKiBDb25m aWd1cmF0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHBsdWdpbiAob3B0aW9uYWwpLgor ICAgICAqLworICAgIHB1YmxpYyBuYXRpdmUgSmF2YVNjcmlwdE9iamVjdCBnZXRDb25maWdPYmpl Y3QoKSAvKi17CisgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZzsKKyAgICB9LSovOworCit9CmRp ZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2ph dmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luU3RhdGUuamF2YSBi L2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3Zp cnQvZW5naW5lL3VpL3dlYmFkbWluL3BsdWdpbi9QbHVnaW5TdGF0ZS5qYXZhCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YzZiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9u dGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2Vu Z2luZS91aS93ZWJhZG1pbi9wbHVnaW4vUGx1Z2luU3RhdGUuamF2YQpAQCAtMCwwICsxLDMzIEBA CitwYWNrYWdlIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luOworCisvKioKKyAq IEVudW1lcmF0ZXMgcG9zc2libGUgc3RhdGVzIGR1cmluZyB0aGUgcnVudGltZSBvZiBhIFVJIHBs dWdpbi4KKyAqLworcHVibGljIGVudW0gUGx1Z2luU3RhdGUgeworCisgICAgLyoqCisgICAgICog VGhlIHBsdWdpbiBoYXMgYmVlbiBkZWZpbmVkIHRocm91Z2ggaXRzIG1ldGEtZGF0YSBhbmQgdGhl IGNvcnJlc3BvbmRpbmcgaWZyYW1lIGVsZW1lbnQgaGFzIGJlZW4gY3JlYXRlZC4KKyAgICAgKiA8 cD4KKyAgICAgKiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlIGZvciBhbGwgcGx1Z2lucy4KKyAg ICAgKi8KKyAgICBERUZJTkVELAorCisgICAgLyoqCisgICAgICogVGhlIGlmcmFtZSBlbGVtZW50 IGhhcyBiZWVuIGF0dGFjaGVkIHRvIERPTSwgd2l0aCBwbHVnaW4gaG9zdCBwYWdlIGJlaW5nIGZl dGNoZWQgYXN5bmNocm9ub3VzbHkgaW4gdGhlCisgICAgICogYmFja2dyb3VuZC4gV2UgYXJlIG5v dyB3YWl0aW5nIGZvciB0aGUgcGx1Z2luIHRvIHJlcG9ydCBpbiBhcyByZWFkeS4KKyAgICAgKi8K KyAgICBMT0FESU5HLAorCisgICAgLyoqCisgICAgICogVGhlIHBsdWdpbiBoYXMgaW5kaWNhdGVk IHRoYXQgaXQgaXMgcmVhZHkgZm9yIHVzZS4gV2UgZXhwZWN0IHRoZSBldmVudCBoYW5kbGVyIG9i amVjdCAob2JqZWN0IGNvbnRhaW5pbmcgcGx1Z2luCisgICAgICogZXZlbnQgaGFuZGxlciBmdW5j dGlvbnMpIHRvIGJlIHJlZ2lzdGVyZWQgYXQgdGhpcyBwb2ludC4gV2UgY2FuIG5vdyBwcm9jZWVk IHdpdGggcGx1Z2luIGluaXRpYWxpemF0aW9uLgorICAgICAqLworICAgIFJFQURZLAorCisgICAg LyoqCisgICAgICogVGhlIHBsdWdpbiBoYXMgYmVlbiBpbml0aWFsaXplZCBieSBjYWxsaW5nIFVp SW5pdCBldmVudCBoYW5kbGVyIGZ1bmN0aW9uLiBXZSBjYW4gbm93IGNhbGwgb3RoZXIgZXZlbnQg aGFuZGxlcgorICAgICAqIGZ1bmN0aW9ucyAodGhlIHBsdWdpbiBpcyBpbiB1c2UpLgorICAgICAq LworICAgIElOSVRJQUxJWkVECisKK30KZGlmZiAtLWdpdCBhL2Zyb250ZW5kL3dlYmFkbWluL21v ZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWlu L3BsdWdpbi9QbHVnaW5VaUZ1bmN0aW9ucy5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl cy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vcGx1 Z2luL1BsdWdpblVpRnVuY3Rpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMC4uZGE1NTBmNgotLS0gL2Rldi9udWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVs ZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3Bs dWdpbi9QbHVnaW5VaUZ1bmN0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2Ugb3Jn Lm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW47CisKK2ltcG9ydCBvcmcub3ZpcnQuZW5n aW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIudGFiLk1haW5UYWJDdXN0b21Q cm94eUZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKKy8qKgor ICogQ29udGFpbnMgVUkgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IGV4cG9zZWQgdG8gVUkgcGx1Z2lu cy4KKyAqLworcHVibGljIGNsYXNzIFBsdWdpblVpRnVuY3Rpb25zIHsKKworICAgIHByaXZhdGUg ZmluYWwgTWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeSBtYWluVGFiQ3VzdG9tUHJveHlGYWN0b3J5 OworCisgICAgQEluamVjdAorICAgIHB1YmxpYyBQbHVnaW5VaUZ1bmN0aW9ucyhNYWluVGFiQ3Vz dG9tUHJveHlGYWN0b3J5IG1haW5UYWJDdXN0b21Qcm94eUZhY3RvcnkpIHsKKyAgICAgICAgdGhp cy5tYWluVGFiQ3VzdG9tUHJveHlGYWN0b3J5ID0gbWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeTsK KyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIG5ldyBtYWluIHRhYiB0aGF0IHNob3dzIGNv bnRlbnRzIG9mIHRoZSBnaXZlbiBVUkwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWFp blRhYihTdHJpbmcgbGFiZWwsIFN0cmluZyBoaXN0b3J5VG9rZW4sIFN0cmluZyBjb250ZW50VXJs KSB7CisgICAgICAgIG1haW5UYWJDdXN0b21Qcm94eUZhY3RvcnkuY3JlYXRlKGxhYmVsLCBoaXN0 b3J5VG9rZW4sIGNvbnRlbnRVcmwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQv d2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUv dWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci9NYWluU2VjdGlvblByZXNlbnRlci5q YXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29y Zy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci9NYWluU2Vj dGlvblByZXNlbnRlci5qYXZhCmluZGV4IDcxOGQ4ZmMuLjE1Yjg4N2MgMTAwNjQ0Ci0tLSBhL2Zy b250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQv ZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvTWFpblNlY3Rpb25QcmVz ZW50ZXIuamF2YQorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9t YWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJlc2Vu dGVyL01haW5TZWN0aW9uUHJlc2VudGVyLmphdmEKQEAgLTEsNSArMSw3IEBACiBwYWNrYWdlIG9y Zy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uc2VjdGlvbi5tYWluLnByZXNlbnRlcjsKIAoraW1w b3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLlBsdWdpbk1hbmFnZXI7CisK IGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuRXZlbnRCdXM7CiBpbXBvcnQgY29t Lmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkd3dEV2ZW50LlR5cGU7CiBpbXBvcnQgY29tLmdvb2ds ZS5pbmplY3QuSW5qZWN0OwpAQCAtMjgsMTEgKzMwLDEzIEBAIHB1YmxpYyBjbGFzcyBNYWluU2Vj dGlvblByZXNlbnRlciBleHRlbmRzIFByZXNlbnRlcjxNYWluU2VjdGlvblByZXNlbnRlci5WaWV3 RGVmCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlPFJldmVhbENvbnRlbnRIYW5kbGVyPD8+ PiBUWVBFX1NldE1haW5Db250ZW50ID0gbmV3IFR5cGU8UmV2ZWFsQ29udGVudEhhbmRsZXI8Pz4+ KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIEhlYWRlclByZXNlbnRlcldpZGdldCBoZWFkZXI7Cisg ICAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5NYW5hZ2VyIHBsdWdpbk1hbmFnZXI7CiAKICAgICBASW5q ZWN0Ci0gICAgcHVibGljIE1haW5TZWN0aW9uUHJlc2VudGVyKEV2ZW50QnVzIGV2ZW50QnVzLCBW aWV3RGVmIHZpZXcsIFByb3h5RGVmIHByb3h5LCBIZWFkZXJQcmVzZW50ZXJXaWRnZXQgaGVhZGVy KSB7CisgICAgcHVibGljIE1haW5TZWN0aW9uUHJlc2VudGVyKEV2ZW50QnVzIGV2ZW50QnVzLCBW aWV3RGVmIHZpZXcsIFByb3h5RGVmIHByb3h5LCBIZWFkZXJQcmVzZW50ZXJXaWRnZXQgaGVhZGVy LCBQbHVnaW5NYW5hZ2VyIHBsdWdpbk1hbmFnZXIpIHsKICAgICAgICAgc3VwZXIoZXZlbnRCdXMs IHZpZXcsIHByb3h5KTsKICAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CisgICAgICAgIHRo aXMucGx1Z2luTWFuYWdlciA9IHBsdWdpbk1hbmFnZXI7CiAgICAgICAgIGdldFZpZXcoKS5zZXRV aUhhbmRsZXJzKGhlYWRlcik7CiAgICAgfQogCkBAIC00Niw2ICs1MCwxNyBAQCBwdWJsaWMgY2xh c3MgTWFpblNlY3Rpb25QcmVzZW50ZXIgZXh0ZW5kcyBQcmVzZW50ZXI8TWFpblNlY3Rpb25QcmVz ZW50ZXIuVmlld0RlZgogICAgICAgICBzdXBlci5vblJldmVhbCgpOwogCiAgICAgICAgIHNldElu U2xvdChUWVBFX1NldEhlYWRlciwgaGVhZGVyKTsKKworICAgICAgICAvLyBFbmFibGUgcGx1Z2lu IGludm9jYXRpb24gd2l0aGluIHRoZSBzY29wZSBvZiBtYWluIHNlY3Rpb24KKyAgICAgICAgcGx1 Z2luTWFuYWdlci5lbmFibGVQbHVnaW5JbnZvY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJy aWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25IaWRlKCkgeworICAgICAgICBzdXBlci5vbkhpZGUo KTsKKworICAgICAgICAvLyBEaXNhYmxlIHBsdWdpbiBpbnZvY2F0aW9uIG91dHNpZGUgdGhlIHNj b3BlIG9mIG1haW4gc2VjdGlvbgorICAgICAgICBwbHVnaW5NYW5hZ2VyLmRpc2FibGVQbHVnaW5J bnZvY2F0aW9uKCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9mcm9udGVuZC93ZWJhZG1pbi9t b2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1p bi9zZWN0aW9uL21haW4vcHJlc2VudGVyL01haW5UYWJQYW5lbFByZXNlbnRlci5qYXZhIGIvZnJv bnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9l bmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci9NYWluVGFiUGFuZWxQcmVz ZW50ZXIuamF2YQppbmRleCBhYzA0MDAxLi42MTEyZDM4IDEwMDY0NAotLS0gYS9mcm9udGVuZC93 ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91 aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJlc2VudGVyL01haW5UYWJQYW5lbFByZXNlbnRlci5q YXZhCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2 YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvTWFp blRhYlBhbmVsUHJlc2VudGVyLmphdmEKQEAgLTUsNiArNSw3IEBAIGltcG9ydCBvcmcub3ZpcnQu ZW5naW5lLnVpLmNvbW1vbi53aWRnZXQudGFiLkFic3RyYWN0SGVhZGxlc3NUYWJQYW5lbC5UYWJX aWRnZXRICiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkV2ZW50QnVzOwogaW1w b3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5Hd3RFdmVudC5UeXBlOwogaW1wb3J0IGNv bS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ3d0cGxhdGZvcm0ubXZwLmNsaWVu dC5SZXF1ZXN0VGFic0V2ZW50OwogaW1wb3J0IGNvbS5nd3RwbGF0Zm9ybS5tdnAuY2xpZW50LlJl cXVlc3RUYWJzSGFuZGxlcjsKIGltcG9ydCBjb20uZ3d0cGxhdGZvcm0ubXZwLmNsaWVudC5UYWJD b250YWluZXJQcmVzZW50ZXI7CiBpbXBvcnQgY29tLmd3dHBsYXRmb3JtLm12cC5jbGllbnQuVGFi VmlldzsKQEAgLTQ1LDQgKzQ2LDEzIEBAIHB1YmxpYyBjbGFzcyBNYWluVGFiUGFuZWxQcmVzZW50 ZXIgZXh0ZW5kcyBUYWJDb250YWluZXJQcmVzZW50ZXI8TWFpblRhYlBhbmVsUHJlCiAgICAgICAg IFJldmVhbENvbnRlbnRFdmVudC5maXJlKHRoaXMsIE1haW5Db250ZW50UHJlc2VudGVyLlRZUEVf U2V0TWFpblRhYlBhbmVsQ29udGVudCwgdGhpcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisg ICAgcHJvdGVjdGVkIHZvaWQgb25SZXZlYWwoKSB7CisgICAgICAgIHN1cGVyLm9uUmV2ZWFsKCk7 CisKKyAgICAgICAgLy8gUmVmcmVzaCB0YWJzIGVhY2ggdGltZSB0aGlzIHRhYiBjb250YWluZXIg aXMgcmV2ZWFsZWQKKyAgICAgICAgZ2V0VmlldygpLnJlbW92ZVRhYnMoKTsKKyAgICAgICAgUmVx dWVzdFRhYnNFdmVudC5maXJlKHRoaXMsIFRZUEVfUmVxdWVzdFRhYnMsIHRoaXMpOworICAgIH0K KwogfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMv bWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNl bnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNlbnRlci5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4v bW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRt aW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNlbnRlci5qYXZh Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOWMyZjUKLS0tIC9kZXYvbnVs bAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEv b3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vcHJlc2VudGVyL3RhYi9N YWluVGFiQ3VzdG9tUHJlc2VudGVyLmphdmEKQEAgLTAsMCArMSw0MyBAQAorcGFja2FnZSBvcmcu b3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIudGFiOworCitp bXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zZWN0aW9uLm1haW4ucHJlc2VudGVy Lk1haW5UYWJQYW5lbFByZXNlbnRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNo YXJlZC5FdmVudEJ1czsKK2ltcG9ydCBjb20uZ3d0cGxhdGZvcm0ubXZwLmNsaWVudC5QcmVzZW50 ZXI7CitpbXBvcnQgY29tLmd3dHBsYXRmb3JtLm12cC5jbGllbnQuVmlldzsKK2ltcG9ydCBjb20u Z3d0cGxhdGZvcm0ubXZwLmNsaWVudC5wcm94eS5SZXZlYWxDb250ZW50RXZlbnQ7CitpbXBvcnQg Y29tLmd3dHBsYXRmb3JtLm12cC5jbGllbnQucHJveHkuVGFiQ29udGVudFByb3h5UGxhY2U7CisK K3B1YmxpYyBjbGFzcyBNYWluVGFiQ3VzdG9tUHJlc2VudGVyIGV4dGVuZHMgUHJlc2VudGVyPE1h aW5UYWJDdXN0b21QcmVzZW50ZXIuVmlld0RlZiwgTWFpblRhYkN1c3RvbVByZXNlbnRlci5Qcm94 eURlZj4geworCisgICAgLy8gTm8gbmVlZCBmb3IgQFByb3h5Q29kZVNwbGl0LCB3ZSB3aWxsIHBy b3ZpZGUgb3VyIG93biBwcm94eSBpbXBsZW1lbnRhdGlvbgorICAgIHB1YmxpYyBpbnRlcmZhY2Ug UHJveHlEZWYgZXh0ZW5kcyBUYWJDb250ZW50UHJveHlQbGFjZTxNYWluVGFiQ3VzdG9tUHJlc2Vu dGVyPiB7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBWaWV3RGVmIGV4dGVuZHMgVmll dyB7CisKKyAgICAgICAgdm9pZCBzZXRDb250ZW50VXJsKFN0cmluZyB1cmwpOworCisgICAgfQor CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGVudFVybDsKKworICAgIC8vIE5vIG5lZWQg Zm9yIEBJbmplY3QsIHRoaXMgcHJlc2VudGVyIHdpbGwgYmUgY3JlYXRlZCBtYW51YWxseSBieSBN YWluVGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIKKyAgICBwdWJsaWMgTWFpblRhYkN1c3RvbVBy ZXNlbnRlcihFdmVudEJ1cyBldmVudEJ1cywgVmlld0RlZiB2aWV3LCBQcm94eURlZiBwcm94eSwg U3RyaW5nIGNvbnRlbnRVcmwpIHsKKyAgICAgICAgc3VwZXIoZXZlbnRCdXMsIHZpZXcsIHByb3h5 KTsKKyAgICAgICAgdGhpcy5jb250ZW50VXJsID0gY29udGVudFVybDsKKyAgICB9CisKKyAgICBA T3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXZlYWxJblBhcmVudCgpIHsKKyAgICAgICAg UmV2ZWFsQ29udGVudEV2ZW50LmZpcmUodGhpcywgTWFpblRhYlBhbmVsUHJlc2VudGVyLlRZUEVf U2V0VGFiQ29udGVudCwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVj dGVkIHZvaWQgb25CaW5kKCkgeworICAgICAgICBzdXBlci5vbkJpbmQoKTsKKworICAgICAgICBn ZXRWaWV3KCkuc2V0Q29udGVudFVybChjb250ZW50VXJsKTsKKyAgICB9CisKK30KZGlmZiAtLWdp dCBhL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcv b3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvdGFiL01haW5U YWJDdXN0b21QcmVzZW50ZXJQcm92aWRlci5qYXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxl cy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2Vj dGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByZXNlbnRlclByb3ZpZGVyLmph dmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwYmU1NAotLS0gL2Rldi9u dWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2 YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi9wcmVzZW50ZXIvdGFi L01haW5UYWJDdXN0b21QcmVzZW50ZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3Bh Y2thZ2Ugb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zZWN0aW9uLm1haW4ucHJlc2VudGVy LnRhYjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5FdmVudEJ1czsKK2lt cG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3Qu UHJvdmlkZXI7CisKKy8qKgorICogUHJvdmlkZXIgb2Yge0BsaW5rIE1haW5UYWJDdXN0b21QcmVz ZW50ZXJ9IGluc3RhbmNlcyAobm9uLXNpbmdsZXRvbikuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWlu VGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxNYWluVGFiQ3Vz dG9tUHJlc2VudGVyPiB7CisKKyAgICBwcml2YXRlIE1haW5UYWJDdXN0b21QcmVzZW50ZXIgcHJl c2VudGVyOworICAgIHByaXZhdGUgTWFpblRhYkN1c3RvbVByZXNlbnRlci5Qcm94eURlZiBwcm94 eTsKKworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8TWFpblRhYkN1c3RvbVByZXNlbnRlci5W aWV3RGVmPiB2aWV3UHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBFdmVudEJ1cyBldmVudEJ1 czsKKworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRVcmw7CisKKyAgICBASW5qZWN0CisgICAg cHVibGljIE1haW5UYWJDdXN0b21QcmVzZW50ZXJQcm92aWRlcihQcm92aWRlcjxNYWluVGFiQ3Vz dG9tUHJlc2VudGVyLlZpZXdEZWY+IHZpZXdQcm92aWRlciwgRXZlbnRCdXMgZXZlbnRCdXMpIHsK KyAgICAgICAgdGhpcy52aWV3UHJvdmlkZXIgPSB2aWV3UHJvdmlkZXI7CisgICAgICAgIHRoaXMu ZXZlbnRCdXMgPSBldmVudEJ1czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMg TWFpblRhYkN1c3RvbVByZXNlbnRlciBnZXQoKSB7CisgICAgICAgIGFzc2VydCBwcm94eSAhPSBu dWxsIDogIllvdSBtdXN0IGNhbGwgc2V0UHJveHkgZmlyc3QiOyAvLyROT04tTkxTLTEkCisKKyAg ICAgICAgaWYgKHByZXNlbnRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYW5k IGJpbmQgdGhlIHByZXNlbnRlcgorICAgICAgICAgICAgcHJlc2VudGVyID0gbmV3IE1haW5UYWJD dXN0b21QcmVzZW50ZXIoZXZlbnRCdXMsIHZpZXdQcm92aWRlci5nZXQoKSwgcHJveHksIGNvbnRl bnRVcmwpOworICAgICAgICAgICAgcHJlc2VudGVyLmJpbmQoKTsKKyAgICAgICAgfQorCisgICAg ICAgIHJldHVybiBwcmVzZW50ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJveHko TWFpblRhYkN1c3RvbVByZXNlbnRlci5Qcm94eURlZiBwcm94eSkgeworICAgICAgICB0aGlzLnBy b3h5ID0gcHJveHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFVybChTdHJp bmcgY29udGVudFVybCkgeworICAgICAgICB0aGlzLmNvbnRlbnRVcmwgPSBjb250ZW50VXJsOwor ICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1p bi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWlu L3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByb3h5LmphdmEgYi9mcm9udGVuZC93ZWJhZG1p bi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJh ZG1pbi9zZWN0aW9uL21haW4vcHJlc2VudGVyL3RhYi9NYWluVGFiQ3VzdG9tUHJveHkuamF2YQpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDYzMjhjCi0tLSAvZGV2L251bGwK KysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29y Zy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFp blRhYkN1c3RvbVByb3h5LmphdmEKQEAgLTAsMCArMSw0NSBAQAorcGFja2FnZSBvcmcub3ZpcnQu ZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIudGFiOworCitpbXBvcnQg b3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5naW4uQ2xpZW50R2luamVjdG9yOworaW1wb3J0 IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uc2VjdGlvbi5tYWluLnByZXNlbnRlci5NYWlu VGFiUGFuZWxQcmVzZW50ZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQu RXZlbnRCdXM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29t Lmd3dHBsYXRmb3JtLmNvbW1vbi5jbGllbnQuU3RhbmRhcmRQcm92aWRlcjsKK2ltcG9ydCBjb20u Z3d0cGxhdGZvcm0ubXZwLmNsaWVudC5UYWJEYXRhQmFzaWM7CitpbXBvcnQgY29tLmd3dHBsYXRm b3JtLm12cC5jbGllbnQucHJveHkuUGxhY2VNYW5hZ2VyOworaW1wb3J0IGNvbS5nd3RwbGF0Zm9y bS5tdnAuY2xpZW50LnByb3h5LlBsYWNlV2l0aEdhdGVrZWVwZXI7CitpbXBvcnQgY29tLmd3dHBs YXRmb3JtLm12cC5jbGllbnQucHJveHkuVGFiQ29udGVudFByb3h5SW1wbDsKK2ltcG9ydCBjb20u Z3d0cGxhdGZvcm0ubXZwLmNsaWVudC5wcm94eS5UYWJDb250ZW50UHJveHlQbGFjZUltcGw7CisK Ky8qKgorICogQ3VzdG9tIHtAbGluayBNYWluVGFiQ3VzdG9tUHJlc2VudGVyfSBwcm94eSBpbXBs ZW1lbnRhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIE1haW5UYWJDdXN0b21Qcm94eSBleHRlbmRz IFRhYkNvbnRlbnRQcm94eVBsYWNlSW1wbDxNYWluVGFiQ3VzdG9tUHJlc2VudGVyPiBpbXBsZW1l bnRzIE1haW5UYWJDdXN0b21QcmVzZW50ZXIuUHJveHlEZWYgeworCisgICAgcHVibGljIHN0YXRp YyBjbGFzcyBXcmFwcGVkUHJveHkgZXh0ZW5kcyBUYWJDb250ZW50UHJveHlJbXBsPE1haW5UYWJD dXN0b21QcmVzZW50ZXI+IHsKKworICAgICAgICBwdWJsaWMgV3JhcHBlZFByb3h5KFBsYWNlTWFu YWdlciBwbGFjZU1hbmFnZXIsIEV2ZW50QnVzIGV2ZW50QnVzLAorICAgICAgICAgICAgICAgIFBy b3ZpZGVyPE1haW5UYWJDdXN0b21QcmVzZW50ZXI+IHByZXNlbnRlclByb3ZpZGVyLAorICAgICAg ICAgICAgICAgIFN0cmluZyBsYWJlbCwgZmxvYXQgcHJpb3JpdHksIFN0cmluZyBoaXN0b3J5VG9r ZW4pIHsKKyAgICAgICAgICAgIGJpbmQocGxhY2VNYW5hZ2VyLCBldmVudEJ1cyk7CisgICAgICAg ICAgICByZXF1ZXN0VGFic0V2ZW50VHlwZSA9IE1haW5UYWJQYW5lbFByZXNlbnRlci5UWVBFX1Jl cXVlc3RUYWJzOworICAgICAgICAgICAgdGFiRGF0YSA9IG5ldyBUYWJEYXRhQmFzaWMobGFiZWws IHByaW9yaXR5KTsKKyAgICAgICAgICAgIHRhcmdldEhpc3RvcnlUb2tlbiA9IGhpc3RvcnlUb2tl bjsKKyAgICAgICAgICAgIGFkZFJlcXVlc3RUYWJzSGFuZGxlcigpOworICAgICAgICAgICAgcHJl c2VudGVyID0gbmV3IFN0YW5kYXJkUHJvdmlkZXI8TWFpblRhYkN1c3RvbVByZXNlbnRlcj4ocHJl c2VudGVyUHJvdmlkZXIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgTWFpblRh YkN1c3RvbVByb3h5KENsaWVudEdpbmplY3RvciBnaW5qZWN0b3IsCisgICAgICAgICAgICBNYWlu VGFiQ3VzdG9tUHJlc2VudGVyUHJvdmlkZXIgcHJlc2VudGVyUHJvdmlkZXIsCisgICAgICAgICAg ICBTdHJpbmcgbGFiZWwsIGZsb2F0IHByaW9yaXR5LCBTdHJpbmcgaGlzdG9yeVRva2VuKSB7Cisg ICAgICAgIGJpbmQoZ2luamVjdG9yLmdldFBsYWNlTWFuYWdlcigpLCBnaW5qZWN0b3IuZ2V0RXZl bnRCdXMoKSk7CisgICAgICAgIHByb3h5ID0gbmV3IFdyYXBwZWRQcm94eShnaW5qZWN0b3IuZ2V0 UGxhY2VNYW5hZ2VyKCksIGdpbmplY3Rvci5nZXRFdmVudEJ1cygpLAorICAgICAgICAgICAgICAg IHByZXNlbnRlclByb3ZpZGVyLCBsYWJlbCwgcHJpb3JpdHksIGhpc3RvcnlUb2tlbik7CisgICAg ICAgIHBsYWNlID0gbmV3IFBsYWNlV2l0aEdhdGVrZWVwZXIoaGlzdG9yeVRva2VuLCBnaW5qZWN0 b3IuZ2V0RGVmYXVsdEdhdGVrZWVwZXIoKSk7CisgICAgICAgIHByZXNlbnRlclByb3ZpZGVyLnNl dFByb3h5KHRoaXMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4v bW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRt aW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeS5q YXZhIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29y Zy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ByZXNlbnRlci90YWIvTWFp blRhYkN1c3RvbVByb3h5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAuLmYxNjdjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1 bGVzL3dlYmFkbWluL3NyYy9tYWluL2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9z ZWN0aW9uL21haW4vcHJlc2VudGVyL3RhYi9NYWluVGFiQ3VzdG9tUHJveHlGYWN0b3J5LmphdmEK QEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNl Y3Rpb24ubWFpbi5wcmVzZW50ZXIudGFiOworCitpbXBvcnQgb3JnLm92aXJ0LmVuZ2luZS51aS53 ZWJhZG1pbi5naW4uQ2xpZW50R2luamVjdG9yOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3Qu SW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCisvKioKKyAqIENy ZWF0ZXMgYW5kIGJpbmRzIHtAbGluayBNYWluVGFiQ3VzdG9tUHJveHl9IGluc3RhbmNlcy4KKyAq LworcHVibGljIGNsYXNzIE1haW5UYWJDdXN0b21Qcm94eUZhY3RvcnkgeworCisgICAgcHJpdmF0 ZSBmaW5hbCBDbGllbnRHaW5qZWN0b3IgZ2luamVjdG9yOworICAgIHByaXZhdGUgZmluYWwgUHJv dmlkZXI8TWFpblRhYkN1c3RvbVByZXNlbnRlclByb3ZpZGVyPiBwcm92aWRlcjsKKworICAgIEBJ bmplY3QKKyAgICBwdWJsaWMgTWFpblRhYkN1c3RvbVByb3h5RmFjdG9yeShDbGllbnRHaW5qZWN0 b3IgZ2luamVjdG9yLAorICAgICAgICAgICAgUHJvdmlkZXI8TWFpblRhYkN1c3RvbVByZXNlbnRl clByb3ZpZGVyPiBwcm92aWRlcikgeworICAgICAgICB0aGlzLmdpbmplY3RvciA9IGdpbmplY3Rv cjsKKyAgICAgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOworICAgIH0KKworICAgIHB1Ymxp YyBNYWluVGFiQ3VzdG9tUHJveHkgY3JlYXRlKFN0cmluZyBsYWJlbCwgU3RyaW5nIGhpc3RvcnlU b2tlbiwgU3RyaW5nIGNvbnRlbnRVcmwpIHsKKyAgICAgICAgTWFpblRhYkN1c3RvbVByZXNlbnRl clByb3ZpZGVyIHByZXNlbnRlclByb3ZpZGVyID0gcHJvdmlkZXIuZ2V0KCk7CisgICAgICAgIHBy ZXNlbnRlclByb3ZpZGVyLnNldENvbnRlbnRVcmwoY29udGVudFVybCk7CisKKyAgICAgICAgLy8g Q3JlYXRlIGFuZCBiaW5kIHRoZSBwcm94eSBpbnN0YW5jZQorICAgICAgICBNYWluVGFiQ3VzdG9t UHJveHkgcHJveHkgPSBuZXcgTWFpblRhYkN1c3RvbVByb3h5KAorICAgICAgICAgICAgICAgIGdp bmplY3RvciwgcHJlc2VudGVyUHJvdmlkZXIsIGxhYmVsLCBGbG9hdC5NQVhfVkFMVUUsIGhpc3Rv cnlUb2tlbik7CisKKyAgICAgICAgcmV0dXJuIHByb3h5OworICAgIH0KKworfQpkaWZmIC0tZ2l0 IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9v dmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlvbi9tYWluL3ZpZXcvdGFiL01haW5UYWJDdXN0 b21WaWV3LmphdmEgYi9mcm9udGVuZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWlu L2phdmEvb3JnL292aXJ0L2VuZ2luZS91aS93ZWJhZG1pbi9zZWN0aW9uL21haW4vdmlldy90YWIv TWFpblRhYkN1c3RvbVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li5jOGU5NjgzCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93 ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4vc2VjdGlv bi9tYWluL3ZpZXcvdGFiL01haW5UYWJDdXN0b21WaWV3LmphdmEKQEAgLTAsMCArMSwzMiBAQAor cGFja2FnZSBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi52aWV3LnRh YjsKKworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLnZpZXcuQWJzdHJhY3RWaWV3 OworaW1wb3J0IG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uc2VjdGlvbi5tYWluLnByZXNl bnRlci50YWIuTWFpblRhYkN1c3RvbVByZXNlbnRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0 LmNvcmUuY2xpZW50LkdXVDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51aWJpbmRlci5jbGllbnQu VWlCaW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudWliaW5kZXIuY2xpZW50LlVpRmllbGQ7 CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW5saW5lTGFiZWw7CitpbXBv cnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuV2lkZ2V0OworaW1wb3J0IGNvbS5nb29n bGUuaW5qZWN0LkluamVjdDsKKworcHVibGljIGNsYXNzIE1haW5UYWJDdXN0b21WaWV3IGV4dGVu ZHMgQWJzdHJhY3RWaWV3IGltcGxlbWVudHMgTWFpblRhYkN1c3RvbVByZXNlbnRlci5WaWV3RGVm IHsKKworICAgIGludGVyZmFjZSBWaWV3VWlCaW5kZXIgZXh0ZW5kcyBVaUJpbmRlcjxXaWRnZXQs IE1haW5UYWJDdXN0b21WaWV3PiB7CisgICAgICAgIFZpZXdVaUJpbmRlciB1aUJpbmRlciA9IEdX VC5jcmVhdGUoVmlld1VpQmluZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVWlGaWVsZAorICAg IElubGluZUxhYmVsIHVybExhYmVsOworCisgICAgQEluamVjdAorICAgIHB1YmxpYyBNYWluVGFi Q3VzdG9tVmlldygpIHsKKyAgICAgICAgaW5pdFdpZGdldChWaWV3VWlCaW5kZXIudWlCaW5kZXIu Y3JlYXRlQW5kQmluZFVpKHRoaXMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJs aWMgdm9pZCBzZXRDb250ZW50VXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgdXJsTGFiZWwuc2V0 VGV4dCh1cmwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZnJvbnRlbmQvd2ViYWRtaW4vbW9k dWxlcy93ZWJhZG1pbi9zcmMvbWFpbi9qYXZhL29yZy9vdmlydC9lbmdpbmUvdWkvd2ViYWRtaW4v c2VjdGlvbi9tYWluL3ZpZXcvdGFiL01haW5UYWJDdXN0b21WaWV3LnVpLnhtbCBiL2Zyb250ZW5k L3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2YS9vcmcvb3ZpcnQvZW5naW5l L3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi92aWV3L3RhYi9NYWluVGFiQ3VzdG9tVmlldy51aS54 bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczMWJlMgotLS0gL2Rldi9u dWxsCisrKyBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vamF2 YS9vcmcvb3ZpcnQvZW5naW5lL3VpL3dlYmFkbWluL3NlY3Rpb24vbWFpbi92aWV3L3RhYi9NYWlu VGFiQ3VzdG9tVmlldy51aS54bWwKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4w IiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSB1aTpVaUJpbmRlciBTWVNURU0gImh0dHA6 Ly9kbC5nb29nbGUuY29tL2d3dC9EVEQveGh0bWwuZW50Ij4KKzx1aTpVaUJpbmRlciB4bWxuczp1 aT0idXJuOnVpOmNvbS5nb29nbGUuZ3d0LnVpYmluZGVyIiB4bWxuczpnPSJ1cm46aW1wb3J0OmNv bS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpIj4KKworCTxnOkhUTUxQYW5lbD4KKwkJVE9ETyBk aXNwbGF5IHRoaXMgVVJMOgorCQk8ZzpJbmxpbmVMYWJlbCB1aTpmaWVsZD0idXJsTGFiZWwiIC8+ CisJPC9nOkhUTUxQYW5lbD4KKworPC91aTpVaUJpbmRlcj4KZGlmZiAtLWdpdCBhL2Zyb250ZW5k L3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnht bCBiL2Zyb250ZW5kL3dlYmFkbWluL21vZHVsZXMvd2ViYWRtaW4vc3JjL21haW4vd2ViYXBwL1dF Qi1JTkYvd2ViLnhtbAppbmRleCA1MzlkM2Q4Li5kYmY5M2EyIDEwMDY0NAotLS0gYS9mcm9udGVu ZC93ZWJhZG1pbi9tb2R1bGVzL3dlYmFkbWluL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54 bWwKKysrIGIvZnJvbnRlbmQvd2ViYWRtaW4vbW9kdWxlcy93ZWJhZG1pbi9zcmMvbWFpbi93ZWJh cHAvV0VCLUlORi93ZWIueG1sCkBAIC0yMyw2ICsyMywxNiBAQAogCQk8dXJsLXBhdHRlcm4+L3dl YmFkbWluL1dlYkFkbWluLmh0bWw8L3VybC1wYXR0ZXJuPgogCTwvc2VydmxldC1tYXBwaW5nPgog CisJPHNlcnZsZXQ+CisJCTxzZXJ2bGV0LW5hbWU+UGx1Z2luU291cmNlUGFnZTwvc2VydmxldC1u YW1lPgorCQk8c2VydmxldC1jbGFzcz5vcmcub3ZpcnQuZW5naW5lLnVpLmZyb250ZW5kLnNlcnZl ci5nd3QuUGx1Z2luU291cmNlUGFnZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisJPC9zZXJ2bGV0 PgorCisJPHNlcnZsZXQtbWFwcGluZz4KKwkJPHNlcnZsZXQtbmFtZT5QbHVnaW5Tb3VyY2VQYWdl PC9zZXJ2bGV0LW5hbWU+CisJCTx1cmwtcGF0dGVybj4vd2ViYWRtaW4vUGx1Z2luU291cmNlUGFn ZTwvdXJsLXBhdHRlcm4+CisJPC9zZXJ2bGV0LW1hcHBpbmc+CisKIAk8IS0tIERlZmF1bHQgcGFn ZSB0byBzZXJ2ZSAtLT4KIAk8d2VsY29tZS1maWxlLWxpc3Q+CiAJCTx3ZWxjb21lLWZpbGU+aW5k ZXguaHRtbDwvd2VsY29tZS1maWxlPgotLSAKMS43LjQuNAoK ------=_Part_15487246_1395069322.1346341179024--

Nice work Vojtech, just some comments about the PluginSourcePageServlet: * You can avoid the hardcoded plugin code location with something like this: import org.ovirt.engine.core.utils.LocalConfig; File dataDir = LocalConfig.getInstance().getUsrDir(); File pluginCodeLocation = new File(etcDir, "ui-plugins"); That will result in /usr/share/ovirt-engine/ui-plugins or whatever directory is configured in the ENGINE_USR parameter in the /etc/sysconfig/ovirt-engine file. * It is very important to check the sanity of the value of the "plugin" parameter, otherwise an attacker could send you a name with backpaths, and that can result in accessing an unexpected file. In this particular case you are adding the ".js" extension, so it won't probably result in accessing dangerous files, but anyhow it is a good practice. I would recommend to do something like this: String pluginName = request.getParameter("plugin"); if (pluginName != null || !isSane(pluginName)) { ... } The "isSane" method can do something similar to the "isSane" method in the "FileServlet" class (I think you already mentioned this at some point), maybe even forbid slashes as well. * When copying the plugin file to the generated page you can avoid the extra Buffered reader/writer as you are already using your own buffer in the "copyChars" method (which is very good practice). For the output you can directly use "response.getWriter()" instead of "response.getOutputStream()", that is already buffered by the container. On 08/30/2012 05:39 PM, Vojtech Szocs wrote:
Hello everyone,
as a follow-up to my last email on improving plugin API, here comes the latest revision of UI Plugins proof-of-concept patch (please find it attached).
This patch is focused on improving JavaScript plugin API, along with important changes and improvements made to plugin infrastructure ( PluginManager ). Let's walk through the changes step by step.
Improved plugin API, taking some inspiration from jQuery
Following is a sample plugin code that uses new plugin API:
var myPlugin = pluginApi('myPlugin'); // Obtain plugin API instance for 'myPlugin' var myPluginConfig = myPlugin.configObject(); // Obtain plugin-specific configuration
// Register event handler functions to be invoked by WebAdmin // Note: all functions are optional, the plugin only defines functions for events it wants to handle myPlugin.register({ UiInit: function() { var testUrl = 'http://www.example.com/' + myPluginConfig.foo; // Assume plugin configuration has 'foo' attribute myPlugin.ui.addMainTab('Custom Tab', 'custom-tab', testUrl); // Invoke some operation using plugin API } });
myPlugin.ready(); // Event handler functions are registered, we are now ready to get initialized (UiInit)
UI plugin life-cycle, enforced by plugin infrastructure
The PluginState enumeration lists possible states of a plugin during its runtime:
* DEFINED : This is the initial state for all plugins. Plugin meta-data has been read by PluginManager and the corresponding iframe element has been created for the plugin. Note that at this point, the iframe element is not attached to DOM yet. * LOADING : The iframe element for the plugin has been attached to DOM, which causes plugin host page (previously known as plugin source page) to be fetched asynchronously in the background. We are now waiting for plugin to report in as ready. In practice, due to JavaScript runtime being single-threaded, WebAdmin startup logic will continue to execute until the JavaScript runtime is "idle" (browser event loop returns), and at this point JavaScript plugin code gets invoked through the plugin host page. * READY : The plugin has indicated that it is ready for use. We assume the plugin has already registered its event handler object (object containing various event handler functions to be called by WebAdmin) at this point. We can now proceed with plugin initialization. * INITIALIZED : The plugin has been initialized by calling UiInit function on its event handler object. We can now call other event handler functions, the plugin is now initialized and in use.
Note on plugin initialization: the UiInit function will be called just once during the lifetime of the plugin, after the plugin reports in as ready AND WebAdmin enters the state that allows plugins to be invoked (entering main section for logged-in users), and before other event handler functions are invoked by the plugin infrastructure.
Plugin meta-data is now passed to client using different format
Previously, plugin meta-data was embedded into WebAdmin host page as a simple JavaScript object, like so:
var pluginDefinitions = { myPlugin: "<URL>", anotherPlugin: "<URL>" }
Now, plugin meta-data is embedded into WebAdmin host page as a JavaScript array, like so:
var pluginDefinitions = [ { name: "myPlugin", url: "<URL>", config: { "foo": 1, "bar": "whatever" } }, { name: "anotherPlugin", url: "<URL>" }
];
As you can see, pluginDefinitions is now an array of JavaScript objects, with each object representing plugin meta-data. The "name" and "url" attributes are mandatory (we need to check them when loading plugin descriptors). "config" is the plugin configuration (JSON) object, obtained by merging default plugin configuration (defined in plugin descriptor) with custom plugin configuration (defined in external plugin configuration file). Note that the "config" attribute is optional.
In terms of Java classes, pluginDefinitions is mapped to PluginDefinitions overlay type, and each meta-data object within the array is mapped to PluginMetaData overlay type.
Note on using assert statements in client code: you might notice that I'm using a lot of assert statements in Plugin class. This is to ensure consistency and guard against corrupted state during development. In GWT, assert statements work in a different way than in standard Java VM. When debugging GWT application using Development Mode, assert statements are checked and throw assertion errors during runtime (they are displayed in Development Mode console). However, when compiling GWT application to JavaScript (Production Mode), assert statements are removed by GWT compiler, so they don't affect the application running in Production Mode.
Cheers, Vojtech
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel
-- Dirección Comercial: C/Jose Bardasano Baos, 9, Edif. Gorbea 3, planta 3ºD, 28016 Madrid, Spain Inscrita en el Reg. Mercantil de Madrid – C.I.F. B82657941 - Red Hat S.L.

Hi Juan, thanks for your comments :) Server-side components of UI plugin infrastructure (such as PluginSourcePageServlet) indeed need some more work, I agree with your points. I was thinking that PluginSourcePageServlet and FileServlet are quite similar in their purpose, serving static resources from local filesystem. FileServlet is intended for general use, with 'file' parameter configured as servlet init-param. For example, FileServlet could be used to serve static resources from /usr/share/ovirt-engine/ui-plugins: <servlet> <servlet-name>pluginResourceServlet</servlet-name> <servlet-class>org.ovirt.engine.core.FileServlet</servlet-class> <init-param> <param-name>file</param-name> <param-value>/usr/share/ovirt-engine/ui-plugins</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>pluginResourceServlet</servlet-name> <url-pattern>/plugins/*</url-pattern> </servlet-mapping> Assuming following directory convention for UI plugin descriptors and actual plugin resources: /usr/share/ovirt-engine/ui-plugins/foo.json -> Plugin descriptor /usr/share/ovirt-engine/ui-plugins/foo/start.html -> Plugin host page /usr/share/ovirt-engine/ui-plugins/foo/foo.js -> Actual plugin code (referenced by plugin host page) Such servlet could be used to map "http(s)://<EngineHost>:8700/plugins/foo/start.html" to /usr/share/ovirt-engine/ui-plugins/foo/start.html (note that FileServlet is in root WAR context) The purpose of PluginSourcePageServlet is very similar, but in terms of FileServlet, the 'file' parameter is not static (defined in web.xml as init-param), but depends on plugin meta-data (defined in foo.json) for each plugin. PluginSourcePageServlet was meant to map "http(s)://<EngineHost>:8700/webadmin/webadmin/plugin/foo/start.html" to /custom/plugin/base/directory/start.html (note that PluginSourcePageServlet is in WebAdmin WAR context) Juan - do you think we could modify/reuse FileServlet for serving UI plugin static resources? As mentioned above, the only difference is that the 'file' parameter (base directory) would be potentially different for each plugin. Please let me know what you think about it. Thanks, Vojtech ----- Original Message ----- From: "Juan Hernandez" <jhernand@redhat.com> To: "Vojtech Szocs" <vszocs@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Thursday, August 30, 2012 8:24:02 PM Subject: Re: [Engine-devel] Update on UI Plugins: PoC patch revision 4 Nice work Vojtech, just some comments about the PluginSourcePageServlet: * You can avoid the hardcoded plugin code location with something like this: import org.ovirt.engine.core.utils.LocalConfig; File dataDir = LocalConfig.getInstance().getUsrDir(); File pluginCodeLocation = new File(etcDir, "ui-plugins"); That will result in /usr/share/ovirt-engine/ui-plugins or whatever directory is configured in the ENGINE_USR parameter in the /etc/sysconfig/ovirt-engine file. * It is very important to check the sanity of the value of the "plugin" parameter, otherwise an attacker could send you a name with backpaths, and that can result in accessing an unexpected file. In this particular case you are adding the ".js" extension, so it won't probably result in accessing dangerous files, but anyhow it is a good practice. I would recommend to do something like this: String pluginName = request.getParameter("plugin"); if (pluginName != null || !isSane(pluginName)) { ... } The "isSane" method can do something similar to the "isSane" method in the "FileServlet" class (I think you already mentioned this at some point), maybe even forbid slashes as well. * When copying the plugin file to the generated page you can avoid the extra Buffered reader/writer as you are already using your own buffer in the "copyChars" method (which is very good practice). For the output you can directly use "response.getWriter()" instead of "response.getOutputStream()", that is already buffered by the container. On 08/30/2012 05:39 PM, Vojtech Szocs wrote:
Hello everyone,
as a follow-up to my last email on improving plugin API, here comes the latest revision of UI Plugins proof-of-concept patch (please find it attached).
This patch is focused on improving JavaScript plugin API, along with important changes and improvements made to plugin infrastructure ( PluginManager ). Let's walk through the changes step by step.
Improved plugin API, taking some inspiration from jQuery
Following is a sample plugin code that uses new plugin API:
var myPlugin = pluginApi('myPlugin'); // Obtain plugin API instance for 'myPlugin' var myPluginConfig = myPlugin.configObject(); // Obtain plugin-specific configuration
// Register event handler functions to be invoked by WebAdmin // Note: all functions are optional, the plugin only defines functions for events it wants to handle myPlugin.register({ UiInit: function() { var testUrl = 'http://www.example.com/' + myPluginConfig.foo; // Assume plugin configuration has 'foo' attribute myPlugin.ui.addMainTab('Custom Tab', 'custom-tab', testUrl); // Invoke some operation using plugin API } });
myPlugin.ready(); // Event handler functions are registered, we are now ready to get initialized (UiInit)
UI plugin life-cycle, enforced by plugin infrastructure
The PluginState enumeration lists possible states of a plugin during its runtime:
* DEFINED : This is the initial state for all plugins. Plugin meta-data has been read by PluginManager and the corresponding iframe element has been created for the plugin. Note that at this point, the iframe element is not attached to DOM yet. * LOADING : The iframe element for the plugin has been attached to DOM, which causes plugin host page (previously known as plugin source page) to be fetched asynchronously in the background. We are now waiting for plugin to report in as ready. In practice, due to JavaScript runtime being single-threaded, WebAdmin startup logic will continue to execute until the JavaScript runtime is "idle" (browser event loop returns), and at this point JavaScript plugin code gets invoked through the plugin host page. * READY : The plugin has indicated that it is ready for use. We assume the plugin has already registered its event handler object (object containing various event handler functions to be called by WebAdmin) at this point. We can now proceed with plugin initialization. * INITIALIZED : The plugin has been initialized by calling UiInit function on its event handler object. We can now call other event handler functions, the plugin is now initialized and in use.
Note on plugin initialization: the UiInit function will be called just once during the lifetime of the plugin, after the plugin reports in as ready AND WebAdmin enters the state that allows plugins to be invoked (entering main section for logged-in users), and before other event handler functions are invoked by the plugin infrastructure.
Plugin meta-data is now passed to client using different format
Previously, plugin meta-data was embedded into WebAdmin host page as a simple JavaScript object, like so:
var pluginDefinitions = { myPlugin: "<URL>", anotherPlugin: "<URL>" }
Now, plugin meta-data is embedded into WebAdmin host page as a JavaScript array, like so:
var pluginDefinitions = [ { name: "myPlugin", url: "<URL>", config: { "foo": 1, "bar": "whatever" } }, { name: "anotherPlugin", url: "<URL>" }
];
As you can see, pluginDefinitions is now an array of JavaScript objects, with each object representing plugin meta-data. The "name" and "url" attributes are mandatory (we need to check them when loading plugin descriptors). "config" is the plugin configuration (JSON) object, obtained by merging default plugin configuration (defined in plugin descriptor) with custom plugin configuration (defined in external plugin configuration file). Note that the "config" attribute is optional.
In terms of Java classes, pluginDefinitions is mapped to PluginDefinitions overlay type, and each meta-data object within the array is mapped to PluginMetaData overlay type.
Note on using assert statements in client code: you might notice that I'm using a lot of assert statements in Plugin class. This is to ensure consistency and guard against corrupted state during development. In GWT, assert statements work in a different way than in standard Java VM. When debugging GWT application using Development Mode, assert statements are checked and throw assertion errors during runtime (they are displayed in Development Mode console). However, when compiling GWT application to JavaScript (Production Mode), assert statements are removed by GWT compiler, so they don't affect the application running in Production Mode.
Cheers, Vojtech
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel
-- Dirección Comercial: C/Jose Bardasano Baos, 9, Edif. Gorbea 3, planta 3ºD, 28016 Madrid, Spain Inscrita en el Reg. Mercantil de Madrid – C.I.F. B82657941 - Red Hat S.L.

----- Original Message -----
From: "Vojtech Szocs" <vszocs@redhat.com> To: "Juan Hernandez" <jhernand@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Tuesday, September 4, 2012 3:04:50 PM Subject: Re: [Engine-devel] Update on UI Plugins: PoC patch revision 4
Hi Juan, thanks for your comments :)
Server-side components of UI plugin infrastructure (such as PluginSourcePageServlet) indeed need some more work, I agree with your points.
I was thinking that PluginSourcePageServlet and FileServlet are quite similar in their purpose, serving static resources from local filesystem. FileServlet is intended for general use, with 'file' parameter configured as servlet init-param. For example, FileServlet could be used to serve static resources from /usr/share/ovirt-engine/ui-plugins:
<servlet> <servlet-name>pluginResourceServlet</servlet-name> <servlet-class>org.ovirt.engine.core.FileServlet</servlet-class> <init-param> <param-name>file</param-name> <param-value>/usr/share/ovirt-engine/ui-plugins</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>pluginResourceServlet</servlet-name> <url-pattern>/plugins/*</url-pattern> </servlet-mapping>
Assuming following directory convention for UI plugin descriptors and actual plugin resources: /usr/share/ovirt-engine/ui-plugins/foo.json -> Plugin descriptor /usr/share/ovirt-engine/ui-plugins/foo/start.html -> Plugin host page /usr/share/ovirt-engine/ui-plugins/foo/foo.js -> Actual plugin code (referenced by plugin host page)
Such servlet could be used to map "http(s)://<EngineHost>:8700/plugins/foo/start.html" to /usr/share/ovirt-engine/ui-plugins/foo/start.html (note that FileServlet is in root WAR context)
The purpose of PluginSourcePageServlet is very similar, but in terms of FileServlet, the 'file' parameter is not static (defined in web.xml as init-param), but depends on plugin meta-data (defined in foo.json) for each plugin.
PluginSourcePageServlet was meant to map "http(s)://<EngineHost>:8700/webadmin/webadmin/plugin/foo/start.html" to /custom/plugin/base/directory/start.html (note that PluginSourcePageServlet is in WebAdmin WAR context)
Juan - do you think we could modify/reuse FileServlet for serving UI plugin static resources? As mentioned above, the only difference is that the 'file' parameter (base directory) would be potentially different for each plugin. Please let me know what you think about it.
Thanks, Vojtech
----- Original Message ----- From: "Juan Hernandez" <jhernand@redhat.com> To: "Vojtech Szocs" <vszocs@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Thursday, August 30, 2012 8:24:02 PM Subject: Re: [Engine-devel] Update on UI Plugins: PoC patch revision 4
Nice work Vojtech, just some comments about the PluginSourcePageServlet:
* You can avoid the hardcoded plugin code location with something like this:
import org.ovirt.engine.core.utils.LocalConfig;
File dataDir = LocalConfig.getInstance().getUsrDir(); File pluginCodeLocation = new File(etcDir, "ui-plugins");
That will result in /usr/share/ovirt-engine/ui-plugins or whatever directory is configured in the ENGINE_USR parameter in the /etc/sysconfig/ovirt-engine file.
* It is very important to check the sanity of the value of the "plugin" parameter, otherwise an attacker could send you a name with backpaths, and that can result in accessing an unexpected file. In this particular case you are adding the ".js" extension, so it won't probably result in accessing dangerous files, but anyhow it is a good practice. I would recommend to do something like this:
String pluginName = request.getParameter("plugin"); if (pluginName != null || !isSane(pluginName)) { ... }
The "isSane" method can do something similar to the "isSane" method in the "FileServlet" class (I think you already mentioned this at some point), maybe even forbid slashes as well.
* When copying the plugin file to the generated page you can avoid the extra Buffered reader/writer as you are already using your own buffer in the "copyChars" method (which is very good practice).
For the output you can directly use "response.getWriter()" instead of "response.getOutputStream()", that is already buffered by the container.
On 08/30/2012 05:39 PM, Vojtech Szocs wrote:
Hello everyone,
as a follow-up to my last email on improving plugin API, here comes the latest revision of UI Plugins proof-of-concept patch (please find it attached).
This patch is focused on improving JavaScript plugin API, along with important changes and improvements made to plugin infrastructure ( PluginManager ). Let's walk through the changes step by step.
Improved plugin API, taking some inspiration from jQuery
Following is a sample plugin code that uses new plugin API:
var myPlugin = pluginApi('myPlugin'); // Obtain plugin API instance for 'myPlugin' var myPluginConfig = myPlugin.configObject(); // Obtain plugin-specific configuration
// Register event handler functions to be invoked by WebAdmin // Note: all functions are optional, the plugin only defines functions for events it wants to handle myPlugin.register({ UiInit: function() { var testUrl = 'http://www.example.com/' + myPluginConfig.foo; // Assume plugin configuration has 'foo' attribute myPlugin.ui.addMainTab('Custom Tab', 'custom-tab', testUrl); // Invoke some operation using plugin API } });
myPlugin.ready(); // Event handler functions are registered, we are now ready to get initialized (UiInit)
UI plugin life-cycle, enforced by plugin infrastructure
The PluginState enumeration lists possible states of a plugin during its runtime:
* DEFINED : This is the initial state for all plugins. Plugin meta-data has been read by PluginManager and the corresponding iframe element has been created for the plugin. Note that at this point, the iframe element is not attached to DOM yet. * LOADING : The iframe element for the plugin has been attached to DOM, which causes plugin host page (previously known as plugin source page) to be fetched asynchronously in the background. We are now waiting for plugin to report in as ready. In practice, due to JavaScript runtime being single-threaded, WebAdmin startup logic will continue to execute until the JavaScript runtime is "idle" (browser event loop returns), and at this point JavaScript plugin code gets invoked through the plugin host page. * READY : The plugin has indicated that it is ready for use. We assume the plugin has already registered its event handler object (object containing various event handler functions to be called by WebAdmin) at this point. We can now proceed with plugin initialization. * INITIALIZED : The plugin has been initialized by calling UiInit function on its event handler object. We can now call other event handler functions, the plugin is now initialized and in use.
Note on plugin initialization: the UiInit function will be called just once during the lifetime of the plugin, after the plugin reports in as ready AND WebAdmin enters the state that allows plugins to be invoked (entering main section for logged-in users), and before other event handler functions are invoked by the plugin infrastructure.
Plugin meta-data is now passed to client using different format
Previously, plugin meta-data was embedded into WebAdmin host page as a simple JavaScript object, like so:
var pluginDefinitions = { myPlugin: "<URL>", anotherPlugin: "<URL>" }
Now, plugin meta-data is embedded into WebAdmin host page as a JavaScript array, like so:
var pluginDefinitions = [ { name: "myPlugin", url: "<URL>", config: { "foo": 1, "bar": "whatever" } }, { name: "anotherPlugin", url: "<URL>" }
];
As you can see, pluginDefinitions is now an array of JavaScript objects, with each object representing plugin meta-data. The "name" and "url" attributes are mandatory (we need to check them when loading plugin descriptors). "config" is the plugin configuration (JSON) object, obtained by merging default plugin configuration (defined in plugin descriptor) with custom plugin configuration (defined in external plugin configuration file). Note that the "config" attribute is optional.
In terms of Java classes, pluginDefinitions is mapped to PluginDefinitions overlay type, and each meta-data object within the array is mapped to PluginMetaData overlay type.
Note on using assert statements in client code: you might notice that I'm using a lot of assert statements in Plugin class. This is to ensure consistency and guard against corrupted state during development. In GWT, assert statements work in a different way than in standard Java VM. When debugging GWT application using Development Mode, assert statements are checked and throw assertion errors during runtime (they are displayed in Development Mode console). However, when compiling GWT application to JavaScript (Production Mode), assert statements are removed by GWT compiler, so they don't affect the application running in Production Mode.
Cheers, Vojtech
Hi Vojtech, Looks very interesting. In the context of the client code, I have a suggestion that I'd like to be considered; Will it be possible to allow re-using some of the existing dialogs in the system? In this way, I may be able to use the pop-up dialog of edit-policy for example. This will keep the look and feel, and allow people to reduce issues when re-using existing code. Thanks! Doron

Hi Doron, interesting use-case for UI plugins! Existing (standard) WebAdmin dialogs could be made extensible for plugin authors, so that additional UI elements (like text boxes) could be added to dialog UI. On one side, extensible dialogs (like the Edit Cluster Policy dialog you mentioned) would provide a way to register new UI elements, controlled and driven through plugin API. On the other side, the code behind extensible dialogs would collect values from extra UI elements, and handle them as appropriate, e.g. pass them along the standard values when communicating with the backend. I think we can add this to post-PoC-rev5 feature list. Cheers, Vojtech ----- Original Message ----- From: "Doron Fediuck" <dfediuck@redhat.com> To: "Vojtech Szocs" <vszocs@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Tuesday, September 4, 2012 4:10:19 PM Subject: Re: [Engine-devel] Update on UI Plugins: PoC patch revision 4 ----- Original Message -----
From: "Vojtech Szocs" <vszocs@redhat.com> To: "Juan Hernandez" <jhernand@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Tuesday, September 4, 2012 3:04:50 PM Subject: Re: [Engine-devel] Update on UI Plugins: PoC patch revision 4
Hi Juan, thanks for your comments :)
Server-side components of UI plugin infrastructure (such as PluginSourcePageServlet) indeed need some more work, I agree with your points.
I was thinking that PluginSourcePageServlet and FileServlet are quite similar in their purpose, serving static resources from local filesystem. FileServlet is intended for general use, with 'file' parameter configured as servlet init-param. For example, FileServlet could be used to serve static resources from /usr/share/ovirt-engine/ui-plugins:
<servlet> <servlet-name>pluginResourceServlet</servlet-name> <servlet-class>org.ovirt.engine.core.FileServlet</servlet-class> <init-param> <param-name>file</param-name> <param-value>/usr/share/ovirt-engine/ui-plugins</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>pluginResourceServlet</servlet-name> <url-pattern>/plugins/*</url-pattern> </servlet-mapping>
Assuming following directory convention for UI plugin descriptors and actual plugin resources: /usr/share/ovirt-engine/ui-plugins/foo.json -> Plugin descriptor /usr/share/ovirt-engine/ui-plugins/foo/start.html -> Plugin host page /usr/share/ovirt-engine/ui-plugins/foo/foo.js -> Actual plugin code (referenced by plugin host page)
Such servlet could be used to map "http(s)://<EngineHost>:8700/plugins/foo/start.html" to /usr/share/ovirt-engine/ui-plugins/foo/start.html (note that FileServlet is in root WAR context)
The purpose of PluginSourcePageServlet is very similar, but in terms of FileServlet, the 'file' parameter is not static (defined in web.xml as init-param), but depends on plugin meta-data (defined in foo.json) for each plugin.
PluginSourcePageServlet was meant to map "http(s)://<EngineHost>:8700/webadmin/webadmin/plugin/foo/start.html" to /custom/plugin/base/directory/start.html (note that PluginSourcePageServlet is in WebAdmin WAR context)
Juan - do you think we could modify/reuse FileServlet for serving UI plugin static resources? As mentioned above, the only difference is that the 'file' parameter (base directory) would be potentially different for each plugin. Please let me know what you think about it.
Thanks, Vojtech
----- Original Message ----- From: "Juan Hernandez" <jhernand@redhat.com> To: "Vojtech Szocs" <vszocs@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Thursday, August 30, 2012 8:24:02 PM Subject: Re: [Engine-devel] Update on UI Plugins: PoC patch revision 4
Nice work Vojtech, just some comments about the PluginSourcePageServlet:
* You can avoid the hardcoded plugin code location with something like this:
import org.ovirt.engine.core.utils.LocalConfig;
File dataDir = LocalConfig.getInstance().getUsrDir(); File pluginCodeLocation = new File(etcDir, "ui-plugins");
That will result in /usr/share/ovirt-engine/ui-plugins or whatever directory is configured in the ENGINE_USR parameter in the /etc/sysconfig/ovirt-engine file.
* It is very important to check the sanity of the value of the "plugin" parameter, otherwise an attacker could send you a name with backpaths, and that can result in accessing an unexpected file. In this particular case you are adding the ".js" extension, so it won't probably result in accessing dangerous files, but anyhow it is a good practice. I would recommend to do something like this:
String pluginName = request.getParameter("plugin"); if (pluginName != null || !isSane(pluginName)) { ... }
The "isSane" method can do something similar to the "isSane" method in the "FileServlet" class (I think you already mentioned this at some point), maybe even forbid slashes as well.
* When copying the plugin file to the generated page you can avoid the extra Buffered reader/writer as you are already using your own buffer in the "copyChars" method (which is very good practice).
For the output you can directly use "response.getWriter()" instead of "response.getOutputStream()", that is already buffered by the container.
On 08/30/2012 05:39 PM, Vojtech Szocs wrote:
Hello everyone,
as a follow-up to my last email on improving plugin API, here comes the latest revision of UI Plugins proof-of-concept patch (please find it attached).
This patch is focused on improving JavaScript plugin API, along with important changes and improvements made to plugin infrastructure ( PluginManager ). Let's walk through the changes step by step.
Improved plugin API, taking some inspiration from jQuery
Following is a sample plugin code that uses new plugin API:
var myPlugin = pluginApi('myPlugin'); // Obtain plugin API instance for 'myPlugin' var myPluginConfig = myPlugin.configObject(); // Obtain plugin-specific configuration
// Register event handler functions to be invoked by WebAdmin // Note: all functions are optional, the plugin only defines functions for events it wants to handle myPlugin.register({ UiInit: function() { var testUrl = 'http://www.example.com/' + myPluginConfig.foo; // Assume plugin configuration has 'foo' attribute myPlugin.ui.addMainTab('Custom Tab', 'custom-tab', testUrl); // Invoke some operation using plugin API } });
myPlugin.ready(); // Event handler functions are registered, we are now ready to get initialized (UiInit)
UI plugin life-cycle, enforced by plugin infrastructure
The PluginState enumeration lists possible states of a plugin during its runtime:
* DEFINED : This is the initial state for all plugins. Plugin meta-data has been read by PluginManager and the corresponding iframe element has been created for the plugin. Note that at this point, the iframe element is not attached to DOM yet. * LOADING : The iframe element for the plugin has been attached to DOM, which causes plugin host page (previously known as plugin source page) to be fetched asynchronously in the background. We are now waiting for plugin to report in as ready. In practice, due to JavaScript runtime being single-threaded, WebAdmin startup logic will continue to execute until the JavaScript runtime is "idle" (browser event loop returns), and at this point JavaScript plugin code gets invoked through the plugin host page. * READY : The plugin has indicated that it is ready for use. We assume the plugin has already registered its event handler object (object containing various event handler functions to be called by WebAdmin) at this point. We can now proceed with plugin initialization. * INITIALIZED : The plugin has been initialized by calling UiInit function on its event handler object. We can now call other event handler functions, the plugin is now initialized and in use.
Note on plugin initialization: the UiInit function will be called just once during the lifetime of the plugin, after the plugin reports in as ready AND WebAdmin enters the state that allows plugins to be invoked (entering main section for logged-in users), and before other event handler functions are invoked by the plugin infrastructure.
Plugin meta-data is now passed to client using different format
Previously, plugin meta-data was embedded into WebAdmin host page as a simple JavaScript object, like so:
var pluginDefinitions = { myPlugin: "<URL>", anotherPlugin: "<URL>" }
Now, plugin meta-data is embedded into WebAdmin host page as a JavaScript array, like so:
var pluginDefinitions = [ { name: "myPlugin", url: "<URL>", config: { "foo": 1, "bar": "whatever" } }, { name: "anotherPlugin", url: "<URL>" }
];
As you can see, pluginDefinitions is now an array of JavaScript objects, with each object representing plugin meta-data. The "name" and "url" attributes are mandatory (we need to check them when loading plugin descriptors). "config" is the plugin configuration (JSON) object, obtained by merging default plugin configuration (defined in plugin descriptor) with custom plugin configuration (defined in external plugin configuration file). Note that the "config" attribute is optional.
In terms of Java classes, pluginDefinitions is mapped to PluginDefinitions overlay type, and each meta-data object within the array is mapped to PluginMetaData overlay type.
Note on using assert statements in client code: you might notice that I'm using a lot of assert statements in Plugin class. This is to ensure consistency and guard against corrupted state during development. In GWT, assert statements work in a different way than in standard Java VM. When debugging GWT application using Development Mode, assert statements are checked and throw assertion errors during runtime (they are displayed in Development Mode console). However, when compiling GWT application to JavaScript (Production Mode), assert statements are removed by GWT compiler, so they don't affect the application running in Production Mode.
Cheers, Vojtech
Hi Vojtech, Looks very interesting. In the context of the client code, I have a suggestion that I'd like to be considered; Will it be possible to allow re-using some of the existing dialogs in the system? In this way, I may be able to use the pop-up dialog of edit-policy for example. This will keep the look and feel, and allow people to reduce issues when re-using existing code. Thanks! Doron

----- Original Message -----
From: "Vojtech Szocs" <vszocs@redhat.com> To: "Doron Fediuck" <dfediuck@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Tuesday, September 4, 2012 5:46:01 PM Subject: Re: [Engine-devel] Update on UI Plugins: PoC patch revision 4
Hi Doron,
interesting use-case for UI plugins! Existing (standard) WebAdmin dialogs could be made extensible for plugin authors, so that additional UI elements (like text boxes) could be added to dialog UI.
On one side, extensible dialogs (like the Edit Cluster Policy dialog you mentioned) would provide a way to register new UI elements, controlled and driven through plugin API. On the other side, the code behind extensible dialogs would collect values from extra UI elements, and handle them as appropriate, e.g. pass them along the standard values when communicating with the backend.
I think we can add this to post-PoC-rev5 feature list.
Cheers, Vojtech
Excellent, Vojtech. I'll monitor for news in this thread. Thanks!
----- Original Message ----- From: "Doron Fediuck" <dfediuck@redhat.com> To: "Vojtech Szocs" <vszocs@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Tuesday, September 4, 2012 4:10:19 PM Subject: Re: [Engine-devel] Update on UI Plugins: PoC patch revision 4
----- Original Message -----
From: "Vojtech Szocs" <vszocs@redhat.com> To: "Juan Hernandez" <jhernand@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Tuesday, September 4, 2012 3:04:50 PM Subject: Re: [Engine-devel] Update on UI Plugins: PoC patch revision 4
Hi Juan, thanks for your comments :)
Server-side components of UI plugin infrastructure (such as PluginSourcePageServlet) indeed need some more work, I agree with your points.
I was thinking that PluginSourcePageServlet and FileServlet are quite similar in their purpose, serving static resources from local filesystem. FileServlet is intended for general use, with 'file' parameter configured as servlet init-param. For example, FileServlet could be used to serve static resources from /usr/share/ovirt-engine/ui-plugins:
<servlet> <servlet-name>pluginResourceServlet</servlet-name> <servlet-class>org.ovirt.engine.core.FileServlet</servlet-class> <init-param> <param-name>file</param-name> <param-value>/usr/share/ovirt-engine/ui-plugins</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>pluginResourceServlet</servlet-name> <url-pattern>/plugins/*</url-pattern> </servlet-mapping>
Assuming following directory convention for UI plugin descriptors and actual plugin resources: /usr/share/ovirt-engine/ui-plugins/foo.json -> Plugin descriptor /usr/share/ovirt-engine/ui-plugins/foo/start.html -> Plugin host page /usr/share/ovirt-engine/ui-plugins/foo/foo.js -> Actual plugin code (referenced by plugin host page)
Such servlet could be used to map "http(s)://<EngineHost>:8700/plugins/foo/start.html" to /usr/share/ovirt-engine/ui-plugins/foo/start.html (note that FileServlet is in root WAR context)
The purpose of PluginSourcePageServlet is very similar, but in terms of FileServlet, the 'file' parameter is not static (defined in web.xml as init-param), but depends on plugin meta-data (defined in foo.json) for each plugin.
PluginSourcePageServlet was meant to map "http(s)://<EngineHost>:8700/webadmin/webadmin/plugin/foo/start.html" to /custom/plugin/base/directory/start.html (note that PluginSourcePageServlet is in WebAdmin WAR context)
Juan - do you think we could modify/reuse FileServlet for serving UI plugin static resources? As mentioned above, the only difference is that the 'file' parameter (base directory) would be potentially different for each plugin. Please let me know what you think about it.
Thanks, Vojtech
----- Original Message ----- From: "Juan Hernandez" <jhernand@redhat.com> To: "Vojtech Szocs" <vszocs@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Thursday, August 30, 2012 8:24:02 PM Subject: Re: [Engine-devel] Update on UI Plugins: PoC patch revision 4
Nice work Vojtech, just some comments about the PluginSourcePageServlet:
* You can avoid the hardcoded plugin code location with something like this:
import org.ovirt.engine.core.utils.LocalConfig;
File dataDir = LocalConfig.getInstance().getUsrDir(); File pluginCodeLocation = new File(etcDir, "ui-plugins");
That will result in /usr/share/ovirt-engine/ui-plugins or whatever directory is configured in the ENGINE_USR parameter in the /etc/sysconfig/ovirt-engine file.
* It is very important to check the sanity of the value of the "plugin" parameter, otherwise an attacker could send you a name with backpaths, and that can result in accessing an unexpected file. In this particular case you are adding the ".js" extension, so it won't probably result in accessing dangerous files, but anyhow it is a good practice. I would recommend to do something like this:
String pluginName = request.getParameter("plugin"); if (pluginName != null || !isSane(pluginName)) { ... }
The "isSane" method can do something similar to the "isSane" method in the "FileServlet" class (I think you already mentioned this at some point), maybe even forbid slashes as well.
* When copying the plugin file to the generated page you can avoid the extra Buffered reader/writer as you are already using your own buffer in the "copyChars" method (which is very good practice).
For the output you can directly use "response.getWriter()" instead of "response.getOutputStream()", that is already buffered by the container.
On 08/30/2012 05:39 PM, Vojtech Szocs wrote:
Hello everyone,
as a follow-up to my last email on improving plugin API, here comes the latest revision of UI Plugins proof-of-concept patch (please find it attached).
This patch is focused on improving JavaScript plugin API, along with important changes and improvements made to plugin infrastructure ( PluginManager ). Let's walk through the changes step by step.
Improved plugin API, taking some inspiration from jQuery
Following is a sample plugin code that uses new plugin API:
var myPlugin = pluginApi('myPlugin'); // Obtain plugin API instance for 'myPlugin' var myPluginConfig = myPlugin.configObject(); // Obtain plugin-specific configuration
// Register event handler functions to be invoked by WebAdmin // Note: all functions are optional, the plugin only defines functions for events it wants to handle myPlugin.register({ UiInit: function() { var testUrl = 'http://www.example.com/' + myPluginConfig.foo; // Assume plugin configuration has 'foo' attribute myPlugin.ui.addMainTab('Custom Tab', 'custom-tab', testUrl); // Invoke some operation using plugin API } });
myPlugin.ready(); // Event handler functions are registered, we are now ready to get initialized (UiInit)
UI plugin life-cycle, enforced by plugin infrastructure
The PluginState enumeration lists possible states of a plugin during its runtime:
* DEFINED : This is the initial state for all plugins. Plugin meta-data has been read by PluginManager and the corresponding iframe element has been created for the plugin. Note that at this point, the iframe element is not attached to DOM yet. * LOADING : The iframe element for the plugin has been attached to DOM, which causes plugin host page (previously known as plugin source page) to be fetched asynchronously in the background. We are now waiting for plugin to report in as ready. In practice, due to JavaScript runtime being single-threaded, WebAdmin startup logic will continue to execute until the JavaScript runtime is "idle" (browser event loop returns), and at this point JavaScript plugin code gets invoked through the plugin host page. * READY : The plugin has indicated that it is ready for use. We assume the plugin has already registered its event handler object (object containing various event handler functions to be called by WebAdmin) at this point. We can now proceed with plugin initialization. * INITIALIZED : The plugin has been initialized by calling UiInit function on its event handler object. We can now call other event handler functions, the plugin is now initialized and in use.
Note on plugin initialization: the UiInit function will be called just once during the lifetime of the plugin, after the plugin reports in as ready AND WebAdmin enters the state that allows plugins to be invoked (entering main section for logged-in users), and before other event handler functions are invoked by the plugin infrastructure.
Plugin meta-data is now passed to client using different format
Previously, plugin meta-data was embedded into WebAdmin host page as a simple JavaScript object, like so:
var pluginDefinitions = { myPlugin: "<URL>", anotherPlugin: "<URL>" }
Now, plugin meta-data is embedded into WebAdmin host page as a JavaScript array, like so:
var pluginDefinitions = [ { name: "myPlugin", url: "<URL>", config: { "foo": 1, "bar": "whatever" } }, { name: "anotherPlugin", url: "<URL>" }
];
As you can see, pluginDefinitions is now an array of JavaScript objects, with each object representing plugin meta-data. The "name" and "url" attributes are mandatory (we need to check them when loading plugin descriptors). "config" is the plugin configuration (JSON) object, obtained by merging default plugin configuration (defined in plugin descriptor) with custom plugin configuration (defined in external plugin configuration file). Note that the "config" attribute is optional.
In terms of Java classes, pluginDefinitions is mapped to PluginDefinitions overlay type, and each meta-data object within the array is mapped to PluginMetaData overlay type.
Note on using assert statements in client code: you might notice that I'm using a lot of assert statements in Plugin class. This is to ensure consistency and guard against corrupted state during development. In GWT, assert statements work in a different way than in standard Java VM. When debugging GWT application using Development Mode, assert statements are checked and throw assertion errors during runtime (they are displayed in Development Mode console). However, when compiling GWT application to JavaScript (Production Mode), assert statements are removed by GWT compiler, so they don't affect the application running in Production Mode.
Cheers, Vojtech
Hi Vojtech, Looks very interesting. In the context of the client code, I have a suggestion that I'd like to be considered; Will it be possible to allow re-using some of the existing dialogs in the system? In this way, I may be able to use the pop-up dialog of edit-policy for example. This will keep the look and feel, and allow people to reduce issues when re-using existing code.
Thanks! Doron _______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel

On 09/04/2012 02:04 PM, Vojtech Szocs wrote:
Hi Juan, thanks for your comments :)
Server-side components of UI plugin infrastructure (such as PluginSourcePageServlet) indeed need some more work, I agree with your points.
I was thinking that PluginSourcePageServlet and FileServlet are quite similar in their purpose, serving static resources from local filesystem. FileServlet is intended for general use, with 'file' parameter configured as servlet init-param. For example, FileServlet could be used to serve static resources from /usr/share/ovirt-engine/ui-plugins:
<servlet> <servlet-name>pluginResourceServlet</servlet-name> <servlet-class>org.ovirt.engine.core.FileServlet</servlet-class> <init-param> <param-name>file</param-name> <param-value>/usr/share/ovirt-engine/ui-plugins</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>pluginResourceServlet</servlet-name> <url-pattern>/plugins/*</url-pattern> </servlet-mapping>
Assuming following directory convention for UI plugin descriptors and actual plugin resources: /usr/share/ovirt-engine/ui-plugins/foo.json -> Plugin descriptor /usr/share/ovirt-engine/ui-plugins/foo/start.html -> Plugin host page /usr/share/ovirt-engine/ui-plugins/foo/foo.js -> Actual plugin code (referenced by plugin host page)
Such servlet could be used to map "http(s)://<EngineHost>:8700/plugins/foo/start.html" to /usr/share/ovirt-engine/ui-plugins/foo/start.html (note that FileServlet is in root WAR context)
Using the FileServlet in this way looks perfectly ok from my point of view. Only thing to tkae into account is that then we should not put any content that is not to be public in the /usr/share/ovirt-engine/ui-plugins directory as the FileServlet has no mechanism to filter files: it serves anything inside that directory.
The purpose of PluginSourcePageServlet is very similar, but in terms of FileServlet, the 'file' parameter is not static (defined in web.xml as init-param), but depends on plugin meta-data (defined in foo.json) for each plugin.
PluginSourcePageServlet was meant to map "http(s)://<EngineHost>:8700/webadmin/webadmin/plugin/foo/start.html" to /custom/plugin/base/directory/start.html (note that PluginSourcePageServlet is in WebAdmin WAR context)
Juan - do you think we could modify/reuse FileServlet for serving UI plugin static resources? As mentioned above, the only difference is that the 'file' parameter (base directory) would be potentially different for each plugin. Please let me know what you think about it.
I would rather move the useful methods from FileServlet to the ServletUtils class (isSane, loading of MIME types, probably more) and then we can use them from FileServlet and PluginSourcePageServket, thus simplifying both.
----- Original Message ----- From: "Juan Hernandez" <jhernand@redhat.com> To: "Vojtech Szocs" <vszocs@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Thursday, August 30, 2012 8:24:02 PM Subject: Re: [Engine-devel] Update on UI Plugins: PoC patch revision 4
Nice work Vojtech, just some comments about the PluginSourcePageServlet:
* You can avoid the hardcoded plugin code location with something like this:
import org.ovirt.engine.core.utils.LocalConfig;
File dataDir = LocalConfig.getInstance().getUsrDir(); File pluginCodeLocation = new File(etcDir, "ui-plugins");
That will result in /usr/share/ovirt-engine/ui-plugins or whatever directory is configured in the ENGINE_USR parameter in the /etc/sysconfig/ovirt-engine file.
* It is very important to check the sanity of the value of the "plugin" parameter, otherwise an attacker could send you a name with backpaths, and that can result in accessing an unexpected file. In this particular case you are adding the ".js" extension, so it won't probably result in accessing dangerous files, but anyhow it is a good practice. I would recommend to do something like this:
String pluginName = request.getParameter("plugin"); if (pluginName != null || !isSane(pluginName)) { ... }
The "isSane" method can do something similar to the "isSane" method in the "FileServlet" class (I think you already mentioned this at some point), maybe even forbid slashes as well.
* When copying the plugin file to the generated page you can avoid the extra Buffered reader/writer as you are already using your own buffer in the "copyChars" method (which is very good practice).
For the output you can directly use "response.getWriter()" instead of "response.getOutputStream()", that is already buffered by the container.
On 08/30/2012 05:39 PM, Vojtech Szocs wrote:
Hello everyone,
as a follow-up to my last email on improving plugin API, here comes the latest revision of UI Plugins proof-of-concept patch (please find it attached).
This patch is focused on improving JavaScript plugin API, along with important changes and improvements made to plugin infrastructure ( PluginManager ). Let's walk through the changes step by step.
Improved plugin API, taking some inspiration from jQuery
Following is a sample plugin code that uses new plugin API:
var myPlugin = pluginApi('myPlugin'); // Obtain plugin API instance for 'myPlugin' var myPluginConfig = myPlugin.configObject(); // Obtain plugin-specific configuration
// Register event handler functions to be invoked by WebAdmin // Note: all functions are optional, the plugin only defines functions for events it wants to handle myPlugin.register({ UiInit: function() { var testUrl = 'http://www.example.com/' + myPluginConfig.foo; // Assume plugin configuration has 'foo' attribute myPlugin.ui.addMainTab('Custom Tab', 'custom-tab', testUrl); // Invoke some operation using plugin API } });
myPlugin.ready(); // Event handler functions are registered, we are now ready to get initialized (UiInit)
UI plugin life-cycle, enforced by plugin infrastructure
The PluginState enumeration lists possible states of a plugin during its runtime:
* DEFINED : This is the initial state for all plugins. Plugin meta-data has been read by PluginManager and the corresponding iframe element has been created for the plugin. Note that at this point, the iframe element is not attached to DOM yet. * LOADING : The iframe element for the plugin has been attached to DOM, which causes plugin host page (previously known as plugin source page) to be fetched asynchronously in the background. We are now waiting for plugin to report in as ready. In practice, due to JavaScript runtime being single-threaded, WebAdmin startup logic will continue to execute until the JavaScript runtime is "idle" (browser event loop returns), and at this point JavaScript plugin code gets invoked through the plugin host page. * READY : The plugin has indicated that it is ready for use. We assume the plugin has already registered its event handler object (object containing various event handler functions to be called by WebAdmin) at this point. We can now proceed with plugin initialization. * INITIALIZED : The plugin has been initialized by calling UiInit function on its event handler object. We can now call other event handler functions, the plugin is now initialized and in use.
Note on plugin initialization: the UiInit function will be called just once during the lifetime of the plugin, after the plugin reports in as ready AND WebAdmin enters the state that allows plugins to be invoked (entering main section for logged-in users), and before other event handler functions are invoked by the plugin infrastructure.
Plugin meta-data is now passed to client using different format
Previously, plugin meta-data was embedded into WebAdmin host page as a simple JavaScript object, like so:
var pluginDefinitions = { myPlugin: "<URL>", anotherPlugin: "<URL>" }
Now, plugin meta-data is embedded into WebAdmin host page as a JavaScript array, like so:
var pluginDefinitions = [ { name: "myPlugin", url: "<URL>", config: { "foo": 1, "bar": "whatever" } }, { name: "anotherPlugin", url: "<URL>" }
];
As you can see, pluginDefinitions is now an array of JavaScript objects, with each object representing plugin meta-data. The "name" and "url" attributes are mandatory (we need to check them when loading plugin descriptors). "config" is the plugin configuration (JSON) object, obtained by merging default plugin configuration (defined in plugin descriptor) with custom plugin configuration (defined in external plugin configuration file). Note that the "config" attribute is optional.
In terms of Java classes, pluginDefinitions is mapped to PluginDefinitions overlay type, and each meta-data object within the array is mapped to PluginMetaData overlay type.
Note on using assert statements in client code: you might notice that I'm using a lot of assert statements in Plugin class. This is to ensure consistency and guard against corrupted state during development. In GWT, assert statements work in a different way than in standard Java VM. When debugging GWT application using Development Mode, assert statements are checked and throw assertion errors during runtime (they are displayed in Development Mode console). However, when compiling GWT application to JavaScript (Production Mode), assert statements are removed by GWT compiler, so they don't affect the application running in Production Mode.
Cheers, Vojtech
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel
-- Dirección Comercial: C/Jose Bardasano Baos, 9, Edif. Gorbea 3, planta 3ºD, 28016 Madrid, Spain Inscrita en el Reg. Mercantil de Madrid – C.I.F. B82657941 - Red Hat S.L.
participants (3)
-
Doron Fediuck
-
Juan Hernandez
-
Vojtech Szocs