Skip navigation.

Extending the Administration Console

  Previous Next vertical dots separating previous/next from contents/index/pdf Contents View as PDF   Get Adobe Reader

Adding Portlets and Navigation Controls

In the Administration Console, all content is contained within portlets, so even the most minimal extension must define a portlet (and content for the portlet). You can add your portlet directly to the desktop, but if you want your portlet to display as a tab or subtab in the ContentBook, you must define books or pages to contain it. Your extension can also add a node to the NavTreePortlet, which enables users to navigate to your portlet directly from the desktop.

This section describes how to add portlets that contain simple, static content to the Administration Console. For information on adding portlets with dynamic content, such as portlets that launch Apache Struts actions, see Creating Portlets That Match the Administration Console.

Figure 4-1 illustrates the process. The steps in the process, and the results of each are described in Table 4-1. Subsequent sections detail each step in the process.

Figure 4-1 Adding Portlets and Navigation Controls Development Overview

Adding Portlets and Navigation Controls Development Overview


 

Table 4-1 Model MBean Development Tasks and Results

Step

Description

Result

1. Define a Portlet.

Create an XML file to define a portlet that the portal framework can instantiate. A portlet definition includes instructions on which type of data to load: JSPs, HTML files, Struts actions, or Beehive Page Flows.

The portal's Look and Feel determines whether the portlet provides borders and minimize/maximize controls.

A .portlet XML file.

2.Define UI Controls (Optional).

If you want your portlet to display in a tab, subtab, or in some other location within ContentBook, create an XML file that defines a page or book.

A .pinc XML file.

3. Add Nodes to the Domain Structure Portlet (Optional).

You can create a link from the NavTreePortlet to any book or page in your extension.

WebLogic Server provides default support for appending control names to the end of the existing navigation tree. If you want to insert nodes in specific locations, or if you want to create a node tree, you create your own Java classes that describe the node and node location.

Additional entries in the .pinc XML file.

Optionally, Java classes that give you more control over the node that you are adding.

4. Specify a Location for Displaying Portlets or UI Controls.

Create an XML file that describes whether you want your portal to display next to a labeled UI control or to replace the control.

A netuix-extension.xml file.

5. Archive and Deploy the Extension.

Organize your extension files into a standard Web application directory structure. Then archive the directory tree as a JAR file and copy it to your domain's console-ext directory.

A JAR file that automatically deploys.

 


Define a Portlet

To create .portlet XML file that defines a portlet:

  1. Create a development directory that will serve as the root of your Administration Console extension. Consider creating a subdirectory to contain all of the portlet XML files in your extension. For example, dev-dir/PortalConfig
    where dev-dir is your development directory.
  2. Subsequent sections will instruct you to add other files and directories to your development directory. For more information, see Archive and Deploy the Extension.

  3. Copy the code from Listing 4-1 and paste it into a new text file in dev-dir/portlets or some other directory below dev-dir.
  4. Consider using the following naming convention:
    content-name.portlet

    where content-name is the name of a JSP or HTML file that the portlet contains. For example, if the portlet contains a JSP file named monitorEJB.jsp, then name the portlet XML file monitorEJB.portlet.

  5. Replace the values in Listing 4-1 as follows:
  6. For more information about portlet XML files, see the Portal Support Schema Reference.

Listing 4-1 Template for a Simple .portlet XML File

<?xml version="1.0" encoding="UTF-8"?>
<portal:root xmlns:html="http://www.w3.org/1999/xhtml-netuix-modified/1.0.0"
   xmlns:portal="http://www.bea.com/servers/netuix/xsd/portal/support/1.0.0"
   xmlns:netuix="http://www.bea.com/servers/netuix/xsd/controls/netuix/1.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.bea.com/servers/netuix/xsd/portal/
      support/1.0.0 portal-support-1_0_0.xsd">
   <netuix:portlet definitionLabel="Label" title="Title" >
      <netuix:content>
         <netuix:jspContent contentUri="URI"/>
      </netuix:content>
   </netuix:portlet>
</portal:root>

 


Define UI Controls (Optional)

The ContentBook is made up of a hierarchy of books and pages. All portlets in ContentBook display within a book or a page, and if you want to add portlets to the ContentBook, you must create a book or page that conforms to the existing hierarchy:

Save the definitions of your books and pages in one or more portal include (.pinc) files. Create one .pinc file for each hierarchical grouping of controls. For example, create one .pinc file for a book that creates a top-level tab and its subtabs. Create another .pinc file for a page that adds a subtab to an existing WebLogic Server tab. The root element of a.pinc file (portal:root) can have only one direct child element; the child element can have multiple children.

The following sections describe creating books and pages:

Create a Top-Level Tab That Contains a Subtab

To create a portal include (.pinc) XML file that defines a top-level tab and one subtab:

  1. Copy the code from Listing 4-2 and paste it into a new text file. Save the file in a directory below dev-dir.
  2. For example, dev-dir/PortalConfig/MyApp.pinc
    where dev-dir is your development directory. For more information, see Archive and Deploy the Extension.

  3. Replace the values in Listing 4-2 as follows:
  4. To create additional subtabs, add netuix:page elements as siblings to the netuix:page element in Listing 4-2.

For more information about portal include XML files, see the Portal Support Schema Reference.

Note the use of the following elements in the .pinc file:

Listing 4-2 Template for a .pinc File That Defines a Top-Level Tab with Subtabs

<?xml version="1.0" encoding="UTF-8"?>
<portal:root
   xmlns:netuix="http://www.bea.com/servers/netuix/xsd/controls/netuix/1.0.0"
   xmlns:html="http://www.w3.org/1999/xhtml-netuix-modified/1.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:portal="http://www.bea.com/servers/netuix/xsd/portal/support/1.0.0"
   xsi:schemaLocation="http://www.bea.com/servers/netuix/xsd/portal/support
      /1.0.0 portal-support-1_0_0.xsd">
   <netuix:book markupName="book" markupType="Book"
      definitionLabel="Book-Label" title="Book-Title">
      <netuix:singleLevelMenu markupType="Menu" markupName="singleLevelMenu"
         skeletonUri="singlelevelmenu_children.jsp"/>
      <netuix:meta name="skeleton-resource-bundle" content="Bundle"/>
      <netuix:content>
         <netuix:page markupName="page" markupType="Page"
            definitionLabel="Page-Label" title="Page-Title"
            skeletonUri="/framework/skeletons/default/wlsworkspace/
               page_content.jsp">
            <netuix:meta name="Metadata-Type" content="Metadata-ID"/>
            <netuix:meta name="breadcrumb-context" content="handle"/>
            <netuix:meta name="skeleton-resource-bundle" content="Bundle"/>
            <netuix:content>
               <netuix:gridLayout columns="1" markupType="Layout"
                  markupName="singleColumnLayout">
                  <netuix:placeholder flow="vertical" markupType="Placeholder"
                     markupName="singleColumn_columnOne">
                     <netuix:portletInstance markupType="Portlet"
                        title="Portlet-Instance-Title"
                        instanceLabel="Portlet-Instance-Label"
                        contentUri="Portlet-URI"/>
                  </netuix:placeholder>
               </netuix:gridLayout>
            </netuix:content>
         </netuix:page>
         <!-- Add additional netuix:page elements here -->
      </netuix:content>
   </netuix:book>
</portal:root>

Create a Top-Level Tab That Does Not Contain a Subtab

To create a portal include (.pinc) XML file that defines a top-level tab and no subtabs (such as Domains: Notes):

  1. Copy the code from Listing 4-3 and paste it into a new text file.
  2. For example, dev-dir/PortalConfig/MyApp.pinc
    where dev-dir is your development directory. For more information, see Archive and Deploy the Extension.

  3. Replace the values in Listing 4-3 as follows:

Note that Listing 4-3 defines a page, not a book, so the Administration Console Look and Feel will render the page as a tab with no subtabs.

Listing 4-3 Template .pinc File that Creates a Top-Level Tab with No Subtabs

<?xml version="1.0" encoding="UTF-8"?>
<portal:root
   xmlns:netuix="http://www.bea.com/servers/netuix/xsd/controls/netuix/1.0.0"
   xmlns:html="http://www.w3.org/1999/xhtml-netuix-modified/1.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:portal="http://www.bea.com/servers/netuix/xsd/portal/support/1.0.0"
   xsi:schemaLocation="http://www.bea.com/servers/netuix/xsd/portal/support
      /1.0.0 portal-support-1_0_0.xsd">
   <netuix:page markupName="page" markupType="Page"
      definitionLabel="Page-Label" title="Page-Title"
      skeletonUri="/framework/skeletons/default/wlsworkspace/
         page_content.jsp">
         <netuix:meta name="skeleton-resource-bundle" content="Bundle"/>
         <netuix:content>
            <netuix:gridLayout columns="1" markupType="Layout"
               markupName="singleColumnLayout">
            <netuix:placeholder flow="vertical" markupType="Placeholder"
               markupName="singleColumn_columnOne">
               <netuix:portletInstance markupType="Portlet"
                  title="Portlet-Instance-Title"
                  instanceLabel="Portlet-Instance-Label"
                  contentUri="Portlet-URI"/>
            </netuix:placeholder>
         </netuix:gridLayout>
      </netuix:content>
   </netuix:page>
</portal:root>

Create a Subtab in a WebLogic Server Top-Level Tab

To add a subtab to an existing WebLogic Server tab, use the same code from Listing 4-3.

The location that you specify for the control determines whether the Administration Console renders it as a top-level tab or a subtab. For example, if you specify that the control is a child of the DomainConfigGeneralPage book, then it displays as a subtab of the Domains: Configuration tab. If you specify that the control is a child of the CoreDomainConfigGeneralBook book, then it displays as a top-level tab and a sibling of the Domains: Configuration tab.

See Specify a Location for Displaying Portlets or UI Controls.

Create a Control Without Tabs or Subtabs

There is no requirement for books and pages in ContentBook to be accessible by tab or subtab. Many WebLogic Server pages that display summary tables are accessible from the NavTreePortlet but not from the tabbed interface (see Figure 2-4).

Any of the code listings in the previous sections can be located in a parent control that does not render tabs or subtabs for its children. See Specify a Location for Displaying Portlets or UI Controls.

Navigating to a Custom Security Provider Page

If you created a custom security provider and used WebLogic MBeanMaker to create MBeans to manage your provider, the Administration Console automatically generates pages to display the provider's configuration data. It also generates a link to your provider pages from the Security: Providers table.

However, you can create your own pages to customize this display. If you create your own pages, you need to redirect the link in the Security: Providers table from the pages that the Administration Console generates to your custom pages.

To redirect the link, include the following element as a child of your page's <netuix:page> element:

<netuix:meta type="configuration" content="MBean-class-name"/>

where MBean-class-name is the fully qualified name of your provider's MBean class.

For example:

<netuix:page markupName="page" markupType="Page"
   definitionLabel="SimpleSampleAuthorizerAuthorizerConfigCommonTabPage"
   title="tab.common.label"
   skeletonUri="/framework/skeletons/default/wlsworkspace
      /page_content.jsp">
   
<netuix:meta name="configuration"
   content="examples.security.providers.authorization.simple.
      SimpleSampleAuthorizerMBean"/>
   <netuix:content>
...

 


Add Nodes to the Domain Structure Portlet (Optional)

You can create a link from the portlet whose user-visible title is Domain Structure (NavTreePortlet) to any book or page in your extension. The following sections describe adding nodes to the NavTreePortlet:

Append a Single Node

To append a node that links to one of your book or page controls, add the following attribute and attribute value to the <netuix:book> or <netuix:page> element:
backingFile="com.bea.console.utils.NavTreeExtensionBacking"

For example:

<netuix:book definitionLabel="MyAppTableBook" title="MyApp.title"
   markupName="book"
   markupType="Book"
   backingFile="com.bea.console.utils.NavTreeExtensionBacking"
>

The NavTreePortlet displays the value of the book or page element's title attribute as the link text. If the title attribute value is a key in your message bundle, the NavTreePortlet displays the localized value mapped to the key.

If you specify this backingFile attribute and value for multiple controls in your extension, the NavTreePortlet appends each node entry in the order in which you have declared the controls in the NetUI Extension file.

Append or Insert Nodes or Node Trees

If you want to control the location in which your node is added to the NavTreePortlet, or if you want to add a node that contains other nodes (a node tree):

  1. Create a NavTreeBacking Java class.
  2. This class defines one or more nodes and specifies the location for your nodes. See Create a NavTreeBacking Class.

  3. Add the following attribute and attribute value to the <netuix:book> or <netuix:page> element in your portal include (.pinc) file:
    backingFile="your-NavTreeBacking-class"
  4. where your-NavTreeBacking-class is the fully-qualified name of the class you created in step 1.

    If your NavTreeBacking Java class creates a node tree, add the backingFile attribute to the control that is at the top of the node tree. For example, if you are adding a node tree for a book and its pages, add the backingFile attribute to the <netuix:book> element.

Create a NavTreeBacking Class

The Java class that defines your nodes must extend com.bea.console.utils.NavTreeExtensionBacking. This class is already available in the WebLogic Server runtime environment. However, for support in your development and compiling environment, you must add the following JARs to your environment's classpath:
WL_HOME/server/lib/consoleapp/webapp/WEB-INF/lib/console.jar
WL_HOME/server/lib/consoleapp/webapp/WEB-INF/lib/netuix_servlet.jar

where WL_HOME is the location in which you installed WebLogic Server.

To create a NavTreeBacking class (see Listing 4-4):

  1. Extend com.bea.console.utils.NavTreeExtensionBacking.
  2. Override the NavTreeExtensionBacking.getTreeExtension(
    PageBackingContext ppCtx, String extensionUrl)
    method.
  3. The portal framework passes the ppCtx and extensionUrl parameter values to your NavTreeBacking class when it loads a control that contains the backingFile="your-NavTreeBacking-class" attribute.

    PageBackingContext is a class in the portal framework that contains data about a portal control and methods for retrieving the data. For example, it contains the value of a control's definitionLabel. The ppCtx instance that is passed describes the control that invoked the getTreeExtension() method. See com.bea.netuix.servlets.controls.page.PageBackingContext in the WebLogic Portal 8.1.4 API Reference.

    The extensionUrl value is a URL to the control that invoked the getTreeExtension() method.

    In your implementation of getTreeExtension():

    1. Construct a com.bea.jsptools.tree.TreeNode object for the node that you want to add.
    2. Use the following constructor for a parent node (or for a node that contains no children):
      TreeNode(String nodeId, String nodeName, String nodeUrl)
      where:

      nodeId is the value of the control's definitionLabel. You can use PageBackingContext.getDefinitionLabel() to get this value for the PageBackingContext instance that was passed as a parameter to your method. Alternatively, you can enter the definitionLabel value that is in the control's .pinc file.

      nodeName is the text that you want to display in the NavTreePortlet.

      nodeURL is a URL to the control. Supply extensionUrl as the value of this parameter.

    3. If you want to add a tree of nodes, construct additional TreeNode objects as children of the top TreeNode.
    4. For each child node, use the following constructor:
      TreeNode(String nodeId, String nodeName,
         String
      nodeUrl, TreeNode parent)
      where:

      nodeId is the value of the control's definitionLabel. You can not use PageBackingContext.getDefinitionLabel() to get this value because the PageBackingContext available to this method is for the parent node. Instead, you must enter the definitionLabel value that is in the control's .pinc file.

      nodeName is the text that you want to display in the NavTreePortlet.

      nodeURL is a URL to the control. Supply the following value:
      ?_nfpb=true&_pageLabel=definitionLabel
      where definitionLabel is the definitionLabel of the page or book to which you want to link.

      parent is any TreeNode that you have constructed. You can create multiple levels in your node tree by specifying a parent that is a child of node higher up in the hierarchy.

    5. Pass the parent TreeNode object to the constructor for com.bea.console.utils.NavTreeExtensionEvent.
    6. The event is broadcast to a listener in the NavTreePortlet.

      Use the following constructor:
      NavTreeExtensionEvent(String pageLabel, String url,
         String
      parentPath, TreeNode node, int ACTION)
      where:

      pageLabel is the same nodeID value that you used when constructing the TreeNode object for the parent node.

      url is the same nodeURL value that you used when constructing the TreeNode object for the parent node.

      parentPath is the name of the node under which you want your node to display. Use / (slash) to represent the root of the navigation tree in the NavTreePortlet.

      For example, if you want your node or node tree to display at the top level, specify /. If you want your node to display as a child of Environments, specify /Environments.

      node is the parent TreeNode that you created in step a.

      ACTION is NavTreeExtensionEvent.APPEND_ACTION. For information about other possible actions, see NavTreeExtensionEvent in the WebLogic Portal 8.1.4 API Reference.

    7. Return the NavTreeExtensionEvent object that you constructed.
  4. Save the compiled class in a package structure under your extension's WEB-INF/classes directory.

Listing 4-4 Example NavTreeExtensionBacking Class

package com.mycompany.consoleext;
import com.bea.netuix.servlets.controls.page.PageBackingContext;
import com.bea.jsptools.tree.TreeNode;
import com.bea.console.utils.NavTreeExtensionBacking;
import com.bea.console.utils.NavTreeExtensionEvent;
public class CustomNavTreeExtension extends NavTreeExtensionBacking {
   public NavTreeExtensionEvent getTreeExtension(PageBackingContext ppCtx,
      String extensionUrl){
     /*
      * Construct a TreeNode for the control that has invoked this method.
      */
      TreeNode node = new TreeNode(ppCtx.getDefinitionLabel(),
         ppCtx.getDefinitionLabel(),extensionUrl);
     /*
      * Construct a child TreeNode.
      */
      TreeNode node1 = new TreeNode("MyAppGeneralTabPage",
         "MyApp General",
         "?_nfpb=true&_pageLabel=MyAppGeneralTabPage",node);
     /*
      * Add the parent node (which includes its child) below the
      * Environment node in the NavTreePortlet.
      */
      NavTreeExtensionEvent evt =
        new NavTreeExtensionEvent(ppCtx.getDefinitionLabel(),extensionUrl,
        "/Environment",node, NavTreeExtensionEvent.APPEND_ACTION);
      return evt;
   }
}

 


Specify a Location for Displaying Portlets or UI Controls

All locations for displaying your portlets or UI controls must be specified as relative to existing controls in the Administration Console. For example, you can specify that your portlet displays on the desktop below the System Status portlet.

The following sections describe how to specify a location for your portlets or UI controls:

Deploy a Development Look and Feel to See UI Control Labels

Most of the Administration Console UI controls are identified by a definitionLabel, and it is this value that you use for relative positioning of your UI control. WebLogic Server provides a Look and Feel that reveals the labels in the Administration Console user interface.

Note: If you plan only to add a portlet to the desktop, you do not need to deploy the development Look and Feel.

To use this Look and Feel:

  1. Download the Look and Feel archive from Code Library on the dev2dev Web site.
  2. Save the Look and Feel archive (devlaf-1.0.jar) in domain-root/console-ext
    where domain-root is the root directory of a domain in your development environment.
  3. Restart the domain's Administration Server.
  4. Log in to the Administration Console.

Each labeled control displays the value of its definitionLabel in brackets ([]) next to its user-visible title. In a separate pair of brackets, the control displays whether it is a book or a page. See Figure 4-2.

Figure 4-2 A Control Label in the Administration Console User Interface

A Control Label in the Administration Console User Interface


 

Create a NetUI Extension XML File

A NetUI Extension XML file (netuix-extension.xml) is the deployment descriptor for your extension. It declares each parent UI control in your extension and the location in which you want it to display. For more information, see the NetUI Extensions Schema Reference.

To create a NetUI Extension XML file (see Listing 4-5):

  1. Create an XML file named netuix-extension.xml and save it in
    dev-dir/WEB-INF
    where dev-dir is your development directory. For more information, see Archive and Deploy the Extension.
  2. Create a <weblogic-portal-extension> root element.
  3. (Optional) Create a <provider-info> element to describe your extension.
  4. This element is for your information only. The portal framework does not use the data in this element.

  5. Add the following element:
    <portal-file>/console.portal</portal-file>
  6. This required element specifies the name and relative location of the Administration Console's .portal file, which is the portal that you are extending.

  7. To add a portlet to the Administration Console desktop, create the following stanza:
  8. <page-extension>
       <page-location>
          <parent-label-location label="page"/>
          <page-insertion-point layout-location="0"
             placeholder-position="0"/>
       </page-location>
       <portlet-content
          content-uri="
    portlet-URI" title="title"
          orientation="top" default-minimized="false"
          instance-label="
    portlet-instance-label"/>
    </page-extension>

    where:

    You can change the values of the layout-location and placeholder-position attributes to change the location of your portlet. For more information, see the NetUI Extensions Schema Reference.

  9. To add a control that renders a tab, create the following stanza:
  10. <book-extension>
       <book-location>
          <parent-label-location label="
    Admin-Console-Book-Label"/>
          <book-insertion-point action="append"/>
       </book-location>
       <book-content content-uri="
    pinc-URI"/>
    </book-extension>

    where:

  11. To add a control that renders a subtab in an existing tab, create the same stanza as the previous step, where:
  12. Save the file as dev-dir/WEB-INF/netuix-extension.xml where dev-dir is the root directory of your extension.

Listing 4-5 Example netuix-extension.xml File

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-portal-extension
   xmlns="http://www.bea.com/servers/portal/weblogic-portal/8.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.bea.com/servers/portal/weblogic-portal/
      8.0 netuix-extension-1_0_0.xsd">
   <provider-info>
      <title>My Extension</title>
      <version>1.0</version>
      <description>Inserts a portlet on the desktop, a tab next to
           Domains:Configuration, and a subtab under Domains: Configuration.
      </description>
      <author>Me</author>
      <last-modified>02/03/2005</last-modified>
      <support-url>http://www.mycompany/support/index.jsp</support-url>
   </provider-info>
   <portal-file>/console.portal</portal-file>
   <!--Adds a portlet to the console desktop -->
   <page-extension>
      <page-location>
         <parent-label-location label="page"/>
         <page-insertion-point layout-location="0" placeholder-position="0"/>
      </page-location>
      <portlet-content content-uri="/portlets/desktop/desktop_view.portlet"
         title="My App Status" orientation="top" default-minimized="false"
          instance-label="PortletExtensionInstanceLabel"
      />
   </page-extension>
   <!--Adds a tab to the Domain tabs -->
   <book-extension>
      <book-location>
         <parent-label-location label="CoreDomainConfigGeneralBook"/>
         <book-insertion-point action="append"/>
      </book-location>
      <book-content content-uri="/page/page.pinc"/>
   </book-extension>
<!-- Adds a subtab to the Domain: Configuration tab-->
   <book-extension>
      <book-location>
         <parent-label-location label="DomainconfigTabPage"/>
         <book-insertion-point action="append"/>
      </book-location>
      <page-content content-uri="/page/notespage.pinc"/>
   </book-extension>
</weblogic-portal-extension>

 


Archive and Deploy the Extension

To archive and deploy your extension:

  1. Arrange your XML files, JSPs, Java classes in a directory tree that meets the requirements of a Web application.
  2. For example, the netuix-extension.xml file, which is the deployment descriptor for your extension, must be in a directory named:
    root-dir/WEB-INF

    If you are using a Java class to add nodes to the NavTreePortlet, the package structure must start in the following directory:
    root-dir/WEB-INF/classes

    If you are using a message bundle, the properties files must be in the following directory:
    root-dir/WEB-INF/classes

    All other resources can be in any directory structure that you choose, as long as it is below the extension's root directory (and as long as relative links from the netuix-extension.xml file and other XML files are correct).

  3. Archive your extension directory into a JAR file. The name of the JAR file has no programmatic significance, so choose a name that is descriptive for your purposes.
  4. The contents of your root-dir directory must be the root of the archive; the root-dir directory name itself must not be in the archive. If you use the Java jar command to create the archive, enter the command from the root-dir directory. For example:
    c:\root-dir\> jar -cf my-extension.jar *

  5. Copy the JAR file into each domain's domain-dir/console-ext directory, where domain-dir is the domain's root directory.
  6. Restart the Administration Server for each domain.

Error Output During Deployment

If the Administration Console encounters deployment errors, it outputs error and warning messages to standard out and to the Administration Server's server log file.

If you do not see error or warning messages and you do not see your extension in the Administration Console, you might have named the wrong parent UI control in your netuix-extension.xml file. For example, if you name a parent UI control that does not render tabs for its children, then your extension is deployed but there is no menu control for accessing it.

 

Skip navigation bar  Back to Top Previous Next