[Engine-devel] UI Plugins: PoC patch revision 6 now available

label</span> is the title displayed on the button<span style=3D"font-style= : italic;">.<br></span><br><span style=3D"font-style: italic;">actionButton= Interface</span> represents an object that "implements the button interface= " by declaring its functions: <span style=3D"font-style: italic;">onClick</= span>, <span style=3D"font-style: italic;">isEnabled</span>, <span style=3D= "font-style: italic;">isAccessible</span>. All functions of <span style=3D"= font-style: italic;">actionButtonInterface</span> receive currently selecte= d item(s) as function arguments.<br><br>Let's take a closer look at the con= cept behind <span style=3D"font-style: italic;">actionButtonInterface</span= . In traditional class-based object-oriented languages, such as Java, inte= rface is an abstract type that contains method declarations without an impl= ementation. A class that implements the given interface must implement all = methods declared by that interface (unless it's an abstract class, but this= isn't relevant in our case).<br><br>In contrast with traditional class-bas= ed object-oriented languages, JavaScript supports OOP through prototype-bas= ed programming model (https://developer.mozilla.org/en-US/docs/JavaScript/I= ntroduction_to_Object-Oriented_JavaScript). At the same time, JavaScript la= nguage is dynamically-typed and therefore doesn't support traditional conce=
</span><span style=3D"font-family: courier new,courier,= monaco,monospace,sans-serif;">},</span><br><br><span style=3D"font-family: = courier new,courier,monaco,monospace,sans-serif; color: rgb(0, 102, 0);">&n= bsp; // Returning 'true' means=
------=_Part_9716068_484635069.1350571769689 Content-Type: multipart/alternative; boundary="----=_Part_9716069_2003615259.1350571769689" ------=_Part_9716069_2003615259.1350571769689 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Hi guys, the latest revision of UI Plugins proof-of-concept patch is now available for you to experiment with. You can download the patch from oVirt Gerrit at http://gerrit.ovirt.org/#/c/8120/2 (patch set 2). Please read on to learn what's new in this revision. If you have any comments, questions or ideas, please let me know! 0. UI plugin path information resolved using local Engine configuration Server-side UI plugin infrastructure now uses local (machine-specific) Engine configuration instead of global ( vdc_options database table) Engine configuration: * Previously, path information was resolved through org.ovirt.engine.core.common.config.Config class - Engine configuration values were retrieved from vdc_options database table. * Currently, path information is resolved through org.ovirt.engine.core.utils.LocalConfig class - Engine configuration values are retrieved from local file system. In case you're not working with oVirt Engine through RPM package system, e.g. you have a local development environment set up and you build and deploy oVirt Engine through Maven, please follow these steps: a. Copy default Engine configuration into /usr/share/ ovirt-engine /conf # mkdir -p /usr/share/ovirt-engine/conf # cp <OVIRT_HOME>/backend/manager/conf/engine.conf.defaults /usr/share/ovirt-engine/conf/engine.conf.defaults b. If necessary, copy UI plugin data files from /usr/share/engine/ui-plugins to /usr/share/ ovirt-engine /ui-plugins c. If necessary, copy UI plugin config files from /etc/engine/ui-plugins to /etc/ ovirt-engine /ui-plugins d, In case you want to override the default Engine configuration, put your custom property file into /etc/sysconfig/ovirt-engine The reason behind this change is that path information for UI plugin data and configuration is typically machine-specific, and should be customizable per machine through Engine local configuration. 1. New plugin API function: addMainTabActionButton The "addMainTabActionButton" API adds custom context-sensitive button to the given main tab's data grid, along with corresponding data grid context menu item. addMainTabActionButton(entityTypeName, label, actionButtonInterface) entityTypeName indicates which main tab's data grid the button should be added to, according to the entity type associated with the main tab. entityTypeName values are strings reflecting org.ovirt.engine.ui.webadmin.plugin.entityEntityType enum members. Following entityTypeName values are currently supported (values are case-sensitive): "DataCenter", "Cluster", "Host", "Storage", "Disk", "VirtualMachine", "Template". Note: "Pool" value is currently not supported, because of org.ovirt.engine.core.common.businessentities.vm_pools entity not implementing the BusinessEntity interface, not sure why though. Maybe we should switch from BusinessEntity to IVdcQueryable interface and always cast getQueryableId method result value to Guid? label is the title displayed on the button . actionButtonInterface represents an object that "implements the button interface" by declaring its functions: onClick , isEnabled , isAccessible . All functions of actionButtonInterface receive currently selected item(s) as function arguments. Let's take a closer look at the concept behind actionButtonInterface . In traditional class-based object-oriented languages, such as Java, interface is an abstract type that contains method declarations without an implementation. A class that implements the given interface must implement all methods declared by that interface (unless it's an abstract class, but this isn't relevant in our case). In contrast with traditional class-based object-oriented languages, JavaScript supports OOP through prototype-based programming model (https://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-O...). At the same time, JavaScript language is dynamically-typed and therefore doesn't support traditional concept of interface in OOP, it uses "duck typing" technique instead (http://en.wikipedia.org/wiki/Duck_typing). The simplest way to provide an object that "implements the given interface" in JavaScript is to use "duck typing" technique: providing an object that contains well-known functions. In UI plugin infrastructure, I call this concept "interface object", represented by org.ovirt.engine.ui.webadmin.plugin.jsni.JsInterfaceObject class. Unlike the traditional concept of interface abstract type in object-oriented languages, an "interface object" does not necessarily have to declare all functions of the given interface in order to "implement" such interface. In fact, an empty object can be used as a valid "interface object". Missing functions will be simply treated as empty (no-op) functions. Furthermore, an "interface object" can "implement" multiple interfaces by declaring functions of those interfaces (interface composition). Getting back to "addMainTabActionButton" API, here's a sample code that adds new button to "Host" main tab data grid, as part of UiInit event handler function: UiInit: function () { api. addMainTabActionButton ('Host', 'Single-Host Action', // Action button interface object // All functions receive currently selected item(s) as function arguments { // Called when the user clicks the button onClick : function () { // Calling 'arguments[0]' is safe, because onClick() can be called // only when exactly one item is currently selected in the data grid window.alert('Selected host entity ID = ' + arguments[0].entityId); }, // Returning 'true' means the button is enabled (clickable) // Returning 'false' means the button is disabled (non-clickable) // Default value = 'true' isEnabled : function () { // Enable button only when exactly one item is selected return arguments.length == 1; }, // Returning 'true' means the button is visible // Returning 'false' means the button is hidden // Default value = 'true' isAccessible : function () { // Always show the button in the corresponding data grid return true ; } } ); } As mentioned above, all functions of an interface object are optional. For functions expecting return value, default value is defined by UI plugin infrastructure. For example: * onClick - no default value (no return value expected) * isEnabled / isAccessible - default value "true" (boolean return value expected) Note: UI plugin infrastructure checks the actual return value type, and uses default value in case the function returned something of wrong (unexpected) type. In the example above, "currently selected item(s)" maps to JSON-like representations of business entities currently selected in the corresponding data grid. For now, the entity representation is quite simple and same for all entity types: { entityId: "[BusinessEntityGuidAsString]" } In future, we will create specific JSON-like representations for specific business entities, in compliance with Engine REST API entity structure. For a more extensive example of using "addMainTabActionButton" API, please see the attached "addMainTabActionButton.html.example" file. 2. Improved plugin API function: addMainTab The "addMainTab" API was improved to address following issues: * "addMainTab" can now be called at any moment during UI plugin runtime, given that the plugin is allowed invoke plugin API functions (plugin is either INITIALIZING or IN_USE). Previously, "addMainTab" worked reliably only when called from within UiInit event handler function. Currently, it's possible to call "addMainTab" at any moment, e.g. from within some other event handler function (after UiInit has completed). * "addMainTab" now retains "active" tab (highlighted tab GUI). "addMainTab" works by adding new tab component (GWTP presenter proxy) and refreshing main tab panel GUI by removing all related tabs and re-adding them again. This logic is handled by org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter class, which makes sure that "active" tab is retained even after main tab panel was refreshed. Furthermore, custom main tab implementation now displays the content of the given URL through HTML iframe element. 3. Improved native JavaScript function handling (GWT JSNI) This patch introduces org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction and org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunctionResultHelper classes providing Java abstraction for invoking native JavaScript functions. These classes follow the general contract of "interface object" as mentioned above. JsFunctionResultHelper is particularly useful when dealing with functions which are expected to return value of a certain type. Too bad standard GWT JSNI classes don't provide such abstraction for working with native functions out-of-the-box... 4 . ActionPanel and ActionTable type hierarchy refactoring (related to "addMainTabActionButton" API) Previously, AbstractActionPanel and AbstractActionTable classes didn't implement any reasonable interface that would allow other components (client-side UI plugin infrastructure) to depend on their functionality in a loosely-coupled manner. This would make code that implements "addMainTabActionButton" API "ugly": main tab view interface would have to reference AbstractActionTable class directly. In MVP design pattern, view interface should avoid referencing specific GWT Widget classes directly. This patch introduces new interfaces for ActionPanel and ActionTable components while eliminating code redundancy (duplicate or unnecessary code). 5. ActionPanel type hierarchy refactoring (related to "addMainTab" API) Since org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter defines new DynamicTabPanel interface that extends standard GWTP TabPanel interface, some refactoring had to be done in related ActionPanel classes. This patch makes sure that both org.ovirt.engine.ui.common.widget.tab.AbstractTabPanel (widget) and org.ovirt.engine.ui.common.view.AbstractTabPanelView (view) support DynamicTabPanel interface. Note that for now, only main tab panel (org.ovirt.engine.ui.webadmin.section.main.presenter.MainTabPanelPresenter) supports dynamic tabs within its view. Where is addSubTab API function? Implementing "addSubTab" API requires some more changes, and I didn't want to delay this PoC patch just because of it... Here's a sample code that illustrates proposed "addSubTab" API usage: UiInit: function () { api. addSubTab ('Host', // entityTypeName 'Custom Host Sub Tab', // label 'custom-host-sub-tab', // historyToken 'http://www.ovirt.org/', // contentUrl // Sub tab interface object // All functions receive currently selected item(s) // within the main tab data grid as function arguments { // Returning 'true' means the sub tab is visible // Returning 'false' means the sub tab is hidden // Default value = 'true' isAccessible : function () { return arguments.length == 1 && arguments[0].entityId == '<MyHostEntityId>' ; } } ); } As part of "addSubTab" API implementation, I'll refactor custom main tab components, in order to use one "tab type" for both main and sub tabs. Currently, we have one (and only one) "tab type" - a tab that shows content of the given URL through HTML iframe element. We could also create new "tab types", e.g. form-based tab that shows key/value pairs (IMHO this could be quite useful for custom sub tabs). Let me know what you think! Cheers, Vojtech ------=_Part_9716069_2003615259.1350571769689 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>the latest revision of UI Plugins pro= of-of-concept patch is now available for you to experiment with. You can do= wnload the patch from oVirt Gerrit at http://gerrit.ovirt.org/#/c/8120/2 (p= atch set 2).<br><br>Please read on to learn what's new in this revision. If= you have any comments, questions or ideas, please let me know!<br><br><hr = style=3D"width: 100%; height: 2px;"><br><strong>0. UI plugin path informati= on resolved using local Engine configuration</strong><br style=3D"font-weig= ht: bold;"><br>Server-side UI plugin infrastructure now uses local (machine= -specific) Engine configuration instead of global (<em>vdc_options</em> dat= abase table) Engine configuration:<br><ul><li>Previously, path information = was resolved through org.ovirt.engine.core.common.config.Config=20 class - Engine configuration values were retrieved from <span style=3D"font= -style: italic;">vdc_options</span> database table.</li><li>Currently, path= information is resolved through org.ovirt.engine.core.utils.LocalConfig=20 class - Engine configuration values are retrieved from local file system.</li></ul>In case you're not working with oVirt Engine through= RPM package system, e.g. you have a local development environment set up a= nd you build and deploy oVirt Engine through Maven, please follow these ste= ps:<br><br>a. Copy default Engine configuration into /usr/share/<span style= =3D"font-weight: bold;">ovirt-engine</span>/conf<br><br><div style=3D"margi= n-left: 40px; font-family: courier new,courier,monaco,monospace,sans-serif;= "># mkdir -p /usr/share/ovirt-engine/conf<br># cp <OVIRT_HOME>/backen= d/manager/conf/engine.conf.defaults /usr/share/ovirt-engine/conf/engine.con= f.defaults</div><br>b. If necessary, copy UI plugin data files from /usr/sh= are/engine/ui-plugins to /usr/share/<span style=3D"font-weight: bold;">ovir= t-engine</span>/ui-plugins<br><br>c. If necessary, copy UI plugin config fi= les from /etc/engine/ui-plugins to /etc/<span style=3D"font-weight: bold;">= ovirt-engine</span>/ui-plugins<br><br>d, In case you want to override the d= efault Engine configuration, put your custom property file into /etc/syscon= fig/ovirt-engine<br><br>The reason behind this change is that path informat= ion for UI plugin data and configuration is typically machine-specific, and= should be customizable per machine through Engine local configuration.<br>= <br><hr style=3D"width: 100%; height: 2px;"><br><span style=3D"font-weight:= bold;">1. New plugin API function: addMainTabActionButton</span><br style= =3D"font-weight: bold;"><br>The "addMainTabActionButton" API adds custom co= ntext-sensitive button to the given main tab's data grid, along with corres= ponding data grid context menu item.<br><br><span style=3D"font-family: cou= rier new,courier,monaco,monospace,sans-serif;">addMainTabActionButton(entit= yTypeName, label, actionButtonInterface)</span><br style=3D"font-family: co= urier new,courier,monaco,monospace,sans-serif;"><em style=3D"font-family: c= ourier new,courier,monaco,monospace,sans-serif;"></em><br><span style=3D"fo= nt-style: italic;">entityTypeName</span> indicates which main tab's data gr= id the button should be added to, according to the entity type associated w= ith the main tab.<span style=3D"font-style: italic;"> entityTypeName</span>= values are strings reflecting org.ovirt.engine.ui.webadmin.plugin.entityEn= tityType enum members. Following <span style=3D"font-style: italic;">entity= TypeName</span> values are currently supported (values are case-sensitive):= "DataCenter", "Cluster", "Host", "Storage", "Disk", "VirtualMachine", "Tem= plate".<br><br>Note: "Pool" value is currently not supported, because of or= g.ovirt.engine.core.common.businessentities.vm_pools entity not implementin= g the BusinessEntity interface, not sure why though. Maybe we should switch= from BusinessEntity to IVdcQueryable interface and always cast getQueryabl= eId method result value to Guid?<br><br><span style=3D"font-style: italic;"= pt of interface in OOP, it uses "duck typing" technique instead (http://en.= wikipedia.org/wiki/Duck_typing).<br><br>The simplest way to provide an obje= ct that "implements the given interface" in JavaScript is to use "duck typi= ng" technique: providing an object that contains well-known functions. In U= I plugin infrastructure, I call this concept "interface object", represente= d by org.ovirt.engine.ui.webadmin.plugin.jsni.JsInterfaceObject class. Unli= ke the traditional concept of interface abstract type in object-oriented la= nguages, an "interface object" <u>does not necessarily have to declare all = functions of the given interface</u> in order to "implement" such interface= . In fact, an empty object can be used as a valid "interface object". Missi= ng functions will be simply treated as empty (no-op) functions. Furthermore= , an "interface object" can "implement" multiple interfaces by declaring fu= nctions of those interfaces (interface composition).<br><br>Getting back to= "addMainTabActionButton" API, here's a sample code that adds new button to= "Host" main tab data grid, as part of UiInit event handler function:<br><b= r><span style=3D"font-family: courier new,courier,monaco,monospace,sans-ser= if;">UiInit: <span style=3D"font-weight: bold; color: rgb(153, 0, 0);">func= tion</span>() {</span><br style=3D"font-family: courier new,courier,monaco,= monospace,sans-serif;"><span style=3D"font-family: courier new,courier,mona= co,monospace,sans-serif;"></span><span style=3D"font-family: courier new,co= urier,monaco,monospace,sans-serif;"> api.<span style=3D"c= olor: rgb(204, 51, 204);">addMainTabActionButton</span>('Host', 'Single-Hos= t Action',<br><br><span style=3D"color: rgb(0, 102, 0);"> = // Action button interface object</span><br style= =3D"color: rgb(0, 102, 0);"><span style=3D"color: rgb(0, 102, 0);"> &n= bsp; // All functions receive currently selec= ted item(s) as function arguments</span><br style=3D"color: rgb(0, 102, 0);= "> {</span><br><br><span style=3D= "font-family: courier new,courier,monaco,monospace,sans-serif; color: rgb(0= , 102, 0);"> // Cal= led when the user clicks the button</span><br style=3D"color: rgb(0, 102, 0= );"><span style=3D"font-family: courier new,courier,monaco,monospace,sans-s= erif; color: rgb(0, 102, 0);"></span><span style=3D"font-family: courier ne= w,courier,monaco,monospace,sans-serif;"> &nb= sp; <span style=3D"color: rgb(0, 0, 153);">onClick</span>: <sp= an style=3D"font-weight: bold; color: rgb(153, 0, 0);">function</span>() {<= br></span><span style=3D"font-family: courier new,courier,monaco,monospace,= sans-serif; color: rgb(0, 102, 0);"> &nb= sp; // Calling 'arguments[0]' is safe, bec= ause onClick() can be called<br> &= nbsp; // only when exactly one item is curr= ently selected in the data grid</span><br style=3D"font-family: courier new= ,courier,monaco,monospace,sans-serif; color: rgb(0, 102, 0);"><span style= =3D"font-family: courier new,courier,monaco,monospace,sans-serif;"> &n= bsp; </span><span style=3D"font-family: courier new,courier,monaco,mo= nospace,sans-serif;"> </span><span style=3D"font-family: = courier new,courier,monaco,monospace,sans-serif;"> &= nbsp; </span><span style=3D"font-family: courier new,courier,mo= naco,monospace,sans-serif;">window.alert('Selected host entity ID =3D ' + a= rguments[0].entityId);</span><br style=3D"font-family: courier new,courier,= monaco,monospace,sans-serif;"><span style=3D"font-family: courier new,couri= er,monaco,monospace,sans-serif;"> </span><s= pan style=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"= the button is enabled (clickable)</span><br style=3D"color: rgb(0, 102, 0)= ;"><span style=3D"font-family: courier new,courier,monaco,monospace,sans-se= rif; color: rgb(0, 102, 0);"> &= nbsp; // Returning 'false' means the button is disabled (non-clickable)</sp= an><br style=3D"font-family: courier new,courier,monaco,monospace,sans-seri= f; color: rgb(0, 102, 0);"><span style=3D"font-family: courier new,courier,= monaco,monospace,sans-serif; color: rgb(0, 102, 0);"> &nbs= p; // Default value =3D 'true'</s= pan><br style=3D"font-family: courier new,courier,monaco,monospace,sans-ser= if; color: rgb(0, 102, 0);"> <span style=3D"font-family: courier new,courier,monaco,monospace,sans-serif= ;"></span><span style=3D"font-family: courier new,courier,monaco,monospace,= sans-serif;"> </span><span style=3D"font-family: courier = new,courier,monaco,monospace,sans-serif;"> = </span><span style=3D"font-family: courier new,courier,monaco,monospace,san= s-serif;"><span style=3D"color: rgb(0, 0, 153);">isEnabled</span>: <span st= yle=3D"font-weight: bold; color: rgb(153, 0, 0);">function</span>() {<br></= span><span style=3D"font-family: courier new,courier,monaco,monospace,sans-= serif; color: rgb(0, 102, 0);"> &n= bsp; // Enable button only when exactly one= item is selected</span><br style=3D"font-family: courier new,courier,monac= o,monospace,sans-serif; color: rgb(0, 102, 0);"><span style=3D"font-family:= courier new,courier,monaco,monospace,sans-serif;"> </spa= n><span style=3D"font-family: courier new,courier,monaco,monospace,sans-ser= if;"> </span><span style=3D"font-family: courier new,cour= ier,monaco,monospace,sans-serif;">  = ; </span><span style=3D"font-family: courier new,courier,monaco,monospace,s= ans-serif;"><span style=3D"font-weight: bold; color: rgb(153, 0, 0);">retur= n</span> arguments.length =3D=3D 1;</span><br style=3D"font-family: courier= new,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: cour= ier new,courier,monaco,monospace,sans-serif;"> <= /span><span style=3D"font-family: courier new,courier,monaco,monospace,sans= -serif;"> </span><span style=3D"font-family: courier new,= courier,monaco,monospace,sans-serif;">},</span><br><br><span style=3D"font-= family: courier new,courier,monaco,monospace,sans-serif; color: rgb(0, 102,= 0);"> // Returning 'tru= e' means the button is visible<br>  = ; // Returning 'false' means the button is hidden</= span><br style=3D"font-family: courier new,courier,monaco,monospace,sans-se= rif; color: rgb(0, 102, 0);"><span style=3D"font-family: courier new,courie= r,monaco,monospace,sans-serif; color: rgb(0, 102, 0);"> = // Default value =3D 'true'</span><br style= =3D"font-family: courier new,courier,monaco,monospace,sans-serif; color: rg= b(0, 102, 0);"> <span style=3D"font-family: courier new,courier,monaco,monospace,sans-serif= ;"></span><span style=3D"font-family: courier new,courier,monaco,monospace,= sans-serif;"></span><span style=3D"font-family: courier new,courier,monaco,= monospace,sans-serif;"> </span><span style=3D"font-family= : courier new,courier,monaco,monospace,sans-serif;"> &n= bsp; </span><span style=3D"font-family: courier new,courier,monaco,monospac= e,sans-serif;"><span style=3D"color: rgb(0, 0, 153);">isAccessible</span>: = <span style=3D"font-weight: bold; color: rgb(153, 0, 0);">function</span>()= {</span><br><span style=3D"font-family: courier new,courier,monaco,monospa= ce,sans-serif; color: rgb(0, 102, 0);"> = // Always show the button in the co= rresponding data grid</span><br style=3D"font-family: courier new,courier,m= onaco,monospace,sans-serif; color: rgb(0, 102, 0);"><span style=3D"font-fam= ily: courier new,courier,monaco,monospace,sans-serif;"> <= /span><span style=3D"font-family: courier new,courier,monaco,monospace,sans= -serif;"> </span><span style=3D"font-family: courier new,= courier,monaco,monospace,sans-serif;"> &= nbsp; </span><span style=3D"font-family: courier new,courier,monaco,monospa= ce,sans-serif;"><span style=3D"font-weight: bold; color: rgb(153, 0, 0);">r= eturn</span> <span style=3D"font-weight: bold; color: rgb(153, 0, 0);">true= </span>;</span><br style=3D"font-family: courier new,courier,monaco,monospa= ce,sans-serif;"><span style=3D"font-family: courier new,courier,monaco,mono= space,sans-serif;"> </span><span style=3D"font-family: co= urier new,courier,monaco,monospace,sans-serif;"> &nb= sp; </span><span style=3D"font-family: courier new,courier,mona= co,monospace,sans-serif;">}</span><br><br style=3D"font-family: courier new= ,courier,monaco,monospace,sans-serif;"><span style=3D"font-family: courier = new,courier,monaco,monospace,sans-serif;"> &nb= sp; </span><span style=3D"font-family: courier new,courier,monaco,mon= ospace,sans-serif;">}<br><br> );</span><br style=3D"font-= family: courier new,courier,monaco,monospace,sans-serif;"><span style=3D"fo= nt-family: courier new,courier,monaco,monospace,sans-serif;">}</span><br><b= r>As mentioned above, all functions of an interface object are optional. Fo= r functions expecting return value, default value is defined by UI plugin i= nfrastructure. For example:<br><ul><li>onClick - no default value (no retur= n value expected)</li><li>isEnabled / isAccessible - default value "true" (= boolean return value expected)</li></ul><p></p><p>Note: UI plugin infrastru= cture checks the actual return value type, and uses default value in case t= he function returned something of wrong (unexpected) type.<br></p><br>In th= e example above, "currently selected item(s)" maps to JSON-like representat= ions of business entities currently selected in the corresponding data grid= . For now, the entity representation is quite simple and same for all entit= y types:<br><br><span style=3D"font-family: courier new,courier,monaco,mono= space,sans-serif;">{ entityId: "[BusinessEntityGuidAsString]" }</span><br s= tyle=3D"font-family: courier new,courier,monaco,monospace,sans-serif;"><br>= In future, we will create specific JSON-like representations for specific b= usiness entities, in compliance with Engine REST API entity structure.<br><= br>For a more extensive example of using "addMainTabActionButton" API, plea= se see the attached "addMainTabActionButton.html.example" file.<br><br><hr = style=3D"width: 100%; height: 2px;"><br><span style=3D"font-weight: bold;">= 2. Improved plugin API function: addMainTab</span><br style=3D"font-weight:= bold;"><br>The "addMainTab" API was improved to address following issues:<= br><ul><li>"addMainTab" can now be called at any moment during UI plugin ru= ntime, given that the plugin is allowed invoke plugin API functions (plugin= is either INITIALIZING or IN_USE).<br>Previously, "addMainTab" worked reli= ably only when called from within UiInit event handler function.<br>Current= ly, it's possible to call "addMainTab" at any moment, e.g. from within some= other event handler function (after UiInit has completed).</li></ul><ul><l= i>"addMainTab" now retains "active" tab (highlighted tab GUI).<br>"addMainT= ab" works by adding new tab component (GWTP presenter proxy) and refreshing= main tab panel GUI by removing all related tabs and re-adding them again.<= br>This logic is handled by org.ovirt.engine.ui.common.presenter.DynamicTab= ContainerPresenter class, which makes sure that "active" tab is retained ev= en after main tab panel was refreshed.<br></li></ul><p></p>Furthermore, cus= tom main tab implementation now displays the content of the given URL throu= gh HTML iframe element.<br><br><hr style=3D"width: 100%; height: 2px;"><br>= <span style=3D"font-weight: bold;">3. Improved native JavaScript function h= andling</span> (GWT JSNI)<br><br>This patch introduces org.ovirt.engine.ui.= webadmin.plugin.jsni.JsFunction and org.ovirt.engine.ui.webadmin.plugin.jsn= i.JsFunctionResultHelper classes providing Java abstraction for invoking na= tive JavaScript functions. These classes follow the general contract of "in= terface object" as mentioned above.<br><br>JsFunctionResultHelper is partic= ularly useful when dealing with functions which are expected to return valu= e of a certain type. Too bad standard GWT JSNI classes don't provide such a= bstraction for working with native functions out-of-the-box...<br><br><hr s= tyle=3D"width: 100%; height: 2px;"><br><span style=3D"font-weight: bold;">4= . ActionPanel and ActionTable type hierarchy refactoring</span> (related to= "addMainTabActionButton" API)<br style=3D"font-weight: bold;"><br>Previous= ly, AbstractActionPanel and AbstractActionTable classes didn't implement an= y reasonable interface that would allow other components (client-side UI pl= ugin infrastructure) to depend on their functionality in a loosely-coupled = manner. This would make code that implements "addMainTabActionButton" API "= ugly": main tab view interface would have to reference AbstractActionTable = class directly. In MVP design pattern, view interface should avoid referenc= ing specific GWT Widget classes directly.<br><br>This patch introduces new = interfaces for ActionPanel and ActionTable components while eliminating cod= e redundancy (duplicate or unnecessary code).<br><br><hr style=3D"width: 10= 0%; height: 2px;"><br><span style=3D"font-weight: bold;">5. ActionPanel typ= e hierarchy refactoring</span> (related to "addMainTab" API)<br><br>Since o= rg.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter defines ne= w DynamicTabPanel interface that extends standard GWTP TabPanel interface, = some refactoring had to be done in related ActionPanel classes.<br><br>This= patch makes sure that both org.ovirt.engine.ui.common.widget.tab.AbstractT= abPanel (widget) and org.ovirt.engine.ui.common.view.AbstractTabPanelView (= view) support DynamicTabPanel interface.<br><br>Note that for now, only mai= n tab panel (org.ovirt.engine.ui.webadmin.section.main.presenter.MainTabPan= elPresenter) supports dynamic tabs within its view.<br><br><hr style=3D"wid= th: 100%; height: 2px;"><br><span style=3D"font-weight: bold;">Where is add= SubTab API function?</span><br><br>Implementing "addSubTab" API requires so= me more changes, and I didn't want to delay this PoC patch just because of = it...<br><br>Here's a sample code that illustrates proposed "addSubTab" API= usage:<br><br><span style=3D"font-family: courier new,courier,monaco,monos= pace,sans-serif;">UiInit: <span style=3D"font-weight: bold; color: rgb(153,= 0, 0);">function</span>() {</span><br style=3D"font-family: courier new,co= urier,monaco,monospace,sans-serif;"> <span style=3D"font-family: courier new,courier,monaco,monospace,sans-serif= ;"></span><span style=3D"font-family: courier new,courier,monaco,monospace,= sans-serif;"> api.<span style=3D"color: rgb(204, 51, 204)= ;">addSubTab</span>('Host', <span styl= e=3D"color: rgb(0, 102, 0);">// entityTypeName</span><br> = 'Custom Host Sub Tab', <span style=3D"= color: rgb(0, 102, 0);">// label</span><br> &n= bsp; 'custom-host-sub-tab', <span style=3D"color: rgb(0, 102, = 0);">// historyToken</span><br> '= http://www.ovirt.org/', <span style=3D"color: rgb(0, 102, 0);">// contentUr= l<br><br></span> <span style=3D"b= ackground-color: rgb(255, 255, 255); color: rgb(0, 102, 0);">// Sub tab int= erface object<br> // </span></spa= n><span style=3D"font-family: courier new,courier,monaco,monospace,sans-ser= if;"><span style=3D"color: rgb(0, 102, 0);">All functions receive currently= selected item(s)<br> // within t= he main tab data grid as function arguments</span></span><br style=3D"color= : rgb(0, 102, 0);"><span style=3D"font-family: courier new,courier,monaco,m= onospace,sans-serif;"><span style=3D"background-color: rgb(255, 255, 255); = color: rgb(0, 102, 0);"></span> {</span><br> <br> <span style=3D"font-family: courier new,courier,monaco,monospace,sans-serif= ; color: rgb(0, 102, 0);"></span><span style=3D"font-family: courier new,co= urier,monaco,monospace,sans-serif; color: rgb(0, 102, 0);"> &nbs= p; // Returning 'true' means the sub tab i= s visible<br> // Retur= ning 'false' means the sub tab is hidden</span><br style=3D"font-family: co= urier new,courier,monaco,monospace,sans-serif; color: rgb(0, 102, 0);"> <span style=3D"font-family: courier new,courier,monaco,monospace,sans-serif= ; color: rgb(0, 102, 0);"> &nbs= p; // Default value =3D 'true'</span><br style=3D"font-family: courier new,= courier,monaco,monospace,sans-serif; color: rgb(0, 102, 0);"> <span style=3D"font-family: courier new,courier,monaco,monospace,sans-serif= ;"></span><span style=3D"font-family: courier new,courier,monaco,monospace,= sans-serif;"></span><span style=3D"font-family: courier new,courier,monaco,= monospace,sans-serif;"> </span><span style=3D"font-family= : courier new,courier,monaco,monospace,sans-serif;"> &n= bsp; </span><span style=3D"font-family: courier new,courier,monaco,monospac= e,sans-serif;"><span style=3D"color: rgb(0, 0, 153);">isAccessible</span>: = <span style=3D"font-weight: bold; color: rgb(153, 0, 0);">function</span>()= {<br></span><span style=3D"font-family: courier new,courier,monaco,monospa= ce,sans-serif;"> </span><span style=3D"font-family: couri= er new,courier,monaco,monospace,sans-serif;"> </span><spa= n style=3D"font-family: courier new,courier,monaco,monospace,sans-serif;">&= nbsp; </span><span style=3D"font-family= : courier new,courier,monaco,monospace,sans-serif;"><span style=3D"font-wei= ght: bold; color: rgb(153, 0, 0);">return</span> </span><span style=3D"font= -family: courier new,courier,monaco,monospace,sans-serif;">arguments.length= =3D=3D 1</span><span style=3D"font-family: courier new,courier,monaco,mono= space,sans-serif;"> && </span><span style=3D"font-family: courier n= ew,courier,monaco,monospace,sans-serif;">arguments[0].entityId =3D=3D '<= MyHostEntityId>'</span><span style=3D"font-family: courier new,courier,m= onaco,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><span style=3D"font-family: courier new,courie= r,monaco,monospace,sans-serif;"> = </span><span style=3D"font-family: courier new,courier,monaco,monospace,san= s-serif;">}</span><br> <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><span style=3D"font-fa= mily: courier new,courier,monaco,monospace,sans-serif;">}<br> <br> );</span><br style=3D"font-family: courier new,courier,m= onaco,monospace,sans-serif;"> <span style=3D"font-family: courier new,courier,monaco,monospace,sans-serif= ;">}</span><br><br>As part of "addSubTab" API implementation, I'll refactor= custom main tab components, in order to use one "tab type" for both main a= nd sub tabs.<br><br>Currently, we have one (and only one) "tab type" - a ta= b that shows content of the given URL through HTML iframe element.<br><br>W= e could also create new "tab types", e.g. form-based tab that shows key/val= ue pairs (IMHO this could be quite useful for custom sub tabs).<br><br><hr = style=3D"width: 100%; height: 2px;"><br>Let me know what you think!<br><br>= Cheers,<br>Vojtech<br><br></div></body></html> ------=_Part_9716069_2003615259.1350571769689-- ------=_Part_9716068_484635069.1350571769689 Content-Type: application/x-compressed-tar; name=poc-6-examples.tar.gz Content-Disposition: attachment; filename=poc-6-examples.tar.gz Content-Transfer-Encoding: base64 H4sIAGMRgFAAA+2WXU/bMBSGuU1/xZl2kVSUJKWlSFCQOmAaF2iTYBcT4yJNTOIttSPboesQ/33H SQv9IApsFQPJz0X9bR+f8x6nQRSdBZRdBEM3UaPUJb+CUZaSjXXiI71utyh3e4ulpoP19rbf9f22 v9PB/vaOv729Af5aragglyoQABs38jcPZfW8uvE3Sv/d8eeji29fTkCH/7DRnxUkiLCQoaCZOmxY N+ikIKNwAFkgCFNuluYxZYOMOvY153Zzv2HhuCtITKUiwrltWNZXesqo2oPrnIWKcuY0QXcXE4N7 4Tn2R84BK3YL9F5bqqwmSmV7njcej11+Q4VyuYi94iDrrmHdPZwYRBMHW31vZm3fm5o/5NFEN2dl ebn/7fPXxEMYBkWIPuRKcbbet6Am/7vtdu8+/zs9H/N/t7Pjm/x/CdaR/8NAPC//PQ/OqZYWDAu5 rb4J82J07KM013vqR2HAJlvTJpSTsPe2ATVwdpTS8OeSKXWrZowpi/jYDVIilGNfJEQQQC+ADZtY xvkIHSLdlLBYJdhlQ1ha6MgmSJKSUJFIe6junLtW7RQqT1gwTEn0l1cRROWCgRI5WZM9gzAkUlK0 6UVMqpyhPwhTcZW6AVJ6CsYJYSApi1FwVJERGn0fljrpfeJSad2dF8u3dHNed7jaelxbesRaFM75 9ExI9C6oGaomcHqMObUgpEv/yi0HT6Pia4ffu1ZRVAW/OGvqxhU9HhxAe2mXypDNb1TGo1inf2vc O+KYDyoJGKbaI16uCtpTXH+Wp4queL5OKP+W8fq5G8kYQ3P5lHzXAZ1P9j37ql7KM665AEcfqF9X vwW4L1aWz9nH4b4ew8rm5nPuMgPv42a5TBz7Oyu8+V7fhxYXqBYjXRDjU8+qTtNlFlJEm/iDUwy+ 3XxV7+VK1A91Uq3Fvtf0fpp/1gaDwWAwGAwGg8FgMBgMBoPBYDAYDG+dP/59M0oAKAAA ------=_Part_9716068_484635069.1350571769689--

--_000_D290AD8432118048947689BA3AE8A9B3E9F8E0SACEXCMBX04PRDhqn_ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 TmljZSB3b3JrIFZvanRlY2ghIEnigJltIHN0aWxsIGluIHRoZSBwcm9jZXNzIG9mIHB1bGxpbmcg ZG93biB0aGUgY29kZSBidXQgbG9vayBmb3J3YXJkIHRvIHRyeWluZyBpdCBvdXQuIEJhc2VkIG9u IHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIGltcGxlbWVudGF0aW9ucywgaXQgbG9va3MgbGlrZSBp dCB3aWxsIGdpdmUgdXMgd2hhdCB3ZSBuZWVkLiBJ4oCZbGwgbGV0IHlvdSBrbm93IGZ1cnRoZXIg b25jZSBJIGdldCBpdCBnb2luZy4NCg0KLUNocmlzDQoNCkZyb206IGVuZ2luZS1kZXZlbC1ib3Vu Y2VzQG92aXJ0Lm9yZyBbbWFpbHRvOmVuZ2luZS1kZXZlbC1ib3VuY2VzQG92aXJ0Lm9yZ10gT24g QmVoYWxmIE9mIFZvanRlY2ggU3pvY3MNClNlbnQ6IFRodXJzZGF5LCBPY3RvYmVyIDE4LCAyMDEy IDEwOjQ5IEFNDQpUbzogZW5naW5lLWRldmVsDQpTdWJqZWN0OiBbRW5naW5lLWRldmVsXSBVSSBQ bHVnaW5zOiBQb0MgcGF0Y2ggcmV2aXNpb24gNiBub3cgYXZhaWxhYmxlDQoNCkhpIGd1eXMsDQoN CnRoZSBsYXRlc3QgcmV2aXNpb24gb2YgVUkgUGx1Z2lucyBwcm9vZi1vZi1jb25jZXB0IHBhdGNo IGlzIG5vdyBhdmFpbGFibGUgZm9yIHlvdSB0byBleHBlcmltZW50IHdpdGguIFlvdSBjYW4gZG93 bmxvYWQgdGhlIHBhdGNoIGZyb20gb1ZpcnQgR2Vycml0IGF0IGh0dHA6Ly9nZXJyaXQub3ZpcnQu b3JnLyMvYy84MTIwLzIgKHBhdGNoIHNldCAyKS4NCg0KUGxlYXNlIHJlYWQgb24gdG8gbGVhcm4g d2hhdCdzIG5ldyBpbiB0aGlzIHJldmlzaW9uLiBJZiB5b3UgaGF2ZSBhbnkgY29tbWVudHMsIHF1 ZXN0aW9ucyBvciBpZGVhcywgcGxlYXNlIGxldCBtZSBrbm93IQ0KX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18NCg0KMC4gVUkgcGx1Z2luIHBhdGggaW5mb3JtYXRpb24gcmVzb2x2ZWQg dXNpbmcgbG9jYWwgRW5naW5lIGNvbmZpZ3VyYXRpb24NCg0KU2VydmVyLXNpZGUgVUkgcGx1Z2lu IGluZnJhc3RydWN0dXJlIG5vdyB1c2VzIGxvY2FsIChtYWNoaW5lLXNwZWNpZmljKSBFbmdpbmUg Y29uZmlndXJhdGlvbiBpbnN0ZWFkIG9mIGdsb2JhbCAodmRjX29wdGlvbnMgZGF0YWJhc2UgdGFi bGUpIEVuZ2luZSBjb25maWd1cmF0aW9uOg0KDQogICogICBQcmV2aW91c2x5LCBwYXRoIGluZm9y bWF0aW9uIHdhcyByZXNvbHZlZCB0aHJvdWdoIG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24u Y29uZmlnLkNvbmZpZyBjbGFzcyAtIEVuZ2luZSBjb25maWd1cmF0aW9uIHZhbHVlcyB3ZXJlIHJl dHJpZXZlZCBmcm9tIHZkY19vcHRpb25zIGRhdGFiYXNlIHRhYmxlLg0KICAqICAgQ3VycmVudGx5 LCBwYXRoIGluZm9ybWF0aW9uIGlzIHJlc29sdmVkIHRocm91Z2ggb3JnLm92aXJ0LmVuZ2luZS5j b3JlLnV0aWxzLkxvY2FsQ29uZmlnIGNsYXNzIC0gRW5naW5lIGNvbmZpZ3VyYXRpb24gdmFsdWVz IGFyZSByZXRyaWV2ZWQgZnJvbSBsb2NhbCBmaWxlIHN5c3RlbS4NCkluIGNhc2UgeW91J3JlIG5v dCB3b3JraW5nIHdpdGggb1ZpcnQgRW5naW5lIHRocm91Z2ggUlBNIHBhY2thZ2Ugc3lzdGVtLCBl LmcuIHlvdSBoYXZlIGEgbG9jYWwgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgc2V0IHVwIGFuZCB5 b3UgYnVpbGQgYW5kIGRlcGxveSBvVmlydCBFbmdpbmUgdGhyb3VnaCBNYXZlbiwgcGxlYXNlIGZv bGxvdyB0aGVzZSBzdGVwczoNCg0KYS4gQ29weSBkZWZhdWx0IEVuZ2luZSBjb25maWd1cmF0aW9u IGludG8gL3Vzci9zaGFyZS9vdmlydC1lbmdpbmUvY29uZg0KIyBta2RpciAtcCAvdXNyL3NoYXJl L292aXJ0LWVuZ2luZS9jb25mDQojIGNwIDxPVklSVF9IT01FPi9iYWNrZW5kL21hbmFnZXIvY29u Zi9lbmdpbmUuY29uZi5kZWZhdWx0cyAvdXNyL3NoYXJlL292aXJ0LWVuZ2luZS9jb25mL2VuZ2lu ZS5jb25mLmRlZmF1bHRzDQoNCmIuIElmIG5lY2Vzc2FyeSwgY29weSBVSSBwbHVnaW4gZGF0YSBm aWxlcyBmcm9tIC91c3Ivc2hhcmUvZW5naW5lL3VpLXBsdWdpbnMgdG8gL3Vzci9zaGFyZS9vdmly dC1lbmdpbmUvdWktcGx1Z2lucw0KDQpjLiBJZiBuZWNlc3NhcnksIGNvcHkgVUkgcGx1Z2luIGNv bmZpZyBmaWxlcyBmcm9tIC9ldGMvZW5naW5lL3VpLXBsdWdpbnMgdG8gL2V0Yy9vdmlydC1lbmdp bmUvdWktcGx1Z2lucw0KDQpkLCBJbiBjYXNlIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBkZWZh dWx0IEVuZ2luZSBjb25maWd1cmF0aW9uLCBwdXQgeW91ciBjdXN0b20gcHJvcGVydHkgZmlsZSBp bnRvIC9ldGMvc3lzY29uZmlnL292aXJ0LWVuZ2luZQ0KDQpUaGUgcmVhc29uIGJlaGluZCB0aGlz IGNoYW5nZSBpcyB0aGF0IHBhdGggaW5mb3JtYXRpb24gZm9yIFVJIHBsdWdpbiBkYXRhIGFuZCBj b25maWd1cmF0aW9uIGlzIHR5cGljYWxseSBtYWNoaW5lLXNwZWNpZmljLCBhbmQgc2hvdWxkIGJl IGN1c3RvbWl6YWJsZSBwZXIgbWFjaGluZSB0aHJvdWdoIEVuZ2luZSBsb2NhbCBjb25maWd1cmF0 aW9uLg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KMS4gTmV3IHBsdWdpbiBB UEkgZnVuY3Rpb246IGFkZE1haW5UYWJBY3Rpb25CdXR0b24NCg0KVGhlICJhZGRNYWluVGFiQWN0 aW9uQnV0dG9uIiBBUEkgYWRkcyBjdXN0b20gY29udGV4dC1zZW5zaXRpdmUgYnV0dG9uIHRvIHRo ZSBnaXZlbiBtYWluIHRhYidzIGRhdGEgZ3JpZCwgYWxvbmcgd2l0aCBjb3JyZXNwb25kaW5nIGRh dGEgZ3JpZCBjb250ZXh0IG1lbnUgaXRlbS4NCg0KYWRkTWFpblRhYkFjdGlvbkJ1dHRvbihlbnRp dHlUeXBlTmFtZSwgbGFiZWwsIGFjdGlvbkJ1dHRvbkludGVyZmFjZSkNCg0KZW50aXR5VHlwZU5h bWUgaW5kaWNhdGVzIHdoaWNoIG1haW4gdGFiJ3MgZGF0YSBncmlkIHRoZSBidXR0b24gc2hvdWxk IGJlIGFkZGVkIHRvLCBhY2NvcmRpbmcgdG8gdGhlIGVudGl0eSB0eXBlIGFzc29jaWF0ZWQgd2l0 aCB0aGUgbWFpbiB0YWIuIGVudGl0eVR5cGVOYW1lIHZhbHVlcyBhcmUgc3RyaW5ncyByZWZsZWN0 aW5nIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLmVudGl0eUVudGl0eVR5cGUg ZW51bSBtZW1iZXJzLiBGb2xsb3dpbmcgZW50aXR5VHlwZU5hbWUgdmFsdWVzIGFyZSBjdXJyZW50 bHkgc3VwcG9ydGVkICh2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlKTogIkRhdGFDZW50ZXIiLCAi Q2x1c3RlciIsICJIb3N0IiwgIlN0b3JhZ2UiLCAiRGlzayIsICJWaXJ0dWFsTWFjaGluZSIsICJU ZW1wbGF0ZSIuDQoNCk5vdGU6ICJQb29sIiB2YWx1ZSBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRl ZCwgYmVjYXVzZSBvZiBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmJ1c2luZXNzZW50aXRp ZXMudm1fcG9vbHMgZW50aXR5IG5vdCBpbXBsZW1lbnRpbmcgdGhlIEJ1c2luZXNzRW50aXR5IGlu dGVyZmFjZSwgbm90IHN1cmUgd2h5IHRob3VnaC4gTWF5YmUgd2Ugc2hvdWxkIHN3aXRjaCBmcm9t IEJ1c2luZXNzRW50aXR5IHRvIElWZGNRdWVyeWFibGUgaW50ZXJmYWNlIGFuZCBhbHdheXMgY2Fz dCBnZXRRdWVyeWFibGVJZCBtZXRob2QgcmVzdWx0IHZhbHVlIHRvIEd1aWQ/DQoNCmxhYmVsIGlz IHRoZSB0aXRsZSBkaXNwbGF5ZWQgb24gdGhlIGJ1dHRvbi4NCg0KYWN0aW9uQnV0dG9uSW50ZXJm YWNlIHJlcHJlc2VudHMgYW4gb2JqZWN0IHRoYXQgImltcGxlbWVudHMgdGhlIGJ1dHRvbiBpbnRl cmZhY2UiIGJ5IGRlY2xhcmluZyBpdHMgZnVuY3Rpb25zOiBvbkNsaWNrLCBpc0VuYWJsZWQsIGlz QWNjZXNzaWJsZS4gQWxsIGZ1bmN0aW9ucyBvZiBhY3Rpb25CdXR0b25JbnRlcmZhY2UgcmVjZWl2 ZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbShzKSBhcyBmdW5jdGlvbiBhcmd1bWVudHMuDQoNCkxl dCdzIHRha2UgYSBjbG9zZXIgbG9vayBhdCB0aGUgY29uY2VwdCBiZWhpbmQgYWN0aW9uQnV0dG9u SW50ZXJmYWNlLiBJbiB0cmFkaXRpb25hbCBjbGFzcy1iYXNlZCBvYmplY3Qtb3JpZW50ZWQgbGFu Z3VhZ2VzLCBzdWNoIGFzIEphdmEsIGludGVyZmFjZSBpcyBhbiBhYnN0cmFjdCB0eXBlIHRoYXQg Y29udGFpbnMgbWV0aG9kIGRlY2xhcmF0aW9ucyB3aXRob3V0IGFuIGltcGxlbWVudGF0aW9uLiBB IGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgZ2l2ZW4gaW50ZXJmYWNlIG11c3QgaW1wbGVtZW50 IGFsbCBtZXRob2RzIGRlY2xhcmVkIGJ5IHRoYXQgaW50ZXJmYWNlICh1bmxlc3MgaXQncyBhbiBh YnN0cmFjdCBjbGFzcywgYnV0IHRoaXMgaXNuJ3QgcmVsZXZhbnQgaW4gb3VyIGNhc2UpLg0KDQpJ biBjb250cmFzdCB3aXRoIHRyYWRpdGlvbmFsIGNsYXNzLWJhc2VkIG9iamVjdC1vcmllbnRlZCBs YW5ndWFnZXMsIEphdmFTY3JpcHQgc3VwcG9ydHMgT09QIHRocm91Z2ggcHJvdG90eXBlLWJhc2Vk IHByb2dyYW1taW5nIG1vZGVsIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9k b2NzL0phdmFTY3JpcHQvSW50cm9kdWN0aW9uX3RvX09iamVjdC1PcmllbnRlZF9KYXZhU2NyaXB0 KS4gQXQgdGhlIHNhbWUgdGltZSwgSmF2YVNjcmlwdCBsYW5ndWFnZSBpcyBkeW5hbWljYWxseS10 eXBlZCBhbmQgdGhlcmVmb3JlIGRvZXNuJ3Qgc3VwcG9ydCB0cmFkaXRpb25hbCBjb25jZXB0IG9m IGludGVyZmFjZSBpbiBPT1AsIGl0IHVzZXMgImR1Y2sgdHlwaW5nIiB0ZWNobmlxdWUgaW5zdGVh ZCAoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EdWNrX3R5cGluZykuDQoNClRoZSBzaW1w bGVzdCB3YXkgdG8gcHJvdmlkZSBhbiBvYmplY3QgdGhhdCAiaW1wbGVtZW50cyB0aGUgZ2l2ZW4g aW50ZXJmYWNlIiBpbiBKYXZhU2NyaXB0IGlzIHRvIHVzZSAiZHVjayB0eXBpbmciIHRlY2huaXF1 ZTogcHJvdmlkaW5nIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHdlbGwta25vd24gZnVuY3Rpb25z LiBJbiBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUsIEkgY2FsbCB0aGlzIGNvbmNlcHQgImludGVy ZmFjZSBvYmplY3QiLCByZXByZXNlbnRlZCBieSBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWlu LnBsdWdpbi5qc25pLkpzSW50ZXJmYWNlT2JqZWN0IGNsYXNzLiBVbmxpa2UgdGhlIHRyYWRpdGlv bmFsIGNvbmNlcHQgb2YgaW50ZXJmYWNlIGFic3RyYWN0IHR5cGUgaW4gb2JqZWN0LW9yaWVudGVk IGxhbmd1YWdlcywgYW4gImludGVyZmFjZSBvYmplY3QiIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGhh dmUgdG8gZGVjbGFyZSBhbGwgZnVuY3Rpb25zIG9mIHRoZSBnaXZlbiBpbnRlcmZhY2UgaW4gb3Jk ZXIgdG8gImltcGxlbWVudCIgc3VjaCBpbnRlcmZhY2UuIEluIGZhY3QsIGFuIGVtcHR5IG9iamVj dCBjYW4gYmUgdXNlZCBhcyBhIHZhbGlkICJpbnRlcmZhY2Ugb2JqZWN0Ii4gTWlzc2luZyBmdW5j dGlvbnMgd2lsbCBiZSBzaW1wbHkgdHJlYXRlZCBhcyBlbXB0eSAobm8tb3ApIGZ1bmN0aW9ucy4g RnVydGhlcm1vcmUsIGFuICJpbnRlcmZhY2Ugb2JqZWN0IiBjYW4gImltcGxlbWVudCIgbXVsdGlw bGUgaW50ZXJmYWNlcyBieSBkZWNsYXJpbmcgZnVuY3Rpb25zIG9mIHRob3NlIGludGVyZmFjZXMg KGludGVyZmFjZSBjb21wb3NpdGlvbikuDQoNCkdldHRpbmcgYmFjayB0byAiYWRkTWFpblRhYkFj dGlvbkJ1dHRvbiIgQVBJLCBoZXJlJ3MgYSBzYW1wbGUgY29kZSB0aGF0IGFkZHMgbmV3IGJ1dHRv biB0byAiSG9zdCIgbWFpbiB0YWIgZGF0YSBncmlkLCBhcyBwYXJ0IG9mIFVpSW5pdCBldmVudCBo YW5kbGVyIGZ1bmN0aW9uOg0KDQpVaUluaXQ6IGZ1bmN0aW9uKCkgew0KICAgIGFwaS5hZGRNYWlu VGFiQWN0aW9uQnV0dG9uKCdIb3N0JywgJ1NpbmdsZS1Ib3N0IEFjdGlvbicsDQoNCiAgICAgICAg Ly8gQWN0aW9uIGJ1dHRvbiBpbnRlcmZhY2Ugb2JqZWN0DQogICAgICAgIC8vIEFsbCBmdW5jdGlv bnMgcmVjZWl2ZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbShzKSBhcyBmdW5jdGlvbiBhcmd1bWVu dHMNCiAgICAgICAgew0KDQogICAgICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlj a3MgdGhlIGJ1dHRvbg0KICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oKSB7DQogICAgICAg ICAgICAgICAgLy8gQ2FsbGluZyAnYXJndW1lbnRzWzBdJyBpcyBzYWZlLCBiZWNhdXNlIG9uQ2xp Y2soKSBjYW4gYmUgY2FsbGVkDQogICAgICAgICAgICAgICAgLy8gb25seSB3aGVuIGV4YWN0bHkg b25lIGl0ZW0gaXMgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSBkYXRhIGdyaWQNCiAgICAgICAg ICAgICAgICB3aW5kb3cuYWxlcnQoJ1NlbGVjdGVkIGhvc3QgZW50aXR5IElEID0gJyArIGFyZ3Vt ZW50c1swXS5lbnRpdHlJZCk7DQogICAgICAgICAgICB9LA0KDQogICAgICAgICAgICAvLyBSZXR1 cm5pbmcgJ3RydWUnIG1lYW5zIHRoZSBidXR0b24gaXMgZW5hYmxlZCAoY2xpY2thYmxlKQ0KICAg ICAgICAgICAgLy8gUmV0dXJuaW5nICdmYWxzZScgbWVhbnMgdGhlIGJ1dHRvbiBpcyBkaXNhYmxl ZCAobm9uLWNsaWNrYWJsZSkNCiAgICAgICAgICAgIC8vIERlZmF1bHQgdmFsdWUgPSAndHJ1ZScN CiAgICAgICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgLy8g RW5hYmxlIGJ1dHRvbiBvbmx5IHdoZW4gZXhhY3RseSBvbmUgaXRlbSBpcyBzZWxlY3RlZA0KICAg ICAgICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09IDE7DQogICAgICAgICAgICB9 LA0KDQogICAgICAgICAgICAvLyBSZXR1cm5pbmcgJ3RydWUnIG1lYW5zIHRoZSBidXR0b24gaXMg dmlzaWJsZQ0KICAgICAgICAgICAgLy8gUmV0dXJuaW5nICdmYWxzZScgbWVhbnMgdGhlIGJ1dHRv biBpcyBoaWRkZW4NCiAgICAgICAgICAgIC8vIERlZmF1bHQgdmFsdWUgPSAndHJ1ZScNCiAgICAg ICAgICAgIGlzQWNjZXNzaWJsZTogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgLy8gQWx3 YXlzIHNob3cgdGhlIGJ1dHRvbiBpbiB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGdyaWQNCiAgICAg ICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9DQoNCiAg ICApOw0KfQ0KDQpBcyBtZW50aW9uZWQgYWJvdmUsIGFsbCBmdW5jdGlvbnMgb2YgYW4gaW50ZXJm YWNlIG9iamVjdCBhcmUgb3B0aW9uYWwuIEZvciBmdW5jdGlvbnMgZXhwZWN0aW5nIHJldHVybiB2 YWx1ZSwgZGVmYXVsdCB2YWx1ZSBpcyBkZWZpbmVkIGJ5IFVJIHBsdWdpbiBpbmZyYXN0cnVjdHVy ZS4gRm9yIGV4YW1wbGU6DQoNCiAgKiAgIG9uQ2xpY2sgLSBubyBkZWZhdWx0IHZhbHVlIChubyBy ZXR1cm4gdmFsdWUgZXhwZWN0ZWQpDQogICogICBpc0VuYWJsZWQgLyBpc0FjY2Vzc2libGUgLSBk ZWZhdWx0IHZhbHVlICJ0cnVlIiAoYm9vbGVhbiByZXR1cm4gdmFsdWUgZXhwZWN0ZWQpDQoNCk5v dGU6IFVJIHBsdWdpbiBpbmZyYXN0cnVjdHVyZSBjaGVja3MgdGhlIGFjdHVhbCByZXR1cm4gdmFs dWUgdHlwZSwgYW5kIHVzZXMgZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIHRoZSBmdW5jdGlvbiByZXR1 cm5lZCBzb21ldGhpbmcgb2Ygd3JvbmcgKHVuZXhwZWN0ZWQpIHR5cGUuDQoNCkluIHRoZSBleGFt cGxlIGFib3ZlLCAiY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0ocykiIG1hcHMgdG8gSlNPTi1saWtl IHJlcHJlc2VudGF0aW9ucyBvZiBidXNpbmVzcyBlbnRpdGllcyBjdXJyZW50bHkgc2VsZWN0ZWQg aW4gdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBncmlkLiBGb3Igbm93LCB0aGUgZW50aXR5IHJlcHJl c2VudGF0aW9uIGlzIHF1aXRlIHNpbXBsZSBhbmQgc2FtZSBmb3IgYWxsIGVudGl0eSB0eXBlczoN Cg0KeyBlbnRpdHlJZDogIltCdXNpbmVzc0VudGl0eUd1aWRBc1N0cmluZ10iIH0NCg0KSW4gZnV0 dXJlLCB3ZSB3aWxsIGNyZWF0ZSBzcGVjaWZpYyBKU09OLWxpa2UgcmVwcmVzZW50YXRpb25zIGZv ciBzcGVjaWZpYyBidXNpbmVzcyBlbnRpdGllcywgaW4gY29tcGxpYW5jZSB3aXRoIEVuZ2luZSBS RVNUIEFQSSBlbnRpdHkgc3RydWN0dXJlLg0KDQpGb3IgYSBtb3JlIGV4dGVuc2l2ZSBleGFtcGxl IG9mIHVzaW5nICJhZGRNYWluVGFiQWN0aW9uQnV0dG9uIiBBUEksIHBsZWFzZSBzZWUgdGhlIGF0 dGFjaGVkICJhZGRNYWluVGFiQWN0aW9uQnV0dG9uLmh0bWwuZXhhbXBsZSIgZmlsZS4NCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCjIuIEltcHJvdmVkIHBsdWdpbiBBUEkgZnVu Y3Rpb246IGFkZE1haW5UYWINCg0KVGhlICJhZGRNYWluVGFiIiBBUEkgd2FzIGltcHJvdmVkIHRv IGFkZHJlc3MgZm9sbG93aW5nIGlzc3VlczoNCg0KICAqICAgImFkZE1haW5UYWIiIGNhbiBub3cg YmUgY2FsbGVkIGF0IGFueSBtb21lbnQgZHVyaW5nIFVJIHBsdWdpbiBydW50aW1lLCBnaXZlbiB0 aGF0IHRoZSBwbHVnaW4gaXMgYWxsb3dlZCBpbnZva2UgcGx1Z2luIEFQSSBmdW5jdGlvbnMgKHBs dWdpbiBpcyBlaXRoZXIgSU5JVElBTElaSU5HIG9yIElOX1VTRSkuDQpQcmV2aW91c2x5LCAiYWRk TWFpblRhYiIgd29ya2VkIHJlbGlhYmx5IG9ubHkgd2hlbiBjYWxsZWQgZnJvbSB3aXRoaW4gVWlJ bml0IGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uDQpDdXJyZW50bHksIGl0J3MgcG9zc2libGUgdG8g Y2FsbCAiYWRkTWFpblRhYiIgYXQgYW55IG1vbWVudCwgZS5nLiBmcm9tIHdpdGhpbiBzb21lIG90 aGVyIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gKGFmdGVyIFVpSW5pdCBoYXMgY29tcGxldGVkKS4N Cg0KICAqICAgImFkZE1haW5UYWIiIG5vdyByZXRhaW5zICJhY3RpdmUiIHRhYiAoaGlnaGxpZ2h0 ZWQgdGFiIEdVSSkuDQoiYWRkTWFpblRhYiIgd29ya3MgYnkgYWRkaW5nIG5ldyB0YWIgY29tcG9u ZW50IChHV1RQIHByZXNlbnRlciBwcm94eSkgYW5kIHJlZnJlc2hpbmcgbWFpbiB0YWIgcGFuZWwg R1VJIGJ5IHJlbW92aW5nIGFsbCByZWxhdGVkIHRhYnMgYW5kIHJlLWFkZGluZyB0aGVtIGFnYWlu Lg0KVGhpcyBsb2dpYyBpcyBoYW5kbGVkIGJ5IG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLnBy ZXNlbnRlci5EeW5hbWljVGFiQ29udGFpbmVyUHJlc2VudGVyIGNsYXNzLCB3aGljaCBtYWtlcyBz dXJlIHRoYXQgImFjdGl2ZSIgdGFiIGlzIHJldGFpbmVkIGV2ZW4gYWZ0ZXIgbWFpbiB0YWIgcGFu ZWwgd2FzIHJlZnJlc2hlZC4NCkZ1cnRoZXJtb3JlLCBjdXN0b20gbWFpbiB0YWIgaW1wbGVtZW50 YXRpb24gbm93IGRpc3BsYXlzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBVUkwgdGhyb3VnaCBI VE1MIGlmcmFtZSBlbGVtZW50Lg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0K My4gSW1wcm92ZWQgbmF0aXZlIEphdmFTY3JpcHQgZnVuY3Rpb24gaGFuZGxpbmcgKEdXVCBKU05J KQ0KDQpUaGlzIHBhdGNoIGludHJvZHVjZXMgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5w bHVnaW4uanNuaS5Kc0Z1bmN0aW9uIGFuZCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnBs dWdpbi5qc25pLkpzRnVuY3Rpb25SZXN1bHRIZWxwZXIgY2xhc3NlcyBwcm92aWRpbmcgSmF2YSBh YnN0cmFjdGlvbiBmb3IgaW52b2tpbmcgbmF0aXZlIEphdmFTY3JpcHQgZnVuY3Rpb25zLiBUaGVz ZSBjbGFzc2VzIGZvbGxvdyB0aGUgZ2VuZXJhbCBjb250cmFjdCBvZiAiaW50ZXJmYWNlIG9iamVj dCIgYXMgbWVudGlvbmVkIGFib3ZlLg0KDQpKc0Z1bmN0aW9uUmVzdWx0SGVscGVyIGlzIHBhcnRp Y3VsYXJseSB1c2VmdWwgd2hlbiBkZWFsaW5nIHdpdGggZnVuY3Rpb25zIHdoaWNoIGFyZSBleHBl Y3RlZCB0byByZXR1cm4gdmFsdWUgb2YgYSBjZXJ0YWluIHR5cGUuIFRvbyBiYWQgc3RhbmRhcmQg R1dUIEpTTkkgY2xhc3NlcyBkb24ndCBwcm92aWRlIHN1Y2ggYWJzdHJhY3Rpb24gZm9yIHdvcmtp bmcgd2l0aCBuYXRpdmUgZnVuY3Rpb25zIG91dC1vZi10aGUtYm94Li4uDQpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXw0KDQo0LiBBY3Rpb25QYW5lbCBhbmQgQWN0aW9uVGFibGUgdHlw ZSBoaWVyYXJjaHkgcmVmYWN0b3JpbmcgKHJlbGF0ZWQgdG8gImFkZE1haW5UYWJBY3Rpb25CdXR0 b24iIEFQSSkNCg0KUHJldmlvdXNseSwgQWJzdHJhY3RBY3Rpb25QYW5lbCBhbmQgQWJzdHJhY3RB Y3Rpb25UYWJsZSBjbGFzc2VzIGRpZG4ndCBpbXBsZW1lbnQgYW55IHJlYXNvbmFibGUgaW50ZXJm YWNlIHRoYXQgd291bGQgYWxsb3cgb3RoZXIgY29tcG9uZW50cyAoY2xpZW50LXNpZGUgVUkgcGx1 Z2luIGluZnJhc3RydWN0dXJlKSB0byBkZXBlbmQgb24gdGhlaXIgZnVuY3Rpb25hbGl0eSBpbiBh IGxvb3NlbHktY291cGxlZCBtYW5uZXIuIFRoaXMgd291bGQgbWFrZSBjb2RlIHRoYXQgaW1wbGVt ZW50cyAiYWRkTWFpblRhYkFjdGlvbkJ1dHRvbiIgQVBJICJ1Z2x5IjogbWFpbiB0YWIgdmlldyBp bnRlcmZhY2Ugd291bGQgaGF2ZSB0byByZWZlcmVuY2UgQWJzdHJhY3RBY3Rpb25UYWJsZSBjbGFz cyBkaXJlY3RseS4gSW4gTVZQIGRlc2lnbiBwYXR0ZXJuLCB2aWV3IGludGVyZmFjZSBzaG91bGQg YXZvaWQgcmVmZXJlbmNpbmcgc3BlY2lmaWMgR1dUIFdpZGdldCBjbGFzc2VzIGRpcmVjdGx5Lg0K DQpUaGlzIHBhdGNoIGludHJvZHVjZXMgbmV3IGludGVyZmFjZXMgZm9yIEFjdGlvblBhbmVsIGFu ZCBBY3Rpb25UYWJsZSBjb21wb25lbnRzIHdoaWxlIGVsaW1pbmF0aW5nIGNvZGUgcmVkdW5kYW5j eSAoZHVwbGljYXRlIG9yIHVubmVjZXNzYXJ5IGNvZGUpLg0KX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18NCg0KNS4gQWN0aW9uUGFuZWwgdHlwZSBoaWVyYXJjaHkgcmVmYWN0b3Jpbmcg KHJlbGF0ZWQgdG8gImFkZE1haW5UYWIiIEFQSSkNCg0KU2luY2Ugb3JnLm92aXJ0LmVuZ2luZS51 aS5jb21tb24ucHJlc2VudGVyLkR5bmFtaWNUYWJDb250YWluZXJQcmVzZW50ZXIgZGVmaW5lcyBu ZXcgRHluYW1pY1RhYlBhbmVsIGludGVyZmFjZSB0aGF0IGV4dGVuZHMgc3RhbmRhcmQgR1dUUCBU YWJQYW5lbCBpbnRlcmZhY2UsIHNvbWUgcmVmYWN0b3JpbmcgaGFkIHRvIGJlIGRvbmUgaW4gcmVs YXRlZCBBY3Rpb25QYW5lbCBjbGFzc2VzLg0KDQpUaGlzIHBhdGNoIG1ha2VzIHN1cmUgdGhhdCBi b3RoIG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLndpZGdldC50YWIuQWJzdHJhY3RUYWJQYW5l bCAod2lkZ2V0KSBhbmQgb3JnLm92aXJ0LmVuZ2luZS51aS5jb21tb24udmlldy5BYnN0cmFjdFRh YlBhbmVsVmlldyAodmlldykgc3VwcG9ydCBEeW5hbWljVGFiUGFuZWwgaW50ZXJmYWNlLg0KDQpO b3RlIHRoYXQgZm9yIG5vdywgb25seSBtYWluIHRhYiBwYW5lbCAob3JnLm92aXJ0LmVuZ2luZS51 aS53ZWJhZG1pbi5zZWN0aW9uLm1haW4ucHJlc2VudGVyLk1haW5UYWJQYW5lbFByZXNlbnRlcikg c3VwcG9ydHMgZHluYW1pYyB0YWJzIHdpdGhpbiBpdHMgdmlldy4NCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fDQoNCldoZXJlIGlzIGFkZFN1YlRhYiBBUEkgZnVuY3Rpb24/DQoNCklt cGxlbWVudGluZyAiYWRkU3ViVGFiIiBBUEkgcmVxdWlyZXMgc29tZSBtb3JlIGNoYW5nZXMsIGFu ZCBJIGRpZG4ndCB3YW50IHRvIGRlbGF5IHRoaXMgUG9DIHBhdGNoIGp1c3QgYmVjYXVzZSBvZiBp dC4uLg0KDQpIZXJlJ3MgYSBzYW1wbGUgY29kZSB0aGF0IGlsbHVzdHJhdGVzIHByb3Bvc2VkICJh ZGRTdWJUYWIiIEFQSSB1c2FnZToNCg0KVWlJbml0OiBmdW5jdGlvbigpIHsNCiAgICBhcGkuYWRk U3ViVGFiKCdIb3N0JywgICAgICAgIC8vIGVudGl0eVR5cGVOYW1lDQogICAgICAgICdDdXN0b20g SG9zdCBTdWIgVGFiJywgICAvLyBsYWJlbA0KICAgICAgICAnY3VzdG9tLWhvc3Qtc3ViLXRhYics ICAgLy8gaGlzdG9yeVRva2VuDQogICAgICAgICdodHRwOi8vd3d3Lm92aXJ0Lm9yZy8nLCAvLyBj b250ZW50VXJsDQoNCiAgICAgICAgLy8gU3ViIHRhYiBpbnRlcmZhY2Ugb2JqZWN0DQogICAgICAg IC8vIEFsbCBmdW5jdGlvbnMgcmVjZWl2ZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbShzKQ0KICAg ICAgICAvLyB3aXRoaW4gdGhlIG1haW4gdGFiIGRhdGEgZ3JpZCBhcyBmdW5jdGlvbiBhcmd1bWVu dHMNCiAgICAgICAgew0KDQogICAgICAgICAgICAvLyBSZXR1cm5pbmcgJ3RydWUnIG1lYW5zIHRo ZSBzdWIgdGFiIGlzIHZpc2libGUNCiAgICAgICAgICAgIC8vIFJldHVybmluZyAnZmFsc2UnIG1l YW5zIHRoZSBzdWIgdGFiIGlzIGhpZGRlbg0KICAgICAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZSA9 ICd0cnVlJw0KICAgICAgICAgICAgaXNBY2Nlc3NpYmxlOiBmdW5jdGlvbigpIHsNCiAgICAgICAg ICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PSAxICYmIGFyZ3VtZW50c1swXS5lbnRp dHlJZCA9PSAnPE15SG9zdEVudGl0eUlkPic7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfQ0K DQogICAgKTsNCn0NCg0KQXMgcGFydCBvZiAiYWRkU3ViVGFiIiBBUEkgaW1wbGVtZW50YXRpb24s IEknbGwgcmVmYWN0b3IgY3VzdG9tIG1haW4gdGFiIGNvbXBvbmVudHMsIGluIG9yZGVyIHRvIHVz ZSBvbmUgInRhYiB0eXBlIiBmb3IgYm90aCBtYWluIGFuZCBzdWIgdGFicy4NCg0KQ3VycmVudGx5 LCB3ZSBoYXZlIG9uZSAoYW5kIG9ubHkgb25lKSAidGFiIHR5cGUiIC0gYSB0YWIgdGhhdCBzaG93 cyBjb250ZW50IG9mIHRoZSBnaXZlbiBVUkwgdGhyb3VnaCBIVE1MIGlmcmFtZSBlbGVtZW50Lg0K DQpXZSBjb3VsZCBhbHNvIGNyZWF0ZSBuZXcgInRhYiB0eXBlcyIsIGUuZy4gZm9ybS1iYXNlZCB0 YWIgdGhhdCBzaG93cyBrZXkvdmFsdWUgcGFpcnMgKElNSE8gdGhpcyBjb3VsZCBiZSBxdWl0ZSB1 c2VmdWwgZm9yIGN1c3RvbSBzdWIgdGFicykuDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXw0KDQpMZXQgbWUga25vdyB3aGF0IHlvdSB0aGluayENCg0KQ2hlZXJzLA0KVm9qdGVjaA0K --_000_D290AD8432118048947689BA3AE8A9B3E9F8E0SACEXCMBX04PRDhqn_ Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv VFIvUkVDLWh0bWw0MCI+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIg Y29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxtZXRhIG5hbWU9IkdlbmVyYXRv ciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTQgKGZpbHRlcmVkIG1lZGl1bSkiPg0KPCEtLVtp ZiAhbXNvXT48c3R5bGU+dlw6KiB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fQ0Kb1w6KiB7 YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fQ0Kd1w6KiB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0 I1ZNTCk7fQ0KLnNoYXBlIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9DQo8L3N0eWxlPjwh W2VuZGlmXS0tPjxzdHlsZT48IS0tDQovKiBGb250IERlZmluaXRpb25zICovDQpAZm9udC1mYWNl DQoJe2ZvbnQtZmFtaWx5OldpbmdkaW5nczsNCglwYW5vc2UtMTo1IDAgMCAwIDAgMCAwIDAgMCAw O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6V2luZ2RpbmdzOw0KCXBhbm9zZS0xOjUgMCAw IDAgMCAwIDAgMCAwIDA7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseTpDYWxpYnJpOw0KCXBh bm9zZS0xOjIgMTUgNSAyIDIgMiA0IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6 VGFob21hOw0KCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0O30NCi8qIFN0eWxlIERlZmlu aXRpb25zICovDQpwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsDQoJe21h cmdpbjowaW47DQoJbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0KCWZvbnQtc2l6ZToxMi4wcHQ7DQoJ Zm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9DQphOmxpbmssIHNwYW4uTXNv SHlwZXJsaW5rDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xvcjpibHVlOw0KCXRleHQt ZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KYTp2aXNpdGVkLCBzcGFuLk1zb0h5cGVybGlua0ZvbGxv d2VkDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xvcjpwdXJwbGU7DQoJdGV4dC1kZWNv cmF0aW9uOnVuZGVybGluZTt9DQpwDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgltYXJnaW46 MGluOw0KCW1hcmdpbi1ib3R0b206LjAwMDFwdDsNCglmb250LXNpemU6MTIuMHB0Ow0KCWZvbnQt ZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQ0Kc3Bhbi5FbWFpbFN0eWxlMjANCgl7 bXNvLXN0eWxlLXR5cGU6cGVyc29uYWwtcmVwbHk7DQoJZm9udC1mYW1pbHk6IkNhbGlicmkiLCJz YW5zLXNlcmlmIjsNCgljb2xvcjojMUY0OTdEO30NCi5Nc29DaHBEZWZhdWx0DQoJe21zby1zdHls ZS10eXBlOmV4cG9ydC1vbmx5Ow0KCWZvbnQtc2l6ZToxMC4wcHQ7fQ0KQHBhZ2UgV29yZFNlY3Rp b24xDQoJe3NpemU6OC41aW4gMTEuMGluOw0KCW1hcmdpbjoxLjBpbiAxLjBpbiAxLjBpbiAxLjBp bjt9DQpkaXYuV29yZFNlY3Rpb24xDQoJe3BhZ2U6V29yZFNlY3Rpb24xO30NCi8qIExpc3QgRGVm aW5pdGlvbnMgKi8NCkBsaXN0IGwwDQoJe21zby1saXN0LWlkOjY1NTY1MjU2NTsNCgltc28tbGlz dC10ZW1wbGF0ZS1pZHM6MzMzMDU2MDc2O30NCkBsaXN0IGwwOmxldmVsMQ0KCXttc28tbGV2ZWwt bnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674K3Ow0KCW1zby1sZXZlbC10 YWItc3RvcDouNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWlu ZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpT eW1ib2w7fQ0KQGxpc3QgbDA6bGV2ZWwyDQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxl dDsNCgltc28tbGV2ZWwtdGV4dDpvOw0KCW1zby1sZXZlbC10YWItc3RvcDoxLjBpbjsNCgltc28t bGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1h bnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsNCgltc28t YmlkaS1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9DQpAbGlzdCBsMDpsZXZlbDMNCgl7 bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCglt c28tbGV2ZWwtdGFiLXN0b3A6MS41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0 Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZv bnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMDpsZXZlbDQNCgl7bXNvLWxldmVsLW51bWJl ci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0 b3A6Mi4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50 Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5Oldpbmdk aW5nczt9DQpAbGlzdCBsMDpsZXZlbDUNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0 Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47DQoJbXNv LWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28t YW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBs MDpsZXZlbDYNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10 ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6My4waW47DQoJbXNvLWxldmVsLW51bWJlci1w b3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6 MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMDpsZXZlbDcNCgl7bXNv LWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28t bGV2ZWwtdGFiLXN0b3A6My41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0K CXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQt ZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMDpsZXZlbDgNCgl7bXNvLWxldmVsLW51bWJlci1m b3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6 NC4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0u MjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5n czt9DQpAbGlzdCBsMDpsZXZlbDkNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0K CW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6NC41aW47DQoJbXNvLWxl dmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5z aS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMQ0K CXttc28tbGlzdC1pZDoxMjc5NjgyNzQ0Ow0KCW1zby1saXN0LXRlbXBsYXRlLWlkczoxODE3ODU0 OTcwO30NCkBsaXN0IGwxOmxldmVsMQ0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7 DQoJbXNvLWxldmVsLXRleHQ674K3Ow0KCW1zby1sZXZlbC10YWItc3RvcDouNWluOw0KCW1zby1s ZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFu c2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpTeW1ib2w7fQ0KQGxpc3QgbDE6bGV2 ZWwyDQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDpv Ow0KCW1zby1sZXZlbC10YWItc3RvcDoxLjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9u OmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7 DQoJZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsNCgltc28tYmlkaS1mb250LWZhbWlseToiVGlt ZXMgTmV3IFJvbWFuIjt9DQpAbGlzdCBsMTpsZXZlbDMNCgl7bXNvLWxldmVsLW51bWJlci1mb3Jt YXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6MS41 aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVp bjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9 DQpAbGlzdCBsMTpsZXZlbDQNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1z by1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47DQoJbXNvLWxldmVs LW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1m b250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMTpsZXZl bDUNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+C pzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlv bjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0 Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMTpsZXZlbDYNCgl7bXNvLWxldmVs LW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwt dGFiLXN0b3A6My4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQt aW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5 OldpbmdkaW5nczt9DQpAbGlzdCBsMTpsZXZlbDcNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6 YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6My41aW47 DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsN Cgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpA bGlzdCBsMTpsZXZlbDgNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1s ZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47DQoJbXNvLWxldmVsLW51 bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250 LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMTpsZXZlbDkN Cgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsN Cgltc28tbGV2ZWwtdGFiLXN0b3A6NC41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjps ZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0K CWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMg0KCXttc28tbGlzdC1pZDoxMzQ2MjA1 NTE5Ow0KCW1zby1saXN0LXRlbXBsYXRlLWlkczotNjY0MDAxNjQyO30NCkBsaXN0IGwyOmxldmVs MQ0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674K3 Ow0KCW1zby1sZXZlbC10YWItc3RvcDouNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246 bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsN Cglmb250LWZhbWlseTpTeW1ib2w7fQ0KQGxpc3QgbDI6bGV2ZWwyDQoJe21zby1sZXZlbC1udW1i ZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDpvOw0KCW1zby1sZXZlbC10YWItc3Rv cDoxLjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6 LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6IkNvdXJp ZXIgTmV3IjsNCgltc28tYmlkaS1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9DQpAbGlz dCBsMjpsZXZlbDMNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZl bC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6MS41aW47DQoJbXNvLWxldmVsLW51bWJl ci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNp emU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMjpsZXZlbDQNCgl7 bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCglt c28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0 Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZv bnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMjpsZXZlbDUNCgl7bXNvLWxldmVsLW51bWJl ci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0 b3A6Mi41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50 Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5Oldpbmdk aW5nczt9DQpAbGlzdCBsMjpsZXZlbDYNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0 Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6My4waW47DQoJbXNv LWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28t YW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBs MjpsZXZlbDcNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10 ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6My41aW47DQoJbXNvLWxldmVsLW51bWJlci1w b3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6 MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMjpsZXZlbDgNCgl7bXNv LWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28t bGV2ZWwtdGFiLXN0b3A6NC4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0K CXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQt ZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMjpsZXZlbDkNCgl7bXNvLWxldmVsLW51bWJlci1m b3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6 NC41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0u MjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5n czt9DQpAbGlzdCBsMw0KCXttc28tbGlzdC1pZDoxNzc2NzEwNjgyOw0KCW1zby1saXN0LXRlbXBs YXRlLWlkczotMTI3NDc3MTY1Mjt9DQpAbGlzdCBsMzpsZXZlbDENCgl7bXNvLWxldmVsLW51bWJl ci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CtzsNCgltc28tbGV2ZWwtdGFiLXN0 b3A6LjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6 LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6U3ltYm9s O30NCkBsaXN0IGwzOmxldmVsMg0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJ bXNvLWxldmVsLXRleHQ6bzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47DQoJbXNvLWxldmVs LW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1m b250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7DQoJbXNvLWJpZGkt Zm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQ0KQGxpc3QgbDM6bGV2ZWwzDQoJe21zby1s ZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxl dmVsLXRhYi1zdG9wOjEuNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0 ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZh bWlseTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDM6bGV2ZWw0DQoJe21zby1sZXZlbC1udW1iZXItZm9y bWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjIu MGluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1 aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7 fQ0KQGxpc3QgbDM6bGV2ZWw1DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCglt c28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOw0KCW1zby1sZXZl bC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2kt Zm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDM6bGV2 ZWw2DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrv gqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjMuMGluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRp b246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBw dDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDM6bGV2ZWw3DQoJe21zby1sZXZl bC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVs LXRhYi1zdG9wOjMuNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0 LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWls eTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDM6bGV2ZWw4DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0 OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjQuMGlu Ow0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47 DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0K QGxpc3QgbDM6bGV2ZWw5DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28t bGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjQuNWluOw0KCW1zby1sZXZlbC1u dW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9u dC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0Kb2wNCgl7bWFyZ2luLWJv dHRvbTowaW47fQ0KdWwNCgl7bWFyZ2luLWJvdHRvbTowaW47fQ0KLS0+PC9zdHlsZT48IS0tW2lm IGd0ZSBtc28gOV0+PHhtbD4NCjxvOnNoYXBlZGVmYXVsdHMgdjpleHQ9ImVkaXQiIHNwaWRtYXg9 IjEwMjYiIC8+DQo8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4NCjxv OnNoYXBlbGF5b3V0IHY6ZXh0PSJlZGl0Ij4NCjxvOmlkbWFwIHY6ZXh0PSJlZGl0IiBkYXRhPSIx IiAvPg0KPC9vOnNoYXBlbGF5b3V0PjwveG1sPjwhW2VuZGlmXS0tPg0KPC9oZWFkPg0KPGJvZHkg bGFuZz0iRU4tVVMiIGxpbms9ImJsdWUiIHZsaW5rPSJwdXJwbGUiPg0KPGRpdiBjbGFzcz0iV29y ZFNlY3Rpb24xIj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6 MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZx dW90Oztjb2xvcjojMUY0OTdEIj5OaWNlIHdvcmsgVm9qdGVjaCEgSeKAmW0gc3RpbGwgaW4gdGhl IHByb2Nlc3Mgb2YgcHVsbGluZyBkb3duIHRoZSBjb2RlIGJ1dCBsb29rIGZvcndhcmQgdG8gdHJ5 aW5nIGl0IG91dC4gQmFzZWQgb24gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgaW1wbGVtZW50YXRp b25zLCBpdA0KIGxvb2tzIGxpa2UgaXQgd2lsbCBnaXZlIHVzIHdoYXQgd2UgbmVlZC4gSeKAmWxs IGxldCB5b3Uga25vdyBmdXJ0aGVyIG9uY2UgSSBnZXQgaXQgZ29pbmcuPG86cD48L286cD48L3Nw YW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4w cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7 O2NvbG9yOiMxRjQ5N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXY+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWls eTomcXVvdDtDYWxpYnJpJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3 RCI+LUNocmlzPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxp YnJpJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+PG86cD4mbmJz cDs8L286cD48L3NwYW4+PC9wPg0KPGRpdj4NCjxkaXYgc3R5bGU9ImJvcmRlcjpub25lO2JvcmRl ci10b3A6c29saWQgI0I1QzRERiAxLjBwdDtwYWRkaW5nOjMuMHB0IDBpbiAwaW4gMGluIj4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTAuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O1RhaG9tYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7Ij5Gcm9tOjwv c3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7 VGFob21hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDsiPiBlbmdpbmUtZGV2ZWwtYm91bmNl c0BvdmlydC5vcmcgW21haWx0bzplbmdpbmUtZGV2ZWwtYm91bmNlc0BvdmlydC5vcmddDQo8Yj5P biBCZWhhbGYgT2YgPC9iPlZvanRlY2ggU3pvY3M8YnI+DQo8Yj5TZW50OjwvYj4gVGh1cnNkYXks IE9jdG9iZXIgMTgsIDIwMTIgMTA6NDkgQU08YnI+DQo8Yj5Ubzo8L2I+IGVuZ2luZS1kZXZlbDxi cj4NCjxiPlN1YmplY3Q6PC9iPiBbRW5naW5lLWRldmVsXSBVSSBQbHVnaW5zOiBQb0MgcGF0Y2gg cmV2aXNpb24gNiBub3cgYXZhaWxhYmxlPG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8 L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPGRpdj4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEyLjBwdCI+PHNwYW4g c3R5bGU9ImNvbG9yOmJsYWNrIj5IaSBndXlzLDxicj4NCjxicj4NCnRoZSBsYXRlc3QgcmV2aXNp b24gb2YgVUkgUGx1Z2lucyBwcm9vZi1vZi1jb25jZXB0IHBhdGNoIGlzIG5vdyBhdmFpbGFibGUg Zm9yIHlvdSB0byBleHBlcmltZW50IHdpdGguIFlvdSBjYW4gZG93bmxvYWQgdGhlIHBhdGNoIGZy b20gb1ZpcnQgR2Vycml0IGF0DQo8YSBocmVmPSJodHRwOi8vZ2Vycml0Lm92aXJ0Lm9yZy8jL2Mv ODEyMC8yIj5odHRwOi8vZ2Vycml0Lm92aXJ0Lm9yZy8jL2MvODEyMC8yPC9hPiAocGF0Y2ggc2V0 IDIpLjxicj4NCjxicj4NClBsZWFzZSByZWFkIG9uIHRvIGxlYXJuIHdoYXQncyBuZXcgaW4gdGhp cyByZXZpc2lvbi4gSWYgeW91IGhhdmUgYW55IGNvbW1lbnRzLCBxdWVzdGlvbnMgb3IgaWRlYXMs IHBsZWFzZSBsZXQgbWUga25vdyE8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2IGNsYXNzPSJN c29Ob3JtYWwiIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+PHNwYW4g c3R5bGU9ImNvbG9yOmJsYWNrIj4NCjxociBzaXplPSIyIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNl bnRlciI+DQo8L3NwYW4+PC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0i Y29sb3I6YmxhY2siPjxicj4NCjxzdHJvbmc+MC4gVUkgcGx1Z2luIHBhdGggaW5mb3JtYXRpb24g cmVzb2x2ZWQgdXNpbmcgbG9jYWwgRW5naW5lIGNvbmZpZ3VyYXRpb248L3N0cm9uZz48Yj48YnI+ DQo8L2I+PGJyPg0KU2VydmVyLXNpZGUgVUkgcGx1Z2luIGluZnJhc3RydWN0dXJlIG5vdyB1c2Vz IGxvY2FsIChtYWNoaW5lLXNwZWNpZmljKSBFbmdpbmUgY29uZmlndXJhdGlvbiBpbnN0ZWFkIG9m IGdsb2JhbCAoPGVtPnZkY19vcHRpb25zPC9lbT4gZGF0YWJhc2UgdGFibGUpIEVuZ2luZSBjb25m aWd1cmF0aW9uOjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjx1bCB0eXBlPSJkaXNjIj4NCjxsaSBj bGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6YmxhY2s7bXNvLW1hcmdpbi10b3AtYWx0OmF1 dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87bXNvLWxpc3Q6bDMgbGV2ZWwxIGxmbzEiPg0K UHJldmlvdXNseSwgcGF0aCBpbmZvcm1hdGlvbiB3YXMgcmVzb2x2ZWQgdGhyb3VnaCBvcmcub3Zp cnQuZW5naW5lLmNvcmUuY29tbW9uLmNvbmZpZy5Db25maWcgY2xhc3MgLSBFbmdpbmUgY29uZmln dXJhdGlvbiB2YWx1ZXMgd2VyZSByZXRyaWV2ZWQgZnJvbQ0KPGk+dmRjX29wdGlvbnM8L2k+IGRh dGFiYXNlIHRhYmxlLjxvOnA+PC9vOnA+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 ImNvbG9yOmJsYWNrO21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFs dDphdXRvO21zby1saXN0OmwzIGxldmVsMSBsZm8xIj4NCkN1cnJlbnRseSwgcGF0aCBpbmZvcm1h dGlvbiBpcyByZXNvbHZlZCB0aHJvdWdoIG9yZy5vdmlydC5lbmdpbmUuY29yZS51dGlscy5Mb2Nh bENvbmZpZyBjbGFzcyAtIEVuZ2luZSBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmUgcmV0cmlldmVk IGZyb20gbG9jYWwgZmlsZSBzeXN0ZW0uPG86cD48L286cD48L2xpPjwvdWw+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMi4wcHQiPjxzcGFuIHN0eWxlPSJjb2xv cjpibGFjayI+SW4gY2FzZSB5b3UncmUgbm90IHdvcmtpbmcgd2l0aCBvVmlydCBFbmdpbmUgdGhy b3VnaCBSUE0gcGFja2FnZSBzeXN0ZW0sIGUuZy4geW91IGhhdmUgYSBsb2NhbCBkZXZlbG9wbWVu dCBlbnZpcm9ubWVudCBzZXQgdXAgYW5kIHlvdSBidWlsZCBhbmQgZGVwbG95IG9WaXJ0IEVuZ2lu ZSB0aHJvdWdoIE1hdmVuLCBwbGVhc2UNCiBmb2xsb3cgdGhlc2Ugc3RlcHM6PGJyPg0KPGJyPg0K YS4gQ29weSBkZWZhdWx0IEVuZ2luZSBjb25maWd1cmF0aW9uIGludG8gL3Vzci9zaGFyZS88Yj5v dmlydC1lbmdpbmU8L2I+L2NvbmY8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2IHN0eWxlPSJt YXJnaW4tbGVmdDozMC4wcHQiPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZv bnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4jIG1rZGlyIC1w IC91c3Ivc2hhcmUvb3ZpcnQtZW5naW5lL2NvbmY8YnI+DQojIGNwICZsdDtPVklSVF9IT01FJmd0 Oy9iYWNrZW5kL21hbmFnZXIvY29uZi9lbmdpbmUuY29uZi5kZWZhdWx0cyAvdXNyL3NoYXJlL292 aXJ0LWVuZ2luZS9jb25mL2VuZ2luZS5jb25mLmRlZmF1bHRzPG86cD48L286cD48L3NwYW4+PC9w Pg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMi4w cHQiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KYi4gSWYgbmVjZXNzYXJ5LCBjb3B5 IFVJIHBsdWdpbiBkYXRhIGZpbGVzIGZyb20gL3Vzci9zaGFyZS9lbmdpbmUvdWktcGx1Z2lucyB0 byAvdXNyL3NoYXJlLzxiPm92aXJ0LWVuZ2luZTwvYj4vdWktcGx1Z2luczxicj4NCjxicj4NCmMu IElmIG5lY2Vzc2FyeSwgY29weSBVSSBwbHVnaW4gY29uZmlnIGZpbGVzIGZyb20gL2V0Yy9lbmdp bmUvdWktcGx1Z2lucyB0byAvZXRjLzxiPm92aXJ0LWVuZ2luZTwvYj4vdWktcGx1Z2luczxicj4N Cjxicj4NCmQsIEluIGNhc2UgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRW5naW5l IGNvbmZpZ3VyYXRpb24sIHB1dCB5b3VyIGN1c3RvbSBwcm9wZXJ0eSBmaWxlIGludG8gL2V0Yy9z eXNjb25maWcvb3ZpcnQtZW5naW5lPGJyPg0KPGJyPg0KVGhlIHJlYXNvbiBiZWhpbmQgdGhpcyBj aGFuZ2UgaXMgdGhhdCBwYXRoIGluZm9ybWF0aW9uIGZvciBVSSBwbHVnaW4gZGF0YSBhbmQgY29u ZmlndXJhdGlvbiBpcyB0eXBpY2FsbHkgbWFjaGluZS1zcGVjaWZpYywgYW5kIHNob3VsZCBiZSBj dXN0b21pemFibGUgcGVyIG1hY2hpbmUgdGhyb3VnaCBFbmdpbmUgbG9jYWwgY29uZmlndXJhdGlv bi48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2IGNsYXNzPSJNc29Ob3JtYWwiIGFsaWduPSJj ZW50ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNr Ij4NCjxociBzaXplPSIyIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+DQo8L3NwYW4+PC9k aXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4N CjxiPjEuIE5ldyBwbHVnaW4gQVBJIGZ1bmN0aW9uOiBhZGRNYWluVGFiQWN0aW9uQnV0dG9uPGJy Pg0KPC9iPjxicj4NClRoZSAmcXVvdDthZGRNYWluVGFiQWN0aW9uQnV0dG9uJnF1b3Q7IEFQSSBh ZGRzIGN1c3RvbSBjb250ZXh0LXNlbnNpdGl2ZSBidXR0b24gdG8gdGhlIGdpdmVuIG1haW4gdGFi J3MgZGF0YSBncmlkLCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcgZGF0YSBncmlkIGNvbnRleHQg bWVudSBpdGVtLjxicj4NCjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1 b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPmFkZE1haW5UYWJBY3Rpb25CdXR0b24o ZW50aXR5VHlwZU5hbWUsIGxhYmVsLCBhY3Rpb25CdXR0b25JbnRlcmZhY2UpPGJyPg0KPC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPGk+ZW50aXR5VHlwZU5hbWU8L2k+IGlu ZGljYXRlcyB3aGljaCBtYWluIHRhYidzIGRhdGEgZ3JpZCB0aGUgYnV0dG9uIHNob3VsZCBiZSBh ZGRlZCB0bywgYWNjb3JkaW5nIHRvIHRoZSBlbnRpdHkgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhl IG1haW4gdGFiLjxpPiBlbnRpdHlUeXBlTmFtZTwvaT4gdmFsdWVzIGFyZSBzdHJpbmdzIHJlZmxl Y3Rpbmcgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW4uZW50aXR5RW50aXR5VHlw ZSBlbnVtDQogbWVtYmVycy4gRm9sbG93aW5nIDxpPmVudGl0eVR5cGVOYW1lPC9pPiB2YWx1ZXMg YXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgKHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUpOiAmcXVv dDtEYXRhQ2VudGVyJnF1b3Q7LCAmcXVvdDtDbHVzdGVyJnF1b3Q7LCAmcXVvdDtIb3N0JnF1b3Q7 LCAmcXVvdDtTdG9yYWdlJnF1b3Q7LCAmcXVvdDtEaXNrJnF1b3Q7LCAmcXVvdDtWaXJ0dWFsTWFj aGluZSZxdW90OywgJnF1b3Q7VGVtcGxhdGUmcXVvdDsuPGJyPg0KPGJyPg0KTm90ZTogJnF1b3Q7 UG9vbCZxdW90OyB2YWx1ZSBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCwgYmVjYXVzZSBvZiBv cmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmJ1c2luZXNzZW50aXRpZXMudm1fcG9vbHMgZW50 aXR5IG5vdCBpbXBsZW1lbnRpbmcgdGhlIEJ1c2luZXNzRW50aXR5IGludGVyZmFjZSwgbm90IHN1 cmUgd2h5IHRob3VnaC4gTWF5YmUgd2Ugc2hvdWxkIHN3aXRjaCBmcm9tIEJ1c2luZXNzRW50aXR5 IHRvIElWZGNRdWVyeWFibGUgaW50ZXJmYWNlDQogYW5kIGFsd2F5cyBjYXN0IGdldFF1ZXJ5YWJs ZUlkIG1ldGhvZCByZXN1bHQgdmFsdWUgdG8gR3VpZD88YnI+DQo8YnI+DQo8aT5sYWJlbDwvaT4g aXMgdGhlIHRpdGxlIGRpc3BsYXllZCBvbiB0aGUgYnV0dG9uPGk+Ljxicj4NCjwvaT48YnI+DQo8 aT5hY3Rpb25CdXR0b25JbnRlcmZhY2U8L2k+IHJlcHJlc2VudHMgYW4gb2JqZWN0IHRoYXQgJnF1 b3Q7aW1wbGVtZW50cyB0aGUgYnV0dG9uIGludGVyZmFjZSZxdW90OyBieSBkZWNsYXJpbmcgaXRz IGZ1bmN0aW9uczoNCjxpPm9uQ2xpY2s8L2k+LCA8aT5pc0VuYWJsZWQ8L2k+LCA8aT5pc0FjY2Vz c2libGU8L2k+LiBBbGwgZnVuY3Rpb25zIG9mIDxpPmFjdGlvbkJ1dHRvbkludGVyZmFjZTwvaT4g cmVjZWl2ZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbShzKSBhcyBmdW5jdGlvbiBhcmd1bWVudHMu PGJyPg0KPGJyPg0KTGV0J3MgdGFrZSBhIGNsb3NlciBsb29rIGF0IHRoZSBjb25jZXB0IGJlaGlu ZCA8aT5hY3Rpb25CdXR0b25JbnRlcmZhY2U8L2k+LiBJbiB0cmFkaXRpb25hbCBjbGFzcy1iYXNl ZCBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2VzLCBzdWNoIGFzIEphdmEsIGludGVyZmFjZSBpcyBh biBhYnN0cmFjdCB0eXBlIHRoYXQgY29udGFpbnMgbWV0aG9kIGRlY2xhcmF0aW9ucyB3aXRob3V0 IGFuIGltcGxlbWVudGF0aW9uLiBBIGNsYXNzIHRoYXQgaW1wbGVtZW50cw0KIHRoZSBnaXZlbiBp bnRlcmZhY2UgbXVzdCBpbXBsZW1lbnQgYWxsIG1ldGhvZHMgZGVjbGFyZWQgYnkgdGhhdCBpbnRl cmZhY2UgKHVubGVzcyBpdCdzIGFuIGFic3RyYWN0IGNsYXNzLCBidXQgdGhpcyBpc24ndCByZWxl dmFudCBpbiBvdXIgY2FzZSkuPGJyPg0KPGJyPg0KSW4gY29udHJhc3Qgd2l0aCB0cmFkaXRpb25h bCBjbGFzcy1iYXNlZCBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2VzLCBKYXZhU2NyaXB0IHN1cHBv cnRzIE9PUCB0aHJvdWdoIHByb3RvdHlwZS1iYXNlZCBwcm9ncmFtbWluZyBtb2RlbCAoPGEgaHJl Zj0iaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KYXZhU2NyaXB0L0lu dHJvZHVjdGlvbl90b19PYmplY3QtT3JpZW50ZWRfSmF2YVNjcmlwdCI+aHR0cHM6Ly9kZXZlbG9w ZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KYXZhU2NyaXB0L0ludHJvZHVjdGlvbl90b19PYmpl Y3QtT3JpZW50ZWRfSmF2YVNjcmlwdDwvYT4pLg0KIEF0IHRoZSBzYW1lIHRpbWUsIEphdmFTY3Jp cHQgbGFuZ3VhZ2UgaXMgZHluYW1pY2FsbHktdHlwZWQgYW5kIHRoZXJlZm9yZSBkb2Vzbid0IHN1 cHBvcnQgdHJhZGl0aW9uYWwgY29uY2VwdCBvZiBpbnRlcmZhY2UgaW4gT09QLCBpdCB1c2VzICZx dW90O2R1Y2sgdHlwaW5nJnF1b3Q7IHRlY2huaXF1ZSBpbnN0ZWFkICg8YSBocmVmPSJodHRwOi8v ZW4ud2lraXBlZGlhLm9yZy93aWtpL0R1Y2tfdHlwaW5nIj5odHRwOi8vZW4ud2lraXBlZGlhLm9y Zy93aWtpL0R1Y2tfdHlwaW5nPC9hPikuPGJyPg0KPGJyPg0KVGhlIHNpbXBsZXN0IHdheSB0byBw cm92aWRlIGFuIG9iamVjdCB0aGF0ICZxdW90O2ltcGxlbWVudHMgdGhlIGdpdmVuIGludGVyZmFj ZSZxdW90OyBpbiBKYXZhU2NyaXB0IGlzIHRvIHVzZSAmcXVvdDtkdWNrIHR5cGluZyZxdW90OyB0 ZWNobmlxdWU6IHByb3ZpZGluZyBhbiBvYmplY3QgdGhhdCBjb250YWlucyB3ZWxsLWtub3duIGZ1 bmN0aW9ucy4gSW4gVUkgcGx1Z2luIGluZnJhc3RydWN0dXJlLCBJIGNhbGwgdGhpcyBjb25jZXB0 ICZxdW90O2ludGVyZmFjZSBvYmplY3QmcXVvdDssIHJlcHJlc2VudGVkDQogYnkgb3JnLm92aXJ0 LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW4uanNuaS5Kc0ludGVyZmFjZU9iamVjdCBjbGFzcy4g VW5saWtlIHRoZSB0cmFkaXRpb25hbCBjb25jZXB0IG9mIGludGVyZmFjZSBhYnN0cmFjdCB0eXBl IGluIG9iamVjdC1vcmllbnRlZCBsYW5ndWFnZXMsIGFuICZxdW90O2ludGVyZmFjZSBvYmplY3Qm cXVvdDsNCjx1PmRvZXMgbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gZGVjbGFyZSBhbGwgZnVuY3Rp b25zIG9mIHRoZSBnaXZlbiBpbnRlcmZhY2U8L3U+IGluIG9yZGVyIHRvICZxdW90O2ltcGxlbWVu dCZxdW90OyBzdWNoIGludGVyZmFjZS4gSW4gZmFjdCwgYW4gZW1wdHkgb2JqZWN0IGNhbiBiZSB1 c2VkIGFzIGEgdmFsaWQgJnF1b3Q7aW50ZXJmYWNlIG9iamVjdCZxdW90Oy4gTWlzc2luZyBmdW5j dGlvbnMgd2lsbCBiZSBzaW1wbHkgdHJlYXRlZCBhcyBlbXB0eSAobm8tb3ApIGZ1bmN0aW9ucy4N CiBGdXJ0aGVybW9yZSwgYW4gJnF1b3Q7aW50ZXJmYWNlIG9iamVjdCZxdW90OyBjYW4gJnF1b3Q7 aW1wbGVtZW50JnF1b3Q7IG11bHRpcGxlIGludGVyZmFjZXMgYnkgZGVjbGFyaW5nIGZ1bmN0aW9u cyBvZiB0aG9zZSBpbnRlcmZhY2VzIChpbnRlcmZhY2UgY29tcG9zaXRpb24pLjxicj4NCjxicj4N CkdldHRpbmcgYmFjayB0byAmcXVvdDthZGRNYWluVGFiQWN0aW9uQnV0dG9uJnF1b3Q7IEFQSSwg aGVyZSdzIGEgc2FtcGxlIGNvZGUgdGhhdCBhZGRzIG5ldyBidXR0b24gdG8gJnF1b3Q7SG9zdCZx dW90OyBtYWluIHRhYiBkYXRhIGdyaWQsIGFzIHBhcnQgb2YgVWlJbml0IGV2ZW50IGhhbmRsZXIg ZnVuY3Rpb246PGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVv dDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+VWlJbml0OiA8L3NwYW4+PGI+PHNwYW4g c3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiM5OTAwMDAi PmZ1bmN0aW9uPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmll ciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPigpIHs8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsgYXBp Ljwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7 Y29sb3I6I0NDMzNDQyI+YWRkTWFpblRhYkFjdGlvbkJ1dHRvbjwvc3Bhbj48c3BhbiBzdHlsZT0i Zm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPignSG9zdCcs ICdTaW5nbGUtSG9zdCBBY3Rpb24nLDxicj4NCjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9u dC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIEFjdGlvbiBidXR0b24gaW50ZXJm YWNlIG9iamVjdDxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyAvLyBBbGwgZnVuY3Rpb25zIHJlY2VpdmUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0ocykgYXMg ZnVuY3Rpb24gYXJndW1lbnRzPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTom cXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48 YnI+DQo8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIg TmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPiZuYnNwOyAmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0 aGUgYnV0dG9uPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMDA2NjAwIj48YnI+DQo8L3NwYW4+ PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJs YWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsg PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztj b2xvcjojMDAwMDk5Ij5vbkNsaWNrPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVv dDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+Og0KPC9zcGFuPjxiPjxzcGFuIHN0eWxl PSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojOTkwMDAwIj5mdW5j dGlvbjwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3 JnF1b3Q7O2NvbG9yOmJsYWNrIj4oKSB7PGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZh bWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4mbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAm bmJzcDsgLy8gQ2FsbGluZyAnYXJndW1lbnRzWzBdJyBpcyBzYWZlLCBiZWNhdXNlIG9uQ2xpY2so KSBjYW4gYmUgY2FsbGVkPGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgLy8gb25seSB3aGVu IGV4YWN0bHkgb25lIGl0ZW0gaXMgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSBkYXRhIGdyaWQ8 YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1 b3Q7O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB3aW5kb3cuYWxlcnQoJ1Nl bGVjdGVkIGhvc3QgZW50aXR5IElEID0gJyAmIzQzOyBhcmd1bWVudHNbMF0uZW50aXR5SWQpOzxi cj4NCiZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyB9 LDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxicj4NCjwvc3Bhbj48c3Bh biBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYw MCI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8v IFJldHVybmluZyAndHJ1ZScgbWVhbnMgdGhlIGJ1dHRvbiBpcyBlbmFibGVkIChjbGlja2FibGUp PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMDA2NjAwIj48YnI+DQo8L3NwYW4+PHNwYW4gc3R5 bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPiZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAvLyBSZXR1 cm5pbmcgJ2ZhbHNlJyBtZWFucyB0aGUgYnV0dG9uIGlzIGRpc2FibGVkIChub24tY2xpY2thYmxl KTxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyAvLyBEZWZhdWx0IHZhbHVlID0gJ3RydWUnPGJyPg0KPC9zcGFuPjxz cGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFj ayI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7IDwv c3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29s b3I6IzAwMDA5OSI+aXNFbmFibGVkPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVv dDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+Og0KPC9zcGFuPjxiPjxzcGFuIHN0eWxl PSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojOTkwMDAwIj5mdW5j dGlvbjwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3 JnF1b3Q7O2NvbG9yOmJsYWNrIj4oKSB7PGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZh bWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4mbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZu YnNwOyZuYnNwOyAvLyBFbmFibGUgYnV0dG9uIG9ubHkgd2hlbiBleGFjdGx5IG9uZSBpdGVtIGlz IHNlbGVjdGVkPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3Vy aWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNw OyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFu Pg0KPGI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2Nv bG9yOiM5OTAwMDAiPnJldHVybjwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZx dW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4gYXJndW1lbnRzLmxlbmd0aCA9PSAx Ozxicj4NCiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsgfSw8 L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8YnI+DQo8L3NwYW4+PHNwYW4g c3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAi PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7ICZuYnNwOyAvLyBS ZXR1cm5pbmcgJ3RydWUnIG1lYW5zIHRoZSBidXR0b24gaXMgdmlzaWJsZTxicj4NCiZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyAvLyBSZXR1cm5pbmcgJ2ZhbHNlJyBtZWFucyB0aGUgYnV0dG9uIGlzIGhpZGRlbjxicj4NCiZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBEZWZh dWx0IHZhbHVlID0gJ3RydWUnPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTom cXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5 OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDAwOTkiPmlzQWNjZXNzaWJsZTwvc3Bh bj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6 YmxhY2siPjoNCjwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmll ciBOZXcmcXVvdDs7Y29sb3I6Izk5MDAwMCI+ZnVuY3Rpb248L3NwYW4+PC9iPjxzcGFuIHN0eWxl PSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+KCkgezwv c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0i Zm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsg Jm5ic3A7Jm5ic3A7IC8vIEFsd2F5cyBzaG93IHRoZSBidXR0b24gaW4gdGhlIGNvcnJlc3BvbmRp bmcgZGF0YSBncmlkPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtD b3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZu YnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9z cGFuPg0KPGI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7 O2NvbG9yOiM5OTAwMDAiPnJldHVybjwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5 OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4NCjwvc3Bhbj48Yj48c3BhbiBz dHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Izk5MDAwMCI+ dHJ1ZTwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3 JnF1b3Q7O2NvbG9yOmJsYWNrIj47PGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv cjpibGFjayI+PGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3Vy aWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+PGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08YnI+DQo8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsgKTs8YnI+ DQp9PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPGJyPg0KQXMgbWVudGlv bmVkIGFib3ZlLCBhbGwgZnVuY3Rpb25zIG9mIGFuIGludGVyZmFjZSBvYmplY3QgYXJlIG9wdGlv bmFsLiBGb3IgZnVuY3Rpb25zIGV4cGVjdGluZyByZXR1cm4gdmFsdWUsIGRlZmF1bHQgdmFsdWUg aXMgZGVmaW5lZCBieSBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUuIEZvciBleGFtcGxlOjxvOnA+ PC9vOnA+PC9zcGFuPjwvcD4NCjx1bCB0eXBlPSJkaXNjIj4NCjxsaSBjbGFzcz0iTXNvTm9ybWFs IiBzdHlsZT0iY29sb3I6YmxhY2s7bXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1i b3R0b20tYWx0OmF1dG87bXNvLWxpc3Q6bDIgbGV2ZWwxIGxmbzIiPg0Kb25DbGljayAtIG5vIGRl ZmF1bHQgdmFsdWUgKG5vIHJldHVybiB2YWx1ZSBleHBlY3RlZCk8bzpwPjwvbzpwPjwvbGk+PGxp IGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjpibGFjazttc28tbWFyZ2luLXRvcC1hbHQ6 YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzttc28tbGlzdDpsMiBsZXZlbDEgbGZvMiI+ DQppc0VuYWJsZWQgLyBpc0FjY2Vzc2libGUgLSBkZWZhdWx0IHZhbHVlICZxdW90O3RydWUmcXVv dDsgKGJvb2xlYW4gcmV0dXJuIHZhbHVlIGV4cGVjdGVkKTxvOnA+PC9vOnA+PC9saT48L3VsPg0K PHA+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5Ob3RlOiBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1 cmUgY2hlY2tzIHRoZSBhY3R1YWwgcmV0dXJuIHZhbHVlIHR5cGUsIGFuZCB1c2VzIGRlZmF1bHQg dmFsdWUgaW4gY2FzZSB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgc29tZXRoaW5nIG9mIHdyb25nICh1 bmV4cGVjdGVkKSB0eXBlLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNr Ij48YnI+DQpJbiB0aGUgZXhhbXBsZSBhYm92ZSwgJnF1b3Q7Y3VycmVudGx5IHNlbGVjdGVkIGl0 ZW0ocykmcXVvdDsgbWFwcyB0byBKU09OLWxpa2UgcmVwcmVzZW50YXRpb25zIG9mIGJ1c2luZXNz IGVudGl0aWVzIGN1cnJlbnRseSBzZWxlY3RlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGdy aWQuIEZvciBub3csIHRoZSBlbnRpdHkgcmVwcmVzZW50YXRpb24gaXMgcXVpdGUgc2ltcGxlIGFu ZCBzYW1lIGZvciBhbGwgZW50aXR5IHR5cGVzOjxicj4NCjxicj4NCjwvc3Bhbj48c3BhbiBzdHls ZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPnsgZW50 aXR5SWQ6ICZxdW90O1tCdXNpbmVzc0VudGl0eUd1aWRBc1N0cmluZ10mcXVvdDsgfTxicj4NCjwv c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCkluIGZ1dHVyZSwgd2Ugd2lsbCBj cmVhdGUgc3BlY2lmaWMgSlNPTi1saWtlIHJlcHJlc2VudGF0aW9ucyBmb3Igc3BlY2lmaWMgYnVz aW5lc3MgZW50aXRpZXMsIGluIGNvbXBsaWFuY2Ugd2l0aCBFbmdpbmUgUkVTVCBBUEkgZW50aXR5 IHN0cnVjdHVyZS48YnI+DQo8YnI+DQpGb3IgYSBtb3JlIGV4dGVuc2l2ZSBleGFtcGxlIG9mIHVz aW5nICZxdW90O2FkZE1haW5UYWJBY3Rpb25CdXR0b24mcXVvdDsgQVBJLCBwbGVhc2Ugc2VlIHRo ZSBhdHRhY2hlZCAmcXVvdDthZGRNYWluVGFiQWN0aW9uQnV0dG9uLmh0bWwuZXhhbXBsZSZxdW90 OyBmaWxlLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXYgY2xhc3M9Ik1zb05vcm1hbCIgYWxp Z249ImNlbnRlciIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj48c3BhbiBzdHlsZT0iY29sb3I6 YmxhY2siPg0KPGhyIHNpemU9IjIiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4NCjwvc3Bh bj48L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+ PGJyPg0KPGI+Mi4gSW1wcm92ZWQgcGx1Z2luIEFQSSBmdW5jdGlvbjogYWRkTWFpblRhYjxicj4N CjwvYj48YnI+DQpUaGUgJnF1b3Q7YWRkTWFpblRhYiZxdW90OyBBUEkgd2FzIGltcHJvdmVkIHRv IGFkZHJlc3MgZm9sbG93aW5nIGlzc3Vlczo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8dWwgdHlw ZT0iZGlzYyI+DQo8bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOmJsYWNrO21zby1t YXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvO21zby1saXN0Omwx IGxldmVsMSBsZm8zIj4NCiZxdW90O2FkZE1haW5UYWImcXVvdDsgY2FuIG5vdyBiZSBjYWxsZWQg YXQgYW55IG1vbWVudCBkdXJpbmcgVUkgcGx1Z2luIHJ1bnRpbWUsIGdpdmVuIHRoYXQgdGhlIHBs dWdpbiBpcyBhbGxvd2VkIGludm9rZSBwbHVnaW4gQVBJIGZ1bmN0aW9ucyAocGx1Z2luIGlzIGVp dGhlciBJTklUSUFMSVpJTkcgb3IgSU5fVVNFKS48YnI+DQpQcmV2aW91c2x5LCAmcXVvdDthZGRN YWluVGFiJnF1b3Q7IHdvcmtlZCByZWxpYWJseSBvbmx5IHdoZW4gY2FsbGVkIGZyb20gd2l0aGlu IFVpSW5pdCBldmVudCBoYW5kbGVyIGZ1bmN0aW9uLjxicj4NCkN1cnJlbnRseSwgaXQncyBwb3Nz aWJsZSB0byBjYWxsICZxdW90O2FkZE1haW5UYWImcXVvdDsgYXQgYW55IG1vbWVudCwgZS5nLiBm cm9tIHdpdGhpbiBzb21lIG90aGVyIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gKGFmdGVyIFVpSW5p dCBoYXMgY29tcGxldGVkKS48bzpwPjwvbzpwPjwvbGk+PC91bD4NCjx1bCB0eXBlPSJkaXNjIj4N CjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6YmxhY2s7bXNvLW1hcmdpbi10b3At YWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87bXNvLWxpc3Q6bDAgbGV2ZWwxIGxm bzQiPg0KJnF1b3Q7YWRkTWFpblRhYiZxdW90OyBub3cgcmV0YWlucyAmcXVvdDthY3RpdmUmcXVv dDsgdGFiIChoaWdobGlnaHRlZCB0YWIgR1VJKS48YnI+DQomcXVvdDthZGRNYWluVGFiJnF1b3Q7 IHdvcmtzIGJ5IGFkZGluZyBuZXcgdGFiIGNvbXBvbmVudCAoR1dUUCBwcmVzZW50ZXIgcHJveHkp IGFuZCByZWZyZXNoaW5nIG1haW4gdGFiIHBhbmVsIEdVSSBieSByZW1vdmluZyBhbGwgcmVsYXRl ZCB0YWJzIGFuZCByZS1hZGRpbmcgdGhlbSBhZ2Fpbi48YnI+DQpUaGlzIGxvZ2ljIGlzIGhhbmRs ZWQgYnkgb3JnLm92aXJ0LmVuZ2luZS51aS5jb21tb24ucHJlc2VudGVyLkR5bmFtaWNUYWJDb250 YWluZXJQcmVzZW50ZXIgY2xhc3MsIHdoaWNoIG1ha2VzIHN1cmUgdGhhdCAmcXVvdDthY3RpdmUm cXVvdDsgdGFiIGlzIHJldGFpbmVkIGV2ZW4gYWZ0ZXIgbWFpbiB0YWIgcGFuZWwgd2FzIHJlZnJl c2hlZC48bzpwPjwvbzpwPjwvbGk+PC91bD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJt YXJnaW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5GdXJ0aGVybW9y ZSwgY3VzdG9tIG1haW4gdGFiIGltcGxlbWVudGF0aW9uIG5vdyBkaXNwbGF5cyB0aGUgY29udGVu dCBvZiB0aGUgZ2l2ZW4gVVJMIHRocm91Z2ggSFRNTCBpZnJhbWUgZWxlbWVudC48bzpwPjwvbzpw Pjwvc3Bhbj48L3A+DQo8ZGl2IGNsYXNzPSJNc29Ob3JtYWwiIGFsaWduPSJjZW50ZXIiIHN0eWxl PSJ0ZXh0LWFsaWduOmNlbnRlciI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4NCjxociBzaXpl PSIyIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+DQo8L3NwYW4+PC9kaXY+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMi4wcHQiPjxzcGFuIHN0eWxlPSJj b2xvcjpibGFjayI+PGJyPg0KPGI+My4gSW1wcm92ZWQgbmF0aXZlIEphdmFTY3JpcHQgZnVuY3Rp b24gaGFuZGxpbmc8L2I+IChHV1QgSlNOSSk8YnI+DQo8YnI+DQpUaGlzIHBhdGNoIGludHJvZHVj ZXMgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW4uanNuaS5Kc0Z1bmN0aW9uIGFu ZCBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5qc25pLkpzRnVuY3Rpb25SZXN1 bHRIZWxwZXIgY2xhc3NlcyBwcm92aWRpbmcgSmF2YSBhYnN0cmFjdGlvbiBmb3IgaW52b2tpbmcg bmF0aXZlIEphdmFTY3JpcHQgZnVuY3Rpb25zLiBUaGVzZSBjbGFzc2VzIGZvbGxvdyB0aGUgZ2Vu ZXJhbCBjb250cmFjdA0KIG9mICZxdW90O2ludGVyZmFjZSBvYmplY3QmcXVvdDsgYXMgbWVudGlv bmVkIGFib3ZlLjxicj4NCjxicj4NCkpzRnVuY3Rpb25SZXN1bHRIZWxwZXIgaXMgcGFydGljdWxh cmx5IHVzZWZ1bCB3aGVuIGRlYWxpbmcgd2l0aCBmdW5jdGlvbnMgd2hpY2ggYXJlIGV4cGVjdGVk IHRvIHJldHVybiB2YWx1ZSBvZiBhIGNlcnRhaW4gdHlwZS4gVG9vIGJhZCBzdGFuZGFyZCBHV1Qg SlNOSSBjbGFzc2VzIGRvbid0IHByb3ZpZGUgc3VjaCBhYnN0cmFjdGlvbiBmb3Igd29ya2luZyB3 aXRoIG5hdGl2ZSBmdW5jdGlvbnMgb3V0LW9mLXRoZS1ib3guLi48bzpwPjwvbzpwPjwvc3Bhbj48 L3A+DQo8ZGl2IGNsYXNzPSJNc29Ob3JtYWwiIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJ0ZXh0LWFs aWduOmNlbnRlciI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4NCjxociBzaXplPSIyIiB3aWR0 aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+DQo8L3NwYW4+PC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMi4wcHQiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFj ayI+PGJyPg0KPGI+NC4gQWN0aW9uUGFuZWwgYW5kIEFjdGlvblRhYmxlIHR5cGUgaGllcmFyY2h5 IHJlZmFjdG9yaW5nPC9iPiAocmVsYXRlZCB0byAmcXVvdDthZGRNYWluVGFiQWN0aW9uQnV0dG9u JnF1b3Q7IEFQSSk8Yj48YnI+DQo8L2I+PGJyPg0KUHJldmlvdXNseSwgQWJzdHJhY3RBY3Rpb25Q YW5lbCBhbmQgQWJzdHJhY3RBY3Rpb25UYWJsZSBjbGFzc2VzIGRpZG4ndCBpbXBsZW1lbnQgYW55 IHJlYXNvbmFibGUgaW50ZXJmYWNlIHRoYXQgd291bGQgYWxsb3cgb3RoZXIgY29tcG9uZW50cyAo Y2xpZW50LXNpZGUgVUkgcGx1Z2luIGluZnJhc3RydWN0dXJlKSB0byBkZXBlbmQgb24gdGhlaXIg ZnVuY3Rpb25hbGl0eSBpbiBhIGxvb3NlbHktY291cGxlZCBtYW5uZXIuIFRoaXMgd291bGQgbWFr ZQ0KIGNvZGUgdGhhdCBpbXBsZW1lbnRzICZxdW90O2FkZE1haW5UYWJBY3Rpb25CdXR0b24mcXVv dDsgQVBJICZxdW90O3VnbHkmcXVvdDs6IG1haW4gdGFiIHZpZXcgaW50ZXJmYWNlIHdvdWxkIGhh dmUgdG8gcmVmZXJlbmNlIEFic3RyYWN0QWN0aW9uVGFibGUgY2xhc3MgZGlyZWN0bHkuIEluIE1W UCBkZXNpZ24gcGF0dGVybiwgdmlldyBpbnRlcmZhY2Ugc2hvdWxkIGF2b2lkIHJlZmVyZW5jaW5n IHNwZWNpZmljIEdXVCBXaWRnZXQgY2xhc3NlcyBkaXJlY3RseS48YnI+DQo8YnI+DQpUaGlzIHBh dGNoIGludHJvZHVjZXMgbmV3IGludGVyZmFjZXMgZm9yIEFjdGlvblBhbmVsIGFuZCBBY3Rpb25U YWJsZSBjb21wb25lbnRzIHdoaWxlIGVsaW1pbmF0aW5nIGNvZGUgcmVkdW5kYW5jeSAoZHVwbGlj YXRlIG9yIHVubmVjZXNzYXJ5IGNvZGUpLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXYgY2xh c3M9Ik1zb05vcm1hbCIgYWxpZ249ImNlbnRlciIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj48 c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPg0KPGhyIHNpemU9IjIiIHdpZHRoPSIxMDAlIiBhbGln bj0iY2VudGVyIj4NCjwvc3Bhbj48L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJt YXJnaW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8Yj41 LiBBY3Rpb25QYW5lbCB0eXBlIGhpZXJhcmNoeSByZWZhY3RvcmluZzwvYj4gKHJlbGF0ZWQgdG8g JnF1b3Q7YWRkTWFpblRhYiZxdW90OyBBUEkpPGJyPg0KPGJyPg0KU2luY2Ugb3JnLm92aXJ0LmVu Z2luZS51aS5jb21tb24ucHJlc2VudGVyLkR5bmFtaWNUYWJDb250YWluZXJQcmVzZW50ZXIgZGVm aW5lcyBuZXcgRHluYW1pY1RhYlBhbmVsIGludGVyZmFjZSB0aGF0IGV4dGVuZHMgc3RhbmRhcmQg R1dUUCBUYWJQYW5lbCBpbnRlcmZhY2UsIHNvbWUgcmVmYWN0b3JpbmcgaGFkIHRvIGJlIGRvbmUg aW4gcmVsYXRlZCBBY3Rpb25QYW5lbCBjbGFzc2VzLjxicj4NCjxicj4NClRoaXMgcGF0Y2ggbWFr ZXMgc3VyZSB0aGF0IGJvdGggb3JnLm92aXJ0LmVuZ2luZS51aS5jb21tb24ud2lkZ2V0LnRhYi5B YnN0cmFjdFRhYlBhbmVsICh3aWRnZXQpIGFuZCBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi52 aWV3LkFic3RyYWN0VGFiUGFuZWxWaWV3ICh2aWV3KSBzdXBwb3J0IER5bmFtaWNUYWJQYW5lbCBp bnRlcmZhY2UuPGJyPg0KPGJyPg0KTm90ZSB0aGF0IGZvciBub3csIG9ubHkgbWFpbiB0YWIgcGFu ZWwgKG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4uc2VjdGlvbi5tYWluLnByZXNlbnRlci5N YWluVGFiUGFuZWxQcmVzZW50ZXIpIHN1cHBvcnRzIGR5bmFtaWMgdGFicyB3aXRoaW4gaXRzIHZp ZXcuPG86cD48L286cD48L3NwYW4+PC9wPg0KPGRpdiBjbGFzcz0iTXNvTm9ybWFsIiBhbGlnbj0i Y2VudGVyIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFj ayI+DQo8aHIgc2l6ZT0iMiIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPg0KPC9zcGFuPjwv ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTIuMHB0Ij48 c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxiPldoZXJlIGlzIGFkZFN1YlRhYiBBUEkg ZnVuY3Rpb24/PC9iPjxicj4NCjxicj4NCkltcGxlbWVudGluZyAmcXVvdDthZGRTdWJUYWImcXVv dDsgQVBJIHJlcXVpcmVzIHNvbWUgbW9yZSBjaGFuZ2VzLCBhbmQgSSBkaWRuJ3Qgd2FudCB0byBk ZWxheSB0aGlzIFBvQyBwYXRjaCBqdXN0IGJlY2F1c2Ugb2YgaXQuLi48YnI+DQo8YnI+DQpIZXJl J3MgYSBzYW1wbGUgY29kZSB0aGF0IGlsbHVzdHJhdGVzIHByb3Bvc2VkICZxdW90O2FkZFN1YlRh YiZxdW90OyBBUEkgdXNhZ2U6PGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZh bWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+VWlJbml0OiA8L3NwYW4+ PGI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9y OiM5OTAwMDAiPmZ1bmN0aW9uPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1 b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPigpIHs8YnI+DQombmJzcDsmbmJzcDsm bmJzcDsgYXBpLjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBO ZXcmcXVvdDs7Y29sb3I6I0NDMzNDQyI+YWRkU3ViVGFiPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250 LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+KCdIb3N0JywmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZv bnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPi8vIGVudGl0 eVR5cGVOYW1lPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5l dyZxdW90Oztjb2xvcjpibGFjayI+PGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7ICdDdXN0b20gSG9zdCBTdWIgVGFiJywmbmJzcDsmbmJzcDsgPC9zcGFuPjxz cGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2 NjAwIj4vLyBsYWJlbDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmll ciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPjxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyAnY3VzdG9tLWhvc3Qtc3ViLXRhYicsICZuYnNwOyA8L3NwYW4+PHNw YW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2 MDAiPi8vIGhpc3RvcnlUb2tlbjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPjxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAnaHR0cDovL3d3dy5vdmlydC5vcmcvJywgPC9zcGFuPjxz cGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2 NjAwIj4vLyBjb250ZW50VXJsPGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZh bWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1p bHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMDtiYWNrZ3JvdW5kOndoaXRl Ij4vLyBTdWIgdGFiIGludGVyZmFjZSBvYmplY3Q8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTom cXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj5BbGwgZnVuY3Rpb25zIHJlY2Vp dmUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0ocyk8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gd2l0aGluIHRoZSBtYWluIHRhYiBkYXRhIGdyaWQgYXMg ZnVuY3Rpb24gYXJndW1lbnRzPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMDA2NjAwIj48YnI+ DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7 O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsg ezwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxicj4NCjwvc3Bhbj48c3Bh biBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYw MCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgJm5ic3A7IC8v IFJldHVybmluZyAndHJ1ZScgbWVhbnMgdGhlIHN1YiB0YWIgaXMgdmlzaWJsZTxicj4NCiZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyAvLyBSZXR1cm5pbmcgJ2ZhbHNlJyBtZWFucyB0aGUgc3ViIHRhYiBpcyBoaWRkZW48YnI+ DQombmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8g RGVmYXVsdCB2YWx1ZSA9ICd0cnVlJzxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1p bHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPiZuYnNwOyZuYnNwOyZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZh bWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDAwMDk5Ij5pc0FjY2Vzc2libGU8 L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2Nv bG9yOmJsYWNrIj46DQo8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0Nv dXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiM5OTAwMDAiPmZ1bmN0aW9uPC9zcGFuPjwvYj48c3BhbiBz dHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPigp IHs8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZv bnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiM5OTAwMDAiPnJldHVybjwv c3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7 O2NvbG9yOmJsYWNrIj4gYXJndW1lbnRzLmxlbmd0aCA9PSAxICZhbXA7JmFtcDsgYXJndW1lbnRz WzBdLmVudGl0eUlkID09ICcmbHQ7TXlIb3N0RW50aXR5SWQmZ3Q7Jzs8YnI+DQombmJzcDsmbmJz cDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08L3Nw YW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZv bnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj48YnI+DQombmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfTxicj4NCjxicj4NCiZuYnNw OyZuYnNwOyZuYnNwOyApOzxicj4NCn08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48 YnI+DQo8YnI+DQpBcyBwYXJ0IG9mICZxdW90O2FkZFN1YlRhYiZxdW90OyBBUEkgaW1wbGVtZW50 YXRpb24sIEknbGwgcmVmYWN0b3IgY3VzdG9tIG1haW4gdGFiIGNvbXBvbmVudHMsIGluIG9yZGVy IHRvIHVzZSBvbmUgJnF1b3Q7dGFiIHR5cGUmcXVvdDsgZm9yIGJvdGggbWFpbiBhbmQgc3ViIHRh YnMuPGJyPg0KPGJyPg0KQ3VycmVudGx5LCB3ZSBoYXZlIG9uZSAoYW5kIG9ubHkgb25lKSAmcXVv dDt0YWIgdHlwZSZxdW90OyAtIGEgdGFiIHRoYXQgc2hvd3MgY29udGVudCBvZiB0aGUgZ2l2ZW4g VVJMIHRocm91Z2ggSFRNTCBpZnJhbWUgZWxlbWVudC48YnI+DQo8YnI+DQpXZSBjb3VsZCBhbHNv IGNyZWF0ZSBuZXcgJnF1b3Q7dGFiIHR5cGVzJnF1b3Q7LCBlLmcuIGZvcm0tYmFzZWQgdGFiIHRo YXQgc2hvd3Mga2V5L3ZhbHVlIHBhaXJzIChJTUhPIHRoaXMgY291bGQgYmUgcXVpdGUgdXNlZnVs IGZvciBjdXN0b20gc3ViIHRhYnMpLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXYgY2xhc3M9 Ik1zb05vcm1hbCIgYWxpZ249ImNlbnRlciIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj48c3Bh biBzdHlsZT0iY29sb3I6YmxhY2siPg0KPGhyIHNpemU9IjIiIHdpZHRoPSIxMDAlIiBhbGlnbj0i Y2VudGVyIj4NCjwvc3Bhbj48L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJn aW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQpMZXQgbWUg a25vdyB3aGF0IHlvdSB0aGluayE8YnI+DQo8YnI+DQpDaGVlcnMsPGJyPg0KVm9qdGVjaDxvOnA+ PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= --_000_D290AD8432118048947689BA3AE8A9B3E9F8E0SACEXCMBX04PRDhqn_--

--_000_D290AD8432118048947689BA3AE8A9B3EA0073SACEXCMBX04PRDhqn_ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGkgVm9qdGVjaCwNCg0KVGhhbmtzIGFnYWluIGZvciB0aGUgZGVsaXZlcnkgb2YgdGhlIHBhdGNo LiBGb3IgcmV2aXNpb24gNywgZG8geW91IGhhdmUgYSBsaXN0IG9mIGNvbnRlbnQ/IEkgaGFkIHBy ZXZpb3VzbHkgaW5kaWNhdGVkIEkgY291bGQgd29yayBvbiBhZGRpbmcgdGhlIHBsdWdpbiBBUEkg dG8gbGF1bmNoIGEgZGlhbG9nLCBidXQgaGFkbuKAmXQgYmVlbiBhYmxlIHRvIGdldCBzdGFydGVk IG9uIGl0IHVudGlsIG5vdy4gSSB3YW50ZWQgdG8gc2VlIGlmIHlvdSBieSBjaGFuY2Ugd2VyZSBh bHJlYWR5IHdvcmtpbmcgb24gaXQgb3IgaWYgeW91IHdlcmUgcGxhbm5pbmcgdG8gZGVsaXZlciB0 aGF0IHlvdXJzZWxmIGluIHRoZSBuZXh0IHJldmlzaW9uPw0KDQpBIGNvdXBsZSBvZiBvdGhlciBp dGVtcyB3ZSBhcmUgbG9va2luZyBmb3IgYXJlIHRoZSBhYmlsaXR5IHRvIGFkZCB0YXNrcyBmb3Ig ZXhlY3V0aW9uIGFuZCBnZXQgYWNjZXNzIHRvIHRoZSBzZXNzaW9uIElEIG9yIHNvbWUga2luZCBv ZiBhdXRoZW50aWNhdGlvbiB0b2tlbiBzbyB0aGF0IHdlIGNhbiBtYWtlIGNhbGxzIGZyb20gb3Vy IHNlcnZlciBpbnRvIHRoZSBSRVNUIEFQSS4gSeKAmW0gbm90IHZlcnkgZmFtaWxpYXIgeWV0IHdp dGggdGhlIFJFU1QgQVBJIHNvIEnigJltIG5vdCBzdXJlIHdoYXQgYXV0aGVudGljYXRpb24gbWV0 aG9kcyBhcmUgYXZhaWxhYmxlIGFuZCB3aGljaCB3b3VsZCBiZSBiZXN0Lg0KDQotQ2hyaXMNCg0K RnJvbTogZW5naW5lLWRldmVsLWJvdW5jZXNAb3ZpcnQub3JnIFttYWlsdG86ZW5naW5lLWRldmVs LWJvdW5jZXNAb3ZpcnQub3JnXSBPbiBCZWhhbGYgT2YgVm9qdGVjaCBTem9jcw0KU2VudDogVGh1 cnNkYXksIE9jdG9iZXIgMTgsIDIwMTIgMTA6NDkgQU0NClRvOiBlbmdpbmUtZGV2ZWwNClN1Ympl Y3Q6IFtFbmdpbmUtZGV2ZWxdIFVJIFBsdWdpbnM6IFBvQyBwYXRjaCByZXZpc2lvbiA2IG5vdyBh dmFpbGFibGUNCg0KSGkgZ3V5cywNCg0KdGhlIGxhdGVzdCByZXZpc2lvbiBvZiBVSSBQbHVnaW5z IHByb29mLW9mLWNvbmNlcHQgcGF0Y2ggaXMgbm93IGF2YWlsYWJsZSBmb3IgeW91IHRvIGV4cGVy aW1lbnQgd2l0aC4gWW91IGNhbiBkb3dubG9hZCB0aGUgcGF0Y2ggZnJvbSBvVmlydCBHZXJyaXQg YXQgaHR0cDovL2dlcnJpdC5vdmlydC5vcmcvIy9jLzgxMjAvMiAocGF0Y2ggc2V0IDIpLg0KDQpQ bGVhc2UgcmVhZCBvbiB0byBsZWFybiB3aGF0J3MgbmV3IGluIHRoaXMgcmV2aXNpb24uIElmIHlv dSBoYXZlIGFueSBjb21tZW50cywgcXVlc3Rpb25zIG9yIGlkZWFzLCBwbGVhc2UgbGV0IG1lIGtu b3chDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQowLiBVSSBwbHVnaW4gcGF0 aCBpbmZvcm1hdGlvbiByZXNvbHZlZCB1c2luZyBsb2NhbCBFbmdpbmUgY29uZmlndXJhdGlvbg0K DQpTZXJ2ZXItc2lkZSBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUgbm93IHVzZXMgbG9jYWwgKG1h Y2hpbmUtc3BlY2lmaWMpIEVuZ2luZSBjb25maWd1cmF0aW9uIGluc3RlYWQgb2YgZ2xvYmFsICh2 ZGNfb3B0aW9ucyBkYXRhYmFzZSB0YWJsZSkgRW5naW5lIGNvbmZpZ3VyYXRpb246DQoNCiAgKiAg IFByZXZpb3VzbHksIHBhdGggaW5mb3JtYXRpb24gd2FzIHJlc29sdmVkIHRocm91Z2ggb3JnLm92 aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5jb25maWcuQ29uZmlnIGNsYXNzIC0gRW5naW5lIGNvbmZp Z3VyYXRpb24gdmFsdWVzIHdlcmUgcmV0cmlldmVkIGZyb20gdmRjX29wdGlvbnMgZGF0YWJhc2Ug dGFibGUuDQogICogICBDdXJyZW50bHksIHBhdGggaW5mb3JtYXRpb24gaXMgcmVzb2x2ZWQgdGhy b3VnaCBvcmcub3ZpcnQuZW5naW5lLmNvcmUudXRpbHMuTG9jYWxDb25maWcgY2xhc3MgLSBFbmdp bmUgY29uZmlndXJhdGlvbiB2YWx1ZXMgYXJlIHJldHJpZXZlZCBmcm9tIGxvY2FsIGZpbGUgc3lz dGVtLg0KSW4gY2FzZSB5b3UncmUgbm90IHdvcmtpbmcgd2l0aCBvVmlydCBFbmdpbmUgdGhyb3Vn aCBSUE0gcGFja2FnZSBzeXN0ZW0sIGUuZy4geW91IGhhdmUgYSBsb2NhbCBkZXZlbG9wbWVudCBl bnZpcm9ubWVudCBzZXQgdXAgYW5kIHlvdSBidWlsZCBhbmQgZGVwbG95IG9WaXJ0IEVuZ2luZSB0 aHJvdWdoIE1hdmVuLCBwbGVhc2UgZm9sbG93IHRoZXNlIHN0ZXBzOg0KDQphLiBDb3B5IGRlZmF1 bHQgRW5naW5lIGNvbmZpZ3VyYXRpb24gaW50byAvdXNyL3NoYXJlL292aXJ0LWVuZ2luZS9jb25m DQojIG1rZGlyIC1wIC91c3Ivc2hhcmUvb3ZpcnQtZW5naW5lL2NvbmYNCiMgY3AgPE9WSVJUX0hP TUU+L2JhY2tlbmQvbWFuYWdlci9jb25mL2VuZ2luZS5jb25mLmRlZmF1bHRzIC91c3Ivc2hhcmUv b3ZpcnQtZW5naW5lL2NvbmYvZW5naW5lLmNvbmYuZGVmYXVsdHMNCg0KYi4gSWYgbmVjZXNzYXJ5 LCBjb3B5IFVJIHBsdWdpbiBkYXRhIGZpbGVzIGZyb20gL3Vzci9zaGFyZS9lbmdpbmUvdWktcGx1 Z2lucyB0byAvdXNyL3NoYXJlL292aXJ0LWVuZ2luZS91aS1wbHVnaW5zDQoNCmMuIElmIG5lY2Vz c2FyeSwgY29weSBVSSBwbHVnaW4gY29uZmlnIGZpbGVzIGZyb20gL2V0Yy9lbmdpbmUvdWktcGx1 Z2lucyB0byAvZXRjL292aXJ0LWVuZ2luZS91aS1wbHVnaW5zDQoNCmQsIEluIGNhc2UgeW91IHdh bnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRW5naW5lIGNvbmZpZ3VyYXRpb24sIHB1dCB5b3Vy IGN1c3RvbSBwcm9wZXJ0eSBmaWxlIGludG8gL2V0Yy9zeXNjb25maWcvb3ZpcnQtZW5naW5lDQoN ClRoZSByZWFzb24gYmVoaW5kIHRoaXMgY2hhbmdlIGlzIHRoYXQgcGF0aCBpbmZvcm1hdGlvbiBm b3IgVUkgcGx1Z2luIGRhdGEgYW5kIGNvbmZpZ3VyYXRpb24gaXMgdHlwaWNhbGx5IG1hY2hpbmUt c3BlY2lmaWMsIGFuZCBzaG91bGQgYmUgY3VzdG9taXphYmxlIHBlciBtYWNoaW5lIHRocm91Z2gg RW5naW5lIGxvY2FsIGNvbmZpZ3VyYXRpb24uDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXw0KDQoxLiBOZXcgcGx1Z2luIEFQSSBmdW5jdGlvbjogYWRkTWFpblRhYkFjdGlvbkJ1dHRv bg0KDQpUaGUgImFkZE1haW5UYWJBY3Rpb25CdXR0b24iIEFQSSBhZGRzIGN1c3RvbSBjb250ZXh0 LXNlbnNpdGl2ZSBidXR0b24gdG8gdGhlIGdpdmVuIG1haW4gdGFiJ3MgZGF0YSBncmlkLCBhbG9u ZyB3aXRoIGNvcnJlc3BvbmRpbmcgZGF0YSBncmlkIGNvbnRleHQgbWVudSBpdGVtLg0KDQphZGRN YWluVGFiQWN0aW9uQnV0dG9uKGVudGl0eVR5cGVOYW1lLCBsYWJlbCwgYWN0aW9uQnV0dG9uSW50 ZXJmYWNlKQ0KDQplbnRpdHlUeXBlTmFtZSBpbmRpY2F0ZXMgd2hpY2ggbWFpbiB0YWIncyBkYXRh IGdyaWQgdGhlIGJ1dHRvbiBzaG91bGQgYmUgYWRkZWQgdG8sIGFjY29yZGluZyB0byB0aGUgZW50 aXR5IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIHRhYi4gZW50aXR5VHlwZU5hbWUgdmFs dWVzIGFyZSBzdHJpbmdzIHJlZmxlY3Rpbmcgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5w bHVnaW4uZW50aXR5RW50aXR5VHlwZSBlbnVtIG1lbWJlcnMuIEZvbGxvd2luZyBlbnRpdHlUeXBl TmFtZSB2YWx1ZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgKHZhbHVlcyBhcmUgY2FzZS1zZW5z aXRpdmUpOiAiRGF0YUNlbnRlciIsICJDbHVzdGVyIiwgIkhvc3QiLCAiU3RvcmFnZSIsICJEaXNr IiwgIlZpcnR1YWxNYWNoaW5lIiwgIlRlbXBsYXRlIi4NCg0KTm90ZTogIlBvb2wiIHZhbHVlIGlz IGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIG9mIG9yZy5vdmlydC5lbmdpbmUuY29y ZS5jb21tb24uYnVzaW5lc3NlbnRpdGllcy52bV9wb29scyBlbnRpdHkgbm90IGltcGxlbWVudGlu ZyB0aGUgQnVzaW5lc3NFbnRpdHkgaW50ZXJmYWNlLCBub3Qgc3VyZSB3aHkgdGhvdWdoLiBNYXli ZSB3ZSBzaG91bGQgc3dpdGNoIGZyb20gQnVzaW5lc3NFbnRpdHkgdG8gSVZkY1F1ZXJ5YWJsZSBp bnRlcmZhY2UgYW5kIGFsd2F5cyBjYXN0IGdldFF1ZXJ5YWJsZUlkIG1ldGhvZCByZXN1bHQgdmFs dWUgdG8gR3VpZD8NCg0KbGFiZWwgaXMgdGhlIHRpdGxlIGRpc3BsYXllZCBvbiB0aGUgYnV0dG9u Lg0KDQphY3Rpb25CdXR0b25JbnRlcmZhY2UgcmVwcmVzZW50cyBhbiBvYmplY3QgdGhhdCAiaW1w bGVtZW50cyB0aGUgYnV0dG9uIGludGVyZmFjZSIgYnkgZGVjbGFyaW5nIGl0cyBmdW5jdGlvbnM6 IG9uQ2xpY2ssIGlzRW5hYmxlZCwgaXNBY2Nlc3NpYmxlLiBBbGwgZnVuY3Rpb25zIG9mIGFjdGlv bkJ1dHRvbkludGVyZmFjZSByZWNlaXZlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtKHMpIGFzIGZ1 bmN0aW9uIGFyZ3VtZW50cy4NCg0KTGV0J3MgdGFrZSBhIGNsb3NlciBsb29rIGF0IHRoZSBjb25j ZXB0IGJlaGluZCBhY3Rpb25CdXR0b25JbnRlcmZhY2UuIEluIHRyYWRpdGlvbmFsIGNsYXNzLWJh c2VkIG9iamVjdC1vcmllbnRlZCBsYW5ndWFnZXMsIHN1Y2ggYXMgSmF2YSwgaW50ZXJmYWNlIGlz IGFuIGFic3RyYWN0IHR5cGUgdGhhdCBjb250YWlucyBtZXRob2QgZGVjbGFyYXRpb25zIHdpdGhv dXQgYW4gaW1wbGVtZW50YXRpb24uIEEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBnaXZlbiBp bnRlcmZhY2UgbXVzdCBpbXBsZW1lbnQgYWxsIG1ldGhvZHMgZGVjbGFyZWQgYnkgdGhhdCBpbnRl cmZhY2UgKHVubGVzcyBpdCdzIGFuIGFic3RyYWN0IGNsYXNzLCBidXQgdGhpcyBpc24ndCByZWxl dmFudCBpbiBvdXIgY2FzZSkuDQoNCkluIGNvbnRyYXN0IHdpdGggdHJhZGl0aW9uYWwgY2xhc3Mt YmFzZWQgb2JqZWN0LW9yaWVudGVkIGxhbmd1YWdlcywgSmF2YVNjcmlwdCBzdXBwb3J0cyBPT1Ag dGhyb3VnaCBwcm90b3R5cGUtYmFzZWQgcHJvZ3JhbW1pbmcgbW9kZWwgKGh0dHBzOi8vZGV2ZWxv cGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9JbnRyb2R1Y3Rpb25fdG9fT2Jq ZWN0LU9yaWVudGVkX0phdmFTY3JpcHQpLiBBdCB0aGUgc2FtZSB0aW1lLCBKYXZhU2NyaXB0IGxh bmd1YWdlIGlzIGR5bmFtaWNhbGx5LXR5cGVkIGFuZCB0aGVyZWZvcmUgZG9lc24ndCBzdXBwb3J0 IHRyYWRpdGlvbmFsIGNvbmNlcHQgb2YgaW50ZXJmYWNlIGluIE9PUCwgaXQgdXNlcyAiZHVjayB0 eXBpbmciIHRlY2huaXF1ZSBpbnN0ZWFkIChodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0R1 Y2tfdHlwaW5nKS4NCg0KVGhlIHNpbXBsZXN0IHdheSB0byBwcm92aWRlIGFuIG9iamVjdCB0aGF0 ICJpbXBsZW1lbnRzIHRoZSBnaXZlbiBpbnRlcmZhY2UiIGluIEphdmFTY3JpcHQgaXMgdG8gdXNl ICJkdWNrIHR5cGluZyIgdGVjaG5pcXVlOiBwcm92aWRpbmcgYW4gb2JqZWN0IHRoYXQgY29udGFp bnMgd2VsbC1rbm93biBmdW5jdGlvbnMuIEluIFVJIHBsdWdpbiBpbmZyYXN0cnVjdHVyZSwgSSBj YWxsIHRoaXMgY29uY2VwdCAiaW50ZXJmYWNlIG9iamVjdCIsIHJlcHJlc2VudGVkIGJ5IG9yZy5v dmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLmpzbmkuSnNJbnRlcmZhY2VPYmplY3QgY2xh c3MuIFVubGlrZSB0aGUgdHJhZGl0aW9uYWwgY29uY2VwdCBvZiBpbnRlcmZhY2UgYWJzdHJhY3Qg dHlwZSBpbiBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2VzLCBhbiAiaW50ZXJmYWNlIG9iamVjdCIg ZG9lcyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBkZWNsYXJlIGFsbCBmdW5jdGlvbnMgb2YgdGhl IGdpdmVuIGludGVyZmFjZSBpbiBvcmRlciB0byAiaW1wbGVtZW50IiBzdWNoIGludGVyZmFjZS4g SW4gZmFjdCwgYW4gZW1wdHkgb2JqZWN0IGNhbiBiZSB1c2VkIGFzIGEgdmFsaWQgImludGVyZmFj ZSBvYmplY3QiLiBNaXNzaW5nIGZ1bmN0aW9ucyB3aWxsIGJlIHNpbXBseSB0cmVhdGVkIGFzIGVt cHR5IChuby1vcCkgZnVuY3Rpb25zLiBGdXJ0aGVybW9yZSwgYW4gImludGVyZmFjZSBvYmplY3Qi IGNhbiAiaW1wbGVtZW50IiBtdWx0aXBsZSBpbnRlcmZhY2VzIGJ5IGRlY2xhcmluZyBmdW5jdGlv bnMgb2YgdGhvc2UgaW50ZXJmYWNlcyAoaW50ZXJmYWNlIGNvbXBvc2l0aW9uKS4NCg0KR2V0dGlu ZyBiYWNrIHRvICJhZGRNYWluVGFiQWN0aW9uQnV0dG9uIiBBUEksIGhlcmUncyBhIHNhbXBsZSBj b2RlIHRoYXQgYWRkcyBuZXcgYnV0dG9uIHRvICJIb3N0IiBtYWluIHRhYiBkYXRhIGdyaWQsIGFz IHBhcnQgb2YgVWlJbml0IGV2ZW50IGhhbmRsZXIgZnVuY3Rpb246DQoNClVpSW5pdDogZnVuY3Rp b24oKSB7DQogICAgYXBpLmFkZE1haW5UYWJBY3Rpb25CdXR0b24oJ0hvc3QnLCAnU2luZ2xlLUhv c3QgQWN0aW9uJywNCg0KICAgICAgICAvLyBBY3Rpb24gYnV0dG9uIGludGVyZmFjZSBvYmplY3QN CiAgICAgICAgLy8gQWxsIGZ1bmN0aW9ucyByZWNlaXZlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVt KHMpIGFzIGZ1bmN0aW9uIGFyZ3VtZW50cw0KICAgICAgICB7DQoNCiAgICAgICAgICAgIC8vIENh bGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgYnV0dG9uDQogICAgICAgICAgICBvbkNsaWNr OiBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAvLyBDYWxsaW5nICdhcmd1bWVudHNbMF0n IGlzIHNhZmUsIGJlY2F1c2Ugb25DbGljaygpIGNhbiBiZSBjYWxsZWQNCiAgICAgICAgICAgICAg ICAvLyBvbmx5IHdoZW4gZXhhY3RseSBvbmUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgaW4g dGhlIGRhdGEgZ3JpZA0KICAgICAgICAgICAgICAgIHdpbmRvdy5hbGVydCgnU2VsZWN0ZWQgaG9z dCBlbnRpdHkgSUQgPSAnICsgYXJndW1lbnRzWzBdLmVudGl0eUlkKTsNCiAgICAgICAgICAgIH0s DQoNCiAgICAgICAgICAgIC8vIFJldHVybmluZyAndHJ1ZScgbWVhbnMgdGhlIGJ1dHRvbiBpcyBl bmFibGVkIChjbGlja2FibGUpDQogICAgICAgICAgICAvLyBSZXR1cm5pbmcgJ2ZhbHNlJyBtZWFu cyB0aGUgYnV0dG9uIGlzIGRpc2FibGVkIChub24tY2xpY2thYmxlKQ0KICAgICAgICAgICAgLy8g RGVmYXVsdCB2YWx1ZSA9ICd0cnVlJw0KICAgICAgICAgICAgaXNFbmFibGVkOiBmdW5jdGlvbigp IHsNCiAgICAgICAgICAgICAgICAvLyBFbmFibGUgYnV0dG9uIG9ubHkgd2hlbiBleGFjdGx5IG9u ZSBpdGVtIGlzIHNlbGVjdGVkDQogICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5n dGggPT0gMTsNCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgIC8vIFJldHVybmluZyAndHJ1 ZScgbWVhbnMgdGhlIGJ1dHRvbiBpcyB2aXNpYmxlDQogICAgICAgICAgICAvLyBSZXR1cm5pbmcg J2ZhbHNlJyBtZWFucyB0aGUgYnV0dG9uIGlzIGhpZGRlbg0KICAgICAgICAgICAgLy8gRGVmYXVs dCB2YWx1ZSA9ICd0cnVlJw0KICAgICAgICAgICAgaXNBY2Nlc3NpYmxlOiBmdW5jdGlvbigpIHsN CiAgICAgICAgICAgICAgICAvLyBBbHdheXMgc2hvdyB0aGUgYnV0dG9uIGluIHRoZSBjb3JyZXNw b25kaW5nIGRhdGEgZ3JpZA0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAg ICAgfQ0KDQogICAgICAgIH0NCg0KICAgICk7DQp9DQoNCkFzIG1lbnRpb25lZCBhYm92ZSwgYWxs IGZ1bmN0aW9ucyBvZiBhbiBpbnRlcmZhY2Ugb2JqZWN0IGFyZSBvcHRpb25hbC4gRm9yIGZ1bmN0 aW9ucyBleHBlY3RpbmcgcmV0dXJuIHZhbHVlLCBkZWZhdWx0IHZhbHVlIGlzIGRlZmluZWQgYnkg VUkgcGx1Z2luIGluZnJhc3RydWN0dXJlLiBGb3IgZXhhbXBsZToNCg0KICAqICAgb25DbGljayAt IG5vIGRlZmF1bHQgdmFsdWUgKG5vIHJldHVybiB2YWx1ZSBleHBlY3RlZCkNCiAgKiAgIGlzRW5h YmxlZCAvIGlzQWNjZXNzaWJsZSAtIGRlZmF1bHQgdmFsdWUgInRydWUiIChib29sZWFuIHJldHVy biB2YWx1ZSBleHBlY3RlZCkNCg0KTm90ZTogVUkgcGx1Z2luIGluZnJhc3RydWN0dXJlIGNoZWNr cyB0aGUgYWN0dWFsIHJldHVybiB2YWx1ZSB0eXBlLCBhbmQgdXNlcyBkZWZhdWx0IHZhbHVlIGlu IGNhc2UgdGhlIGZ1bmN0aW9uIHJldHVybmVkIHNvbWV0aGluZyBvZiB3cm9uZyAodW5leHBlY3Rl ZCkgdHlwZS4NCg0KSW4gdGhlIGV4YW1wbGUgYWJvdmUsICJjdXJyZW50bHkgc2VsZWN0ZWQgaXRl bShzKSIgbWFwcyB0byBKU09OLWxpa2UgcmVwcmVzZW50YXRpb25zIG9mIGJ1c2luZXNzIGVudGl0 aWVzIGN1cnJlbnRseSBzZWxlY3RlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGdyaWQuIEZv ciBub3csIHRoZSBlbnRpdHkgcmVwcmVzZW50YXRpb24gaXMgcXVpdGUgc2ltcGxlIGFuZCBzYW1l IGZvciBhbGwgZW50aXR5IHR5cGVzOg0KDQp7IGVudGl0eUlkOiAiW0J1c2luZXNzRW50aXR5R3Vp ZEFzU3RyaW5nXSIgfQ0KDQpJbiBmdXR1cmUsIHdlIHdpbGwgY3JlYXRlIHNwZWNpZmljIEpTT04t bGlrZSByZXByZXNlbnRhdGlvbnMgZm9yIHNwZWNpZmljIGJ1c2luZXNzIGVudGl0aWVzLCBpbiBj b21wbGlhbmNlIHdpdGggRW5naW5lIFJFU1QgQVBJIGVudGl0eSBzdHJ1Y3R1cmUuDQoNCkZvciBh IG1vcmUgZXh0ZW5zaXZlIGV4YW1wbGUgb2YgdXNpbmcgImFkZE1haW5UYWJBY3Rpb25CdXR0b24i IEFQSSwgcGxlYXNlIHNlZSB0aGUgYXR0YWNoZWQgImFkZE1haW5UYWJBY3Rpb25CdXR0b24uaHRt bC5leGFtcGxlIiBmaWxlLg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KMi4g SW1wcm92ZWQgcGx1Z2luIEFQSSBmdW5jdGlvbjogYWRkTWFpblRhYg0KDQpUaGUgImFkZE1haW5U YWIiIEFQSSB3YXMgaW1wcm92ZWQgdG8gYWRkcmVzcyBmb2xsb3dpbmcgaXNzdWVzOg0KDQogICog ICAiYWRkTWFpblRhYiIgY2FuIG5vdyBiZSBjYWxsZWQgYXQgYW55IG1vbWVudCBkdXJpbmcgVUkg cGx1Z2luIHJ1bnRpbWUsIGdpdmVuIHRoYXQgdGhlIHBsdWdpbiBpcyBhbGxvd2VkIGludm9rZSBw bHVnaW4gQVBJIGZ1bmN0aW9ucyAocGx1Z2luIGlzIGVpdGhlciBJTklUSUFMSVpJTkcgb3IgSU5f VVNFKS4NClByZXZpb3VzbHksICJhZGRNYWluVGFiIiB3b3JrZWQgcmVsaWFibHkgb25seSB3aGVu IGNhbGxlZCBmcm9tIHdpdGhpbiBVaUluaXQgZXZlbnQgaGFuZGxlciBmdW5jdGlvbi4NCkN1cnJl bnRseSwgaXQncyBwb3NzaWJsZSB0byBjYWxsICJhZGRNYWluVGFiIiBhdCBhbnkgbW9tZW50LCBl LmcuIGZyb20gd2l0aGluIHNvbWUgb3RoZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvbiAoYWZ0ZXIg VWlJbml0IGhhcyBjb21wbGV0ZWQpLg0KDQogICogICAiYWRkTWFpblRhYiIgbm93IHJldGFpbnMg ImFjdGl2ZSIgdGFiIChoaWdobGlnaHRlZCB0YWIgR1VJKS4NCiJhZGRNYWluVGFiIiB3b3JrcyBi eSBhZGRpbmcgbmV3IHRhYiBjb21wb25lbnQgKEdXVFAgcHJlc2VudGVyIHByb3h5KSBhbmQgcmVm cmVzaGluZyBtYWluIHRhYiBwYW5lbCBHVUkgYnkgcmVtb3ZpbmcgYWxsIHJlbGF0ZWQgdGFicyBh bmQgcmUtYWRkaW5nIHRoZW0gYWdhaW4uDQpUaGlzIGxvZ2ljIGlzIGhhbmRsZWQgYnkgb3JnLm92 aXJ0LmVuZ2luZS51aS5jb21tb24ucHJlc2VudGVyLkR5bmFtaWNUYWJDb250YWluZXJQcmVzZW50 ZXIgY2xhc3MsIHdoaWNoIG1ha2VzIHN1cmUgdGhhdCAiYWN0aXZlIiB0YWIgaXMgcmV0YWluZWQg ZXZlbiBhZnRlciBtYWluIHRhYiBwYW5lbCB3YXMgcmVmcmVzaGVkLg0KRnVydGhlcm1vcmUsIGN1 c3RvbSBtYWluIHRhYiBpbXBsZW1lbnRhdGlvbiBub3cgZGlzcGxheXMgdGhlIGNvbnRlbnQgb2Yg dGhlIGdpdmVuIFVSTCB0aHJvdWdoIEhUTUwgaWZyYW1lIGVsZW1lbnQuDQpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXw0KDQozLiBJbXByb3ZlZCBuYXRpdmUgSmF2YVNjcmlwdCBmdW5j dGlvbiBoYW5kbGluZyAoR1dUIEpTTkkpDQoNClRoaXMgcGF0Y2ggaW50cm9kdWNlcyBvcmcub3Zp cnQuZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5qc25pLkpzRnVuY3Rpb24gYW5kIG9yZy5vdmly dC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLmpzbmkuSnNGdW5jdGlvblJlc3VsdEhlbHBlciBj bGFzc2VzIHByb3ZpZGluZyBKYXZhIGFic3RyYWN0aW9uIGZvciBpbnZva2luZyBuYXRpdmUgSmF2 YVNjcmlwdCBmdW5jdGlvbnMuIFRoZXNlIGNsYXNzZXMgZm9sbG93IHRoZSBnZW5lcmFsIGNvbnRy YWN0IG9mICJpbnRlcmZhY2Ugb2JqZWN0IiBhcyBtZW50aW9uZWQgYWJvdmUuDQoNCkpzRnVuY3Rp b25SZXN1bHRIZWxwZXIgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIGRlYWxpbmcgd2l0aCBm dW5jdGlvbnMgd2hpY2ggYXJlIGV4cGVjdGVkIHRvIHJldHVybiB2YWx1ZSBvZiBhIGNlcnRhaW4g dHlwZS4gVG9vIGJhZCBzdGFuZGFyZCBHV1QgSlNOSSBjbGFzc2VzIGRvbid0IHByb3ZpZGUgc3Vj aCBhYnN0cmFjdGlvbiBmb3Igd29ya2luZyB3aXRoIG5hdGl2ZSBmdW5jdGlvbnMgb3V0LW9mLXRo ZS1ib3guLi4NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCjQuIEFjdGlvblBh bmVsIGFuZCBBY3Rpb25UYWJsZSB0eXBlIGhpZXJhcmNoeSByZWZhY3RvcmluZyAocmVsYXRlZCB0 byAiYWRkTWFpblRhYkFjdGlvbkJ1dHRvbiIgQVBJKQ0KDQpQcmV2aW91c2x5LCBBYnN0cmFjdEFj dGlvblBhbmVsIGFuZCBBYnN0cmFjdEFjdGlvblRhYmxlIGNsYXNzZXMgZGlkbid0IGltcGxlbWVu dCBhbnkgcmVhc29uYWJsZSBpbnRlcmZhY2UgdGhhdCB3b3VsZCBhbGxvdyBvdGhlciBjb21wb25l bnRzIChjbGllbnQtc2lkZSBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUpIHRvIGRlcGVuZCBvbiB0 aGVpciBmdW5jdGlvbmFsaXR5IGluIGEgbG9vc2VseS1jb3VwbGVkIG1hbm5lci4gVGhpcyB3b3Vs ZCBtYWtlIGNvZGUgdGhhdCBpbXBsZW1lbnRzICJhZGRNYWluVGFiQWN0aW9uQnV0dG9uIiBBUEkg InVnbHkiOiBtYWluIHRhYiB2aWV3IGludGVyZmFjZSB3b3VsZCBoYXZlIHRvIHJlZmVyZW5jZSBB YnN0cmFjdEFjdGlvblRhYmxlIGNsYXNzIGRpcmVjdGx5LiBJbiBNVlAgZGVzaWduIHBhdHRlcm4s IHZpZXcgaW50ZXJmYWNlIHNob3VsZCBhdm9pZCByZWZlcmVuY2luZyBzcGVjaWZpYyBHV1QgV2lk Z2V0IGNsYXNzZXMgZGlyZWN0bHkuDQoNClRoaXMgcGF0Y2ggaW50cm9kdWNlcyBuZXcgaW50ZXJm YWNlcyBmb3IgQWN0aW9uUGFuZWwgYW5kIEFjdGlvblRhYmxlIGNvbXBvbmVudHMgd2hpbGUgZWxp bWluYXRpbmcgY29kZSByZWR1bmRhbmN5IChkdXBsaWNhdGUgb3IgdW5uZWNlc3NhcnkgY29kZSku DQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQo1LiBBY3Rpb25QYW5lbCB0eXBl IGhpZXJhcmNoeSByZWZhY3RvcmluZyAocmVsYXRlZCB0byAiYWRkTWFpblRhYiIgQVBJKQ0KDQpT aW5jZSBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi5wcmVzZW50ZXIuRHluYW1pY1RhYkNvbnRh aW5lclByZXNlbnRlciBkZWZpbmVzIG5ldyBEeW5hbWljVGFiUGFuZWwgaW50ZXJmYWNlIHRoYXQg ZXh0ZW5kcyBzdGFuZGFyZCBHV1RQIFRhYlBhbmVsIGludGVyZmFjZSwgc29tZSByZWZhY3Rvcmlu ZyBoYWQgdG8gYmUgZG9uZSBpbiByZWxhdGVkIEFjdGlvblBhbmVsIGNsYXNzZXMuDQoNClRoaXMg cGF0Y2ggbWFrZXMgc3VyZSB0aGF0IGJvdGggb3JnLm92aXJ0LmVuZ2luZS51aS5jb21tb24ud2lk Z2V0LnRhYi5BYnN0cmFjdFRhYlBhbmVsICh3aWRnZXQpIGFuZCBvcmcub3ZpcnQuZW5naW5lLnVp LmNvbW1vbi52aWV3LkFic3RyYWN0VGFiUGFuZWxWaWV3ICh2aWV3KSBzdXBwb3J0IER5bmFtaWNU YWJQYW5lbCBpbnRlcmZhY2UuDQoNCk5vdGUgdGhhdCBmb3Igbm93LCBvbmx5IG1haW4gdGFiIHBh bmVsIChvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIu TWFpblRhYlBhbmVsUHJlc2VudGVyKSBzdXBwb3J0cyBkeW5hbWljIHRhYnMgd2l0aGluIGl0cyB2 aWV3Lg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KV2hlcmUgaXMgYWRkU3Vi VGFiIEFQSSBmdW5jdGlvbj8NCg0KSW1wbGVtZW50aW5nICJhZGRTdWJUYWIiIEFQSSByZXF1aXJl cyBzb21lIG1vcmUgY2hhbmdlcywgYW5kIEkgZGlkbid0IHdhbnQgdG8gZGVsYXkgdGhpcyBQb0Mg cGF0Y2gganVzdCBiZWNhdXNlIG9mIGl0Li4uDQoNCkhlcmUncyBhIHNhbXBsZSBjb2RlIHRoYXQg aWxsdXN0cmF0ZXMgcHJvcG9zZWQgImFkZFN1YlRhYiIgQVBJIHVzYWdlOg0KDQpVaUluaXQ6IGZ1 bmN0aW9uKCkgew0KICAgIGFwaS5hZGRTdWJUYWIoJ0hvc3QnLCAgICAgICAgLy8gZW50aXR5VHlw ZU5hbWUNCiAgICAgICAgJ0N1c3RvbSBIb3N0IFN1YiBUYWInLCAgIC8vIGxhYmVsDQogICAgICAg ICdjdXN0b20taG9zdC1zdWItdGFiJywgICAvLyBoaXN0b3J5VG9rZW4NCiAgICAgICAgJ2h0dHA6 Ly93d3cub3ZpcnQub3JnLycsIC8vIGNvbnRlbnRVcmwNCg0KICAgICAgICAvLyBTdWIgdGFiIGlu dGVyZmFjZSBvYmplY3QNCiAgICAgICAgLy8gQWxsIGZ1bmN0aW9ucyByZWNlaXZlIGN1cnJlbnRs eSBzZWxlY3RlZCBpdGVtKHMpDQogICAgICAgIC8vIHdpdGhpbiB0aGUgbWFpbiB0YWIgZGF0YSBn cmlkIGFzIGZ1bmN0aW9uIGFyZ3VtZW50cw0KICAgICAgICB7DQoNCiAgICAgICAgICAgIC8vIFJl dHVybmluZyAndHJ1ZScgbWVhbnMgdGhlIHN1YiB0YWIgaXMgdmlzaWJsZQ0KICAgICAgICAgICAg Ly8gUmV0dXJuaW5nICdmYWxzZScgbWVhbnMgdGhlIHN1YiB0YWIgaXMgaGlkZGVuDQogICAgICAg ICAgICAvLyBEZWZhdWx0IHZhbHVlID0gJ3RydWUnDQogICAgICAgICAgICBpc0FjY2Vzc2libGU6 IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09 IDEgJiYgYXJndW1lbnRzWzBdLmVudGl0eUlkID09ICc8TXlIb3N0RW50aXR5SWQ+JzsNCiAgICAg ICAgICAgIH0NCg0KICAgICAgICB9DQoNCiAgICApOw0KfQ0KDQpBcyBwYXJ0IG9mICJhZGRTdWJU YWIiIEFQSSBpbXBsZW1lbnRhdGlvbiwgSSdsbCByZWZhY3RvciBjdXN0b20gbWFpbiB0YWIgY29t cG9uZW50cywgaW4gb3JkZXIgdG8gdXNlIG9uZSAidGFiIHR5cGUiIGZvciBib3RoIG1haW4gYW5k IHN1YiB0YWJzLg0KDQpDdXJyZW50bHksIHdlIGhhdmUgb25lIChhbmQgb25seSBvbmUpICJ0YWIg dHlwZSIgLSBhIHRhYiB0aGF0IHNob3dzIGNvbnRlbnQgb2YgdGhlIGdpdmVuIFVSTCB0aHJvdWdo IEhUTUwgaWZyYW1lIGVsZW1lbnQuDQoNCldlIGNvdWxkIGFsc28gY3JlYXRlIG5ldyAidGFiIHR5 cGVzIiwgZS5nLiBmb3JtLWJhc2VkIHRhYiB0aGF0IHNob3dzIGtleS92YWx1ZSBwYWlycyAoSU1I TyB0aGlzIGNvdWxkIGJlIHF1aXRlIHVzZWZ1bCBmb3IgY3VzdG9tIHN1YiB0YWJzKS4NCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCkxldCBtZSBrbm93IHdoYXQgeW91IHRoaW5r IQ0KDQpDaGVlcnMsDQpWb2p0ZWNoDQo= --_000_D290AD8432118048947689BA3AE8A9B3EA0073SACEXCMBX04PRDhqn_ Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv VFIvUkVDLWh0bWw0MCI+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIg Y29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxtZXRhIG5hbWU9IkdlbmVyYXRv ciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTQgKGZpbHRlcmVkIG1lZGl1bSkiPg0KPCEtLVtp ZiAhbXNvXT48c3R5bGU+dlw6KiB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fQ0Kb1w6KiB7 YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fQ0Kd1w6KiB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0 I1ZNTCk7fQ0KLnNoYXBlIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9DQo8L3N0eWxlPjwh W2VuZGlmXS0tPjxzdHlsZT48IS0tDQovKiBGb250IERlZmluaXRpb25zICovDQpAZm9udC1mYWNl DQoJe2ZvbnQtZmFtaWx5OldpbmdkaW5nczsNCglwYW5vc2UtMTo1IDAgMCAwIDAgMCAwIDAgMCAw O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6V2luZ2RpbmdzOw0KCXBhbm9zZS0xOjUgMCAw IDAgMCAwIDAgMCAwIDA7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseTpDYWxpYnJpOw0KCXBh bm9zZS0xOjIgMTUgNSAyIDIgMiA0IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6 VGFob21hOw0KCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0O30NCi8qIFN0eWxlIERlZmlu aXRpb25zICovDQpwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsDQoJe21h cmdpbjowaW47DQoJbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0KCWZvbnQtc2l6ZToxMi4wcHQ7DQoJ Zm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9DQphOmxpbmssIHNwYW4uTXNv SHlwZXJsaW5rDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xvcjpibHVlOw0KCXRleHQt ZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KYTp2aXNpdGVkLCBzcGFuLk1zb0h5cGVybGlua0ZvbGxv d2VkDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xvcjpwdXJwbGU7DQoJdGV4dC1kZWNv cmF0aW9uOnVuZGVybGluZTt9DQpwDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgltYXJnaW46 MGluOw0KCW1hcmdpbi1ib3R0b206LjAwMDFwdDsNCglmb250LXNpemU6MTIuMHB0Ow0KCWZvbnQt ZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQ0Kc3Bhbi5FbWFpbFN0eWxlMjANCgl7 bXNvLXN0eWxlLXR5cGU6cGVyc29uYWwtcmVwbHk7DQoJZm9udC1mYW1pbHk6IkNhbGlicmkiLCJz YW5zLXNlcmlmIjsNCgljb2xvcjojMUY0OTdEO30NCi5Nc29DaHBEZWZhdWx0DQoJe21zby1zdHls ZS10eXBlOmV4cG9ydC1vbmx5Ow0KCWZvbnQtc2l6ZToxMC4wcHQ7fQ0KQHBhZ2UgV29yZFNlY3Rp b24xDQoJe3NpemU6OC41aW4gMTEuMGluOw0KCW1hcmdpbjoxLjBpbiAxLjBpbiAxLjBpbiAxLjBp bjt9DQpkaXYuV29yZFNlY3Rpb24xDQoJe3BhZ2U6V29yZFNlY3Rpb24xO30NCi8qIExpc3QgRGVm aW5pdGlvbnMgKi8NCkBsaXN0IGwwDQoJe21zby1saXN0LWlkOjQzMDI0Njk5NzsNCgltc28tbGlz dC10ZW1wbGF0ZS1pZHM6LTE0MDIyODQ2NzQ7fQ0KQGxpc3QgbDA6bGV2ZWwxDQoJe21zby1sZXZl bC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgrc7DQoJbXNvLWxldmVs LXRhYi1zdG9wOi41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQt aW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5 OlN5bWJvbDt9DQpAbGlzdCBsMDpsZXZlbDINCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVs bGV0Ow0KCW1zby1sZXZlbC10ZXh0Om87DQoJbXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOw0KCW1z by1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNv LWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseToiQ291cmllciBOZXciOw0KCW1z by1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30NCkBsaXN0IGwwOmxldmVsMw0K CXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0K CW1zby1sZXZlbC10YWItc3RvcDoxLjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxl ZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJ Zm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwwOmxldmVsNA0KCXttc28tbGV2ZWwtbnVt YmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWIt c3RvcDoyLjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRl bnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2lu Z2RpbmdzO30NCkBsaXN0IGwwOmxldmVsNQ0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxs ZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDoyLjVpbjsNCglt c28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1z by1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0 IGwwOmxldmVsNg0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVs LXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDozLjBpbjsNCgltc28tbGV2ZWwtbnVtYmVy LXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6 ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwwOmxldmVsNw0KCXtt c28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1z by1sZXZlbC10YWItc3RvcDozLjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7 DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9u dC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwwOmxldmVsOA0KCXttc28tbGV2ZWwtbnVtYmVy LWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3Rv cDo0LjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6 LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2Rp bmdzO30NCkBsaXN0IGwwOmxldmVsOQ0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7 DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDo0LjVpbjsNCgltc28t bGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1h bnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwx DQoJe21zby1saXN0LWlkOjY3NTMwMjY0NjsNCgltc28tbGlzdC10ZW1wbGF0ZS1pZHM6MTY2MjY2 NzI1Njt9DQpAbGlzdCBsMTpsZXZlbDENCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0 Ow0KCW1zby1sZXZlbC10ZXh0Ou+CtzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsNCgltc28t bGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1h bnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6U3ltYm9sO30NCkBsaXN0IGwxOmxl dmVsMg0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ6 bzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlv bjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0 Ow0KCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7DQoJbXNvLWJpZGktZm9udC1mYW1pbHk6IlRp bWVzIE5ldyBSb21hbiI7fQ0KQGxpc3QgbDE6bGV2ZWwzDQoJe21zby1sZXZlbC1udW1iZXItZm9y bWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjEu NWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1 aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7 fQ0KQGxpc3QgbDE6bGV2ZWw0DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCglt c28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjIuMGluOw0KCW1zby1sZXZl bC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2kt Zm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDE6bGV2 ZWw1DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrv gqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRp b246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBw dDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDE6bGV2ZWw2DQoJe21zby1sZXZl bC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVs LXRhYi1zdG9wOjMuMGluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0 LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWls eTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDE6bGV2ZWw3DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0 OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjMuNWlu Ow0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47 DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0K QGxpc3QgbDE6bGV2ZWw4DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28t bGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOw0KCW1zby1sZXZlbC1u dW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9u dC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDE6bGV2ZWw5 DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7 DQoJbXNvLWxldmVsLXRhYi1zdG9wOjQuNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246 bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsN Cglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDINCgl7bXNvLWxpc3QtaWQ6MTMzMDcx OTY1ODsNCgltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTE4NTg5NDQ3MDQ7fQ0KQGxpc3QgbDI6bGV2 ZWwxDQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrv grc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOi41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlv bjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0 Ow0KCWZvbnQtZmFtaWx5OlN5bWJvbDt9DQpAbGlzdCBsMjpsZXZlbDINCgl7bXNvLWxldmVsLW51 bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Om87DQoJbXNvLWxldmVsLXRhYi1z dG9wOjEuMGluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVu dDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseToiQ291 cmllciBOZXciOw0KCW1zby1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30NCkBs aXN0IGwyOmxldmVsMw0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxl dmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDoxLjVpbjsNCgltc28tbGV2ZWwtbnVt YmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQt c2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwyOmxldmVsNA0K CXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0K CW1zby1sZXZlbC10YWItc3RvcDoyLjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxl ZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJ Zm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwyOmxldmVsNQ0KCXttc28tbGV2ZWwtbnVt YmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWIt c3RvcDoyLjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRl bnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2lu Z2RpbmdzO30NCkBsaXN0IGwyOmxldmVsNg0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxs ZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDozLjBpbjsNCglt c28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1z by1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0 IGwyOmxldmVsNw0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVs LXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDozLjVpbjsNCgltc28tbGV2ZWwtbnVtYmVy LXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6 ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwyOmxldmVsOA0KCXtt c28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1z by1sZXZlbC10YWItc3RvcDo0LjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7 DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9u dC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwyOmxldmVsOQ0KCXttc28tbGV2ZWwtbnVtYmVy LWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3Rv cDo0LjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6 LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2Rp bmdzO30NCkBsaXN0IGwzDQoJe21zby1saXN0LWlkOjIwMDk3OTQ5NDk7DQoJbXNvLWxpc3QtdGVt cGxhdGUtaWRzOi0xMjcwODMwMzcwO30NCkBsaXN0IGwzOmxldmVsMQ0KCXttc28tbGV2ZWwtbnVt YmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674K3Ow0KCW1zby1sZXZlbC10YWIt c3RvcDouNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVu dDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpTeW1i b2w7fQ0KQGxpc3QgbDM6bGV2ZWwyDQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsN Cgltc28tbGV2ZWwtdGV4dDpvOw0KCW1zby1sZXZlbC10YWItc3RvcDoxLjBpbjsNCgltc28tbGV2 ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNp LWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsNCgltc28tYmlk aS1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9DQpAbGlzdCBsMzpsZXZlbDMNCgl7bXNv LWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28t bGV2ZWwtdGFiLXN0b3A6MS41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0K CXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQt ZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMzpsZXZlbDQNCgl7bXNvLWxldmVsLW51bWJlci1m b3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6 Mi4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0u MjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5n czt9DQpAbGlzdCBsMzpsZXZlbDUNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0K CW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47DQoJbXNvLWxl dmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5z aS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMzps ZXZlbDYNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0 Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6My4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3Np dGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAu MHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMzpsZXZlbDcNCgl7bXNvLWxl dmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2 ZWwtdGFiLXN0b3A6My41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRl eHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFt aWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMzpsZXZlbDgNCgl7bXNvLWxldmVsLW51bWJlci1mb3Jt YXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6NC4w aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVp bjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9 DQpAbGlzdCBsMzpsZXZlbDkNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1z by1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6NC41aW47DQoJbXNvLWxldmVs LW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1m b250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpvbA0KCXttYXJnaW4t Ym90dG9tOjBpbjt9DQp1bA0KCXttYXJnaW4tYm90dG9tOjBpbjt9DQotLT48L3N0eWxlPjwhLS1b aWYgZ3RlIG1zbyA5XT48eG1sPg0KPG86c2hhcGVkZWZhdWx0cyB2OmV4dD0iZWRpdCIgc3BpZG1h eD0iMTAyNiIgLz4NCjwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPg0K PG86c2hhcGVsYXlvdXQgdjpleHQ9ImVkaXQiPg0KPG86aWRtYXAgdjpleHQ9ImVkaXQiIGRhdGE9 IjEiIC8+DQo8L286c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZdLS0+DQo8L2hlYWQ+DQo8Ym9k eSBsYW5nPSJFTi1VUyIgbGluaz0iYmx1ZSIgdmxpbms9InB1cnBsZSI+DQo8ZGl2IGNsYXNzPSJX b3JkU2VjdGlvbjEiPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6 ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlm JnF1b3Q7O2NvbG9yOiMxRjQ5N0QiPkhpIFZvanRlY2gsPG86cD48L286cD48L3NwYW4+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1m YW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2NvbG9yOiMx RjQ5N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkm cXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjojMUY0OTdEIj5UaGFua3MgYWdhaW4g Zm9yIHRoZSBkZWxpdmVyeSBvZiB0aGUgcGF0Y2guIEZvciByZXZpc2lvbiA3LCBkbyB5b3UgaGF2 ZSBhIGxpc3Qgb2YgY29udGVudD8gSSBoYWQgcHJldmlvdXNseSBpbmRpY2F0ZWQgSSBjb3VsZCB3 b3JrIG9uIGFkZGluZyB0aGUgcGx1Z2luIEFQSQ0KIHRvIGxhdW5jaCBhIGRpYWxvZywgYnV0IGhh ZG7igJl0IGJlZW4gYWJsZSB0byBnZXQgc3RhcnRlZCBvbiBpdCB1bnRpbCBub3cuIEkgd2FudGVk IHRvIHNlZSBpZiB5b3UgYnkgY2hhbmNlIHdlcmUgYWxyZWFkeSB3b3JraW5nIG9uIGl0IG9yIGlm IHlvdSB3ZXJlIHBsYW5uaW5nIHRvIGRlbGl2ZXIgdGhhdCB5b3Vyc2VsZiBpbiB0aGUgbmV4dCBy ZXZpc2lvbj88bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3Bh biBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7 LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48 L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTox MS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1 b3Q7O2NvbG9yOiMxRjQ5N0QiPkEgY291cGxlIG9mIG90aGVyIGl0ZW1zIHdlIGFyZSBsb29raW5n IGZvciBhcmUgdGhlIGFiaWxpdHkgdG8gYWRkIHRhc2tzIGZvciBleGVjdXRpb24gYW5kIGdldCBh Y2Nlc3MgdG8gdGhlIHNlc3Npb24gSUQgb3Igc29tZSBraW5kIG9mIGF1dGhlbnRpY2F0aW9uIHRv a2VuDQogc28gdGhhdCB3ZSBjYW4gbWFrZSBjYWxscyBmcm9tIG91ciBzZXJ2ZXIgaW50byB0aGUg UkVTVCBBUEkuIEnigJltIG5vdCB2ZXJ5IGZhbWlsaWFyIHlldCB3aXRoIHRoZSBSRVNUIEFQSSBz byBJ4oCZbSBub3Qgc3VyZSB3aGF0IGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgYXJlIGF2YWlsYWJs ZSBhbmQgd2hpY2ggd291bGQgYmUgYmVzdC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTom cXVvdDtDYWxpYnJpJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+ PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkm cXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjojMUY0OTdEIj4tQ2hyaXM8bzpwPjwv bzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxl PSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssJnF1b3Q7 c2Fucy1zZXJpZiZxdW90Oztjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48 L3A+DQo8ZGl2Pg0KPGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjQjVD NERGIDEuMHB0O3BhZGRpbmc6My4wcHQgMGluIDBpbiAwaW4iPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGFo b21hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDsiPkZyb206PC9zcGFuPjwvYj48c3BhbiBz dHlsZT0iZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseTomcXVvdDtUYWhvbWEmcXVvdDssJnF1 b3Q7c2Fucy1zZXJpZiZxdW90OyI+IGVuZ2luZS1kZXZlbC1ib3VuY2VzQG92aXJ0Lm9yZyBbbWFp bHRvOmVuZ2luZS1kZXZlbC1ib3VuY2VzQG92aXJ0Lm9yZ10NCjxiPk9uIEJlaGFsZiBPZiA8L2I+ Vm9qdGVjaCBTem9jczxicj4NCjxiPlNlbnQ6PC9iPiBUaHVyc2RheSwgT2N0b2JlciAxOCwgMjAx MiAxMDo0OSBBTTxicj4NCjxiPlRvOjwvYj4gZW5naW5lLWRldmVsPGJyPg0KPGI+U3ViamVjdDo8 L2I+IFtFbmdpbmUtZGV2ZWxdIFVJIFBsdWdpbnM6IFBvQyBwYXRjaCByZXZpc2lvbiA2IG5vdyBh dmFpbGFibGU8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05v cm1hbCIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTIuMHB0Ij48c3BhbiBzdHlsZT0iY29sb3I6Ymxh Y2siPkhpIGd1eXMsPGJyPg0KPGJyPg0KdGhlIGxhdGVzdCByZXZpc2lvbiBvZiBVSSBQbHVnaW5z IHByb29mLW9mLWNvbmNlcHQgcGF0Y2ggaXMgbm93IGF2YWlsYWJsZSBmb3IgeW91IHRvIGV4cGVy aW1lbnQgd2l0aC4gWW91IGNhbiBkb3dubG9hZCB0aGUgcGF0Y2ggZnJvbSBvVmlydCBHZXJyaXQg YXQNCjxhIGhyZWY9Imh0dHA6Ly9nZXJyaXQub3ZpcnQub3JnLyMvYy84MTIwLzIiPmh0dHA6Ly9n ZXJyaXQub3ZpcnQub3JnLyMvYy84MTIwLzI8L2E+IChwYXRjaCBzZXQgMikuPGJyPg0KPGJyPg0K UGxlYXNlIHJlYWQgb24gdG8gbGVhcm4gd2hhdCdzIG5ldyBpbiB0aGlzIHJldmlzaW9uLiBJZiB5 b3UgaGF2ZSBhbnkgY29tbWVudHMsIHF1ZXN0aW9ucyBvciBpZGVhcywgcGxlYXNlIGxldCBtZSBr bm93ITxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXYgY2xhc3M9Ik1zb05vcm1hbCIgYWxpZ249 ImNlbnRlciIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj48c3BhbiBzdHlsZT0iY29sb3I6Ymxh Y2siPg0KPGhyIHNpemU9IjIiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4NCjwvc3Bhbj48 L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJy Pg0KPHN0cm9uZz4wLiBVSSBwbHVnaW4gcGF0aCBpbmZvcm1hdGlvbiByZXNvbHZlZCB1c2luZyBs b2NhbCBFbmdpbmUgY29uZmlndXJhdGlvbjwvc3Ryb25nPjxiPjxicj4NCjwvYj48YnI+DQpTZXJ2 ZXItc2lkZSBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUgbm93IHVzZXMgbG9jYWwgKG1hY2hpbmUt c3BlY2lmaWMpIEVuZ2luZSBjb25maWd1cmF0aW9uIGluc3RlYWQgb2YgZ2xvYmFsICg8ZW0+dmRj X29wdGlvbnM8L2VtPiBkYXRhYmFzZSB0YWJsZSkgRW5naW5lIGNvbmZpZ3VyYXRpb246PG86cD48 L286cD48L3NwYW4+PC9wPg0KPHVsIHR5cGU9ImRpc2MiPg0KPGxpIGNsYXNzPSJNc29Ob3JtYWwi IHN0eWxlPSJjb2xvcjpibGFjazttc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJv dHRvbS1hbHQ6YXV0bzttc28tbGlzdDpsMyBsZXZlbDEgbGZvMSI+DQpQcmV2aW91c2x5LCBwYXRo IGluZm9ybWF0aW9uIHdhcyByZXNvbHZlZCB0aHJvdWdoIG9yZy5vdmlydC5lbmdpbmUuY29yZS5j b21tb24uY29uZmlnLkNvbmZpZyBjbGFzcyAtIEVuZ2luZSBjb25maWd1cmF0aW9uIHZhbHVlcyB3 ZXJlIHJldHJpZXZlZCBmcm9tDQo8aT52ZGNfb3B0aW9uczwvaT4gZGF0YWJhc2UgdGFibGUuPG86 cD48L286cD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6YmxhY2s7bXNv LW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87bXNvLWxpc3Q6 bDMgbGV2ZWwxIGxmbzEiPg0KQ3VycmVudGx5LCBwYXRoIGluZm9ybWF0aW9uIGlzIHJlc29sdmVk IHRocm91Z2ggb3JnLm92aXJ0LmVuZ2luZS5jb3JlLnV0aWxzLkxvY2FsQ29uZmlnIGNsYXNzIC0g RW5naW5lIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZSByZXRyaWV2ZWQgZnJvbSBsb2NhbCBmaWxl IHN5c3RlbS48bzpwPjwvbzpwPjwvbGk+PC91bD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxl PSJtYXJnaW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5JbiBjYXNl IHlvdSdyZSBub3Qgd29ya2luZyB3aXRoIG9WaXJ0IEVuZ2luZSB0aHJvdWdoIFJQTSBwYWNrYWdl IHN5c3RlbSwgZS5nLiB5b3UgaGF2ZSBhIGxvY2FsIGRldmVsb3BtZW50IGVudmlyb25tZW50IHNl dCB1cCBhbmQgeW91IGJ1aWxkIGFuZCBkZXBsb3kgb1ZpcnQgRW5naW5lIHRocm91Z2ggTWF2ZW4s IHBsZWFzZQ0KIGZvbGxvdyB0aGVzZSBzdGVwczo8YnI+DQo8YnI+DQphLiBDb3B5IGRlZmF1bHQg RW5naW5lIGNvbmZpZ3VyYXRpb24gaW50byAvdXNyL3NoYXJlLzxiPm92aXJ0LWVuZ2luZTwvYj4v Y29uZjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OjMwLjBw dCI+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPiMgbWtkaXIgLXAgL3Vzci9zaGFyZS9vdmly dC1lbmdpbmUvY29uZjxicj4NCiMgY3AgJmx0O09WSVJUX0hPTUUmZ3Q7L2JhY2tlbmQvbWFuYWdl ci9jb25mL2VuZ2luZS5jb25mLmRlZmF1bHRzIC91c3Ivc2hhcmUvb3ZpcnQtZW5naW5lL2NvbmYv ZW5naW5lLmNvbmYuZGVmYXVsdHM8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9 ImNvbG9yOmJsYWNrIj48YnI+DQpiLiBJZiBuZWNlc3NhcnksIGNvcHkgVUkgcGx1Z2luIGRhdGEg ZmlsZXMgZnJvbSAvdXNyL3NoYXJlL2VuZ2luZS91aS1wbHVnaW5zIHRvIC91c3Ivc2hhcmUvPGI+ b3ZpcnQtZW5naW5lPC9iPi91aS1wbHVnaW5zPGJyPg0KPGJyPg0KYy4gSWYgbmVjZXNzYXJ5LCBj b3B5IFVJIHBsdWdpbiBjb25maWcgZmlsZXMgZnJvbSAvZXRjL2VuZ2luZS91aS1wbHVnaW5zIHRv IC9ldGMvPGI+b3ZpcnQtZW5naW5lPC9iPi91aS1wbHVnaW5zPGJyPg0KPGJyPg0KZCwgSW4gY2Fz ZSB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBFbmdpbmUgY29uZmlndXJhdGlvbiwg cHV0IHlvdXIgY3VzdG9tIHByb3BlcnR5IGZpbGUgaW50byAvZXRjL3N5c2NvbmZpZy9vdmlydC1l bmdpbmU8YnI+DQo8YnI+DQpUaGUgcmVhc29uIGJlaGluZCB0aGlzIGNoYW5nZSBpcyB0aGF0IHBh dGggaW5mb3JtYXRpb24gZm9yIFVJIHBsdWdpbiBkYXRhIGFuZCBjb25maWd1cmF0aW9uIGlzIHR5 cGljYWxseSBtYWNoaW5lLXNwZWNpZmljLCBhbmQgc2hvdWxkIGJlIGN1c3RvbWl6YWJsZSBwZXIg bWFjaGluZSB0aHJvdWdoIEVuZ2luZSBsb2NhbCBjb25maWd1cmF0aW9uLjxvOnA+PC9vOnA+PC9z cGFuPjwvcD4NCjxkaXYgY2xhc3M9Ik1zb05vcm1hbCIgYWxpZ249ImNlbnRlciIgc3R5bGU9InRl eHQtYWxpZ246Y2VudGVyIj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPg0KPGhyIHNpemU9IjIi IHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4NCjwvc3Bhbj48L2Rpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPGI+MS4gTmV3IHBsdWdp biBBUEkgZnVuY3Rpb246IGFkZE1haW5UYWJBY3Rpb25CdXR0b248YnI+DQo8L2I+PGJyPg0KVGhl ICZxdW90O2FkZE1haW5UYWJBY3Rpb25CdXR0b24mcXVvdDsgQVBJIGFkZHMgY3VzdG9tIGNvbnRl eHQtc2Vuc2l0aXZlIGJ1dHRvbiB0byB0aGUgZ2l2ZW4gbWFpbiB0YWIncyBkYXRhIGdyaWQsIGFs b25nIHdpdGggY29ycmVzcG9uZGluZyBkYXRhIGdyaWQgY29udGV4dCBtZW51IGl0ZW0uPGJyPg0K PGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZx dW90Oztjb2xvcjpibGFjayI+YWRkTWFpblRhYkFjdGlvbkJ1dHRvbihlbnRpdHlUeXBlTmFtZSwg bGFiZWwsIGFjdGlvbkJ1dHRvbkludGVyZmFjZSk8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOmJsYWNrIj48YnI+DQo8aT5lbnRpdHlUeXBlTmFtZTwvaT4gaW5kaWNhdGVzIHdoaWNoIG1h aW4gdGFiJ3MgZGF0YSBncmlkIHRoZSBidXR0b24gc2hvdWxkIGJlIGFkZGVkIHRvLCBhY2NvcmRp bmcgdG8gdGhlIGVudGl0eSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFpbiB0YWIuPGk+IGVu dGl0eVR5cGVOYW1lPC9pPiB2YWx1ZXMgYXJlIHN0cmluZ3MgcmVmbGVjdGluZyBvcmcub3ZpcnQu ZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5lbnRpdHlFbnRpdHlUeXBlIGVudW0NCiBtZW1iZXJz LiBGb2xsb3dpbmcgPGk+ZW50aXR5VHlwZU5hbWU8L2k+IHZhbHVlcyBhcmUgY3VycmVudGx5IHN1 cHBvcnRlZCAodmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZSk6ICZxdW90O0RhdGFDZW50ZXImcXVv dDssICZxdW90O0NsdXN0ZXImcXVvdDssICZxdW90O0hvc3QmcXVvdDssICZxdW90O1N0b3JhZ2Um cXVvdDssICZxdW90O0Rpc2smcXVvdDssICZxdW90O1ZpcnR1YWxNYWNoaW5lJnF1b3Q7LCAmcXVv dDtUZW1wbGF0ZSZxdW90Oy48YnI+DQo8YnI+DQpOb3RlOiAmcXVvdDtQb29sJnF1b3Q7IHZhbHVl IGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIG9mIG9yZy5vdmlydC5lbmdpbmUu Y29yZS5jb21tb24uYnVzaW5lc3NlbnRpdGllcy52bV9wb29scyBlbnRpdHkgbm90IGltcGxlbWVu dGluZyB0aGUgQnVzaW5lc3NFbnRpdHkgaW50ZXJmYWNlLCBub3Qgc3VyZSB3aHkgdGhvdWdoLiBN YXliZSB3ZSBzaG91bGQgc3dpdGNoIGZyb20gQnVzaW5lc3NFbnRpdHkgdG8gSVZkY1F1ZXJ5YWJs ZSBpbnRlcmZhY2UNCiBhbmQgYWx3YXlzIGNhc3QgZ2V0UXVlcnlhYmxlSWQgbWV0aG9kIHJlc3Vs dCB2YWx1ZSB0byBHdWlkPzxicj4NCjxicj4NCjxpPmxhYmVsPC9pPiBpcyB0aGUgdGl0bGUgZGlz cGxheWVkIG9uIHRoZSBidXR0b248aT4uPGJyPg0KPC9pPjxicj4NCjxpPmFjdGlvbkJ1dHRvbklu dGVyZmFjZTwvaT4gcmVwcmVzZW50cyBhbiBvYmplY3QgdGhhdCAmcXVvdDtpbXBsZW1lbnRzIHRo ZSBidXR0b24gaW50ZXJmYWNlJnF1b3Q7IGJ5IGRlY2xhcmluZyBpdHMgZnVuY3Rpb25zOg0KPGk+ b25DbGljazwvaT4sIDxpPmlzRW5hYmxlZDwvaT4sIDxpPmlzQWNjZXNzaWJsZTwvaT4uIEFsbCBm dW5jdGlvbnMgb2YgPGk+YWN0aW9uQnV0dG9uSW50ZXJmYWNlPC9pPiByZWNlaXZlIGN1cnJlbnRs eSBzZWxlY3RlZCBpdGVtKHMpIGFzIGZ1bmN0aW9uIGFyZ3VtZW50cy48YnI+DQo8YnI+DQpMZXQn cyB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgdGhlIGNvbmNlcHQgYmVoaW5kIDxpPmFjdGlvbkJ1dHRv bkludGVyZmFjZTwvaT4uIEluIHRyYWRpdGlvbmFsIGNsYXNzLWJhc2VkIG9iamVjdC1vcmllbnRl ZCBsYW5ndWFnZXMsIHN1Y2ggYXMgSmF2YSwgaW50ZXJmYWNlIGlzIGFuIGFic3RyYWN0IHR5cGUg dGhhdCBjb250YWlucyBtZXRob2QgZGVjbGFyYXRpb25zIHdpdGhvdXQgYW4gaW1wbGVtZW50YXRp b24uIEEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzDQogdGhlIGdpdmVuIGludGVyZmFjZSBtdXN0IGlt cGxlbWVudCBhbGwgbWV0aG9kcyBkZWNsYXJlZCBieSB0aGF0IGludGVyZmFjZSAodW5sZXNzIGl0 J3MgYW4gYWJzdHJhY3QgY2xhc3MsIGJ1dCB0aGlzIGlzbid0IHJlbGV2YW50IGluIG91ciBjYXNl KS48YnI+DQo8YnI+DQpJbiBjb250cmFzdCB3aXRoIHRyYWRpdGlvbmFsIGNsYXNzLWJhc2VkIG9i amVjdC1vcmllbnRlZCBsYW5ndWFnZXMsIEphdmFTY3JpcHQgc3VwcG9ydHMgT09QIHRocm91Z2gg cHJvdG90eXBlLWJhc2VkIHByb2dyYW1taW5nIG1vZGVsICg8YSBocmVmPSJodHRwczovL2RldmVs b3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0phdmFTY3JpcHQvSW50cm9kdWN0aW9uX3RvX09i amVjdC1PcmllbnRlZF9KYXZhU2NyaXB0Ij5odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9l bi1VUy9kb2NzL0phdmFTY3JpcHQvSW50cm9kdWN0aW9uX3RvX09iamVjdC1PcmllbnRlZF9KYXZh U2NyaXB0PC9hPikuDQogQXQgdGhlIHNhbWUgdGltZSwgSmF2YVNjcmlwdCBsYW5ndWFnZSBpcyBk eW5hbWljYWxseS10eXBlZCBhbmQgdGhlcmVmb3JlIGRvZXNuJ3Qgc3VwcG9ydCB0cmFkaXRpb25h bCBjb25jZXB0IG9mIGludGVyZmFjZSBpbiBPT1AsIGl0IHVzZXMgJnF1b3Q7ZHVjayB0eXBpbmcm cXVvdDsgdGVjaG5pcXVlIGluc3RlYWQgKDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3Jn L3dpa2kvRHVja190eXBpbmciPmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRHVja190eXBp bmc8L2E+KS48YnI+DQo8YnI+DQpUaGUgc2ltcGxlc3Qgd2F5IHRvIHByb3ZpZGUgYW4gb2JqZWN0 IHRoYXQgJnF1b3Q7aW1wbGVtZW50cyB0aGUgZ2l2ZW4gaW50ZXJmYWNlJnF1b3Q7IGluIEphdmFT Y3JpcHQgaXMgdG8gdXNlICZxdW90O2R1Y2sgdHlwaW5nJnF1b3Q7IHRlY2huaXF1ZTogcHJvdmlk aW5nIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHdlbGwta25vd24gZnVuY3Rpb25zLiBJbiBVSSBw bHVnaW4gaW5mcmFzdHJ1Y3R1cmUsIEkgY2FsbCB0aGlzIGNvbmNlcHQgJnF1b3Q7aW50ZXJmYWNl IG9iamVjdCZxdW90OywgcmVwcmVzZW50ZWQNCiBieSBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFk bWluLnBsdWdpbi5qc25pLkpzSW50ZXJmYWNlT2JqZWN0IGNsYXNzLiBVbmxpa2UgdGhlIHRyYWRp dGlvbmFsIGNvbmNlcHQgb2YgaW50ZXJmYWNlIGFic3RyYWN0IHR5cGUgaW4gb2JqZWN0LW9yaWVu dGVkIGxhbmd1YWdlcywgYW4gJnF1b3Q7aW50ZXJmYWNlIG9iamVjdCZxdW90Ow0KPHU+ZG9lcyBu b3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBkZWNsYXJlIGFsbCBmdW5jdGlvbnMgb2YgdGhlIGdpdmVu IGludGVyZmFjZTwvdT4gaW4gb3JkZXIgdG8gJnF1b3Q7aW1wbGVtZW50JnF1b3Q7IHN1Y2ggaW50 ZXJmYWNlLiBJbiBmYWN0LCBhbiBlbXB0eSBvYmplY3QgY2FuIGJlIHVzZWQgYXMgYSB2YWxpZCAm cXVvdDtpbnRlcmZhY2Ugb2JqZWN0JnF1b3Q7LiBNaXNzaW5nIGZ1bmN0aW9ucyB3aWxsIGJlIHNp bXBseSB0cmVhdGVkIGFzIGVtcHR5IChuby1vcCkgZnVuY3Rpb25zLg0KIEZ1cnRoZXJtb3JlLCBh biAmcXVvdDtpbnRlcmZhY2Ugb2JqZWN0JnF1b3Q7IGNhbiAmcXVvdDtpbXBsZW1lbnQmcXVvdDsg bXVsdGlwbGUgaW50ZXJmYWNlcyBieSBkZWNsYXJpbmcgZnVuY3Rpb25zIG9mIHRob3NlIGludGVy ZmFjZXMgKGludGVyZmFjZSBjb21wb3NpdGlvbikuPGJyPg0KPGJyPg0KR2V0dGluZyBiYWNrIHRv ICZxdW90O2FkZE1haW5UYWJBY3Rpb25CdXR0b24mcXVvdDsgQVBJLCBoZXJlJ3MgYSBzYW1wbGUg Y29kZSB0aGF0IGFkZHMgbmV3IGJ1dHRvbiB0byAmcXVvdDtIb3N0JnF1b3Q7IG1haW4gdGFiIGRh dGEgZ3JpZCwgYXMgcGFydCBvZiBVaUluaXQgZXZlbnQgaGFuZGxlciBmdW5jdGlvbjo8YnI+DQo8 YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1 b3Q7O2NvbG9yOmJsYWNrIj5VaUluaXQ6IDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1mYW1p bHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Izk5MDAwMCI+ZnVuY3Rpb248L3NwYW4+ PC9iPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xv cjpibGFjayI+KCkgezxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyBhcGkuPC9zcGFuPjxzcGFuIHN0 eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojQ0MzM0NDIj5h ZGRNYWluVGFiQWN0aW9uQnV0dG9uPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVv dDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+KCdIb3N0JywgJ1NpbmdsZS1Ib3N0IEFj dGlvbicsPGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtD b3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsgLy8gQWN0aW9uIGJ1dHRvbiBpbnRlcmZhY2Ugb2JqZWN0PGJyPg0K Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIEFsbCBmdW5jdGlv bnMgcmVjZWl2ZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbShzKSBhcyBmdW5jdGlvbiBhcmd1bWVu dHM8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3 JnF1b3Q7O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsgezwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxicj4NCjwvc3Bh bj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6 IzAwNjYwMCI+Jm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsgLy8gQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBidXR0b248L3NwYW4+ PHNwYW4gc3R5bGU9ImNvbG9yOiMwMDY2MDAiPjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9u dC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPiZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7ICZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5 bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDAwOTkiPm9u Q2xpY2s8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1 b3Q7O2NvbG9yOmJsYWNrIj46DQo8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZx dW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiM5OTAwMDAiPmZ1bmN0aW9uPC9zcGFuPjwvYj48 c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Ymxh Y2siPigpIHs8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJp ZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7ICZuYnNwOyAvLyBDYWxsaW5n ICdhcmd1bWVudHNbMF0nIGlzIHNhZmUsIGJlY2F1c2Ugb25DbGljaygpIGNhbiBiZSBjYWxsZWQ8 YnI+DQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAvLyBvbmx5IHdoZW4gZXhhY3RseSBvbmUgaXRl bSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgaW4gdGhlIGRhdGEgZ3JpZDxicj4NCjwvc3Bhbj48c3Bh biBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2si PiZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHdpbmRvdy5hbGVydCgnU2VsZWN0ZWQgaG9zdCBlbnRp dHkgSUQgPSAnICYjNDM7IGFyZ3VtZW50c1swXS5lbnRpdHlJZCk7PGJyPg0KJm5ic3A7ICZuYnNw OyAmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7IH0sPC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZh bWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4mbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gUmV0dXJuaW5nICd0cnVl JyBtZWFucyB0aGUgYnV0dG9uIGlzIGVuYWJsZWQgKGNsaWNrYWJsZSk8L3NwYW4+PHNwYW4gc3R5 bGU9ImNvbG9yOiMwMDY2MDAiPjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6 JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IC8vIFJldHVybmluZyAnZmFsc2UnIG1l YW5zIHRoZSBidXR0b24gaXMgZGlzYWJsZWQgKG5vbi1jbGlja2FibGUpPGJyPg0KJm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 IC8vIERlZmF1bHQgdmFsdWUgPSAndHJ1ZSc8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsm bmJzcDsgJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuIHN0eWxl PSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDAwMDk5Ij5pc0Vu YWJsZWQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1 b3Q7O2NvbG9yOmJsYWNrIj46DQo8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZx dW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiM5OTAwMDAiPmZ1bmN0aW9uPC9zcGFuPjwvYj48 c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Ymxh Y2siPigpIHs8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJp ZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7IC8vIEVu YWJsZSBidXR0b24gb25seSB3aGVuIGV4YWN0bHkgb25lIGl0ZW0gaXMgc2VsZWN0ZWQ8YnI+DQo8 L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2Nv bG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+DQo8Yj48c3BhbiBzdHls ZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Izk5MDAwMCI+cmV0 dXJuPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcm cXVvdDs7Y29sb3I6YmxhY2siPiBhcmd1bWVudHMubGVuZ3RoID09IDE7PGJyPg0KJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyB9LDwvc3Bhbj48c3BhbiBzdHls ZT0iY29sb3I6YmxhY2siPjxicj4NCjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1p bHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgJm5ic3A7IC8vIFJldHVybmluZyAndHJ1ZScg bWVhbnMgdGhlIGJ1dHRvbiBpcyB2aXNpYmxlPGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIFJldHVybmluZyAn ZmFsc2UnIG1lYW5zIHRoZSBidXR0b24gaXMgaGlkZGVuPGJyPg0KJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIERlZmF1bHQgdmFsdWUgPSAndHJ1 ZSc8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3 JnF1b3Q7O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBO ZXcmcXVvdDs7Y29sb3I6IzAwMDA5OSI+aXNBY2Nlc3NpYmxlPC9zcGFuPjxzcGFuIHN0eWxlPSJm b250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+Og0KPC9zcGFu PjxiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xv cjojOTkwMDAwIj5mdW5jdGlvbjwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZx dW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4oKSB7PC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjpibGFjayI+PGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVv dDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsgLy8g QWx3YXlzIHNob3cgdGhlIGJ1dHRvbiBpbiB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGdyaWQ8YnI+ DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7 O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+DQo8Yj48c3BhbiBz dHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Izk5MDAwMCI+ cmV0dXJuPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBO ZXcmcXVvdDs7Y29sb3I6YmxhY2siPg0KPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSJmb250LWZhbWls eTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojOTkwMDAwIj50cnVlPC9zcGFuPjwvYj48 c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Ymxh Y2siPjs8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7IH08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8 L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2Nv bG9yOmJsYWNrIj48YnI+DQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgfTxicj4NCjxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyApOzxicj4NCn08L3NwYW4+PHNwYW4g c3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8YnI+DQpBcyBtZW50aW9uZWQgYWJvdmUsIGFsbCBm dW5jdGlvbnMgb2YgYW4gaW50ZXJmYWNlIG9iamVjdCBhcmUgb3B0aW9uYWwuIEZvciBmdW5jdGlv bnMgZXhwZWN0aW5nIHJldHVybiB2YWx1ZSwgZGVmYXVsdCB2YWx1ZSBpcyBkZWZpbmVkIGJ5IFVJ IHBsdWdpbiBpbmZyYXN0cnVjdHVyZS4gRm9yIGV4YW1wbGU6PG86cD48L286cD48L3NwYW4+PC9w Pg0KPHVsIHR5cGU9ImRpc2MiPg0KPGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjpi bGFjazttc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bztt c28tbGlzdDpsMiBsZXZlbDEgbGZvMiI+DQpvbkNsaWNrIC0gbm8gZGVmYXVsdCB2YWx1ZSAobm8g cmV0dXJuIHZhbHVlIGV4cGVjdGVkKTxvOnA+PC9vOnA+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1h bCIgc3R5bGU9ImNvbG9yOmJsYWNrO21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4t Ym90dG9tLWFsdDphdXRvO21zby1saXN0OmwyIGxldmVsMSBsZm8yIj4NCmlzRW5hYmxlZCAvIGlz QWNjZXNzaWJsZSAtIGRlZmF1bHQgdmFsdWUgJnF1b3Q7dHJ1ZSZxdW90OyAoYm9vbGVhbiByZXR1 cm4gdmFsdWUgZXhwZWN0ZWQpPG86cD48L286cD48L2xpPjwvdWw+DQo8cD48c3BhbiBzdHlsZT0i Y29sb3I6YmxhY2siPk5vdGU6IFVJIHBsdWdpbiBpbmZyYXN0cnVjdHVyZSBjaGVja3MgdGhlIGFj dHVhbCByZXR1cm4gdmFsdWUgdHlwZSwgYW5kIHVzZXMgZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIHRo ZSBmdW5jdGlvbiByZXR1cm5lZCBzb21ldGhpbmcgb2Ygd3JvbmcgKHVuZXhwZWN0ZWQpIHR5cGUu PG86cD48L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdp bi1ib3R0b206MTIuMHB0Ij48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCkluIHRoZSBl eGFtcGxlIGFib3ZlLCAmcXVvdDtjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbShzKSZxdW90OyBtYXBz IHRvIEpTT04tbGlrZSByZXByZXNlbnRhdGlvbnMgb2YgYnVzaW5lc3MgZW50aXRpZXMgY3VycmVu dGx5IHNlbGVjdGVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgZ3JpZC4gRm9yIG5vdywgdGhl IGVudGl0eSByZXByZXNlbnRhdGlvbiBpcyBxdWl0ZSBzaW1wbGUgYW5kIHNhbWUgZm9yIGFsbCBl bnRpdHkgdHlwZXM6PGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTom cXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+eyBlbnRpdHlJZDogJnF1b3Q7W0J1 c2luZXNzRW50aXR5R3VpZEFzU3RyaW5nXSZxdW90OyB9PGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjpibGFjayI+PGJyPg0KSW4gZnV0dXJlLCB3ZSB3aWxsIGNyZWF0ZSBzcGVjaWZpYyBK U09OLWxpa2UgcmVwcmVzZW50YXRpb25zIGZvciBzcGVjaWZpYyBidXNpbmVzcyBlbnRpdGllcywg aW4gY29tcGxpYW5jZSB3aXRoIEVuZ2luZSBSRVNUIEFQSSBlbnRpdHkgc3RydWN0dXJlLjxicj4N Cjxicj4NCkZvciBhIG1vcmUgZXh0ZW5zaXZlIGV4YW1wbGUgb2YgdXNpbmcgJnF1b3Q7YWRkTWFp blRhYkFjdGlvbkJ1dHRvbiZxdW90OyBBUEksIHBsZWFzZSBzZWUgdGhlIGF0dGFjaGVkICZxdW90 O2FkZE1haW5UYWJBY3Rpb25CdXR0b24uaHRtbC5leGFtcGxlJnF1b3Q7IGZpbGUuPG86cD48L286 cD48L3NwYW4+PC9wPg0KPGRpdiBjbGFzcz0iTXNvTm9ybWFsIiBhbGlnbj0iY2VudGVyIiBzdHls ZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+DQo8aHIgc2l6 ZT0iMiIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPg0KPC9zcGFuPjwvZGl2Pg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8Yj4yLiBJbXBy b3ZlZCBwbHVnaW4gQVBJIGZ1bmN0aW9uOiBhZGRNYWluVGFiPGJyPg0KPC9iPjxicj4NClRoZSAm cXVvdDthZGRNYWluVGFiJnF1b3Q7IEFQSSB3YXMgaW1wcm92ZWQgdG8gYWRkcmVzcyBmb2xsb3dp bmcgaXNzdWVzOjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjx1bCB0eXBlPSJkaXNjIj4NCjxsaSBj bGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6YmxhY2s7bXNvLW1hcmdpbi10b3AtYWx0OmF1 dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87bXNvLWxpc3Q6bDEgbGV2ZWwxIGxmbzMiPg0K JnF1b3Q7YWRkTWFpblRhYiZxdW90OyBjYW4gbm93IGJlIGNhbGxlZCBhdCBhbnkgbW9tZW50IGR1 cmluZyBVSSBwbHVnaW4gcnVudGltZSwgZ2l2ZW4gdGhhdCB0aGUgcGx1Z2luIGlzIGFsbG93ZWQg aW52b2tlIHBsdWdpbiBBUEkgZnVuY3Rpb25zIChwbHVnaW4gaXMgZWl0aGVyIElOSVRJQUxJWklO RyBvciBJTl9VU0UpLjxicj4NClByZXZpb3VzbHksICZxdW90O2FkZE1haW5UYWImcXVvdDsgd29y a2VkIHJlbGlhYmx5IG9ubHkgd2hlbiBjYWxsZWQgZnJvbSB3aXRoaW4gVWlJbml0IGV2ZW50IGhh bmRsZXIgZnVuY3Rpb24uPGJyPg0KQ3VycmVudGx5LCBpdCdzIHBvc3NpYmxlIHRvIGNhbGwgJnF1 b3Q7YWRkTWFpblRhYiZxdW90OyBhdCBhbnkgbW9tZW50LCBlLmcuIGZyb20gd2l0aGluIHNvbWUg b3RoZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvbiAoYWZ0ZXIgVWlJbml0IGhhcyBjb21wbGV0ZWQp LjxvOnA+PC9vOnA+PC9saT48L3VsPg0KPHVsIHR5cGU9ImRpc2MiPg0KPGxpIGNsYXNzPSJNc29O b3JtYWwiIHN0eWxlPSJjb2xvcjpibGFjazttc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFy Z2luLWJvdHRvbS1hbHQ6YXV0bzttc28tbGlzdDpsMCBsZXZlbDEgbGZvNCI+DQomcXVvdDthZGRN YWluVGFiJnF1b3Q7IG5vdyByZXRhaW5zICZxdW90O2FjdGl2ZSZxdW90OyB0YWIgKGhpZ2hsaWdo dGVkIHRhYiBHVUkpLjxicj4NCiZxdW90O2FkZE1haW5UYWImcXVvdDsgd29ya3MgYnkgYWRkaW5n IG5ldyB0YWIgY29tcG9uZW50IChHV1RQIHByZXNlbnRlciBwcm94eSkgYW5kIHJlZnJlc2hpbmcg bWFpbiB0YWIgcGFuZWwgR1VJIGJ5IHJlbW92aW5nIGFsbCByZWxhdGVkIHRhYnMgYW5kIHJlLWFk ZGluZyB0aGVtIGFnYWluLjxicj4NClRoaXMgbG9naWMgaXMgaGFuZGxlZCBieSBvcmcub3ZpcnQu ZW5naW5lLnVpLmNvbW1vbi5wcmVzZW50ZXIuRHluYW1pY1RhYkNvbnRhaW5lclByZXNlbnRlciBj bGFzcywgd2hpY2ggbWFrZXMgc3VyZSB0aGF0ICZxdW90O2FjdGl2ZSZxdW90OyB0YWIgaXMgcmV0 YWluZWQgZXZlbiBhZnRlciBtYWluIHRhYiBwYW5lbCB3YXMgcmVmcmVzaGVkLjxvOnA+PC9vOnA+ PC9saT48L3VsPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTIu MHB0Ij48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkZ1cnRoZXJtb3JlLCBjdXN0b20gbWFpbiB0 YWIgaW1wbGVtZW50YXRpb24gbm93IGRpc3BsYXlzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBV UkwgdGhyb3VnaCBIVE1MIGlmcmFtZSBlbGVtZW50LjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxk aXYgY2xhc3M9Ik1zb05vcm1hbCIgYWxpZ249ImNlbnRlciIgc3R5bGU9InRleHQtYWxpZ246Y2Vu dGVyIj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPg0KPGhyIHNpemU9IjIiIHdpZHRoPSIxMDAl IiBhbGlnbj0iY2VudGVyIj4NCjwvc3Bhbj48L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0 eWxlPSJtYXJnaW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+ DQo8Yj4zLiBJbXByb3ZlZCBuYXRpdmUgSmF2YVNjcmlwdCBmdW5jdGlvbiBoYW5kbGluZzwvYj4g KEdXVCBKU05JKTxicj4NCjxicj4NClRoaXMgcGF0Y2ggaW50cm9kdWNlcyBvcmcub3ZpcnQuZW5n aW5lLnVpLndlYmFkbWluLnBsdWdpbi5qc25pLkpzRnVuY3Rpb24gYW5kIG9yZy5vdmlydC5lbmdp bmUudWkud2ViYWRtaW4ucGx1Z2luLmpzbmkuSnNGdW5jdGlvblJlc3VsdEhlbHBlciBjbGFzc2Vz IHByb3ZpZGluZyBKYXZhIGFic3RyYWN0aW9uIGZvciBpbnZva2luZyBuYXRpdmUgSmF2YVNjcmlw dCBmdW5jdGlvbnMuIFRoZXNlIGNsYXNzZXMgZm9sbG93IHRoZSBnZW5lcmFsIGNvbnRyYWN0DQog b2YgJnF1b3Q7aW50ZXJmYWNlIG9iamVjdCZxdW90OyBhcyBtZW50aW9uZWQgYWJvdmUuPGJyPg0K PGJyPg0KSnNGdW5jdGlvblJlc3VsdEhlbHBlciBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4g ZGVhbGluZyB3aXRoIGZ1bmN0aW9ucyB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gcmV0dXJuIHZhbHVl IG9mIGEgY2VydGFpbiB0eXBlLiBUb28gYmFkIHN0YW5kYXJkIEdXVCBKU05JIGNsYXNzZXMgZG9u J3QgcHJvdmlkZSBzdWNoIGFic3RyYWN0aW9uIGZvciB3b3JraW5nIHdpdGggbmF0aXZlIGZ1bmN0 aW9ucyBvdXQtb2YtdGhlLWJveC4uLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXYgY2xhc3M9 Ik1zb05vcm1hbCIgYWxpZ249ImNlbnRlciIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj48c3Bh biBzdHlsZT0iY29sb3I6YmxhY2siPg0KPGhyIHNpemU9IjIiIHdpZHRoPSIxMDAlIiBhbGlnbj0i Y2VudGVyIj4NCjwvc3Bhbj48L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJn aW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8Yj40LiBB Y3Rpb25QYW5lbCBhbmQgQWN0aW9uVGFibGUgdHlwZSBoaWVyYXJjaHkgcmVmYWN0b3Jpbmc8L2I+ IChyZWxhdGVkIHRvICZxdW90O2FkZE1haW5UYWJBY3Rpb25CdXR0b24mcXVvdDsgQVBJKTxiPjxi cj4NCjwvYj48YnI+DQpQcmV2aW91c2x5LCBBYnN0cmFjdEFjdGlvblBhbmVsIGFuZCBBYnN0cmFj dEFjdGlvblRhYmxlIGNsYXNzZXMgZGlkbid0IGltcGxlbWVudCBhbnkgcmVhc29uYWJsZSBpbnRl cmZhY2UgdGhhdCB3b3VsZCBhbGxvdyBvdGhlciBjb21wb25lbnRzIChjbGllbnQtc2lkZSBVSSBw bHVnaW4gaW5mcmFzdHJ1Y3R1cmUpIHRvIGRlcGVuZCBvbiB0aGVpciBmdW5jdGlvbmFsaXR5IGlu IGEgbG9vc2VseS1jb3VwbGVkIG1hbm5lci4gVGhpcyB3b3VsZCBtYWtlDQogY29kZSB0aGF0IGlt cGxlbWVudHMgJnF1b3Q7YWRkTWFpblRhYkFjdGlvbkJ1dHRvbiZxdW90OyBBUEkgJnF1b3Q7dWds eSZxdW90OzogbWFpbiB0YWIgdmlldyBpbnRlcmZhY2Ugd291bGQgaGF2ZSB0byByZWZlcmVuY2Ug QWJzdHJhY3RBY3Rpb25UYWJsZSBjbGFzcyBkaXJlY3RseS4gSW4gTVZQIGRlc2lnbiBwYXR0ZXJu LCB2aWV3IGludGVyZmFjZSBzaG91bGQgYXZvaWQgcmVmZXJlbmNpbmcgc3BlY2lmaWMgR1dUIFdp ZGdldCBjbGFzc2VzIGRpcmVjdGx5Ljxicj4NCjxicj4NClRoaXMgcGF0Y2ggaW50cm9kdWNlcyBu ZXcgaW50ZXJmYWNlcyBmb3IgQWN0aW9uUGFuZWwgYW5kIEFjdGlvblRhYmxlIGNvbXBvbmVudHMg d2hpbGUgZWxpbWluYXRpbmcgY29kZSByZWR1bmRhbmN5IChkdXBsaWNhdGUgb3IgdW5uZWNlc3Nh cnkgY29kZSkuPG86cD48L286cD48L3NwYW4+PC9wPg0KPGRpdiBjbGFzcz0iTXNvTm9ybWFsIiBh bGlnbj0iY2VudGVyIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0eWxlPSJjb2xv cjpibGFjayI+DQo8aHIgc2l6ZT0iMiIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPg0KPC9z cGFuPjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTIu MHB0Ij48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxiPjUuIEFjdGlvblBhbmVsIHR5 cGUgaGllcmFyY2h5IHJlZmFjdG9yaW5nPC9iPiAocmVsYXRlZCB0byAmcXVvdDthZGRNYWluVGFi JnF1b3Q7IEFQSSk8YnI+DQo8YnI+DQpTaW5jZSBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi5w cmVzZW50ZXIuRHluYW1pY1RhYkNvbnRhaW5lclByZXNlbnRlciBkZWZpbmVzIG5ldyBEeW5hbWlj VGFiUGFuZWwgaW50ZXJmYWNlIHRoYXQgZXh0ZW5kcyBzdGFuZGFyZCBHV1RQIFRhYlBhbmVsIGlu dGVyZmFjZSwgc29tZSByZWZhY3RvcmluZyBoYWQgdG8gYmUgZG9uZSBpbiByZWxhdGVkIEFjdGlv blBhbmVsIGNsYXNzZXMuPGJyPg0KPGJyPg0KVGhpcyBwYXRjaCBtYWtlcyBzdXJlIHRoYXQgYm90 aCBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi53aWRnZXQudGFiLkFic3RyYWN0VGFiUGFuZWwg KHdpZGdldCkgYW5kIG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLnZpZXcuQWJzdHJhY3RUYWJQ YW5lbFZpZXcgKHZpZXcpIHN1cHBvcnQgRHluYW1pY1RhYlBhbmVsIGludGVyZmFjZS48YnI+DQo8 YnI+DQpOb3RlIHRoYXQgZm9yIG5vdywgb25seSBtYWluIHRhYiBwYW5lbCAob3JnLm92aXJ0LmVu Z2luZS51aS53ZWJhZG1pbi5zZWN0aW9uLm1haW4ucHJlc2VudGVyLk1haW5UYWJQYW5lbFByZXNl bnRlcikgc3VwcG9ydHMgZHluYW1pYyB0YWJzIHdpdGhpbiBpdHMgdmlldy48bzpwPjwvbzpwPjwv c3Bhbj48L3A+DQo8ZGl2IGNsYXNzPSJNc29Ob3JtYWwiIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJ0 ZXh0LWFsaWduOmNlbnRlciI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4NCjxociBzaXplPSIy IiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+DQo8L3NwYW4+PC9kaXY+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMi4wcHQiPjxzcGFuIHN0eWxlPSJjb2xv cjpibGFjayI+PGJyPg0KPGI+V2hlcmUgaXMgYWRkU3ViVGFiIEFQSSBmdW5jdGlvbj88L2I+PGJy Pg0KPGJyPg0KSW1wbGVtZW50aW5nICZxdW90O2FkZFN1YlRhYiZxdW90OyBBUEkgcmVxdWlyZXMg c29tZSBtb3JlIGNoYW5nZXMsIGFuZCBJIGRpZG4ndCB3YW50IHRvIGRlbGF5IHRoaXMgUG9DIHBh dGNoIGp1c3QgYmVjYXVzZSBvZiBpdC4uLjxicj4NCjxicj4NCkhlcmUncyBhIHNhbXBsZSBjb2Rl IHRoYXQgaWxsdXN0cmF0ZXMgcHJvcG9zZWQgJnF1b3Q7YWRkU3ViVGFiJnF1b3Q7IEFQSSB1c2Fn ZTo8YnI+DQo8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJp ZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj5VaUluaXQ6IDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0i Zm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Izk5MDAwMCI+ZnVuY3Rp b248L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZx dW90Oztjb2xvcjpibGFjayI+KCkgezxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyBhcGkuPC9zcGFu PjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjoj Q0MzM0NDIj5hZGRTdWJUYWI8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0Nv dXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4oJ0hvc3QnLCZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyAmbmJzcDsNCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Ly8gZW50aXR5VHlwZU5hbWU8L3NwYW4+ PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJs YWNrIj48YnI+DQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJ0N1 c3RvbSBIb3N0IFN1YiBUYWInLCZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPi8vIGxhYmVsPC9z cGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xv cjpibGFjayI+PGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 ICdjdXN0b20taG9zdC1zdWItdGFiJywgJm5ic3A7IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1m YW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Ly8gaGlzdG9yeVRv a2VuPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90 Oztjb2xvcjpibGFjayI+PGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7ICdodHRwOi8vd3d3Lm92aXJ0Lm9yZy8nLCA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPi8vIGNvbnRlbnRV cmw8YnI+DQo8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJp ZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVy IE5ldyZxdW90Oztjb2xvcjojMDA2NjAwO2JhY2tncm91bmQ6d2hpdGUiPi8vIFN1YiB0YWIgaW50 ZXJmYWNlIG9iamVjdDxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyAvLyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3 JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPkFsbCBmdW5jdGlvbnMgcmVjZWl2ZSBjdXJyZW50bHkgc2Vs ZWN0ZWQgaXRlbShzKTxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyAvLyB3aXRoaW4gdGhlIG1haW4gdGFiIGRhdGEgZ3JpZCBhcyBmdW5jdGlvbiBhcmd1bWVu dHM8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMwMDY2MDAiPjxicj4NCjwvc3Bhbj48c3BhbiBz dHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPiZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB7PC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZh bWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4mbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsgLy8gUmV0dXJuaW5nICd0cnVl JyBtZWFucyB0aGUgc3ViIHRhYiBpcyB2aXNpYmxlPGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIFJldHVybmlu ZyAnZmFsc2UnIG1lYW5zIHRoZSBzdWIgdGFiIGlzIGhpZGRlbjxicj4NCiZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBEZWZhdWx0IHZhbHVlID0g J3RydWUnPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVy IE5ldyZxdW90Oztjb2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJp ZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDAwOTkiPmlzQWNjZXNzaWJsZTwvc3Bhbj48c3BhbiBzdHls ZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPjoNCjwv c3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7 Y29sb3I6Izk5MDAwMCI+ZnVuY3Rpb248L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LWZhbWls eTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+KCkgezxicj4NCiZuYnNwOyZu YnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Izk5MDAwMCI+cmV0dXJuPC9zcGFuPjwvYj48c3BhbiBz dHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPiBh cmd1bWVudHMubGVuZ3RoID09IDEgJmFtcDsmYW1wOyBhcmd1bWVudHNbMF0uZW50aXR5SWQgPT0g JyZsdDtNeUhvc3RFbnRpdHlJZCZndDsnOzxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfTwvc3Bhbj48c3BhbiBzdHlsZT0i Y29sb3I6YmxhY2siPjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPjxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPg0KPGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7ICk7 PGJyPg0KfTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxicj4NCkFzIHBh cnQgb2YgJnF1b3Q7YWRkU3ViVGFiJnF1b3Q7IEFQSSBpbXBsZW1lbnRhdGlvbiwgSSdsbCByZWZh Y3RvciBjdXN0b20gbWFpbiB0YWIgY29tcG9uZW50cywgaW4gb3JkZXIgdG8gdXNlIG9uZSAmcXVv dDt0YWIgdHlwZSZxdW90OyBmb3IgYm90aCBtYWluIGFuZCBzdWIgdGFicy48YnI+DQo8YnI+DQpD dXJyZW50bHksIHdlIGhhdmUgb25lIChhbmQgb25seSBvbmUpICZxdW90O3RhYiB0eXBlJnF1b3Q7 IC0gYSB0YWIgdGhhdCBzaG93cyBjb250ZW50IG9mIHRoZSBnaXZlbiBVUkwgdGhyb3VnaCBIVE1M IGlmcmFtZSBlbGVtZW50Ljxicj4NCjxicj4NCldlIGNvdWxkIGFsc28gY3JlYXRlIG5ldyAmcXVv dDt0YWIgdHlwZXMmcXVvdDssIGUuZy4gZm9ybS1iYXNlZCB0YWIgdGhhdCBzaG93cyBrZXkvdmFs dWUgcGFpcnMgKElNSE8gdGhpcyBjb3VsZCBiZSBxdWl0ZSB1c2VmdWwgZm9yIGN1c3RvbSBzdWIg dGFicykuPG86cD48L286cD48L3NwYW4+PC9wPg0KPGRpdiBjbGFzcz0iTXNvTm9ybWFsIiBhbGln bj0iY2VudGVyIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0eWxlPSJjb2xvcjpi bGFjayI+DQo8aHIgc2l6ZT0iMiIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPg0KPC9zcGFu PjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTIuMHB0 Ij48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCkxldCBtZSBrbm93IHdoYXQgeW91IHRo aW5rITxicj4NCjxicj4NCkNoZWVycyw8YnI+DQpWb2p0ZWNoPG86cD48L286cD48L3NwYW4+PC9w Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== --_000_D290AD8432118048947689BA3AE8A9B3EA0073SACEXCMBX04PRDhqn_--

On 10/22/2012 05:25 PM, Morrissey, Christopher wrote:
Hi Vojtech,
Thanks again for the delivery of the patch. For revision 7, do you have a list of content? I had previously indicated I could work on adding the plugin API to launch a dialog, but hadn’t been able to get started on it until now. I wanted to see if you by chance were already working on it or if you were planning to deliver that yourself in the next revision?
A couple of other items we are looking for are the ability to add tasks for execution and get access to the session ID or some kind of authentication token so that we can make calls from our server into the REST API. I’m not very familiar yet with the REST API so I’m not sure what authentication methods are available and which would be best.
Oved - I remember we discussed UI plugins should be able to use same logic as jasper reports for getting a session identifier for using the REST API. do you remember the details on this one? Thanks, Itamar
-Chris
*From:*engine-devel-bounces@ovirt.org [mailto:engine-devel-bounces@ovirt.org] *On Behalf Of *Vojtech Szocs *Sent:* Thursday, October 18, 2012 10:49 AM *To:* engine-devel *Subject:* [Engine-devel] UI Plugins: PoC patch revision 6 now available
Hi guys,
the latest revision of UI Plugins proof-of-concept patch is now available for you to experiment with. You can download the patch from oVirt Gerrit at http://gerrit.ovirt.org/#/c/8120/2 (patch set 2).
Please read on to learn what's new in this revision. If you have any comments, questions or ideas, please let me know!
------------------------------------------------------------------------
*0. UI plugin path information resolved using local Engine configuration** * Server-side UI plugin infrastructure now uses local (machine-specific) Engine configuration instead of global (/vdc_options/ database table) Engine configuration:
* Previously, path information was resolved through org.ovirt.engine.core.common.config.Config class - Engine configuration values were retrieved from /vdc_options/ database table. * Currently, path information is resolved through org.ovirt.engine.core.utils.LocalConfig class - Engine configuration values are retrieved from local file system.
In case you're not working with oVirt Engine through RPM package system, e.g. you have a local development environment set up and you build and deploy oVirt Engine through Maven, please follow these steps:
a. Copy default Engine configuration into /usr/share/*ovirt-engine*/conf
# mkdir -p /usr/share/ovirt-engine/conf # cp <OVIRT_HOME>/backend/manager/conf/engine.conf.defaults /usr/share/ovirt-engine/conf/engine.conf.defaults
b. If necessary, copy UI plugin data files from /usr/share/engine/ui-plugins to /usr/share/*ovirt-engine*/ui-plugins
c. If necessary, copy UI plugin config files from /etc/engine/ui-plugins to /etc/*ovirt-engine*/ui-plugins
d, In case you want to override the default Engine configuration, put your custom property file into /etc/sysconfig/ovirt-engine
The reason behind this change is that path information for UI plugin data and configuration is typically machine-specific, and should be customizable per machine through Engine local configuration.
------------------------------------------------------------------------
*1. New plugin API function: addMainTabActionButton * The "addMainTabActionButton" API adds custom context-sensitive button to the given main tab's data grid, along with corresponding data grid context menu item.
addMainTabActionButton(entityTypeName, label, actionButtonInterface)
/entityTypeName/ indicates which main tab's data grid the button should be added to, according to the entity type associated with the main tab./entityTypeName/ values are strings reflecting org.ovirt.engine.ui.webadmin.plugin.entityEntityType enum members. Following /entityTypeName/ values are currently supported (values are case-sensitive): "DataCenter", "Cluster", "Host", "Storage", "Disk", "VirtualMachine", "Template".
Note: "Pool" value is currently not supported, because of org.ovirt.engine.core.common.businessentities.vm_pools entity not implementing the BusinessEntity interface, not sure why though. Maybe we should switch from BusinessEntity to IVdcQueryable interface and always cast getQueryableId method result value to Guid?
/label/ is the title displayed on the button/. / /actionButtonInterface/ represents an object that "implements the button interface" by declaring its functions: /onClick/, /isEnabled/, /isAccessible/. All functions of /actionButtonInterface/ receive currently selected item(s) as function arguments.
Let's take a closer look at the concept behind /actionButtonInterface/. In traditional class-based object-oriented languages, such as Java, interface is an abstract type that contains method declarations without an implementation. A class that implements the given interface must implement all methods declared by that interface (unless it's an abstract class, but this isn't relevant in our case).
In contrast with traditional class-based object-oriented languages, JavaScript supports OOP through prototype-based programming model (https://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-O...). At the same time, JavaScript language is dynamically-typed and therefore doesn't support traditional concept of interface in OOP, it uses "duck typing" technique instead (http://en.wikipedia.org/wiki/Duck_typing).
The simplest way to provide an object that "implements the given interface" in JavaScript is to use "duck typing" technique: providing an object that contains well-known functions. In UI plugin infrastructure, I call this concept "interface object", represented by org.ovirt.engine.ui.webadmin.plugin.jsni.JsInterfaceObject class. Unlike the traditional concept of interface abstract type in object-oriented languages, an "interface object" _does not necessarily have to declare all functions of the given interface_ in order to "implement" such interface. In fact, an empty object can be used as a valid "interface object". Missing functions will be simply treated as empty (no-op) functions. Furthermore, an "interface object" can "implement" multiple interfaces by declaring functions of those interfaces (interface composition).
Getting back to "addMainTabActionButton" API, here's a sample code that adds new button to "Host" main tab data grid, as part of UiInit event handler function:
UiInit: *function*() { api.addMainTabActionButton('Host', 'Single-Host Action',
// Action button interface object // All functions receive currently selected item(s) as function arguments {
// Called when the user clicks the button onClick: *function*() { // Calling 'arguments[0]' is safe, because onClick() can be called // only when exactly one item is currently selected in the data grid window.alert('Selected host entity ID = ' + arguments[0].entityId); },
// Returning 'true' means the button is enabled (clickable) // Returning 'false' means the button is disabled (non-clickable) // Default value = 'true' isEnabled: *function*() { // Enable button only when exactly one item is selected *return*arguments.length == 1; },
// Returning 'true' means the button is visible // Returning 'false' means the button is hidden // Default value = 'true' isAccessible: *function*() { // Always show the button in the corresponding data grid *return**true*; }
}
); }
As mentioned above, all functions of an interface object are optional. For functions expecting return value, default value is defined by UI plugin infrastructure. For example:
* onClick - no default value (no return value expected) * isEnabled / isAccessible - default value "true" (boolean return value expected)
Note: UI plugin infrastructure checks the actual return value type, and uses default value in case the function returned something of wrong (unexpected) type.
In the example above, "currently selected item(s)" maps to JSON-like representations of business entities currently selected in the corresponding data grid. For now, the entity representation is quite simple and same for all entity types:
{ entityId: "[BusinessEntityGuidAsString]" }
In future, we will create specific JSON-like representations for specific business entities, in compliance with Engine REST API entity structure.
For a more extensive example of using "addMainTabActionButton" API, please see the attached "addMainTabActionButton.html.example" file.
------------------------------------------------------------------------
*2. Improved plugin API function: addMainTab * The "addMainTab" API was improved to address following issues:
* "addMainTab" can now be called at any moment during UI plugin runtime, given that the plugin is allowed invoke plugin API functions (plugin is either INITIALIZING or IN_USE). Previously, "addMainTab" worked reliably only when called from within UiInit event handler function. Currently, it's possible to call "addMainTab" at any moment, e.g. from within some other event handler function (after UiInit has completed).
* "addMainTab" now retains "active" tab (highlighted tab GUI). "addMainTab" works by adding new tab component (GWTP presenter proxy) and refreshing main tab panel GUI by removing all related tabs and re-adding them again. This logic is handled by org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter class, which makes sure that "active" tab is retained even after main tab panel was refreshed.
Furthermore, custom main tab implementation now displays the content of the given URL through HTML iframe element.
------------------------------------------------------------------------
*3. Improved native JavaScript function handling* (GWT JSNI)
This patch introduces org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction and org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunctionResultHelper classes providing Java abstraction for invoking native JavaScript functions. These classes follow the general contract of "interface object" as mentioned above.
JsFunctionResultHelper is particularly useful when dealing with functions which are expected to return value of a certain type. Too bad standard GWT JSNI classes don't provide such abstraction for working with native functions out-of-the-box...
------------------------------------------------------------------------
*4. ActionPanel and ActionTable type hierarchy refactoring* (related to "addMainTabActionButton" API)* * Previously, AbstractActionPanel and AbstractActionTable classes didn't implement any reasonable interface that would allow other components (client-side UI plugin infrastructure) to depend on their functionality in a loosely-coupled manner. This would make code that implements "addMainTabActionButton" API "ugly": main tab view interface would have to reference AbstractActionTable class directly. In MVP design pattern, view interface should avoid referencing specific GWT Widget classes directly.
This patch introduces new interfaces for ActionPanel and ActionTable components while eliminating code redundancy (duplicate or unnecessary code).
------------------------------------------------------------------------
*5. ActionPanel type hierarchy refactoring* (related to "addMainTab" API)
Since org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter defines new DynamicTabPanel interface that extends standard GWTP TabPanel interface, some refactoring had to be done in related ActionPanel classes.
This patch makes sure that both org.ovirt.engine.ui.common.widget.tab.AbstractTabPanel (widget) and org.ovirt.engine.ui.common.view.AbstractTabPanelView (view) support DynamicTabPanel interface.
Note that for now, only main tab panel (org.ovirt.engine.ui.webadmin.section.main.presenter.MainTabPanelPresenter) supports dynamic tabs within its view.
------------------------------------------------------------------------
*Where is addSubTab API function?*
Implementing "addSubTab" API requires some more changes, and I didn't want to delay this PoC patch just because of it...
Here's a sample code that illustrates proposed "addSubTab" API usage:
UiInit: *function*() { api.addSubTab('Host', // entityTypeName 'Custom Host Sub Tab', // label 'custom-host-sub-tab', // historyToken 'http://www.ovirt.org/', // contentUrl
// Sub tab interface object // All functions receive currently selected item(s) // within the main tab data grid as function arguments {
// Returning 'true' means the sub tab is visible // Returning 'false' means the sub tab is hidden // Default value = 'true' isAccessible: *function*() { *return*arguments.length == 1 && arguments[0].entityId == '<MyHostEntityId>'; }
}
); }
As part of "addSubTab" API implementation, I'll refactor custom main tab components, in order to use one "tab type" for both main and sub tabs.
Currently, we have one (and only one) "tab type" - a tab that shows content of the given URL through HTML iframe element.
We could also create new "tab types", e.g. form-based tab that shows key/value pairs (IMHO this could be quite useful for custom sub tabs).
------------------------------------------------------------------------
Let me know what you think!
Cheers, Vojtech
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel

----- Original Message -----
From: "Itamar Heim" <iheim@redhat.com> To: "Christopher Morrissey" <Christopher.Morrissey@netapp.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Tuesday, October 23, 2012 8:49:02 AM Subject: Re: [Engine-devel] UI Plugins: PoC patch revision 6 now available
On 10/22/2012 05:25 PM, Morrissey, Christopher wrote:
Hi Vojtech,
Thanks again for the delivery of the patch. For revision 7, do you have a list of content? I had previously indicated I could work on adding the plugin API to launch a dialog, but hadn’t been able to get started on it until now. I wanted to see if you by chance were already working on it or if you were planning to deliver that yourself in the next revision?
A couple of other items we are looking for are the ability to add tasks for execution and get access to the session ID or some kind of authentication token so that we can make calls from our server into the REST API. I’m not very familiar yet with the REST API so I’m not sure what authentication methods are available and which would be best.
Oved - I remember we discussed UI plugins should be able to use same logic as jasper reports for getting a session identifier for using the REST API. do you remember the details on this one?
Yes. What we planned to do is different than the jasper reports solution. We planned to take the same session ID that the webadmin has, and pass it over to the REST API as session ID (as we added the REST session support - http://wiki.ovirt.org/wiki/Features/RESTSessionManagement). The problem is that while previous versions of jboss allowed using the same session in two different webapps, it is no longer possible in jboss AS7, so what we would need to do is to login once to the REST API with the credentials as used in webadmin, get the session ID from the cookie, and save it for further requests.
Thanks, Itamar
-Chris
*From:*engine-devel-bounces@ovirt.org [mailto:engine-devel-bounces@ovirt.org] *On Behalf Of *Vojtech Szocs *Sent:* Thursday, October 18, 2012 10:49 AM *To:* engine-devel *Subject:* [Engine-devel] UI Plugins: PoC patch revision 6 now available
Hi guys,
the latest revision of UI Plugins proof-of-concept patch is now available for you to experiment with. You can download the patch from oVirt Gerrit at http://gerrit.ovirt.org/#/c/8120/2 (patch set 2).
Please read on to learn what's new in this revision. If you have any comments, questions or ideas, please let me know!
------------------------------------------------------------------------
*0. UI plugin path information resolved using local Engine configuration** * Server-side UI plugin infrastructure now uses local (machine-specific) Engine configuration instead of global (/vdc_options/ database table) Engine configuration:
* Previously, path information was resolved through org.ovirt.engine.core.common.config.Config class - Engine configuration values were retrieved from /vdc_options/ database table. * Currently, path information is resolved through org.ovirt.engine.core.utils.LocalConfig class - Engine configuration values are retrieved from local file system.
In case you're not working with oVirt Engine through RPM package system, e.g. you have a local development environment set up and you build and deploy oVirt Engine through Maven, please follow these steps:
a. Copy default Engine configuration into /usr/share/*ovirt-engine*/conf
# mkdir -p /usr/share/ovirt-engine/conf # cp <OVIRT_HOME>/backend/manager/conf/engine.conf.defaults /usr/share/ovirt-engine/conf/engine.conf.defaults
b. If necessary, copy UI plugin data files from /usr/share/engine/ui-plugins to /usr/share/*ovirt-engine*/ui-plugins
c. If necessary, copy UI plugin config files from /etc/engine/ui-plugins to /etc/*ovirt-engine*/ui-plugins
d, In case you want to override the default Engine configuration, put your custom property file into /etc/sysconfig/ovirt-engine
The reason behind this change is that path information for UI plugin data and configuration is typically machine-specific, and should be customizable per machine through Engine local configuration.
------------------------------------------------------------------------
*1. New plugin API function: addMainTabActionButton * The "addMainTabActionButton" API adds custom context-sensitive button to the given main tab's data grid, along with corresponding data grid context menu item.
addMainTabActionButton(entityTypeName, label, actionButtonInterface)
/entityTypeName/ indicates which main tab's data grid the button should be added to, according to the entity type associated with the main tab./entityTypeName/ values are strings reflecting org.ovirt.engine.ui.webadmin.plugin.entityEntityType enum members. Following /entityTypeName/ values are currently supported (values are case-sensitive): "DataCenter", "Cluster", "Host", "Storage", "Disk", "VirtualMachine", "Template".
Note: "Pool" value is currently not supported, because of org.ovirt.engine.core.common.businessentities.vm_pools entity not implementing the BusinessEntity interface, not sure why though. Maybe we should switch from BusinessEntity to IVdcQueryable interface and always cast getQueryableId method result value to Guid?
/label/ is the title displayed on the button/. / /actionButtonInterface/ represents an object that "implements the button interface" by declaring its functions: /onClick/, /isEnabled/, /isAccessible/. All functions of /actionButtonInterface/ receive currently selected item(s) as function arguments.
Let's take a closer look at the concept behind /actionButtonInterface/. In traditional class-based object-oriented languages, such as Java, interface is an abstract type that contains method declarations without an implementation. A class that implements the given interface must implement all methods declared by that interface (unless it's an abstract class, but this isn't relevant in our case).
In contrast with traditional class-based object-oriented languages, JavaScript supports OOP through prototype-based programming model (https://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-O...). At the same time, JavaScript language is dynamically-typed and therefore doesn't support traditional concept of interface in OOP, it uses "duck typing" technique instead (http://en.wikipedia.org/wiki/Duck_typing).
The simplest way to provide an object that "implements the given interface" in JavaScript is to use "duck typing" technique: providing an object that contains well-known functions. In UI plugin infrastructure, I call this concept "interface object", represented by org.ovirt.engine.ui.webadmin.plugin.jsni.JsInterfaceObject class. Unlike the traditional concept of interface abstract type in object-oriented languages, an "interface object" _does not necessarily have to declare all functions of the given interface_ in order to "implement" such interface. In fact, an empty object can be used as a valid "interface object". Missing functions will be simply treated as empty (no-op) functions. Furthermore, an "interface object" can "implement" multiple interfaces by declaring functions of those interfaces (interface composition).
Getting back to "addMainTabActionButton" API, here's a sample code that adds new button to "Host" main tab data grid, as part of UiInit event handler function:
UiInit: *function*() { api.addMainTabActionButton('Host', 'Single-Host Action',
// Action button interface object // All functions receive currently selected item(s) as function arguments {
// Called when the user clicks the button onClick: *function*() { // Calling 'arguments[0]' is safe, because onClick() can be called // only when exactly one item is currently selected in the data grid window.alert('Selected host entity ID = ' + arguments[0].entityId); },
// Returning 'true' means the button is enabled (clickable) // Returning 'false' means the button is disabled (non-clickable) // Default value = 'true' isEnabled: *function*() { // Enable button only when exactly one item is selected *return*arguments.length == 1; },
// Returning 'true' means the button is visible // Returning 'false' means the button is hidden // Default value = 'true' isAccessible: *function*() { // Always show the button in the corresponding data grid *return**true*; }
}
); }
As mentioned above, all functions of an interface object are optional. For functions expecting return value, default value is defined by UI plugin infrastructure. For example:
* onClick - no default value (no return value expected) * isEnabled / isAccessible - default value "true" (boolean return value expected)
Note: UI plugin infrastructure checks the actual return value type, and uses default value in case the function returned something of wrong (unexpected) type.
In the example above, "currently selected item(s)" maps to JSON-like representations of business entities currently selected in the corresponding data grid. For now, the entity representation is quite simple and same for all entity types:
{ entityId: "[BusinessEntityGuidAsString]" }
In future, we will create specific JSON-like representations for specific business entities, in compliance with Engine REST API entity structure.
For a more extensive example of using "addMainTabActionButton" API, please see the attached "addMainTabActionButton.html.example" file.
------------------------------------------------------------------------
*2. Improved plugin API function: addMainTab * The "addMainTab" API was improved to address following issues:
* "addMainTab" can now be called at any moment during UI plugin runtime, given that the plugin is allowed invoke plugin API functions (plugin is either INITIALIZING or IN_USE). Previously, "addMainTab" worked reliably only when called from within UiInit event handler function. Currently, it's possible to call "addMainTab" at any moment, e.g. from within some other event handler function (after UiInit has completed).
* "addMainTab" now retains "active" tab (highlighted tab GUI). "addMainTab" works by adding new tab component (GWTP presenter proxy) and refreshing main tab panel GUI by removing all related tabs and re-adding them again. This logic is handled by org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter class, which makes sure that "active" tab is retained even after main tab panel was refreshed.
Furthermore, custom main tab implementation now displays the content of the given URL through HTML iframe element.
------------------------------------------------------------------------
*3. Improved native JavaScript function handling* (GWT JSNI)
This patch introduces org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction and org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunctionResultHelper classes providing Java abstraction for invoking native JavaScript functions. These classes follow the general contract of "interface object" as mentioned above.
JsFunctionResultHelper is particularly useful when dealing with functions which are expected to return value of a certain type. Too bad standard GWT JSNI classes don't provide such abstraction for working with native functions out-of-the-box...
------------------------------------------------------------------------
*4. ActionPanel and ActionTable type hierarchy refactoring* (related to "addMainTabActionButton" API)* * Previously, AbstractActionPanel and AbstractActionTable classes didn't implement any reasonable interface that would allow other components (client-side UI plugin infrastructure) to depend on their functionality in a loosely-coupled manner. This would make code that implements "addMainTabActionButton" API "ugly": main tab view interface would have to reference AbstractActionTable class directly. In MVP design pattern, view interface should avoid referencing specific GWT Widget classes directly.
This patch introduces new interfaces for ActionPanel and ActionTable components while eliminating code redundancy (duplicate or unnecessary code).
------------------------------------------------------------------------
*5. ActionPanel type hierarchy refactoring* (related to "addMainTab" API)
Since org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter defines new DynamicTabPanel interface that extends standard GWTP TabPanel interface, some refactoring had to be done in related ActionPanel classes.
This patch makes sure that both org.ovirt.engine.ui.common.widget.tab.AbstractTabPanel (widget) and org.ovirt.engine.ui.common.view.AbstractTabPanelView (view) support DynamicTabPanel interface.
Note that for now, only main tab panel (org.ovirt.engine.ui.webadmin.section.main.presenter.MainTabPanelPresenter) supports dynamic tabs within its view.
------------------------------------------------------------------------
*Where is addSubTab API function?*
Implementing "addSubTab" API requires some more changes, and I didn't want to delay this PoC patch just because of it...
Here's a sample code that illustrates proposed "addSubTab" API usage:
UiInit: *function*() { api.addSubTab('Host', // entityTypeName 'Custom Host Sub Tab', // label 'custom-host-sub-tab', // historyToken 'http://www.ovirt.org/', // contentUrl
// Sub tab interface object // All functions receive currently selected item(s) // within the main tab data grid as function arguments {
// Returning 'true' means the sub tab is visible // Returning 'false' means the sub tab is hidden // Default value = 'true' isAccessible: *function*() { *return*arguments.length == 1 && arguments[0].entityId == '<MyHostEntityId>'; }
}
); }
As part of "addSubTab" API implementation, I'll refactor custom main tab components, in order to use one "tab type" for both main and sub tabs.
Currently, we have one (and only one) "tab type" - a tab that shows content of the given URL through HTML iframe element.
We could also create new "tab types", e.g. form-based tab that shows key/value pairs (IMHO this could be quite useful for custom sub tabs).
------------------------------------------------------------------------
Let me know what you think!
Cheers, Vojtech
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel

Hi Oved, thanks for sharing details on REST API session support! With this feature implemented, we could extend WebAdmin UI login procedure with REST API login, retrieving session ID from the cookie and providing it to UI plugins through the plugin API. We could also perform REST API logout upon WebAdmin UI logout. I see that [http://wiki.ovirt.org/wiki/Features/RESTSessionManagement] is currently in design phase, is it close to being implemented or will it take some more time to be available? Alternatively, (without REST API session support) we could also do REST API login/logout as part of each REST API call; but since UI plugins might want to delegate the responsibility to make the actual REST API call to other (e.g. server-side) components, we'd have to expose WebAdmin UI login credentials to each plugin (I'm not sure if this is a good idea). Regards, Vojtech ----- Original Message ----- From: "Oved Ourfalli" <ovedo@redhat.com> To: "Itamar Heim" <iheim@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org>, "Christopher Morrissey" <Christopher.Morrissey@netapp.com> Sent: Wednesday, October 24, 2012 10:46:50 AM Subject: Re: [Engine-devel] UI Plugins: PoC patch revision 6 now available ----- Original Message -----
From: "Itamar Heim" <iheim@redhat.com> To: "Christopher Morrissey" <Christopher.Morrissey@netapp.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Tuesday, October 23, 2012 8:49:02 AM Subject: Re: [Engine-devel] UI Plugins: PoC patch revision 6 now available
On 10/22/2012 05:25 PM, Morrissey, Christopher wrote:
Hi Vojtech,
Thanks again for the delivery of the patch. For revision 7, do you have a list of content? I had previously indicated I could work on adding the plugin API to launch a dialog, but hadn’t been able to get started on it until now. I wanted to see if you by chance were already working on it or if you were planning to deliver that yourself in the next revision?
A couple of other items we are looking for are the ability to add tasks for execution and get access to the session ID or some kind of authentication token so that we can make calls from our server into the REST API. I’m not very familiar yet with the REST API so I’m not sure what authentication methods are available and which would be best.
Oved - I remember we discussed UI plugins should be able to use same logic as jasper reports for getting a session identifier for using the REST API. do you remember the details on this one?
Yes. What we planned to do is different than the jasper reports solution. We planned to take the same session ID that the webadmin has, and pass it over to the REST API as session ID (as we added the REST session support - http://wiki.ovirt.org/wiki/Features/RESTSessionManagement). The problem is that while previous versions of jboss allowed using the same session in two different webapps, it is no longer possible in jboss AS7, so what we would need to do is to login once to the REST API with the credentials as used in webadmin, get the session ID from the cookie, and save it for further requests.
Thanks, Itamar
-Chris
*From:*engine-devel-bounces@ovirt.org [mailto:engine-devel-bounces@ovirt.org] *On Behalf Of *Vojtech Szocs *Sent:* Thursday, October 18, 2012 10:49 AM *To:* engine-devel *Subject:* [Engine-devel] UI Plugins: PoC patch revision 6 now available
Hi guys,
the latest revision of UI Plugins proof-of-concept patch is now available for you to experiment with. You can download the patch from oVirt Gerrit at http://gerrit.ovirt.org/#/c/8120/2 (patch set 2).
Please read on to learn what's new in this revision. If you have any comments, questions or ideas, please let me know!
------------------------------------------------------------------------
*0. UI plugin path information resolved using local Engine configuration** * Server-side UI plugin infrastructure now uses local (machine-specific) Engine configuration instead of global (/vdc_options/ database table) Engine configuration:
* Previously, path information was resolved through org.ovirt.engine.core.common.config.Config class - Engine configuration values were retrieved from /vdc_options/ database table. * Currently, path information is resolved through org.ovirt.engine.core.utils.LocalConfig class - Engine configuration values are retrieved from local file system.
In case you're not working with oVirt Engine through RPM package system, e.g. you have a local development environment set up and you build and deploy oVirt Engine through Maven, please follow these steps:
a. Copy default Engine configuration into /usr/share/*ovirt-engine*/conf
# mkdir -p /usr/share/ovirt-engine/conf # cp <OVIRT_HOME>/backend/manager/conf/engine.conf.defaults /usr/share/ovirt-engine/conf/engine.conf.defaults
b. If necessary, copy UI plugin data files from /usr/share/engine/ui-plugins to /usr/share/*ovirt-engine*/ui-plugins
c. If necessary, copy UI plugin config files from /etc/engine/ui-plugins to /etc/*ovirt-engine*/ui-plugins
d, In case you want to override the default Engine configuration, put your custom property file into /etc/sysconfig/ovirt-engine
The reason behind this change is that path information for UI plugin data and configuration is typically machine-specific, and should be customizable per machine through Engine local configuration.
------------------------------------------------------------------------
*1. New plugin API function: addMainTabActionButton * The "addMainTabActionButton" API adds custom context-sensitive button to the given main tab's data grid, along with corresponding data grid context menu item.
addMainTabActionButton(entityTypeName, label, actionButtonInterface)
/entityTypeName/ indicates which main tab's data grid the button should be added to, according to the entity type associated with the main tab./entityTypeName/ values are strings reflecting org.ovirt.engine.ui.webadmin.plugin.entityEntityType enum members. Following /entityTypeName/ values are currently supported (values are case-sensitive): "DataCenter", "Cluster", "Host", "Storage", "Disk", "VirtualMachine", "Template".
Note: "Pool" value is currently not supported, because of org.ovirt.engine.core.common.businessentities.vm_pools entity not implementing the BusinessEntity interface, not sure why though. Maybe we should switch from BusinessEntity to IVdcQueryable interface and always cast getQueryableId method result value to Guid?
/label/ is the title displayed on the button/. / /actionButtonInterface/ represents an object that "implements the button interface" by declaring its functions: /onClick/, /isEnabled/, /isAccessible/. All functions of /actionButtonInterface/ receive currently selected item(s) as function arguments.
Let's take a closer look at the concept behind /actionButtonInterface/. In traditional class-based object-oriented languages, such as Java, interface is an abstract type that contains method declarations without an implementation. A class that implements the given interface must implement all methods declared by that interface (unless it's an abstract class, but this isn't relevant in our case).
In contrast with traditional class-based object-oriented languages, JavaScript supports OOP through prototype-based programming model (https://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-O...). At the same time, JavaScript language is dynamically-typed and therefore doesn't support traditional concept of interface in OOP, it uses "duck typing" technique instead (http://en.wikipedia.org/wiki/Duck_typing).
The simplest way to provide an object that "implements the given interface" in JavaScript is to use "duck typing" technique: providing an object that contains well-known functions. In UI plugin infrastructure, I call this concept "interface object", represented by org.ovirt.engine.ui.webadmin.plugin.jsni.JsInterfaceObject class. Unlike the traditional concept of interface abstract type in object-oriented languages, an "interface object" _does not necessarily have to declare all functions of the given interface_ in order to "implement" such interface. In fact, an empty object can be used as a valid "interface object". Missing functions will be simply treated as empty (no-op) functions. Furthermore, an "interface object" can "implement" multiple interfaces by declaring functions of those interfaces (interface composition).
Getting back to "addMainTabActionButton" API, here's a sample code that adds new button to "Host" main tab data grid, as part of UiInit event handler function:
UiInit: *function*() { api.addMainTabActionButton('Host', 'Single-Host Action',
// Action button interface object // All functions receive currently selected item(s) as function arguments {
// Called when the user clicks the button onClick: *function*() { // Calling 'arguments[0]' is safe, because onClick() can be called // only when exactly one item is currently selected in the data grid window.alert('Selected host entity ID = ' + arguments[0].entityId); },
// Returning 'true' means the button is enabled (clickable) // Returning 'false' means the button is disabled (non-clickable) // Default value = 'true' isEnabled: *function*() { // Enable button only when exactly one item is selected *return*arguments.length == 1; },
// Returning 'true' means the button is visible // Returning 'false' means the button is hidden // Default value = 'true' isAccessible: *function*() { // Always show the button in the corresponding data grid *return**true*; }
}
); }
As mentioned above, all functions of an interface object are optional. For functions expecting return value, default value is defined by UI plugin infrastructure. For example:
* onClick - no default value (no return value expected) * isEnabled / isAccessible - default value "true" (boolean return value expected)
Note: UI plugin infrastructure checks the actual return value type, and uses default value in case the function returned something of wrong (unexpected) type.
In the example above, "currently selected item(s)" maps to JSON-like representations of business entities currently selected in the corresponding data grid. For now, the entity representation is quite simple and same for all entity types:
{ entityId: "[BusinessEntityGuidAsString]" }
In future, we will create specific JSON-like representations for specific business entities, in compliance with Engine REST API entity structure.
For a more extensive example of using "addMainTabActionButton" API, please see the attached "addMainTabActionButton.html.example" file.
------------------------------------------------------------------------
*2. Improved plugin API function: addMainTab * The "addMainTab" API was improved to address following issues:
* "addMainTab" can now be called at any moment during UI plugin runtime, given that the plugin is allowed invoke plugin API functions (plugin is either INITIALIZING or IN_USE). Previously, "addMainTab" worked reliably only when called from within UiInit event handler function. Currently, it's possible to call "addMainTab" at any moment, e.g. from within some other event handler function (after UiInit has completed).
* "addMainTab" now retains "active" tab (highlighted tab GUI). "addMainTab" works by adding new tab component (GWTP presenter proxy) and refreshing main tab panel GUI by removing all related tabs and re-adding them again. This logic is handled by org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter class, which makes sure that "active" tab is retained even after main tab panel was refreshed.
Furthermore, custom main tab implementation now displays the content of the given URL through HTML iframe element.
------------------------------------------------------------------------
*3. Improved native JavaScript function handling* (GWT JSNI)
This patch introduces org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction and org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunctionResultHelper classes providing Java abstraction for invoking native JavaScript functions. These classes follow the general contract of "interface object" as mentioned above.
JsFunctionResultHelper is particularly useful when dealing with functions which are expected to return value of a certain type. Too bad standard GWT JSNI classes don't provide such abstraction for working with native functions out-of-the-box...
------------------------------------------------------------------------
*4. ActionPanel and ActionTable type hierarchy refactoring* (related to "addMainTabActionButton" API)* * Previously, AbstractActionPanel and AbstractActionTable classes didn't implement any reasonable interface that would allow other components (client-side UI plugin infrastructure) to depend on their functionality in a loosely-coupled manner. This would make code that implements "addMainTabActionButton" API "ugly": main tab view interface would have to reference AbstractActionTable class directly. In MVP design pattern, view interface should avoid referencing specific GWT Widget classes directly.
This patch introduces new interfaces for ActionPanel and ActionTable components while eliminating code redundancy (duplicate or unnecessary code).
------------------------------------------------------------------------
*5. ActionPanel type hierarchy refactoring* (related to "addMainTab" API)
Since org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter defines new DynamicTabPanel interface that extends standard GWTP TabPanel interface, some refactoring had to be done in related ActionPanel classes.
This patch makes sure that both org.ovirt.engine.ui.common.widget.tab.AbstractTabPanel (widget) and org.ovirt.engine.ui.common.view.AbstractTabPanelView (view) support DynamicTabPanel interface.
Note that for now, only main tab panel (org.ovirt.engine.ui.webadmin.section.main.presenter.MainTabPanelPresenter) supports dynamic tabs within its view.
------------------------------------------------------------------------
*Where is addSubTab API function?*
Implementing "addSubTab" API requires some more changes, and I didn't want to delay this PoC patch just because of it...
Here's a sample code that illustrates proposed "addSubTab" API usage:
UiInit: *function*() { api.addSubTab('Host', // entityTypeName 'Custom Host Sub Tab', // label 'custom-host-sub-tab', // historyToken 'http://www.ovirt.org/', // contentUrl
// Sub tab interface object // All functions receive currently selected item(s) // within the main tab data grid as function arguments {
// Returning 'true' means the sub tab is visible // Returning 'false' means the sub tab is hidden // Default value = 'true' isAccessible: *function*() { *return*arguments.length == 1 && arguments[0].entityId == '<MyHostEntityId>'; }
}
); }
As part of "addSubTab" API implementation, I'll refactor custom main tab components, in order to use one "tab type" for both main and sub tabs.
Currently, we have one (and only one) "tab type" - a tab that shows content of the given URL through HTML iframe element.
We could also create new "tab types", e.g. form-based tab that shows key/value pairs (IMHO this could be quite useful for custom sub tabs).
------------------------------------------------------------------------
Let me know what you think!
Cheers, Vojtech
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel

----- Vojtech Szocs <vszocs@redhat.com> wrote:
Hi Oved,
thanks for sharing details on REST API session support! With this feature implemented, we could extend WebAdmin UI login procedure with REST API login, retrieving session ID from the cookie and providing it to UI plugins through the plugin API. We could also perform REST API logout upon WebAdmin UI logout. I see that [http://wiki.ovirt.org/wiki/Features/RESTSessionManagement] is currently in design phase, is it close to being implemented or will it take some more time to be available?
It is already implemented and tested for a while now. I'll update the wiki page accordingly. What you suggested was exactly what I had in mind. I'll catch you on irc tomorrow to discuss the details, and see if you need any help, but looks like that would work. Regards, Oved
Alternatively, (without REST API session support) we could also do REST API login/logout as part of each REST API call; but since UI plugins might want to delegate the responsibility to make the actual REST API call to other (e.g. server-side) components, we'd have to expose WebAdmin UI login credentials to each plugin (I'm not sure if this is a good idea).
Regards, Vojtech
----- Original Message ----- From: "Oved Ourfalli" <ovedo@redhat.com> To: "Itamar Heim" <iheim@redhat.com> Cc: "engine-devel" <engine-devel@ovirt.org>, "Christopher Morrissey" <Christopher.Morrissey@netapp.com> Sent: Wednesday, October 24, 2012 10:46:50 AM Subject: Re: [Engine-devel] UI Plugins: PoC patch revision 6 now available
----- Original Message -----
From: "Itamar Heim" <iheim@redhat.com> To: "Christopher Morrissey" <Christopher.Morrissey@netapp.com> Cc: "engine-devel" <engine-devel@ovirt.org> Sent: Tuesday, October 23, 2012 8:49:02 AM Subject: Re: [Engine-devel] UI Plugins: PoC patch revision 6 now available
On 10/22/2012 05:25 PM, Morrissey, Christopher wrote:
Hi Vojtech,
Thanks again for the delivery of the patch. For revision 7, do you have a list of content? I had previously indicated I could work on adding the plugin API to launch a dialog, but hadn’t been able to get started on it until now. I wanted to see if you by chance were already working on it or if you were planning to deliver that yourself in the next revision?
A couple of other items we are looking for are the ability to add tasks for execution and get access to the session ID or some kind of authentication token so that we can make calls from our server into the REST API. I’m not very familiar yet with the REST API so I’m not sure what authentication methods are available and which would be best.
Oved - I remember we discussed UI plugins should be able to use same logic as jasper reports for getting a session identifier for using the REST API. do you remember the details on this one?
Yes. What we planned to do is different than the jasper reports solution. We planned to take the same session ID that the webadmin has, and pass it over to the REST API as session ID (as we added the REST session support - http://wiki.ovirt.org/wiki/Features/RESTSessionManagement).
The problem is that while previous versions of jboss allowed using the same session in two different webapps, it is no longer possible in jboss AS7, so what we would need to do is to login once to the REST API with the credentials as used in webadmin, get the session ID from the cookie, and save it for further requests.
Thanks, Itamar
-Chris
*From:*engine-devel-bounces@ovirt.org [mailto:engine-devel-bounces@ovirt.org] *On Behalf Of *Vojtech Szocs *Sent:* Thursday, October 18, 2012 10:49 AM *To:* engine-devel *Subject:* [Engine-devel] UI Plugins: PoC patch revision 6 now available
Hi guys,
the latest revision of UI Plugins proof-of-concept patch is now available for you to experiment with. You can download the patch from oVirt Gerrit at http://gerrit.ovirt.org/#/c/8120/2 (patch set 2).
Please read on to learn what's new in this revision. If you have any comments, questions or ideas, please let me know!
------------------------------------------------------------------------
*0. UI plugin path information resolved using local Engine configuration** * Server-side UI plugin infrastructure now uses local (machine-specific) Engine configuration instead of global (/vdc_options/ database table) Engine configuration:
* Previously, path information was resolved through org.ovirt.engine.core.common.config.Config class - Engine configuration values were retrieved from /vdc_options/ database table. * Currently, path information is resolved through org.ovirt.engine.core.utils.LocalConfig class - Engine configuration values are retrieved from local file system.
In case you're not working with oVirt Engine through RPM package system, e.g. you have a local development environment set up and you build and deploy oVirt Engine through Maven, please follow these steps:
a. Copy default Engine configuration into /usr/share/*ovirt-engine*/conf
# mkdir -p /usr/share/ovirt-engine/conf # cp <OVIRT_HOME>/backend/manager/conf/engine.conf.defaults /usr/share/ovirt-engine/conf/engine.conf.defaults
b. If necessary, copy UI plugin data files from /usr/share/engine/ui-plugins to /usr/share/*ovirt-engine*/ui-plugins
c. If necessary, copy UI plugin config files from /etc/engine/ui-plugins to /etc/*ovirt-engine*/ui-plugins
d, In case you want to override the default Engine configuration, put your custom property file into /etc/sysconfig/ovirt-engine
The reason behind this change is that path information for UI plugin data and configuration is typically machine-specific, and should be customizable per machine through Engine local configuration.
------------------------------------------------------------------------
*1. New plugin API function: addMainTabActionButton * The "addMainTabActionButton" API adds custom context-sensitive button to the given main tab's data grid, along with corresponding data grid context menu item.
addMainTabActionButton(entityTypeName, label, actionButtonInterface)
/entityTypeName/ indicates which main tab's data grid the button should be added to, according to the entity type associated with the main tab./entityTypeName/ values are strings reflecting org.ovirt.engine.ui.webadmin.plugin.entityEntityType enum members. Following /entityTypeName/ values are currently supported (values are case-sensitive): "DataCenter", "Cluster", "Host", "Storage", "Disk", "VirtualMachine", "Template".
Note: "Pool" value is currently not supported, because of org.ovirt.engine.core.common.businessentities.vm_pools entity not implementing the BusinessEntity interface, not sure why though. Maybe we should switch from BusinessEntity to IVdcQueryable interface and always cast getQueryableId method result value to Guid?
/label/ is the title displayed on the button/. / /actionButtonInterface/ represents an object that "implements the button interface" by declaring its functions: /onClick/, /isEnabled/, /isAccessible/. All functions of /actionButtonInterface/ receive currently selected item(s) as function arguments.
Let's take a closer look at the concept behind /actionButtonInterface/. In traditional class-based object-oriented languages, such as Java, interface is an abstract type that contains method declarations without an implementation. A class that implements the given interface must implement all methods declared by that interface (unless it's an abstract class, but this isn't relevant in our case).
In contrast with traditional class-based object-oriented languages, JavaScript supports OOP through prototype-based programming model (https://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-O...). At the same time, JavaScript language is dynamically-typed and therefore doesn't support traditional concept of interface in OOP, it uses "duck typing" technique instead (http://en.wikipedia.org/wiki/Duck_typing).
The simplest way to provide an object that "implements the given interface" in JavaScript is to use "duck typing" technique: providing an object that contains well-known functions. In UI plugin infrastructure, I call this concept "interface object", represented by org.ovirt.engine.ui.webadmin.plugin.jsni.JsInterfaceObject class. Unlike the traditional concept of interface abstract type in object-oriented languages, an "interface object" _does not necessarily have to declare all functions of the given interface_ in order to "implement" such interface. In fact, an empty object can be used as a valid "interface object". Missing functions will be simply treated as empty (no-op) functions. Furthermore, an "interface object" can "implement" multiple interfaces by declaring functions of those interfaces (interface composition).
Getting back to "addMainTabActionButton" API, here's a sample code that adds new button to "Host" main tab data grid, as part of UiInit event handler function:
UiInit: *function*() { api.addMainTabActionButton('Host', 'Single-Host Action',
// Action button interface object // All functions receive currently selected item(s) as function arguments {
// Called when the user clicks the button onClick: *function*() { // Calling 'arguments[0]' is safe, because onClick() can be called // only when exactly one item is currently selected in the data grid window.alert('Selected host entity ID = ' + arguments[0].entityId); },
// Returning 'true' means the button is enabled (clickable) // Returning 'false' means the button is disabled (non-clickable) // Default value = 'true' isEnabled: *function*() { // Enable button only when exactly one item is selected *return*arguments.length == 1; },
// Returning 'true' means the button is visible // Returning 'false' means the button is hidden // Default value = 'true' isAccessible: *function*() { // Always show the button in the corresponding data grid *return**true*; }
}
); }
As mentioned above, all functions of an interface object are optional. For functions expecting return value, default value is defined by UI plugin infrastructure. For example:
* onClick - no default value (no return value expected) * isEnabled / isAccessible - default value "true" (boolean return value expected)
Note: UI plugin infrastructure checks the actual return value type,
rently
uses default value in case the function returned something of wrong (unexpected) type.
In the example above, "currently selected item(s)" maps to JSON-like representations of business entities currently selected in the corresponding data grid. For now, the entity representation is quite simple and same for all entity types:
{ entityId: "[BusinessEntityGuidAsString]" }
In future, we will create specific JSON-like representations for specific business entities, in compliance with Engine REST API entity structure.
For a more extensive example of using "addMainTabActionButton" API, please see the attached "addMainTabActionButton.html.example" file.
------------------------------------------------------------------------
*2. Improved plugin API function: addMainTab * The "addMainTab" API was improved to address following issues:
* "addMainTab" can now be called at any moment during UI plugin runtime, given that the plugin is allowed invoke plugin API functions (plugin is either INITIALIZING or IN_USE). Previously, "addMainTab" worked reliably only when called from within UiInit event handler function. Currently, it's possible to call "addMainTab" at any moment, e.g. from within some other event handler function (after UiInit has completed).
* "addMainTab" now retains "active" tab (highlighted tab GUI). "addMainTab" works by adding new tab component (GWTP presenter proxy) and refreshing main tab panel GUI by removing all related tabs and re-adding them again. This logic is handled by org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter class, which makes sure that "active" tab is retained even after main tab panel was refreshed.
Furthermore, custom main tab implementation now displays the content of the given URL through HTML iframe element.
------------------------------------------------------------------------
*3. Improved native JavaScript function handling* (GWT JSNI)
This patch introduces org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction and org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunctionResultHelper classes providing Java abstraction for invoking native JavaScript functions. These classes follow the general contract of "interface object" as mentioned above.
JsFunctionResultHelper is particularly useful when dealing with functions which are expected to return value of a certain type. Too bad standard GWT JSNI classes don't provide such abstraction for working with native functions out-of-the-box...
------------------------------------------------------------------------
*4. ActionPanel and ActionTable type hierarchy refactoring* (related to "addMainTabActionButton" API)* * Previously, AbstractActionPanel and AbstractActionTable classes didn't implement any reasonable interface that would allow other components (client-side UI plugin infrastructure) to depend on their functionality in a loosely-coupled manner. This would make code that implements "addMainTabActionButton" API "ugly": main tab view interface would have to reference AbstractActionTable class directly. In MVP design pattern, view interface should avoid referencing specific GWT Widget classes directly.
This patch introduces new interfaces for ActionPanel and ActionTable components while eliminating code redundancy (duplicate or unnecessary code).
------------------------------------------------------------------------
*5. ActionPanel type hierarchy refactoring* (related to "addMainTab" API)
Since org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter defines new DynamicTabPanel interface that extends standard GWTP TabPanel interface, some refactoring had to be done in related ActionPanel classes.
This patch makes sure that both org.ovirt.engine.ui.common.widget.tab.AbstractTabPanel (widget) and org.ovirt.engine.ui.common.view.AbstractTabPanelView (view) support DynamicTabPanel interface.
Note that for now, only main tab panel (org.ovirt.engine.ui.webadmin.section.main.presenter.MainTabPanelPresenter) supports dynamic tabs within its view.
------------------------------------------------------------------------
*Where is addSubTab API function?*
Implementing "addSubTab" API requires some more changes, and I didn't want to delay this PoC patch just because of it...
Here's a sample code that illustrates proposed "addSubTab" API usage:
UiInit: *function*() { api.addSubTab('Host', // entityTypeName 'Custom Host Sub Tab', // label 'custom-host-sub-tab', // historyToken 'http://www.ovirt.org/', // contentUrl
// Sub tab interface object // All functions receive currently selected item(s) // within the main tab data grid as function arguments {
// Returning 'true' means the sub tab is visible // Returning 'false' means the sub tab is hidden // Default value = 'true' isAccessible: *function*() { *return*arguments.length == 1 && arguments[0].entityId == '<MyHostEntityId>'; }
}
); }
As part of "addSubTab" API implementation, I'll refactor custom main tab components, in order to use one "tab type" for both main and sub tabs.
Currently, we have one (and only one) "tab type" - a tab that shows content of the given URL through HTML iframe element.
We could also create new "tab types", e.g. form-based tab that shows key/value pairs (IMHO this could be quite useful for custom sub tabs).
------------------------------------------------------------------------
Let me know what you think!
Cheers, Vojtech
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel
_______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel _______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel

entityTypeName</i> values are strings reflecting org.ovirt.engine.ui.weba= dmin.plugin.entityEntityType enum members. Following <i>entityTypeName</i> values are currently supported (v= alues are case-sensitive): "DataCenter", "Cluster", "Host", "Storage", "Dis= k", "VirtualMachine", "Template".<br> <br> Note: "Pool" value is currently not supported, because of org.ovirt.engine.= core.common.businessentities.vm_pools entity not implementing the BusinessE= ntity interface, not sure why though. Maybe we should switch from BusinessE= ntity to IVdcQueryable interface and always cast getQueryableId method result value to Guid?<br> <br> <i>label</i> is the title displayed on the button<i>.<br> </i><br> <i>actionButtonInterface</i> represents an object that "implements the butt= on interface" by declaring its functions: <i>onClick</i>, <i>isEnabled</i>, <i>isAccessible</i>. All functions of <i>= actionButtonInterface</i> receive currently selected item(s) as function ar= guments.<br> <br> Let's take a closer look at the concept behind <i>actionButtonInterface</i>= . In traditional class-based object-oriented languages, such as Java, inter= face is an abstract type that contains method declarations without an imple= mentation. A class that implements
function</span></b><span style=3D"font-family:"Courier New";colo= r:black">() {<br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; /= / Calling 'arguments[0]' is safe, because onClick() can be called<br> &= nbsp; // only when exactly one item is currently selected in the data grid<= br> </span><span style=3D"font-family:"Courier New";color:black">&nbs=
function</span></b><span style=3D"font-family:"Courier New";colo= r:black">() {<br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; &nb= sp; // Enable button only when exactly one item is selected<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs=
function</span></b><span style=3D"font-family:"Courier New";colo= r:black">() {</span><span style=3D"color:black"><br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; /= / Always show the button in the corresponding data grid<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs=
true</span></b><span style=3D"font-family:"Courier New";color:bl= ack">;<br> }</span><span=
------=_Part_11440654_422058147.1351013711837 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Chris,=20 well, I planned to implement simple "show dialog with content loaded from g= iven URL" plugin API function some time ago, but then I thought you might b= e experimenting with it already :) please feel free to work on that, we can= include it into PoC revision 7.=20 Regarding planned items for revision 7, here's my current list (feel free t= o add/modify things here if necessary):=20 * "add custom sub tab" plugin API function, with initial sub tab implem= entation showing content of the given URL (we can add more tab types later = on, e.g. form-based or table-based tab)=20 * "add custom task to task pane" plugin API function, requires some UiC= ommon integration coding (I will handle this)=20 * "show dialog with content loaded from given URL" plugin API function,= initial implementation could simply open new browser popup window using wi= ndow.open (but any other approach is fine as well)=20 * integration with REST API, e.g. "obtain REST API authentication token= " plugin API function, maybe also some API for performing actual HTTP REST = calls?=20 As for the Engine REST API authentication token, need to learn more about i= t, as WebAdmin GUI currently uses GWT RPC instead of REST API when communic= ating with the backend.=20 You also mentioned that "we can make calls from our server into the REST AP= I" - I assume this will be used together with "custom content for tab/dialo= g" plugin API functionality? (Otherwise I'd say the UI Plugin itself could = make REST API calls on its own..)=20 Regards,=20 Vojtech=20 ----- Original Message ----- From: "Christopher Morrissey" <Christopher.Morrissey@netapp.com>=20 To: "Vojtech Szocs" <vszocs@redhat.com>, "engine-devel" <engine-devel@ovirt= .org>=20 Sent: Monday, October 22, 2012 5:25:53 PM=20 Subject: RE: [Engine-devel] UI Plugins: PoC patch revision 6 now available= =20 Hi Vojtech,=20 Thanks again for the delivery of the patch. For revision 7, do you have a l= ist of content? I had previously indicated I could work on adding the plugi= n API to launch a dialog, but hadn=E2=80=99t been able to get started on it= until now. I wanted to see if you by chance were already working on it or = if you were planning to deliver that yourself in the next revision?=20 A couple of other items we are looking for are the ability to add tasks for= execution and get access to the session ID or some kind of authentication = token so that we can make calls from our server into the REST API. I=E2=80= =99m not very familiar yet with the REST API so I=E2=80=99m not sure what a= uthentication methods are available and which would be best.=20 -Chris=20 From: engine-devel-bounces@ovirt.org [mailto:engine-devel-bounces@ovirt.org= ] On Behalf Of Vojtech Szocs=20 Sent: Thursday, October 18, 2012 10:49 AM=20 To: engine-devel=20 Subject: [Engine-devel] UI Plugins: PoC patch revision 6 now available=20 Hi guys,=20 the latest revision of UI Plugins proof-of-concept patch is now available f= or you to experiment with. You can download the patch from oVirt Gerrit at = http://gerrit.ovirt.org/#/c/8120/2 (patch set 2).=20 Please read on to learn what's new in this revision. If you have any commen= ts, questions or ideas, please let me know!=20 0. UI plugin path information resolved using local Engine configuration=20 Server-side UI plugin infrastructure now uses local (machine-specific) Engi= ne configuration instead of global ( vdc_options database table) Engine con= figuration:=20 * Previously, path information was resolved through org.ovirt.engine.co= re.common.config.Config class - Engine configuration values were retrieved = from vdc_options database table.=20 * Currently, path information is resolved through org.ovirt.engine.core= .utils.LocalConfig class - Engine configuration values are retrieved from l= ocal file system.=20 In case you're not working with oVirt Engine through RPM package system, e.= g. you have a local development environment set up and you build and deploy= oVirt Engine through Maven, please follow these steps:=20 a. Copy default Engine configuration into /usr/share/ ovirt-engine /conf=20 # mkdir -p /usr/share/ovirt-engine/conf=20 # cp <OVIRT_HOME>/backend/manager/conf/engine.conf.defaults /usr/share/ovir= t-engine/conf/engine.conf.defaults=20 b. If necessary, copy UI plugin data files from /usr/share/engine/ui-plugin= s to /usr/share/ ovirt-engine /ui-plugins=20 c. If necessary, copy UI plugin config files from /etc/engine/ui-plugins to= /etc/ ovirt-engine /ui-plugins=20 d, In case you want to override the default Engine configuration, put your = custom property file into /etc/sysconfig/ovirt-engine=20 The reason behind this change is that path information for UI plugin data a= nd configuration is typically machine-specific, and should be customizable = per machine through Engine local configuration.=20 1. New plugin API function: addMainTabActionButton=20 The "addMainTabActionButton" API adds custom context-sensitive button to th= e given main tab's data grid, along with corresponding data grid context me= nu item.=20 addMainTabActionButton(entityTypeName, label, actionButtonInterface)=20 entityTypeName indicates which main tab's data grid the button should be ad= ded to, according to the entity type associated with the main tab. entityTy= peName values are strings reflecting org.ovirt.engine.ui.webadmin.plugin.en= tityEntityType enum members. Following entityTypeName values are currently = supported (values are case-sensitive): "DataCenter", "Cluster", "Host", "St= orage", "Disk", "VirtualMachine", "Template".=20 Note: "Pool" value is currently not supported, because of org.ovirt.engine.= core.common.businessentities.vm_pools entity not implementing the BusinessE= ntity interface, not sure why though. Maybe we should switch from BusinessE= ntity to IVdcQueryable interface and always cast getQueryableId method resu= lt value to Guid?=20 label is the title displayed on the button .=20 actionButtonInterface represents an object that "implements the button inte= rface" by declaring its functions: onClick , isEnabled , isAccessible . All= functions of actionButtonInterface receive currently selected item(s) as f= unction arguments.=20 Let's take a closer look at the concept behind actionButtonInterface . In t= raditional class-based object-oriented languages, such as Java, interface i= s an abstract type that contains method declarations without an implementat= ion. A class that implements the given interface must implement all methods= declared by that interface (unless it's an abstract class, but this isn't = relevant in our case).=20 In contrast with traditional class-based object-oriented languages, JavaScr= ipt supports OOP through prototype-based programming model ( https://develo= per.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-Oriented_JavaS= cript ). At the same time, JavaScript language is dynamically-typed and the= refore doesn't support traditional concept of interface in OOP, it uses "du= ck typing" technique instead ( http://en.wikipedia.org/wiki/Duck_typing ).= =20 The simplest way to provide an object that "implements the given interface"= in JavaScript is to use "duck typing" technique: providing an object that = contains well-known functions. In UI plugin infrastructure, I call this con= cept "interface object", represented by org.ovirt.engine.ui.webadmin.plugin= .jsni.JsInterfaceObject class. Unlike the traditional concept of interface = abstract type in object-oriented languages, an "interface object" does not = necessarily have to declare all functions of the given interface in order t= o "implement" such interface. In fact, an empty object can be used as a val= id "interface object". Missing functions will be simply treated as empty (n= o-op) functions. Furthermore, an "interface object" can "implement" multipl= e interfaces by declaring functions of those interfaces (interface composit= ion).=20 Getting back to "addMainTabActionButton" API, here's a sample code that add= s new button to "Host" main tab data grid, as part of UiInit event handler = function:=20 UiInit: function () {=20 api. addMainTabActionButton ('Host', 'Single-Host Action',=20 // Action button interface object=20 // All functions receive currently selected item(s) as function arguments= =20 {=20 // Called when the user clicks the button=20 onClick : function () {=20 // Calling 'arguments[0]' is safe, because onClick() can be called=20 // only when exactly one item is currently selected in the data grid=20 window.alert('Selected host entity ID =3D ' + arguments[0].entityId);=20 },=20 // Returning 'true' means the button is enabled (clickable)=20 // Returning 'false' means the button is disabled (non-clickable)=20 // Default value =3D 'true'=20 isEnabled : function () {=20 // Enable button only when exactly one item is selected=20 return arguments.length =3D=3D 1;=20 },=20 // Returning 'true' means the button is visible=20 // Returning 'false' means the button is hidden=20 // Default value =3D 'true'=20 isAccessible : function () {=20 // Always show the button in the corresponding data grid=20 return true ;=20 }=20 }=20 );=20 }=20 As mentioned above, all functions of an interface object are optional. For = functions expecting return value, default value is defined by UI plugin inf= rastructure. For example:=20 * onClick - no default value (no return value expected)=20 * isEnabled / isAccessible - default value "true" (boolean return value= expected)=20 Note: UI plugin infrastructure checks the actual return value type, and use= s default value in case the function returned something of wrong (unexpecte= d) type.=20 In the example above, "currently selected item(s)" maps to JSON-like repres= entations of business entities currently selected in the corresponding data= grid. For now, the entity representation is quite simple and same for all = entity types:=20 { entityId: "[BusinessEntityGuidAsString]" }=20 In future, we will create specific JSON-like representations for specific b= usiness entities, in compliance with Engine REST API entity structure.=20 For a more extensive example of using "addMainTabActionButton" API, please = see the attached "addMainTabActionButton.html.example" file.=20 2. Improved plugin API function: addMainTab=20 The "addMainTab" API was improved to address following issues:=20 * "addMainTab" can now be called at any moment during UI plugin runtime= , given that the plugin is allowed invoke plugin API functions (plugin is e= ither INITIALIZING or IN_USE). Previously, "addMainTab" worked reliably onl= y when called from within UiInit event handler function. Currently, it's po= ssible to call "addMainTab" at any moment, e.g. from within some other even= t handler function (after UiInit has completed).=20 * "addMainTab" now retains "active" tab (highlighted tab GUI). "addMain= Tab" works by adding new tab component (GWTP presenter proxy) and refreshin= g main tab panel GUI by removing all related tabs and re-adding them again.= This logic is handled by org.ovirt.engine.ui.common.presenter.DynamicTabCo= ntainerPresenter class, which makes sure that "active" tab is retained even= after main tab panel was refreshed.=20 Furthermore, custom main tab implementation now displays the content of the= given URL through HTML iframe element.=20 3. Improved native JavaScript function handling (GWT JSNI)=20 This patch introduces org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction a= nd org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunctionResultHelper classes = providing Java abstraction for invoking native JavaScript functions. These = classes follow the general contract of "interface object" as mentioned abov= e.=20 JsFunctionResultHelper is particularly useful when dealing with functions w= hich are expected to return value of a certain type. Too bad standard GWT J= SNI classes don't provide such abstraction for working with native function= s out-of-the-box...=20 4. ActionPanel and ActionTable type hierarchy refactoring (related to "addM= ainTabActionButton" API)=20 Previously, AbstractActionPanel and AbstractActionTable classes didn't impl= ement any reasonable interface that would allow other components (client-si= de UI plugin infrastructure) to depend on their functionality in a loosely-= coupled manner. This would make code that implements "addMainTabActionButto= n" API "ugly": main tab view interface would have to reference AbstractActi= onTable class directly. In MVP design pattern, view interface should avoid = referencing specific GWT Widget classes directly.=20 This patch introduces new interfaces for ActionPanel and ActionTable compon= ents while eliminating code redundancy (duplicate or unnecessary code).=20 5. ActionPanel type hierarchy refactoring (related to "addMainTab" API)=20 Since org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter def= ines new DynamicTabPanel interface that extends standard GWTP TabPanel inte= rface, some refactoring had to be done in related ActionPanel classes.=20 This patch makes sure that both org.ovirt.engine.ui.common.widget.tab.Abstr= actTabPanel (widget) and org.ovirt.engine.ui.common.view.AbstractTabPanelVi= ew (view) support DynamicTabPanel interface.=20 Note that for now, only main tab panel (org.ovirt.engine.ui.webadmin.sectio= n.main.presenter.MainTabPanelPresenter) supports dynamic tabs within its vi= ew.=20 Where is addSubTab API function?=20 Implementing "addSubTab" API requires some more changes, and I didn't want = to delay this PoC patch just because of it...=20 Here's a sample code that illustrates proposed "addSubTab" API usage:=20 UiInit: function () {=20 api. addSubTab ('Host', // entityTypeName=20 'Custom Host Sub Tab', // label=20 'custom-host-sub-tab', // historyToken=20 'http://www.ovirt.org/', // contentUrl=20 // Sub tab interface object=20 // All functions receive currently selected item(s)=20 // within the main tab data grid as function arguments=20 {=20 // Returning 'true' means the sub tab is visible=20 // Returning 'false' means the sub tab is hidden=20 // Default value =3D 'true'=20 isAccessible : function () {=20 return arguments.length =3D=3D 1 && arguments[0].entityId =3D=3D '<MyHostEn= tityId>';=20 }=20 }=20 );=20 }=20 As part of "addSubTab" API implementation, I'll refactor custom main tab co= mponents, in order to use one "tab type" for both main and sub tabs.=20 Currently, we have one (and only one) "tab type" - a tab that shows content= of the given URL through HTML iframe element.=20 We could also create new "tab types", e.g. form-based tab that shows key/va= lue pairs (IMHO this could be quite useful for custom sub tabs).=20 Let me know what you think!=20 Cheers,=20 Vojtech=20 ------=_Part_11440654_422058147.1351013711837 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 Chris,<br><br>well, I planned to implement simple = "show dialog with content loaded from given URL" plugin API function some t= ime ago, but then I thought you might be experimenting with it already :) p= lease feel free to work on that, we can include it into PoC revision 7.<br>= <br>Regarding planned items for revision 7, here's my current list (feel fr= ee to add/modify things here if necessary):<br><ul><li>"add custom sub tab"= plugin API function, with initial sub tab implementation showing content o= f the given URL (we can add more tab types later on, e.g. form-based or tab= le-based tab)</li><li>"add custom task to task pane" plugin API function, r= equires some UiCommon integration coding (I will handle this)<br></li><li>"= show dialog with content loaded from given URL" plugin API function, initia= l implementation could simply open new browser popup window using window.op= en (but any other approach is fine as well)<br></li><li>integration with RE= ST API, e.g. "obtain REST API authentication token" plugin API function, ma= ybe also some API for performing actual HTTP REST calls?<br></li></ul><p><b= r></p><p>As for the Engine REST API authentication token, need to learn mor= e about it, as WebAdmin GUI currently uses GWT RPC instead of REST API when= communicating with the backend.</p><p></p><p><br></p><p>You also mentioned= that "we can make calls from our server into the REST API" - I assume this= will be used together with "custom content for tab/dialog" plugin API func= tionality? (Otherwise I'd say the UI Plugin itself could make REST API call= s on its own..)<br></p><p><br></p><p>Regards,</p><p>Vojtech<br></p><br><br>= <hr id=3D"zwchr"><div style=3D"color:#000;font-weight:normal;font-style:nor= mal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:1= 2pt;"><b>From: </b>"Christopher Morrissey" <Christopher.Morrissey@netapp= .com><br><b>To: </b>"Vojtech Szocs" <vszocs@redhat.com>, "engine-d= evel" <engine-devel@ovirt.org><br><b>Sent: </b>Monday, October 22, 20= 12 5:25:53 PM<br><b>Subject: </b>RE: [Engine-devel] UI Plugins: PoC patch r= evision 6 now available<br><br> <style><!-- @font-face =09{font-family:Wingdings; =09panose-1:5 0 0 0 0 0 0 0 0 0;} @font-face =09{font-family:Wingdings; =09panose-1:5 0 0 0 0 0 0 0 0 0;} @font-face =09{font-family:Calibri; =09panose-1:2 15 5 2 2 2 4 3 2 4;} @font-face =09{font-family:Tahoma; =09panose-1:2 11 6 4 3 5 4 4 2 4;} p.MsoNormal, li.MsoNormal, div.MsoNormal =09{margin:0in; =09margin-bottom:.0001pt; =09font-size:12.0pt; =09font-family:"Times New Roman","serif";} a:link, span.MsoHyperlink =09{mso-style-priority:99; =09color:blue; =09text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed =09{mso-style-priority:99; =09color:purple; =09text-decoration:underline;} p =09{mso-style-priority:99; =09margin:0in; =09margin-bottom:.0001pt; =09font-size:12.0pt; =09font-family:"Times New Roman","serif";} span.EmailStyle20 =09{mso-style-type:personal-reply; =09font-family:"Calibri","sans-serif"; =09color:#1F497D;} .MsoChpDefault =09{mso-style-type:export-only; =09font-size:10.0pt;} @page WordSection1 =09{size:8.5in 11.0in; =09margin:1.0in 1.0in 1.0in 1.0in;} div.WordSection1 =09{page:WordSection1;} @list l0 =09{mso-list-id:430246997; =09mso-list-template-ids:-1402284674;} @list l0:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l0:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l0:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1 =09{mso-list-id:675302646; =09mso-list-template-ids:1662667256;} @list l1:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l1:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l1:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2 =09{mso-list-id:1330719658; =09mso-list-template-ids:-1858944704;} @list l2:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l2:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l2:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3 =09{mso-list-id:2009794949; =09mso-list-template-ids:-1270830370;} @list l3:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l3:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l3:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} ol =09{margin-bottom:0in;} ul =09{margin-bottom:0in;} --></style> <div class=3D"WordSection1"> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">Hi Vojtech,</span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">Thanks again for the deli= very of the patch. For revision 7, do you have a list of content? I had pre= viously indicated I could work on adding the plugin API to launch a dialog, but hadn=E2=80=99t been able to get started on it unti= l now. I wanted to see if you by chance were already working on it or if yo= u were planning to deliver that yourself in the next revision?</span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">A couple of other items w= e are looking for are the ability to add tasks for execution and get access= to the session ID or some kind of authentication token so that we can make calls from our server into the REST API. I=E2=80=99m n= ot very familiar yet with the REST API so I=E2=80=99m not sure what authent= ication methods are available and which would be best.</span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span></p> <div> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">-Chris</span></p> </div> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span></p> <div> <div style=3D"border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in = 0in 0in"> <p class=3D"MsoNormal"><b><span style=3D"font-size:10.0pt;font-family:"= ;Tahoma","sans-serif"">From:</span></b><span style=3D"font-s= ize:10.0pt;font-family:"Tahoma","sans-serif""> engine-d= evel-bounces@ovirt.org [mailto:engine-devel-bounces@ovirt.org] <b>On Behalf Of </b>Vojtech Szocs<br> <b>Sent:</b> Thursday, October 18, 2012 10:49 AM<br> <b>To:</b> engine-devel<br> <b>Subject:</b> [Engine-devel] UI Plugins: PoC patch revision 6 now availab= le</span></p> </div> </div> <p class=3D"MsoNormal"> </p> <div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black">Hi guys,<br> <br> the latest revision of UI Plugins proof-of-concept patch is now available f= or you to experiment with. You can download the patch from oVirt Gerrit at <a href=3D"http://gerrit.ovirt.org/#/c/8120/2" target=3D"_blank">http://ger= rit.ovirt.org/#/c/8120/2</a> (patch set 2).<br> <br> Please read on to learn what's new in this revision. If you have any commen= ts, questions or ideas, please let me know!</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr align=3D"center" size=3D"2" width=3D"100%"> </span></div> <p class=3D"MsoNormal"><span style=3D"color:black"><br> <strong>0. UI plugin path information resolved using local Engine configura= tion</strong><b><br> </b><br> Server-side UI plugin infrastructure now uses local (machine-specific) Engi= ne configuration instead of global (<em>vdc_options</em> database table) En= gine configuration:</span></p> <ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l3 level1 lfo1"> Previously, path information was resolved through org.ovirt.engine.core.com= mon.config.Config class - Engine configuration values were retrieved from <i>vdc_options</i> database table.</li><li class=3D"MsoNormal" style=3D"col= or:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l3 lev= el1 lfo1"> Currently, path information is resolved through org.ovirt.engine.core.utils= .LocalConfig class - Engine configuration values are retrieved from local f= ile system.</li></ul> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black">In case you're not working with oVirt Engine through RPM package sys= tem, e.g. you have a local development environment set up and you build and= deploy oVirt Engine through Maven, please follow these steps:<br> <br> a. Copy default Engine configuration into /usr/share/<b>ovirt-engine</b>/co= nf</span></p> <div style=3D"margin-left:30.0pt"> <p class=3D"MsoNormal"><span style=3D"font-family:"Courier New";c= olor:black"># mkdir -p /usr/share/ovirt-engine/conf<br> # cp <OVIRT_HOME>/backend/manager/conf/engine.conf.defaults /usr/shar= e/ovirt-engine/conf/engine.conf.defaults</span></p> </div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> b. If necessary, copy UI plugin data files from /usr/share/engine/ui-plugin= s to /usr/share/<b>ovirt-engine</b>/ui-plugins<br> <br> c. If necessary, copy UI plugin config files from /etc/engine/ui-plugins to= /etc/<b>ovirt-engine</b>/ui-plugins<br> <br> d, In case you want to override the default Engine configuration, put your = custom property file into /etc/sysconfig/ovirt-engine<br> <br> The reason behind this change is that path information for UI plugin data a= nd configuration is typically machine-specific, and should be customizable = per machine through Engine local configuration.</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr align=3D"center" size=3D"2" width=3D"100%"> </span></div> <p class=3D"MsoNormal"><span style=3D"color:black"><br> <b>1. New plugin API function: addMainTabActionButton<br> </b><br> The "addMainTabActionButton" API adds custom context-sensitive button to th= e given main tab's data grid, along with corresponding data grid context me= nu item.<br> <br> </span><span style=3D"font-family:"Courier New";color:black">addM= ainTabActionButton(entityTypeName, label, actionButtonInterface)<br> </span><span style=3D"color:black"><br> <i>entityTypeName</i> indicates which main tab's data grid the button shoul= d be added to, according to the entity type associated with the main tab.<i= the given interface must implement all methods declared by that interface = (unless it's an abstract class, but this isn't relevant in our case).<br> <br> In contrast with traditional class-based object-oriented languages, JavaScr= ipt supports OOP through prototype-based programming model (<a href=3D"http= s://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-Orie= nted_JavaScript" target=3D"_blank">https://developer.mozilla.org/en-US/docs= /JavaScript/Introduction_to_Object-Oriented_JavaScript</a>). At the same time, JavaScript language is dynamically-typed and therefore d= oesn't support traditional concept of interface in OOP, it uses "duck typin= g" technique instead (<a href=3D"http://en.wikipedia.org/wiki/Duck_typing" = target=3D"_blank">http://en.wikipedia.org/wiki/Duck_typing</a>).<br> <br> The simplest way to provide an object that "implements the given interface"= in JavaScript is to use "duck typing" technique: providing an object that = contains well-known functions. In UI plugin infrastructure, I call this con= cept "interface object", represented by org.ovirt.engine.ui.webadmin.plugin.jsni.JsInterfaceObject class. Unlik= e the traditional concept of interface abstract type in object-oriented lan= guages, an "interface object" <u>does not necessarily have to declare all functions of the given interfac= e</u> in order to "implement" such interface. In fact, an empty object can = be used as a valid "interface object". Missing functions will be simply tre= ated as empty (no-op) functions. Furthermore, an "interface object" can "implement" multiple interfaces by = declaring functions of those interfaces (interface composition).<br> <br> Getting back to "addMainTabActionButton" API, here's a sample code that add= s new button to "Host" main tab data grid, as part of UiInit event handler = function:<br> <br> </span><span style=3D"font-family:"Courier New";color:black">UiIn= it: </span><b><span style=3D"font-family:"Courier New";color:#990= 000">function</span></b><span style=3D"font-family:"Courier New";= color:black">() {<br> api.</span><span style=3D"font-family:"Courier New&= quot;;color:#CC33CC">addMainTabActionButton</span><span style=3D"font-famil= y:"Courier New";color:black">('Host', 'Single-Host Action',<br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Action button interface object<= br> // All functions receive current= ly selected item(s) as function arguments<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; {</span><span style=3D"color:black">= <br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Called when the u= ser clicks the button</span><span style=3D"color:#006600"><br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; </span><span style=3D"font-= family:"Courier New";color:#000099">onClick</span><span style=3D"= font-family:"Courier New";color:black">: </span><b><span style=3D"font-family:"Courier New";color:#990000"= p;  = ; window.alert('Selected host entity ID =3D ' + arguments[0].entityId);<br> },</span><span style=3D= "color:black"><br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Returning 'true' means= the button is enabled (clickable)</span><span style=3D"color:#006600"><br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Returning 'false' mean= s the button is disabled (non-clickable)<br> // Defau= lt value =3D 'true'<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; </span><span style=3D"font-= family:"Courier New";color:#000099">isEnabled</span><span style= =3D"font-family:"Courier New";color:black">: </span><b><span style=3D"font-family:"Courier New";color:#990000"= p;  = ; </span> <b><span style=3D"font-family:"Courier New";color:#990000">return= </span></b><span style=3D"font-family:"Courier New";color:black">= arguments.length =3D=3D 1;<br> },</span><span style=3D"colo= r:black"><br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Returning 'true' means= the button is visible<br> // Retur= ning 'false' means the button is hidden<br> // Default value =3D 't= rue'<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; </span><span style=3D"font-famil= y:"Courier New";color:#000099">isAccessible</span><span style=3D"= font-family:"Courier New";color:black">: </span><b><span style=3D"font-family:"Courier New";color:#990000"= p;  = ; </span> <b><span style=3D"font-family:"Courier New";color:#990000">return= </span></b><span style=3D"font-family:"Courier New";color:black"> </span><b><span style=3D"font-family:"Courier New";color:#990000"= style=3D"color:black"><br> </span><span style=3D"font-family:"Courier New";color:black"><br> }<br> <br> );<br> }</span><span style=3D"color:black"><br> <br> As mentioned above, all functions of an interface object are optional. For = functions expecting return value, default value is defined by UI plugin inf= rastructure. For example:</span></p> <ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l2 level1 lfo2"> onClick - no default value (no return value expected)</li><li class=3D"MsoN= ormal" style=3D"color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:a= uto;mso-list:l2 level1 lfo2"> isEnabled / isAccessible - default value "true" (boolean return value expec= ted)</li></ul> <p><span style=3D"color:black">Note: UI plugin infrastructure checks the ac= tual return value type, and uses default value in case the function returne= d something of wrong (unexpected) type.</span></p> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> In the example above, "currently selected item(s)" maps to JSON-like repres= entations of business entities currently selected in the corresponding data= grid. For now, the entity representation is quite simple and same for all = entity types:<br> <br> </span><span style=3D"font-family:"Courier New";color:black">{ en= tityId: "[BusinessEntityGuidAsString]" }<br> </span><span style=3D"color:black"><br> In future, we will create specific JSON-like representations for specific b= usiness entities, in compliance with Engine REST API entity structure.<br> <br> For a more extensive example of using "addMainTabActionButton" API, please = see the attached "addMainTabActionButton.html.example" file.</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr align=3D"center" size=3D"2" width=3D"100%"> </span></div> <p class=3D"MsoNormal"><span style=3D"color:black"><br> <b>2. Improved plugin API function: addMainTab<br> </b><br> The "addMainTab" API was improved to address following issues:</span></p> <ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l1 level1 lfo3"> "addMainTab" can now be called at any moment during UI plugin runtime, give= n that the plugin is allowed invoke plugin API functions (plugin is either = INITIALIZING or IN_USE).<br> Previously, "addMainTab" worked reliably only when called from within UiIni= t event handler function.<br> Currently, it's possible to call "addMainTab" at any moment, e.g. from with= in some other event handler function (after UiInit has completed).</li></ul=
// label</span><span style=3D"font-family:"Courier New";color:bl= ack"><br> 'custom-host-sub-tab', </= span><span style=3D"font-family:"Courier New";color:#006600">// h= istoryToken</span><span style=3D"font-family:"Courier New";color:= black"><br> 'http://www.ovirt.org/', </span>= <span style=3D"font-family:"Courier New";color:#006600">// conten= tUrl<br> <br> </span><span style=3D"font-family:"Courier New";color:black">&nbs=
<ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l0 level1 lfo4"> "addMainTab" now retains "active" tab (highlighted tab GUI).<br> "addMainTab" works by adding new tab component (GWTP presenter proxy) and r= efreshing main tab panel GUI by removing all related tabs and re-adding the= m again.<br> This logic is handled by org.ovirt.engine.ui.common.presenter.DynamicTabCon= tainerPresenter class, which makes sure that "active" tab is retained even = after main tab panel was refreshed.</li></ul> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black">Furthermore, custom main tab implementation now displays the content= of the given URL through HTML iframe element.</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr align=3D"center" size=3D"2" width=3D"100%"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> <b>3. Improved native JavaScript function handling</b> (GWT JSNI)<br> <br> This patch introduces org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction a= nd org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunctionResultHelper classes = providing Java abstraction for invoking native JavaScript functions. These = classes follow the general contract of "interface object" as mentioned above.<br> <br> JsFunctionResultHelper is particularly useful when dealing with functions w= hich are expected to return value of a certain type. Too bad standard GWT J= SNI classes don't provide such abstraction for working with native function= s out-of-the-box...</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr align=3D"center" size=3D"2" width=3D"100%"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> <b>4. ActionPanel and ActionTable type hierarchy refactoring</b> (related t= o "addMainTabActionButton" API)<b><br> </b><br> Previously, AbstractActionPanel and AbstractActionTable classes didn't impl= ement any reasonable interface that would allow other components (client-si= de UI plugin infrastructure) to depend on their functionality in a loosely-= coupled manner. This would make code that implements "addMainTabActionButton" API "ugly": main tab view in= terface would have to reference AbstractActionTable class directly. In MVP = design pattern, view interface should avoid referencing specific GWT Widget= classes directly.<br> <br> This patch introduces new interfaces for ActionPanel and ActionTable compon= ents while eliminating code redundancy (duplicate or unnecessary code).</sp= an></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr align=3D"center" size=3D"2" width=3D"100%"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> <b>5. ActionPanel type hierarchy refactoring</b> (related to "addMainTab" A= PI)<br> <br> Since org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter def= ines new DynamicTabPanel interface that extends standard GWTP TabPanel inte= rface, some refactoring had to be done in related ActionPanel classes.<br> <br> This patch makes sure that both org.ovirt.engine.ui.common.widget.tab.Abstr= actTabPanel (widget) and org.ovirt.engine.ui.common.view.AbstractTabPanelVi= ew (view) support DynamicTabPanel interface.<br> <br> Note that for now, only main tab panel (org.ovirt.engine.ui.webadmin.sectio= n.main.presenter.MainTabPanelPresenter) supports dynamic tabs within its vi= ew.</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr align=3D"center" size=3D"2" width=3D"100%"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> <b>Where is addSubTab API function?</b><br> <br> Implementing "addSubTab" API requires some more changes, and I didn't want = to delay this PoC patch just because of it...<br> <br> Here's a sample code that illustrates proposed "addSubTab" API usage:<br> <br> </span><span style=3D"font-family:"Courier New";color:black">UiIn= it: </span><b><span style=3D"font-family:"Courier New";color:#990= 000">function</span></b><span style=3D"font-family:"Courier New";= color:black">() {<br> api.</span><span style=3D"font-family:"Courier New&= quot;;color:#CC33CC">addSubTab</span><span style=3D"font-family:"Couri= er New";color:black">('Host', </span><span style=3D"font-family:"Courier New";color:#006600">//= entityTypeName</span><span style=3D"font-family:"Courier New";co= lor:black"><br> 'Custom Host Sub Tab', &nbs= p; </span><span style=3D"font-family:"Courier New";color:#006600"= p; </span><span style=3D"font-family:&q= uot;Courier New";color:#006600;background:white">// Sub tab interface = object<br> // </span><span style=3D"font-fa= mily:"Courier New";color:#006600">All functions receive currently= selected item(s)<br> // within the main tab data grid= as function arguments</span><span style=3D"color:#006600"><br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; {</span><span style=3D"color:black">= <br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Returning 'true' means= the sub tab is visible<br> // Retur= ning 'false' means the sub tab is hidden<br> // Default value =3D 't= rue'<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; </span><span style=3D"font-famil= y:"Courier New";color:#000099">isAccessible</span><span style=3D"= font-family:"Courier New";color:black">: </span><b><span style=3D"font-family:"Courier New";color:#990000"=
function</span></b><span style=3D"font-family:"Courier New";colo= r:black">() {<br> &= nbsp; </span><b><span style=3D"font-family:"Courier New";color:#9= 90000">return</span></b><span style=3D"font-family:"Courier New";=
color:black"> arguments.length =3D=3D 1 && arguments[0].entityId = =3D=3D '<MyHostEntityId>';<br> }</span><span= style=3D"color:black"><br> </span><span style=3D"font-family:"Courier New";color:black"><br> }<br> <br> );<br> }</span><span style=3D"color:black"><br> <br> As part of "addSubTab" API implementation, I'll refactor custom main tab co= mponents, in order to use one "tab type" for both main and sub tabs.<br> <br> Currently, we have one (and only one) "tab type" - a tab that shows content= of the given URL through HTML iframe element.<br> <br> We could also create new "tab types", e.g. form-based tab that shows key/va= lue pairs (IMHO this could be quite useful for custom sub tabs).</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr align=3D"center" size=3D"2" width=3D"100%"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> Let me know what you think!<br> <br> Cheers,<br> Vojtech</span></p> </div> </div>
</div><br></div></body></html> ------=_Part_11440654_422058147.1351013711837--

--_000_D290AD8432118048947689BA3AE8A9B3EA0742SACEXCMBX04PRDhqn_ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGkgVm9qdGVjaCwNCg0KSXQgbG9va3MgbGlrZSBJ4oCZbSBnb2luZyB0byBiZSBpbiB0cmFpbmlu ZyBhbGwgbmV4dCB3ZWVrIGFuZCB3aWxsIHVuZm9ydHVuYXRlbHkgTk9UIGJlIGFibGUgdG8gdGFr ZSBvbiB0aGUgd29yayB0byBpbXBsZW1lbnQgdGhlIOKAnHNob3cgZGlhbG9nIHdpdGggY29udGVu dCBsb2FkZWQgZnJvbSBnaXZlbiBVUkzigJ0gcGx1Z2luIEFQSSBmdW5jdGlvbiBhcyBJIGhhZCBo b3BlZC4gVGhpcyBpcyBzb21ldGhpbmcgd2UgcmVhbGx5IG5lZWQgZm9yIHJldmlzaW9uIDcuIE9m IHRoZSBpdGVtcyBpbiB5b3VyIGxpc3QgZm9yIGluY2x1c2lvbiwgdGhlIHN1Yi10YWIgZnJhbWUg cGx1Z2luIGlzIHRoZSBsZWFzdCBuZWNlc3NhcnkgZm9yIHVzLiBUaGUgcmVzdCBvZiB0aGUgaXRl bXMgYXJlIGFsbCBwcmV0dHkgaW1wb3J0YW50Lg0KDQpMZXQgbWUga25vdyBpZiBhbnkgb2YgdGhp cyBpcyBhIHByb2JsZW0gb3IgaWYgd2UgY2FuIHNoaWZ0IHRoaW5ncyBhcm91bmQgdG8gZ2V0IHRo ZW0gaW4gdGhlIHJpZ2h0IG9yZGVyLg0KDQotQ2hyaXMNCg0KRnJvbTogVm9qdGVjaCBTem9jcyBb bWFpbHRvOnZzem9jc0ByZWRoYXQuY29tXQ0KU2VudDogVHVlc2RheSwgT2N0b2JlciAyMywgMjAx MiAxOjM1IFBNDQpUbzogTW9ycmlzc2V5LCBDaHJpc3RvcGhlcg0KQ2M6IGVuZ2luZS1kZXZlbA0K U3ViamVjdDogUmU6IFtFbmdpbmUtZGV2ZWxdIFVJIFBsdWdpbnM6IFBvQyBwYXRjaCByZXZpc2lv biA2IG5vdyBhdmFpbGFibGUNCg0KSGkgQ2hyaXMsDQoNCndlbGwsIEkgcGxhbm5lZCB0byBpbXBs ZW1lbnQgc2ltcGxlICJzaG93IGRpYWxvZyB3aXRoIGNvbnRlbnQgbG9hZGVkIGZyb20gZ2l2ZW4g VVJMIiBwbHVnaW4gQVBJIGZ1bmN0aW9uIHNvbWUgdGltZSBhZ28sIGJ1dCB0aGVuIEkgdGhvdWdo dCB5b3UgbWlnaHQgYmUgZXhwZXJpbWVudGluZyB3aXRoIGl0IGFscmVhZHkgOikgcGxlYXNlIGZl ZWwgZnJlZSB0byB3b3JrIG9uIHRoYXQsIHdlIGNhbiBpbmNsdWRlIGl0IGludG8gUG9DIHJldmlz aW9uIDcuDQoNClJlZ2FyZGluZyBwbGFubmVkIGl0ZW1zIGZvciByZXZpc2lvbiA3LCBoZXJlJ3Mg bXkgY3VycmVudCBsaXN0IChmZWVsIGZyZWUgdG8gYWRkL21vZGlmeSB0aGluZ3MgaGVyZSBpZiBu ZWNlc3NhcnkpOg0KDQogICogICAiYWRkIGN1c3RvbSBzdWIgdGFiIiBwbHVnaW4gQVBJIGZ1bmN0 aW9uLCB3aXRoIGluaXRpYWwgc3ViIHRhYiBpbXBsZW1lbnRhdGlvbiBzaG93aW5nIGNvbnRlbnQg b2YgdGhlIGdpdmVuIFVSTCAod2UgY2FuIGFkZCBtb3JlIHRhYiB0eXBlcyBsYXRlciBvbiwgZS5n LiBmb3JtLWJhc2VkIG9yIHRhYmxlLWJhc2VkIHRhYikNCiAgKiAgICJhZGQgY3VzdG9tIHRhc2sg dG8gdGFzayBwYW5lIiBwbHVnaW4gQVBJIGZ1bmN0aW9uLCByZXF1aXJlcyBzb21lIFVpQ29tbW9u IGludGVncmF0aW9uIGNvZGluZyAoSSB3aWxsIGhhbmRsZSB0aGlzKQ0KICAqICAgInNob3cgZGlh bG9nIHdpdGggY29udGVudCBsb2FkZWQgZnJvbSBnaXZlbiBVUkwiIHBsdWdpbiBBUEkgZnVuY3Rp b24sIGluaXRpYWwgaW1wbGVtZW50YXRpb24gY291bGQgc2ltcGx5IG9wZW4gbmV3IGJyb3dzZXIg cG9wdXAgd2luZG93IHVzaW5nIHdpbmRvdy5vcGVuIChidXQgYW55IG90aGVyIGFwcHJvYWNoIGlz IGZpbmUgYXMgd2VsbCkNCiAgKiAgIGludGVncmF0aW9uIHdpdGggUkVTVCBBUEksIGUuZy4gIm9i dGFpbiBSRVNUIEFQSSBhdXRoZW50aWNhdGlvbiB0b2tlbiIgcGx1Z2luIEFQSSBmdW5jdGlvbiwg bWF5YmUgYWxzbyBzb21lIEFQSSBmb3IgcGVyZm9ybWluZyBhY3R1YWwgSFRUUCBSRVNUIGNhbGxz Pw0KDQoNCg0KQXMgZm9yIHRoZSBFbmdpbmUgUkVTVCBBUEkgYXV0aGVudGljYXRpb24gdG9rZW4s IG5lZWQgdG8gbGVhcm4gbW9yZSBhYm91dCBpdCwgYXMgV2ViQWRtaW4gR1VJIGN1cnJlbnRseSB1 c2VzIEdXVCBSUEMgaW5zdGVhZCBvZiBSRVNUIEFQSSB3aGVuIGNvbW11bmljYXRpbmcgd2l0aCB0 aGUgYmFja2VuZC4NCg0KDQoNCllvdSBhbHNvIG1lbnRpb25lZCB0aGF0ICJ3ZSBjYW4gbWFrZSBj YWxscyBmcm9tIG91ciBzZXJ2ZXIgaW50byB0aGUgUkVTVCBBUEkiIC0gSSBhc3N1bWUgdGhpcyB3 aWxsIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCAiY3VzdG9tIGNvbnRlbnQgZm9yIHRhYi9kaWFsb2ci IHBsdWdpbiBBUEkgZnVuY3Rpb25hbGl0eT8gKE90aGVyd2lzZSBJJ2Qgc2F5IHRoZSBVSSBQbHVn aW4gaXRzZWxmIGNvdWxkIG1ha2UgUkVTVCBBUEkgY2FsbHMgb24gaXRzIG93bi4uKQ0KDQoNCg0K UmVnYXJkcywNCg0KVm9qdGVjaA0KDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0K RnJvbTogIkNocmlzdG9waGVyIE1vcnJpc3NleSIgPENocmlzdG9waGVyLk1vcnJpc3NleUBuZXRh cHAuY29tPg0KVG86ICJWb2p0ZWNoIFN6b2NzIiA8dnN6b2NzQHJlZGhhdC5jb20+LCAiZW5naW5l LWRldmVsIiA8ZW5naW5lLWRldmVsQG92aXJ0Lm9yZz4NClNlbnQ6IE1vbmRheSwgT2N0b2JlciAy MiwgMjAxMiA1OjI1OjUzIFBNDQpTdWJqZWN0OiBSRTogW0VuZ2luZS1kZXZlbF0gVUkgUGx1Z2lu czogUG9DIHBhdGNoIHJldmlzaW9uIDYgbm93IGF2YWlsYWJsZQ0KSGkgVm9qdGVjaCwNCg0KVGhh bmtzIGFnYWluIGZvciB0aGUgZGVsaXZlcnkgb2YgdGhlIHBhdGNoLiBGb3IgcmV2aXNpb24gNywg ZG8geW91IGhhdmUgYSBsaXN0IG9mIGNvbnRlbnQ/IEkgaGFkIHByZXZpb3VzbHkgaW5kaWNhdGVk IEkgY291bGQgd29yayBvbiBhZGRpbmcgdGhlIHBsdWdpbiBBUEkgdG8gbGF1bmNoIGEgZGlhbG9n LCBidXQgaGFkbuKAmXQgYmVlbiBhYmxlIHRvIGdldCBzdGFydGVkIG9uIGl0IHVudGlsIG5vdy4g SSB3YW50ZWQgdG8gc2VlIGlmIHlvdSBieSBjaGFuY2Ugd2VyZSBhbHJlYWR5IHdvcmtpbmcgb24g aXQgb3IgaWYgeW91IHdlcmUgcGxhbm5pbmcgdG8gZGVsaXZlciB0aGF0IHlvdXJzZWxmIGluIHRo ZSBuZXh0IHJldmlzaW9uPw0KDQpBIGNvdXBsZSBvZiBvdGhlciBpdGVtcyB3ZSBhcmUgbG9va2lu ZyBmb3IgYXJlIHRoZSBhYmlsaXR5IHRvIGFkZCB0YXNrcyBmb3IgZXhlY3V0aW9uIGFuZCBnZXQg YWNjZXNzIHRvIHRoZSBzZXNzaW9uIElEIG9yIHNvbWUga2luZCBvZiBhdXRoZW50aWNhdGlvbiB0 b2tlbiBzbyB0aGF0IHdlIGNhbiBtYWtlIGNhbGxzIGZyb20gb3VyIHNlcnZlciBpbnRvIHRoZSBS RVNUIEFQSS4gSeKAmW0gbm90IHZlcnkgZmFtaWxpYXIgeWV0IHdpdGggdGhlIFJFU1QgQVBJIHNv IEnigJltIG5vdCBzdXJlIHdoYXQgYXV0aGVudGljYXRpb24gbWV0aG9kcyBhcmUgYXZhaWxhYmxl IGFuZCB3aGljaCB3b3VsZCBiZSBiZXN0Lg0KDQotQ2hyaXMNCg0KRnJvbTogZW5naW5lLWRldmVs LWJvdW5jZXNAb3ZpcnQub3JnIFttYWlsdG86ZW5naW5lLWRldmVsLWJvdW5jZXNAb3ZpcnQub3Jn XSBPbiBCZWhhbGYgT2YgVm9qdGVjaCBTem9jcw0KU2VudDogVGh1cnNkYXksIE9jdG9iZXIgMTgs IDIwMTIgMTA6NDkgQU0NClRvOiBlbmdpbmUtZGV2ZWwNClN1YmplY3Q6IFtFbmdpbmUtZGV2ZWxd IFVJIFBsdWdpbnM6IFBvQyBwYXRjaCByZXZpc2lvbiA2IG5vdyBhdmFpbGFibGUNCg0KSGkgZ3V5 cywNCg0KdGhlIGxhdGVzdCByZXZpc2lvbiBvZiBVSSBQbHVnaW5zIHByb29mLW9mLWNvbmNlcHQg cGF0Y2ggaXMgbm93IGF2YWlsYWJsZSBmb3IgeW91IHRvIGV4cGVyaW1lbnQgd2l0aC4gWW91IGNh biBkb3dubG9hZCB0aGUgcGF0Y2ggZnJvbSBvVmlydCBHZXJyaXQgYXQgaHR0cDovL2dlcnJpdC5v dmlydC5vcmcvIy9jLzgxMjAvMiAocGF0Y2ggc2V0IDIpLg0KDQpQbGVhc2UgcmVhZCBvbiB0byBs ZWFybiB3aGF0J3MgbmV3IGluIHRoaXMgcmV2aXNpb24uIElmIHlvdSBoYXZlIGFueSBjb21tZW50 cywgcXVlc3Rpb25zIG9yIGlkZWFzLCBwbGVhc2UgbGV0IG1lIGtub3chDQpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXw0KDQowLiBVSSBwbHVnaW4gcGF0aCBpbmZvcm1hdGlvbiByZXNv bHZlZCB1c2luZyBsb2NhbCBFbmdpbmUgY29uZmlndXJhdGlvbg0KDQpTZXJ2ZXItc2lkZSBVSSBw bHVnaW4gaW5mcmFzdHJ1Y3R1cmUgbm93IHVzZXMgbG9jYWwgKG1hY2hpbmUtc3BlY2lmaWMpIEVu Z2luZSBjb25maWd1cmF0aW9uIGluc3RlYWQgb2YgZ2xvYmFsICh2ZGNfb3B0aW9ucyBkYXRhYmFz ZSB0YWJsZSkgRW5naW5lIGNvbmZpZ3VyYXRpb246DQoNCiAgKiAgIFByZXZpb3VzbHksIHBhdGgg aW5mb3JtYXRpb24gd2FzIHJlc29sdmVkIHRocm91Z2ggb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNv bW1vbi5jb25maWcuQ29uZmlnIGNsYXNzIC0gRW5naW5lIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHdl cmUgcmV0cmlldmVkIGZyb20gdmRjX29wdGlvbnMgZGF0YWJhc2UgdGFibGUuDQogICogICBDdXJy ZW50bHksIHBhdGggaW5mb3JtYXRpb24gaXMgcmVzb2x2ZWQgdGhyb3VnaCBvcmcub3ZpcnQuZW5n aW5lLmNvcmUudXRpbHMuTG9jYWxDb25maWcgY2xhc3MgLSBFbmdpbmUgY29uZmlndXJhdGlvbiB2 YWx1ZXMgYXJlIHJldHJpZXZlZCBmcm9tIGxvY2FsIGZpbGUgc3lzdGVtLg0KSW4gY2FzZSB5b3Un cmUgbm90IHdvcmtpbmcgd2l0aCBvVmlydCBFbmdpbmUgdGhyb3VnaCBSUE0gcGFja2FnZSBzeXN0 ZW0sIGUuZy4geW91IGhhdmUgYSBsb2NhbCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBzZXQgdXAg YW5kIHlvdSBidWlsZCBhbmQgZGVwbG95IG9WaXJ0IEVuZ2luZSB0aHJvdWdoIE1hdmVuLCBwbGVh c2UgZm9sbG93IHRoZXNlIHN0ZXBzOg0KDQphLiBDb3B5IGRlZmF1bHQgRW5naW5lIGNvbmZpZ3Vy YXRpb24gaW50byAvdXNyL3NoYXJlL292aXJ0LWVuZ2luZS9jb25mDQojIG1rZGlyIC1wIC91c3Iv c2hhcmUvb3ZpcnQtZW5naW5lL2NvbmYNCiMgY3AgPE9WSVJUX0hPTUU+L2JhY2tlbmQvbWFuYWdl ci9jb25mL2VuZ2luZS5jb25mLmRlZmF1bHRzIC91c3Ivc2hhcmUvb3ZpcnQtZW5naW5lL2NvbmYv ZW5naW5lLmNvbmYuZGVmYXVsdHMNCg0KYi4gSWYgbmVjZXNzYXJ5LCBjb3B5IFVJIHBsdWdpbiBk YXRhIGZpbGVzIGZyb20gL3Vzci9zaGFyZS9lbmdpbmUvdWktcGx1Z2lucyB0byAvdXNyL3NoYXJl L292aXJ0LWVuZ2luZS91aS1wbHVnaW5zDQoNCmMuIElmIG5lY2Vzc2FyeSwgY29weSBVSSBwbHVn aW4gY29uZmlnIGZpbGVzIGZyb20gL2V0Yy9lbmdpbmUvdWktcGx1Z2lucyB0byAvZXRjL292aXJ0 LWVuZ2luZS91aS1wbHVnaW5zDQoNCmQsIEluIGNhc2UgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhl IGRlZmF1bHQgRW5naW5lIGNvbmZpZ3VyYXRpb24sIHB1dCB5b3VyIGN1c3RvbSBwcm9wZXJ0eSBm aWxlIGludG8gL2V0Yy9zeXNjb25maWcvb3ZpcnQtZW5naW5lDQoNClRoZSByZWFzb24gYmVoaW5k IHRoaXMgY2hhbmdlIGlzIHRoYXQgcGF0aCBpbmZvcm1hdGlvbiBmb3IgVUkgcGx1Z2luIGRhdGEg YW5kIGNvbmZpZ3VyYXRpb24gaXMgdHlwaWNhbGx5IG1hY2hpbmUtc3BlY2lmaWMsIGFuZCBzaG91 bGQgYmUgY3VzdG9taXphYmxlIHBlciBtYWNoaW5lIHRocm91Z2ggRW5naW5lIGxvY2FsIGNvbmZp Z3VyYXRpb24uDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoxLiBOZXcgcGx1 Z2luIEFQSSBmdW5jdGlvbjogYWRkTWFpblRhYkFjdGlvbkJ1dHRvbg0KDQpUaGUgImFkZE1haW5U YWJBY3Rpb25CdXR0b24iIEFQSSBhZGRzIGN1c3RvbSBjb250ZXh0LXNlbnNpdGl2ZSBidXR0b24g dG8gdGhlIGdpdmVuIG1haW4gdGFiJ3MgZGF0YSBncmlkLCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRp bmcgZGF0YSBncmlkIGNvbnRleHQgbWVudSBpdGVtLg0KDQphZGRNYWluVGFiQWN0aW9uQnV0dG9u KGVudGl0eVR5cGVOYW1lLCBsYWJlbCwgYWN0aW9uQnV0dG9uSW50ZXJmYWNlKQ0KDQplbnRpdHlU eXBlTmFtZSBpbmRpY2F0ZXMgd2hpY2ggbWFpbiB0YWIncyBkYXRhIGdyaWQgdGhlIGJ1dHRvbiBz aG91bGQgYmUgYWRkZWQgdG8sIGFjY29yZGluZyB0byB0aGUgZW50aXR5IHR5cGUgYXNzb2NpYXRl ZCB3aXRoIHRoZSBtYWluIHRhYi4gZW50aXR5VHlwZU5hbWUgdmFsdWVzIGFyZSBzdHJpbmdzIHJl ZmxlY3Rpbmcgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVnaW4uZW50aXR5RW50aXR5 VHlwZSBlbnVtIG1lbWJlcnMuIEZvbGxvd2luZyBlbnRpdHlUeXBlTmFtZSB2YWx1ZXMgYXJlIGN1 cnJlbnRseSBzdXBwb3J0ZWQgKHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUpOiAiRGF0YUNlbnRl ciIsICJDbHVzdGVyIiwgIkhvc3QiLCAiU3RvcmFnZSIsICJEaXNrIiwgIlZpcnR1YWxNYWNoaW5l IiwgIlRlbXBsYXRlIi4NCg0KTm90ZTogIlBvb2wiIHZhbHVlIGlzIGN1cnJlbnRseSBub3Qgc3Vw cG9ydGVkLCBiZWNhdXNlIG9mIG9yZy5vdmlydC5lbmdpbmUuY29yZS5jb21tb24uYnVzaW5lc3Nl bnRpdGllcy52bV9wb29scyBlbnRpdHkgbm90IGltcGxlbWVudGluZyB0aGUgQnVzaW5lc3NFbnRp dHkgaW50ZXJmYWNlLCBub3Qgc3VyZSB3aHkgdGhvdWdoLiBNYXliZSB3ZSBzaG91bGQgc3dpdGNo IGZyb20gQnVzaW5lc3NFbnRpdHkgdG8gSVZkY1F1ZXJ5YWJsZSBpbnRlcmZhY2UgYW5kIGFsd2F5 cyBjYXN0IGdldFF1ZXJ5YWJsZUlkIG1ldGhvZCByZXN1bHQgdmFsdWUgdG8gR3VpZD8NCg0KbGFi ZWwgaXMgdGhlIHRpdGxlIGRpc3BsYXllZCBvbiB0aGUgYnV0dG9uLg0KDQphY3Rpb25CdXR0b25J bnRlcmZhY2UgcmVwcmVzZW50cyBhbiBvYmplY3QgdGhhdCAiaW1wbGVtZW50cyB0aGUgYnV0dG9u IGludGVyZmFjZSIgYnkgZGVjbGFyaW5nIGl0cyBmdW5jdGlvbnM6IG9uQ2xpY2ssIGlzRW5hYmxl ZCwgaXNBY2Nlc3NpYmxlLiBBbGwgZnVuY3Rpb25zIG9mIGFjdGlvbkJ1dHRvbkludGVyZmFjZSBy ZWNlaXZlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtKHMpIGFzIGZ1bmN0aW9uIGFyZ3VtZW50cy4N Cg0KTGV0J3MgdGFrZSBhIGNsb3NlciBsb29rIGF0IHRoZSBjb25jZXB0IGJlaGluZCBhY3Rpb25C dXR0b25JbnRlcmZhY2UuIEluIHRyYWRpdGlvbmFsIGNsYXNzLWJhc2VkIG9iamVjdC1vcmllbnRl ZCBsYW5ndWFnZXMsIHN1Y2ggYXMgSmF2YSwgaW50ZXJmYWNlIGlzIGFuIGFic3RyYWN0IHR5cGUg dGhhdCBjb250YWlucyBtZXRob2QgZGVjbGFyYXRpb25zIHdpdGhvdXQgYW4gaW1wbGVtZW50YXRp b24uIEEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBnaXZlbiBpbnRlcmZhY2UgbXVzdCBpbXBs ZW1lbnQgYWxsIG1ldGhvZHMgZGVjbGFyZWQgYnkgdGhhdCBpbnRlcmZhY2UgKHVubGVzcyBpdCdz IGFuIGFic3RyYWN0IGNsYXNzLCBidXQgdGhpcyBpc24ndCByZWxldmFudCBpbiBvdXIgY2FzZSku DQoNCkluIGNvbnRyYXN0IHdpdGggdHJhZGl0aW9uYWwgY2xhc3MtYmFzZWQgb2JqZWN0LW9yaWVu dGVkIGxhbmd1YWdlcywgSmF2YVNjcmlwdCBzdXBwb3J0cyBPT1AgdGhyb3VnaCBwcm90b3R5cGUt YmFzZWQgcHJvZ3JhbW1pbmcgbW9kZWwgKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2Vu LVVTL2RvY3MvSmF2YVNjcmlwdC9JbnRyb2R1Y3Rpb25fdG9fT2JqZWN0LU9yaWVudGVkX0phdmFT Y3JpcHQpLiBBdCB0aGUgc2FtZSB0aW1lLCBKYXZhU2NyaXB0IGxhbmd1YWdlIGlzIGR5bmFtaWNh bGx5LXR5cGVkIGFuZCB0aGVyZWZvcmUgZG9lc24ndCBzdXBwb3J0IHRyYWRpdGlvbmFsIGNvbmNl cHQgb2YgaW50ZXJmYWNlIGluIE9PUCwgaXQgdXNlcyAiZHVjayB0eXBpbmciIHRlY2huaXF1ZSBp bnN0ZWFkIChodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0R1Y2tfdHlwaW5nKS4NCg0KVGhl IHNpbXBsZXN0IHdheSB0byBwcm92aWRlIGFuIG9iamVjdCB0aGF0ICJpbXBsZW1lbnRzIHRoZSBn aXZlbiBpbnRlcmZhY2UiIGluIEphdmFTY3JpcHQgaXMgdG8gdXNlICJkdWNrIHR5cGluZyIgdGVj aG5pcXVlOiBwcm92aWRpbmcgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgd2VsbC1rbm93biBmdW5j dGlvbnMuIEluIFVJIHBsdWdpbiBpbmZyYXN0cnVjdHVyZSwgSSBjYWxsIHRoaXMgY29uY2VwdCAi aW50ZXJmYWNlIG9iamVjdCIsIHJlcHJlc2VudGVkIGJ5IG9yZy5vdmlydC5lbmdpbmUudWkud2Vi YWRtaW4ucGx1Z2luLmpzbmkuSnNJbnRlcmZhY2VPYmplY3QgY2xhc3MuIFVubGlrZSB0aGUgdHJh ZGl0aW9uYWwgY29uY2VwdCBvZiBpbnRlcmZhY2UgYWJzdHJhY3QgdHlwZSBpbiBvYmplY3Qtb3Jp ZW50ZWQgbGFuZ3VhZ2VzLCBhbiAiaW50ZXJmYWNlIG9iamVjdCIgZG9lcyBub3QgbmVjZXNzYXJp bHkgaGF2ZSB0byBkZWNsYXJlIGFsbCBmdW5jdGlvbnMgb2YgdGhlIGdpdmVuIGludGVyZmFjZSBp biBvcmRlciB0byAiaW1wbGVtZW50IiBzdWNoIGludGVyZmFjZS4gSW4gZmFjdCwgYW4gZW1wdHkg b2JqZWN0IGNhbiBiZSB1c2VkIGFzIGEgdmFsaWQgImludGVyZmFjZSBvYmplY3QiLiBNaXNzaW5n IGZ1bmN0aW9ucyB3aWxsIGJlIHNpbXBseSB0cmVhdGVkIGFzIGVtcHR5IChuby1vcCkgZnVuY3Rp b25zLiBGdXJ0aGVybW9yZSwgYW4gImludGVyZmFjZSBvYmplY3QiIGNhbiAiaW1wbGVtZW50IiBt dWx0aXBsZSBpbnRlcmZhY2VzIGJ5IGRlY2xhcmluZyBmdW5jdGlvbnMgb2YgdGhvc2UgaW50ZXJm YWNlcyAoaW50ZXJmYWNlIGNvbXBvc2l0aW9uKS4NCg0KR2V0dGluZyBiYWNrIHRvICJhZGRNYWlu VGFiQWN0aW9uQnV0dG9uIiBBUEksIGhlcmUncyBhIHNhbXBsZSBjb2RlIHRoYXQgYWRkcyBuZXcg YnV0dG9uIHRvICJIb3N0IiBtYWluIHRhYiBkYXRhIGdyaWQsIGFzIHBhcnQgb2YgVWlJbml0IGV2 ZW50IGhhbmRsZXIgZnVuY3Rpb246DQoNClVpSW5pdDogZnVuY3Rpb24oKSB7DQogICAgYXBpLmFk ZE1haW5UYWJBY3Rpb25CdXR0b24oJ0hvc3QnLCAnU2luZ2xlLUhvc3QgQWN0aW9uJywNCg0KICAg ICAgICAvLyBBY3Rpb24gYnV0dG9uIGludGVyZmFjZSBvYmplY3QNCiAgICAgICAgLy8gQWxsIGZ1 bmN0aW9ucyByZWNlaXZlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtKHMpIGFzIGZ1bmN0aW9uIGFy Z3VtZW50cw0KICAgICAgICB7DQoNCiAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIHRoZSB1c2Vy IGNsaWNrcyB0aGUgYnV0dG9uDQogICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbigpIHsNCiAg ICAgICAgICAgICAgICAvLyBDYWxsaW5nICdhcmd1bWVudHNbMF0nIGlzIHNhZmUsIGJlY2F1c2Ug b25DbGljaygpIGNhbiBiZSBjYWxsZWQNCiAgICAgICAgICAgICAgICAvLyBvbmx5IHdoZW4gZXhh Y3RseSBvbmUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgaW4gdGhlIGRhdGEgZ3JpZA0KICAg ICAgICAgICAgICAgIHdpbmRvdy5hbGVydCgnU2VsZWN0ZWQgaG9zdCBlbnRpdHkgSUQgPSAnICsg YXJndW1lbnRzWzBdLmVudGl0eUlkKTsNCiAgICAgICAgICAgIH0sDQoNCiAgICAgICAgICAgIC8v IFJldHVybmluZyAndHJ1ZScgbWVhbnMgdGhlIGJ1dHRvbiBpcyBlbmFibGVkIChjbGlja2FibGUp DQogICAgICAgICAgICAvLyBSZXR1cm5pbmcgJ2ZhbHNlJyBtZWFucyB0aGUgYnV0dG9uIGlzIGRp c2FibGVkIChub24tY2xpY2thYmxlKQ0KICAgICAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZSA9ICd0 cnVlJw0KICAgICAgICAgICAgaXNFbmFibGVkOiBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAg ICAvLyBFbmFibGUgYnV0dG9uIG9ubHkgd2hlbiBleGFjdGx5IG9uZSBpdGVtIGlzIHNlbGVjdGVk DQogICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT0gMTsNCiAgICAgICAg ICAgIH0sDQoNCiAgICAgICAgICAgIC8vIFJldHVybmluZyAndHJ1ZScgbWVhbnMgdGhlIGJ1dHRv biBpcyB2aXNpYmxlDQogICAgICAgICAgICAvLyBSZXR1cm5pbmcgJ2ZhbHNlJyBtZWFucyB0aGUg YnV0dG9uIGlzIGhpZGRlbg0KICAgICAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZSA9ICd0cnVlJw0K ICAgICAgICAgICAgaXNBY2Nlc3NpYmxlOiBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAv LyBBbHdheXMgc2hvdyB0aGUgYnV0dG9uIGluIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgZ3JpZA0K ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0N Cg0KICAgICk7DQp9DQoNCkFzIG1lbnRpb25lZCBhYm92ZSwgYWxsIGZ1bmN0aW9ucyBvZiBhbiBp bnRlcmZhY2Ugb2JqZWN0IGFyZSBvcHRpb25hbC4gRm9yIGZ1bmN0aW9ucyBleHBlY3RpbmcgcmV0 dXJuIHZhbHVlLCBkZWZhdWx0IHZhbHVlIGlzIGRlZmluZWQgYnkgVUkgcGx1Z2luIGluZnJhc3Ry dWN0dXJlLiBGb3IgZXhhbXBsZToNCg0KICAqICAgb25DbGljayAtIG5vIGRlZmF1bHQgdmFsdWUg KG5vIHJldHVybiB2YWx1ZSBleHBlY3RlZCkNCiAgKiAgIGlzRW5hYmxlZCAvIGlzQWNjZXNzaWJs ZSAtIGRlZmF1bHQgdmFsdWUgInRydWUiIChib29sZWFuIHJldHVybiB2YWx1ZSBleHBlY3RlZCkN Cg0KTm90ZTogVUkgcGx1Z2luIGluZnJhc3RydWN0dXJlIGNoZWNrcyB0aGUgYWN0dWFsIHJldHVy biB2YWx1ZSB0eXBlLCBhbmQgdXNlcyBkZWZhdWx0IHZhbHVlIGluIGNhc2UgdGhlIGZ1bmN0aW9u IHJldHVybmVkIHNvbWV0aGluZyBvZiB3cm9uZyAodW5leHBlY3RlZCkgdHlwZS4NCg0KSW4gdGhl IGV4YW1wbGUgYWJvdmUsICJjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbShzKSIgbWFwcyB0byBKU09O LWxpa2UgcmVwcmVzZW50YXRpb25zIG9mIGJ1c2luZXNzIGVudGl0aWVzIGN1cnJlbnRseSBzZWxl Y3RlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGdyaWQuIEZvciBub3csIHRoZSBlbnRpdHkg cmVwcmVzZW50YXRpb24gaXMgcXVpdGUgc2ltcGxlIGFuZCBzYW1lIGZvciBhbGwgZW50aXR5IHR5 cGVzOg0KDQp7IGVudGl0eUlkOiAiW0J1c2luZXNzRW50aXR5R3VpZEFzU3RyaW5nXSIgfQ0KDQpJ biBmdXR1cmUsIHdlIHdpbGwgY3JlYXRlIHNwZWNpZmljIEpTT04tbGlrZSByZXByZXNlbnRhdGlv bnMgZm9yIHNwZWNpZmljIGJ1c2luZXNzIGVudGl0aWVzLCBpbiBjb21wbGlhbmNlIHdpdGggRW5n aW5lIFJFU1QgQVBJIGVudGl0eSBzdHJ1Y3R1cmUuDQoNCkZvciBhIG1vcmUgZXh0ZW5zaXZlIGV4 YW1wbGUgb2YgdXNpbmcgImFkZE1haW5UYWJBY3Rpb25CdXR0b24iIEFQSSwgcGxlYXNlIHNlZSB0 aGUgYXR0YWNoZWQgImFkZE1haW5UYWJBY3Rpb25CdXR0b24uaHRtbC5leGFtcGxlIiBmaWxlLg0K X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KMi4gSW1wcm92ZWQgcGx1Z2luIEFQ SSBmdW5jdGlvbjogYWRkTWFpblRhYg0KDQpUaGUgImFkZE1haW5UYWIiIEFQSSB3YXMgaW1wcm92 ZWQgdG8gYWRkcmVzcyBmb2xsb3dpbmcgaXNzdWVzOg0KDQogICogICAiYWRkTWFpblRhYiIgY2Fu IG5vdyBiZSBjYWxsZWQgYXQgYW55IG1vbWVudCBkdXJpbmcgVUkgcGx1Z2luIHJ1bnRpbWUsIGdp dmVuIHRoYXQgdGhlIHBsdWdpbiBpcyBhbGxvd2VkIGludm9rZSBwbHVnaW4gQVBJIGZ1bmN0aW9u cyAocGx1Z2luIGlzIGVpdGhlciBJTklUSUFMSVpJTkcgb3IgSU5fVVNFKS4NClByZXZpb3VzbHks ICJhZGRNYWluVGFiIiB3b3JrZWQgcmVsaWFibHkgb25seSB3aGVuIGNhbGxlZCBmcm9tIHdpdGhp biBVaUluaXQgZXZlbnQgaGFuZGxlciBmdW5jdGlvbi4NCkN1cnJlbnRseSwgaXQncyBwb3NzaWJs ZSB0byBjYWxsICJhZGRNYWluVGFiIiBhdCBhbnkgbW9tZW50LCBlLmcuIGZyb20gd2l0aGluIHNv bWUgb3RoZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvbiAoYWZ0ZXIgVWlJbml0IGhhcyBjb21wbGV0 ZWQpLg0KDQogICogICAiYWRkTWFpblRhYiIgbm93IHJldGFpbnMgImFjdGl2ZSIgdGFiIChoaWdo bGlnaHRlZCB0YWIgR1VJKS4NCiJhZGRNYWluVGFiIiB3b3JrcyBieSBhZGRpbmcgbmV3IHRhYiBj b21wb25lbnQgKEdXVFAgcHJlc2VudGVyIHByb3h5KSBhbmQgcmVmcmVzaGluZyBtYWluIHRhYiBw YW5lbCBHVUkgYnkgcmVtb3ZpbmcgYWxsIHJlbGF0ZWQgdGFicyBhbmQgcmUtYWRkaW5nIHRoZW0g YWdhaW4uDQpUaGlzIGxvZ2ljIGlzIGhhbmRsZWQgYnkgb3JnLm92aXJ0LmVuZ2luZS51aS5jb21t b24ucHJlc2VudGVyLkR5bmFtaWNUYWJDb250YWluZXJQcmVzZW50ZXIgY2xhc3MsIHdoaWNoIG1h a2VzIHN1cmUgdGhhdCAiYWN0aXZlIiB0YWIgaXMgcmV0YWluZWQgZXZlbiBhZnRlciBtYWluIHRh YiBwYW5lbCB3YXMgcmVmcmVzaGVkLg0KRnVydGhlcm1vcmUsIGN1c3RvbSBtYWluIHRhYiBpbXBs ZW1lbnRhdGlvbiBub3cgZGlzcGxheXMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIFVSTCB0aHJv dWdoIEhUTUwgaWZyYW1lIGVsZW1lbnQuDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f Xw0KDQozLiBJbXByb3ZlZCBuYXRpdmUgSmF2YVNjcmlwdCBmdW5jdGlvbiBoYW5kbGluZyAoR1dU IEpTTkkpDQoNClRoaXMgcGF0Y2ggaW50cm9kdWNlcyBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFk bWluLnBsdWdpbi5qc25pLkpzRnVuY3Rpb24gYW5kIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRt aW4ucGx1Z2luLmpzbmkuSnNGdW5jdGlvblJlc3VsdEhlbHBlciBjbGFzc2VzIHByb3ZpZGluZyBK YXZhIGFic3RyYWN0aW9uIGZvciBpbnZva2luZyBuYXRpdmUgSmF2YVNjcmlwdCBmdW5jdGlvbnMu IFRoZXNlIGNsYXNzZXMgZm9sbG93IHRoZSBnZW5lcmFsIGNvbnRyYWN0IG9mICJpbnRlcmZhY2Ug b2JqZWN0IiBhcyBtZW50aW9uZWQgYWJvdmUuDQoNCkpzRnVuY3Rpb25SZXN1bHRIZWxwZXIgaXMg cGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIGRlYWxpbmcgd2l0aCBmdW5jdGlvbnMgd2hpY2ggYXJl IGV4cGVjdGVkIHRvIHJldHVybiB2YWx1ZSBvZiBhIGNlcnRhaW4gdHlwZS4gVG9vIGJhZCBzdGFu ZGFyZCBHV1QgSlNOSSBjbGFzc2VzIGRvbid0IHByb3ZpZGUgc3VjaCBhYnN0cmFjdGlvbiBmb3Ig d29ya2luZyB3aXRoIG5hdGl2ZSBmdW5jdGlvbnMgb3V0LW9mLXRoZS1ib3guLi4NCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fDQoNCjQuIEFjdGlvblBhbmVsIGFuZCBBY3Rpb25UYWJs ZSB0eXBlIGhpZXJhcmNoeSByZWZhY3RvcmluZyAocmVsYXRlZCB0byAiYWRkTWFpblRhYkFjdGlv bkJ1dHRvbiIgQVBJKQ0KDQpQcmV2aW91c2x5LCBBYnN0cmFjdEFjdGlvblBhbmVsIGFuZCBBYnN0 cmFjdEFjdGlvblRhYmxlIGNsYXNzZXMgZGlkbid0IGltcGxlbWVudCBhbnkgcmVhc29uYWJsZSBp bnRlcmZhY2UgdGhhdCB3b3VsZCBhbGxvdyBvdGhlciBjb21wb25lbnRzIChjbGllbnQtc2lkZSBV SSBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUpIHRvIGRlcGVuZCBvbiB0aGVpciBmdW5jdGlvbmFsaXR5 IGluIGEgbG9vc2VseS1jb3VwbGVkIG1hbm5lci4gVGhpcyB3b3VsZCBtYWtlIGNvZGUgdGhhdCBp bXBsZW1lbnRzICJhZGRNYWluVGFiQWN0aW9uQnV0dG9uIiBBUEkgInVnbHkiOiBtYWluIHRhYiB2 aWV3IGludGVyZmFjZSB3b3VsZCBoYXZlIHRvIHJlZmVyZW5jZSBBYnN0cmFjdEFjdGlvblRhYmxl IGNsYXNzIGRpcmVjdGx5LiBJbiBNVlAgZGVzaWduIHBhdHRlcm4sIHZpZXcgaW50ZXJmYWNlIHNo b3VsZCBhdm9pZCByZWZlcmVuY2luZyBzcGVjaWZpYyBHV1QgV2lkZ2V0IGNsYXNzZXMgZGlyZWN0 bHkuDQoNClRoaXMgcGF0Y2ggaW50cm9kdWNlcyBuZXcgaW50ZXJmYWNlcyBmb3IgQWN0aW9uUGFu ZWwgYW5kIEFjdGlvblRhYmxlIGNvbXBvbmVudHMgd2hpbGUgZWxpbWluYXRpbmcgY29kZSByZWR1 bmRhbmN5IChkdXBsaWNhdGUgb3IgdW5uZWNlc3NhcnkgY29kZSkuDQpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXw0KDQo1LiBBY3Rpb25QYW5lbCB0eXBlIGhpZXJhcmNoeSByZWZhY3Rv cmluZyAocmVsYXRlZCB0byAiYWRkTWFpblRhYiIgQVBJKQ0KDQpTaW5jZSBvcmcub3ZpcnQuZW5n aW5lLnVpLmNvbW1vbi5wcmVzZW50ZXIuRHluYW1pY1RhYkNvbnRhaW5lclByZXNlbnRlciBkZWZp bmVzIG5ldyBEeW5hbWljVGFiUGFuZWwgaW50ZXJmYWNlIHRoYXQgZXh0ZW5kcyBzdGFuZGFyZCBH V1RQIFRhYlBhbmVsIGludGVyZmFjZSwgc29tZSByZWZhY3RvcmluZyBoYWQgdG8gYmUgZG9uZSBp biByZWxhdGVkIEFjdGlvblBhbmVsIGNsYXNzZXMuDQoNClRoaXMgcGF0Y2ggbWFrZXMgc3VyZSB0 aGF0IGJvdGggb3JnLm92aXJ0LmVuZ2luZS51aS5jb21tb24ud2lkZ2V0LnRhYi5BYnN0cmFjdFRh YlBhbmVsICh3aWRnZXQpIGFuZCBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi52aWV3LkFic3Ry YWN0VGFiUGFuZWxWaWV3ICh2aWV3KSBzdXBwb3J0IER5bmFtaWNUYWJQYW5lbCBpbnRlcmZhY2Uu DQoNCk5vdGUgdGhhdCBmb3Igbm93LCBvbmx5IG1haW4gdGFiIHBhbmVsIChvcmcub3ZpcnQuZW5n aW5lLnVpLndlYmFkbWluLnNlY3Rpb24ubWFpbi5wcmVzZW50ZXIuTWFpblRhYlBhbmVsUHJlc2Vu dGVyKSBzdXBwb3J0cyBkeW5hbWljIHRhYnMgd2l0aGluIGl0cyB2aWV3Lg0KX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18NCg0KV2hlcmUgaXMgYWRkU3ViVGFiIEFQSSBmdW5jdGlvbj8N Cg0KSW1wbGVtZW50aW5nICJhZGRTdWJUYWIiIEFQSSByZXF1aXJlcyBzb21lIG1vcmUgY2hhbmdl cywgYW5kIEkgZGlkbid0IHdhbnQgdG8gZGVsYXkgdGhpcyBQb0MgcGF0Y2gganVzdCBiZWNhdXNl IG9mIGl0Li4uDQoNCkhlcmUncyBhIHNhbXBsZSBjb2RlIHRoYXQgaWxsdXN0cmF0ZXMgcHJvcG9z ZWQgImFkZFN1YlRhYiIgQVBJIHVzYWdlOg0KDQpVaUluaXQ6IGZ1bmN0aW9uKCkgew0KICAgIGFw aS5hZGRTdWJUYWIoJ0hvc3QnLCAgICAgICAgLy8gZW50aXR5VHlwZU5hbWUNCiAgICAgICAgJ0N1 c3RvbSBIb3N0IFN1YiBUYWInLCAgIC8vIGxhYmVsDQogICAgICAgICdjdXN0b20taG9zdC1zdWIt dGFiJywgICAvLyBoaXN0b3J5VG9rZW4NCiAgICAgICAgJ2h0dHA6Ly93d3cub3ZpcnQub3JnLycs IC8vIGNvbnRlbnRVcmwNCg0KICAgICAgICAvLyBTdWIgdGFiIGludGVyZmFjZSBvYmplY3QNCiAg ICAgICAgLy8gQWxsIGZ1bmN0aW9ucyByZWNlaXZlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtKHMp DQogICAgICAgIC8vIHdpdGhpbiB0aGUgbWFpbiB0YWIgZGF0YSBncmlkIGFzIGZ1bmN0aW9uIGFy Z3VtZW50cw0KICAgICAgICB7DQoNCiAgICAgICAgICAgIC8vIFJldHVybmluZyAndHJ1ZScgbWVh bnMgdGhlIHN1YiB0YWIgaXMgdmlzaWJsZQ0KICAgICAgICAgICAgLy8gUmV0dXJuaW5nICdmYWxz ZScgbWVhbnMgdGhlIHN1YiB0YWIgaXMgaGlkZGVuDQogICAgICAgICAgICAvLyBEZWZhdWx0IHZh bHVlID0gJ3RydWUnDQogICAgICAgICAgICBpc0FjY2Vzc2libGU6IGZ1bmN0aW9uKCkgew0KICAg ICAgICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09IDEgJiYgYXJndW1lbnRzWzBd LmVudGl0eUlkID09ICc8TXlIb3N0RW50aXR5SWQ+JzsNCiAgICAgICAgICAgIH0NCg0KICAgICAg ICB9DQoNCiAgICApOw0KfQ0KDQpBcyBwYXJ0IG9mICJhZGRTdWJUYWIiIEFQSSBpbXBsZW1lbnRh dGlvbiwgSSdsbCByZWZhY3RvciBjdXN0b20gbWFpbiB0YWIgY29tcG9uZW50cywgaW4gb3JkZXIg dG8gdXNlIG9uZSAidGFiIHR5cGUiIGZvciBib3RoIG1haW4gYW5kIHN1YiB0YWJzLg0KDQpDdXJy ZW50bHksIHdlIGhhdmUgb25lIChhbmQgb25seSBvbmUpICJ0YWIgdHlwZSIgLSBhIHRhYiB0aGF0 IHNob3dzIGNvbnRlbnQgb2YgdGhlIGdpdmVuIFVSTCB0aHJvdWdoIEhUTUwgaWZyYW1lIGVsZW1l bnQuDQoNCldlIGNvdWxkIGFsc28gY3JlYXRlIG5ldyAidGFiIHR5cGVzIiwgZS5nLiBmb3JtLWJh c2VkIHRhYiB0aGF0IHNob3dzIGtleS92YWx1ZSBwYWlycyAoSU1ITyB0aGlzIGNvdWxkIGJlIHF1 aXRlIHVzZWZ1bCBmb3IgY3VzdG9tIHN1YiB0YWJzKS4NCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fDQoNCkxldCBtZSBrbm93IHdoYXQgeW91IHRoaW5rIQ0KDQpDaGVlcnMsDQpWb2p0 ZWNoDQoNCg== --_000_D290AD8432118048947689BA3AE8A9B3EA0742SACEXCMBX04PRDhqn_ Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv VFIvUkVDLWh0bWw0MCI+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIg Y29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxtZXRhIG5hbWU9IkdlbmVyYXRv ciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTQgKGZpbHRlcmVkIG1lZGl1bSkiPg0KPCEtLVtp ZiAhbXNvXT48c3R5bGU+dlw6KiB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fQ0Kb1w6KiB7 YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fQ0Kd1w6KiB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0 I1ZNTCk7fQ0KLnNoYXBlIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9DQo8L3N0eWxlPjwh W2VuZGlmXS0tPjxzdHlsZT48IS0tDQovKiBGb250IERlZmluaXRpb25zICovDQpAZm9udC1mYWNl DQoJe2ZvbnQtZmFtaWx5OkhlbHZldGljYTsNCglwYW5vc2UtMToyIDExIDYgNCAyIDIgMiAyIDIg NDt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFtaWx5OldpbmdkaW5nczsNCglwYW5vc2UtMTo1IDAg MCAwIDAgMCAwIDAgMCAwO30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6V2luZ2RpbmdzOw0K CXBhbm9zZS0xOjUgMCAwIDAgMCAwIDAgMCAwIDA7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWls eTpDYWxpYnJpOw0KCXBhbm9zZS0xOjIgMTUgNSAyIDIgMiA0IDMgMiA0O30NCkBmb250LWZhY2UN Cgl7Zm9udC1mYW1pbHk6VGFob21hOw0KCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0O30N Ci8qIFN0eWxlIERlZmluaXRpb25zICovDQpwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYu TXNvTm9ybWFsDQoJe21hcmdpbjowaW47DQoJbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0KCWZvbnQt c2l6ZToxMi4wcHQ7DQoJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9DQph OmxpbmssIHNwYW4uTXNvSHlwZXJsaW5rDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xv cjpibHVlOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KYTp2aXNpdGVkLCBzcGFuLk1z b0h5cGVybGlua0ZvbGxvd2VkDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xvcjpwdXJw bGU7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQpwDQoJe21zby1zdHlsZS1wcmlvcml0 eTo5OTsNCgltYXJnaW46MGluOw0KCW1hcmdpbi1ib3R0b206LjAwMDFwdDsNCglmb250LXNpemU6 MTIuMHB0Ow0KCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQ0KcC5Nc29B Y2V0YXRlLCBsaS5Nc29BY2V0YXRlLCBkaXYuTXNvQWNldGF0ZQ0KCXttc28tc3R5bGUtcHJpb3Jp dHk6OTk7DQoJbXNvLXN0eWxlLWxpbms6IkJhbGxvb24gVGV4dCBDaGFyIjsNCgltYXJnaW46MGlu Ow0KCW1hcmdpbi1ib3R0b206LjAwMDFwdDsNCglmb250LXNpemU6OC4wcHQ7DQoJZm9udC1mYW1p bHk6IlRhaG9tYSIsInNhbnMtc2VyaWYiO30NCnNwYW4uRW1haWxTdHlsZTE4DQoJe21zby1zdHls ZS10eXBlOnBlcnNvbmFsOw0KCWZvbnQtZmFtaWx5OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQoJ Y29sb3I6IzFGNDk3RDt9DQpzcGFuLkJhbGxvb25UZXh0Q2hhcg0KCXttc28tc3R5bGUtbmFtZToi QmFsbG9vbiBUZXh0IENoYXIiOw0KCW1zby1zdHlsZS1wcmlvcml0eTo5OTsNCgltc28tc3R5bGUt bGluazoiQmFsbG9vbiBUZXh0IjsNCglmb250LWZhbWlseToiVGFob21hIiwic2Fucy1zZXJpZiI7 fQ0Kc3Bhbi5FbWFpbFN0eWxlMjMNCgl7bXNvLXN0eWxlLXR5cGU6cGVyc29uYWwtcmVwbHk7DQoJ Zm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCgljb2xvcjojMUY0OTdEO30NCi5N c29DaHBEZWZhdWx0DQoJe21zby1zdHlsZS10eXBlOmV4cG9ydC1vbmx5Ow0KCWZvbnQtc2l6ZTox MC4wcHQ7fQ0KQHBhZ2UgV29yZFNlY3Rpb24xDQoJe3NpemU6OC41aW4gMTEuMGluOw0KCW1hcmdp bjoxLjBpbiAxLjBpbiAxLjBpbiAxLjBpbjt9DQpkaXYuV29yZFNlY3Rpb24xDQoJe3BhZ2U6V29y ZFNlY3Rpb24xO30NCi8qIExpc3QgRGVmaW5pdGlvbnMgKi8NCkBsaXN0IGwwDQoJe21zby1saXN0 LWlkOjQzMDI0Njk5NzsNCgltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTE0MDIyODQ2NzQ7fQ0KQGxp c3QgbDA6bGV2ZWwxDQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2 ZWwtdGV4dDrvgrc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOi41aW47DQoJbXNvLWxldmVsLW51bWJl ci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNp emU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OlN5bWJvbDt9DQpAbGlzdCBsMDpsZXZlbDINCgl7bXNv LWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Om87DQoJbXNvLWxl dmVsLXRhYi1zdG9wOjEuMGluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0 ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZh bWlseToiQ291cmllciBOZXciOw0KCW1zby1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9t YW4iO30NCkBsaXN0IGwwOmxldmVsMw0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7 DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDoxLjVpbjsNCgltc28t bGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1h bnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGww OmxldmVsNA0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRl eHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDoyLjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBv c2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZTox MC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwwOmxldmVsNQ0KCXttc28t bGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1s ZXZlbC10YWItc3RvcDoyLjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJ dGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1m YW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwwOmxldmVsNg0KCXttc28tbGV2ZWwtbnVtYmVyLWZv cm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDoz LjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4y NWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2Rpbmdz O30NCkBsaXN0IGwwOmxldmVsNw0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJ bXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDozLjVpbjsNCgltc28tbGV2 ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNp LWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwwOmxl dmVsOA0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ6 74KnOw0KCW1zby1sZXZlbC10YWItc3RvcDo0LjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0 aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4w cHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwwOmxldmVsOQ0KCXttc28tbGV2 ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZl bC10YWItc3RvcDo0LjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4 dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1p bHk6V2luZ2RpbmdzO30NCkBsaXN0IGwxDQoJe21zby1saXN0LWlkOjY3NTMwMjY0NjsNCgltc28t bGlzdC10ZW1wbGF0ZS1pZHM6MTY2MjY2NzI1Njt9DQpAbGlzdCBsMTpsZXZlbDENCgl7bXNvLWxl dmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CtzsNCgltc28tbGV2 ZWwtdGFiLXN0b3A6LjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4 dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1p bHk6U3ltYm9sO30NCkBsaXN0IGwxOmxldmVsMg0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpi dWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ6bzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47DQoJ bXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCglt c28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7DQoJ bXNvLWJpZGktZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQ0KQGxpc3QgbDE6bGV2ZWwz DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7 DQoJbXNvLWxldmVsLXRhYi1zdG9wOjEuNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246 bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsN Cglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDE6bGV2ZWw0DQoJe21zby1sZXZlbC1u dW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRh Yi1zdG9wOjIuMGluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWlu ZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpX aW5nZGluZ3M7fQ0KQGxpc3QgbDE6bGV2ZWw1DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1 bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOw0K CW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJ bXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxp c3QgbDE6bGV2ZWw2DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2 ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjMuMGluOw0KCW1zby1sZXZlbC1udW1i ZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1z aXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDE6bGV2ZWw3DQoJ e21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJ bXNvLWxldmVsLXRhYi1zdG9wOjMuNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVm dDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglm b250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDE6bGV2ZWw4DQoJe21zby1sZXZlbC1udW1i ZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1z dG9wOjQuMGluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVu dDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5n ZGluZ3M7fQ0KQGxpc3QgbDE6bGV2ZWw5DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxl dDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjQuNWluOw0KCW1z by1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNv LWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3Qg bDINCgl7bXNvLWxpc3QtaWQ6MTMzMDcxOTY1ODsNCgltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTE4 NTg5NDQ3MDQ7fQ0KQGxpc3QgbDI6bGV2ZWwxDQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1 bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgrc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOi41aW47DQoJ bXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCglt c28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OlN5bWJvbDt9DQpAbGlzdCBs MjpsZXZlbDINCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10 ZXh0Om87DQoJbXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOw0KCW1zby1sZXZlbC1udW1iZXItcG9z aXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEw LjBwdDsNCglmb250LWZhbWlseToiQ291cmllciBOZXciOw0KCW1zby1iaWRpLWZvbnQtZmFtaWx5 OiJUaW1lcyBOZXcgUm9tYW4iO30NCkBsaXN0IGwyOmxldmVsMw0KCXttc28tbGV2ZWwtbnVtYmVy LWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3Rv cDoxLjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6 LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2Rp bmdzO30NCkBsaXN0IGwyOmxldmVsNA0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7 DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDoyLjBpbjsNCgltc28t bGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1h bnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwy OmxldmVsNQ0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRl eHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDoyLjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBv c2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZTox MC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwyOmxldmVsNg0KCXttc28t bGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1s ZXZlbC10YWItc3RvcDozLjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJ dGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1m YW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwyOmxldmVsNw0KCXttc28tbGV2ZWwtbnVtYmVyLWZv cm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDoz LjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4y NWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2Rpbmdz O30NCkBsaXN0IGwyOmxldmVsOA0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJ bXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDo0LjBpbjsNCgltc28tbGV2 ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNp LWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwyOmxl dmVsOQ0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ6 74KnOw0KCW1zby1sZXZlbC10YWItc3RvcDo0LjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0 aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4w cHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwzDQoJe21zby1saXN0LWlkOjE1 NTA2MDYxNDQ7DQoJbXNvLWxpc3QtdGVtcGxhdGUtaWRzOi0zOTIyNjQ5NzA7fQ0KQGxpc3QgbDM6 bGV2ZWwxDQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4 dDrvgrc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOi41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3Np dGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAu MHB0Ow0KCWZvbnQtZmFtaWx5OlN5bWJvbDt9DQpAbGlzdCBsMzpsZXZlbDINCgl7bXNvLWxldmVs LW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Om87DQoJbXNvLWxldmVsLXRh Yi1zdG9wOjEuMGluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWlu ZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseToi Q291cmllciBOZXciOw0KCW1zby1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30N CkBsaXN0IGwzOmxldmVsMw0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNv LWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDoxLjVpbjsNCgltc28tbGV2ZWwt bnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZv bnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwzOmxldmVs NA0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674Kn Ow0KCW1zby1sZXZlbC10YWItc3RvcDoyLjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9u OmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7 DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwzOmxldmVsNQ0KCXttc28tbGV2ZWwt bnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10 YWItc3RvcDoyLjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1p bmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6 V2luZ2RpbmdzO30NCkBsaXN0IGwzOmxldmVsNg0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpi dWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDozLjBpbjsN Cgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0K CW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBs aXN0IGwzOmxldmVsNw0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxl dmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDozLjVpbjsNCgltc28tbGV2ZWwtbnVt YmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQt c2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwzOmxldmVsOA0K CXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0K CW1zby1sZXZlbC10YWItc3RvcDo0LjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxl ZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJ Zm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwzOmxldmVsOQ0KCXttc28tbGV2ZWwtbnVt YmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWIt c3RvcDo0LjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRl bnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2lu Z2RpbmdzO30NCkBsaXN0IGw0DQoJe21zby1saXN0LWlkOjIwMDk3OTQ5NDk7DQoJbXNvLWxpc3Qt dGVtcGxhdGUtaWRzOi0xMjcwODMwMzcwO30NCkBsaXN0IGw0OmxldmVsMQ0KCXttc28tbGV2ZWwt bnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674K3Ow0KCW1zby1sZXZlbC10 YWItc3RvcDouNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWlu ZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpT eW1ib2w7fQ0KQGxpc3QgbDQ6bGV2ZWwyDQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxl dDsNCgltc28tbGV2ZWwtdGV4dDpvOw0KCW1zby1sZXZlbC10YWItc3RvcDoxLjBpbjsNCgltc28t bGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1h bnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsNCgltc28t YmlkaS1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9DQpAbGlzdCBsNDpsZXZlbDMNCgl7 bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCglt c28tbGV2ZWwtdGFiLXN0b3A6MS41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0 Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZv bnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsNDpsZXZlbDQNCgl7bXNvLWxldmVsLW51bWJl ci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0 b3A6Mi4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50 Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5Oldpbmdk aW5nczt9DQpAbGlzdCBsNDpsZXZlbDUNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0 Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47DQoJbXNv LWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28t YW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBs NDpsZXZlbDYNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10 ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6My4waW47DQoJbXNvLWxldmVsLW51bWJlci1w b3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6 MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsNDpsZXZlbDcNCgl7bXNv LWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28t bGV2ZWwtdGFiLXN0b3A6My41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0K CXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQt ZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsNDpsZXZlbDgNCgl7bXNvLWxldmVsLW51bWJlci1m b3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6 NC4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0u MjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5n czt9DQpAbGlzdCBsNDpsZXZlbDkNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0K CW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6NC41aW47DQoJbXNvLWxl dmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5z aS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpvbA0KCXttYXJn aW4tYm90dG9tOjBpbjt9DQp1bA0KCXttYXJnaW4tYm90dG9tOjBpbjt9DQotLT48L3N0eWxlPjwh LS1baWYgZ3RlIG1zbyA5XT48eG1sPg0KPG86c2hhcGVkZWZhdWx0cyB2OmV4dD0iZWRpdCIgc3Bp ZG1heD0iMTAyNiIgLz4NCjwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1s Pg0KPG86c2hhcGVsYXlvdXQgdjpleHQ9ImVkaXQiPg0KPG86aWRtYXAgdjpleHQ9ImVkaXQiIGRh dGE9IjEiIC8+DQo8L286c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZdLS0+DQo8L2hlYWQ+DQo8 Ym9keSBsYW5nPSJFTi1VUyIgbGluaz0iYmx1ZSIgdmxpbms9InB1cnBsZSI+DQo8ZGl2IGNsYXNz PSJXb3JkU2VjdGlvbjEiPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQt c2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNl cmlmJnF1b3Q7O2NvbG9yOiMxRjQ5N0QiPkhpIFZvanRlY2gsPG86cD48L286cD48L3NwYW4+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9u dC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2NvbG9y OiMxRjQ5N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGli cmkmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjojMUY0OTdEIj5JdCBsb29rcyBs aWtlIEnigJltIGdvaW5nIHRvIGJlIGluIHRyYWluaW5nIGFsbCBuZXh0IHdlZWsgYW5kIHdpbGwg dW5mb3J0dW5hdGVseSBOT1QgYmUgYWJsZSB0byB0YWtlIG9uIHRoZSB3b3JrIHRvIGltcGxlbWVu dCB0aGUg4oCcc2hvdyBkaWFsb2cgd2l0aCBjb250ZW50IGxvYWRlZA0KIGZyb20gZ2l2ZW4gVVJM 4oCdIHBsdWdpbiBBUEkgZnVuY3Rpb24gYXMgSSBoYWQgaG9wZWQuIFRoaXMgaXMgc29tZXRoaW5n IHdlIHJlYWxseSBuZWVkIGZvciByZXZpc2lvbiA3LiBPZiB0aGUgaXRlbXMgaW4geW91ciBsaXN0 IGZvciBpbmNsdXNpb24sIHRoZSBzdWItdGFiIGZyYW1lIHBsdWdpbiBpcyB0aGUgbGVhc3QgbmVj ZXNzYXJ5IGZvciB1cy4gVGhlIHJlc3Qgb2YgdGhlIGl0ZW1zIGFyZSBhbGwgcHJldHR5IGltcG9y dGFudC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBz dHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LCZx dW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3Nw YW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4w cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7 O2NvbG9yOiMxRjQ5N0QiPkxldCBtZSBrbm93IGlmIGFueSBvZiB0aGlzIGlzIGEgcHJvYmxlbSBv ciBpZiB3ZSBjYW4gc2hpZnQgdGhpbmdzIGFyb3VuZCB0byBnZXQgdGhlbSBpbiB0aGUgcmlnaHQg b3JkZXIuDQo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3Bh biBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7 LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48 L3NwYW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250 LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssJnF1b3Q7c2Fucy1z ZXJpZiZxdW90Oztjb2xvcjojMUY0OTdEIj4tQ2hyaXM8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8 L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0 O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztj b2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2Pg0KPGRpdiBz dHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjQjVDNERGIDEuMHB0O3BhZGRpbmc6 My4wcHQgMGluIDBpbiAwaW4iPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PGI+PHNwYW4gc3R5bGU9 ImZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGFob21hJnF1b3Q7LCZxdW90O3Nh bnMtc2VyaWYmcXVvdDsiPkZyb206PC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEw LjBwdDtmb250LWZhbWlseTomcXVvdDtUYWhvbWEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90 OyI+IFZvanRlY2ggU3pvY3MgW21haWx0bzp2c3pvY3NAcmVkaGF0LmNvbV0NCjxicj4NCjxiPlNl bnQ6PC9iPiBUdWVzZGF5LCBPY3RvYmVyIDIzLCAyMDEyIDE6MzUgUE08YnI+DQo8Yj5Ubzo8L2I+ IE1vcnJpc3NleSwgQ2hyaXN0b3BoZXI8YnI+DQo8Yj5DYzo8L2I+IGVuZ2luZS1kZXZlbDxicj4N CjxiPlN1YmplY3Q6PC9iPiBSZTogW0VuZ2luZS1kZXZlbF0gVUkgUGx1Z2luczogUG9DIHBhdGNo IHJldmlzaW9uIDYgbm93IGF2YWlsYWJsZTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0K PC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxkaXY+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkhpIENocmlz LDxicj4NCjxicj4NCndlbGwsIEkgcGxhbm5lZCB0byBpbXBsZW1lbnQgc2ltcGxlICZxdW90O3No b3cgZGlhbG9nIHdpdGggY29udGVudCBsb2FkZWQgZnJvbSBnaXZlbiBVUkwmcXVvdDsgcGx1Z2lu IEFQSSBmdW5jdGlvbiBzb21lIHRpbWUgYWdvLCBidXQgdGhlbiBJIHRob3VnaHQgeW91IG1pZ2h0 IGJlIGV4cGVyaW1lbnRpbmcgd2l0aCBpdCBhbHJlYWR5IDopIHBsZWFzZSBmZWVsIGZyZWUgdG8g d29yayBvbiB0aGF0LCB3ZSBjYW4gaW5jbHVkZSBpdCBpbnRvIFBvQyByZXZpc2lvbiA3Ljxicj4N Cjxicj4NClJlZ2FyZGluZyBwbGFubmVkIGl0ZW1zIGZvciByZXZpc2lvbiA3LCBoZXJlJ3MgbXkg Y3VycmVudCBsaXN0IChmZWVsIGZyZWUgdG8gYWRkL21vZGlmeSB0aGluZ3MgaGVyZSBpZiBuZWNl c3NhcnkpOjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjx1bCB0eXBlPSJkaXNjIj4NCjxsaSBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6YmxhY2s7bXNvLW1hcmdpbi10b3AtYWx0OmF1dG87 bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87bXNvLWxpc3Q6bDMgbGV2ZWwxIGxmbzEiPg0KJnF1 b3Q7YWRkIGN1c3RvbSBzdWIgdGFiJnF1b3Q7IHBsdWdpbiBBUEkgZnVuY3Rpb24sIHdpdGggaW5p dGlhbCBzdWIgdGFiIGltcGxlbWVudGF0aW9uIHNob3dpbmcgY29udGVudCBvZiB0aGUgZ2l2ZW4g VVJMICh3ZSBjYW4gYWRkIG1vcmUgdGFiIHR5cGVzIGxhdGVyIG9uLCBlLmcuIGZvcm0tYmFzZWQg b3IgdGFibGUtYmFzZWQgdGFiKTxvOnA+PC9vOnA+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIg c3R5bGU9ImNvbG9yOmJsYWNrO21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90 dG9tLWFsdDphdXRvO21zby1saXN0OmwzIGxldmVsMSBsZm8xIj4NCiZxdW90O2FkZCBjdXN0b20g dGFzayB0byB0YXNrIHBhbmUmcXVvdDsgcGx1Z2luIEFQSSBmdW5jdGlvbiwgcmVxdWlyZXMgc29t ZSBVaUNvbW1vbiBpbnRlZ3JhdGlvbiBjb2RpbmcgKEkgd2lsbCBoYW5kbGUgdGhpcyk8bzpwPjwv bzpwPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjpibGFjazttc28tbWFy Z2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzttc28tbGlzdDpsMyBs ZXZlbDEgbGZvMSI+DQomcXVvdDtzaG93IGRpYWxvZyB3aXRoIGNvbnRlbnQgbG9hZGVkIGZyb20g Z2l2ZW4gVVJMJnF1b3Q7IHBsdWdpbiBBUEkgZnVuY3Rpb24sIGluaXRpYWwgaW1wbGVtZW50YXRp b24gY291bGQgc2ltcGx5IG9wZW4gbmV3IGJyb3dzZXIgcG9wdXAgd2luZG93IHVzaW5nIHdpbmRv dy5vcGVuIChidXQgYW55IG90aGVyIGFwcHJvYWNoIGlzIGZpbmUgYXMgd2VsbCk8bzpwPjwvbzpw PjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjpibGFjazttc28tbWFyZ2lu LXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzttc28tbGlzdDpsMyBsZXZl bDEgbGZvMSI+DQppbnRlZ3JhdGlvbiB3aXRoIFJFU1QgQVBJLCBlLmcuICZxdW90O29idGFpbiBS RVNUIEFQSSBhdXRoZW50aWNhdGlvbiB0b2tlbiZxdW90OyBwbHVnaW4gQVBJIGZ1bmN0aW9uLCBt YXliZSBhbHNvIHNvbWUgQVBJIGZvciBwZXJmb3JtaW5nIGFjdHVhbCBIVFRQIFJFU1QgY2FsbHM/ PG86cD48L286cD48L2xpPjwvdWw+DQo8cD48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxvOnA+ Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxwPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+QXMg Zm9yIHRoZSBFbmdpbmUgUkVTVCBBUEkgYXV0aGVudGljYXRpb24gdG9rZW4sIG5lZWQgdG8gbGVh cm4gbW9yZSBhYm91dCBpdCwgYXMgV2ViQWRtaW4gR1VJIGN1cnJlbnRseSB1c2VzIEdXVCBSUEMg aW5zdGVhZCBvZiBSRVNUIEFQSSB3aGVuIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgYmFja2VuZC48 bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cD48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxvOnA+ Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxwPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+WW91 IGFsc28gbWVudGlvbmVkIHRoYXQgJnF1b3Q7d2UgY2FuIG1ha2UgY2FsbHMgZnJvbSBvdXIgc2Vy dmVyIGludG8gdGhlIFJFU1QgQVBJJnF1b3Q7IC0gSSBhc3N1bWUgdGhpcyB3aWxsIGJlIHVzZWQg dG9nZXRoZXIgd2l0aCAmcXVvdDtjdXN0b20gY29udGVudCBmb3IgdGFiL2RpYWxvZyZxdW90OyBw bHVnaW4gQVBJIGZ1bmN0aW9uYWxpdHk/IChPdGhlcndpc2UgSSdkIHNheSB0aGUgVUkgUGx1Z2lu IGl0c2VsZiBjb3VsZCBtYWtlDQogUkVTVCBBUEkgY2FsbHMgb24gaXRzIG93bi4uKTxvOnA+PC9v OnA+PC9zcGFuPjwvcD4NCjxwPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PG86cD4mbmJzcDs8 L286cD48L3NwYW4+PC9wPg0KPHA+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5SZWdhcmRzLDxv OnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+Vm9qdGVj aDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJn aW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48bzpwPiZuYnNwOzwv bzpwPjwvc3Bhbj48L3A+DQo8ZGl2IGNsYXNzPSJNc29Ob3JtYWwiIGFsaWduPSJjZW50ZXIiIHN0 eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4NCjxociBz aXplPSIyIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciIgaWQ9Inp3Y2hyIj4NCjwvc3Bhbj48 L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWJvdHRvbTox Mi4wcHQiPjxiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVvdDss JnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjpibGFjayI+RnJvbToNCjwvc3Bhbj48L2I+PHNw YW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OywmcXVvdDtzYW5zLXNl cmlmJnF1b3Q7O2NvbG9yOmJsYWNrIj4mcXVvdDtDaHJpc3RvcGhlciBNb3JyaXNzZXkmcXVvdDsg Jmx0O0NocmlzdG9waGVyLk1vcnJpc3NleUBuZXRhcHAuY29tJmd0Ozxicj4NCjxiPlRvOiA8L2I+ JnF1b3Q7Vm9qdGVjaCBTem9jcyZxdW90OyAmbHQ7dnN6b2NzQHJlZGhhdC5jb20mZ3Q7LCAmcXVv dDtlbmdpbmUtZGV2ZWwmcXVvdDsgJmx0O2VuZ2luZS1kZXZlbEBvdmlydC5vcmcmZ3Q7PGJyPg0K PGI+U2VudDogPC9iPk1vbmRheSwgT2N0b2JlciAyMiwgMjAxMiA1OjI1OjUzIFBNPGJyPg0KPGI+ U3ViamVjdDogPC9iPlJFOiBbRW5naW5lLWRldmVsXSBVSSBQbHVnaW5zOiBQb0MgcGF0Y2ggcmV2 aXNpb24gNiBub3cgYXZhaWxhYmxlPG86cD48L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7 Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2NvbG9yOiMxRjQ5N0QiPkhpIFZv anRlY2gsPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PG86cD48L286cD48L3NwYW4+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7 Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2Nv bG9yOiMxRjQ5N0QiPiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxvOnA+ PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250 LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssJnF1b3Q7c2Fucy1z ZXJpZiZxdW90Oztjb2xvcjojMUY0OTdEIj5UaGFua3MgYWdhaW4gZm9yIHRoZSBkZWxpdmVyeSBv ZiB0aGUgcGF0Y2guIEZvciByZXZpc2lvbiA3LCBkbyB5b3UgaGF2ZSBhIGxpc3Qgb2YgY29udGVu dD8gSSBoYWQgcHJldmlvdXNseSBpbmRpY2F0ZWQgSSBjb3VsZCB3b3JrIG9uIGFkZGluZyB0aGUg cGx1Z2luIEFQSQ0KIHRvIGxhdW5jaCBhIGRpYWxvZywgYnV0IGhhZG7igJl0IGJlZW4gYWJsZSB0 byBnZXQgc3RhcnRlZCBvbiBpdCB1bnRpbCBub3cuIEkgd2FudGVkIHRvIHNlZSBpZiB5b3UgYnkg Y2hhbmNlIHdlcmUgYWxyZWFkeSB3b3JraW5nIG9uIGl0IG9yIGlmIHlvdSB3ZXJlIHBsYW5uaW5n IHRvIGRlbGl2ZXIgdGhhdCB5b3Vyc2VsZiBpbiB0aGUgbmV4dCByZXZpc2lvbj88L3NwYW4+PHNw YW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVv dDtDYWxpYnJpJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+Jm5i c3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PG86cD48L286cD48L3NwYW4+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9u dC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2NvbG9y OiMxRjQ5N0QiPkEgY291cGxlIG9mIG90aGVyIGl0ZW1zIHdlIGFyZSBsb29raW5nIGZvciBhcmUg dGhlIGFiaWxpdHkgdG8gYWRkIHRhc2tzIGZvciBleGVjdXRpb24gYW5kIGdldCBhY2Nlc3MgdG8g dGhlIHNlc3Npb24gSUQgb3Igc29tZSBraW5kIG9mIGF1dGhlbnRpY2F0aW9uIHRva2VuDQogc28g dGhhdCB3ZSBjYW4gbWFrZSBjYWxscyBmcm9tIG91ciBzZXJ2ZXIgaW50byB0aGUgUkVTVCBBUEku IEnigJltIG5vdCB2ZXJ5IGZhbWlsaWFyIHlldCB3aXRoIHRoZSBSRVNUIEFQSSBzbyBJ4oCZbSBu b3Qgc3VyZSB3aGF0IGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSBhbmQgd2hp Y2ggd291bGQgYmUgYmVzdC48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48bzpwPjwv bzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1z aXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LCZxdW90O3NhbnMtc2Vy aWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpi bGFjayI+PG86cD48L286cD48L3NwYW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkm cXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjojMUY0OTdEIj4tQ2hyaXM8L3NwYW4+ PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjoj MUY0OTdEIj4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48bzpwPjwvbzpw Pjwvc3Bhbj48L3A+DQo8ZGl2Pg0KPGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpz b2xpZCAjQjVDNERGIDEuMHB0O3BhZGRpbmc6My4wcHQgMGluIDBpbiAwaW4iPg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6 JnF1b3Q7VGFob21hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6YmxhY2siPkZy b206PC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseTom cXVvdDtUYWhvbWEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjpibGFjayI+IGVu Z2luZS1kZXZlbC1ib3VuY2VzQG92aXJ0Lm9yZyBbbWFpbHRvOmVuZ2luZS1kZXZlbC1ib3VuY2Vz QG92aXJ0Lm9yZ10NCjxiPk9uIEJlaGFsZiBPZiA8L2I+Vm9qdGVjaCBTem9jczxicj4NCjxiPlNl bnQ6PC9iPiBUaHVyc2RheSwgT2N0b2JlciAxOCwgMjAxMiAxMDo0OSBBTTxicj4NCjxiPlRvOjwv Yj4gZW5naW5lLWRldmVsPGJyPg0KPGI+U3ViamVjdDo8L2I+IFtFbmdpbmUtZGV2ZWxdIFVJIFBs dWdpbnM6IFBvQyBwYXRjaCByZXZpc2lvbiA2IG5vdyBhdmFpbGFibGU8L3NwYW4+PHNwYW4gc3R5 bGU9ImNvbG9yOmJsYWNrIj48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4mbmJzcDs8bzpw PjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1h cmdpbi1ib3R0b206MTIuMHB0Ij48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkhpIGd1eXMsPGJy Pg0KPGJyPg0KdGhlIGxhdGVzdCByZXZpc2lvbiBvZiBVSSBQbHVnaW5zIHByb29mLW9mLWNvbmNl cHQgcGF0Y2ggaXMgbm93IGF2YWlsYWJsZSBmb3IgeW91IHRvIGV4cGVyaW1lbnQgd2l0aC4gWW91 IGNhbiBkb3dubG9hZCB0aGUgcGF0Y2ggZnJvbSBvVmlydCBHZXJyaXQgYXQNCjxhIGhyZWY9Imh0 dHA6Ly9nZXJyaXQub3ZpcnQub3JnLyMvYy84MTIwLzIiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8v Z2Vycml0Lm92aXJ0Lm9yZy8jL2MvODEyMC8yPC9hPiAocGF0Y2ggc2V0IDIpLjxicj4NCjxicj4N ClBsZWFzZSByZWFkIG9uIHRvIGxlYXJuIHdoYXQncyBuZXcgaW4gdGhpcyByZXZpc2lvbi4gSWYg eW91IGhhdmUgYW55IGNvbW1lbnRzLCBxdWVzdGlvbnMgb3IgaWRlYXMsIHBsZWFzZSBsZXQgbWUg a25vdyE8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2IGNsYXNzPSJNc29Ob3JtYWwiIGFsaWdu PSJjZW50ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+PHNwYW4gc3R5bGU9ImNvbG9yOmJs YWNrIj4NCjxociBzaXplPSIyIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+DQo8L3NwYW4+ PC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxi cj4NCjxzdHJvbmc+MC4gVUkgcGx1Z2luIHBhdGggaW5mb3JtYXRpb24gcmVzb2x2ZWQgdXNpbmcg bG9jYWwgRW5naW5lIGNvbmZpZ3VyYXRpb248L3N0cm9uZz48Yj48YnI+DQo8L2I+PGJyPg0KU2Vy dmVyLXNpZGUgVUkgcGx1Z2luIGluZnJhc3RydWN0dXJlIG5vdyB1c2VzIGxvY2FsIChtYWNoaW5l LXNwZWNpZmljKSBFbmdpbmUgY29uZmlndXJhdGlvbiBpbnN0ZWFkIG9mIGdsb2JhbCAoPGVtPnZk Y19vcHRpb25zPC9lbT4gZGF0YWJhc2UgdGFibGUpIEVuZ2luZSBjb25maWd1cmF0aW9uOjxvOnA+ PC9vOnA+PC9zcGFuPjwvcD4NCjx1bCB0eXBlPSJkaXNjIj4NCjxsaSBjbGFzcz0iTXNvTm9ybWFs IiBzdHlsZT0iY29sb3I6YmxhY2s7bXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1i b3R0b20tYWx0OmF1dG87bXNvLWxpc3Q6bDQgbGV2ZWwxIGxmbzIiPg0KUHJldmlvdXNseSwgcGF0 aCBpbmZvcm1hdGlvbiB3YXMgcmVzb2x2ZWQgdGhyb3VnaCBvcmcub3ZpcnQuZW5naW5lLmNvcmUu Y29tbW9uLmNvbmZpZy5Db25maWcgY2xhc3MgLSBFbmdpbmUgY29uZmlndXJhdGlvbiB2YWx1ZXMg d2VyZSByZXRyaWV2ZWQgZnJvbQ0KPGk+dmRjX29wdGlvbnM8L2k+IGRhdGFiYXNlIHRhYmxlLjxv OnA+PC9vOnA+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOmJsYWNrO21z by1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvO21zby1saXN0 Omw0IGxldmVsMSBsZm8yIj4NCkN1cnJlbnRseSwgcGF0aCBpbmZvcm1hdGlvbiBpcyByZXNvbHZl ZCB0aHJvdWdoIG9yZy5vdmlydC5lbmdpbmUuY29yZS51dGlscy5Mb2NhbENvbmZpZyBjbGFzcyAt IEVuZ2luZSBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmUgcmV0cmlldmVkIGZyb20gbG9jYWwgZmls ZSBzeXN0ZW0uPG86cD48L286cD48L2xpPjwvdWw+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHls ZT0ibWFyZ2luLWJvdHRvbToxMi4wcHQiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+SW4gY2Fz ZSB5b3UncmUgbm90IHdvcmtpbmcgd2l0aCBvVmlydCBFbmdpbmUgdGhyb3VnaCBSUE0gcGFja2Fn ZSBzeXN0ZW0sIGUuZy4geW91IGhhdmUgYSBsb2NhbCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBz ZXQgdXAgYW5kIHlvdSBidWlsZCBhbmQgZGVwbG95IG9WaXJ0IEVuZ2luZSB0aHJvdWdoIE1hdmVu LCBwbGVhc2UNCiBmb2xsb3cgdGhlc2Ugc3RlcHM6PGJyPg0KPGJyPg0KYS4gQ29weSBkZWZhdWx0 IEVuZ2luZSBjb25maWd1cmF0aW9uIGludG8gL3Vzci9zaGFyZS88Yj5vdmlydC1lbmdpbmU8L2I+ L2NvbmY8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDozMC4w cHQiPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90 O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4jIG1rZGlyIC1wIC91c3Ivc2hhcmUvb3Zp cnQtZW5naW5lL2NvbmY8YnI+DQojIGNwICZsdDtPVklSVF9IT01FJmd0Oy9iYWNrZW5kL21hbmFn ZXIvY29uZi9lbmdpbmUuY29uZi5kZWZhdWx0cyAvdXNyL3NoYXJlL292aXJ0LWVuZ2luZS9jb25m L2VuZ2luZS5jb25mLmRlZmF1bHRzPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PG86 cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0i bWFyZ2luLWJvdHRvbToxMi4wcHQiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KYi4g SWYgbmVjZXNzYXJ5LCBjb3B5IFVJIHBsdWdpbiBkYXRhIGZpbGVzIGZyb20gL3Vzci9zaGFyZS9l bmdpbmUvdWktcGx1Z2lucyB0byAvdXNyL3NoYXJlLzxiPm92aXJ0LWVuZ2luZTwvYj4vdWktcGx1 Z2luczxicj4NCjxicj4NCmMuIElmIG5lY2Vzc2FyeSwgY29weSBVSSBwbHVnaW4gY29uZmlnIGZp bGVzIGZyb20gL2V0Yy9lbmdpbmUvdWktcGx1Z2lucyB0byAvZXRjLzxiPm92aXJ0LWVuZ2luZTwv Yj4vdWktcGx1Z2luczxicj4NCjxicj4NCmQsIEluIGNhc2UgeW91IHdhbnQgdG8gb3ZlcnJpZGUg dGhlIGRlZmF1bHQgRW5naW5lIGNvbmZpZ3VyYXRpb24sIHB1dCB5b3VyIGN1c3RvbSBwcm9wZXJ0 eSBmaWxlIGludG8gL2V0Yy9zeXNjb25maWcvb3ZpcnQtZW5naW5lPGJyPg0KPGJyPg0KVGhlIHJl YXNvbiBiZWhpbmQgdGhpcyBjaGFuZ2UgaXMgdGhhdCBwYXRoIGluZm9ybWF0aW9uIGZvciBVSSBw bHVnaW4gZGF0YSBhbmQgY29uZmlndXJhdGlvbiBpcyB0eXBpY2FsbHkgbWFjaGluZS1zcGVjaWZp YywgYW5kIHNob3VsZCBiZSBjdXN0b21pemFibGUgcGVyIG1hY2hpbmUgdGhyb3VnaCBFbmdpbmUg bG9jYWwgY29uZmlndXJhdGlvbi48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2IGNsYXNzPSJN c29Ob3JtYWwiIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+PHNwYW4g c3R5bGU9ImNvbG9yOmJsYWNrIj4NCjxociBzaXplPSIyIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNl bnRlciI+DQo8L3NwYW4+PC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0i Y29sb3I6YmxhY2siPjxicj4NCjxiPjEuIE5ldyBwbHVnaW4gQVBJIGZ1bmN0aW9uOiBhZGRNYWlu VGFiQWN0aW9uQnV0dG9uPGJyPg0KPC9iPjxicj4NClRoZSAmcXVvdDthZGRNYWluVGFiQWN0aW9u QnV0dG9uJnF1b3Q7IEFQSSBhZGRzIGN1c3RvbSBjb250ZXh0LXNlbnNpdGl2ZSBidXR0b24gdG8g dGhlIGdpdmVuIG1haW4gdGFiJ3MgZGF0YSBncmlkLCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcg ZGF0YSBncmlkIGNvbnRleHQgbWVudSBpdGVtLjxicj4NCjxicj4NCjwvc3Bhbj48c3BhbiBzdHls ZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPmFkZE1h aW5UYWJBY3Rpb25CdXR0b24oZW50aXR5VHlwZU5hbWUsIGxhYmVsLCBhY3Rpb25CdXR0b25JbnRl cmZhY2UpPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPGk+ZW50 aXR5VHlwZU5hbWU8L2k+IGluZGljYXRlcyB3aGljaCBtYWluIHRhYidzIGRhdGEgZ3JpZCB0aGUg YnV0dG9uIHNob3VsZCBiZSBhZGRlZCB0bywgYWNjb3JkaW5nIHRvIHRoZSBlbnRpdHkgdHlwZSBh c3NvY2lhdGVkIHdpdGggdGhlIG1haW4gdGFiLjxpPiBlbnRpdHlUeXBlTmFtZTwvaT4gdmFsdWVz IGFyZSBzdHJpbmdzIHJlZmxlY3Rpbmcgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5wbHVn aW4uZW50aXR5RW50aXR5VHlwZSBlbnVtDQogbWVtYmVycy4gRm9sbG93aW5nIDxpPmVudGl0eVR5 cGVOYW1lPC9pPiB2YWx1ZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgKHZhbHVlcyBhcmUgY2Fz ZS1zZW5zaXRpdmUpOiAmcXVvdDtEYXRhQ2VudGVyJnF1b3Q7LCAmcXVvdDtDbHVzdGVyJnF1b3Q7 LCAmcXVvdDtIb3N0JnF1b3Q7LCAmcXVvdDtTdG9yYWdlJnF1b3Q7LCAmcXVvdDtEaXNrJnF1b3Q7 LCAmcXVvdDtWaXJ0dWFsTWFjaGluZSZxdW90OywgJnF1b3Q7VGVtcGxhdGUmcXVvdDsuPGJyPg0K PGJyPg0KTm90ZTogJnF1b3Q7UG9vbCZxdW90OyB2YWx1ZSBpcyBjdXJyZW50bHkgbm90IHN1cHBv cnRlZCwgYmVjYXVzZSBvZiBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29tbW9uLmJ1c2luZXNzZW50 aXRpZXMudm1fcG9vbHMgZW50aXR5IG5vdCBpbXBsZW1lbnRpbmcgdGhlIEJ1c2luZXNzRW50aXR5 IGludGVyZmFjZSwgbm90IHN1cmUgd2h5IHRob3VnaC4gTWF5YmUgd2Ugc2hvdWxkIHN3aXRjaCBm cm9tIEJ1c2luZXNzRW50aXR5IHRvIElWZGNRdWVyeWFibGUgaW50ZXJmYWNlDQogYW5kIGFsd2F5 cyBjYXN0IGdldFF1ZXJ5YWJsZUlkIG1ldGhvZCByZXN1bHQgdmFsdWUgdG8gR3VpZD88YnI+DQo8 YnI+DQo8aT5sYWJlbDwvaT4gaXMgdGhlIHRpdGxlIGRpc3BsYXllZCBvbiB0aGUgYnV0dG9uPGk+ Ljxicj4NCjwvaT48YnI+DQo8aT5hY3Rpb25CdXR0b25JbnRlcmZhY2U8L2k+IHJlcHJlc2VudHMg YW4gb2JqZWN0IHRoYXQgJnF1b3Q7aW1wbGVtZW50cyB0aGUgYnV0dG9uIGludGVyZmFjZSZxdW90 OyBieSBkZWNsYXJpbmcgaXRzIGZ1bmN0aW9uczoNCjxpPm9uQ2xpY2s8L2k+LCA8aT5pc0VuYWJs ZWQ8L2k+LCA8aT5pc0FjY2Vzc2libGU8L2k+LiBBbGwgZnVuY3Rpb25zIG9mIDxpPmFjdGlvbkJ1 dHRvbkludGVyZmFjZTwvaT4gcmVjZWl2ZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbShzKSBhcyBm dW5jdGlvbiBhcmd1bWVudHMuPGJyPg0KPGJyPg0KTGV0J3MgdGFrZSBhIGNsb3NlciBsb29rIGF0 IHRoZSBjb25jZXB0IGJlaGluZCA8aT5hY3Rpb25CdXR0b25JbnRlcmZhY2U8L2k+LiBJbiB0cmFk aXRpb25hbCBjbGFzcy1iYXNlZCBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2VzLCBzdWNoIGFzIEph dmEsIGludGVyZmFjZSBpcyBhbiBhYnN0cmFjdCB0eXBlIHRoYXQgY29udGFpbnMgbWV0aG9kIGRl Y2xhcmF0aW9ucyB3aXRob3V0IGFuIGltcGxlbWVudGF0aW9uLiBBIGNsYXNzIHRoYXQgaW1wbGVt ZW50cw0KIHRoZSBnaXZlbiBpbnRlcmZhY2UgbXVzdCBpbXBsZW1lbnQgYWxsIG1ldGhvZHMgZGVj bGFyZWQgYnkgdGhhdCBpbnRlcmZhY2UgKHVubGVzcyBpdCdzIGFuIGFic3RyYWN0IGNsYXNzLCBi dXQgdGhpcyBpc24ndCByZWxldmFudCBpbiBvdXIgY2FzZSkuPGJyPg0KPGJyPg0KSW4gY29udHJh c3Qgd2l0aCB0cmFkaXRpb25hbCBjbGFzcy1iYXNlZCBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2Vz LCBKYXZhU2NyaXB0IHN1cHBvcnRzIE9PUCB0aHJvdWdoIHByb3RvdHlwZS1iYXNlZCBwcm9ncmFt bWluZyBtb2RlbCAoPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMv ZG9jcy9KYXZhU2NyaXB0L0ludHJvZHVjdGlvbl90b19PYmplY3QtT3JpZW50ZWRfSmF2YVNjcmlw dCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2Rv Y3MvSmF2YVNjcmlwdC9JbnRyb2R1Y3Rpb25fdG9fT2JqZWN0LU9yaWVudGVkX0phdmFTY3JpcHQ8 L2E+KS4NCiBBdCB0aGUgc2FtZSB0aW1lLCBKYXZhU2NyaXB0IGxhbmd1YWdlIGlzIGR5bmFtaWNh bGx5LXR5cGVkIGFuZCB0aGVyZWZvcmUgZG9lc24ndCBzdXBwb3J0IHRyYWRpdGlvbmFsIGNvbmNl cHQgb2YgaW50ZXJmYWNlIGluIE9PUCwgaXQgdXNlcyAmcXVvdDtkdWNrIHR5cGluZyZxdW90OyB0 ZWNobmlxdWUgaW5zdGVhZCAoPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9E dWNrX3R5cGluZyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kv RHVja190eXBpbmc8L2E+KS48YnI+DQo8YnI+DQpUaGUgc2ltcGxlc3Qgd2F5IHRvIHByb3ZpZGUg YW4gb2JqZWN0IHRoYXQgJnF1b3Q7aW1wbGVtZW50cyB0aGUgZ2l2ZW4gaW50ZXJmYWNlJnF1b3Q7 IGluIEphdmFTY3JpcHQgaXMgdG8gdXNlICZxdW90O2R1Y2sgdHlwaW5nJnF1b3Q7IHRlY2huaXF1 ZTogcHJvdmlkaW5nIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHdlbGwta25vd24gZnVuY3Rpb25z LiBJbiBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUsIEkgY2FsbCB0aGlzIGNvbmNlcHQgJnF1b3Q7 aW50ZXJmYWNlIG9iamVjdCZxdW90OywgcmVwcmVzZW50ZWQNCiBieSBvcmcub3ZpcnQuZW5naW5l LnVpLndlYmFkbWluLnBsdWdpbi5qc25pLkpzSW50ZXJmYWNlT2JqZWN0IGNsYXNzLiBVbmxpa2Ug dGhlIHRyYWRpdGlvbmFsIGNvbmNlcHQgb2YgaW50ZXJmYWNlIGFic3RyYWN0IHR5cGUgaW4gb2Jq ZWN0LW9yaWVudGVkIGxhbmd1YWdlcywgYW4gJnF1b3Q7aW50ZXJmYWNlIG9iamVjdCZxdW90Ow0K PHU+ZG9lcyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBkZWNsYXJlIGFsbCBmdW5jdGlvbnMgb2Yg dGhlIGdpdmVuIGludGVyZmFjZTwvdT4gaW4gb3JkZXIgdG8gJnF1b3Q7aW1wbGVtZW50JnF1b3Q7 IHN1Y2ggaW50ZXJmYWNlLiBJbiBmYWN0LCBhbiBlbXB0eSBvYmplY3QgY2FuIGJlIHVzZWQgYXMg YSB2YWxpZCAmcXVvdDtpbnRlcmZhY2Ugb2JqZWN0JnF1b3Q7LiBNaXNzaW5nIGZ1bmN0aW9ucyB3 aWxsIGJlIHNpbXBseSB0cmVhdGVkIGFzIGVtcHR5IChuby1vcCkgZnVuY3Rpb25zLg0KIEZ1cnRo ZXJtb3JlLCBhbiAmcXVvdDtpbnRlcmZhY2Ugb2JqZWN0JnF1b3Q7IGNhbiAmcXVvdDtpbXBsZW1l bnQmcXVvdDsgbXVsdGlwbGUgaW50ZXJmYWNlcyBieSBkZWNsYXJpbmcgZnVuY3Rpb25zIG9mIHRo b3NlIGludGVyZmFjZXMgKGludGVyZmFjZSBjb21wb3NpdGlvbikuPGJyPg0KPGJyPg0KR2V0dGlu ZyBiYWNrIHRvICZxdW90O2FkZE1haW5UYWJBY3Rpb25CdXR0b24mcXVvdDsgQVBJLCBoZXJlJ3Mg YSBzYW1wbGUgY29kZSB0aGF0IGFkZHMgbmV3IGJ1dHRvbiB0byAmcXVvdDtIb3N0JnF1b3Q7IG1h aW4gdGFiIGRhdGEgZ3JpZCwgYXMgcGFydCBvZiBVaUluaXQgZXZlbnQgaGFuZGxlciBmdW5jdGlv bjo8YnI+DQo8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJp ZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj5VaUluaXQ6IDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0i Zm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Izk5MDAwMCI+ZnVuY3Rp b248L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZx dW90Oztjb2xvcjpibGFjayI+KCkgezxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyBhcGkuPC9zcGFu PjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjoj Q0MzM0NDIj5hZGRNYWluVGFiQWN0aW9uQnV0dG9uPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZh bWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+KCdIb3N0JywgJ1Npbmds ZS1Ib3N0IEFjdGlvbicsPGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWls eTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4mbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gQWN0aW9uIGJ1dHRvbiBpbnRlcmZhY2Ugb2Jq ZWN0PGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIEFs bCBmdW5jdGlvbnMgcmVjZWl2ZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbShzKSBhcyBmdW5jdGlv biBhcmd1bWVudHM8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0Nv dXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsgezwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxi cj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVv dDs7Y29sb3I6IzAwNjYwMCI+Jm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsgLy8gQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBidXR0 b248L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMwMDY2MDAiPjxicj4NCjwvc3Bhbj48c3BhbiBz dHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPiZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7ICZuYnNwOyA8L3NwYW4+ PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMw MDAwOTkiPm9uQ2xpY2s8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJp ZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj46DQo8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiM5OTAwMDAiPmZ1bmN0aW9uPC9z cGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7 Y29sb3I6YmxhY2siPigpIHs8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZx dW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7ICZuYnNwOyAv LyBDYWxsaW5nICdhcmd1bWVudHNbMF0nIGlzIHNhZmUsIGJlY2F1c2Ugb25DbGljaygpIGNhbiBi ZSBjYWxsZWQ8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAvLyBvbmx5IHdoZW4gZXhhY3Rs eSBvbmUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgaW4gdGhlIGRhdGEgZ3JpZDxicj4NCjwv c3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29s b3I6YmxhY2siPiZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHdpbmRvdy5hbGVydCgnU2VsZWN0ZWQg aG9zdCBlbnRpdHkgSUQgPSAnICYjNDM7IGFyZ3VtZW50c1swXS5lbnRpdHlJZCk7PGJyPg0KJm5i c3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7IH0sPC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxl PSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4mbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gUmV0dXJu aW5nICd0cnVlJyBtZWFucyB0aGUgYnV0dG9uIGlzIGVuYWJsZWQgKGNsaWNrYWJsZSk8L3NwYW4+ PHNwYW4gc3R5bGU9ImNvbG9yOiMwMDY2MDAiPjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9u dC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IC8vIFJldHVybmluZyAn ZmFsc2UnIG1lYW5zIHRoZSBidXR0b24gaXMgZGlzYWJsZWQgKG5vbi1jbGlja2FibGUpPGJyPg0K Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7IC8vIERlZmF1bHQgdmFsdWUgPSAndHJ1ZSc8YnI+DQo8L3NwYW4+PHNwYW4gc3R5 bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4mbmJz cDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgPC9zcGFuPjxz cGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDAw MDk5Ij5pc0VuYWJsZWQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJp ZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj46DQo8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiM5OTAwMDAiPmZ1bmN0aW9uPC9z cGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7 Y29sb3I6YmxhY2siPigpIHs8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZx dW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPiZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5i c3A7IC8vIEVuYWJsZSBidXR0b24gb25seSB3aGVuIGV4YWN0bHkgb25lIGl0ZW0gaXMgc2VsZWN0 ZWQ8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3 JnF1b3Q7O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7 ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+DQo8Yj48 c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Izk5 MDAwMCI+cmV0dXJuPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291 cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPiBhcmd1bWVudHMubGVuZ3RoID09IDE7PGJyPg0K Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyB9LDwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0i Zm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgJm5ic3A7IC8vIFJldHVybmlu ZyAndHJ1ZScgbWVhbnMgdGhlIGJ1dHRvbiBpcyB2aXNpYmxlPGJyPg0KJm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIFJl dHVybmluZyAnZmFsc2UnIG1lYW5zIHRoZSBidXR0b24gaXMgaGlkZGVuPGJyPg0KJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIERlZmF1bHQgdmFs dWUgPSAndHJ1ZSc8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0Nv dXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwMDA5OSI+aXNBY2Nlc3NpYmxlPC9zcGFuPjxzcGFu IHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+ Og0KPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZx dW90Oztjb2xvcjojOTkwMDAwIj5mdW5jdGlvbjwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4oKSB7PC9zcGFuPjxz cGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZh bWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4mbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsm bmJzcDsgLy8gQWx3YXlzIHNob3cgdGhlIGJ1dHRvbiBpbiB0aGUgY29ycmVzcG9uZGluZyBkYXRh IGdyaWQ8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIg TmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5i c3A7ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+DQo8 Yj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6 Izk5MDAwMCI+cmV0dXJuPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPg0KPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSJm b250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojOTkwMDAwIj50cnVlPC9z cGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7 Y29sb3I6YmxhY2siPjs8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNr Ij48YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3 JnF1b3Q7O2NvbG9yOmJsYWNrIj48YnI+DQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsgfTxicj4NCjxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyApOzxicj4NCn08L3Nw YW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8YnI+DQpBcyBtZW50aW9uZWQgYWJv dmUsIGFsbCBmdW5jdGlvbnMgb2YgYW4gaW50ZXJmYWNlIG9iamVjdCBhcmUgb3B0aW9uYWwuIEZv ciBmdW5jdGlvbnMgZXhwZWN0aW5nIHJldHVybiB2YWx1ZSwgZGVmYXVsdCB2YWx1ZSBpcyBkZWZp bmVkIGJ5IFVJIHBsdWdpbiBpbmZyYXN0cnVjdHVyZS4gRm9yIGV4YW1wbGU6PG86cD48L286cD48 L3NwYW4+PC9wPg0KPHVsIHR5cGU9ImRpc2MiPg0KPGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxl PSJjb2xvcjpibGFjazttc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1h bHQ6YXV0bzttc28tbGlzdDpsMiBsZXZlbDEgbGZvMyI+DQpvbkNsaWNrIC0gbm8gZGVmYXVsdCB2 YWx1ZSAobm8gcmV0dXJuIHZhbHVlIGV4cGVjdGVkKTxvOnA+PC9vOnA+PC9saT48bGkgY2xhc3M9 Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOmJsYWNrO21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21z by1tYXJnaW4tYm90dG9tLWFsdDphdXRvO21zby1saXN0OmwyIGxldmVsMSBsZm8zIj4NCmlzRW5h YmxlZCAvIGlzQWNjZXNzaWJsZSAtIGRlZmF1bHQgdmFsdWUgJnF1b3Q7dHJ1ZSZxdW90OyAoYm9v bGVhbiByZXR1cm4gdmFsdWUgZXhwZWN0ZWQpPG86cD48L286cD48L2xpPjwvdWw+DQo8cD48c3Bh biBzdHlsZT0iY29sb3I6YmxhY2siPk5vdGU6IFVJIHBsdWdpbiBpbmZyYXN0cnVjdHVyZSBjaGVj a3MgdGhlIGFjdHVhbCByZXR1cm4gdmFsdWUgdHlwZSwgYW5kIHVzZXMgZGVmYXVsdCB2YWx1ZSBp biBjYXNlIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBzb21ldGhpbmcgb2Ygd3JvbmcgKHVuZXhwZWN0 ZWQpIHR5cGUuPG86cD48L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5 bGU9Im1hcmdpbi1ib3R0b206MTIuMHB0Ij48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4N CkluIHRoZSBleGFtcGxlIGFib3ZlLCAmcXVvdDtjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbShzKSZx dW90OyBtYXBzIHRvIEpTT04tbGlrZSByZXByZXNlbnRhdGlvbnMgb2YgYnVzaW5lc3MgZW50aXRp ZXMgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgZ3JpZC4gRm9y IG5vdywgdGhlIGVudGl0eSByZXByZXNlbnRhdGlvbiBpcyBxdWl0ZSBzaW1wbGUgYW5kIHNhbWUg Zm9yIGFsbCBlbnRpdHkgdHlwZXM6PGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250 LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+eyBlbnRpdHlJZDog JnF1b3Q7W0J1c2luZXNzRW50aXR5R3VpZEFzU3RyaW5nXSZxdW90OyB9PGJyPg0KPC9zcGFuPjxz cGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KSW4gZnV0dXJlLCB3ZSB3aWxsIGNyZWF0ZSBz cGVjaWZpYyBKU09OLWxpa2UgcmVwcmVzZW50YXRpb25zIGZvciBzcGVjaWZpYyBidXNpbmVzcyBl bnRpdGllcywgaW4gY29tcGxpYW5jZSB3aXRoIEVuZ2luZSBSRVNUIEFQSSBlbnRpdHkgc3RydWN0 dXJlLjxicj4NCjxicj4NCkZvciBhIG1vcmUgZXh0ZW5zaXZlIGV4YW1wbGUgb2YgdXNpbmcgJnF1 b3Q7YWRkTWFpblRhYkFjdGlvbkJ1dHRvbiZxdW90OyBBUEksIHBsZWFzZSBzZWUgdGhlIGF0dGFj aGVkICZxdW90O2FkZE1haW5UYWJBY3Rpb25CdXR0b24uaHRtbC5leGFtcGxlJnF1b3Q7IGZpbGUu PG86cD48L286cD48L3NwYW4+PC9wPg0KPGRpdiBjbGFzcz0iTXNvTm9ybWFsIiBhbGlnbj0iY2Vu dGVyIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+ DQo8aHIgc2l6ZT0iMiIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPg0KPC9zcGFuPjwvZGl2 Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8 Yj4yLiBJbXByb3ZlZCBwbHVnaW4gQVBJIGZ1bmN0aW9uOiBhZGRNYWluVGFiPGJyPg0KPC9iPjxi cj4NClRoZSAmcXVvdDthZGRNYWluVGFiJnF1b3Q7IEFQSSB3YXMgaW1wcm92ZWQgdG8gYWRkcmVz cyBmb2xsb3dpbmcgaXNzdWVzOjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjx1bCB0eXBlPSJkaXNj Ij4NCjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6YmxhY2s7bXNvLW1hcmdpbi10 b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87bXNvLWxpc3Q6bDEgbGV2ZWwx IGxmbzQiPg0KJnF1b3Q7YWRkTWFpblRhYiZxdW90OyBjYW4gbm93IGJlIGNhbGxlZCBhdCBhbnkg bW9tZW50IGR1cmluZyBVSSBwbHVnaW4gcnVudGltZSwgZ2l2ZW4gdGhhdCB0aGUgcGx1Z2luIGlz IGFsbG93ZWQgaW52b2tlIHBsdWdpbiBBUEkgZnVuY3Rpb25zIChwbHVnaW4gaXMgZWl0aGVyIElO SVRJQUxJWklORyBvciBJTl9VU0UpLjxicj4NClByZXZpb3VzbHksICZxdW90O2FkZE1haW5UYWIm cXVvdDsgd29ya2VkIHJlbGlhYmx5IG9ubHkgd2hlbiBjYWxsZWQgZnJvbSB3aXRoaW4gVWlJbml0 IGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uPGJyPg0KQ3VycmVudGx5LCBpdCdzIHBvc3NpYmxlIHRv IGNhbGwgJnF1b3Q7YWRkTWFpblRhYiZxdW90OyBhdCBhbnkgbW9tZW50LCBlLmcuIGZyb20gd2l0 aGluIHNvbWUgb3RoZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvbiAoYWZ0ZXIgVWlJbml0IGhhcyBj b21wbGV0ZWQpLjxvOnA+PC9vOnA+PC9saT48L3VsPg0KPHVsIHR5cGU9ImRpc2MiPg0KPGxpIGNs YXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjpibGFjazttc28tbWFyZ2luLXRvcC1hbHQ6YXV0 bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzttc28tbGlzdDpsMCBsZXZlbDEgbGZvNSI+DQom cXVvdDthZGRNYWluVGFiJnF1b3Q7IG5vdyByZXRhaW5zICZxdW90O2FjdGl2ZSZxdW90OyB0YWIg KGhpZ2hsaWdodGVkIHRhYiBHVUkpLjxicj4NCiZxdW90O2FkZE1haW5UYWImcXVvdDsgd29ya3Mg YnkgYWRkaW5nIG5ldyB0YWIgY29tcG9uZW50IChHV1RQIHByZXNlbnRlciBwcm94eSkgYW5kIHJl ZnJlc2hpbmcgbWFpbiB0YWIgcGFuZWwgR1VJIGJ5IHJlbW92aW5nIGFsbCByZWxhdGVkIHRhYnMg YW5kIHJlLWFkZGluZyB0aGVtIGFnYWluLjxicj4NClRoaXMgbG9naWMgaXMgaGFuZGxlZCBieSBv cmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi5wcmVzZW50ZXIuRHluYW1pY1RhYkNvbnRhaW5lclBy ZXNlbnRlciBjbGFzcywgd2hpY2ggbWFrZXMgc3VyZSB0aGF0ICZxdW90O2FjdGl2ZSZxdW90OyB0 YWIgaXMgcmV0YWluZWQgZXZlbiBhZnRlciBtYWluIHRhYiBwYW5lbCB3YXMgcmVmcmVzaGVkLjxv OnA+PC9vOnA+PC9saT48L3VsPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1i b3R0b206MTIuMHB0Ij48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkZ1cnRoZXJtb3JlLCBjdXN0 b20gbWFpbiB0YWIgaW1wbGVtZW50YXRpb24gbm93IGRpc3BsYXlzIHRoZSBjb250ZW50IG9mIHRo ZSBnaXZlbiBVUkwgdGhyb3VnaCBIVE1MIGlmcmFtZSBlbGVtZW50LjxvOnA+PC9vOnA+PC9zcGFu PjwvcD4NCjxkaXYgY2xhc3M9Ik1zb05vcm1hbCIgYWxpZ249ImNlbnRlciIgc3R5bGU9InRleHQt YWxpZ246Y2VudGVyIj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPg0KPGhyIHNpemU9IjIiIHdp ZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4NCjwvc3Bhbj48L2Rpdj4NCjxwIGNsYXNzPSJNc29O b3JtYWwiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJs YWNrIj48YnI+DQo8Yj4zLiBJbXByb3ZlZCBuYXRpdmUgSmF2YVNjcmlwdCBmdW5jdGlvbiBoYW5k bGluZzwvYj4gKEdXVCBKU05JKTxicj4NCjxicj4NClRoaXMgcGF0Y2ggaW50cm9kdWNlcyBvcmcu b3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5qc25pLkpzRnVuY3Rpb24gYW5kIG9yZy5v dmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLmpzbmkuSnNGdW5jdGlvblJlc3VsdEhlbHBl ciBjbGFzc2VzIHByb3ZpZGluZyBKYXZhIGFic3RyYWN0aW9uIGZvciBpbnZva2luZyBuYXRpdmUg SmF2YVNjcmlwdCBmdW5jdGlvbnMuIFRoZXNlIGNsYXNzZXMgZm9sbG93IHRoZSBnZW5lcmFsIGNv bnRyYWN0DQogb2YgJnF1b3Q7aW50ZXJmYWNlIG9iamVjdCZxdW90OyBhcyBtZW50aW9uZWQgYWJv dmUuPGJyPg0KPGJyPg0KSnNGdW5jdGlvblJlc3VsdEhlbHBlciBpcyBwYXJ0aWN1bGFybHkgdXNl ZnVsIHdoZW4gZGVhbGluZyB3aXRoIGZ1bmN0aW9ucyB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gcmV0 dXJuIHZhbHVlIG9mIGEgY2VydGFpbiB0eXBlLiBUb28gYmFkIHN0YW5kYXJkIEdXVCBKU05JIGNs YXNzZXMgZG9uJ3QgcHJvdmlkZSBzdWNoIGFic3RyYWN0aW9uIGZvciB3b3JraW5nIHdpdGggbmF0 aXZlIGZ1bmN0aW9ucyBvdXQtb2YtdGhlLWJveC4uLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxk aXYgY2xhc3M9Ik1zb05vcm1hbCIgYWxpZ249ImNlbnRlciIgc3R5bGU9InRleHQtYWxpZ246Y2Vu dGVyIj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPg0KPGhyIHNpemU9IjIiIHdpZHRoPSIxMDAl IiBhbGlnbj0iY2VudGVyIj4NCjwvc3Bhbj48L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0 eWxlPSJtYXJnaW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+ DQo8Yj40LiBBY3Rpb25QYW5lbCBhbmQgQWN0aW9uVGFibGUgdHlwZSBoaWVyYXJjaHkgcmVmYWN0 b3Jpbmc8L2I+IChyZWxhdGVkIHRvICZxdW90O2FkZE1haW5UYWJBY3Rpb25CdXR0b24mcXVvdDsg QVBJKTxiPjxicj4NCjwvYj48YnI+DQpQcmV2aW91c2x5LCBBYnN0cmFjdEFjdGlvblBhbmVsIGFu ZCBBYnN0cmFjdEFjdGlvblRhYmxlIGNsYXNzZXMgZGlkbid0IGltcGxlbWVudCBhbnkgcmVhc29u YWJsZSBpbnRlcmZhY2UgdGhhdCB3b3VsZCBhbGxvdyBvdGhlciBjb21wb25lbnRzIChjbGllbnQt c2lkZSBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUpIHRvIGRlcGVuZCBvbiB0aGVpciBmdW5jdGlv bmFsaXR5IGluIGEgbG9vc2VseS1jb3VwbGVkIG1hbm5lci4gVGhpcyB3b3VsZCBtYWtlDQogY29k ZSB0aGF0IGltcGxlbWVudHMgJnF1b3Q7YWRkTWFpblRhYkFjdGlvbkJ1dHRvbiZxdW90OyBBUEkg JnF1b3Q7dWdseSZxdW90OzogbWFpbiB0YWIgdmlldyBpbnRlcmZhY2Ugd291bGQgaGF2ZSB0byBy ZWZlcmVuY2UgQWJzdHJhY3RBY3Rpb25UYWJsZSBjbGFzcyBkaXJlY3RseS4gSW4gTVZQIGRlc2ln biBwYXR0ZXJuLCB2aWV3IGludGVyZmFjZSBzaG91bGQgYXZvaWQgcmVmZXJlbmNpbmcgc3BlY2lm aWMgR1dUIFdpZGdldCBjbGFzc2VzIGRpcmVjdGx5Ljxicj4NCjxicj4NClRoaXMgcGF0Y2ggaW50 cm9kdWNlcyBuZXcgaW50ZXJmYWNlcyBmb3IgQWN0aW9uUGFuZWwgYW5kIEFjdGlvblRhYmxlIGNv bXBvbmVudHMgd2hpbGUgZWxpbWluYXRpbmcgY29kZSByZWR1bmRhbmN5IChkdXBsaWNhdGUgb3Ig dW5uZWNlc3NhcnkgY29kZSkuPG86cD48L286cD48L3NwYW4+PC9wPg0KPGRpdiBjbGFzcz0iTXNv Tm9ybWFsIiBhbGlnbj0iY2VudGVyIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0 eWxlPSJjb2xvcjpibGFjayI+DQo8aHIgc2l6ZT0iMiIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50 ZXIiPg0KPC9zcGFuPjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1i b3R0b206MTIuMHB0Ij48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxiPjUuIEFjdGlv blBhbmVsIHR5cGUgaGllcmFyY2h5IHJlZmFjdG9yaW5nPC9iPiAocmVsYXRlZCB0byAmcXVvdDth ZGRNYWluVGFiJnF1b3Q7IEFQSSk8YnI+DQo8YnI+DQpTaW5jZSBvcmcub3ZpcnQuZW5naW5lLnVp LmNvbW1vbi5wcmVzZW50ZXIuRHluYW1pY1RhYkNvbnRhaW5lclByZXNlbnRlciBkZWZpbmVzIG5l dyBEeW5hbWljVGFiUGFuZWwgaW50ZXJmYWNlIHRoYXQgZXh0ZW5kcyBzdGFuZGFyZCBHV1RQIFRh YlBhbmVsIGludGVyZmFjZSwgc29tZSByZWZhY3RvcmluZyBoYWQgdG8gYmUgZG9uZSBpbiByZWxh dGVkIEFjdGlvblBhbmVsIGNsYXNzZXMuPGJyPg0KPGJyPg0KVGhpcyBwYXRjaCBtYWtlcyBzdXJl IHRoYXQgYm90aCBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi53aWRnZXQudGFiLkFic3RyYWN0 VGFiUGFuZWwgKHdpZGdldCkgYW5kIG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLnZpZXcuQWJz dHJhY3RUYWJQYW5lbFZpZXcgKHZpZXcpIHN1cHBvcnQgRHluYW1pY1RhYlBhbmVsIGludGVyZmFj ZS48YnI+DQo8YnI+DQpOb3RlIHRoYXQgZm9yIG5vdywgb25seSBtYWluIHRhYiBwYW5lbCAob3Jn Lm92aXJ0LmVuZ2luZS51aS53ZWJhZG1pbi5zZWN0aW9uLm1haW4ucHJlc2VudGVyLk1haW5UYWJQ YW5lbFByZXNlbnRlcikgc3VwcG9ydHMgZHluYW1pYyB0YWJzIHdpdGhpbiBpdHMgdmlldy48bzpw PjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2IGNsYXNzPSJNc29Ob3JtYWwiIGFsaWduPSJjZW50ZXIi IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4NCjxo ciBzaXplPSIyIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNlbnRlciI+DQo8L3NwYW4+PC9kaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMi4wcHQiPjxzcGFuIHN0 eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPGI+V2hlcmUgaXMgYWRkU3ViVGFiIEFQSSBmdW5jdGlv bj88L2I+PGJyPg0KPGJyPg0KSW1wbGVtZW50aW5nICZxdW90O2FkZFN1YlRhYiZxdW90OyBBUEkg cmVxdWlyZXMgc29tZSBtb3JlIGNoYW5nZXMsIGFuZCBJIGRpZG4ndCB3YW50IHRvIGRlbGF5IHRo aXMgUG9DIHBhdGNoIGp1c3QgYmVjYXVzZSBvZiBpdC4uLjxicj4NCjxicj4NCkhlcmUncyBhIHNh bXBsZSBjb2RlIHRoYXQgaWxsdXN0cmF0ZXMgcHJvcG9zZWQgJnF1b3Q7YWRkU3ViVGFiJnF1b3Q7 IEFQSSB1c2FnZTo8YnI+DQo8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZx dW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj5VaUluaXQ6IDwvc3Bhbj48Yj48c3Bh biBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Izk5MDAw MCI+ZnVuY3Rpb248L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3Vy aWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+KCkgezxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyBh cGkuPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90 Oztjb2xvcjojQ0MzM0NDIj5hZGRTdWJUYWI8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5 OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4oJ0hvc3QnLCZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsNCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1p bHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Ly8gZW50aXR5VHlwZU5h bWU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7 O2NvbG9yOmJsYWNrIj48YnI+DQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsgJ0N1c3RvbSBIb3N0IFN1YiBUYWInLCZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5 bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPi8v IGxhYmVsPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZx dW90Oztjb2xvcjpibGFjayI+PGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7ICdjdXN0b20taG9zdC1zdWItdGFiJywgJm5ic3A7IDwvc3Bhbj48c3BhbiBzdHls ZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Ly8g aGlzdG9yeVRva2VuPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVy IE5ldyZxdW90Oztjb2xvcjpibGFjayI+PGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7ICdodHRwOi8vd3d3Lm92aXJ0Lm9yZy8nLCA8L3NwYW4+PHNwYW4gc3R5 bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPi8v IGNvbnRlbnRVcmw8YnI+DQo8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZx dW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVv dDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwO2JhY2tncm91bmQ6d2hpdGUiPi8vIFN1 YiB0YWIgaW50ZXJmYWNlIG9iamVjdDxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyAvLyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0Nv dXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPkFsbCBmdW5jdGlvbnMgcmVjZWl2ZSBjdXJy ZW50bHkgc2VsZWN0ZWQgaXRlbShzKTxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyAvLyB3aXRoaW4gdGhlIG1haW4gdGFiIGRhdGEgZ3JpZCBhcyBmdW5jdGlv biBhcmd1bWVudHM8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMwMDY2MDAiPjxicj4NCjwvc3Bh bj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6 YmxhY2siPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB7PC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxl PSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4mbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsgLy8gUmV0dXJu aW5nICd0cnVlJyBtZWFucyB0aGUgc3ViIHRhYiBpcyB2aXNpYmxlPGJyPg0KJm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8v IFJldHVybmluZyAnZmFsc2UnIG1lYW5zIHRoZSBzdWIgdGFiIGlzIGhpZGRlbjxicj4NCiZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBEZWZhdWx0 IHZhbHVlID0gJ3RydWUnPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVv dDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZx dW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDAwOTkiPmlzQWNjZXNzaWJsZTwvc3Bhbj48 c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Ymxh Y2siPjoNCjwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBO ZXcmcXVvdDs7Y29sb3I6Izk5MDAwMCI+ZnVuY3Rpb248L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJm b250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+KCkgezxicj4N CiZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1mYW1p bHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Izk5MDAwMCI+cmV0dXJuPC9zcGFuPjwv Yj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6 YmxhY2siPiBhcmd1bWVudHMubGVuZ3RoID09IDEgJmFtcDsmYW1wOyBhcmd1bWVudHNbMF0uZW50 aXR5SWQgPT0gJyZsdDtNeUhvc3RFbnRpdHlJZCZndDsnOzxicj4NCiZuYnNwOyZuYnNwOyZuYnNw OyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfTwvc3Bhbj48c3Bh biBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1p bHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPjxicj4NCiZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9PGJyPg0KPGJyPg0KJm5ic3A7Jm5ic3A7 Jm5ic3A7ICk7PGJyPg0KfTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxi cj4NCkFzIHBhcnQgb2YgJnF1b3Q7YWRkU3ViVGFiJnF1b3Q7IEFQSSBpbXBsZW1lbnRhdGlvbiwg SSdsbCByZWZhY3RvciBjdXN0b20gbWFpbiB0YWIgY29tcG9uZW50cywgaW4gb3JkZXIgdG8gdXNl IG9uZSAmcXVvdDt0YWIgdHlwZSZxdW90OyBmb3IgYm90aCBtYWluIGFuZCBzdWIgdGFicy48YnI+ DQo8YnI+DQpDdXJyZW50bHksIHdlIGhhdmUgb25lIChhbmQgb25seSBvbmUpICZxdW90O3RhYiB0 eXBlJnF1b3Q7IC0gYSB0YWIgdGhhdCBzaG93cyBjb250ZW50IG9mIHRoZSBnaXZlbiBVUkwgdGhy b3VnaCBIVE1MIGlmcmFtZSBlbGVtZW50Ljxicj4NCjxicj4NCldlIGNvdWxkIGFsc28gY3JlYXRl IG5ldyAmcXVvdDt0YWIgdHlwZXMmcXVvdDssIGUuZy4gZm9ybS1iYXNlZCB0YWIgdGhhdCBzaG93 cyBrZXkvdmFsdWUgcGFpcnMgKElNSE8gdGhpcyBjb3VsZCBiZSBxdWl0ZSB1c2VmdWwgZm9yIGN1 c3RvbSBzdWIgdGFicykuPG86cD48L286cD48L3NwYW4+PC9wPg0KPGRpdiBjbGFzcz0iTXNvTm9y bWFsIiBhbGlnbj0iY2VudGVyIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0eWxl PSJjb2xvcjpibGFjayI+DQo8aHIgc2l6ZT0iMiIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIi Pg0KPC9zcGFuPjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1ib3R0 b206MTIuMHB0Ij48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCkxldCBtZSBrbm93IHdo YXQgeW91IHRoaW5rITxicj4NCjxicj4NCkNoZWVycyw8YnI+DQpWb2p0ZWNoPG86cD48L286cD48 L3NwYW4+PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0 eWxlPSJjb2xvcjpibGFjayI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== --_000_D290AD8432118048947689BA3AE8A9B3EA0742SACEXCMBX04PRDhqn_--

------=_Part_11959772_1958615526.1351100063621 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Chris,=20 no problem, I'll take care of implementing the dialog-related API function,= with initial implementation using a native browser pop-up window (we can i= mprove it later on, using WebAdmin dialog UI infrastructure).=20 Since I'm currently preparing for my talk at oVirt Workshop (Barcelona), I'= ll have more time to work on UI plugins when I return back. In order to hav= e revision 7 as soon as possible, I suggest to implement all planned items,= except for "add custom sub tab", as part of revision 7. What do you think?= =20 Regards,=20 Vojtech=20 ----- Original Message ----- From: "Christopher Morrissey" <Christopher.Morrissey@netapp.com>=20 To: "Vojtech Szocs" <vszocs@redhat.com>=20 Cc: "engine-devel" <engine-devel@ovirt.org>=20 Sent: Tuesday, October 23, 2012 9:36:27 PM=20 Subject: RE: [Engine-devel] UI Plugins: PoC patch revision 6 now available= =20 Hi Vojtech,=20 It looks like I=E2=80=99m going to be in training all next week and will un= fortunately NOT be able to take on the work to implement the =E2=80=9Cshow = dialog with content loaded from given URL=E2=80=9D plugin API function as I= had hoped. This is something we really need for revision 7. Of the items i= n your list for inclusion, the sub-tab frame plugin is the least necessary = for us. The rest of the items are all pretty important.=20 Let me know if any of this is a problem or if we can shift things around to= get them in the right order.=20 -Chris=20 From: Vojtech Szocs [mailto:vszocs@redhat.com]=20 Sent: Tuesday, October 23, 2012 1:35 PM=20 To: Morrissey, Christopher=20 Cc: engine-devel=20 Subject: Re: [Engine-devel] UI Plugins: PoC patch revision 6 now available= =20 Hi Chris,=20 well, I planned to implement simple "show dialog with content loaded from g= iven URL" plugin API function some time ago, but then I thought you might b= e experimenting with it already :) please feel free to work on that, we can= include it into PoC revision 7.=20 Regarding planned items for revision 7, here's my current list (feel free t= o add/modify things here if necessary):=20 * "add custom sub tab" plugin API function, with initial sub tab implem= entation showing content of the given URL (we can add more tab types later = on, e.g. form-based or table-based tab)=20 * "add custom task to task pane" plugin API function, requires some UiC= ommon integration coding (I will handle this)=20 * "show dialog with content loaded from given URL" plugin API function,= initial implementation could simply open new browser popup window using wi= ndow.open (but any other approach is fine as well)=20 * integration with REST API, e.g. "obtain REST API authentication token= " plugin API function, maybe also some API for performing actual HTTP REST = calls?=20 As for the Engine REST API authentication token, need to learn more about i= t, as WebAdmin GUI currently uses GWT RPC instead of REST API when communic= ating with the backend.=20 You also mentioned that "we can make calls from our server into the REST AP= I" - I assume this will be used together with "custom content for tab/dialo= g" plugin API functionality? (Otherwise I'd say the UI Plugin itself could = make REST API calls on its own..)=20 Regards,=20 Vojtech=20 ----- Original Message ----- From: "Christopher Morrissey" <Christopher.Morrissey@netapp.com>=20 To: "Vojtech Szocs" <vszocs@redhat.com>, "engine-devel" <engine-devel@ovirt= .org>=20 Sent: Monday, October 22, 2012 5:25:53 PM=20 Subject: RE: [Engine-devel] UI Plugins: PoC patch revision 6 now available= =20 Hi Vojtech,=20 Thanks again for the delivery of the patch. For revision 7, do you have a l= ist of content? I had previously indicated I could work on adding the plugi= n API to launch a dialog, but hadn=E2=80=99t been able to get started on it= until now. I wanted to see if you by chance were already working on it or = if you were planning to deliver that yourself in the next revision?=20 A couple of other items we are looking for are the ability to add tasks for= execution and get access to the session ID or some kind of authentication = token so that we can make calls from our server into the REST API. I=E2=80= =99m not very familiar yet with the REST API so I=E2=80=99m not sure what a= uthentication methods are available and which would be best.=20 -Chris=20 From: engine-devel-bounces@ovirt.org [mailto:engine-devel-bounces@ovirt.org= ] On Behalf Of Vojtech Szocs=20 Sent: Thursday, October 18, 2012 10:49 AM=20 To: engine-devel=20 Subject: [Engine-devel] UI Plugins: PoC patch revision 6 now available=20 Hi guys,=20 the latest revision of UI Plugins proof-of-concept patch is now available f= or you to experiment with. You can download the patch from oVirt Gerrit at = http://gerrit.ovirt.org/#/c/8120/2 (patch set 2).=20 Please read on to learn what's new in this revision. If you have any commen= ts, questions or ideas, please let me know!=20 0. UI plugin path information resolved using local Engine configuration=20 Server-side UI plugin infrastructure now uses local (machine-specific) Engi= ne configuration instead of global ( vdc_options database table) Engine con= figuration:=20 * Previously, path information was resolved through org.ovirt.engine.co= re.common.config.Config class - Engine configuration values were retrieved = from vdc_options database table.=20 * Currently, path information is resolved through org.ovirt.engine.core= .utils.LocalConfig class - Engine configuration values are retrieved from l= ocal file system.=20 In case you're not working with oVirt Engine through RPM package system, e.= g. you have a local development environment set up and you build and deploy= oVirt Engine through Maven, please follow these steps:=20 a. Copy default Engine configuration into /usr/share/ ovirt-engine /conf=20 # mkdir -p /usr/share/ovirt-engine/conf=20 # cp <OVIRT_HOME>/backend/manager/conf/engine.conf.defaults /usr/share/ovir= t-engine/conf/engine.conf.defaults=20 b. If necessary, copy UI plugin data files from /usr/share/engine/ui-plugin= s to /usr/share/ ovirt-engine /ui-plugins=20 c. If necessary, copy UI plugin config files from /etc/engine/ui-plugins to= /etc/ ovirt-engine /ui-plugins=20 d, In case you want to override the default Engine configuration, put your = custom property file into /etc/sysconfig/ovirt-engine=20 The reason behind this change is that path information for UI plugin data a= nd configuration is typically machine-specific, and should be customizable = per machine through Engine local configuration.=20 1. New plugin API function: addMainTabActionButton=20 The "addMainTabActionButton" API adds custom context-sensitive button to th= e given main tab's data grid, along with corresponding data grid context me= nu item.=20 addMainTabActionButton(entityTypeName, label, actionButtonInterface)=20 entityTypeName indicates which main tab's data grid the button should be ad= ded to, according to the entity type associated with the main tab. entityTy= peName values are strings reflecting org.ovirt.engine.ui.webadmin.plugin.en= tityEntityType enum members. Following entityTypeName values are currently = supported (values are case-sensitive): "DataCenter", "Cluster", "Host", "St= orage", "Disk", "VirtualMachine", "Template".=20 Note: "Pool" value is currently not supported, because of org.ovirt.engine.= core.common.businessentities.vm_pools entity not implementing the BusinessE= ntity interface, not sure why though. Maybe we should switch from BusinessE= ntity to IVdcQueryable interface and always cast getQueryableId method resu= lt value to Guid?=20 label is the title displayed on the button .=20 actionButtonInterface represents an object that "implements the button inte= rface" by declaring its functions: onClick , isEnabled , isAccessible . All= functions of actionButtonInterface receive currently selected item(s) as f= unction arguments.=20 Let's take a closer look at the concept behind actionButtonInterface . In t= raditional class-based object-oriented languages, such as Java, interface i= s an abstract type that contains method declarations without an implementat= ion. A class that implements the given interface must implement all methods= declared by that interface (unless it's an abstract class, but this isn't = relevant in our case).=20 In contrast with traditional class-based object-oriented languages, JavaScr= ipt supports OOP through prototype-based programming model ( https://develo= per.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-Oriented_JavaS= cript ). At the same time, JavaScript language is dynamically-typed and the= refore doesn't support traditional concept of interface in OOP, it uses "du= ck typing" technique instead ( http://en.wikipedia.org/wiki/Duck_typing ).= =20 The simplest way to provide an object that "implements the given interface"= in JavaScript is to use "duck typing" technique: providing an object that = contains well-known functions. In UI plugin infrastructure, I call this con= cept "interface object", represented by org.ovirt.engine.ui.webadmin.plugin= .jsni.JsInterfaceObject class. Unlike the traditional concept of interface = abstract type in object-oriented languages, an "interface object" does not = necessarily have to declare all functions of the given interface in order t= o "implement" such interface. In fact, an empty object can be used as a val= id "interface object". Missing functions will be simply treated as empty (n= o-op) functions. Furthermore, an "interface object" can "implement" multipl= e interfaces by declaring functions of those interfaces (interface composit= ion).=20 Getting back to "addMainTabActionButton" API, here's a sample code that add= s new button to "Host" main tab data grid, as part of UiInit event handler = function:=20 UiInit: function () {=20 api. addMainTabActionButton ('Host', 'Single-Host Action',=20 // Action button interface object=20 // All functions receive currently selected item(s) as function arguments= =20 {=20 // Called when the user clicks the button=20 onClick : function () {=20 // Calling 'arguments[0]' is safe, because onClick() can be called=20 // only when exactly one item is currently selected in the data grid=20 window.alert('Selected host entity ID =3D ' + arguments[0].entityId);=20 },=20 // Returning 'true' means the button is enabled (clickable)=20 // Returning 'false' means the button is disabled (non-clickable)=20 // Default value =3D 'true'=20 isEnabled : function () {=20 // Enable button only when exactly one item is selected=20 return arguments.length =3D=3D 1;=20 },=20 // Returning 'true' means the button is visible=20 // Returning 'false' means the button is hidden=20 // Default value =3D 'true'=20 isAccessible : function () {=20 // Always show the button in the corresponding data grid=20 return true ;=20 }=20 }=20 );=20 }=20 As mentioned above, all functions of an interface object are optional. For = functions expecting return value, default value is defined by UI plugin inf= rastructure. For example:=20 * onClick - no default value (no return value expected)=20 * isEnabled / isAccessible - default value "true" (boolean return value= expected)=20 Note: UI plugin infrastructure checks the actual return value type, and use= s default value in case the function returned something of wrong (unexpecte= d) type.=20 In the example above, "currently selected item(s)" maps to JSON-like repres= entations of business entities currently selected in the corresponding data= grid. For now, the entity representation is quite simple and same for all = entity types:=20 { entityId: "[BusinessEntityGuidAsString]" }=20 In future, we will create specific JSON-like representations for specific b= usiness entities, in compliance with Engine REST API entity structure.=20 For a more extensive example of using "addMainTabActionButton" API, please = see the attached "addMainTabActionButton.html.example" file.=20 2. Improved plugin API function: addMainTab=20 The "addMainTab" API was improved to address following issues:=20 * "addMainTab" can now be called at any moment during UI plugin runtime= , given that the plugin is allowed invoke plugin API functions (plugin is e= ither INITIALIZING or IN_USE). Previously, "addMainTab" worked reliably onl= y when called from within UiInit event handler function. Currently, it's po= ssible to call "addMainTab" at any moment, e.g. from within some other even= t handler function (after UiInit has completed).=20 * "addMainTab" now retains "active" tab (highlighted tab GUI). "addMain= Tab" works by adding new tab component (GWTP presenter proxy) and refreshin= g main tab panel GUI by removing all related tabs and re-adding them again.= This logic is handled by org.ovirt.engine.ui.common.presenter.DynamicTabCo= ntainerPresenter class, which makes sure that "active" tab is retained even= after main tab panel was refreshed.=20 Furthermore, custom main tab implementation now displays the content of the= given URL through HTML iframe element.=20 3. Improved native JavaScript function handling (GWT JSNI)=20 This patch introduces org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction a= nd org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunctionResultHelper classes = providing Java abstraction for invoking native JavaScript functions. These = classes follow the general contract of "interface object" as mentioned abov= e.=20 JsFunctionResultHelper is particularly useful when dealing with functions w= hich are expected to return value of a certain type. Too bad standard GWT J= SNI classes don't provide such abstraction for working with native function= s out-of-the-box...=20 4. ActionPanel and ActionTable type hierarchy refactoring (related to "addM= ainTabActionButton" API)=20 Previously, AbstractActionPanel and AbstractActionTable classes didn't impl= ement any reasonable interface that would allow other components (client-si= de UI plugin infrastructure) to depend on their functionality in a loosely-= coupled manner. This would make code that implements "addMainTabActionButto= n" API "ugly": main tab view interface would have to reference AbstractActi= onTable class directly. In MVP design pattern, view interface should avoid = referencing specific GWT Widget classes directly.=20 This patch introduces new interfaces for ActionPanel and ActionTable compon= ents while eliminating code redundancy (duplicate or unnecessary code).=20 5. ActionPanel type hierarchy refactoring (related to "addMainTab" API)=20 Since org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter def= ines new DynamicTabPanel interface that extends standard GWTP TabPanel inte= rface, some refactoring had to be done in related ActionPanel classes.=20 This patch makes sure that both org.ovirt.engine.ui.common.widget.tab.Abstr= actTabPanel (widget) and org.ovirt.engine.ui.common.view.AbstractTabPanelVi= ew (view) support DynamicTabPanel interface.=20 Note that for now, only main tab panel (org.ovirt.engine.ui.webadmin.sectio= n.main.presenter.MainTabPanelPresenter) supports dynamic tabs within its vi= ew.=20 Where is addSubTab API function?=20 Implementing "addSubTab" API requires some more changes, and I didn't want = to delay this PoC patch just because of it...=20 Here's a sample code that illustrates proposed "addSubTab" API usage:=20 UiInit: function () {=20 api. addSubTab ('Host', // entityTypeName=20 'Custom Host Sub Tab', // label=20 'custom-host-sub-tab', // historyToken=20 'http://www.ovirt.org/', // contentUrl=20 // Sub tab interface object=20 // All functions receive currently selected item(s)=20 // within the main tab data grid as function arguments=20 {=20 // Returning 'true' means the sub tab is visible=20 // Returning 'false' means the sub tab is hidden=20 // Default value =3D 'true'=20 isAccessible : function () {=20 return arguments.length =3D=3D 1 && arguments[0].entityId =3D=3D '<MyHostEn= tityId>';=20 }=20 }=20 );=20 }=20 As part of "addSubTab" API implementation, I'll refactor custom main tab co= mponents, in order to use one "tab type" for both main and sub tabs.=20 Currently, we have one (and only one) "tab type" - a tab that shows content= of the given URL through HTML iframe element.=20 We could also create new "tab types", e.g. form-based tab that shows key/va= lue pairs (IMHO this could be quite useful for custom sub tabs).=20 Let me know what you think!=20 Cheers,=20 Vojtech=20 ------=_Part_11959772_1958615526.1351100063621 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 Chris,<br><br>no problem, I'll take care of implem= enting the dialog-related API function, with initial implementation using a= native browser pop-up window (we can improve it later on, using WebAdmin d= ialog UI infrastructure).<br><br>Since I'm currently preparing for my talk = at oVirt Workshop (Barcelona), I'll have more time to work on UI plugins wh= en I return back. In order to have revision 7 as soon as possible, I sugges= t to implement all planned items, except for "add custom sub tab", as part = of revision 7. What do you think?<br><br><p><span style=3D"color:black">Reg= ards,</span></p> <p><span style=3D"color:black">Vojtech</span></p><br><br><hr id=3D"zwchr"><= div style=3D"color:#000;font-weight:normal;font-style:normal;text-decoratio= n:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>From: </b=
"Christopher Morrissey" <Christopher.Morrissey@netapp.com><br><b>To:= </b>"Vojtech Szocs" <vszocs@redhat.com><br><b>Cc: </b>"engine-devel"= <engine-devel@ovirt.org><br><b>Sent: </b>Tuesday, October 23, 2012 9= :36:27 PM<br><b>Subject: </b>RE: [Engine-devel] UI Plugins: PoC patch revis= ion 6 now available<br><br>
entityTypeName</i> values are strings reflecting org.ovirt.engine.ui.weba= dmin.plugin.entityEntityType enum members. Following <i>entityTypeName</i> values are currently supported (v= alues are case-sensitive): "DataCenter", "Cluster", "Host", "Storage", "Dis= k", "VirtualMachine", "Template".<br> <br> Note: "Pool" value is currently not supported, because of org.ovirt.engine.= core.common.businessentities.vm_pools entity not implementing the BusinessE= ntity interface, not sure why though. Maybe we should switch from BusinessE= ntity to IVdcQueryable interface and always cast getQueryableId method result value to Guid?<br> <br> <i>label</i> is the title displayed on the button<i>.<br> </i><br> <i>actionButtonInterface</i> represents an object that "implements the butt= on interface" by declaring its functions: <i>onClick</i>, <i>isEnabled</i>, <i>isAccessible</i>. All functions of <i>= actionButtonInterface</i> receive currently selected item(s) as function ar= guments.<br> <br> Let's take a closer look at the concept behind <i>actionButtonInterface</i>= . In traditional class-based object-oriented languages, such as Java, inter= face is an abstract type that contains method declarations without an imple= mentation. A class that implements
function</span></b><span style=3D"font-family:"Courier New";colo= r:black">() {<br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; /= / Calling 'arguments[0]' is safe, because onClick() can be called<br> &= nbsp; // only when exactly one item is currently selected in the data grid<= br> </span><span style=3D"font-family:"Courier New";color:black">&nbs=
function</span></b><span style=3D"font-family:"Courier New";colo= r:black">() {<br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; &nb= sp; // Enable button only when exactly one item is selected<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs=
function</span></b><span style=3D"font-family:"Courier New";colo= r:black">() {</span><span style=3D"color:black"><br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; /= / Always show the button in the corresponding data grid<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs=
true</span></b><span style=3D"font-family:"Courier New";color:bl= ack">;<br> }</span><span=
<style><!-- @font-face =09{font-family:Helvetica; =09panose-1:2 11 6 4 2 2 2 2 2 4;} @font-face =09{font-family:Wingdings; =09panose-1:5 0 0 0 0 0 0 0 0 0;} @font-face =09{font-family:Wingdings; =09panose-1:5 0 0 0 0 0 0 0 0 0;} @font-face =09{font-family:Calibri; =09panose-1:2 15 5 2 2 2 4 3 2 4;} @font-face =09{font-family:Tahoma; =09panose-1:2 11 6 4 3 5 4 4 2 4;} p.MsoNormal, li.MsoNormal, div.MsoNormal =09{margin:0in; =09margin-bottom:.0001pt; =09font-size:12.0pt; =09font-family:"Times New Roman","serif";} a:link, span.MsoHyperlink =09{mso-style-priority:99; =09color:blue; =09text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed =09{mso-style-priority:99; =09color:purple; =09text-decoration:underline;} p =09{mso-style-priority:99; =09margin:0in; =09margin-bottom:.0001pt; =09font-size:12.0pt; =09font-family:"Times New Roman","serif";} p.MsoAcetate, li.MsoAcetate, div.MsoAcetate =09{mso-style-priority:99; =09mso-style-link:"Balloon Text Char"; =09margin:0in; =09margin-bottom:.0001pt; =09font-size:8.0pt; =09font-family:"Tahoma","sans-serif";} span.EmailStyle18 =09{mso-style-type:personal; =09font-family:"Calibri","sans-serif"; =09color:#1F497D;} span.BalloonTextChar =09{mso-style-name:"Balloon Text Char"; =09mso-style-priority:99; =09mso-style-link:"Balloon Text"; =09font-family:"Tahoma","sans-serif";} span.EmailStyle23 =09{mso-style-type:personal-reply; =09font-family:"Calibri","sans-serif"; =09color:#1F497D;} .MsoChpDefault =09{mso-style-type:export-only; =09font-size:10.0pt;} @page WordSection1 =09{size:8.5in 11.0in; =09margin:1.0in 1.0in 1.0in 1.0in;} div.WordSection1 =09{page:WordSection1;} @list l0 =09{mso-list-id:430246997; =09mso-list-template-ids:-1402284674;} @list l0:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l0:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l0:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1 =09{mso-list-id:675302646; =09mso-list-template-ids:1662667256;} @list l1:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l1:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l1:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2 =09{mso-list-id:1330719658; =09mso-list-template-ids:-1858944704;} @list l2:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l2:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l2:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3 =09{mso-list-id:1550606144; =09mso-list-template-ids:-392264970;} @list l3:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l3:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l3:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4 =09{mso-list-id:2009794949; =09mso-list-template-ids:-1270830370;} @list l4:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l4:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l4:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} ol =09{margin-bottom:0in;} ul =09{margin-bottom:0in;} --></style> <div class=3D"WordSection1"> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">Hi Vojtech,</span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">It looks like I=E2=80=99m= going to be in training all next week and will unfortunately NOT be able t= o take on the work to implement the =E2=80=9Cshow dialog with content loade= d from given URL=E2=80=9D plugin API function as I had hoped. This is someth= ing we really need for revision 7. Of the items in your list for inclusion,= the sub-tab frame plugin is the least necessary for us. The rest of the it= ems are all pretty important.</span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">Let me know if any of thi= s is a problem or if we can shift things around to get them in the right or= der. </span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span></p> <div> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">-Chris</span></p> </div> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span></p> <div> <div style=3D"border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in = 0in 0in"> <p class=3D"MsoNormal"><b><span style=3D"font-size:10.0pt;font-family:"= ;Tahoma","sans-serif"">From:</span></b><span style=3D"font-s= ize:10.0pt;font-family:"Tahoma","sans-serif""> Vojtech = Szocs [mailto:vszocs@redhat.com] <br> <b>Sent:</b> Tuesday, October 23, 2012 1:35 PM<br> <b>To:</b> Morrissey, Christopher<br> <b>Cc:</b> engine-devel<br> <b>Subject:</b> Re: [Engine-devel] UI Plugins: PoC patch revision 6 now ava= ilable</span></p> </div> </div> <p class=3D"MsoNormal"> </p> <div> <p class=3D"MsoNormal"><span style=3D"color:black">Hi Chris,<br> <br> well, I planned to implement simple "show dialog with content loaded from g= iven URL" plugin API function some time ago, but then I thought you might b= e experimenting with it already :) please feel free to work on that, we can= include it into PoC revision 7.<br> <br> Regarding planned items for revision 7, here's my current list (feel free t= o add/modify things here if necessary):</span></p> <ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l3 level1 lfo1"> "add custom sub tab" plugin API function, with initial sub tab implementati= on showing content of the given URL (we can add more tab types later on, e.= g. form-based or table-based tab)</li><li class=3D"MsoNormal" style=3D"colo= r:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l3 leve= l1 lfo1"> "add custom task to task pane" plugin API function, requires some UiCommon = integration coding (I will handle this)</li><li class=3D"MsoNormal" style= =3D"color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list= :l3 level1 lfo1"> "show dialog with content loaded from given URL" plugin API function, initi= al implementation could simply open new browser popup window using window.o= pen (but any other approach is fine as well)</li><li class=3D"MsoNormal" st= yle=3D"color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-l= ist:l3 level1 lfo1"> integration with REST API, e.g. "obtain REST API authentication token" plug= in API function, maybe also some API for performing actual HTTP REST calls?= </li></ul> <p><span style=3D"color:black"> </span></p> <p><span style=3D"color:black">As for the Engine REST API authentication to= ken, need to learn more about it, as WebAdmin GUI currently uses GWT RPC in= stead of REST API when communicating with the backend.</span></p> <p><span style=3D"color:black"> </span></p> <p><span style=3D"color:black">You also mentioned that "we can make calls f= rom our server into the REST API" - I assume this will be used together wit= h "custom content for tab/dialog" plugin API functionality? (Otherwise I'd = say the UI Plugin itself could make REST API calls on its own..)</span></p> <p><span style=3D"color:black"> </span></p> <p><span style=3D"color:black">Regards,</span></p> <p><span style=3D"color:black">Vojtech</span></p> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"> </span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr id=3D"zwchr" size=3D"2" width=3D"100%" align=3D"center"> </span></div> <div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><b><span style=3D"fon= t-family:"Helvetica","sans-serif";color:black">From: </span></b><span style=3D"font-family:"Helvetica","sans-seri= f";color:black">"Christopher Morrissey" <Christopher.Morrissey@neta= pp.com><br> <b>To: </b>"Vojtech Szocs" <vszocs@redhat.com>, "engine-devel" <en= gine-devel@ovirt.org><br> <b>Sent: </b>Monday, October 22, 2012 5:25:53 PM<br> <b>Subject: </b>RE: [Engine-devel] UI Plugins: PoC patch revision 6 now ava= ilable</span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">Hi Vojtech,</span><span s= tyle=3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span><span style= =3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">Thanks again for the deli= very of the patch. For revision 7, do you have a list of content? I had pre= viously indicated I could work on adding the plugin API to launch a dialog, but hadn=E2=80=99t been able to get started on it unti= l now. I wanted to see if you by chance were already working on it or if yo= u were planning to deliver that yourself in the next revision?</span><span = style=3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span><span style= =3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">A couple of other items w= e are looking for are the ability to add tasks for execution and get access= to the session ID or some kind of authentication token so that we can make calls from our server into the REST API. I=E2=80=99m n= ot very familiar yet with the REST API so I=E2=80=99m not sure what authent= ication methods are available and which would be best.</span><span style=3D= "color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span><span style= =3D"color:black"></span></p> <div> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">-Chris</span><span style= =3D"color:black"></span></p> </div> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span><span style= =3D"color:black"></span></p> <div> <div style=3D"border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in = 0in 0in"> <p class=3D"MsoNormal"><b><span style=3D"font-size:10.0pt;font-family:"= ;Tahoma","sans-serif";color:black">From:</span></b><span sty= le=3D"font-size:10.0pt;font-family:"Tahoma","sans-serif"= ;;color:black"> engine-devel-bounces@ovirt.org [mailto:engine-devel-bounces= @ovirt.org] <b>On Behalf Of </b>Vojtech Szocs<br> <b>Sent:</b> Thursday, October 18, 2012 10:49 AM<br> <b>To:</b> engine-devel<br> <b>Subject:</b> [Engine-devel] UI Plugins: PoC patch revision 6 now availab= le</span><span style=3D"color:black"></span></p> </div> </div> <p class=3D"MsoNormal"><span style=3D"color:black"> </span></p> <div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black">Hi guys,<br> <br> the latest revision of UI Plugins proof-of-concept patch is now available f= or you to experiment with. You can download the patch from oVirt Gerrit at <a href=3D"http://gerrit.ovirt.org/#/c/8120/2" target=3D"_blank">http://ger= rit.ovirt.org/#/c/8120/2</a> (patch set 2).<br> <br> Please read on to learn what's new in this revision. If you have any commen= ts, questions or ideas, please let me know!</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal"><span style=3D"color:black"><br> <strong>0. UI plugin path information resolved using local Engine configura= tion</strong><b><br> </b><br> Server-side UI plugin infrastructure now uses local (machine-specific) Engi= ne configuration instead of global (<em>vdc_options</em> database table) En= gine configuration:</span></p> <ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l4 level1 lfo2"> Previously, path information was resolved through org.ovirt.engine.core.com= mon.config.Config class - Engine configuration values were retrieved from <i>vdc_options</i> database table.</li><li class=3D"MsoNormal" style=3D"col= or:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l4 lev= el1 lfo2"> Currently, path information is resolved through org.ovirt.engine.core.utils= .LocalConfig class - Engine configuration values are retrieved from local f= ile system.</li></ul> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black">In case you're not working with oVirt Engine through RPM package sys= tem, e.g. you have a local development environment set up and you build and= deploy oVirt Engine through Maven, please follow these steps:<br> <br> a. Copy default Engine configuration into /usr/share/<b>ovirt-engine</b>/co= nf</span></p> <div style=3D"margin-left:30.0pt"> <p class=3D"MsoNormal"><span style=3D"font-family:"Courier New";c= olor:black"># mkdir -p /usr/share/ovirt-engine/conf<br> # cp <OVIRT_HOME>/backend/manager/conf/engine.conf.defaults /usr/shar= e/ovirt-engine/conf/engine.conf.defaults</span><span style=3D"color:black">= </span></p> </div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> b. If necessary, copy UI plugin data files from /usr/share/engine/ui-plugin= s to /usr/share/<b>ovirt-engine</b>/ui-plugins<br> <br> c. If necessary, copy UI plugin config files from /etc/engine/ui-plugins to= /etc/<b>ovirt-engine</b>/ui-plugins<br> <br> d, In case you want to override the default Engine configuration, put your = custom property file into /etc/sysconfig/ovirt-engine<br> <br> The reason behind this change is that path information for UI plugin data a= nd configuration is typically machine-specific, and should be customizable = per machine through Engine local configuration.</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal"><span style=3D"color:black"><br> <b>1. New plugin API function: addMainTabActionButton<br> </b><br> The "addMainTabActionButton" API adds custom context-sensitive button to th= e given main tab's data grid, along with corresponding data grid context me= nu item.<br> <br> </span><span style=3D"font-family:"Courier New";color:black">addM= ainTabActionButton(entityTypeName, label, actionButtonInterface)<br> </span><span style=3D"color:black"><br> <i>entityTypeName</i> indicates which main tab's data grid the button shoul= d be added to, according to the entity type associated with the main tab.<i= the given interface must implement all methods declared by that interface = (unless it's an abstract class, but this isn't relevant in our case).<br> <br> In contrast with traditional class-based object-oriented languages, JavaScr= ipt supports OOP through prototype-based programming model (<a href=3D"http= s://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-Orie= nted_JavaScript" target=3D"_blank">https://developer.mozilla.org/en-US/docs= /JavaScript/Introduction_to_Object-Oriented_JavaScript</a>). At the same time, JavaScript language is dynamically-typed and therefore d= oesn't support traditional concept of interface in OOP, it uses "duck typin= g" technique instead (<a href=3D"http://en.wikipedia.org/wiki/Duck_typing" = target=3D"_blank">http://en.wikipedia.org/wiki/Duck_typing</a>).<br> <br> The simplest way to provide an object that "implements the given interface"= in JavaScript is to use "duck typing" technique: providing an object that = contains well-known functions. In UI plugin infrastructure, I call this con= cept "interface object", represented by org.ovirt.engine.ui.webadmin.plugin.jsni.JsInterfaceObject class. Unlik= e the traditional concept of interface abstract type in object-oriented lan= guages, an "interface object" <u>does not necessarily have to declare all functions of the given interfac= e</u> in order to "implement" such interface. In fact, an empty object can = be used as a valid "interface object". Missing functions will be simply tre= ated as empty (no-op) functions. Furthermore, an "interface object" can "implement" multiple interfaces by = declaring functions of those interfaces (interface composition).<br> <br> Getting back to "addMainTabActionButton" API, here's a sample code that add= s new button to "Host" main tab data grid, as part of UiInit event handler = function:<br> <br> </span><span style=3D"font-family:"Courier New";color:black">UiIn= it: </span><b><span style=3D"font-family:"Courier New";color:#990= 000">function</span></b><span style=3D"font-family:"Courier New";= color:black">() {<br> api.</span><span style=3D"font-family:"Courier New&= quot;;color:#CC33CC">addMainTabActionButton</span><span style=3D"font-famil= y:"Courier New";color:black">('Host', 'Single-Host Action',<br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Action button interface object<= br> // All functions receive current= ly selected item(s) as function arguments<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; {</span><span style=3D"color:black">= <br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Called when the u= ser clicks the button</span><span style=3D"color:#006600"><br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; </span><span style=3D"font-= family:"Courier New";color:#000099">onClick</span><span style=3D"= font-family:"Courier New";color:black">: </span><b><span style=3D"font-family:"Courier New";color:#990000"= p;  = ; window.alert('Selected host entity ID =3D ' + arguments[0].entityId);<br> },</span><span style=3D= "color:black"><br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Returning 'true' means= the button is enabled (clickable)</span><span style=3D"color:#006600"><br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Returning 'false' mean= s the button is disabled (non-clickable)<br> // Defau= lt value =3D 'true'<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; </span><span style=3D"font-= family:"Courier New";color:#000099">isEnabled</span><span style= =3D"font-family:"Courier New";color:black">: </span><b><span style=3D"font-family:"Courier New";color:#990000"= p;  = ; </span> <b><span style=3D"font-family:"Courier New";color:#990000">return= </span></b><span style=3D"font-family:"Courier New";color:black">= arguments.length =3D=3D 1;<br> },</span><span style=3D"colo= r:black"><br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Returning 'true' means= the button is visible<br> // Retur= ning 'false' means the button is hidden<br> // Default value =3D 't= rue'<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; </span><span style=3D"font-famil= y:"Courier New";color:#000099">isAccessible</span><span style=3D"= font-family:"Courier New";color:black">: </span><b><span style=3D"font-family:"Courier New";color:#990000"= p;  = ; </span> <b><span style=3D"font-family:"Courier New";color:#990000">return= </span></b><span style=3D"font-family:"Courier New";color:black"> </span><b><span style=3D"font-family:"Courier New";color:#990000"= style=3D"color:black"><br> </span><span style=3D"font-family:"Courier New";color:black"><br> }<br> <br> );<br> }</span><span style=3D"color:black"><br> <br> As mentioned above, all functions of an interface object are optional. For = functions expecting return value, default value is defined by UI plugin inf= rastructure. For example:</span></p> <ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l2 level1 lfo3"> onClick - no default value (no return value expected)</li><li class=3D"MsoN= ormal" style=3D"color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:a= uto;mso-list:l2 level1 lfo3"> isEnabled / isAccessible - default value "true" (boolean return value expec= ted)</li></ul> <p><span style=3D"color:black">Note: UI plugin infrastructure checks the ac= tual return value type, and uses default value in case the function returne= d something of wrong (unexpected) type.</span></p> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> In the example above, "currently selected item(s)" maps to JSON-like repres= entations of business entities currently selected in the corresponding data= grid. For now, the entity representation is quite simple and same for all = entity types:<br> <br> </span><span style=3D"font-family:"Courier New";color:black">{ en= tityId: "[BusinessEntityGuidAsString]" }<br> </span><span style=3D"color:black"><br> In future, we will create specific JSON-like representations for specific b= usiness entities, in compliance with Engine REST API entity structure.<br> <br> For a more extensive example of using "addMainTabActionButton" API, please = see the attached "addMainTabActionButton.html.example" file.</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal"><span style=3D"color:black"><br> <b>2. Improved plugin API function: addMainTab<br> </b><br> The "addMainTab" API was improved to address following issues:</span></p> <ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l1 level1 lfo4"> "addMainTab" can now be called at any moment during UI plugin runtime, give= n that the plugin is allowed invoke plugin API functions (plugin is either = INITIALIZING or IN_USE).<br> Previously, "addMainTab" worked reliably only when called from within UiIni= t event handler function.<br> Currently, it's possible to call "addMainTab" at any moment, e.g. from with= in some other event handler function (after UiInit has completed).</li></ul=
// label</span><span style=3D"font-family:"Courier New";color:bl= ack"><br> 'custom-host-sub-tab', </= span><span style=3D"font-family:"Courier New";color:#006600">// h= istoryToken</span><span style=3D"font-family:"Courier New";color:= black"><br> 'http://www.ovirt.org/', </span>= <span style=3D"font-family:"Courier New";color:#006600">// conten= tUrl<br> <br> </span><span style=3D"font-family:"Courier New";color:black">&nbs=
<ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l0 level1 lfo5"> "addMainTab" now retains "active" tab (highlighted tab GUI).<br> "addMainTab" works by adding new tab component (GWTP presenter proxy) and r= efreshing main tab panel GUI by removing all related tabs and re-adding the= m again.<br> This logic is handled by org.ovirt.engine.ui.common.presenter.DynamicTabCon= tainerPresenter class, which makes sure that "active" tab is retained even = after main tab panel was refreshed.</li></ul> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black">Furthermore, custom main tab implementation now displays the content= of the given URL through HTML iframe element.</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> <b>3. Improved native JavaScript function handling</b> (GWT JSNI)<br> <br> This patch introduces org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction a= nd org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunctionResultHelper classes = providing Java abstraction for invoking native JavaScript functions. These = classes follow the general contract of "interface object" as mentioned above.<br> <br> JsFunctionResultHelper is particularly useful when dealing with functions w= hich are expected to return value of a certain type. Too bad standard GWT J= SNI classes don't provide such abstraction for working with native function= s out-of-the-box...</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> <b>4. ActionPanel and ActionTable type hierarchy refactoring</b> (related t= o "addMainTabActionButton" API)<b><br> </b><br> Previously, AbstractActionPanel and AbstractActionTable classes didn't impl= ement any reasonable interface that would allow other components (client-si= de UI plugin infrastructure) to depend on their functionality in a loosely-= coupled manner. This would make code that implements "addMainTabActionButton" API "ugly": main tab view in= terface would have to reference AbstractActionTable class directly. In MVP = design pattern, view interface should avoid referencing specific GWT Widget= classes directly.<br> <br> This patch introduces new interfaces for ActionPanel and ActionTable compon= ents while eliminating code redundancy (duplicate or unnecessary code).</sp= an></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> <b>5. ActionPanel type hierarchy refactoring</b> (related to "addMainTab" A= PI)<br> <br> Since org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter def= ines new DynamicTabPanel interface that extends standard GWTP TabPanel inte= rface, some refactoring had to be done in related ActionPanel classes.<br> <br> This patch makes sure that both org.ovirt.engine.ui.common.widget.tab.Abstr= actTabPanel (widget) and org.ovirt.engine.ui.common.view.AbstractTabPanelVi= ew (view) support DynamicTabPanel interface.<br> <br> Note that for now, only main tab panel (org.ovirt.engine.ui.webadmin.sectio= n.main.presenter.MainTabPanelPresenter) supports dynamic tabs within its vi= ew.</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> <b>Where is addSubTab API function?</b><br> <br> Implementing "addSubTab" API requires some more changes, and I didn't want = to delay this PoC patch just because of it...<br> <br> Here's a sample code that illustrates proposed "addSubTab" API usage:<br> <br> </span><span style=3D"font-family:"Courier New";color:black">UiIn= it: </span><b><span style=3D"font-family:"Courier New";color:#990= 000">function</span></b><span style=3D"font-family:"Courier New";= color:black">() {<br> api.</span><span style=3D"font-family:"Courier New&= quot;;color:#CC33CC">addSubTab</span><span style=3D"font-family:"Couri= er New";color:black">('Host', </span><span style=3D"font-family:"Courier New";color:#006600">//= entityTypeName</span><span style=3D"font-family:"Courier New";co= lor:black"><br> 'Custom Host Sub Tab', &nbs= p; </span><span style=3D"font-family:"Courier New";color:#006600"= p; </span><span style=3D"font-family:&q= uot;Courier New";color:#006600;background:white">// Sub tab interface = object<br> // </span><span style=3D"font-fa= mily:"Courier New";color:#006600">All functions receive currently= selected item(s)<br> // within the main tab data grid= as function arguments</span><span style=3D"color:#006600"><br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; {</span><span style=3D"color:black">= <br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Returning 'true' means= the sub tab is visible<br> // Retur= ning 'false' means the sub tab is hidden<br> // Default value =3D 't= rue'<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; </span><span style=3D"font-famil= y:"Courier New";color:#000099">isAccessible</span><span style=3D"= font-family:"Courier New";color:black">: </span><b><span style=3D"font-family:"Courier New";color:#990000"=
function</span></b><span style=3D"font-family:"Courier New";colo= r:black">() {<br> &= nbsp; </span><b><span style=3D"font-family:"Courier New";color:#9= 90000">return</span></b><span style=3D"font-family:"Courier New";=
color:black"> arguments.length =3D=3D 1 && arguments[0].entityId = =3D=3D '<MyHostEntityId>';<br> }</span><span= style=3D"color:black"><br> </span><span style=3D"font-family:"Courier New";color:black"><br> }<br> <br> );<br> }</span><span style=3D"color:black"><br> <br> As part of "addSubTab" API implementation, I'll refactor custom main tab co= mponents, in order to use one "tab type" for both main and sub tabs.<br> <br> Currently, we have one (and only one) "tab type" - a tab that shows content= of the given URL through HTML iframe element.<br> <br> We could also create new "tab types", e.g. form-based tab that shows key/va= lue pairs (IMHO this could be quite useful for custom sub tabs).</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> Let me know what you think!<br> <br> Cheers,<br> Vojtech</span></p> </div> </div> <p class=3D"MsoNormal"><span style=3D"color:black"> </span></p> </div> </div>
</div><br></div></body></html> ------=_Part_11959772_1958615526.1351100063621--

--_000_D290AD8432118048947689BA3AE8A9B3EA0AD1SACEXCMBX04PRDhqn_ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGkgVm9qdGVjaCwNCg0KVGhhbmtzISBUaGF0IHdvcmtzIGZvciB1cy4gT25lIGxhc3QgcXVlc3Rp b24uIEFueSBpZGVhIG9uIHdoZW4gcmV2IDcgd2lsbCBiZSBhdmFpbGFibGU/IOKYug0KDQotQ2hy aXMNCg0KRnJvbTogVm9qdGVjaCBTem9jcyBbbWFpbHRvOnZzem9jc0ByZWRoYXQuY29tXQ0KU2Vu dDogV2VkbmVzZGF5LCBPY3RvYmVyIDI0LCAyMDEyIDE6MzQgUE0NClRvOiBNb3JyaXNzZXksIENo cmlzdG9waGVyDQpDYzogZW5naW5lLWRldmVsDQpTdWJqZWN0OiBSZTogW0VuZ2luZS1kZXZlbF0g VUkgUGx1Z2luczogUG9DIHBhdGNoIHJldmlzaW9uIDYgbm93IGF2YWlsYWJsZQ0KDQpIaSBDaHJp cywNCg0Kbm8gcHJvYmxlbSwgSSdsbCB0YWtlIGNhcmUgb2YgaW1wbGVtZW50aW5nIHRoZSBkaWFs b2ctcmVsYXRlZCBBUEkgZnVuY3Rpb24sIHdpdGggaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiB1c2lu ZyBhIG5hdGl2ZSBicm93c2VyIHBvcC11cCB3aW5kb3cgKHdlIGNhbiBpbXByb3ZlIGl0IGxhdGVy IG9uLCB1c2luZyBXZWJBZG1pbiBkaWFsb2cgVUkgaW5mcmFzdHJ1Y3R1cmUpLg0KDQpTaW5jZSBJ J20gY3VycmVudGx5IHByZXBhcmluZyBmb3IgbXkgdGFsayBhdCBvVmlydCBXb3Jrc2hvcCAoQmFy Y2Vsb25hKSwgSSdsbCBoYXZlIG1vcmUgdGltZSB0byB3b3JrIG9uIFVJIHBsdWdpbnMgd2hlbiBJ IHJldHVybiBiYWNrLiBJbiBvcmRlciB0byBoYXZlIHJldmlzaW9uIDcgYXMgc29vbiBhcyBwb3Nz aWJsZSwgSSBzdWdnZXN0IHRvIGltcGxlbWVudCBhbGwgcGxhbm5lZCBpdGVtcywgZXhjZXB0IGZv ciAiYWRkIGN1c3RvbSBzdWIgdGFiIiwgYXMgcGFydCBvZiByZXZpc2lvbiA3LiBXaGF0IGRvIHlv dSB0aGluaz8NCg0KUmVnYXJkcywNCg0KVm9qdGVjaA0KDQpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXw0KRnJvbTogIkNocmlzdG9waGVyIE1vcnJpc3NleSIgPENocmlzdG9waGVyLk1v cnJpc3NleUBuZXRhcHAuY29tPg0KVG86ICJWb2p0ZWNoIFN6b2NzIiA8dnN6b2NzQHJlZGhhdC5j b20+DQpDYzogImVuZ2luZS1kZXZlbCIgPGVuZ2luZS1kZXZlbEBvdmlydC5vcmc+DQpTZW50OiBU dWVzZGF5LCBPY3RvYmVyIDIzLCAyMDEyIDk6MzY6MjcgUE0NClN1YmplY3Q6IFJFOiBbRW5naW5l LWRldmVsXSBVSSBQbHVnaW5zOiBQb0MgcGF0Y2ggcmV2aXNpb24gNiBub3cgYXZhaWxhYmxlDQpI aSBWb2p0ZWNoLA0KDQpJdCBsb29rcyBsaWtlIEnigJltIGdvaW5nIHRvIGJlIGluIHRyYWluaW5n IGFsbCBuZXh0IHdlZWsgYW5kIHdpbGwgdW5mb3J0dW5hdGVseSBOT1QgYmUgYWJsZSB0byB0YWtl IG9uIHRoZSB3b3JrIHRvIGltcGxlbWVudCB0aGUg4oCcc2hvdyBkaWFsb2cgd2l0aCBjb250ZW50 IGxvYWRlZCBmcm9tIGdpdmVuIFVSTOKAnSBwbHVnaW4gQVBJIGZ1bmN0aW9uIGFzIEkgaGFkIGhv cGVkLiBUaGlzIGlzIHNvbWV0aGluZyB3ZSByZWFsbHkgbmVlZCBmb3IgcmV2aXNpb24gNy4gT2Yg dGhlIGl0ZW1zIGluIHlvdXIgbGlzdCBmb3IgaW5jbHVzaW9uLCB0aGUgc3ViLXRhYiBmcmFtZSBw bHVnaW4gaXMgdGhlIGxlYXN0IG5lY2Vzc2FyeSBmb3IgdXMuIFRoZSByZXN0IG9mIHRoZSBpdGVt cyBhcmUgYWxsIHByZXR0eSBpbXBvcnRhbnQuDQoNCkxldCBtZSBrbm93IGlmIGFueSBvZiB0aGlz IGlzIGEgcHJvYmxlbSBvciBpZiB3ZSBjYW4gc2hpZnQgdGhpbmdzIGFyb3VuZCB0byBnZXQgdGhl bSBpbiB0aGUgcmlnaHQgb3JkZXIuDQoNCi1DaHJpcw0KDQpGcm9tOiBWb2p0ZWNoIFN6b2NzIFtt YWlsdG86dnN6b2NzQHJlZGhhdC5jb21dDQpTZW50OiBUdWVzZGF5LCBPY3RvYmVyIDIzLCAyMDEy IDE6MzUgUE0NClRvOiBNb3JyaXNzZXksIENocmlzdG9waGVyDQpDYzogZW5naW5lLWRldmVsDQpT dWJqZWN0OiBSZTogW0VuZ2luZS1kZXZlbF0gVUkgUGx1Z2luczogUG9DIHBhdGNoIHJldmlzaW9u IDYgbm93IGF2YWlsYWJsZQ0KDQpIaSBDaHJpcywNCg0Kd2VsbCwgSSBwbGFubmVkIHRvIGltcGxl bWVudCBzaW1wbGUgInNob3cgZGlhbG9nIHdpdGggY29udGVudCBsb2FkZWQgZnJvbSBnaXZlbiBV UkwiIHBsdWdpbiBBUEkgZnVuY3Rpb24gc29tZSB0aW1lIGFnbywgYnV0IHRoZW4gSSB0aG91Z2h0 IHlvdSBtaWdodCBiZSBleHBlcmltZW50aW5nIHdpdGggaXQgYWxyZWFkeSA6KSBwbGVhc2UgZmVl bCBmcmVlIHRvIHdvcmsgb24gdGhhdCwgd2UgY2FuIGluY2x1ZGUgaXQgaW50byBQb0MgcmV2aXNp b24gNy4NCg0KUmVnYXJkaW5nIHBsYW5uZWQgaXRlbXMgZm9yIHJldmlzaW9uIDcsIGhlcmUncyBt eSBjdXJyZW50IGxpc3QgKGZlZWwgZnJlZSB0byBhZGQvbW9kaWZ5IHRoaW5ncyBoZXJlIGlmIG5l Y2Vzc2FyeSk6DQoNCiAgKiAgICJhZGQgY3VzdG9tIHN1YiB0YWIiIHBsdWdpbiBBUEkgZnVuY3Rp b24sIHdpdGggaW5pdGlhbCBzdWIgdGFiIGltcGxlbWVudGF0aW9uIHNob3dpbmcgY29udGVudCBv ZiB0aGUgZ2l2ZW4gVVJMICh3ZSBjYW4gYWRkIG1vcmUgdGFiIHR5cGVzIGxhdGVyIG9uLCBlLmcu IGZvcm0tYmFzZWQgb3IgdGFibGUtYmFzZWQgdGFiKQ0KICAqICAgImFkZCBjdXN0b20gdGFzayB0 byB0YXNrIHBhbmUiIHBsdWdpbiBBUEkgZnVuY3Rpb24sIHJlcXVpcmVzIHNvbWUgVWlDb21tb24g aW50ZWdyYXRpb24gY29kaW5nIChJIHdpbGwgaGFuZGxlIHRoaXMpDQogICogICAic2hvdyBkaWFs b2cgd2l0aCBjb250ZW50IGxvYWRlZCBmcm9tIGdpdmVuIFVSTCIgcGx1Z2luIEFQSSBmdW5jdGlv biwgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBzaW1wbHkgb3BlbiBuZXcgYnJvd3NlciBw b3B1cCB3aW5kb3cgdXNpbmcgd2luZG93Lm9wZW4gKGJ1dCBhbnkgb3RoZXIgYXBwcm9hY2ggaXMg ZmluZSBhcyB3ZWxsKQ0KICAqICAgaW50ZWdyYXRpb24gd2l0aCBSRVNUIEFQSSwgZS5nLiAib2J0 YWluIFJFU1QgQVBJIGF1dGhlbnRpY2F0aW9uIHRva2VuIiBwbHVnaW4gQVBJIGZ1bmN0aW9uLCBt YXliZSBhbHNvIHNvbWUgQVBJIGZvciBwZXJmb3JtaW5nIGFjdHVhbCBIVFRQIFJFU1QgY2FsbHM/ DQoNCg0KDQpBcyBmb3IgdGhlIEVuZ2luZSBSRVNUIEFQSSBhdXRoZW50aWNhdGlvbiB0b2tlbiwg bmVlZCB0byBsZWFybiBtb3JlIGFib3V0IGl0LCBhcyBXZWJBZG1pbiBHVUkgY3VycmVudGx5IHVz ZXMgR1dUIFJQQyBpbnN0ZWFkIG9mIFJFU1QgQVBJIHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIHRo ZSBiYWNrZW5kLg0KDQoNCg0KWW91IGFsc28gbWVudGlvbmVkIHRoYXQgIndlIGNhbiBtYWtlIGNh bGxzIGZyb20gb3VyIHNlcnZlciBpbnRvIHRoZSBSRVNUIEFQSSIgLSBJIGFzc3VtZSB0aGlzIHdp bGwgYmUgdXNlZCB0b2dldGhlciB3aXRoICJjdXN0b20gY29udGVudCBmb3IgdGFiL2RpYWxvZyIg cGx1Z2luIEFQSSBmdW5jdGlvbmFsaXR5PyAoT3RoZXJ3aXNlIEknZCBzYXkgdGhlIFVJIFBsdWdp biBpdHNlbGYgY291bGQgbWFrZSBSRVNUIEFQSSBjYWxscyBvbiBpdHMgb3duLi4pDQoNCg0KDQpS ZWdhcmRzLA0KDQpWb2p0ZWNoDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpG cm9tOiAiQ2hyaXN0b3BoZXIgTW9ycmlzc2V5IiA8Q2hyaXN0b3BoZXIuTW9ycmlzc2V5QG5ldGFw cC5jb20+DQpUbzogIlZvanRlY2ggU3pvY3MiIDx2c3pvY3NAcmVkaGF0LmNvbT4sICJlbmdpbmUt ZGV2ZWwiIDxlbmdpbmUtZGV2ZWxAb3ZpcnQub3JnPg0KU2VudDogTW9uZGF5LCBPY3RvYmVyIDIy LCAyMDEyIDU6MjU6NTMgUE0NClN1YmplY3Q6IFJFOiBbRW5naW5lLWRldmVsXSBVSSBQbHVnaW5z OiBQb0MgcGF0Y2ggcmV2aXNpb24gNiBub3cgYXZhaWxhYmxlDQpIaSBWb2p0ZWNoLA0KDQpUaGFu a3MgYWdhaW4gZm9yIHRoZSBkZWxpdmVyeSBvZiB0aGUgcGF0Y2guIEZvciByZXZpc2lvbiA3LCBk byB5b3UgaGF2ZSBhIGxpc3Qgb2YgY29udGVudD8gSSBoYWQgcHJldmlvdXNseSBpbmRpY2F0ZWQg SSBjb3VsZCB3b3JrIG9uIGFkZGluZyB0aGUgcGx1Z2luIEFQSSB0byBsYXVuY2ggYSBkaWFsb2cs IGJ1dCBoYWRu4oCZdCBiZWVuIGFibGUgdG8gZ2V0IHN0YXJ0ZWQgb24gaXQgdW50aWwgbm93LiBJ IHdhbnRlZCB0byBzZWUgaWYgeW91IGJ5IGNoYW5jZSB3ZXJlIGFscmVhZHkgd29ya2luZyBvbiBp dCBvciBpZiB5b3Ugd2VyZSBwbGFubmluZyB0byBkZWxpdmVyIHRoYXQgeW91cnNlbGYgaW4gdGhl IG5leHQgcmV2aXNpb24/DQoNCkEgY291cGxlIG9mIG90aGVyIGl0ZW1zIHdlIGFyZSBsb29raW5n IGZvciBhcmUgdGhlIGFiaWxpdHkgdG8gYWRkIHRhc2tzIGZvciBleGVjdXRpb24gYW5kIGdldCBh Y2Nlc3MgdG8gdGhlIHNlc3Npb24gSUQgb3Igc29tZSBraW5kIG9mIGF1dGhlbnRpY2F0aW9uIHRv a2VuIHNvIHRoYXQgd2UgY2FuIG1ha2UgY2FsbHMgZnJvbSBvdXIgc2VydmVyIGludG8gdGhlIFJF U1QgQVBJLiBJ4oCZbSBub3QgdmVyeSBmYW1pbGlhciB5ZXQgd2l0aCB0aGUgUkVTVCBBUEkgc28g SeKAmW0gbm90IHN1cmUgd2hhdCBhdXRoZW50aWNhdGlvbiBtZXRob2RzIGFyZSBhdmFpbGFibGUg YW5kIHdoaWNoIHdvdWxkIGJlIGJlc3QuDQoNCi1DaHJpcw0KDQpGcm9tOiBlbmdpbmUtZGV2ZWwt Ym91bmNlc0BvdmlydC5vcmcgW21haWx0bzplbmdpbmUtZGV2ZWwtYm91bmNlc0BvdmlydC5vcmdd IE9uIEJlaGFsZiBPZiBWb2p0ZWNoIFN6b2NzDQpTZW50OiBUaHVyc2RheSwgT2N0b2JlciAxOCwg MjAxMiAxMDo0OSBBTQ0KVG86IGVuZ2luZS1kZXZlbA0KU3ViamVjdDogW0VuZ2luZS1kZXZlbF0g VUkgUGx1Z2luczogUG9DIHBhdGNoIHJldmlzaW9uIDYgbm93IGF2YWlsYWJsZQ0KDQpIaSBndXlz LA0KDQp0aGUgbGF0ZXN0IHJldmlzaW9uIG9mIFVJIFBsdWdpbnMgcHJvb2Ytb2YtY29uY2VwdCBw YXRjaCBpcyBub3cgYXZhaWxhYmxlIGZvciB5b3UgdG8gZXhwZXJpbWVudCB3aXRoLiBZb3UgY2Fu IGRvd25sb2FkIHRoZSBwYXRjaCBmcm9tIG9WaXJ0IEdlcnJpdCBhdCBodHRwOi8vZ2Vycml0Lm92 aXJ0Lm9yZy8jL2MvODEyMC8yIChwYXRjaCBzZXQgMikuDQoNClBsZWFzZSByZWFkIG9uIHRvIGxl YXJuIHdoYXQncyBuZXcgaW4gdGhpcyByZXZpc2lvbi4gSWYgeW91IGhhdmUgYW55IGNvbW1lbnRz LCBxdWVzdGlvbnMgb3IgaWRlYXMsIHBsZWFzZSBsZXQgbWUga25vdyENCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fDQoNCjAuIFVJIHBsdWdpbiBwYXRoIGluZm9ybWF0aW9uIHJlc29s dmVkIHVzaW5nIGxvY2FsIEVuZ2luZSBjb25maWd1cmF0aW9uDQoNClNlcnZlci1zaWRlIFVJIHBs dWdpbiBpbmZyYXN0cnVjdHVyZSBub3cgdXNlcyBsb2NhbCAobWFjaGluZS1zcGVjaWZpYykgRW5n aW5lIGNvbmZpZ3VyYXRpb24gaW5zdGVhZCBvZiBnbG9iYWwgKHZkY19vcHRpb25zIGRhdGFiYXNl IHRhYmxlKSBFbmdpbmUgY29uZmlndXJhdGlvbjoNCg0KICAqICAgUHJldmlvdXNseSwgcGF0aCBp bmZvcm1hdGlvbiB3YXMgcmVzb2x2ZWQgdGhyb3VnaCBvcmcub3ZpcnQuZW5naW5lLmNvcmUuY29t bW9uLmNvbmZpZy5Db25maWcgY2xhc3MgLSBFbmdpbmUgY29uZmlndXJhdGlvbiB2YWx1ZXMgd2Vy ZSByZXRyaWV2ZWQgZnJvbSB2ZGNfb3B0aW9ucyBkYXRhYmFzZSB0YWJsZS4NCiAgKiAgIEN1cnJl bnRseSwgcGF0aCBpbmZvcm1hdGlvbiBpcyByZXNvbHZlZCB0aHJvdWdoIG9yZy5vdmlydC5lbmdp bmUuY29yZS51dGlscy5Mb2NhbENvbmZpZyBjbGFzcyAtIEVuZ2luZSBjb25maWd1cmF0aW9uIHZh bHVlcyBhcmUgcmV0cmlldmVkIGZyb20gbG9jYWwgZmlsZSBzeXN0ZW0uDQpJbiBjYXNlIHlvdSdy ZSBub3Qgd29ya2luZyB3aXRoIG9WaXJ0IEVuZ2luZSB0aHJvdWdoIFJQTSBwYWNrYWdlIHN5c3Rl bSwgZS5nLiB5b3UgaGF2ZSBhIGxvY2FsIGRldmVsb3BtZW50IGVudmlyb25tZW50IHNldCB1cCBh bmQgeW91IGJ1aWxkIGFuZCBkZXBsb3kgb1ZpcnQgRW5naW5lIHRocm91Z2ggTWF2ZW4sIHBsZWFz ZSBmb2xsb3cgdGhlc2Ugc3RlcHM6DQoNCmEuIENvcHkgZGVmYXVsdCBFbmdpbmUgY29uZmlndXJh dGlvbiBpbnRvIC91c3Ivc2hhcmUvb3ZpcnQtZW5naW5lL2NvbmYNCiMgbWtkaXIgLXAgL3Vzci9z aGFyZS9vdmlydC1lbmdpbmUvY29uZg0KIyBjcCA8T1ZJUlRfSE9NRT4vYmFja2VuZC9tYW5hZ2Vy L2NvbmYvZW5naW5lLmNvbmYuZGVmYXVsdHMgL3Vzci9zaGFyZS9vdmlydC1lbmdpbmUvY29uZi9l bmdpbmUuY29uZi5kZWZhdWx0cw0KDQpiLiBJZiBuZWNlc3NhcnksIGNvcHkgVUkgcGx1Z2luIGRh dGEgZmlsZXMgZnJvbSAvdXNyL3NoYXJlL2VuZ2luZS91aS1wbHVnaW5zIHRvIC91c3Ivc2hhcmUv b3ZpcnQtZW5naW5lL3VpLXBsdWdpbnMNCg0KYy4gSWYgbmVjZXNzYXJ5LCBjb3B5IFVJIHBsdWdp biBjb25maWcgZmlsZXMgZnJvbSAvZXRjL2VuZ2luZS91aS1wbHVnaW5zIHRvIC9ldGMvb3ZpcnQt ZW5naW5lL3VpLXBsdWdpbnMNCg0KZCwgSW4gY2FzZSB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUg ZGVmYXVsdCBFbmdpbmUgY29uZmlndXJhdGlvbiwgcHV0IHlvdXIgY3VzdG9tIHByb3BlcnR5IGZp bGUgaW50byAvZXRjL3N5c2NvbmZpZy9vdmlydC1lbmdpbmUNCg0KVGhlIHJlYXNvbiBiZWhpbmQg dGhpcyBjaGFuZ2UgaXMgdGhhdCBwYXRoIGluZm9ybWF0aW9uIGZvciBVSSBwbHVnaW4gZGF0YSBh bmQgY29uZmlndXJhdGlvbiBpcyB0eXBpY2FsbHkgbWFjaGluZS1zcGVjaWZpYywgYW5kIHNob3Vs ZCBiZSBjdXN0b21pemFibGUgcGVyIG1hY2hpbmUgdGhyb3VnaCBFbmdpbmUgbG9jYWwgY29uZmln dXJhdGlvbi4NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCjEuIE5ldyBwbHVn aW4gQVBJIGZ1bmN0aW9uOiBhZGRNYWluVGFiQWN0aW9uQnV0dG9uDQoNClRoZSAiYWRkTWFpblRh YkFjdGlvbkJ1dHRvbiIgQVBJIGFkZHMgY3VzdG9tIGNvbnRleHQtc2Vuc2l0aXZlIGJ1dHRvbiB0 byB0aGUgZ2l2ZW4gbWFpbiB0YWIncyBkYXRhIGdyaWQsIGFsb25nIHdpdGggY29ycmVzcG9uZGlu ZyBkYXRhIGdyaWQgY29udGV4dCBtZW51IGl0ZW0uDQoNCmFkZE1haW5UYWJBY3Rpb25CdXR0b24o ZW50aXR5VHlwZU5hbWUsIGxhYmVsLCBhY3Rpb25CdXR0b25JbnRlcmZhY2UpDQoNCmVudGl0eVR5 cGVOYW1lIGluZGljYXRlcyB3aGljaCBtYWluIHRhYidzIGRhdGEgZ3JpZCB0aGUgYnV0dG9uIHNo b3VsZCBiZSBhZGRlZCB0bywgYWNjb3JkaW5nIHRvIHRoZSBlbnRpdHkgdHlwZSBhc3NvY2lhdGVk IHdpdGggdGhlIG1haW4gdGFiLiBlbnRpdHlUeXBlTmFtZSB2YWx1ZXMgYXJlIHN0cmluZ3MgcmVm bGVjdGluZyBvcmcub3ZpcnQuZW5naW5lLnVpLndlYmFkbWluLnBsdWdpbi5lbnRpdHlFbnRpdHlU eXBlIGVudW0gbWVtYmVycy4gRm9sbG93aW5nIGVudGl0eVR5cGVOYW1lIHZhbHVlcyBhcmUgY3Vy cmVudGx5IHN1cHBvcnRlZCAodmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZSk6ICJEYXRhQ2VudGVy IiwgIkNsdXN0ZXIiLCAiSG9zdCIsICJTdG9yYWdlIiwgIkRpc2siLCAiVmlydHVhbE1hY2hpbmUi LCAiVGVtcGxhdGUiLg0KDQpOb3RlOiAiUG9vbCIgdmFsdWUgaXMgY3VycmVudGx5IG5vdCBzdXBw b3J0ZWQsIGJlY2F1c2Ugb2Ygb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5idXNpbmVzc2Vu dGl0aWVzLnZtX3Bvb2xzIGVudGl0eSBub3QgaW1wbGVtZW50aW5nIHRoZSBCdXNpbmVzc0VudGl0 eSBpbnRlcmZhY2UsIG5vdCBzdXJlIHdoeSB0aG91Z2guIE1heWJlIHdlIHNob3VsZCBzd2l0Y2gg ZnJvbSBCdXNpbmVzc0VudGl0eSB0byBJVmRjUXVlcnlhYmxlIGludGVyZmFjZSBhbmQgYWx3YXlz IGNhc3QgZ2V0UXVlcnlhYmxlSWQgbWV0aG9kIHJlc3VsdCB2YWx1ZSB0byBHdWlkPw0KDQpsYWJl bCBpcyB0aGUgdGl0bGUgZGlzcGxheWVkIG9uIHRoZSBidXR0b24uDQoNCmFjdGlvbkJ1dHRvbklu dGVyZmFjZSByZXByZXNlbnRzIGFuIG9iamVjdCB0aGF0ICJpbXBsZW1lbnRzIHRoZSBidXR0b24g aW50ZXJmYWNlIiBieSBkZWNsYXJpbmcgaXRzIGZ1bmN0aW9uczogb25DbGljaywgaXNFbmFibGVk LCBpc0FjY2Vzc2libGUuIEFsbCBmdW5jdGlvbnMgb2YgYWN0aW9uQnV0dG9uSW50ZXJmYWNlIHJl Y2VpdmUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0ocykgYXMgZnVuY3Rpb24gYXJndW1lbnRzLg0K DQpMZXQncyB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgdGhlIGNvbmNlcHQgYmVoaW5kIGFjdGlvbkJ1 dHRvbkludGVyZmFjZS4gSW4gdHJhZGl0aW9uYWwgY2xhc3MtYmFzZWQgb2JqZWN0LW9yaWVudGVk IGxhbmd1YWdlcywgc3VjaCBhcyBKYXZhLCBpbnRlcmZhY2UgaXMgYW4gYWJzdHJhY3QgdHlwZSB0 aGF0IGNvbnRhaW5zIG1ldGhvZCBkZWNsYXJhdGlvbnMgd2l0aG91dCBhbiBpbXBsZW1lbnRhdGlv bi4gQSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGdpdmVuIGludGVyZmFjZSBtdXN0IGltcGxl bWVudCBhbGwgbWV0aG9kcyBkZWNsYXJlZCBieSB0aGF0IGludGVyZmFjZSAodW5sZXNzIGl0J3Mg YW4gYWJzdHJhY3QgY2xhc3MsIGJ1dCB0aGlzIGlzbid0IHJlbGV2YW50IGluIG91ciBjYXNlKS4N Cg0KSW4gY29udHJhc3Qgd2l0aCB0cmFkaXRpb25hbCBjbGFzcy1iYXNlZCBvYmplY3Qtb3JpZW50 ZWQgbGFuZ3VhZ2VzLCBKYXZhU2NyaXB0IHN1cHBvcnRzIE9PUCB0aHJvdWdoIHByb3RvdHlwZS1i YXNlZCBwcm9ncmFtbWluZyBtb2RlbCAoaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4t VVMvZG9jcy9KYXZhU2NyaXB0L0ludHJvZHVjdGlvbl90b19PYmplY3QtT3JpZW50ZWRfSmF2YVNj cmlwdCkuIEF0IHRoZSBzYW1lIHRpbWUsIEphdmFTY3JpcHQgbGFuZ3VhZ2UgaXMgZHluYW1pY2Fs bHktdHlwZWQgYW5kIHRoZXJlZm9yZSBkb2Vzbid0IHN1cHBvcnQgdHJhZGl0aW9uYWwgY29uY2Vw dCBvZiBpbnRlcmZhY2UgaW4gT09QLCBpdCB1c2VzICJkdWNrIHR5cGluZyIgdGVjaG5pcXVlIGlu c3RlYWQgKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRHVja190eXBpbmcpLg0KDQpUaGUg c2ltcGxlc3Qgd2F5IHRvIHByb3ZpZGUgYW4gb2JqZWN0IHRoYXQgImltcGxlbWVudHMgdGhlIGdp dmVuIGludGVyZmFjZSIgaW4gSmF2YVNjcmlwdCBpcyB0byB1c2UgImR1Y2sgdHlwaW5nIiB0ZWNo bmlxdWU6IHByb3ZpZGluZyBhbiBvYmplY3QgdGhhdCBjb250YWlucyB3ZWxsLWtub3duIGZ1bmN0 aW9ucy4gSW4gVUkgcGx1Z2luIGluZnJhc3RydWN0dXJlLCBJIGNhbGwgdGhpcyBjb25jZXB0ICJp bnRlcmZhY2Ugb2JqZWN0IiwgcmVwcmVzZW50ZWQgYnkgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJh ZG1pbi5wbHVnaW4uanNuaS5Kc0ludGVyZmFjZU9iamVjdCBjbGFzcy4gVW5saWtlIHRoZSB0cmFk aXRpb25hbCBjb25jZXB0IG9mIGludGVyZmFjZSBhYnN0cmFjdCB0eXBlIGluIG9iamVjdC1vcmll bnRlZCBsYW5ndWFnZXMsIGFuICJpbnRlcmZhY2Ugb2JqZWN0IiBkb2VzIG5vdCBuZWNlc3Nhcmls eSBoYXZlIHRvIGRlY2xhcmUgYWxsIGZ1bmN0aW9ucyBvZiB0aGUgZ2l2ZW4gaW50ZXJmYWNlIGlu IG9yZGVyIHRvICJpbXBsZW1lbnQiIHN1Y2ggaW50ZXJmYWNlLiBJbiBmYWN0LCBhbiBlbXB0eSBv YmplY3QgY2FuIGJlIHVzZWQgYXMgYSB2YWxpZCAiaW50ZXJmYWNlIG9iamVjdCIuIE1pc3Npbmcg ZnVuY3Rpb25zIHdpbGwgYmUgc2ltcGx5IHRyZWF0ZWQgYXMgZW1wdHkgKG5vLW9wKSBmdW5jdGlv bnMuIEZ1cnRoZXJtb3JlLCBhbiAiaW50ZXJmYWNlIG9iamVjdCIgY2FuICJpbXBsZW1lbnQiIG11 bHRpcGxlIGludGVyZmFjZXMgYnkgZGVjbGFyaW5nIGZ1bmN0aW9ucyBvZiB0aG9zZSBpbnRlcmZh Y2VzIChpbnRlcmZhY2UgY29tcG9zaXRpb24pLg0KDQpHZXR0aW5nIGJhY2sgdG8gImFkZE1haW5U YWJBY3Rpb25CdXR0b24iIEFQSSwgaGVyZSdzIGEgc2FtcGxlIGNvZGUgdGhhdCBhZGRzIG5ldyBi dXR0b24gdG8gIkhvc3QiIG1haW4gdGFiIGRhdGEgZ3JpZCwgYXMgcGFydCBvZiBVaUluaXQgZXZl bnQgaGFuZGxlciBmdW5jdGlvbjoNCg0KVWlJbml0OiBmdW5jdGlvbigpIHsNCiAgICBhcGkuYWRk TWFpblRhYkFjdGlvbkJ1dHRvbignSG9zdCcsICdTaW5nbGUtSG9zdCBBY3Rpb24nLA0KDQogICAg ICAgIC8vIEFjdGlvbiBidXR0b24gaW50ZXJmYWNlIG9iamVjdA0KICAgICAgICAvLyBBbGwgZnVu Y3Rpb25zIHJlY2VpdmUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0ocykgYXMgZnVuY3Rpb24gYXJn dW1lbnRzDQogICAgICAgIHsNCg0KICAgICAgICAgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIHVzZXIg Y2xpY2tzIHRoZSBidXR0b24NCiAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKCkgew0KICAg ICAgICAgICAgICAgIC8vIENhbGxpbmcgJ2FyZ3VtZW50c1swXScgaXMgc2FmZSwgYmVjYXVzZSBv bkNsaWNrKCkgY2FuIGJlIGNhbGxlZA0KICAgICAgICAgICAgICAgIC8vIG9ubHkgd2hlbiBleGFj dGx5IG9uZSBpdGVtIGlzIGN1cnJlbnRseSBzZWxlY3RlZCBpbiB0aGUgZGF0YSBncmlkDQogICAg ICAgICAgICAgICAgd2luZG93LmFsZXJ0KCdTZWxlY3RlZCBob3N0IGVudGl0eSBJRCA9ICcgKyBh cmd1bWVudHNbMF0uZW50aXR5SWQpOw0KICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgLy8g UmV0dXJuaW5nICd0cnVlJyBtZWFucyB0aGUgYnV0dG9uIGlzIGVuYWJsZWQgKGNsaWNrYWJsZSkN CiAgICAgICAgICAgIC8vIFJldHVybmluZyAnZmFsc2UnIG1lYW5zIHRoZSBidXR0b24gaXMgZGlz YWJsZWQgKG5vbi1jbGlja2FibGUpDQogICAgICAgICAgICAvLyBEZWZhdWx0IHZhbHVlID0gJ3Ry dWUnDQogICAgICAgICAgICBpc0VuYWJsZWQ6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAg IC8vIEVuYWJsZSBidXR0b24gb25seSB3aGVuIGV4YWN0bHkgb25lIGl0ZW0gaXMgc2VsZWN0ZWQN CiAgICAgICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PSAxOw0KICAgICAgICAg ICAgfSwNCg0KICAgICAgICAgICAgLy8gUmV0dXJuaW5nICd0cnVlJyBtZWFucyB0aGUgYnV0dG9u IGlzIHZpc2libGUNCiAgICAgICAgICAgIC8vIFJldHVybmluZyAnZmFsc2UnIG1lYW5zIHRoZSBi dXR0b24gaXMgaGlkZGVuDQogICAgICAgICAgICAvLyBEZWZhdWx0IHZhbHVlID0gJ3RydWUnDQog ICAgICAgICAgICBpc0FjY2Vzc2libGU6IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIC8v IEFsd2F5cyBzaG93IHRoZSBidXR0b24gaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBncmlkDQog ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfQ0K DQogICAgKTsNCn0NCg0KQXMgbWVudGlvbmVkIGFib3ZlLCBhbGwgZnVuY3Rpb25zIG9mIGFuIGlu dGVyZmFjZSBvYmplY3QgYXJlIG9wdGlvbmFsLiBGb3IgZnVuY3Rpb25zIGV4cGVjdGluZyByZXR1 cm4gdmFsdWUsIGRlZmF1bHQgdmFsdWUgaXMgZGVmaW5lZCBieSBVSSBwbHVnaW4gaW5mcmFzdHJ1 Y3R1cmUuIEZvciBleGFtcGxlOg0KDQogICogICBvbkNsaWNrIC0gbm8gZGVmYXVsdCB2YWx1ZSAo bm8gcmV0dXJuIHZhbHVlIGV4cGVjdGVkKQ0KICAqICAgaXNFbmFibGVkIC8gaXNBY2Nlc3NpYmxl IC0gZGVmYXVsdCB2YWx1ZSAidHJ1ZSIgKGJvb2xlYW4gcmV0dXJuIHZhbHVlIGV4cGVjdGVkKQ0K DQpOb3RlOiBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUgY2hlY2tzIHRoZSBhY3R1YWwgcmV0dXJu IHZhbHVlIHR5cGUsIGFuZCB1c2VzIGRlZmF1bHQgdmFsdWUgaW4gY2FzZSB0aGUgZnVuY3Rpb24g cmV0dXJuZWQgc29tZXRoaW5nIG9mIHdyb25nICh1bmV4cGVjdGVkKSB0eXBlLg0KDQpJbiB0aGUg ZXhhbXBsZSBhYm92ZSwgImN1cnJlbnRseSBzZWxlY3RlZCBpdGVtKHMpIiBtYXBzIHRvIEpTT04t bGlrZSByZXByZXNlbnRhdGlvbnMgb2YgYnVzaW5lc3MgZW50aXRpZXMgY3VycmVudGx5IHNlbGVj dGVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgZ3JpZC4gRm9yIG5vdywgdGhlIGVudGl0eSBy ZXByZXNlbnRhdGlvbiBpcyBxdWl0ZSBzaW1wbGUgYW5kIHNhbWUgZm9yIGFsbCBlbnRpdHkgdHlw ZXM6DQoNCnsgZW50aXR5SWQ6ICJbQnVzaW5lc3NFbnRpdHlHdWlkQXNTdHJpbmddIiB9DQoNCklu IGZ1dHVyZSwgd2Ugd2lsbCBjcmVhdGUgc3BlY2lmaWMgSlNPTi1saWtlIHJlcHJlc2VudGF0aW9u cyBmb3Igc3BlY2lmaWMgYnVzaW5lc3MgZW50aXRpZXMsIGluIGNvbXBsaWFuY2Ugd2l0aCBFbmdp bmUgUkVTVCBBUEkgZW50aXR5IHN0cnVjdHVyZS4NCg0KRm9yIGEgbW9yZSBleHRlbnNpdmUgZXhh bXBsZSBvZiB1c2luZyAiYWRkTWFpblRhYkFjdGlvbkJ1dHRvbiIgQVBJLCBwbGVhc2Ugc2VlIHRo ZSBhdHRhY2hlZCAiYWRkTWFpblRhYkFjdGlvbkJ1dHRvbi5odG1sLmV4YW1wbGUiIGZpbGUuDQpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQoyLiBJbXByb3ZlZCBwbHVnaW4gQVBJ IGZ1bmN0aW9uOiBhZGRNYWluVGFiDQoNClRoZSAiYWRkTWFpblRhYiIgQVBJIHdhcyBpbXByb3Zl ZCB0byBhZGRyZXNzIGZvbGxvd2luZyBpc3N1ZXM6DQoNCiAgKiAgICJhZGRNYWluVGFiIiBjYW4g bm93IGJlIGNhbGxlZCBhdCBhbnkgbW9tZW50IGR1cmluZyBVSSBwbHVnaW4gcnVudGltZSwgZ2l2 ZW4gdGhhdCB0aGUgcGx1Z2luIGlzIGFsbG93ZWQgaW52b2tlIHBsdWdpbiBBUEkgZnVuY3Rpb25z IChwbHVnaW4gaXMgZWl0aGVyIElOSVRJQUxJWklORyBvciBJTl9VU0UpLg0KUHJldmlvdXNseSwg ImFkZE1haW5UYWIiIHdvcmtlZCByZWxpYWJseSBvbmx5IHdoZW4gY2FsbGVkIGZyb20gd2l0aGlu IFVpSW5pdCBldmVudCBoYW5kbGVyIGZ1bmN0aW9uLg0KQ3VycmVudGx5LCBpdCdzIHBvc3NpYmxl IHRvIGNhbGwgImFkZE1haW5UYWIiIGF0IGFueSBtb21lbnQsIGUuZy4gZnJvbSB3aXRoaW4gc29t ZSBvdGhlciBldmVudCBoYW5kbGVyIGZ1bmN0aW9uIChhZnRlciBVaUluaXQgaGFzIGNvbXBsZXRl ZCkuDQoNCiAgKiAgICJhZGRNYWluVGFiIiBub3cgcmV0YWlucyAiYWN0aXZlIiB0YWIgKGhpZ2hs aWdodGVkIHRhYiBHVUkpLg0KImFkZE1haW5UYWIiIHdvcmtzIGJ5IGFkZGluZyBuZXcgdGFiIGNv bXBvbmVudCAoR1dUUCBwcmVzZW50ZXIgcHJveHkpIGFuZCByZWZyZXNoaW5nIG1haW4gdGFiIHBh bmVsIEdVSSBieSByZW1vdmluZyBhbGwgcmVsYXRlZCB0YWJzIGFuZCByZS1hZGRpbmcgdGhlbSBh Z2Fpbi4NClRoaXMgbG9naWMgaXMgaGFuZGxlZCBieSBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1v bi5wcmVzZW50ZXIuRHluYW1pY1RhYkNvbnRhaW5lclByZXNlbnRlciBjbGFzcywgd2hpY2ggbWFr ZXMgc3VyZSB0aGF0ICJhY3RpdmUiIHRhYiBpcyByZXRhaW5lZCBldmVuIGFmdGVyIG1haW4gdGFi IHBhbmVsIHdhcyByZWZyZXNoZWQuDQpGdXJ0aGVybW9yZSwgY3VzdG9tIG1haW4gdGFiIGltcGxl bWVudGF0aW9uIG5vdyBkaXNwbGF5cyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gVVJMIHRocm91 Z2ggSFRNTCBpZnJhbWUgZWxlbWVudC4NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f DQoNCjMuIEltcHJvdmVkIG5hdGl2ZSBKYXZhU2NyaXB0IGZ1bmN0aW9uIGhhbmRsaW5nIChHV1Qg SlNOSSkNCg0KVGhpcyBwYXRjaCBpbnRyb2R1Y2VzIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRt aW4ucGx1Z2luLmpzbmkuSnNGdW5jdGlvbiBhbmQgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJhZG1p bi5wbHVnaW4uanNuaS5Kc0Z1bmN0aW9uUmVzdWx0SGVscGVyIGNsYXNzZXMgcHJvdmlkaW5nIEph dmEgYWJzdHJhY3Rpb24gZm9yIGludm9raW5nIG5hdGl2ZSBKYXZhU2NyaXB0IGZ1bmN0aW9ucy4g VGhlc2UgY2xhc3NlcyBmb2xsb3cgdGhlIGdlbmVyYWwgY29udHJhY3Qgb2YgImludGVyZmFjZSBv YmplY3QiIGFzIG1lbnRpb25lZCBhYm92ZS4NCg0KSnNGdW5jdGlvblJlc3VsdEhlbHBlciBpcyBw YXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIGZ1bmN0aW9ucyB3aGljaCBhcmUg ZXhwZWN0ZWQgdG8gcmV0dXJuIHZhbHVlIG9mIGEgY2VydGFpbiB0eXBlLiBUb28gYmFkIHN0YW5k YXJkIEdXVCBKU05JIGNsYXNzZXMgZG9uJ3QgcHJvdmlkZSBzdWNoIGFic3RyYWN0aW9uIGZvciB3 b3JraW5nIHdpdGggbmF0aXZlIGZ1bmN0aW9ucyBvdXQtb2YtdGhlLWJveC4uLg0KX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18NCg0KNC4gQWN0aW9uUGFuZWwgYW5kIEFjdGlvblRhYmxl IHR5cGUgaGllcmFyY2h5IHJlZmFjdG9yaW5nIChyZWxhdGVkIHRvICJhZGRNYWluVGFiQWN0aW9u QnV0dG9uIiBBUEkpDQoNClByZXZpb3VzbHksIEFic3RyYWN0QWN0aW9uUGFuZWwgYW5kIEFic3Ry YWN0QWN0aW9uVGFibGUgY2xhc3NlcyBkaWRuJ3QgaW1wbGVtZW50IGFueSByZWFzb25hYmxlIGlu dGVyZmFjZSB0aGF0IHdvdWxkIGFsbG93IG90aGVyIGNvbXBvbmVudHMgKGNsaWVudC1zaWRlIFVJ IHBsdWdpbiBpbmZyYXN0cnVjdHVyZSkgdG8gZGVwZW5kIG9uIHRoZWlyIGZ1bmN0aW9uYWxpdHkg aW4gYSBsb29zZWx5LWNvdXBsZWQgbWFubmVyLiBUaGlzIHdvdWxkIG1ha2UgY29kZSB0aGF0IGlt cGxlbWVudHMgImFkZE1haW5UYWJBY3Rpb25CdXR0b24iIEFQSSAidWdseSI6IG1haW4gdGFiIHZp ZXcgaW50ZXJmYWNlIHdvdWxkIGhhdmUgdG8gcmVmZXJlbmNlIEFic3RyYWN0QWN0aW9uVGFibGUg Y2xhc3MgZGlyZWN0bHkuIEluIE1WUCBkZXNpZ24gcGF0dGVybiwgdmlldyBpbnRlcmZhY2Ugc2hv dWxkIGF2b2lkIHJlZmVyZW5jaW5nIHNwZWNpZmljIEdXVCBXaWRnZXQgY2xhc3NlcyBkaXJlY3Rs eS4NCg0KVGhpcyBwYXRjaCBpbnRyb2R1Y2VzIG5ldyBpbnRlcmZhY2VzIGZvciBBY3Rpb25QYW5l bCBhbmQgQWN0aW9uVGFibGUgY29tcG9uZW50cyB3aGlsZSBlbGltaW5hdGluZyBjb2RlIHJlZHVu ZGFuY3kgKGR1cGxpY2F0ZSBvciB1bm5lY2Vzc2FyeSBjb2RlKS4NCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fDQoNCjUuIEFjdGlvblBhbmVsIHR5cGUgaGllcmFyY2h5IHJlZmFjdG9y aW5nIChyZWxhdGVkIHRvICJhZGRNYWluVGFiIiBBUEkpDQoNClNpbmNlIG9yZy5vdmlydC5lbmdp bmUudWkuY29tbW9uLnByZXNlbnRlci5EeW5hbWljVGFiQ29udGFpbmVyUHJlc2VudGVyIGRlZmlu ZXMgbmV3IER5bmFtaWNUYWJQYW5lbCBpbnRlcmZhY2UgdGhhdCBleHRlbmRzIHN0YW5kYXJkIEdX VFAgVGFiUGFuZWwgaW50ZXJmYWNlLCBzb21lIHJlZmFjdG9yaW5nIGhhZCB0byBiZSBkb25lIGlu IHJlbGF0ZWQgQWN0aW9uUGFuZWwgY2xhc3Nlcy4NCg0KVGhpcyBwYXRjaCBtYWtlcyBzdXJlIHRo YXQgYm90aCBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi53aWRnZXQudGFiLkFic3RyYWN0VGFi UGFuZWwgKHdpZGdldCkgYW5kIG9yZy5vdmlydC5lbmdpbmUudWkuY29tbW9uLnZpZXcuQWJzdHJh Y3RUYWJQYW5lbFZpZXcgKHZpZXcpIHN1cHBvcnQgRHluYW1pY1RhYlBhbmVsIGludGVyZmFjZS4N Cg0KTm90ZSB0aGF0IGZvciBub3csIG9ubHkgbWFpbiB0YWIgcGFuZWwgKG9yZy5vdmlydC5lbmdp bmUudWkud2ViYWRtaW4uc2VjdGlvbi5tYWluLnByZXNlbnRlci5NYWluVGFiUGFuZWxQcmVzZW50 ZXIpIHN1cHBvcnRzIGR5bmFtaWMgdGFicyB3aXRoaW4gaXRzIHZpZXcuDQpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXw0KDQpXaGVyZSBpcyBhZGRTdWJUYWIgQVBJIGZ1bmN0aW9uPw0K DQpJbXBsZW1lbnRpbmcgImFkZFN1YlRhYiIgQVBJIHJlcXVpcmVzIHNvbWUgbW9yZSBjaGFuZ2Vz LCBhbmQgSSBkaWRuJ3Qgd2FudCB0byBkZWxheSB0aGlzIFBvQyBwYXRjaCBqdXN0IGJlY2F1c2Ug b2YgaXQuLi4NCg0KSGVyZSdzIGEgc2FtcGxlIGNvZGUgdGhhdCBpbGx1c3RyYXRlcyBwcm9wb3Nl ZCAiYWRkU3ViVGFiIiBBUEkgdXNhZ2U6DQoNClVpSW5pdDogZnVuY3Rpb24oKSB7DQogICAgYXBp LmFkZFN1YlRhYignSG9zdCcsICAgICAgICAvLyBlbnRpdHlUeXBlTmFtZQ0KICAgICAgICAnQ3Vz dG9tIEhvc3QgU3ViIFRhYicsICAgLy8gbGFiZWwNCiAgICAgICAgJ2N1c3RvbS1ob3N0LXN1Yi10 YWInLCAgIC8vIGhpc3RvcnlUb2tlbg0KICAgICAgICAnaHR0cDovL3d3dy5vdmlydC5vcmcvJywg Ly8gY29udGVudFVybA0KDQogICAgICAgIC8vIFN1YiB0YWIgaW50ZXJmYWNlIG9iamVjdA0KICAg ICAgICAvLyBBbGwgZnVuY3Rpb25zIHJlY2VpdmUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0ocykN CiAgICAgICAgLy8gd2l0aGluIHRoZSBtYWluIHRhYiBkYXRhIGdyaWQgYXMgZnVuY3Rpb24gYXJn dW1lbnRzDQogICAgICAgIHsNCg0KICAgICAgICAgICAgLy8gUmV0dXJuaW5nICd0cnVlJyBtZWFu cyB0aGUgc3ViIHRhYiBpcyB2aXNpYmxlDQogICAgICAgICAgICAvLyBSZXR1cm5pbmcgJ2ZhbHNl JyBtZWFucyB0aGUgc3ViIHRhYiBpcyBoaWRkZW4NCiAgICAgICAgICAgIC8vIERlZmF1bHQgdmFs dWUgPSAndHJ1ZScNCiAgICAgICAgICAgIGlzQWNjZXNzaWJsZTogZnVuY3Rpb24oKSB7DQogICAg ICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT0gMSAmJiBhcmd1bWVudHNbMF0u ZW50aXR5SWQgPT0gJzxNeUhvc3RFbnRpdHlJZD4nOw0KICAgICAgICAgICAgfQ0KDQogICAgICAg IH0NCg0KICAgICk7DQp9DQoNCkFzIHBhcnQgb2YgImFkZFN1YlRhYiIgQVBJIGltcGxlbWVudGF0 aW9uLCBJJ2xsIHJlZmFjdG9yIGN1c3RvbSBtYWluIHRhYiBjb21wb25lbnRzLCBpbiBvcmRlciB0 byB1c2Ugb25lICJ0YWIgdHlwZSIgZm9yIGJvdGggbWFpbiBhbmQgc3ViIHRhYnMuDQoNCkN1cnJl bnRseSwgd2UgaGF2ZSBvbmUgKGFuZCBvbmx5IG9uZSkgInRhYiB0eXBlIiAtIGEgdGFiIHRoYXQg c2hvd3MgY29udGVudCBvZiB0aGUgZ2l2ZW4gVVJMIHRocm91Z2ggSFRNTCBpZnJhbWUgZWxlbWVu dC4NCg0KV2UgY291bGQgYWxzbyBjcmVhdGUgbmV3ICJ0YWIgdHlwZXMiLCBlLmcuIGZvcm0tYmFz ZWQgdGFiIHRoYXQgc2hvd3Mga2V5L3ZhbHVlIHBhaXJzIChJTUhPIHRoaXMgY291bGQgYmUgcXVp dGUgdXNlZnVsIGZvciBjdXN0b20gc3ViIHRhYnMpLg0KX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18NCg0KTGV0IG1lIGtub3cgd2hhdCB5b3UgdGhpbmshDQoNCkNoZWVycywNClZvanRl Y2gNCg0KDQo= --_000_D290AD8432118048947689BA3AE8A9B3EA0AD1SACEXCMBX04PRDhqn_ Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv VFIvUkVDLWh0bWw0MCI+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIg Y29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxtZXRhIG5hbWU9IkdlbmVyYXRv ciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTQgKGZpbHRlcmVkIG1lZGl1bSkiPg0KPCEtLVtp ZiAhbXNvXT48c3R5bGU+dlw6KiB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fQ0Kb1w6KiB7 YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fQ0Kd1w6KiB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0 I1ZNTCk7fQ0KLnNoYXBlIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9DQo8L3N0eWxlPjwh W2VuZGlmXS0tPjxzdHlsZT48IS0tDQovKiBGb250IERlZmluaXRpb25zICovDQpAZm9udC1mYWNl DQoJe2ZvbnQtZmFtaWx5OkhlbHZldGljYTsNCglwYW5vc2UtMToyIDExIDYgNCAyIDIgMiAyIDIg NDt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFtaWx5OldpbmdkaW5nczsNCglwYW5vc2UtMTo1IDAg MCAwIDAgMCAwIDAgMCAwO30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6V2luZ2RpbmdzOw0K CXBhbm9zZS0xOjUgMCAwIDAgMCAwIDAgMCAwIDA7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWls eTpDYWxpYnJpOw0KCXBhbm9zZS0xOjIgMTUgNSAyIDIgMiA0IDMgMiA0O30NCkBmb250LWZhY2UN Cgl7Zm9udC1mYW1pbHk6VGFob21hOw0KCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0O30N Ci8qIFN0eWxlIERlZmluaXRpb25zICovDQpwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYu TXNvTm9ybWFsDQoJe21hcmdpbjowaW47DQoJbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0KCWZvbnQt c2l6ZToxMi4wcHQ7DQoJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9DQph OmxpbmssIHNwYW4uTXNvSHlwZXJsaW5rDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xv cjpibHVlOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KYTp2aXNpdGVkLCBzcGFuLk1z b0h5cGVybGlua0ZvbGxvd2VkDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xvcjpwdXJw bGU7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQpwDQoJe21zby1zdHlsZS1wcmlvcml0 eTo5OTsNCgltYXJnaW46MGluOw0KCW1hcmdpbi1ib3R0b206LjAwMDFwdDsNCglmb250LXNpemU6 MTIuMHB0Ow0KCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQ0KcC5Nc29B Y2V0YXRlLCBsaS5Nc29BY2V0YXRlLCBkaXYuTXNvQWNldGF0ZQ0KCXttc28tc3R5bGUtcHJpb3Jp dHk6OTk7DQoJbXNvLXN0eWxlLWxpbms6IkJhbGxvb24gVGV4dCBDaGFyIjsNCgltYXJnaW46MGlu Ow0KCW1hcmdpbi1ib3R0b206LjAwMDFwdDsNCglmb250LXNpemU6OC4wcHQ7DQoJZm9udC1mYW1p bHk6IlRhaG9tYSIsInNhbnMtc2VyaWYiO30NCnNwYW4uQmFsbG9vblRleHRDaGFyDQoJe21zby1z dHlsZS1uYW1lOiJCYWxsb29uIFRleHQgQ2hhciI7DQoJbXNvLXN0eWxlLXByaW9yaXR5Ojk5Ow0K CW1zby1zdHlsZS1saW5rOiJCYWxsb29uIFRleHQiOw0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLCJz YW5zLXNlcmlmIjt9DQpzcGFuLkVtYWlsU3R5bGUyMA0KCXttc28tc3R5bGUtdHlwZTpwZXJzb25h bDsNCglmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOw0KCWNvbG9yOiMxRjQ5N0Q7 fQ0Kc3Bhbi5FbWFpbFN0eWxlMjENCgl7bXNvLXN0eWxlLXR5cGU6cGVyc29uYWw7DQoJZm9udC1m YW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjsNCgljb2xvcjojMUY0OTdEO30NCnNwYW4uRW1h aWxTdHlsZTI0DQoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsLXJlcGx5Ow0KCWZvbnQtZmFtaWx5 OiJDYWxpYnJpIiwic2Fucy1zZXJpZiI7DQoJY29sb3I6IzFGNDk3RDt9DQouTXNvQ2hwRGVmYXVs dA0KCXttc28tc3R5bGUtdHlwZTpleHBvcnQtb25seTsNCglmb250LXNpemU6MTAuMHB0O30NCkBw YWdlIFdvcmRTZWN0aW9uMQ0KCXtzaXplOjguNWluIDExLjBpbjsNCgltYXJnaW46MS4waW4gMS4w aW4gMS4waW4gMS4waW47fQ0KZGl2LldvcmRTZWN0aW9uMQ0KCXtwYWdlOldvcmRTZWN0aW9uMTt9 DQovKiBMaXN0IERlZmluaXRpb25zICovDQpAbGlzdCBsMA0KCXttc28tbGlzdC1pZDo0MzAyNDY5 OTc7DQoJbXNvLWxpc3QtdGVtcGxhdGUtaWRzOi0xNDAyMjg0Njc0O30NCkBsaXN0IGwwOmxldmVs MQ0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674K3 Ow0KCW1zby1sZXZlbC10YWItc3RvcDouNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246 bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsN Cglmb250LWZhbWlseTpTeW1ib2w7fQ0KQGxpc3QgbDA6bGV2ZWwyDQoJe21zby1sZXZlbC1udW1i ZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDpvOw0KCW1zby1sZXZlbC10YWItc3Rv cDoxLjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6 LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6IkNvdXJp ZXIgTmV3IjsNCgltc28tYmlkaS1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9DQpAbGlz dCBsMDpsZXZlbDMNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZl bC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6MS41aW47DQoJbXNvLWxldmVsLW51bWJl ci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNp emU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMDpsZXZlbDQNCgl7 bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCglt c28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0 Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZv bnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMDpsZXZlbDUNCgl7bXNvLWxldmVsLW51bWJl ci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0 b3A6Mi41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50 Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5Oldpbmdk aW5nczt9DQpAbGlzdCBsMDpsZXZlbDYNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0 Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6My4waW47DQoJbXNv LWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28t YW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBs MDpsZXZlbDcNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10 ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6My41aW47DQoJbXNvLWxldmVsLW51bWJlci1w b3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6 MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMDpsZXZlbDgNCgl7bXNv LWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28t bGV2ZWwtdGFiLXN0b3A6NC4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0K CXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQt ZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMDpsZXZlbDkNCgl7bXNvLWxldmVsLW51bWJlci1m b3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6 NC41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0u MjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5n czt9DQpAbGlzdCBsMQ0KCXttc28tbGlzdC1pZDo2NzUzMDI2NDY7DQoJbXNvLWxpc3QtdGVtcGxh dGUtaWRzOjE2NjI2NjcyNTY7fQ0KQGxpc3QgbDE6bGV2ZWwxDQoJe21zby1sZXZlbC1udW1iZXIt Zm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgrc7DQoJbXNvLWxldmVsLXRhYi1zdG9w Oi41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0u MjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OlN5bWJvbDt9 DQpAbGlzdCBsMTpsZXZlbDINCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1z by1sZXZlbC10ZXh0Om87DQoJbXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOw0KCW1zby1sZXZlbC1u dW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9u dC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseToiQ291cmllciBOZXciOw0KCW1zby1iaWRpLWZv bnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30NCkBsaXN0IGwxOmxldmVsMw0KCXttc28tbGV2 ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZl bC10YWItc3RvcDoxLjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4 dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1p bHk6V2luZ2RpbmdzO30NCkBsaXN0IGwxOmxldmVsNA0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1h dDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDoyLjBp bjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWlu Ow0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30N CkBsaXN0IGwxOmxldmVsNQ0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNv LWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDoyLjVpbjsNCgltc28tbGV2ZWwt bnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZv bnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwxOmxldmVs Ng0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674Kn Ow0KCW1zby1sZXZlbC10YWItc3RvcDozLjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9u OmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7 DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwxOmxldmVsNw0KCXttc28tbGV2ZWwt bnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10 YWItc3RvcDozLjVpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1p bmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6 V2luZ2RpbmdzO30NCkBsaXN0IGwxOmxldmVsOA0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpi dWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDo0LjBpbjsN Cgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0K CW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBs aXN0IGwxOmxldmVsOQ0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxl dmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDo0LjVpbjsNCgltc28tbGV2ZWwtbnVt YmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQt c2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwyDQoJe21zby1s aXN0LWlkOjEzMzA3MTk2NTg7DQoJbXNvLWxpc3QtdGVtcGxhdGUtaWRzOi0xODU4OTQ0NzA0O30N CkBsaXN0IGwyOmxldmVsMQ0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNv LWxldmVsLXRleHQ674K3Ow0KCW1zby1sZXZlbC10YWItc3RvcDouNWluOw0KCW1zby1sZXZlbC1u dW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9u dC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpTeW1ib2w7fQ0KQGxpc3QgbDI6bGV2ZWwyDQoJ e21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDpvOw0KCW1z by1sZXZlbC10YWItc3RvcDoxLjBpbjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7 DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9u dC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsNCgltc28tYmlkaS1mb250LWZhbWlseToiVGltZXMgTmV3 IFJvbWFuIjt9DQpAbGlzdCBsMjpsZXZlbDMNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVs bGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6MS41aW47DQoJ bXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCglt c28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlz dCBsMjpsZXZlbDQNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZl bC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47DQoJbXNvLWxldmVsLW51bWJl ci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNp emU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMjpsZXZlbDUNCgl7 bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCglt c28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0 Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZv bnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMjpsZXZlbDYNCgl7bXNvLWxldmVsLW51bWJl ci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0 b3A6My4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50 Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5Oldpbmdk aW5nczt9DQpAbGlzdCBsMjpsZXZlbDcNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0 Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6My41aW47DQoJbXNv LWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28t YW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBs MjpsZXZlbDgNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10 ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47DQoJbXNvLWxldmVsLW51bWJlci1w b3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6 MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMjpsZXZlbDkNCgl7bXNv LWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28t bGV2ZWwtdGFiLXN0b3A6NC41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0K CXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQt ZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMw0KCXttc28tbGlzdC1pZDoxNTUwNjA2MTQ0Ow0K CW1zby1saXN0LXRlbXBsYXRlLWlkczotMzkyMjY0OTcwO30NCkBsaXN0IGwzOmxldmVsMQ0KCXtt c28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674K3Ow0KCW1z by1sZXZlbC10YWItc3RvcDouNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsN Cgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250 LWZhbWlseTpTeW1ib2w7fQ0KQGxpc3QgbDM6bGV2ZWwyDQoJe21zby1sZXZlbC1udW1iZXItZm9y bWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDpvOw0KCW1zby1sZXZlbC10YWItc3RvcDoxLjBp bjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWlu Ow0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3 IjsNCgltc28tYmlkaS1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9DQpAbGlzdCBsMzps ZXZlbDMNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0 Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6MS41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3Np dGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAu MHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMzpsZXZlbDQNCgl7bXNvLWxl dmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2 ZWwtdGFiLXN0b3A6Mi4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRl eHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFt aWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMzpsZXZlbDUNCgl7bXNvLWxldmVsLW51bWJlci1mb3Jt YXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6Mi41 aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVp bjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9 DQpAbGlzdCBsMzpsZXZlbDYNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1z by1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6My4waW47DQoJbXNvLWxldmVs LW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1m b250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMzpsZXZl bDcNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+C pzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6My41aW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlv bjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0 Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpAbGlzdCBsMzpsZXZlbDgNCgl7bXNvLWxldmVs LW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwt dGFiLXN0b3A6NC4waW47DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQt aW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5 OldpbmdkaW5nczt9DQpAbGlzdCBsMzpsZXZlbDkNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6 YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6NC41aW47 DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsN Cgltc28tYW5zaS1mb250LXNpemU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpA bGlzdCBsNA0KCXttc28tbGlzdC1pZDoyMDA5Nzk0OTQ5Ow0KCW1zby1saXN0LXRlbXBsYXRlLWlk czotMTI3MDgzMDM3MDt9DQpAbGlzdCBsNDpsZXZlbDENCgl7bXNvLWxldmVsLW51bWJlci1mb3Jt YXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CtzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6LjVp bjsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWlu Ow0KCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6U3ltYm9sO30NCkBs aXN0IGw0OmxldmVsMg0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxl dmVsLXRleHQ6bzsNCgltc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47DQoJbXNvLWxldmVsLW51bWJl ci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCgltc28tYW5zaS1mb250LXNp emU6MTAuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7DQoJbXNvLWJpZGktZm9udC1m YW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQ0KQGxpc3QgbDQ6bGV2ZWwzDQoJe21zby1sZXZlbC1u dW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRh Yi1zdG9wOjEuNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWlu ZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpX aW5nZGluZ3M7fQ0KQGxpc3QgbDQ6bGV2ZWw0DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1 bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjIuMGluOw0K CW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJ bXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxp c3QgbDQ6bGV2ZWw1DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2 ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOw0KCW1zby1sZXZlbC1udW1i ZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1z aXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDQ6bGV2ZWw2DQoJ e21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJ bXNvLWxldmVsLXRhYi1zdG9wOjMuMGluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVm dDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglm b250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3QgbDQ6bGV2ZWw3DQoJe21zby1sZXZlbC1udW1i ZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1z dG9wOjMuNWluOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVu dDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5n ZGluZ3M7fQ0KQGxpc3QgbDQ6bGV2ZWw4DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxl dDsNCgltc28tbGV2ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOw0KCW1z by1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNv LWFuc2ktZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0KQGxpc3Qg bDQ6bGV2ZWw5DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2ZWwt dGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOjQuNWluOw0KCW1zby1sZXZlbC1udW1iZXIt cG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47DQoJbXNvLWFuc2ktZm9udC1zaXpl OjEwLjBwdDsNCglmb250LWZhbWlseTpXaW5nZGluZ3M7fQ0Kb2wNCgl7bWFyZ2luLWJvdHRvbTow aW47fQ0KdWwNCgl7bWFyZ2luLWJvdHRvbTowaW47fQ0KLS0+PC9zdHlsZT48IS0tW2lmIGd0ZSBt c28gOV0+PHhtbD4NCjxvOnNoYXBlZGVmYXVsdHMgdjpleHQ9ImVkaXQiIHNwaWRtYXg9IjEwMjYi IC8+DQo8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4NCjxvOnNoYXBl bGF5b3V0IHY6ZXh0PSJlZGl0Ij4NCjxvOmlkbWFwIHY6ZXh0PSJlZGl0IiBkYXRhPSIxIiAvPg0K PC9vOnNoYXBlbGF5b3V0PjwveG1sPjwhW2VuZGlmXS0tPg0KPC9oZWFkPg0KPGJvZHkgbGFuZz0i RU4tVVMiIGxpbms9ImJsdWUiIHZsaW5rPSJwdXJwbGUiPg0KPGRpdiBjbGFzcz0iV29yZFNlY3Rp b24xIj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0 O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztj b2xvcjojMUY0OTdEIj5IaSBWb2p0ZWNoLDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZx dW90O0NhbGlicmkmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjojMUY0OTdEIj48 bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBz dHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LCZx dW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+VGhhbmtzISBUaGF0IHdvcmtzIGZv ciB1cy4gT25lIGxhc3QgcXVlc3Rpb24uIEFueSBpZGVhIG9uIHdoZW4gcmV2IDcgd2lsbCBiZSBh dmFpbGFibGU/DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1p bHk6V2luZ2RpbmdzO2NvbG9yOiMxRjQ5N0QiPko8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6 ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlm JnF1b3Q7O2NvbG9yOiMxRjQ5N0QiPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90 O0NhbGlicmkmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjojMUY0OTdEIj48bzpw PiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90 OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2NvbG9yOiMxRjQ5N0QiPi1DaHJpczxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZv bnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5z LXNlcmlmJnF1b3Q7O2NvbG9yOiMxRjQ5N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4N CjxkaXY+DQo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNCNUM0REYg MS4wcHQ7cGFkZGluZzozLjBwdCAwaW4gMGluIDBpbiI+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseTomcXVvdDtUYWhvbWEm cXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OyI+RnJvbTo8L3NwYW4+PC9iPjxzcGFuIHN0eWxl PSJmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1RhaG9tYSZxdW90OywmcXVvdDtz YW5zLXNlcmlmJnF1b3Q7Ij4gVm9qdGVjaCBTem9jcyBbbWFpbHRvOnZzem9jc0ByZWRoYXQuY29t XQ0KPGJyPg0KPGI+U2VudDo8L2I+IFdlZG5lc2RheSwgT2N0b2JlciAyNCwgMjAxMiAxOjM0IFBN PGJyPg0KPGI+VG86PC9iPiBNb3JyaXNzZXksIENocmlzdG9waGVyPGJyPg0KPGI+Q2M6PC9iPiBl bmdpbmUtZGV2ZWw8YnI+DQo8Yj5TdWJqZWN0OjwvYj4gUmU6IFtFbmdpbmUtZGV2ZWxdIFVJIFBs dWdpbnM6IFBvQyBwYXRjaCByZXZpc2lvbiA2IG5vdyBhdmFpbGFibGU8bzpwPjwvbzpwPjwvc3Bh bj48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8 L286cD48L3A+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1ib3R0 b206MTIuMHB0Ij48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkhpIENocmlzLDxicj4NCjxicj4N Cm5vIHByb2JsZW0sIEknbGwgdGFrZSBjYXJlIG9mIGltcGxlbWVudGluZyB0aGUgZGlhbG9nLXJl bGF0ZWQgQVBJIGZ1bmN0aW9uLCB3aXRoIGluaXRpYWwgaW1wbGVtZW50YXRpb24gdXNpbmcgYSBu YXRpdmUgYnJvd3NlciBwb3AtdXAgd2luZG93ICh3ZSBjYW4gaW1wcm92ZSBpdCBsYXRlciBvbiwg dXNpbmcgV2ViQWRtaW4gZGlhbG9nIFVJIGluZnJhc3RydWN0dXJlKS48YnI+DQo8YnI+DQpTaW5j ZSBJJ20gY3VycmVudGx5IHByZXBhcmluZyBmb3IgbXkgdGFsayBhdCBvVmlydCBXb3Jrc2hvcCAo QmFyY2Vsb25hKSwgSSdsbCBoYXZlIG1vcmUgdGltZSB0byB3b3JrIG9uIFVJIHBsdWdpbnMgd2hl biBJIHJldHVybiBiYWNrLiBJbiBvcmRlciB0byBoYXZlIHJldmlzaW9uIDcgYXMgc29vbiBhcyBw b3NzaWJsZSwgSSBzdWdnZXN0IHRvIGltcGxlbWVudCBhbGwgcGxhbm5lZCBpdGVtcywgZXhjZXB0 IGZvciAmcXVvdDthZGQgY3VzdG9tIHN1YiB0YWImcXVvdDssDQogYXMgcGFydCBvZiByZXZpc2lv biA3LiBXaGF0IGRvIHlvdSB0aGluaz88bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cD48c3BhbiBz dHlsZT0iY29sb3I6YmxhY2siPlJlZ2FyZHMsPG86cD48L286cD48L3NwYW4+PC9wPg0KPHA+PHNw YW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5Wb2p0ZWNoPG86cD48L286cD48L3NwYW4+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTIuMHB0Ij48c3BhbiBzdHls ZT0iY29sb3I6YmxhY2siPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXYgY2xhc3M9 Ik1zb05vcm1hbCIgYWxpZ249ImNlbnRlciIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj48c3Bh biBzdHlsZT0iY29sb3I6YmxhY2siPg0KPGhyIHNpemU9IjIiIHdpZHRoPSIxMDAlIiBhbGlnbj0i Y2VudGVyIiBpZD0iendjaHIiPg0KPC9zcGFuPjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29O b3JtYWwiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEyLjBwdCI+PGI+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0hlbHZldGljYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2NvbG9y OmJsYWNrIj5Gcm9tOg0KPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 SGVsdmV0aWNhJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6YmxhY2siPiZxdW90 O0NocmlzdG9waGVyIE1vcnJpc3NleSZxdW90OyAmbHQ7Q2hyaXN0b3BoZXIuTW9ycmlzc2V5QG5l dGFwcC5jb20mZ3Q7PGJyPg0KPGI+VG86IDwvYj4mcXVvdDtWb2p0ZWNoIFN6b2NzJnF1b3Q7ICZs dDt2c3pvY3NAcmVkaGF0LmNvbSZndDs8YnI+DQo8Yj5DYzogPC9iPiZxdW90O2VuZ2luZS1kZXZl bCZxdW90OyAmbHQ7ZW5naW5lLWRldmVsQG92aXJ0Lm9yZyZndDs8YnI+DQo8Yj5TZW50OiA8L2I+ VHVlc2RheSwgT2N0b2JlciAyMywgMjAxMiA5OjM2OjI3IFBNPGJyPg0KPGI+U3ViamVjdDogPC9i PlJFOiBbRW5naW5lLWRldmVsXSBVSSBQbHVnaW5zOiBQb0MgcGF0Y2ggcmV2aXNpb24gNiBub3cg YXZhaWxhYmxlPG86cD48L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNw YW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90 OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2NvbG9yOiMxRjQ5N0QiPkhpIFZvanRlY2gsPC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PG86cD48L286cD48L3NwYW4+PC9wPg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6 JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2NvbG9yOiMxRjQ5N0Qi PiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxvOnA+PC9vOnA+PC9zcGFu PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0 O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztj b2xvcjojMUY0OTdEIj5JdCBsb29rcyBsaWtlIEnigJltIGdvaW5nIHRvIGJlIGluIHRyYWluaW5n IGFsbCBuZXh0IHdlZWsgYW5kIHdpbGwgdW5mb3J0dW5hdGVseSBOT1QgYmUgYWJsZSB0byB0YWtl IG9uIHRoZSB3b3JrIHRvIGltcGxlbWVudCB0aGUg4oCcc2hvdyBkaWFsb2cgd2l0aCBjb250ZW50 IGxvYWRlZA0KIGZyb20gZ2l2ZW4gVVJM4oCdIHBsdWdpbiBBUEkgZnVuY3Rpb24gYXMgSSBoYWQg aG9wZWQuIFRoaXMgaXMgc29tZXRoaW5nIHdlIHJlYWxseSBuZWVkIGZvciByZXZpc2lvbiA3LiBP ZiB0aGUgaXRlbXMgaW4geW91ciBsaXN0IGZvciBpbmNsdXNpb24sIHRoZSBzdWItdGFiIGZyYW1l IHBsdWdpbiBpcyB0aGUgbGVhc3QgbmVjZXNzYXJ5IGZvciB1cy4gVGhlIHJlc3Qgb2YgdGhlIGl0 ZW1zIGFyZSBhbGwgcHJldHR5IGltcG9ydGFudC48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJs YWNrIj48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBz dHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LCZx dW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjpibGFjayI+PG86cD48L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2Fs aWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2NvbG9yOiMxRjQ5N0QiPkxldCBtZSBr bm93IGlmIGFueSBvZiB0aGlzIGlzIGEgcHJvYmxlbSBvciBpZiB3ZSBjYW4gc2hpZnQgdGhpbmdz IGFyb3VuZCB0byBnZXQgdGhlbSBpbiB0aGUgcmlnaHQgb3JkZXIuDQo8L3NwYW4+PHNwYW4gc3R5 bGU9ImNvbG9yOmJsYWNrIj48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxp YnJpJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+Jm5ic3A7PC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PG86cD48L286cD48L3NwYW4+PC9wPg0KPGRp dj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2Zv bnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xv cjojMUY0OTdEIj4tQ2hyaXM8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48bzpwPjwv bzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxl PSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssJnF1b3Q7 c2Fucy1zZXJpZiZxdW90Oztjb2xvcjojMUY0OTdEIj4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9 ImNvbG9yOmJsYWNrIj48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2Pg0KPGRpdiBzdHlsZT0i Ym9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjQjVDNERGIDEuMHB0O3BhZGRpbmc6My4wcHQg MGluIDBpbiAwaW4iPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PGI+PHNwYW4gc3R5bGU9ImZvbnQt c2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGFob21hJnF1b3Q7LCZxdW90O3NhbnMtc2Vy aWYmcXVvdDs7Y29sb3I6YmxhY2siPkZyb206PC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1z aXplOjEwLjBwdDtmb250LWZhbWlseTomcXVvdDtUYWhvbWEmcXVvdDssJnF1b3Q7c2Fucy1zZXJp ZiZxdW90Oztjb2xvcjpibGFjayI+IFZvanRlY2ggU3pvY3MgW21haWx0bzp2c3pvY3NAcmVkaGF0 LmNvbV0NCjxicj4NCjxiPlNlbnQ6PC9iPiBUdWVzZGF5LCBPY3RvYmVyIDIzLCAyMDEyIDE6MzUg UE08YnI+DQo8Yj5Ubzo8L2I+IE1vcnJpc3NleSwgQ2hyaXN0b3BoZXI8YnI+DQo8Yj5DYzo8L2I+ IGVuZ2luZS1kZXZlbDxicj4NCjxiPlN1YmplY3Q6PC9iPiBSZTogW0VuZ2luZS1kZXZlbF0gVUkg UGx1Z2luczogUG9DIHBhdGNoIHJldmlzaW9uIDYgbm93IGF2YWlsYWJsZTwvc3Bhbj48c3BhbiBz dHlsZT0iY29sb3I6YmxhY2siPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPiZuYnNwOzxv OnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBz dHlsZT0iY29sb3I6YmxhY2siPkhpIENocmlzLDxicj4NCjxicj4NCndlbGwsIEkgcGxhbm5lZCB0 byBpbXBsZW1lbnQgc2ltcGxlICZxdW90O3Nob3cgZGlhbG9nIHdpdGggY29udGVudCBsb2FkZWQg ZnJvbSBnaXZlbiBVUkwmcXVvdDsgcGx1Z2luIEFQSSBmdW5jdGlvbiBzb21lIHRpbWUgYWdvLCBi dXQgdGhlbiBJIHRob3VnaHQgeW91IG1pZ2h0IGJlIGV4cGVyaW1lbnRpbmcgd2l0aCBpdCBhbHJl YWR5IDopIHBsZWFzZSBmZWVsIGZyZWUgdG8gd29yayBvbiB0aGF0LCB3ZSBjYW4gaW5jbHVkZSBp dCBpbnRvIFBvQyByZXZpc2lvbiA3Ljxicj4NCjxicj4NClJlZ2FyZGluZyBwbGFubmVkIGl0ZW1z IGZvciByZXZpc2lvbiA3LCBoZXJlJ3MgbXkgY3VycmVudCBsaXN0IChmZWVsIGZyZWUgdG8gYWRk L21vZGlmeSB0aGluZ3MgaGVyZSBpZiBuZWNlc3NhcnkpOjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4N Cjx1bCB0eXBlPSJkaXNjIj4NCjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6Ymxh Y2s7bXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87bXNv LWxpc3Q6bDMgbGV2ZWwxIGxmbzEiPg0KJnF1b3Q7YWRkIGN1c3RvbSBzdWIgdGFiJnF1b3Q7IHBs dWdpbiBBUEkgZnVuY3Rpb24sIHdpdGggaW5pdGlhbCBzdWIgdGFiIGltcGxlbWVudGF0aW9uIHNo b3dpbmcgY29udGVudCBvZiB0aGUgZ2l2ZW4gVVJMICh3ZSBjYW4gYWRkIG1vcmUgdGFiIHR5cGVz IGxhdGVyIG9uLCBlLmcuIGZvcm0tYmFzZWQgb3IgdGFibGUtYmFzZWQgdGFiKTxvOnA+PC9vOnA+ PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOmJsYWNrO21zby1tYXJnaW4t dG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvO21zby1saXN0OmwzIGxldmVs MSBsZm8xIj4NCiZxdW90O2FkZCBjdXN0b20gdGFzayB0byB0YXNrIHBhbmUmcXVvdDsgcGx1Z2lu IEFQSSBmdW5jdGlvbiwgcmVxdWlyZXMgc29tZSBVaUNvbW1vbiBpbnRlZ3JhdGlvbiBjb2Rpbmcg KEkgd2lsbCBoYW5kbGUgdGhpcyk8bzpwPjwvbzpwPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwi IHN0eWxlPSJjb2xvcjpibGFjazttc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJv dHRvbS1hbHQ6YXV0bzttc28tbGlzdDpsMyBsZXZlbDEgbGZvMSI+DQomcXVvdDtzaG93IGRpYWxv ZyB3aXRoIGNvbnRlbnQgbG9hZGVkIGZyb20gZ2l2ZW4gVVJMJnF1b3Q7IHBsdWdpbiBBUEkgZnVu Y3Rpb24sIGluaXRpYWwgaW1wbGVtZW50YXRpb24gY291bGQgc2ltcGx5IG9wZW4gbmV3IGJyb3dz ZXIgcG9wdXAgd2luZG93IHVzaW5nIHdpbmRvdy5vcGVuIChidXQgYW55IG90aGVyIGFwcHJvYWNo IGlzIGZpbmUgYXMgd2VsbCk8bzpwPjwvbzpwPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0 eWxlPSJjb2xvcjpibGFjazttc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRv bS1hbHQ6YXV0bzttc28tbGlzdDpsMyBsZXZlbDEgbGZvMSI+DQppbnRlZ3JhdGlvbiB3aXRoIFJF U1QgQVBJLCBlLmcuICZxdW90O29idGFpbiBSRVNUIEFQSSBhdXRoZW50aWNhdGlvbiB0b2tlbiZx dW90OyBwbHVnaW4gQVBJIGZ1bmN0aW9uLCBtYXliZSBhbHNvIHNvbWUgQVBJIGZvciBwZXJmb3Jt aW5nIGFjdHVhbCBIVFRQIFJFU1QgY2FsbHM/PG86cD48L286cD48L2xpPjwvdWw+DQo8cD48c3Bh biBzdHlsZT0iY29sb3I6YmxhY2siPiZuYnNwOzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwPjxz cGFuIHN0eWxlPSJjb2xvcjpibGFjayI+QXMgZm9yIHRoZSBFbmdpbmUgUkVTVCBBUEkgYXV0aGVu dGljYXRpb24gdG9rZW4sIG5lZWQgdG8gbGVhcm4gbW9yZSBhYm91dCBpdCwgYXMgV2ViQWRtaW4g R1VJIGN1cnJlbnRseSB1c2VzIEdXVCBSUEMgaW5zdGVhZCBvZiBSRVNUIEFQSSB3aGVuIGNvbW11 bmljYXRpbmcgd2l0aCB0aGUgYmFja2VuZC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cD48c3Bh biBzdHlsZT0iY29sb3I6YmxhY2siPiZuYnNwOzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwPjxz cGFuIHN0eWxlPSJjb2xvcjpibGFjayI+WW91IGFsc28gbWVudGlvbmVkIHRoYXQgJnF1b3Q7d2Ug Y2FuIG1ha2UgY2FsbHMgZnJvbSBvdXIgc2VydmVyIGludG8gdGhlIFJFU1QgQVBJJnF1b3Q7IC0g SSBhc3N1bWUgdGhpcyB3aWxsIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCAmcXVvdDtjdXN0b20gY29u dGVudCBmb3IgdGFiL2RpYWxvZyZxdW90OyBwbHVnaW4gQVBJIGZ1bmN0aW9uYWxpdHk/IChPdGhl cndpc2UgSSdkIHNheSB0aGUgVUkgUGx1Z2luIGl0c2VsZiBjb3VsZCBtYWtlDQogUkVTVCBBUEkg Y2FsbHMgb24gaXRzIG93bi4uKTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwPjxzcGFuIHN0eWxl PSJjb2xvcjpibGFjayI+Jm5ic3A7PG86cD48L286cD48L3NwYW4+PC9wPg0KPHA+PHNwYW4gc3R5 bGU9ImNvbG9yOmJsYWNrIj5SZWdhcmRzLDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwPjxzcGFu IHN0eWxlPSJjb2xvcjpibGFjayI+Vm9qdGVjaDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9 ImNvbG9yOmJsYWNrIj4mbmJzcDs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2IGNsYXNzPSJN c29Ob3JtYWwiIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+PHNwYW4g c3R5bGU9ImNvbG9yOmJsYWNrIj4NCjxociBzaXplPSIyIiB3aWR0aD0iMTAwJSIgYWxpZ249ImNl bnRlciI+DQo8L3NwYW4+PC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Im1hcmdpbi1ib3R0b206MTIuMHB0Ij48Yj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 SGVsdmV0aWNhJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6YmxhY2siPkZyb206 DQo8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtIZWx2ZXRpY2EmcXVv dDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjpibGFjayI+JnF1b3Q7Q2hyaXN0b3BoZXIg TW9ycmlzc2V5JnF1b3Q7ICZsdDtDaHJpc3RvcGhlci5Nb3JyaXNzZXlAbmV0YXBwLmNvbSZndDs8 YnI+DQo8Yj5UbzogPC9iPiZxdW90O1ZvanRlY2ggU3pvY3MmcXVvdDsgJmx0O3Zzem9jc0ByZWRo YXQuY29tJmd0OywgJnF1b3Q7ZW5naW5lLWRldmVsJnF1b3Q7ICZsdDtlbmdpbmUtZGV2ZWxAb3Zp cnQub3JnJmd0Ozxicj4NCjxiPlNlbnQ6IDwvYj5Nb25kYXksIE9jdG9iZXIgMjIsIDIwMTIgNToy NTo1MyBQTTxicj4NCjxiPlN1YmplY3Q6IDwvYj5SRTogW0VuZ2luZS1kZXZlbF0gVUkgUGx1Z2lu czogUG9DIHBhdGNoIHJldmlzaW9uIDYgbm93IGF2YWlsYWJsZTwvc3Bhbj48c3BhbiBzdHlsZT0i Y29sb3I6YmxhY2siPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkm cXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjojMUY0OTdEIj5IaSBWb2p0ZWNoLDwv c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFt aWx5OiZxdW90O0NhbGlicmkmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjojMUY0 OTdEIj4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48bzpwPjwvbzpwPjwv c3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEx LjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVv dDs7Y29sb3I6IzFGNDk3RCI+VGhhbmtzIGFnYWluIGZvciB0aGUgZGVsaXZlcnkgb2YgdGhlIHBh dGNoLiBGb3IgcmV2aXNpb24gNywgZG8geW91IGhhdmUgYSBsaXN0IG9mIGNvbnRlbnQ/IEkgaGFk IHByZXZpb3VzbHkgaW5kaWNhdGVkIEkgY291bGQgd29yayBvbiBhZGRpbmcgdGhlIHBsdWdpbiBB UEkNCiB0byBsYXVuY2ggYSBkaWFsb2csIGJ1dCBoYWRu4oCZdCBiZWVuIGFibGUgdG8gZ2V0IHN0 YXJ0ZWQgb24gaXQgdW50aWwgbm93LiBJIHdhbnRlZCB0byBzZWUgaWYgeW91IGJ5IGNoYW5jZSB3 ZXJlIGFscmVhZHkgd29ya2luZyBvbiBpdCBvciBpZiB5b3Ugd2VyZSBwbGFubmluZyB0byBkZWxp dmVyIHRoYXQgeW91cnNlbGYgaW4gdGhlIG5leHQgcmV2aXNpb24/PC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjpibGFjayI+PG86cD48L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJy aSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2NvbG9yOiMxRjQ5N0QiPiZuYnNwOzwvc3Bh bj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5 OiZxdW90O0NhbGlicmkmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90Oztjb2xvcjojMUY0OTdE Ij5BIGNvdXBsZSBvZiBvdGhlciBpdGVtcyB3ZSBhcmUgbG9va2luZyBmb3IgYXJlIHRoZSBhYmls aXR5IHRvIGFkZCB0YXNrcyBmb3IgZXhlY3V0aW9uIGFuZCBnZXQgYWNjZXNzIHRvIHRoZSBzZXNz aW9uIElEIG9yIHNvbWUga2luZCBvZiBhdXRoZW50aWNhdGlvbiB0b2tlbg0KIHNvIHRoYXQgd2Ug Y2FuIG1ha2UgY2FsbHMgZnJvbSBvdXIgc2VydmVyIGludG8gdGhlIFJFU1QgQVBJLiBJ4oCZbSBu b3QgdmVyeSBmYW1pbGlhciB5ZXQgd2l0aCB0aGUgUkVTVCBBUEkgc28gSeKAmW0gbm90IHN1cmUg d2hhdCBhdXRoZW50aWNhdGlvbiBtZXRob2RzIGFyZSBhdmFpbGFibGUgYW5kIHdoaWNoIHdvdWxk IGJlIGJlc3QuPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PG86cD48L286cD48L3Nw YW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4w cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7 O2NvbG9yOiMxRjQ5N0QiPiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxv OnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBz dHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LCZx dW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+LUNocmlzPC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjpibGFjayI+PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTom cXVvdDtDYWxpYnJpJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+ Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PG86cD48L286cD48L3NwYW4+ PC9wPg0KPGRpdj4NCjxkaXYgc3R5bGU9ImJvcmRlcjpub25lO2JvcmRlci10b3A6c29saWQgI0I1 QzRERiAxLjBwdDtwYWRkaW5nOjMuMHB0IDBpbiAwaW4gMGluIj4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O1Rh aG9tYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2NvbG9yOmJsYWNrIj5Gcm9tOjwvc3Bh bj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGFo b21hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Y29sb3I6YmxhY2siPiBlbmdpbmUtZGV2 ZWwtYm91bmNlc0BvdmlydC5vcmcgW21haWx0bzplbmdpbmUtZGV2ZWwtYm91bmNlc0BvdmlydC5v cmddDQo8Yj5PbiBCZWhhbGYgT2YgPC9iPlZvanRlY2ggU3pvY3M8YnI+DQo8Yj5TZW50OjwvYj4g VGh1cnNkYXksIE9jdG9iZXIgMTgsIDIwMTIgMTA6NDkgQU08YnI+DQo8Yj5Ubzo8L2I+IGVuZ2lu ZS1kZXZlbDxicj4NCjxiPlN1YmplY3Q6PC9iPiBbRW5naW5lLWRldmVsXSBVSSBQbHVnaW5zOiBQ b0MgcGF0Y2ggcmV2aXNpb24gNiBub3cgYXZhaWxhYmxlPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv cjpibGFjayI+PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+Jm5ic3A7PG86cD48L286cD48 L3NwYW4+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tYm90 dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5IaSBndXlzLDxicj4NCjxicj4N CnRoZSBsYXRlc3QgcmV2aXNpb24gb2YgVUkgUGx1Z2lucyBwcm9vZi1vZi1jb25jZXB0IHBhdGNo IGlzIG5vdyBhdmFpbGFibGUgZm9yIHlvdSB0byBleHBlcmltZW50IHdpdGguIFlvdSBjYW4gZG93 bmxvYWQgdGhlIHBhdGNoIGZyb20gb1ZpcnQgR2Vycml0IGF0DQo8YSBocmVmPSJodHRwOi8vZ2Vy cml0Lm92aXJ0Lm9yZy8jL2MvODEyMC8yIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL2dlcnJpdC5v dmlydC5vcmcvIy9jLzgxMjAvMjwvYT4gKHBhdGNoIHNldCAyKS48YnI+DQo8YnI+DQpQbGVhc2Ug cmVhZCBvbiB0byBsZWFybiB3aGF0J3MgbmV3IGluIHRoaXMgcmV2aXNpb24uIElmIHlvdSBoYXZl IGFueSBjb21tZW50cywgcXVlc3Rpb25zIG9yIGlkZWFzLCBwbGVhc2UgbGV0IG1lIGtub3chPG86 cD48L286cD48L3NwYW4+PC9wPg0KPGRpdiBjbGFzcz0iTXNvTm9ybWFsIiBhbGlnbj0iY2VudGVy IiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+DQo8 aHIgc2l6ZT0iMiIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPg0KPC9zcGFuPjwvZGl2Pg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8c3Ry b25nPjAuIFVJIHBsdWdpbiBwYXRoIGluZm9ybWF0aW9uIHJlc29sdmVkIHVzaW5nIGxvY2FsIEVu Z2luZSBjb25maWd1cmF0aW9uPC9zdHJvbmc+PGI+PGJyPg0KPC9iPjxicj4NClNlcnZlci1zaWRl IFVJIHBsdWdpbiBpbmZyYXN0cnVjdHVyZSBub3cgdXNlcyBsb2NhbCAobWFjaGluZS1zcGVjaWZp YykgRW5naW5lIGNvbmZpZ3VyYXRpb24gaW5zdGVhZCBvZiBnbG9iYWwgKDxlbT52ZGNfb3B0aW9u czwvZW0+IGRhdGFiYXNlIHRhYmxlKSBFbmdpbmUgY29uZmlndXJhdGlvbjo8bzpwPjwvbzpwPjwv c3Bhbj48L3A+DQo8dWwgdHlwZT0iZGlzYyI+DQo8bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 ImNvbG9yOmJsYWNrO21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFs dDphdXRvO21zby1saXN0Omw0IGxldmVsMSBsZm8yIj4NClByZXZpb3VzbHksIHBhdGggaW5mb3Jt YXRpb24gd2FzIHJlc29sdmVkIHRocm91Z2ggb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5j b25maWcuQ29uZmlnIGNsYXNzIC0gRW5naW5lIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHdlcmUgcmV0 cmlldmVkIGZyb20NCjxpPnZkY19vcHRpb25zPC9pPiBkYXRhYmFzZSB0YWJsZS48bzpwPjwvbzpw PjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjpibGFjazttc28tbWFyZ2lu LXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzttc28tbGlzdDpsNCBsZXZl bDEgbGZvMiI+DQpDdXJyZW50bHksIHBhdGggaW5mb3JtYXRpb24gaXMgcmVzb2x2ZWQgdGhyb3Vn aCBvcmcub3ZpcnQuZW5naW5lLmNvcmUudXRpbHMuTG9jYWxDb25maWcgY2xhc3MgLSBFbmdpbmUg Y29uZmlndXJhdGlvbiB2YWx1ZXMgYXJlIHJldHJpZXZlZCBmcm9tIGxvY2FsIGZpbGUgc3lzdGVt LjxvOnA+PC9vOnA+PC9saT48L3VsPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdp bi1ib3R0b206MTIuMHB0Ij48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkluIGNhc2UgeW91J3Jl IG5vdCB3b3JraW5nIHdpdGggb1ZpcnQgRW5naW5lIHRocm91Z2ggUlBNIHBhY2thZ2Ugc3lzdGVt LCBlLmcuIHlvdSBoYXZlIGEgbG9jYWwgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgc2V0IHVwIGFu ZCB5b3UgYnVpbGQgYW5kIGRlcGxveSBvVmlydCBFbmdpbmUgdGhyb3VnaCBNYXZlbiwgcGxlYXNl DQogZm9sbG93IHRoZXNlIHN0ZXBzOjxicj4NCjxicj4NCmEuIENvcHkgZGVmYXVsdCBFbmdpbmUg Y29uZmlndXJhdGlvbiBpbnRvIC91c3Ivc2hhcmUvPGI+b3ZpcnQtZW5naW5lPC9iPi9jb25mPG86 cD48L286cD48L3NwYW4+PC9wPg0KPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6MzAuMHB0Ij4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVy IE5ldyZxdW90Oztjb2xvcjpibGFjayI+IyBta2RpciAtcCAvdXNyL3NoYXJlL292aXJ0LWVuZ2lu ZS9jb25mPGJyPg0KIyBjcCAmbHQ7T1ZJUlRfSE9NRSZndDsvYmFja2VuZC9tYW5hZ2VyL2NvbmYv ZW5naW5lLmNvbmYuZGVmYXVsdHMgL3Vzci9zaGFyZS9vdmlydC1lbmdpbmUvY29uZi9lbmdpbmUu Y29uZi5kZWZhdWx0czwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1i b3R0b206MTIuMHB0Ij48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCmIuIElmIG5lY2Vz c2FyeSwgY29weSBVSSBwbHVnaW4gZGF0YSBmaWxlcyBmcm9tIC91c3Ivc2hhcmUvZW5naW5lL3Vp LXBsdWdpbnMgdG8gL3Vzci9zaGFyZS88Yj5vdmlydC1lbmdpbmU8L2I+L3VpLXBsdWdpbnM8YnI+ DQo8YnI+DQpjLiBJZiBuZWNlc3NhcnksIGNvcHkgVUkgcGx1Z2luIGNvbmZpZyBmaWxlcyBmcm9t IC9ldGMvZW5naW5lL3VpLXBsdWdpbnMgdG8gL2V0Yy88Yj5vdmlydC1lbmdpbmU8L2I+L3VpLXBs dWdpbnM8YnI+DQo8YnI+DQpkLCBJbiBjYXNlIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBkZWZh dWx0IEVuZ2luZSBjb25maWd1cmF0aW9uLCBwdXQgeW91ciBjdXN0b20gcHJvcGVydHkgZmlsZSBp bnRvIC9ldGMvc3lzY29uZmlnL292aXJ0LWVuZ2luZTxicj4NCjxicj4NClRoZSByZWFzb24gYmVo aW5kIHRoaXMgY2hhbmdlIGlzIHRoYXQgcGF0aCBpbmZvcm1hdGlvbiBmb3IgVUkgcGx1Z2luIGRh dGEgYW5kIGNvbmZpZ3VyYXRpb24gaXMgdHlwaWNhbGx5IG1hY2hpbmUtc3BlY2lmaWMsIGFuZCBz aG91bGQgYmUgY3VzdG9taXphYmxlIHBlciBtYWNoaW5lIHRocm91Z2ggRW5naW5lIGxvY2FsIGNv bmZpZ3VyYXRpb24uPG86cD48L286cD48L3NwYW4+PC9wPg0KPGRpdiBjbGFzcz0iTXNvTm9ybWFs IiBhbGlnbj0iY2VudGVyIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0eWxlPSJj b2xvcjpibGFjayI+DQo8aHIgc2l6ZT0iMiIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPg0K PC9zcGFuPjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJs YWNrIj48YnI+DQo8Yj4xLiBOZXcgcGx1Z2luIEFQSSBmdW5jdGlvbjogYWRkTWFpblRhYkFjdGlv bkJ1dHRvbjxicj4NCjwvYj48YnI+DQpUaGUgJnF1b3Q7YWRkTWFpblRhYkFjdGlvbkJ1dHRvbiZx dW90OyBBUEkgYWRkcyBjdXN0b20gY29udGV4dC1zZW5zaXRpdmUgYnV0dG9uIHRvIHRoZSBnaXZl biBtYWluIHRhYidzIGRhdGEgZ3JpZCwgYWxvbmcgd2l0aCBjb3JyZXNwb25kaW5nIGRhdGEgZ3Jp ZCBjb250ZXh0IG1lbnUgaXRlbS48YnI+DQo8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj5hZGRNYWluVGFiQWN0 aW9uQnV0dG9uKGVudGl0eVR5cGVOYW1lLCBsYWJlbCwgYWN0aW9uQnV0dG9uSW50ZXJmYWNlKTxi cj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxpPmVudGl0eVR5cGVO YW1lPC9pPiBpbmRpY2F0ZXMgd2hpY2ggbWFpbiB0YWIncyBkYXRhIGdyaWQgdGhlIGJ1dHRvbiBz aG91bGQgYmUgYWRkZWQgdG8sIGFjY29yZGluZyB0byB0aGUgZW50aXR5IHR5cGUgYXNzb2NpYXRl ZCB3aXRoIHRoZSBtYWluIHRhYi48aT4gZW50aXR5VHlwZU5hbWU8L2k+IHZhbHVlcyBhcmUgc3Ry aW5ncyByZWZsZWN0aW5nIG9yZy5vdmlydC5lbmdpbmUudWkud2ViYWRtaW4ucGx1Z2luLmVudGl0 eUVudGl0eVR5cGUgZW51bQ0KIG1lbWJlcnMuIEZvbGxvd2luZyA8aT5lbnRpdHlUeXBlTmFtZTwv aT4gdmFsdWVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkICh2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0 aXZlKTogJnF1b3Q7RGF0YUNlbnRlciZxdW90OywgJnF1b3Q7Q2x1c3RlciZxdW90OywgJnF1b3Q7 SG9zdCZxdW90OywgJnF1b3Q7U3RvcmFnZSZxdW90OywgJnF1b3Q7RGlzayZxdW90OywgJnF1b3Q7 VmlydHVhbE1hY2hpbmUmcXVvdDssICZxdW90O1RlbXBsYXRlJnF1b3Q7Ljxicj4NCjxicj4NCk5v dGU6ICZxdW90O1Bvb2wmcXVvdDsgdmFsdWUgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQsIGJl Y2F1c2Ugb2Ygb3JnLm92aXJ0LmVuZ2luZS5jb3JlLmNvbW1vbi5idXNpbmVzc2VudGl0aWVzLnZt X3Bvb2xzIGVudGl0eSBub3QgaW1wbGVtZW50aW5nIHRoZSBCdXNpbmVzc0VudGl0eSBpbnRlcmZh Y2UsIG5vdCBzdXJlIHdoeSB0aG91Z2guIE1heWJlIHdlIHNob3VsZCBzd2l0Y2ggZnJvbSBCdXNp bmVzc0VudGl0eSB0byBJVmRjUXVlcnlhYmxlIGludGVyZmFjZQ0KIGFuZCBhbHdheXMgY2FzdCBn ZXRRdWVyeWFibGVJZCBtZXRob2QgcmVzdWx0IHZhbHVlIHRvIEd1aWQ/PGJyPg0KPGJyPg0KPGk+ bGFiZWw8L2k+IGlzIHRoZSB0aXRsZSBkaXNwbGF5ZWQgb24gdGhlIGJ1dHRvbjxpPi48YnI+DQo8 L2k+PGJyPg0KPGk+YWN0aW9uQnV0dG9uSW50ZXJmYWNlPC9pPiByZXByZXNlbnRzIGFuIG9iamVj dCB0aGF0ICZxdW90O2ltcGxlbWVudHMgdGhlIGJ1dHRvbiBpbnRlcmZhY2UmcXVvdDsgYnkgZGVj bGFyaW5nIGl0cyBmdW5jdGlvbnM6DQo8aT5vbkNsaWNrPC9pPiwgPGk+aXNFbmFibGVkPC9pPiwg PGk+aXNBY2Nlc3NpYmxlPC9pPi4gQWxsIGZ1bmN0aW9ucyBvZiA8aT5hY3Rpb25CdXR0b25JbnRl cmZhY2U8L2k+IHJlY2VpdmUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0ocykgYXMgZnVuY3Rpb24g YXJndW1lbnRzLjxicj4NCjxicj4NCkxldCdzIHRha2UgYSBjbG9zZXIgbG9vayBhdCB0aGUgY29u Y2VwdCBiZWhpbmQgPGk+YWN0aW9uQnV0dG9uSW50ZXJmYWNlPC9pPi4gSW4gdHJhZGl0aW9uYWwg Y2xhc3MtYmFzZWQgb2JqZWN0LW9yaWVudGVkIGxhbmd1YWdlcywgc3VjaCBhcyBKYXZhLCBpbnRl cmZhY2UgaXMgYW4gYWJzdHJhY3QgdHlwZSB0aGF0IGNvbnRhaW5zIG1ldGhvZCBkZWNsYXJhdGlv bnMgd2l0aG91dCBhbiBpbXBsZW1lbnRhdGlvbi4gQSBjbGFzcyB0aGF0IGltcGxlbWVudHMNCiB0 aGUgZ2l2ZW4gaW50ZXJmYWNlIG11c3QgaW1wbGVtZW50IGFsbCBtZXRob2RzIGRlY2xhcmVkIGJ5 IHRoYXQgaW50ZXJmYWNlICh1bmxlc3MgaXQncyBhbiBhYnN0cmFjdCBjbGFzcywgYnV0IHRoaXMg aXNuJ3QgcmVsZXZhbnQgaW4gb3VyIGNhc2UpLjxicj4NCjxicj4NCkluIGNvbnRyYXN0IHdpdGgg dHJhZGl0aW9uYWwgY2xhc3MtYmFzZWQgb2JqZWN0LW9yaWVudGVkIGxhbmd1YWdlcywgSmF2YVNj cmlwdCBzdXBwb3J0cyBPT1AgdGhyb3VnaCBwcm90b3R5cGUtYmFzZWQgcHJvZ3JhbW1pbmcgbW9k ZWwgKDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2 YVNjcmlwdC9JbnRyb2R1Y3Rpb25fdG9fT2JqZWN0LU9yaWVudGVkX0phdmFTY3JpcHQiIHRhcmdl dD0iX2JsYW5rIj5odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0phdmFT Y3JpcHQvSW50cm9kdWN0aW9uX3RvX09iamVjdC1PcmllbnRlZF9KYXZhU2NyaXB0PC9hPikuDQog QXQgdGhlIHNhbWUgdGltZSwgSmF2YVNjcmlwdCBsYW5ndWFnZSBpcyBkeW5hbWljYWxseS10eXBl ZCBhbmQgdGhlcmVmb3JlIGRvZXNuJ3Qgc3VwcG9ydCB0cmFkaXRpb25hbCBjb25jZXB0IG9mIGlu dGVyZmFjZSBpbiBPT1AsIGl0IHVzZXMgJnF1b3Q7ZHVjayB0eXBpbmcmcXVvdDsgdGVjaG5pcXVl IGluc3RlYWQgKDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRHVja190eXBp bmciIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0R1Y2tfdHlw aW5nPC9hPikuPGJyPg0KPGJyPg0KVGhlIHNpbXBsZXN0IHdheSB0byBwcm92aWRlIGFuIG9iamVj dCB0aGF0ICZxdW90O2ltcGxlbWVudHMgdGhlIGdpdmVuIGludGVyZmFjZSZxdW90OyBpbiBKYXZh U2NyaXB0IGlzIHRvIHVzZSAmcXVvdDtkdWNrIHR5cGluZyZxdW90OyB0ZWNobmlxdWU6IHByb3Zp ZGluZyBhbiBvYmplY3QgdGhhdCBjb250YWlucyB3ZWxsLWtub3duIGZ1bmN0aW9ucy4gSW4gVUkg cGx1Z2luIGluZnJhc3RydWN0dXJlLCBJIGNhbGwgdGhpcyBjb25jZXB0ICZxdW90O2ludGVyZmFj ZSBvYmplY3QmcXVvdDssIHJlcHJlc2VudGVkDQogYnkgb3JnLm92aXJ0LmVuZ2luZS51aS53ZWJh ZG1pbi5wbHVnaW4uanNuaS5Kc0ludGVyZmFjZU9iamVjdCBjbGFzcy4gVW5saWtlIHRoZSB0cmFk aXRpb25hbCBjb25jZXB0IG9mIGludGVyZmFjZSBhYnN0cmFjdCB0eXBlIGluIG9iamVjdC1vcmll bnRlZCBsYW5ndWFnZXMsIGFuICZxdW90O2ludGVyZmFjZSBvYmplY3QmcXVvdDsNCjx1PmRvZXMg bm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gZGVjbGFyZSBhbGwgZnVuY3Rpb25zIG9mIHRoZSBnaXZl biBpbnRlcmZhY2U8L3U+IGluIG9yZGVyIHRvICZxdW90O2ltcGxlbWVudCZxdW90OyBzdWNoIGlu dGVyZmFjZS4gSW4gZmFjdCwgYW4gZW1wdHkgb2JqZWN0IGNhbiBiZSB1c2VkIGFzIGEgdmFsaWQg JnF1b3Q7aW50ZXJmYWNlIG9iamVjdCZxdW90Oy4gTWlzc2luZyBmdW5jdGlvbnMgd2lsbCBiZSBz aW1wbHkgdHJlYXRlZCBhcyBlbXB0eSAobm8tb3ApIGZ1bmN0aW9ucy4NCiBGdXJ0aGVybW9yZSwg YW4gJnF1b3Q7aW50ZXJmYWNlIG9iamVjdCZxdW90OyBjYW4gJnF1b3Q7aW1wbGVtZW50JnF1b3Q7 IG11bHRpcGxlIGludGVyZmFjZXMgYnkgZGVjbGFyaW5nIGZ1bmN0aW9ucyBvZiB0aG9zZSBpbnRl cmZhY2VzIChpbnRlcmZhY2UgY29tcG9zaXRpb24pLjxicj4NCjxicj4NCkdldHRpbmcgYmFjayB0 byAmcXVvdDthZGRNYWluVGFiQWN0aW9uQnV0dG9uJnF1b3Q7IEFQSSwgaGVyZSdzIGEgc2FtcGxl IGNvZGUgdGhhdCBhZGRzIG5ldyBidXR0b24gdG8gJnF1b3Q7SG9zdCZxdW90OyBtYWluIHRhYiBk YXRhIGdyaWQsIGFzIHBhcnQgb2YgVWlJbml0IGV2ZW50IGhhbmRsZXIgZnVuY3Rpb246PGJyPg0K PGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZx dW90Oztjb2xvcjpibGFjayI+VWlJbml0OiA8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQtZmFt aWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiM5OTAwMDAiPmZ1bmN0aW9uPC9zcGFu PjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29s b3I6YmxhY2siPigpIHs8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsgYXBpLjwvc3Bhbj48c3BhbiBz dHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6I0NDMzNDQyI+ YWRkTWFpblRhYkFjdGlvbkJ1dHRvbjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1 b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPignSG9zdCcsICdTaW5nbGUtSG9zdCBB Y3Rpb24nLDxicj4NCjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIEFjdGlvbiBidXR0b24gaW50ZXJmYWNlIG9iamVjdDxicj4N CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBBbGwgZnVuY3Rp b25zIHJlY2VpdmUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0ocykgYXMgZnVuY3Rpb24gYXJndW1l bnRzPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5l dyZxdW90Oztjb2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7IHs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8YnI+DQo8L3Nw YW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9y OiMwMDY2MDAiPiZuYnNwOyAmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7IC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgYnV0dG9uPC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjojMDA2NjAwIj48YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZv bnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4mbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsgPC9zcGFuPjxzcGFuIHN0 eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDAwMDk5Ij5v bkNsaWNrPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZx dW90Oztjb2xvcjpibGFjayI+Og0KPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTom cXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojOTkwMDAwIj5mdW5jdGlvbjwvc3Bhbj48L2I+ PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJs YWNrIj4oKSB7PGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3Vy aWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsgLy8gQ2FsbGlu ZyAnYXJndW1lbnRzWzBdJyBpcyBzYWZlLCBiZWNhdXNlIG9uQ2xpY2soKSBjYW4gYmUgY2FsbGVk PGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgLy8gb25seSB3aGVuIGV4YWN0bHkgb25lIGl0 ZW0gaXMgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSBkYXRhIGdyaWQ8YnI+DQo8L3NwYW4+PHNw YW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNr Ij4mbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB3aW5kb3cuYWxlcnQoJ1NlbGVjdGVkIGhvc3QgZW50 aXR5IElEID0gJyAmIzQzOyBhcmd1bWVudHNbMF0uZW50aXR5SWQpOzxicj4NCiZuYnNwOyAmbmJz cDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyB9LDwvc3Bhbj48c3BhbiBz dHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1m YW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Jm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vIFJldHVybmluZyAndHJ1 ZScgbWVhbnMgdGhlIGJ1dHRvbiBpcyBlbmFibGVkIChjbGlja2FibGUpPC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjojMDA2NjAwIj48YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5 OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPiZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAvLyBSZXR1cm5pbmcgJ2ZhbHNlJyBt ZWFucyB0aGUgYnV0dG9uIGlzIGRpc2FibGVkIChub24tY2xpY2thYmxlKTxicj4NCiZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyAvLyBEZWZhdWx0IHZhbHVlID0gJ3RydWUnPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250 LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7 Jm5ic3A7ICZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3BhbiBzdHls ZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwMDA5OSI+aXNF bmFibGVkPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZx dW90Oztjb2xvcjpibGFjayI+Og0KPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTom cXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojOTkwMDAwIj5mdW5jdGlvbjwvc3Bhbj48L2I+ PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJs YWNrIj4oKSB7PGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3Vy aWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyAvLyBF bmFibGUgYnV0dG9uIG9ubHkgd2hlbiBleGFjdGx5IG9uZSBpdGVtIGlzIHNlbGVjdGVkPGJyPg0K PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztj b2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPg0KPGI+PHNwYW4gc3R5 bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiM5OTAwMDAiPnJl dHVybjwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3 JnF1b3Q7O2NvbG9yOmJsYWNrIj4gYXJndW1lbnRzLmxlbmd0aCA9PSAxOzxicj4NCiZuYnNwOyAm bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsgfSw8L3NwYW4+PHNwYW4gc3R5 bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFt aWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPiZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7ICZuYnNwOyAvLyBSZXR1cm5pbmcgJ3RydWUn IG1lYW5zIHRoZSBidXR0b24gaXMgdmlzaWJsZTxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBSZXR1cm5pbmcg J2ZhbHNlJyBtZWFucyB0aGUgYnV0dG9uIGlzIGhpZGRlbjxicj4NCiZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBEZWZhdWx0IHZhbHVlID0gJ3Ry dWUnPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5l dyZxdW90Oztjb2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i c3A7ICZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIg TmV3JnF1b3Q7O2NvbG9yOiMwMDAwOTkiPmlzQWNjZXNzaWJsZTwvc3Bhbj48c3BhbiBzdHlsZT0i Zm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPjoNCjwvc3Bh bj48Yj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29s b3I6Izk5MDAwMCI+ZnVuY3Rpb248L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTom cXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+KCkgezwvc3Bhbj48c3BhbiBzdHls ZT0iY29sb3I6YmxhY2siPjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1 b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7IC8v IEFsd2F5cyBzaG93IHRoZSBidXR0b24gaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBncmlkPGJy Pg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90 Oztjb2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyAmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPg0KPGI+PHNwYW4g c3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiM5OTAwMDAi PnJldHVybjwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIg TmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4NCjwvc3Bhbj48Yj48c3BhbiBzdHlsZT0iZm9udC1mYW1p bHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6Izk5MDAwMCI+dHJ1ZTwvc3Bhbj48L2I+ PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJs YWNrIj47PGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyB9PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0K PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztj b2xvcjpibGFjayI+PGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7IH08YnI+DQo8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsgKTs8YnI+DQp9PC9zcGFuPjxzcGFu IHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPGJyPg0KQXMgbWVudGlvbmVkIGFib3ZlLCBhbGwg ZnVuY3Rpb25zIG9mIGFuIGludGVyZmFjZSBvYmplY3QgYXJlIG9wdGlvbmFsLiBGb3IgZnVuY3Rp b25zIGV4cGVjdGluZyByZXR1cm4gdmFsdWUsIGRlZmF1bHQgdmFsdWUgaXMgZGVmaW5lZCBieSBV SSBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUuIEZvciBleGFtcGxlOjxvOnA+PC9vOnA+PC9zcGFuPjwv cD4NCjx1bCB0eXBlPSJkaXNjIj4NCjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6 YmxhY2s7bXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87 bXNvLWxpc3Q6bDIgbGV2ZWwxIGxmbzMiPg0Kb25DbGljayAtIG5vIGRlZmF1bHQgdmFsdWUgKG5v IHJldHVybiB2YWx1ZSBleHBlY3RlZCk8bzpwPjwvbzpwPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3Jt YWwiIHN0eWxlPSJjb2xvcjpibGFjazttc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2lu LWJvdHRvbS1hbHQ6YXV0bzttc28tbGlzdDpsMiBsZXZlbDEgbGZvMyI+DQppc0VuYWJsZWQgLyBp c0FjY2Vzc2libGUgLSBkZWZhdWx0IHZhbHVlICZxdW90O3RydWUmcXVvdDsgKGJvb2xlYW4gcmV0 dXJuIHZhbHVlIGV4cGVjdGVkKTxvOnA+PC9vOnA+PC9saT48L3VsPg0KPHA+PHNwYW4gc3R5bGU9 ImNvbG9yOmJsYWNrIj5Ob3RlOiBVSSBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUgY2hlY2tzIHRoZSBh Y3R1YWwgcmV0dXJuIHZhbHVlIHR5cGUsIGFuZCB1c2VzIGRlZmF1bHQgdmFsdWUgaW4gY2FzZSB0 aGUgZnVuY3Rpb24gcmV0dXJuZWQgc29tZXRoaW5nIG9mIHdyb25nICh1bmV4cGVjdGVkKSB0eXBl LjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJn aW4tYm90dG9tOjEyLjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQpJbiB0aGUg ZXhhbXBsZSBhYm92ZSwgJnF1b3Q7Y3VycmVudGx5IHNlbGVjdGVkIGl0ZW0ocykmcXVvdDsgbWFw cyB0byBKU09OLWxpa2UgcmVwcmVzZW50YXRpb25zIG9mIGJ1c2luZXNzIGVudGl0aWVzIGN1cnJl bnRseSBzZWxlY3RlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGdyaWQuIEZvciBub3csIHRo ZSBlbnRpdHkgcmVwcmVzZW50YXRpb24gaXMgcXVpdGUgc2ltcGxlIGFuZCBzYW1lIGZvciBhbGwg ZW50aXR5IHR5cGVzOjxicj4NCjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6 JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPnsgZW50aXR5SWQ6ICZxdW90O1tC dXNpbmVzc0VudGl0eUd1aWRBc1N0cmluZ10mcXVvdDsgfTxicj4NCjwvc3Bhbj48c3BhbiBzdHls ZT0iY29sb3I6YmxhY2siPjxicj4NCkluIGZ1dHVyZSwgd2Ugd2lsbCBjcmVhdGUgc3BlY2lmaWMg SlNPTi1saWtlIHJlcHJlc2VudGF0aW9ucyBmb3Igc3BlY2lmaWMgYnVzaW5lc3MgZW50aXRpZXMs IGluIGNvbXBsaWFuY2Ugd2l0aCBFbmdpbmUgUkVTVCBBUEkgZW50aXR5IHN0cnVjdHVyZS48YnI+ DQo8YnI+DQpGb3IgYSBtb3JlIGV4dGVuc2l2ZSBleGFtcGxlIG9mIHVzaW5nICZxdW90O2FkZE1h aW5UYWJBY3Rpb25CdXR0b24mcXVvdDsgQVBJLCBwbGVhc2Ugc2VlIHRoZSBhdHRhY2hlZCAmcXVv dDthZGRNYWluVGFiQWN0aW9uQnV0dG9uLmh0bWwuZXhhbXBsZSZxdW90OyBmaWxlLjxvOnA+PC9v OnA+PC9zcGFuPjwvcD4NCjxkaXYgY2xhc3M9Ik1zb05vcm1hbCIgYWxpZ249ImNlbnRlciIgc3R5 bGU9InRleHQtYWxpZ246Y2VudGVyIj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPg0KPGhyIHNp emU9IjIiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4NCjwvc3Bhbj48L2Rpdj4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPGI+Mi4gSW1w cm92ZWQgcGx1Z2luIEFQSSBmdW5jdGlvbjogYWRkTWFpblRhYjxicj4NCjwvYj48YnI+DQpUaGUg JnF1b3Q7YWRkTWFpblRhYiZxdW90OyBBUEkgd2FzIGltcHJvdmVkIHRvIGFkZHJlc3MgZm9sbG93 aW5nIGlzc3Vlczo8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8dWwgdHlwZT0iZGlzYyI+DQo8bGkg Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOmJsYWNrO21zby1tYXJnaW4tdG9wLWFsdDph dXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvO21zby1saXN0OmwxIGxldmVsMSBsZm80Ij4N CiZxdW90O2FkZE1haW5UYWImcXVvdDsgY2FuIG5vdyBiZSBjYWxsZWQgYXQgYW55IG1vbWVudCBk dXJpbmcgVUkgcGx1Z2luIHJ1bnRpbWUsIGdpdmVuIHRoYXQgdGhlIHBsdWdpbiBpcyBhbGxvd2Vk IGludm9rZSBwbHVnaW4gQVBJIGZ1bmN0aW9ucyAocGx1Z2luIGlzIGVpdGhlciBJTklUSUFMSVpJ Tkcgb3IgSU5fVVNFKS48YnI+DQpQcmV2aW91c2x5LCAmcXVvdDthZGRNYWluVGFiJnF1b3Q7IHdv cmtlZCByZWxpYWJseSBvbmx5IHdoZW4gY2FsbGVkIGZyb20gd2l0aGluIFVpSW5pdCBldmVudCBo YW5kbGVyIGZ1bmN0aW9uLjxicj4NCkN1cnJlbnRseSwgaXQncyBwb3NzaWJsZSB0byBjYWxsICZx dW90O2FkZE1haW5UYWImcXVvdDsgYXQgYW55IG1vbWVudCwgZS5nLiBmcm9tIHdpdGhpbiBzb21l IG90aGVyIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gKGFmdGVyIFVpSW5pdCBoYXMgY29tcGxldGVk KS48bzpwPjwvbzpwPjwvbGk+PC91bD4NCjx1bCB0eXBlPSJkaXNjIj4NCjxsaSBjbGFzcz0iTXNv Tm9ybWFsIiBzdHlsZT0iY29sb3I6YmxhY2s7bXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1h cmdpbi1ib3R0b20tYWx0OmF1dG87bXNvLWxpc3Q6bDAgbGV2ZWwxIGxmbzUiPg0KJnF1b3Q7YWRk TWFpblRhYiZxdW90OyBub3cgcmV0YWlucyAmcXVvdDthY3RpdmUmcXVvdDsgdGFiIChoaWdobGln aHRlZCB0YWIgR1VJKS48YnI+DQomcXVvdDthZGRNYWluVGFiJnF1b3Q7IHdvcmtzIGJ5IGFkZGlu ZyBuZXcgdGFiIGNvbXBvbmVudCAoR1dUUCBwcmVzZW50ZXIgcHJveHkpIGFuZCByZWZyZXNoaW5n IG1haW4gdGFiIHBhbmVsIEdVSSBieSByZW1vdmluZyBhbGwgcmVsYXRlZCB0YWJzIGFuZCByZS1h ZGRpbmcgdGhlbSBhZ2Fpbi48YnI+DQpUaGlzIGxvZ2ljIGlzIGhhbmRsZWQgYnkgb3JnLm92aXJ0 LmVuZ2luZS51aS5jb21tb24ucHJlc2VudGVyLkR5bmFtaWNUYWJDb250YWluZXJQcmVzZW50ZXIg Y2xhc3MsIHdoaWNoIG1ha2VzIHN1cmUgdGhhdCAmcXVvdDthY3RpdmUmcXVvdDsgdGFiIGlzIHJl dGFpbmVkIGV2ZW4gYWZ0ZXIgbWFpbiB0YWIgcGFuZWwgd2FzIHJlZnJlc2hlZC48bzpwPjwvbzpw PjwvbGk+PC91bD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEy LjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5GdXJ0aGVybW9yZSwgY3VzdG9tIG1haW4g dGFiIGltcGxlbWVudGF0aW9uIG5vdyBkaXNwbGF5cyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4g VVJMIHRocm91Z2ggSFRNTCBpZnJhbWUgZWxlbWVudC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8 ZGl2IGNsYXNzPSJNc29Ob3JtYWwiIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOmNl bnRlciI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4NCjxociBzaXplPSIyIiB3aWR0aD0iMTAw JSIgYWxpZ249ImNlbnRlciI+DQo8L3NwYW4+PC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBz dHlsZT0ibWFyZ2luLWJvdHRvbToxMi4wcHQiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJy Pg0KPGI+My4gSW1wcm92ZWQgbmF0aXZlIEphdmFTY3JpcHQgZnVuY3Rpb24gaGFuZGxpbmc8L2I+ IChHV1QgSlNOSSk8YnI+DQo8YnI+DQpUaGlzIHBhdGNoIGludHJvZHVjZXMgb3JnLm92aXJ0LmVu Z2luZS51aS53ZWJhZG1pbi5wbHVnaW4uanNuaS5Kc0Z1bmN0aW9uIGFuZCBvcmcub3ZpcnQuZW5n aW5lLnVpLndlYmFkbWluLnBsdWdpbi5qc25pLkpzRnVuY3Rpb25SZXN1bHRIZWxwZXIgY2xhc3Nl cyBwcm92aWRpbmcgSmF2YSBhYnN0cmFjdGlvbiBmb3IgaW52b2tpbmcgbmF0aXZlIEphdmFTY3Jp cHQgZnVuY3Rpb25zLiBUaGVzZSBjbGFzc2VzIGZvbGxvdyB0aGUgZ2VuZXJhbCBjb250cmFjdA0K IG9mICZxdW90O2ludGVyZmFjZSBvYmplY3QmcXVvdDsgYXMgbWVudGlvbmVkIGFib3ZlLjxicj4N Cjxicj4NCkpzRnVuY3Rpb25SZXN1bHRIZWxwZXIgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVu IGRlYWxpbmcgd2l0aCBmdW5jdGlvbnMgd2hpY2ggYXJlIGV4cGVjdGVkIHRvIHJldHVybiB2YWx1 ZSBvZiBhIGNlcnRhaW4gdHlwZS4gVG9vIGJhZCBzdGFuZGFyZCBHV1QgSlNOSSBjbGFzc2VzIGRv bid0IHByb3ZpZGUgc3VjaCBhYnN0cmFjdGlvbiBmb3Igd29ya2luZyB3aXRoIG5hdGl2ZSBmdW5j dGlvbnMgb3V0LW9mLXRoZS1ib3guLi48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8ZGl2IGNsYXNz PSJNc29Ob3JtYWwiIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+PHNw YW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4NCjxociBzaXplPSIyIiB3aWR0aD0iMTAwJSIgYWxpZ249 ImNlbnRlciI+DQo8L3NwYW4+PC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFy Z2luLWJvdHRvbToxMi4wcHQiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+PGJyPg0KPGI+NC4g QWN0aW9uUGFuZWwgYW5kIEFjdGlvblRhYmxlIHR5cGUgaGllcmFyY2h5IHJlZmFjdG9yaW5nPC9i PiAocmVsYXRlZCB0byAmcXVvdDthZGRNYWluVGFiQWN0aW9uQnV0dG9uJnF1b3Q7IEFQSSk8Yj48 YnI+DQo8L2I+PGJyPg0KUHJldmlvdXNseSwgQWJzdHJhY3RBY3Rpb25QYW5lbCBhbmQgQWJzdHJh Y3RBY3Rpb25UYWJsZSBjbGFzc2VzIGRpZG4ndCBpbXBsZW1lbnQgYW55IHJlYXNvbmFibGUgaW50 ZXJmYWNlIHRoYXQgd291bGQgYWxsb3cgb3RoZXIgY29tcG9uZW50cyAoY2xpZW50LXNpZGUgVUkg cGx1Z2luIGluZnJhc3RydWN0dXJlKSB0byBkZXBlbmQgb24gdGhlaXIgZnVuY3Rpb25hbGl0eSBp biBhIGxvb3NlbHktY291cGxlZCBtYW5uZXIuIFRoaXMgd291bGQgbWFrZQ0KIGNvZGUgdGhhdCBp bXBsZW1lbnRzICZxdW90O2FkZE1haW5UYWJBY3Rpb25CdXR0b24mcXVvdDsgQVBJICZxdW90O3Vn bHkmcXVvdDs6IG1haW4gdGFiIHZpZXcgaW50ZXJmYWNlIHdvdWxkIGhhdmUgdG8gcmVmZXJlbmNl IEFic3RyYWN0QWN0aW9uVGFibGUgY2xhc3MgZGlyZWN0bHkuIEluIE1WUCBkZXNpZ24gcGF0dGVy biwgdmlldyBpbnRlcmZhY2Ugc2hvdWxkIGF2b2lkIHJlZmVyZW5jaW5nIHNwZWNpZmljIEdXVCBX aWRnZXQgY2xhc3NlcyBkaXJlY3RseS48YnI+DQo8YnI+DQpUaGlzIHBhdGNoIGludHJvZHVjZXMg bmV3IGludGVyZmFjZXMgZm9yIEFjdGlvblBhbmVsIGFuZCBBY3Rpb25UYWJsZSBjb21wb25lbnRz IHdoaWxlIGVsaW1pbmF0aW5nIGNvZGUgcmVkdW5kYW5jeSAoZHVwbGljYXRlIG9yIHVubmVjZXNz YXJ5IGNvZGUpLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXYgY2xhc3M9Ik1zb05vcm1hbCIg YWxpZ249ImNlbnRlciIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj48c3BhbiBzdHlsZT0iY29s b3I6YmxhY2siPg0KPGhyIHNpemU9IjIiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4NCjwv c3Bhbj48L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEy LjBwdCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8Yj41LiBBY3Rpb25QYW5lbCB0 eXBlIGhpZXJhcmNoeSByZWZhY3RvcmluZzwvYj4gKHJlbGF0ZWQgdG8gJnF1b3Q7YWRkTWFpblRh YiZxdW90OyBBUEkpPGJyPg0KPGJyPg0KU2luY2Ugb3JnLm92aXJ0LmVuZ2luZS51aS5jb21tb24u cHJlc2VudGVyLkR5bmFtaWNUYWJDb250YWluZXJQcmVzZW50ZXIgZGVmaW5lcyBuZXcgRHluYW1p Y1RhYlBhbmVsIGludGVyZmFjZSB0aGF0IGV4dGVuZHMgc3RhbmRhcmQgR1dUUCBUYWJQYW5lbCBp bnRlcmZhY2UsIHNvbWUgcmVmYWN0b3JpbmcgaGFkIHRvIGJlIGRvbmUgaW4gcmVsYXRlZCBBY3Rp b25QYW5lbCBjbGFzc2VzLjxicj4NCjxicj4NClRoaXMgcGF0Y2ggbWFrZXMgc3VyZSB0aGF0IGJv dGggb3JnLm92aXJ0LmVuZ2luZS51aS5jb21tb24ud2lkZ2V0LnRhYi5BYnN0cmFjdFRhYlBhbmVs ICh3aWRnZXQpIGFuZCBvcmcub3ZpcnQuZW5naW5lLnVpLmNvbW1vbi52aWV3LkFic3RyYWN0VGFi UGFuZWxWaWV3ICh2aWV3KSBzdXBwb3J0IER5bmFtaWNUYWJQYW5lbCBpbnRlcmZhY2UuPGJyPg0K PGJyPg0KTm90ZSB0aGF0IGZvciBub3csIG9ubHkgbWFpbiB0YWIgcGFuZWwgKG9yZy5vdmlydC5l bmdpbmUudWkud2ViYWRtaW4uc2VjdGlvbi5tYWluLnByZXNlbnRlci5NYWluVGFiUGFuZWxQcmVz ZW50ZXIpIHN1cHBvcnRzIGR5bmFtaWMgdGFicyB3aXRoaW4gaXRzIHZpZXcuPG86cD48L286cD48 L3NwYW4+PC9wPg0KPGRpdiBjbGFzcz0iTXNvTm9ybWFsIiBhbGlnbj0iY2VudGVyIiBzdHlsZT0i dGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+DQo8aHIgc2l6ZT0i MiIgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPg0KPC9zcGFuPjwvZGl2Pg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTIuMHB0Ij48c3BhbiBzdHlsZT0iY29s b3I6YmxhY2siPjxicj4NCjxiPldoZXJlIGlzIGFkZFN1YlRhYiBBUEkgZnVuY3Rpb24/PC9iPjxi cj4NCjxicj4NCkltcGxlbWVudGluZyAmcXVvdDthZGRTdWJUYWImcXVvdDsgQVBJIHJlcXVpcmVz IHNvbWUgbW9yZSBjaGFuZ2VzLCBhbmQgSSBkaWRuJ3Qgd2FudCB0byBkZWxheSB0aGlzIFBvQyBw YXRjaCBqdXN0IGJlY2F1c2Ugb2YgaXQuLi48YnI+DQo8YnI+DQpIZXJlJ3MgYSBzYW1wbGUgY29k ZSB0aGF0IGlsbHVzdHJhdGVzIHByb3Bvc2VkICZxdW90O2FkZFN1YlRhYiZxdW90OyBBUEkgdXNh Z2U6PGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3Vy aWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+VWlJbml0OiA8L3NwYW4+PGI+PHNwYW4gc3R5bGU9 ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiM5OTAwMDAiPmZ1bmN0 aW9uPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcm cXVvdDs7Y29sb3I6YmxhY2siPigpIHs8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsgYXBpLjwvc3Bh bj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6 I0NDMzNDQyI+YWRkU3ViVGFiPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtD b3VyaWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+KCdIb3N0JywmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsgJm5ic3A7DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90 O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPi8vIGVudGl0eVR5cGVOYW1lPC9zcGFu PjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjpi bGFjayI+PGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICdD dXN0b20gSG9zdCBTdWIgVGFiJywmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250 LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4vLyBsYWJlbDwv c3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29s b3I6YmxhY2siPjxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyAnY3VzdG9tLWhvc3Qtc3ViLXRhYicsICZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiMwMDY2MDAiPi8vIGhpc3RvcnlU b2tlbjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVv dDs7Y29sb3I6YmxhY2siPjxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyAnaHR0cDovL3d3dy5vdmlydC5vcmcvJywgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250 LWZhbWlseTomcXVvdDtDb3VyaWVyIE5ldyZxdW90Oztjb2xvcjojMDA2NjAwIj4vLyBjb250ZW50 VXJsPGJyPg0KPGJyPg0KPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3Vy aWVyIE5ldyZxdW90Oztjb2xvcjpibGFjayI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmll ciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMDtiYWNrZ3JvdW5kOndoaXRlIj4vLyBTdWIgdGFiIGlu dGVyZmFjZSBvYmplY3Q8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsgLy8gPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3VyaWVyIE5l dyZxdW90Oztjb2xvcjojMDA2NjAwIj5BbGwgZnVuY3Rpb25zIHJlY2VpdmUgY3VycmVudGx5IHNl bGVjdGVkIGl0ZW0ocyk8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsgLy8gd2l0aGluIHRoZSBtYWluIHRhYiBkYXRhIGdyaWQgYXMgZnVuY3Rpb24gYXJndW1l bnRzPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMDA2NjAwIj48YnI+DQo8L3NwYW4+PHNwYW4g c3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4m bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgezwvc3Bhbj48c3BhbiBz dHlsZT0iY29sb3I6YmxhY2siPjxicj4NCjxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1m YW1pbHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6IzAwNjYwMCI+Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgJm5ic3A7IC8vIFJldHVybmluZyAndHJ1 ZScgbWVhbnMgdGhlIHN1YiB0YWIgaXMgdmlzaWJsZTxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBSZXR1cm5p bmcgJ2ZhbHNlJyBtZWFucyB0aGUgc3ViIHRhYiBpcyBoaWRkZW48YnI+DQombmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy8gRGVmYXVsdCB2YWx1ZSA9 ICd0cnVlJzxicj4NCjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmll ciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPiZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDb3Vy aWVyIE5ldyZxdW90Oztjb2xvcjojMDAwMDk5Ij5pc0FjY2Vzc2libGU8L3NwYW4+PHNwYW4gc3R5 bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj46DQo8 L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7 O2NvbG9yOiM5OTAwMDAiPmZ1bmN0aW9uPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1p bHk6JnF1b3Q7Q291cmllciBOZXcmcXVvdDs7Y29sb3I6YmxhY2siPigpIHs8YnI+DQombmJzcDsm bmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PGI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90 O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOiM5OTAwMDAiPnJldHVybjwvc3Bhbj48L2I+PHNwYW4g c3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj4g YXJndW1lbnRzLmxlbmd0aCA9PSAxICZhbXA7JmFtcDsgYXJndW1lbnRzWzBdLmVudGl0eUlkID09 ICcmbHQ7TXlIb3N0RW50aXR5SWQmZ3Q7Jzs8YnI+DQombmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08L3NwYW4+PHNwYW4gc3R5bGU9 ImNvbG9yOmJsYWNrIj48YnI+DQo8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90 O0NvdXJpZXIgTmV3JnF1b3Q7O2NvbG9yOmJsYWNrIj48YnI+DQombmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgfTxicj4NCjxicj4NCiZuYnNwOyZuYnNwOyZuYnNwOyAp Ozxicj4NCn08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQo8YnI+DQpBcyBw YXJ0IG9mICZxdW90O2FkZFN1YlRhYiZxdW90OyBBUEkgaW1wbGVtZW50YXRpb24sIEknbGwgcmVm YWN0b3IgY3VzdG9tIG1haW4gdGFiIGNvbXBvbmVudHMsIGluIG9yZGVyIHRvIHVzZSBvbmUgJnF1 b3Q7dGFiIHR5cGUmcXVvdDsgZm9yIGJvdGggbWFpbiBhbmQgc3ViIHRhYnMuPGJyPg0KPGJyPg0K Q3VycmVudGx5LCB3ZSBoYXZlIG9uZSAoYW5kIG9ubHkgb25lKSAmcXVvdDt0YWIgdHlwZSZxdW90 OyAtIGEgdGFiIHRoYXQgc2hvd3MgY29udGVudCBvZiB0aGUgZ2l2ZW4gVVJMIHRocm91Z2ggSFRN TCBpZnJhbWUgZWxlbWVudC48YnI+DQo8YnI+DQpXZSBjb3VsZCBhbHNvIGNyZWF0ZSBuZXcgJnF1 b3Q7dGFiIHR5cGVzJnF1b3Q7LCBlLmcuIGZvcm0tYmFzZWQgdGFiIHRoYXQgc2hvd3Mga2V5L3Zh bHVlIHBhaXJzIChJTUhPIHRoaXMgY291bGQgYmUgcXVpdGUgdXNlZnVsIGZvciBjdXN0b20gc3Vi IHRhYnMpLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxkaXYgY2xhc3M9Ik1zb05vcm1hbCIgYWxp Z249ImNlbnRlciIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj48c3BhbiBzdHlsZT0iY29sb3I6 YmxhY2siPg0KPGhyIHNpemU9IjIiIHdpZHRoPSIxMDAlIiBhbGlnbj0iY2VudGVyIj4NCjwvc3Bh bj48L2Rpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEyLjBw dCI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj48YnI+DQpMZXQgbWUga25vdyB3aGF0IHlvdSB0 aGluayE8YnI+DQo8YnI+DQpDaGVlcnMsPGJyPg0KVm9qdGVjaDxvOnA+PC9vOnA+PC9zcGFuPjwv cD4NCjwvZGl2Pg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29s b3I6YmxhY2siPiZuYnNwOzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjxvOnA+Jm5ic3A7 PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= --_000_D290AD8432118048947689BA3AE8A9B3EA0AD1SACEXCMBX04PRDhqn_--

J</span><span style=3D"font-size:11.0pt;font-family:"Calibri",&q= uot;sans-serif";color:#1F497D"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca=
entityTypeName</i> values are strings reflecting org.ovirt.engine.ui.weba= dmin.plugin.entityEntityType enum members. Following <i>entityTypeName</i> values are currently supported (v= alues are case-sensitive): "DataCenter", "Cluster", "Host", "Storage", "Dis= k", "VirtualMachine", "Template".<br> <br> Note: "Pool" value is currently not supported, because of org.ovirt.engine.= core.common.businessentities.vm_pools entity not implementing the BusinessE= ntity interface, not sure why though. Maybe we should switch from BusinessE= ntity to IVdcQueryable interface and always cast getQueryableId method result value to Guid?<br> <br> <i>label</i> is the title displayed on the button<i>.<br> </i><br> <i>actionButtonInterface</i> represents an object that "implements the butt= on interface" by declaring its functions: <i>onClick</i>, <i>isEnabled</i>, <i>isAccessible</i>. All functions of <i>= actionButtonInterface</i> receive currently selected item(s) as function ar= guments.<br> <br> Let's take a closer look at the concept behind <i>actionButtonInterface</i>= . In traditional class-based object-oriented languages, such as Java, inter= face is an abstract type that contains method declarations without an imple= mentation. A class that implements
function</span></b><span style=3D"font-family:"Courier New";colo= r:black">() {<br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; /= / Calling 'arguments[0]' is safe, because onClick() can be called<br> &= nbsp; // only when exactly one item is currently selected in the data grid<= br> </span><span style=3D"font-family:"Courier New";color:black">&nbs=
function</span></b><span style=3D"font-family:"Courier New";colo= r:black">() {<br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; &nb= sp; // Enable button only when exactly one item is selected<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs=
function</span></b><span style=3D"font-family:"Courier New";colo= r:black">() {</span><span style=3D"color:black"><br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; /= / Always show the button in the corresponding data grid<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs=
true</span></b><span style=3D"font-family:"Courier New";color:bl= ack">;<br> }</span><span=
------=_Part_11978288_1878523335.1351103614438 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Chris,=20 thanks for pointing that out, I forgot to mention the dates :)=20 oVirt Workshop (Barcelona) ends on Nov 9 (Friday) so I'm planning to releas= e UI plugins PoC revision 7 around Nov 15 (next week's Thursday). I'll try = to work on some items before flying to Barcelona next week.=20 Thanks,=20 Vojtech=20 ----- Original Message ----- From: "Christopher Morrissey" <Christopher.Morrissey@netapp.com>=20 To: "Vojtech Szocs" <vszocs@redhat.com>=20 Cc: "engine-devel" <engine-devel@ovirt.org>=20 Sent: Wednesday, October 24, 2012 8:14:48 PM=20 Subject: RE: [Engine-devel] UI Plugins: PoC patch revision 6 now available= =20 Hi Vojtech,=20 Thanks! That works for us. One last question. Any idea on when rev 7 will b= e available? J=20 -Chris=20 From: Vojtech Szocs [mailto:vszocs@redhat.com]=20 Sent: Wednesday, October 24, 2012 1:34 PM=20 To: Morrissey, Christopher=20 Cc: engine-devel=20 Subject: Re: [Engine-devel] UI Plugins: PoC patch revision 6 now available= =20 Hi Chris,=20 no problem, I'll take care of implementing the dialog-related API function,= with initial implementation using a native browser pop-up window (we can i= mprove it later on, using WebAdmin dialog UI infrastructure).=20 Since I'm currently preparing for my talk at oVirt Workshop (Barcelona), I'= ll have more time to work on UI plugins when I return back. In order to hav= e revision 7 as soon as possible, I suggest to implement all planned items,= except for "add custom sub tab", as part of revision 7. What do you think?= =20 Regards,=20 Vojtech=20 ----- Original Message ----- From: "Christopher Morrissey" <Christopher.Morrissey@netapp.com>=20 To: "Vojtech Szocs" <vszocs@redhat.com>=20 Cc: "engine-devel" <engine-devel@ovirt.org>=20 Sent: Tuesday, October 23, 2012 9:36:27 PM=20 Subject: RE: [Engine-devel] UI Plugins: PoC patch revision 6 now available= =20 Hi Vojtech,=20 It looks like I=E2=80=99m going to be in training all next week and will un= fortunately NOT be able to take on the work to implement the =E2=80=9Cshow = dialog with content loaded from given URL=E2=80=9D plugin API function as I= had hoped. This is something we really need for revision 7. Of the items i= n your list for inclusion, the sub-tab frame plugin is the least necessary = for us. The rest of the items are all pretty important.=20 Let me know if any of this is a problem or if we can shift things around to= get them in the right order.=20 -Chris=20 From: Vojtech Szocs [mailto:vszocs@redhat.com]=20 Sent: Tuesday, October 23, 2012 1:35 PM=20 To: Morrissey, Christopher=20 Cc: engine-devel=20 Subject: Re: [Engine-devel] UI Plugins: PoC patch revision 6 now available= =20 Hi Chris,=20 well, I planned to implement simple "show dialog with content loaded from g= iven URL" plugin API function some time ago, but then I thought you might b= e experimenting with it already :) please feel free to work on that, we can= include it into PoC revision 7.=20 Regarding planned items for revision 7, here's my current list (feel free t= o add/modify things here if necessary):=20 * "add custom sub tab" plugin API function, with initial sub tab implem= entation showing content of the given URL (we can add more tab types later = on, e.g. form-based or table-based tab)=20 * "add custom task to task pane" plugin API function, requires some UiC= ommon integration coding (I will handle this)=20 * "show dialog with content loaded from given URL" plugin API function,= initial implementation could simply open new browser popup window using wi= ndow.open (but any other approach is fine as well)=20 * integration with REST API, e.g. "obtain REST API authentication token= " plugin API function, maybe also some API for performing actual HTTP REST = calls?=20 As for the Engine REST API authentication token, need to learn more about i= t, as WebAdmin GUI currently uses GWT RPC instead of REST API when communic= ating with the backend.=20 You also mentioned that "we can make calls from our server into the REST AP= I" - I assume this will be used together with "custom content for tab/dialo= g" plugin API functionality? (Otherwise I'd say the UI Plugin itself could = make REST API calls on its own..)=20 Regards,=20 Vojtech=20 From: "Christopher Morrissey" <Christopher.Morrissey@netapp.com>=20 To: "Vojtech Szocs" <vszocs@redhat.com>, "engine-devel" <engine-devel@ovirt= .org>=20 Sent: Monday, October 22, 2012 5:25:53 PM=20 Subject: RE: [Engine-devel] UI Plugins: PoC patch revision 6 now available= =20 Hi Vojtech,=20 Thanks again for the delivery of the patch. For revision 7, do you have a l= ist of content? I had previously indicated I could work on adding the plugi= n API to launch a dialog, but hadn=E2=80=99t been able to get started on it= until now. I wanted to see if you by chance were already working on it or = if you were planning to deliver that yourself in the next revision?=20 A couple of other items we are looking for are the ability to add tasks for= execution and get access to the session ID or some kind of authentication = token so that we can make calls from our server into the REST API. I=E2=80= =99m not very familiar yet with the REST API so I=E2=80=99m not sure what a= uthentication methods are available and which would be best.=20 -Chris=20 From: engine-devel-bounces@ovirt.org [mailto:engine-devel-bounces@ovirt.org= ] On Behalf Of Vojtech Szocs=20 Sent: Thursday, October 18, 2012 10:49 AM=20 To: engine-devel=20 Subject: [Engine-devel] UI Plugins: PoC patch revision 6 now available=20 Hi guys,=20 the latest revision of UI Plugins proof-of-concept patch is now available f= or you to experiment with. You can download the patch from oVirt Gerrit at = http://gerrit.ovirt.org/#/c/8120/2 (patch set 2).=20 Please read on to learn what's new in this revision. If you have any commen= ts, questions or ideas, please let me know!=20 0. UI plugin path information resolved using local Engine configuration=20 Server-side UI plugin infrastructure now uses local (machine-specific) Engi= ne configuration instead of global ( vdc_options database table) Engine con= figuration:=20 * Previously, path information was resolved through org.ovirt.engine.co= re.common.config.Config class - Engine configuration values were retrieved = from vdc_options database table.=20 * Currently, path information is resolved through org.ovirt.engine.core= .utils.LocalConfig class - Engine configuration values are retrieved from l= ocal file system.=20 In case you're not working with oVirt Engine through RPM package system, e.= g. you have a local development environment set up and you build and deploy= oVirt Engine through Maven, please follow these steps:=20 a. Copy default Engine configuration into /usr/share/ ovirt-engine /conf=20 # mkdir -p /usr/share/ovirt-engine/conf=20 # cp <OVIRT_HOME>/backend/manager/conf/engine.conf.defaults /usr/share/ovir= t-engine/conf/engine.conf.defaults=20 b. If necessary, copy UI plugin data files from /usr/share/engine/ui-plugin= s to /usr/share/ ovirt-engine /ui-plugins=20 c. If necessary, copy UI plugin config files from /etc/engine/ui-plugins to= /etc/ ovirt-engine /ui-plugins=20 d, In case you want to override the default Engine configuration, put your = custom property file into /etc/sysconfig/ovirt-engine=20 The reason behind this change is that path information for UI plugin data a= nd configuration is typically machine-specific, and should be customizable = per machine through Engine local configuration.=20 1. New plugin API function: addMainTabActionButton=20 The "addMainTabActionButton" API adds custom context-sensitive button to th= e given main tab's data grid, along with corresponding data grid context me= nu item.=20 addMainTabActionButton(entityTypeName, label, actionButtonInterface)=20 entityTypeName indicates which main tab's data grid the button should be ad= ded to, according to the entity type associated with the main tab. entityTy= peName values are strings reflecting org.ovirt.engine.ui.webadmin.plugin.en= tityEntityType enum members. Following entityTypeName values are currently = supported (values are case-sensitive): "DataCenter", "Cluster", "Host", "St= orage", "Disk", "VirtualMachine", "Template".=20 Note: "Pool" value is currently not supported, because of org.ovirt.engine.= core.common.businessentities.vm_pools entity not implementing the BusinessE= ntity interface, not sure why though. Maybe we should switch from BusinessE= ntity to IVdcQueryable interface and always cast getQueryableId method resu= lt value to Guid?=20 label is the title displayed on the button .=20 actionButtonInterface represents an object that "implements the button inte= rface" by declaring its functions: onClick , isEnabled , isAccessible . All= functions of actionButtonInterface receive currently selected item(s) as f= unction arguments.=20 Let's take a closer look at the concept behind actionButtonInterface . In t= raditional class-based object-oriented languages, such as Java, interface i= s an abstract type that contains method declarations without an implementat= ion. A class that implements the given interface must implement all methods= declared by that interface (unless it's an abstract class, but this isn't = relevant in our case).=20 In contrast with traditional class-based object-oriented languages, JavaScr= ipt supports OOP through prototype-based programming model ( https://develo= per.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-Oriented_JavaS= cript ). At the same time, JavaScript language is dynamically-typed and the= refore doesn't support traditional concept of interface in OOP, it uses "du= ck typing" technique instead ( http://en.wikipedia.org/wiki/Duck_typing ).= =20 The simplest way to provide an object that "implements the given interface"= in JavaScript is to use "duck typing" technique: providing an object that = contains well-known functions. In UI plugin infrastructure, I call this con= cept "interface object", represented by org.ovirt.engine.ui.webadmin.plugin= .jsni.JsInterfaceObject class. Unlike the traditional concept of interface = abstract type in object-oriented languages, an "interface object" does not = necessarily have to declare all functions of the given interface in order t= o "implement" such interface. In fact, an empty object can be used as a val= id "interface object". Missing functions will be simply treated as empty (n= o-op) functions. Furthermore, an "interface object" can "implement" multipl= e interfaces by declaring functions of those interfaces (interface composit= ion).=20 Getting back to "addMainTabActionButton" API, here's a sample code that add= s new button to "Host" main tab data grid, as part of UiInit event handler = function:=20 UiInit: function () {=20 api. addMainTabActionButton ('Host', 'Single-Host Action',=20 // Action button interface object=20 // All functions receive currently selected item(s) as function arguments= =20 {=20 // Called when the user clicks the button=20 onClick : function () {=20 // Calling 'arguments[0]' is safe, because onClick() can be called=20 // only when exactly one item is currently selected in the data grid=20 window.alert('Selected host entity ID =3D ' + arguments[0].entityId);=20 },=20 // Returning 'true' means the button is enabled (clickable)=20 // Returning 'false' means the button is disabled (non-clickable)=20 // Default value =3D 'true'=20 isEnabled : function () {=20 // Enable button only when exactly one item is selected=20 return arguments.length =3D=3D 1;=20 },=20 // Returning 'true' means the button is visible=20 // Returning 'false' means the button is hidden=20 // Default value =3D 'true'=20 isAccessible : function () {=20 // Always show the button in the corresponding data grid=20 return true ;=20 }=20 }=20 );=20 }=20 As mentioned above, all functions of an interface object are optional. For = functions expecting return value, default value is defined by UI plugin inf= rastructure. For example:=20 * onClick - no default value (no return value expected)=20 * isEnabled / isAccessible - default value "true" (boolean return value= expected)=20 Note: UI plugin infrastructure checks the actual return value type, and use= s default value in case the function returned something of wrong (unexpecte= d) type.=20 In the example above, "currently selected item(s)" maps to JSON-like repres= entations of business entities currently selected in the corresponding data= grid. For now, the entity representation is quite simple and same for all = entity types:=20 { entityId: "[BusinessEntityGuidAsString]" }=20 In future, we will create specific JSON-like representations for specific b= usiness entities, in compliance with Engine REST API entity structure.=20 For a more extensive example of using "addMainTabActionButton" API, please = see the attached "addMainTabActionButton.html.example" file.=20 2. Improved plugin API function: addMainTab=20 The "addMainTab" API was improved to address following issues:=20 * "addMainTab" can now be called at any moment during UI plugin runtime= , given that the plugin is allowed invoke plugin API functions (plugin is e= ither INITIALIZING or IN_USE). Previously, "addMainTab" worked reliably onl= y when called from within UiInit event handler function. Currently, it's po= ssible to call "addMainTab" at any moment, e.g. from within some other even= t handler function (after UiInit has completed).=20 * "addMainTab" now retains "active" tab (highlighted tab GUI). "addMain= Tab" works by adding new tab component (GWTP presenter proxy) and refreshin= g main tab panel GUI by removing all related tabs and re-adding them again.= This logic is handled by org.ovirt.engine.ui.common.presenter.DynamicTabCo= ntainerPresenter class, which makes sure that "active" tab is retained even= after main tab panel was refreshed.=20 Furthermore, custom main tab implementation now displays the content of the= given URL through HTML iframe element.=20 3. Improved native JavaScript function handling (GWT JSNI)=20 This patch introduces org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction a= nd org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunctionResultHelper classes = providing Java abstraction for invoking native JavaScript functions. These = classes follow the general contract of "interface object" as mentioned abov= e.=20 JsFunctionResultHelper is particularly useful when dealing with functions w= hich are expected to return value of a certain type. Too bad standard GWT J= SNI classes don't provide such abstraction for working with native function= s out-of-the-box...=20 4. ActionPanel and ActionTable type hierarchy refactoring (related to "addM= ainTabActionButton" API)=20 Previously, AbstractActionPanel and AbstractActionTable classes didn't impl= ement any reasonable interface that would allow other components (client-si= de UI plugin infrastructure) to depend on their functionality in a loosely-= coupled manner. This would make code that implements "addMainTabActionButto= n" API "ugly": main tab view interface would have to reference AbstractActi= onTable class directly. In MVP design pattern, view interface should avoid = referencing specific GWT Widget classes directly.=20 This patch introduces new interfaces for ActionPanel and ActionTable compon= ents while eliminating code redundancy (duplicate or unnecessary code).=20 5. ActionPanel type hierarchy refactoring (related to "addMainTab" API)=20 Since org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter def= ines new DynamicTabPanel interface that extends standard GWTP TabPanel inte= rface, some refactoring had to be done in related ActionPanel classes.=20 This patch makes sure that both org.ovirt.engine.ui.common.widget.tab.Abstr= actTabPanel (widget) and org.ovirt.engine.ui.common.view.AbstractTabPanelVi= ew (view) support DynamicTabPanel interface.=20 Note that for now, only main tab panel (org.ovirt.engine.ui.webadmin.sectio= n.main.presenter.MainTabPanelPresenter) supports dynamic tabs within its vi= ew.=20 Where is addSubTab API function?=20 Implementing "addSubTab" API requires some more changes, and I didn't want = to delay this PoC patch just because of it...=20 Here's a sample code that illustrates proposed "addSubTab" API usage:=20 UiInit: function () {=20 api. addSubTab ('Host', // entityTypeName=20 'Custom Host Sub Tab', // label=20 'custom-host-sub-tab', // historyToken=20 'http://www.ovirt.org/', // contentUrl=20 // Sub tab interface object=20 // All functions receive currently selected item(s)=20 // within the main tab data grid as function arguments=20 {=20 // Returning 'true' means the sub tab is visible=20 // Returning 'false' means the sub tab is hidden=20 // Default value =3D 'true'=20 isAccessible : function () {=20 return arguments.length =3D=3D 1 && arguments[0].entityId =3D=3D '<MyHostEn= tityId>';=20 }=20 }=20 );=20 }=20 As part of "addSubTab" API implementation, I'll refactor custom main tab co= mponents, in order to use one "tab type" for both main and sub tabs.=20 Currently, we have one (and only one) "tab type" - a tab that shows content= of the given URL through HTML iframe element.=20 We could also create new "tab types", e.g. form-based tab that shows key/va= lue pairs (IMHO this could be quite useful for custom sub tabs).=20 Let me know what you think!=20 Cheers,=20 Vojtech=20 ------=_Part_11978288_1878523335.1351103614438 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 Chris,<br><br>thanks for pointing that out, I forg= ot to mention the dates :)<br><br><span style=3D"color:black">oVirt Worksho= p (Barcelona)</span> ends on Nov 9 (Friday) so I'm planning to release UI p= lugins PoC revision 7 around Nov 15 (next week's Thursday). I'll try to wor= k on some items before flying to Barcelona next week.<br><br>Thanks,<br>Voj= tech<br><br><br><hr id=3D"zwchr"><div style=3D"color:#000;font-weight:norma= l;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-s= erif;font-size:12pt;"><b>From: </b>"Christopher Morrissey" <Christopher.= Morrissey@netapp.com><br><b>To: </b>"Vojtech Szocs" <vszocs@redhat.co= m><br><b>Cc: </b>"engine-devel" <engine-devel@ovirt.org><br><b>Sen= t: </b>Wednesday, October 24, 2012 8:14:48 PM<br><b>Subject: </b>RE: [Engin= e-devel] UI Plugins: PoC patch revision 6 now available<br><br> <style><!-- @font-face =09{font-family:Helvetica; =09panose-1:2 11 6 4 2 2 2 2 2 4;} @font-face =09{font-family:Wingdings; =09panose-1:5 0 0 0 0 0 0 0 0 0;} @font-face =09{font-family:Wingdings; =09panose-1:5 0 0 0 0 0 0 0 0 0;} @font-face =09{font-family:Calibri; =09panose-1:2 15 5 2 2 2 4 3 2 4;} @font-face =09{font-family:Tahoma; =09panose-1:2 11 6 4 3 5 4 4 2 4;} p.MsoNormal, li.MsoNormal, div.MsoNormal =09{margin:0in; =09margin-bottom:.0001pt; =09font-size:12.0pt; =09font-family:"Times New Roman","serif";} a:link, span.MsoHyperlink =09{mso-style-priority:99; =09color:blue; =09text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed =09{mso-style-priority:99; =09color:purple; =09text-decoration:underline;} p =09{mso-style-priority:99; =09margin:0in; =09margin-bottom:.0001pt; =09font-size:12.0pt; =09font-family:"Times New Roman","serif";} p.MsoAcetate, li.MsoAcetate, div.MsoAcetate =09{mso-style-priority:99; =09mso-style-link:"Balloon Text Char"; =09margin:0in; =09margin-bottom:.0001pt; =09font-size:8.0pt; =09font-family:"Tahoma","sans-serif";} span.BalloonTextChar =09{mso-style-name:"Balloon Text Char"; =09mso-style-priority:99; =09mso-style-link:"Balloon Text"; =09font-family:"Tahoma","sans-serif";} span.EmailStyle20 =09{mso-style-type:personal; =09font-family:"Calibri","sans-serif"; =09color:#1F497D;} span.EmailStyle21 =09{mso-style-type:personal; =09font-family:"Calibri","sans-serif"; =09color:#1F497D;} span.EmailStyle24 =09{mso-style-type:personal-reply; =09font-family:"Calibri","sans-serif"; =09color:#1F497D;} .MsoChpDefault =09{mso-style-type:export-only; =09font-size:10.0pt;} @page WordSection1 =09{size:8.5in 11.0in; =09margin:1.0in 1.0in 1.0in 1.0in;} div.WordSection1 =09{page:WordSection1;} @list l0 =09{mso-list-id:430246997; =09mso-list-template-ids:-1402284674;} @list l0:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l0:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l0:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l0:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1 =09{mso-list-id:675302646; =09mso-list-template-ids:1662667256;} @list l1:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l1:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l1:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l1:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2 =09{mso-list-id:1330719658; =09mso-list-template-ids:-1858944704;} @list l2:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l2:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l2:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l2:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3 =09{mso-list-id:1550606144; =09mso-list-template-ids:-392264970;} @list l3:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l3:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l3:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l3:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4 =09{mso-list-id:2009794949; =09mso-list-template-ids:-1270830370;} @list l4:level1 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=B7; =09mso-level-tab-stop:.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Symbol;} @list l4:level2 =09{mso-level-number-format:bullet; =09mso-level-text:o; =09mso-level-tab-stop:1.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:"Courier New"; =09mso-bidi-font-family:"Times New Roman";} @list l4:level3 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:1.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4:level4 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4:level5 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:2.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4:level6 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4:level7 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:3.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4:level8 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.0in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} @list l4:level9 =09{mso-level-number-format:bullet; =09mso-level-text:=EF=82=A7; =09mso-level-tab-stop:4.5in; =09mso-level-number-position:left; =09text-indent:-.25in; =09mso-ansi-font-size:10.0pt; =09font-family:Wingdings;} ol =09{margin-bottom:0in;} ul =09{margin-bottom:0in;} --></style> <div class=3D"WordSection1"> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">Hi Vojtech,</span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">Thanks! That works for us= . One last question. Any idea on when rev 7 will be available? </span><span style=3D"font-size:11.0pt;font-family:Wingdings;color:#1F497D"= libri","sans-serif";color:#1F497D"> </span></p> <div> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">-Chris</span></p> </div> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span></p> <div> <div style=3D"border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in = 0in 0in"> <p class=3D"MsoNormal"><b><span style=3D"font-size:10.0pt;font-family:"= ;Tahoma","sans-serif"">From:</span></b><span style=3D"font-s= ize:10.0pt;font-family:"Tahoma","sans-serif""> Vojtech = Szocs [mailto:vszocs@redhat.com] <br> <b>Sent:</b> Wednesday, October 24, 2012 1:34 PM<br> <b>To:</b> Morrissey, Christopher<br> <b>Cc:</b> engine-devel<br> <b>Subject:</b> Re: [Engine-devel] UI Plugins: PoC patch revision 6 now ava= ilable</span></p> </div> </div> <p class=3D"MsoNormal"> </p> <div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black">Hi Chris,<br> <br> no problem, I'll take care of implementing the dialog-related API function,= with initial implementation using a native browser pop-up window (we can i= mprove it later on, using WebAdmin dialog UI infrastructure).<br> <br> Since I'm currently preparing for my talk at oVirt Workshop (Barcelona), I'= ll have more time to work on UI plugins when I return back. In order to hav= e revision 7 as soon as possible, I suggest to implement all planned items,= except for "add custom sub tab", as part of revision 7. What do you think?</span></p> <p><span style=3D"color:black">Regards,</span></p> <p><span style=3D"color:black">Vojtech</span></p> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"> </span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr id=3D"zwchr" size=3D"2" width=3D"100%" align=3D"center"> </span></div> <div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><b><span style=3D"fon= t-family:"Helvetica","sans-serif";color:black">From: </span></b><span style=3D"font-family:"Helvetica","sans-seri= f";color:black">"Christopher Morrissey" <Christopher.Morrissey@neta= pp.com><br> <b>To: </b>"Vojtech Szocs" <vszocs@redhat.com><br> <b>Cc: </b>"engine-devel" <engine-devel@ovirt.org><br> <b>Sent: </b>Tuesday, October 23, 2012 9:36:27 PM<br> <b>Subject: </b>RE: [Engine-devel] UI Plugins: PoC patch revision 6 now ava= ilable</span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">Hi Vojtech,</span><span s= tyle=3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span><span style= =3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">It looks like I=E2=80=99m= going to be in training all next week and will unfortunately NOT be able t= o take on the work to implement the =E2=80=9Cshow dialog with content loade= d from given URL=E2=80=9D plugin API function as I had hoped. This is someth= ing we really need for revision 7. Of the items in your list for inclusion,= the sub-tab frame plugin is the least necessary for us. The rest of the it= ems are all pretty important.</span><span style=3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span><span style= =3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">Let me know if any of thi= s is a problem or if we can shift things around to get them in the right or= der. </span><span style=3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span><span style= =3D"color:black"></span></p> <div> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">-Chris</span><span style= =3D"color:black"></span></p> </div> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span><span style= =3D"color:black"></span></p> <div> <div style=3D"border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in = 0in 0in"> <p class=3D"MsoNormal"><b><span style=3D"font-size:10.0pt;font-family:"= ;Tahoma","sans-serif";color:black">From:</span></b><span sty= le=3D"font-size:10.0pt;font-family:"Tahoma","sans-serif"= ;;color:black"> Vojtech Szocs [mailto:vszocs@redhat.com] <br> <b>Sent:</b> Tuesday, October 23, 2012 1:35 PM<br> <b>To:</b> Morrissey, Christopher<br> <b>Cc:</b> engine-devel<br> <b>Subject:</b> Re: [Engine-devel] UI Plugins: PoC patch revision 6 now ava= ilable</span><span style=3D"color:black"></span></p> </div> </div> <p class=3D"MsoNormal"><span style=3D"color:black"> </span></p> <div> <p class=3D"MsoNormal"><span style=3D"color:black">Hi Chris,<br> <br> well, I planned to implement simple "show dialog with content loaded from g= iven URL" plugin API function some time ago, but then I thought you might b= e experimenting with it already :) please feel free to work on that, we can= include it into PoC revision 7.<br> <br> Regarding planned items for revision 7, here's my current list (feel free t= o add/modify things here if necessary):</span></p> <ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l3 level1 lfo1"> "add custom sub tab" plugin API function, with initial sub tab implementati= on showing content of the given URL (we can add more tab types later on, e.= g. form-based or table-based tab)</li><li class=3D"MsoNormal" style=3D"colo= r:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l3 leve= l1 lfo1"> "add custom task to task pane" plugin API function, requires some UiCommon = integration coding (I will handle this)</li><li class=3D"MsoNormal" style= =3D"color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list= :l3 level1 lfo1"> "show dialog with content loaded from given URL" plugin API function, initi= al implementation could simply open new browser popup window using window.o= pen (but any other approach is fine as well)</li><li class=3D"MsoNormal" st= yle=3D"color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-l= ist:l3 level1 lfo1"> integration with REST API, e.g. "obtain REST API authentication token" plug= in API function, maybe also some API for performing actual HTTP REST calls?= </li></ul> <p><span style=3D"color:black"> </span></p> <p><span style=3D"color:black">As for the Engine REST API authentication to= ken, need to learn more about it, as WebAdmin GUI currently uses GWT RPC in= stead of REST API when communicating with the backend.</span></p> <p><span style=3D"color:black"> </span></p> <p><span style=3D"color:black">You also mentioned that "we can make calls f= rom our server into the REST API" - I assume this will be used together wit= h "custom content for tab/dialog" plugin API functionality? (Otherwise I'd = say the UI Plugin itself could make REST API calls on its own..)</span></p> <p><span style=3D"color:black"> </span></p> <p><span style=3D"color:black">Regards,</span></p> <p><span style=3D"color:black">Vojtech</span></p> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"> </span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><b><span style=3D"fon= t-family:"Helvetica","sans-serif";color:black">From: </span></b><span style=3D"font-family:"Helvetica","sans-seri= f";color:black">"Christopher Morrissey" <Christopher.Morrissey@neta= pp.com><br> <b>To: </b>"Vojtech Szocs" <vszocs@redhat.com>, "engine-devel" <en= gine-devel@ovirt.org><br> <b>Sent: </b>Monday, October 22, 2012 5:25:53 PM<br> <b>Subject: </b>RE: [Engine-devel] UI Plugins: PoC patch revision 6 now ava= ilable</span><span style=3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">Hi Vojtech,</span><span s= tyle=3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span><span style= =3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">Thanks again for the deli= very of the patch. For revision 7, do you have a list of content? I had pre= viously indicated I could work on adding the plugin API to launch a dialog, but hadn=E2=80=99t been able to get started on it unti= l now. I wanted to see if you by chance were already working on it or if yo= u were planning to deliver that yourself in the next revision?</span><span = style=3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span><span style= =3D"color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">A couple of other items w= e are looking for are the ability to add tasks for execution and get access= to the session ID or some kind of authentication token so that we can make calls from our server into the REST API. I=E2=80=99m n= ot very familiar yet with the REST API so I=E2=80=99m not sure what authent= ication methods are available and which would be best.</span><span style=3D= "color:black"></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span><span style= =3D"color:black"></span></p> <div> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D">-Chris</span><span style= =3D"color:black"></span></p> </div> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1F497D"> </span><span style= =3D"color:black"></span></p> <div> <div style=3D"border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in = 0in 0in"> <p class=3D"MsoNormal"><b><span style=3D"font-size:10.0pt;font-family:"= ;Tahoma","sans-serif";color:black">From:</span></b><span sty= le=3D"font-size:10.0pt;font-family:"Tahoma","sans-serif"= ;;color:black"> engine-devel-bounces@ovirt.org [mailto:engine-devel-bounces= @ovirt.org] <b>On Behalf Of </b>Vojtech Szocs<br> <b>Sent:</b> Thursday, October 18, 2012 10:49 AM<br> <b>To:</b> engine-devel<br> <b>Subject:</b> [Engine-devel] UI Plugins: PoC patch revision 6 now availab= le</span><span style=3D"color:black"></span></p> </div> </div> <p class=3D"MsoNormal"><span style=3D"color:black"> </span></p> <div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black">Hi guys,<br> <br> the latest revision of UI Plugins proof-of-concept patch is now available f= or you to experiment with. You can download the patch from oVirt Gerrit at <a href=3D"http://gerrit.ovirt.org/#/c/8120/2" target=3D"_blank">http://ger= rit.ovirt.org/#/c/8120/2</a> (patch set 2).<br> <br> Please read on to learn what's new in this revision. If you have any commen= ts, questions or ideas, please let me know!</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal"><span style=3D"color:black"><br> <strong>0. UI plugin path information resolved using local Engine configura= tion</strong><b><br> </b><br> Server-side UI plugin infrastructure now uses local (machine-specific) Engi= ne configuration instead of global (<em>vdc_options</em> database table) En= gine configuration:</span></p> <ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l4 level1 lfo2"> Previously, path information was resolved through org.ovirt.engine.core.com= mon.config.Config class - Engine configuration values were retrieved from <i>vdc_options</i> database table.</li><li class=3D"MsoNormal" style=3D"col= or:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l4 lev= el1 lfo2"> Currently, path information is resolved through org.ovirt.engine.core.utils= .LocalConfig class - Engine configuration values are retrieved from local f= ile system.</li></ul> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black">In case you're not working with oVirt Engine through RPM package sys= tem, e.g. you have a local development environment set up and you build and= deploy oVirt Engine through Maven, please follow these steps:<br> <br> a. Copy default Engine configuration into /usr/share/<b>ovirt-engine</b>/co= nf</span></p> <div style=3D"margin-left:30.0pt"> <p class=3D"MsoNormal"><span style=3D"font-family:"Courier New";c= olor:black"># mkdir -p /usr/share/ovirt-engine/conf<br> # cp <OVIRT_HOME>/backend/manager/conf/engine.conf.defaults /usr/shar= e/ovirt-engine/conf/engine.conf.defaults</span><span style=3D"color:black">= </span></p> </div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> b. If necessary, copy UI plugin data files from /usr/share/engine/ui-plugin= s to /usr/share/<b>ovirt-engine</b>/ui-plugins<br> <br> c. If necessary, copy UI plugin config files from /etc/engine/ui-plugins to= /etc/<b>ovirt-engine</b>/ui-plugins<br> <br> d, In case you want to override the default Engine configuration, put your = custom property file into /etc/sysconfig/ovirt-engine<br> <br> The reason behind this change is that path information for UI plugin data a= nd configuration is typically machine-specific, and should be customizable = per machine through Engine local configuration.</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal"><span style=3D"color:black"><br> <b>1. New plugin API function: addMainTabActionButton<br> </b><br> The "addMainTabActionButton" API adds custom context-sensitive button to th= e given main tab's data grid, along with corresponding data grid context me= nu item.<br> <br> </span><span style=3D"font-family:"Courier New";color:black">addM= ainTabActionButton(entityTypeName, label, actionButtonInterface)<br> </span><span style=3D"color:black"><br> <i>entityTypeName</i> indicates which main tab's data grid the button shoul= d be added to, according to the entity type associated with the main tab.<i= the given interface must implement all methods declared by that interface = (unless it's an abstract class, but this isn't relevant in our case).<br> <br> In contrast with traditional class-based object-oriented languages, JavaScr= ipt supports OOP through prototype-based programming model (<a href=3D"http= s://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-Orie= nted_JavaScript" target=3D"_blank">https://developer.mozilla.org/en-US/docs= /JavaScript/Introduction_to_Object-Oriented_JavaScript</a>). At the same time, JavaScript language is dynamically-typed and therefore d= oesn't support traditional concept of interface in OOP, it uses "duck typin= g" technique instead (<a href=3D"http://en.wikipedia.org/wiki/Duck_typing" = target=3D"_blank">http://en.wikipedia.org/wiki/Duck_typing</a>).<br> <br> The simplest way to provide an object that "implements the given interface"= in JavaScript is to use "duck typing" technique: providing an object that = contains well-known functions. In UI plugin infrastructure, I call this con= cept "interface object", represented by org.ovirt.engine.ui.webadmin.plugin.jsni.JsInterfaceObject class. Unlik= e the traditional concept of interface abstract type in object-oriented lan= guages, an "interface object" <u>does not necessarily have to declare all functions of the given interfac= e</u> in order to "implement" such interface. In fact, an empty object can = be used as a valid "interface object". Missing functions will be simply tre= ated as empty (no-op) functions. Furthermore, an "interface object" can "implement" multiple interfaces by = declaring functions of those interfaces (interface composition).<br> <br> Getting back to "addMainTabActionButton" API, here's a sample code that add= s new button to "Host" main tab data grid, as part of UiInit event handler = function:<br> <br> </span><span style=3D"font-family:"Courier New";color:black">UiIn= it: </span><b><span style=3D"font-family:"Courier New";color:#990= 000">function</span></b><span style=3D"font-family:"Courier New";= color:black">() {<br> api.</span><span style=3D"font-family:"Courier New&= quot;;color:#CC33CC">addMainTabActionButton</span><span style=3D"font-famil= y:"Courier New";color:black">('Host', 'Single-Host Action',<br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Action button interface object<= br> // All functions receive current= ly selected item(s) as function arguments<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; {</span><span style=3D"color:black">= <br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Called when the u= ser clicks the button</span><span style=3D"color:#006600"><br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; </span><span style=3D"font-= family:"Courier New";color:#000099">onClick</span><span style=3D"= font-family:"Courier New";color:black">: </span><b><span style=3D"font-family:"Courier New";color:#990000"= p;  = ; window.alert('Selected host entity ID =3D ' + arguments[0].entityId);<br> },</span><span style=3D= "color:black"><br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Returning 'true' means= the button is enabled (clickable)</span><span style=3D"color:#006600"><br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Returning 'false' mean= s the button is disabled (non-clickable)<br> // Defau= lt value =3D 'true'<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; </span><span style=3D"font-= family:"Courier New";color:#000099">isEnabled</span><span style= =3D"font-family:"Courier New";color:black">: </span><b><span style=3D"font-family:"Courier New";color:#990000"= p;  = ; </span> <b><span style=3D"font-family:"Courier New";color:#990000">return= </span></b><span style=3D"font-family:"Courier New";color:black">= arguments.length =3D=3D 1;<br> },</span><span style=3D"colo= r:black"><br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Returning 'true' means= the button is visible<br> // Retur= ning 'false' means the button is hidden<br> // Default value =3D 't= rue'<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; </span><span style=3D"font-famil= y:"Courier New";color:#000099">isAccessible</span><span style=3D"= font-family:"Courier New";color:black">: </span><b><span style=3D"font-family:"Courier New";color:#990000"= p;  = ; </span> <b><span style=3D"font-family:"Courier New";color:#990000">return= </span></b><span style=3D"font-family:"Courier New";color:black"> </span><b><span style=3D"font-family:"Courier New";color:#990000"= style=3D"color:black"><br> </span><span style=3D"font-family:"Courier New";color:black"><br> }<br> <br> );<br> }</span><span style=3D"color:black"><br> <br> As mentioned above, all functions of an interface object are optional. For = functions expecting return value, default value is defined by UI plugin inf= rastructure. For example:</span></p> <ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l2 level1 lfo3"> onClick - no default value (no return value expected)</li><li class=3D"MsoN= ormal" style=3D"color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:a= uto;mso-list:l2 level1 lfo3"> isEnabled / isAccessible - default value "true" (boolean return value expec= ted)</li></ul> <p><span style=3D"color:black">Note: UI plugin infrastructure checks the ac= tual return value type, and uses default value in case the function returne= d something of wrong (unexpected) type.</span></p> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> In the example above, "currently selected item(s)" maps to JSON-like repres= entations of business entities currently selected in the corresponding data= grid. For now, the entity representation is quite simple and same for all = entity types:<br> <br> </span><span style=3D"font-family:"Courier New";color:black">{ en= tityId: "[BusinessEntityGuidAsString]" }<br> </span><span style=3D"color:black"><br> In future, we will create specific JSON-like representations for specific b= usiness entities, in compliance with Engine REST API entity structure.<br> <br> For a more extensive example of using "addMainTabActionButton" API, please = see the attached "addMainTabActionButton.html.example" file.</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal"><span style=3D"color:black"><br> <b>2. Improved plugin API function: addMainTab<br> </b><br> The "addMainTab" API was improved to address following issues:</span></p> <ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l1 level1 lfo4"> "addMainTab" can now be called at any moment during UI plugin runtime, give= n that the plugin is allowed invoke plugin API functions (plugin is either = INITIALIZING or IN_USE).<br> Previously, "addMainTab" worked reliably only when called from within UiIni= t event handler function.<br> Currently, it's possible to call "addMainTab" at any moment, e.g. from with= in some other event handler function (after UiInit has completed).</li></ul=
// label</span><span style=3D"font-family:"Courier New";color:bl= ack"><br> 'custom-host-sub-tab', </= span><span style=3D"font-family:"Courier New";color:#006600">// h= istoryToken</span><span style=3D"font-family:"Courier New";color:= black"><br> 'http://www.ovirt.org/', </span>= <span style=3D"font-family:"Courier New";color:#006600">// conten= tUrl<br> <br> </span><span style=3D"font-family:"Courier New";color:black">&nbs=
<ul type=3D"disc"> <li class=3D"MsoNormal" style=3D"color:black;mso-margin-top-alt:auto;mso-ma= rgin-bottom-alt:auto;mso-list:l0 level1 lfo5"> "addMainTab" now retains "active" tab (highlighted tab GUI).<br> "addMainTab" works by adding new tab component (GWTP presenter proxy) and r= efreshing main tab panel GUI by removing all related tabs and re-adding the= m again.<br> This logic is handled by org.ovirt.engine.ui.common.presenter.DynamicTabCon= tainerPresenter class, which makes sure that "active" tab is retained even = after main tab panel was refreshed.</li></ul> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black">Furthermore, custom main tab implementation now displays the content= of the given URL through HTML iframe element.</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> <b>3. Improved native JavaScript function handling</b> (GWT JSNI)<br> <br> This patch introduces org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction a= nd org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunctionResultHelper classes = providing Java abstraction for invoking native JavaScript functions. These = classes follow the general contract of "interface object" as mentioned above.<br> <br> JsFunctionResultHelper is particularly useful when dealing with functions w= hich are expected to return value of a certain type. Too bad standard GWT J= SNI classes don't provide such abstraction for working with native function= s out-of-the-box...</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> <b>4. ActionPanel and ActionTable type hierarchy refactoring</b> (related t= o "addMainTabActionButton" API)<b><br> </b><br> Previously, AbstractActionPanel and AbstractActionTable classes didn't impl= ement any reasonable interface that would allow other components (client-si= de UI plugin infrastructure) to depend on their functionality in a loosely-= coupled manner. This would make code that implements "addMainTabActionButton" API "ugly": main tab view in= terface would have to reference AbstractActionTable class directly. In MVP = design pattern, view interface should avoid referencing specific GWT Widget= classes directly.<br> <br> This patch introduces new interfaces for ActionPanel and ActionTable compon= ents while eliminating code redundancy (duplicate or unnecessary code).</sp= an></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> <b>5. ActionPanel type hierarchy refactoring</b> (related to "addMainTab" A= PI)<br> <br> Since org.ovirt.engine.ui.common.presenter.DynamicTabContainerPresenter def= ines new DynamicTabPanel interface that extends standard GWTP TabPanel inte= rface, some refactoring had to be done in related ActionPanel classes.<br> <br> This patch makes sure that both org.ovirt.engine.ui.common.widget.tab.Abstr= actTabPanel (widget) and org.ovirt.engine.ui.common.view.AbstractTabPanelVi= ew (view) support DynamicTabPanel interface.<br> <br> Note that for now, only main tab panel (org.ovirt.engine.ui.webadmin.sectio= n.main.presenter.MainTabPanelPresenter) supports dynamic tabs within its vi= ew.</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> <b>Where is addSubTab API function?</b><br> <br> Implementing "addSubTab" API requires some more changes, and I didn't want = to delay this PoC patch just because of it...<br> <br> Here's a sample code that illustrates proposed "addSubTab" API usage:<br> <br> </span><span style=3D"font-family:"Courier New";color:black">UiIn= it: </span><b><span style=3D"font-family:"Courier New";color:#990= 000">function</span></b><span style=3D"font-family:"Courier New";= color:black">() {<br> api.</span><span style=3D"font-family:"Courier New&= quot;;color:#CC33CC">addSubTab</span><span style=3D"font-family:"Couri= er New";color:black">('Host', </span><span style=3D"font-family:"Courier New";color:#006600">//= entityTypeName</span><span style=3D"font-family:"Courier New";co= lor:black"><br> 'Custom Host Sub Tab', &nbs= p; </span><span style=3D"font-family:"Courier New";color:#006600"= p; </span><span style=3D"font-family:&q= uot;Courier New";color:#006600;background:white">// Sub tab interface = object<br> // </span><span style=3D"font-fa= mily:"Courier New";color:#006600">All functions receive currently= selected item(s)<br> // within the main tab data grid= as function arguments</span><span style=3D"color:#006600"><br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; {</span><span style=3D"color:black">= <br> <br> </span><span style=3D"font-family:"Courier New";color:#006600">&n= bsp; // Returning 'true' means= the sub tab is visible<br> // Retur= ning 'false' means the sub tab is hidden<br> // Default value =3D 't= rue'<br> </span><span style=3D"font-family:"Courier New";color:black">&nbs= p; </span><span style=3D"font-famil= y:"Courier New";color:#000099">isAccessible</span><span style=3D"= font-family:"Courier New";color:black">: </span><b><span style=3D"font-family:"Courier New";color:#990000"=
function</span></b><span style=3D"font-family:"Courier New";colo= r:black">() {<br> &= nbsp; </span><b><span style=3D"font-family:"Courier New";color:#9= 90000">return</span></b><span style=3D"font-family:"Courier New";=
color:black"> arguments.length =3D=3D 1 && arguments[0].entityId = =3D=3D '<MyHostEntityId>';<br> }</span><span= style=3D"color:black"><br> </span><span style=3D"font-family:"Courier New";color:black"><br> }<br> <br> );<br> }</span><span style=3D"color:black"><br> <br> As part of "addSubTab" API implementation, I'll refactor custom main tab co= mponents, in order to use one "tab type" for both main and sub tabs.<br> <br> Currently, we have one (and only one) "tab type" - a tab that shows content= of the given URL through HTML iframe element.<br> <br> We could also create new "tab types", e.g. form-based tab that shows key/va= lue pairs (IMHO this could be quite useful for custom sub tabs).</span></p> <div class=3D"MsoNormal" style=3D"text-align:center" align=3D"center"><span= style=3D"color:black"> <hr size=3D"2" width=3D"100%" align=3D"center"> </span></div> <p class=3D"MsoNormal" style=3D"margin-bottom:12.0pt"><span style=3D"color:= black"><br> Let me know what you think!<br> <br> Cheers,<br> Vojtech</span></p> </div> </div> <p class=3D"MsoNormal"><span style=3D"color:black"> </span></p> </div> </div> <p class=3D"MsoNormal"><span style=3D"color:black"> </span></p> </div> </div>
</div><br></div></body></html> ------=_Part_11978288_1878523335.1351103614438--
participants (4)
-
Itamar Heim
-
Morrissey, Christopher
-
Oved Ourfalli
-
Vojtech Szocs