
=3D=3D false), which means that "live" data was already changed by anothe= r thread since this thread acquired a reference of current plugin data.</li= </ul><p>In my opinion, when dealing with external resources like the local= file system, this is a good compromise between performance and up-to-date = data. While we might not get "completely-up-to-date" data at the given poin= t in time (<span style=3D"font-style: italic;">reloadData + </span><span st= yle=3D"font-style: italic;">getCurrentData</span>), we are guaranteed to ge= t "recently-up-to-date" and consistent data. In other words, the requiremen= t of "completely-up-to-date" data would involve <span style=3D"font-style: = italic;">synchronized</span> statements that would hurt performance. In my = (very humble) opinion, the benefit of having "completely-up-to-date" data,= at the cost of reduced performance, is not really worth it, especially in = our case when the user can just hit refresh (F5) to reload WebAdmin and its=
is the servlet used to serve UI plugin static files (plugin host page, 3r= d party JavaScript, etc.) from the local file system.<br><br>For example, r= equesting URL:<br><ul><li><span style=3D"font-style: italic;">http://<En= gineManagerHost>:8700/webadmin/webadmin/plugin/foo/content/start.html</s=
<span style=3D"font-style: italic;">/webadmin/webadmin/plugin/</span> is t= he servlet root path for <span style=3D"font-style: italic;">PluginResource= Servlet</span><br></li><li>in the extra path beyond the servlet root path (= <span style=3D"font-style: italic;">/foo/content/start.html</span>):<span s= tyle=3D"white-space:pre"></span></li><ul><li><span style=3D"font-style: ita=
PluginResourceServlet</span>, available on Engine origin, should be used t= o serve all plugin resources from local file system.<br><br>There's only on= e issue that remains to be solved: cross-origin "plugin vs. remote service"= communication, with "remote service" being anything other than Engine (RES= T API). In future, we'll address this with Apache reverse proxy configurati= on, so that users can configure Apache server (placed in front of Engine JB= oss AS) to put arbitrary (local or remote non-Engine) services on same orig= in. However, this requires a change in current Apache configuration. Until =
------=_Part_2529172_1797931071.1348259851826 Content-Type: multipart/alternative; boundary="----=_Part_2529173_585113360.1348259851826" ------=_Part_2529173_585113360.1348259851826 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Hi guys, it's been a while but here comes the latest revision of UI Plugins proof-of-concept patch (please find it attached). This revision was originally meant to focus solely on server-side components of the plugin infrastructure. However, I ended up implementing all the major concepts and ideas as discussed on engine-devel mailing list, impacting both client-side and server-side parts of the plugin infrastructure. As a result, UI plugin infrastructure should be pretty much complete now, so we can focus on specific plugin API features in upcoming PoC revisions. There's a whole bunch of changes and improvements in this revision, so I'll try to cover all the relevant parts step by step. If you have any comments, questions or ideas, please let me know! So here we go... (or if you just want to get the patch, find the link at the end of this message) 0. Added new Engine configuration values UI plugin data path is represented by ConfigValues.UIPluginDataPath enum option ("UIPluginDataPath" in vdc_options table), and resolved relative to ConfigValues.DataDir if possible. Following (default) values: * UIPluginDataPath = ui-plugins * DataDir = /usr/share/ovirt-engine result in UI plugin data path: /usr/share/ovirt-engine/ui-plugins UI plugin config path is represented by ConfigValues.UIPluginConfigPath enum option ("UIPluginConfigPath" in vdc_options table), and resolved relative to ConfigValues.ConfigDir if possible. Following (default) values: * UIPluginConfigPath = ui-plugins * ConfigDir = /etc/ovirt-engine result in UI plugin config path: /etc/ovirt-engine/ ui-plugins 1. Processing UI plugin data on the server PluginDataManager is the class responsible for reading, validating and caching UI plugin descriptor/configuration data on the server (Engine). It has two main responsibilities: * return a snapshot of currently valid plugin data ( getCurrentData method ) * reload plugin data from local file system if necessary ( reloadData method) The reloadData method doesn't modify "live" plugin data directly. Instead, it creates a local working copy of current plugin data, updates this copy as it reads/validates plugin descriptor and configuration files, and attempts to update "live" plugin data through conditional reference re-assignment (using java.util.concurrent.atomic.AtomicReference.compareAndSet method). In other words, reloadData method makes no attempts with regard to Java lock-based synchronization, in favor of dealing with "live" data through AtomicReference (reference that involves atomic volatile reads and writes): * In the best case, a thread will succeed in updating "live" data ( AtomicReference.compareAndSet == true), which means that "live" data remained unchanged since this thread acquired a reference of current plugin data. * In the worst case, a thread will NOT succeed in updating "live" data ( AtomicReference.compareAndSet == false), which means that "live" data was already changed by another thread since this thread acquired a reference of current plugin data. In my opinion, when dealing with external resources like the local file system, this is a good compromise between performance and up-to-date data. While we might not get "completely-up-to-date" data at the given point in time ( reloadData + getCurrentData ), we are guaranteed to get "recently-up-to-date" and consistent data. In other words, the requirement of "completely-up-to-date" data would involve synchronized statements that would hurt performance. In my (very humble) opinion, the benefit of having "completely-up-to-date" data , at the cost of reduced performance, is not really worth it, especially in our case when the user can just hit refresh (F5) to reload WebAdmin and its plugin data. Plugin descriptor files are expected to be placed in UI plugin data path , for example: /usr/share/ovirt-engine/ui-plugins/foo.json Following descriptor file attributes are implemented and recognized by the plugin infrastructure: * name : A name that uniquely identifies the plugin (required attribute). * url : URL of plugin host page that invokes the plugin code (required attribute). * config : Default configuration object associated with the plugin (optional attribute). * resourcePath : Path to plugin static resources, relative to UI plugin data path (optional attribute). This is used when serving plugin files through Engine PluginResourceServlet (more on this below). Plugin configuration files are expected to be placed in UI plugin config path, for example: /etc/engine/ui-plugins/foo-config.json Note that plugin configuration files follow the "<descriptorFileName>-config.json" convention. Following configuration file attributes are implemented and recognized by the plugin infrastructure: * config : Custom configuration object associated with the plugin (optional attribute). This overrides the default plugin descriptor configuration, if any. * enabled : Indicates whether the plugin should be loaded on WebAdmin startup (optional attribute). Default value is 'true'. * order : Defines the relative order in which the plugin will be loaded on WebAdmin startup (optional attribute). Default value is Integer.MAX_VALUE (lowest order). The concept of merging custom configuration ( config attribute in foo-config.json ), if any, on top of default configuration ( config attribute in foo.json ), if any, remains unchanged. This makes the plugin configuration quite flexible - in my opinion, the added complexity of handling/merging such configuration is definitely worth the effort. The enabled attribute is straight-forward, allowing users to turn the given plugin off, if necessary. In future, users should still be able to load such plugins through WebAdmin GUI. The order attribute controls the order in which plugins are loaded on WebAdmin startup. Since plugin resources are fetched asynchronously by the browser, this is basically a way of imposing some degree of determinism in the "generally-non-deterministic" plugin environment, which is helpful when troubleshooting problems with multiple plugins. This attribute is also helpful due to file listing methods in java.io.File giving no guarantees that files would be listed in any particular order (otherwise we could just go for the "NN-<descriptorFileName>.json" convention, with NN being the order number). 2. Modified behavior of WebadminDynamicHostingServlet WebadminDynamicHostingServlet is the servlet used to serve WebAdmin application host page (HTML page that bootstraps WebAdmin JavaScript code). In addition to its former behavior, as part of handling the given request, WebadminDynamicHostingServlet : * reloads descriptor/configuration data from local file system if necessary, and obtains a snapshot of currently valid plugin data ( PluginDataManager.reloadAndGetCurrentData ) * embeds all plugin meta-data, suitable for use in client-side plugin infrastructure , into WebAdmin host page as "pluginDefinitions" JavaScript a rray ( PluginDefinitions ) As a result, reloading UI plugin descriptor/configuration data is as simple as refreshing (F5) WebAdmin application in the browser (no need to restart Engine). 3. Added servlet for serving plugin static resources PluginResourceServlet is the servlet used to serve UI plugin static files (plugin host page, 3rd party JavaScript, etc.) from the local file system. For example, requesting URL: * http://<EngineManagerHost>:8700/webadmin/webadmin/plugin/foo/content/start.html will send the content of: * /usr/share/ovirt-engine/ui-plugins/<resourcePath>/ content/start.html to the client. As shown in the above example: * /webadmin/webadmin/plugin/ is the servlet root path for PluginResourceServlet * in the extra path beyond the servlet root path ( /foo/content/start.html ): * /foo represents the name of the plugin * /content/start.html represents the path to requested resource, relative to " UIPluginDataPath / < resourcePath >" Note that each plugin using PluginResourceServlet to serve its static files must declare non-empty resourcePath attribute in within the plugin descriptor. Also note that PluginResourceServlet , unlike WebadminDynamicHostingServlet , does NOT reload descriptor/configuration data from local file system as part of handling the given request. In other words, it's assumed that plugin data has already been (re)loaded when serving WebAdmin application host page, with subsequent requests to PluginResourceServlet reading the current plugin information. Until we solve the cross-origin issue in a clean way, PluginResourceServlet should be used to serve all plugin resources from local file system. 4. Plugin lifecycle improved to deal with misbehaving plugins PluginState enum has been modified to deal with plugins that allow uncaught exceptions to escape from plugin event handler functions (e.g. "UiInit"): * removed state INITIALIZED * added state INITIALIZING : The plugin is (currently) being initialized by calling UiInit event handler function. * added state IN_USE : Plugin's UiInit event handler function has completed successfully, we can now call other event handler functions as necessary. The plugin is in use now. * added state FAILED : An uncaught exception escaped while calling an event handler function, which indicates internal error within the plugin code. The plugin is removed from service. I've attached a simple state diagram that illustrates different states and transitions between them (green color is initial state, red color is end state). Uncaught exceptions in plugin event handler functions will be caught and handled by the plugin infrastructure. This prevents a misbehaving plugin from breaking WebAdmin application, since WebAdmin is the caller (initiator) of the function call. In such case, the plugin will be removed from service. Update on cross-origin issue (consequence of same-origin policy) In order for the plugin to access WebAdmin plugin API, plugin host page (e.g. start.html ) must be served from URL on same origin as Engine origin. Otherwise, plugin code running in the context of an iframe'd host page will fail to evaluate "parent.pluginApi" expression, with "parent" being top-level (WebAdmin) window, and "pluginApi" being the global plugin API object exposed by WebAdmin. This is why PluginResourceServlet , available on Engine origin, should be used to serve all plugin resources from local file system. There's only one issue that remains to be solved: cross-origin "plugin vs. remote service" communication, with "remote service" being anything other than Engine (REST API). In future, we'll address this with Apache reverse proxy configuration, so that users can configure Apache server (placed in front of Engine JBoss AS) to put arbitrary (local or remote non-Engine) services on same origin. However, this requires a change in current Apache configuration. Until then, users can manually edit the Engine Apache configuration file ( /etc/httpd/conf.d/ovirt-engine.conf ). I've attached some sample plugin files for you to experiment with. Instead of attaching actual patch file (92 kB) to this email, I've submitted the patch to oVirt Gerrit: http://gerrit.ovirt.org/8120 Let me know what you think! Cheers, Vojtech ------=_Part_2529173_585113360.1348259851826 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'>Hi guys,<br><br>it's been a while but here comes the= latest revision of UI Plugins proof-of-concept patch (please find it attac= hed).<br><br>This revision was originally meant to focus solely on server-s= ide components of the plugin infrastructure. However, I ended up implementi= ng all the major concepts and ideas as discussed on engine-devel mailing li= st, impacting both client-side and server-side parts of the plugin infrastr= ucture. As a result, UI plugin infrastructure should be pretty much complet= e now, so we can focus on specific plugin API features in upcoming PoC rev= isions.<br><br>There's a whole bunch of changes and improvements in this re= vision, so I'll try to cover all the relevant parts step by step. If you ha= ve any comments, questions or ideas, please let me know!<br><br>So here we = go... (or if you just want to get the patch, find the link at the end of th= is message)<br><br><hr style=3D"width: 100%; height: 2px;"><br><strong>0. A= dded new Engine configuration values</strong><br style=3D"font-weight: bold= ;"><br><u>UI plugin data path</u> is represented by <em>ConfigValues.UIPlug= inDataPath</em> enum option ("UIPluginDataPath" in <span style=3D"font-styl= e: italic;">vdc_options</span> table), and resolved relative to <span style= =3D"font-style: italic;">ConfigValues.DataDir</span> if possible. Following= (default) values:<br><ul><li><span style=3D"font-style: italic;">UIPluginD= ataPath =3D ui-plugins</span></li><li><span style=3D"font-style: italic;">D= ataDir =3D /usr/share/ovirt-engine<br></span></li></ul>result in UI plugin = data path: <span style=3D"font-style: italic;">/usr/share/ovirt-engine/ui-p= lugins</span><br><br><span style=3D"text-decoration: underline;">UI plugin = config path</span> is represented by <span style=3D"font-style: italic;">Co= nfigValues.UIPluginConfigPath</span> enum option ("UIPluginConfigPath" in <= span style=3D"font-style: italic;">vdc_options</span> table), and resolved = relative to <span style=3D"font-style: italic;">ConfigValues.ConfigDir</spa= n> if possible. Following (default) values:<br><ul><li><span style=3D"font-= style: italic;">UIPluginConfigPath =3D ui-plugins</span></li><li><span styl= e=3D"font-style: italic;">ConfigDir =3D /etc/ovirt-engine</span></li></ul><= p>result in UI plugin config path: <span style=3D"font-style: italic;">/etc= /ovirt-engine/</span><span style=3D"font-style: italic;">ui-plugins</span><= /p><br><span style=3D"font-weight: bold;">1. Processing UI plugin data on t= he server</span><br style=3D"font-weight: bold;"><br><span style=3D"font-st= yle: italic;">PluginDataManager</span> is the class responsible for reading= , validating and caching UI plugin descriptor/configuration data on the ser= ver (Engine). It has two main responsibilities:<br><ul><li>return a snapsho= t of currently valid plugin data (<span style=3D"font-style: italic;">getCu= rrentData</span> method)<br></li><li>reload plugin data from local file sys= tem if necessary (<span style=3D"font-style: italic;">reloadData</span> met= hod)</li></ul><p></p><p>The <span style=3D"font-style: italic;">reloadData<= /span> method doesn't modify "live" plugin data directly. Instead, it creat= es a local working copy of current plugin data, updates this copy as it rea= ds/validates plugin descriptor and configuration files, and attempts to upd= ate "live" plugin data through conditional reference re-assignment (using <= span style=3D"font-style: italic;">java.util.concurrent.atomic.AtomicRefere= nce.compareAndSet</span> method).</p><p><br></p><p>In other words, <span st= yle=3D"font-style: italic;">reloadData</span> method makes no attempts with= regard to Java lock-based synchronization, in favor of dealing with "live"= data through <span style=3D"font-style: italic;">AtomicReference</span> (r= eference that involves atomic <span style=3D"font-style: italic;">volatile<= /span> reads and writes):</p><ul><li> In the best case, a thread will succe= ed in updating "live" data (<span style=3D"font-style: italic;">AtomicRefer= ence.compareAndSet</span> =3D=3D true), which means that "live" data remain= ed unchanged since this thread acquired a reference of current plugin data.= </li><li>In the worst case, a thread will NOT succeed in updating "live" da= ta (<span style=3D"font-style: italic;">AtomicReference.compareAndSet</span= plugin data.<br></p><p><br></p><p><span style=3D"text-decoration: underlin= e;">Plugin descriptor files</span> are expected to be placed in UI plugin d= ata path, for example: <span style=3D"font-style: italic;">/usr/share/ovirt= -engine/ui-plugins/foo.json</span></p><p><br></p><p>Following descriptor fi= le attributes are implemented and recognized by the plugin infrastructure:<= /p><ul><li><span style=3D"font-style: italic;">name</span>: A name that uni= quely identifies the plugin (required attribute).</li><li><span style=3D"fo= nt-style: italic;">url</span>: URL of plugin host page that invokes the plu= gin code (required attribute).</li><li><span style=3D"font-style: italic;">= config</span>: Default configuration object associated with the plugin (opt= ional attribute).</li><li><span style=3D"font-style: italic;">resourcePath<= /span>: Path to plugin static resources, relative to UI plugin data path (o= ptional attribute). This is used when serving plugin files through Engine <= span style=3D"font-style: italic;">PluginResourceServlet</span> (more on th= is below).<br></li></ul><p></p><p><span style=3D"text-decoration: underline= ;">Plugin configuration files</span> are expected to be placed in UI plugin= config path, for example: <span style=3D"font-style: italic;">/etc/engine/= ui-plugins/foo-config.json</span><br></p><p><br></p><p>Note that plugin con= figuration files follow the "<descriptorFileName>-config.json" conven= tion.</p><p><br></p><p>Following configuration file attributes are implemen= ted and recognized by the plugin infrastructure:</p><ul><li><span style=3D"= font-style: italic;">config</span>: Custom configuration object associated = with the plugin (optional attribute). This overrides the default plugin des= criptor configuration, if any.</li><li><span style=3D"font-style: italic;">= enabled</span>: Indicates whether the plugin should be loaded on WebAdmin s= tartup (optional attribute). Default value is 'true'.</li><li><span style= =3D"font-style: italic;">order</span>: Defines the relative order in which = the plugin will be loaded on WebAdmin startup (optional attribute). Default= value is <span style=3D"font-style: italic;">Integer.MAX_VALUE</span> (low= est order).</li></ul><p>The concept of merging custom configuration (<span = style=3D"font-style: italic;">config</span> attribute in <span style=3D"fon= t-style: italic;">foo-config.json</span>), if any, on top of default config= uration (<span style=3D"font-style: italic;">config</span> attribute in <sp= an style=3D"font-style: italic;">foo.json</span>), if any, remains unchange= d. This makes the plugin configuration quite flexible - in my opinion, the = added complexity of handling/merging such configuration is definitely worth= the effort.<br></p><p><br></p><p>The <span style=3D"font-style: italic;">e= nabled</span> attribute is straight-forward, allowing users to turn the giv= en plugin off, if necessary. In future, users should still be able to load = such plugins through WebAdmin GUI.<br></p><p><br></p><p>The <span style=3D"= font-style: italic;">order</span> attribute controls the order in which plu= gins are loaded on WebAdmin startup. Since plugin resources are fetched asy= nchronously by the browser, this is basically a way of imposing some degree= of determinism in the "generally-non-deterministic" plugin environment, wh= ich is helpful when troubleshooting problems with multiple plugins. This at= tribute is also helpful due to file listing methods in <span style=3D"font-= style: italic;">java.io.File</span> giving no guarantees that files would b= e listed in any particular order (otherwise we could just go for the "NN-&l= t;descriptorFileName>.json" convention, with NN being the order number).= <br></p><br><span style=3D"font-weight: bold;">2. Modified behavior of Weba= dminDynamicHostingServlet</span><br style=3D"font-weight: bold;"><br><span = style=3D"font-style: italic;">WebadminDynamicHostingServlet</span> is the s= ervlet used to serve WebAdmin application host page (HTML page that bootstr= aps WebAdmin JavaScript code).<br><br>In addition to its former behavior, a= s part of handling the given request, <span style=3D"font-style: italic;">W= ebadminDynamicHostingServlet</span>:<br><ul><li><span style=3D"font-style: = italic;"></span>reloads descriptor/configuration data from local file syste= m if necessary, and obtains a snapshot of currently valid plugin data (<spa= n style=3D"font-style: italic;">PluginDataManager.reloadAndGetCurrentData</= span>)</li><li>embeds all plugin meta-data, suitable for use in client-side= plugin infrastructure, into WebAdmin host page as "pluginDefinitions" Java= Script array (<span style=3D"font-style: italic;">PluginDefinitions</span>)= <br></li></ul>As a result, reloading UI plugin descriptor/configuration dat= a is as simple as refreshing (F5) WebAdmin application in the browser (no n= eed to restart Engine).<br><br><span style=3D"font-weight: bold;">3. Added = servlet for serving plugin static resources</span><br style=3D"font-weight:= bold;"><br><span style=3D"font-style: italic;">PluginResourceServlet</span= pan></li></ul><p>will send the content of:</p><ul><li><span style=3D"font-s= tyle: italic;">/usr/share/ovirt-engine/ui-plugins/<resourcePath>/</sp= an><span style=3D"font-style: italic;">content/start.html</span></li></ul><= p>to the client.</p><p><br></p><p>As shown in the above example:</p><ul><li= lic;">/foo</span> represents the name of the plugin</li><li><span style=3D"= font-style: italic;">/content/start.html</span> represents the path to requ= ested resource, relative to "UIPluginDataPath / <resourcePath>"<br></= li></ul></ul>Note that each plugin using <span style=3D"font-style: italic;= ">PluginResourceServlet</span> to serve its static files must declare non-e= mpty <span style=3D"font-style: italic;">resourcePath</span> attribute in w= ithin the plugin descriptor.<br><br>Also note that <span style=3D"font-styl= e: italic;">PluginResourceServlet</span>, unlike <span style=3D"font-style:= italic;">WebadminDynamicHostingServlet</span>, does NOT reload descriptor/= configuration data from local file system as part of handling the given req= uest. In other words, it's assumed that plugin data has already been (re)lo= aded when serving WebAdmin application host page, with subsequent requests = to <span style=3D"font-style: italic;">PluginResourceServlet</span> reading= the current plugin information.<br><br>Until we solve the cross-origin iss= ue in a clean way, <span style=3D"font-style: italic;">PluginResourceServle= t</span> should be used to serve all plugin resources from local file syste= m.<br><br><span style=3D"font-weight: bold;">4. Plugin lifecycle improved t= o deal with misbehaving plugins</span><br><br><span style=3D"font-style: it= alic;">PluginState</span> enum has been modified to deal with plugins that = allow uncaught exceptions to escape from plugin event handler functions (e.= g. "UiInit"):<br><ul><li>removed state <span style=3D"font-style: italic;">= INITIALIZED</span></li><li>added state <span style=3D"font-style: italic;">= INITIALIZING</span>: The plugin is (currently) being initialized by calling= UiInit event handler function.</li><li>added state <span style=3D"font-sty= le: italic;">IN_USE</span>: Plugin's UiInit event handler function has comp= leted successfully, we can now call other event handler functions as necess= ary. The plugin is in use now.</li><li>added state <span style=3D"font-styl= e: italic;">FAILED</span>: An uncaught exception escaped while calling an e= vent handler function, which indicates internal error within the plugin cod= e. The plugin is removed from service.<br></li></ul>I've attached a simple = state diagram that illustrates different states and transitions between the= m (green color is initial state, red color is end state).<br><br>Uncaught e= xceptions in plugin event handler functions will be caught and handled by t= he plugin infrastructure. This prevents a misbehaving plugin from breaking = WebAdmin application, since WebAdmin is the caller (initiator) of the funct= ion call. In such case, the plugin will be removed from service.<br><br><sp= an style=3D"font-weight: bold;">Update on cross-origin issue (consequence o= f same-origin policy)</span><br><br>In order for the plugin to access WebAd= min plugin API, plugin host page (e.g. <span style=3D"font-style: italic;">= start.html</span>) must be served from URL on same origin as Engine origin.= Otherwise, plugin code running in the context of an iframe'd host page wil= l fail to evaluate "parent.pluginApi" expression, with "parent" being top-l= evel (WebAdmin) window, and "pluginApi" being the global plugin API object = exposed by WebAdmin.<br><br>This is why <span style=3D"font-style: italic;"= then, users can manually edit the Engine Apache configuration file (<span s= tyle=3D"font-style: italic;">/etc/httpd/conf.d/ovirt-engine.conf</span>).<b= r><br><span style=3D"font-weight: bold;"></span><hr style=3D"width: 100%; h= eight: 2px;"><br>I've attached some sample plugin files for you to experime= nt with. Instead of attaching actual patch file (92 kB) to this email, I've= submitted the patch to oVirt Gerrit: http://gerrit.ovirt.org/8120<br><br>L= et me know what you think!<br><br>Cheers,<br>Vojtech<br><br></div></body></= html> ------=_Part_2529173_585113360.1348259851826-- ------=_Part_2529172_1797931071.1348259851826 Content-Type: application/x-compressed-tar; name=ui-plugin-sample-files.tar.gz Content-Disposition: attachment; filename=ui-plugin-sample-files.tar.gz Content-Transfer-Encoding: base64 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 ------=_Part_2529172_1797931071.1348259851826 Content-Type: image/png; name=ui-plugin-lifecycle.png Content-Disposition: attachment; filename=ui-plugin-lifecycle.png Content-Transfer-Encoding: base64 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 hNBWMKGVGApNRM+5wMXNkx6Bi5GyhcLsZC4urk5HrV69Oj8/f8OGDampqWgr+q+VsLKyGgpNRM+5 ICQsnBTmi32CHUT7eY4cObL7tiIrK8vQ0NDT01NQUJDN24qTJ07oaWlxcHBQBghJScnQ0FDKgCIk KGhiYvL48eNP3To9XOfD917ArOmOh+7mDJeWxzuThXJSo39yNb9w4cKiRT3fgNPf39/V1fX9+/fj x48/fvy4oaEhW63L27y8xbNmhSclSQsKLtLRMZeTs1ZS4uXkxFbuQyU1NUHZ2U/y8m5mZtLq6pY4 O3teuNBnuUAIkZCSptFoOy/FSytpotyssnGSsPgwsby8vN4/xdXV1cvLi06nb9q0iX2+B+V/6dL8 lStrGxpOOTq6jB2LLcsEq/z8ziYkCAoK3rx1y9bWtm9yITw83MraWlxG6cDtlygxS3hssEuOeHD/ /v1ebtRWGRkZS5cujYuLExEROXfuXPdXGWGCx5cv2yxdKiMkdNvJSV9aGluWecdoFRV6p07R6utj Y2P19PT6IBcIIalpGbo6Y5R1zda6+/ELiqLKzOS5beazkDtubm67d+/+zP+i/2krTE1N3d3dWdZW 0GjCUlLD+PhyN2zAZmVB+evqpH/5RUJKKu/Nmx4n7tX3F7THaK5bt+51atQWWymfP7ajxMyR9tR/ i83wuLB733777WeHAiHEwcGhsLBw9erVMTExJiYmW7duZcHK0OlOtrZVDQ1/Tp2KLcsSory83l99 lV9QMGPGjL45Xvgn7mnTZ3719HG4uLScntUcRa3xaoaWgqLiqHhfvn2amjJjH77PSoy+d+Ft3qth w4bdvHlz4sSJffLirW2FmJjYmTNnmNlW5AUHK9nbz9XSujZnDrYyC20MCvrt2bO0tDRNTc2+yYW/ D2s9PX/66ac3b/JraqopFFy2vF9QqVQpKanZs2f//vvvff7i/v7+ixcvLisrGzt2rIeHB3PaCmdz c/+EhNJt27BxWU7wyJGp06bduHGjL3MBBoetW7f++uuvVCp1+/bt+/fv7+8mQkJY2EZJ6crs2ag8 y824eTOqqKi4uPhLzy/A4HP06NGoqChNTU03NzcpKSl///78tntp6Yfq6mmqqig7Oxg7YkQ3N8tB Lgx1hoaGSUlJt27dqq+vnzZtmpGRUUZGRj/1RYSQcd1+WROYZv6YMT1vMZRpiJs1a1ZZWdl3332X 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 YKD5P2BJEIkFxk/7AAAAAElFTkSuQmCC ------=_Part_2529172_1797931071.1348259851826--