PK %mUIoa,mimetypeapplication/epub+zipPK%mUIMETA-INF/container.xml PKYuPK%mUIOEBPS/frm_layout.htm How to Control Form Layout

5 How to Control Form Layout

Data and form elements in an Oracle Application Express application are placed on a page using containers called regions. There are several attributes that control the placement and positioning of regions on pages. In turn, you control the placement and style of form elements (called items) inside of regions using item attributes.

In this tutorial, you create the underlying data objects for a data input form by running a script. Then, you create a data input form and learn how to change the form layout by altering region and item attributes.

This section contains the following topics:

Creating a Table and Data Input Form

The first step in creating a data input form is to create the underlying data objects. In this exercise, you create a table named HT_EMP and then use a wizard to create a new page.

Topics in this section include:

Create the HT_EMP Table

First, you create a new table by running a script in SQL Scripts.

To create the HT_EMP table and the appropriate associated objects:

  1. On the Workspace home page, click SQL Workshop and then SQL Scripts.

    The SQL Scripts home page appears.

  2. Click Create.

    The Script Editor appears.

  3. In Script Name, enter HT_EMP.

  4. In the Script Editor, enter the following data definition language (DDL):

    CREATE TABLE ht_emp (
       emp_id                 NUMBER       primary key,
       emp_first_name         VARCHAR2(30) not null,
       emp_middle_initial     VARCHAR2(1),
       emp_last_name          VARCHAR2(45) not null,
       emp_part_or_full_time  VARCHAR2(1)  not null check (emp_part_or_full_time in ('P','F')),
       emp_salary             NUMBER,
       emp_dept               VARCHAR2(20) check (emp_dept in ('SALES','ACCOUNTING',
    
    'MANUFACTURING','HR')), 
       emp_hiredate           DATE,
       emp_manager            NUMBER       references ht_emp,
       emp_special_info       VARCHAR2(2000),
       emp_telecommute        VARCHAR2(1) check (emp_telecommute in ('Y')),
       rec_create_date        DATE         not null,
       rec_update_date        date)
    /
     
    INSERT INTO ht_emp
       (emp_id, emp_first_name, emp_middle_initial, emp_last_name, emp_part_or_full_time, emp_salary, emp_dept, emp_hiredate, emp_manager, emp_special_info, emp_telecommute, rec_create_date)
    VALUES
       (1,'Scott','R','Tiger','F',
        100000,'SALES',sysdate,null,'cell phone number is xxx.xxx.xxxx
    home phone is yyy.yyy.yyyy','Y',
        SYSDATE)
    /
     
    CREATE SEQUENCE ht_emp_seq
       start with 2
    /
     
    CREATE OR REPLACE TRIGGER bi_ht_emp
          BEFORE INSERT ON ht_emp
          FOR EACH ROW
       BEGIN
          SELECT ht_emp_seq.nextval
            INTO :new.emp_id
            FROM DUAL;
          :new.rec_create_date := SYSDATE;
       END;
    /
     
    CREATE OR REPLACE TRIGGER bu_ht_emp
          BEFORE UPDATE ON ht_emp
          FOR EACH ROW
       BEGIN
          :new.rec_update_date := SYSDATE;
       END;
    /
    
    
  5. Click Save.

    The script appears in the SQL Scripts Repository.

  6. Run the HT_EMP script:

    1. Click the HT_EMP script.

    2. Click Run.

    3. On the Run Script page, click Run again.

  7. From the View list, select Details and click Go.

    Figure 5-1 Details View in the Manage Script Results Page

    Description of Figure 5-1 follows

  8. Click the View Results icon to access the Results page.

    Red text indicates errors while executing the file.


See Also:

"Using SQL Scripts" in Oracle Database Application Express User's Guide.

Create a New Application

Next, create a new application.

To create an application:

  1. Return to the Workspace home page. Click the Home breadcrumb link at the top of the page.

  2. On the Workspace home page, click the Application Builder icon.

    The Application Builder home page appears.

  3. Click Create.

  4. Select Create Application and click Next.

  5. For Name, specify the following:

    1. Name - Enter Form Layout.

    2. Application - Accept the default.

    3. Create Application - Accept the default, From scratch.

    4. Schema - Select the schema where you installed the OEHR sample objects.

    5. Click Next.

      Next, you need to add pages. You have the option of adding a blank page, a report, a form, a tabular form, or a report and form. For this exercise, you add two blank pages.

  6. Add a blank page:

    1. Under Select Page Type, accept the default, Blank, as shown in Figure 5-2.

      Figure 5-2 Add Page

      Description of Figure 5-2 follows

    2. Click Add Page.

      The blank page appears at the top of the page.

  7. Click Next.

  8. For Tabs, accept the default, One Level of Tabs, and then click Next.

  9. For Copy Shared Components from Another Application, accept the default, No, and click Next.

  10. For Attributes, accept the defaults for Authentication Scheme, Language, and User Language Preference Derived From and then click Next.

  11. For User Interface, select Theme 12 and then click Next.

  12. Review your selections and click Create.

    The Application home page appears. Note that your application contains two pages.

Create a New Page Containing an Input Form

Next, create a new form using the Form on a Table or View Wizard.

To create a data input form:

  1. On the Application home page, click Create Page.

  2. For Page, select Form and click Next.

  3. On Create Page, select Form on a Table or View and click Next.

  4. For Table/View Owner, accept the default and click Next.

  5. For Table/View Name, select the HT_EMP table and click Next.

  6. For Page and Region Attributes:

    1. Page Number - Enter 2.

    2. Page Name - Enter Form Layout.

    3. Region Title - Enter Form Layout.

    4. Region Template - Accept the default.

    5. Breadcrumb - Accept the default.

    6. Click Next.

  7. For Tab, accept the default, Do not use tabs, and click Next.

  8. For Primary Key, accept the default and click Next.

    Note that the wizard reads the primary key from the database definition.

  9. For Source Type, accept the default Existing Trigger and click Next.

  10. For Select Columns, select all the columns. Press SHIFT, select the first column and then the last one. Then, click Next.

  11. For Process Options, accept the defaults and click Next.

  12. For Branching, enter 2 (the page you are creating) in both fields and click Next.

    Since this page is just for demonstration, you will not be utilizing branching.

  13. Click Finish.

  14. Click the Edit Page icon.

    The Page Definition for page 2 appears.

  15. Delete the following validation:

    • Under Page Processing, Validations, select P2_REC_CREATE_DATE not null.

    • Click Delete.

    You are removing this validation because the value of this column is set using a trigger. The item will have no value in the form for a new record. This validation was automatically created because the underlying database column is not null.

Run the Page

Once you create a new input form, the next step is to run the page.

To run the page from the Page Definition:

  1. Click the Run Page icon in the upper right corner as shown in Figure 5-3.

    Figure 5-3 Run Page Icon

    Description of Figure 5-3 follows

  2. If prompted for a user name and password, enter your workspace user name and password and click Login. See "About Application Authentication".

    The application appears.

As shown in Figure 5-4, the new form appears. Note that the form contains basic employee details and includes select lists, text areas, and display only items.

Figure 5-4 Employee Info Form

Description of Figure 5-4 follows

By default, the Primary Key column does not display since it is assumed that the primary key is system generated. In reality, the primary key is included in the page, but appears as a hidden item.

Notice that the page defaults with one item for each row and labels display to the left of the items. The item labels default to the column names with initial capitalization and with the underscores (_) replaced with spaces. You can override this default behavior by configuring user interface defaults for the table.


See Also:

"Managing User Interface Defaults" in the Oracle Database Application Express User's Guide.

Also notice that items based on date columns default to include a date picker. Lastly, notice that the Emp Special Info item was created as a text area because of the size of the base column. This item type is a better choice for large text items since it allows the input text to wrap.

Changing the Appearance of a Page by Altering Region Attributes

A region is an area on a page that serves as a container for content. You can alter the appearance of a page by changing the region attributes.

Topics in this section include:

Edit the Region Title

To edit the region title and other region level attributes:

  1. Click Edit Page 2 on the Developer toolbar.

  2. Under Regions, click Form Layout.

    The Region Definition appears.

  3. Change the Title to Employee Info.

  4. Click Apply Changes at the top of the page.

  5. From the Page Definition, click the Run Page icon in the upper right corner.

    Note the new region title.

Change the Display Point and Template

To change other region attributes:

  1. Return to the Page Definition. Click Edit Page 2 on the Developer toolbar.

  2. Under Regions, click Employee Info.

    The Region Definition appears.

  3. Scroll down to User Interface.

    You can control the position of a region within a page template by changing the page template.

  4. From Display Point, select Page Template Region Position 3.

    In this instance, your selection moves the region to the right side of the page. The region display points are determined by the page level template. If you do not select a page level template, Oracle Application Express uses the default page level template defined in the current theme. You can view specific positions by selecting the flashlight icon to the right of the Display Point list.

    Next, temporarily change the region template.

  5. From Template, select Borderless Region.

  6. Click Apply Changes at the top of the page.

  7. From the Page Definition, click the Run Page icon in the upper right corner.

    The form appears as shown in Figure 5-5.

    Figure 5-5 Employee Info Form with New Display Point and Template

    Description of Figure 5-5 follows

Note the changes in the appearance of the form. The form title displays in a dark color on a white background and has a rule beneath it. Also, note that there is no longer a border around the form.

Change the Region Attributes Back to the Original Selections

To return to the region template and display point to the original selections:

  1. Click Edit Page 2 on the Developer toolbar.

  2. Under Regions, select Employee Info.

  3. Scroll down to User Interface.

  4. From the Template list, select Form Region.

  5. From the Display Point List, select Page Template Body (3. Items above region content).

  6. Click Apply Changes at the top of the page.

Understanding How Item Attributes Affect Page Layout

An item is part of an HTML form. An item can be a text field, text area, password, select list, check box, and so on. Item attributes control the display of items on a page. Item attributes determine where a label displays, how large an item will be as well as whether the item displays next to or below a previous item. You can change multiple item labels at once on the Page Items summary page.

Topics in this section include:


See Also:

"Creating Items" in Oracle Database Application Express User's Guide.

Edit Item Attributes

To edit all item attributes:

  1. On the Page Definition for page 2, locate the Items section.

  2. Under Items, click the Edit All icon.

    The Edit All icon resembles a small grid with a pencil on top of it as shown in Figure 5-6.

    Figure 5-6 Edit All Icon

    Description of Figure 5-6 follows

    The Page Items summary page appears.

    You change how a page appears by editing the item attributes. Common item attribute changes include:

    • Changing item labels by editing the Prompt field.

    • Placing more than one item in certain rows to group like items together. For example, you could group all items that make up an employee's name.

    • Changing the item width. Many items display better when they have a width that is less than the maximum. To change the item width, enter a new value in the Width field.

    • Reordering the items. The initial order of items is based on the order of the columns in the table on which the region is based. To reorder items, enter a new value in the Sequence field.

  3. To see the how item attributes affect page layout, make the following changes:

    1. Change the values in the Prompt, New Line, and Width fields to match those in Table 5-1:

      Table 5-1 New Prompt, New Line, and Width Field Values

      Prompt FieldNew LineWidth

      Emp ID

      Yes

      30

      First Name

      Yes

      15

      Middle Initial

      No

      2

      Last Name

      No

      15

      Part or Full Time

      Yes

      2

      Salary

      Yes

      10

      Department

      Yes

      15

      Hire Date

      Yes

      10

      Manager

      No

      15

      Special Information

      Yes

      60

      Telecommute

      Yes

      2

      Record Create Date

      Yes

      10

      Record Update Date

      Yes

      10


    2. Click Apply Changes.

    3. Click the Run Page icon in the upper right corner of the page.

      Figure 5-7 Employee Info Form After Editing the Prompt, New Line, Width Attributes

      Description of Figure 5-7 follows

    As shown in Figure 5-7, note that some items are pushed too far to the right because of the width of the Special Information item. Oracle Application Express lays out regions as tables, and the width of each column is determined by the largest display width of the items in that column.

Fix Item Alignment

There are several approaches to fixing item alignment:

  • For the items Middle Initial, Last Name and Manager items, set New Field to equal No.

    This places the items directly after the items they follow, but in the same column. This approach is best used for positioning embedded buttons next to items. Note that this setting can make text items appear squashed.

  • Change the Column Span field of the Special Information item.

    For example, setting the Column Span for the Special Information item to 5 would enable multiple items to display above and below it. This change causes five items to display above Special Information (First Name, Middle Initial, and Last Name).

    Be aware, however, that using Column Span to fix the display of the name does not result in a consistent layout. The Manager item would still be in the same column as Middle Initial. Because the Manager item is larger than Middle Initial, Last Name would still be pushed too far to the right. To fix this, you could change the Column Span of the Manager item to 3 so it displays above Special Information.

  • Reset the column width in the middle of the region by adding an item of type Stop and Start HTML Table. This forces the close of an HTML table using the </table> tag and starts a new HTML table. Inserting a Stop and Start HTML Table item just after the Last Name item results in an even layout. Note that a Stop and Start HTML Table item only displays its label. You can prevent the label from displaying at all by setting it to null. To do this, you simply remove the defaulted label.

Add a Stop and Start HTML Table Item

You can use the Drag and Drop Layout page to interactively reorder items within a given region, change select item attributes, create new items, or delete existing items. For this exercise, you will reorder two items.

To add a Stop and Start HTML Table item:

  1. Click Edit Page 2 on the Developer toolbar.

  2. Under Items, click the Drag and drop icon as shown in Figure 5-8.

    Figure 5-8 Drag and Drop Icon

    Description of Figure 5-8 follows

    The Drag and Drop Layout page appears. This page is divided into the Item palette on the left and the Layout region on the right.

    Figure 5-9 Drag and Drop Layout Page

    Description of Figure 5-9 follows

  3. In the Item palette, select the Stop and start table icon and drop it after the row containing the P2_EMP_ID item:

    1. Move your mouse over the icons in the Item palette and locate the Stop and start table. Note that when you position the cursor over an item type, a tooltip appears.

      Figure 5-10 Stop and Start Table Item Type

      Description of Figure 5-10 follows

    2. Click the Stop and start table icon and drag it beneath of P2_EMP_ID.

    3. Click Next.

      A report appears. Note that the new Stop and Start HTML Table appears beneath P2_EMP_ID.

      Figure 5-11 Revised Drag and Drop Layout Page

      Description of Figure 5-11 follows

  4. Click Apply Changes.

Edit the Special Information Item

Items are laid out in HTML tables. Next, you need to edit the Column Span attribute for the Special Information item. The Column Span attribute defines the value to be used for the COLSPAN attribute in the table cell.

To edit the Special Information item:

  1. Under Items, click the Reorder Region Items icon.

    The Reorder Region Items icon resembles a light green down and up arrow as shown in Figure 5-12.

    Figure 5-12 Reorder Region Items Icon

    Description of Figure 5-12 follows

    The Reorder Region Items page appears in a separate window.

    Items on a page are laid out in tables. You can edit the position of an item by selecting values for the New Line, New Field, Column Span, and Label Alignment attributes. You can change the order in which items display by clicking the up and down arrows in the far right column. Also notice that a graphical representation of how the items display appears at the bottom of the page.

  2. For Special Information, change the Column Span to 3 and click Apply Changes.

  3. Click the Run Page icon in the upper right corner. The form appears as shown in Figure 5-13.

    Figure 5-13 Employee Info Form with Corrected Item Alignment

    Description of Figure 5-13 follows

Change a Region to Display-only

There are two columns in the HT_EMP table for auditing, Record Create Date and Record Update Date. Because the values of these columns are set with triggers, these columns should not be updatable by users. This exercise demonstrates how to make items display-only and then how to add them to their own region.

Topics in this section include:

Change Items to Display-only

To make the item P2_REC_CREATE_DATE display-only:

  1. Go to the Page Definition for page 2. Click Edit Page 2 on the Developer toolbar.

  2. Under Items, select the item P2_REC_CREATE_DATE.

  3. From the Display As list in the Name section, select Text Field (Disabled, saves state).

  4. Click Apply Changes.

To make the item P2_REC_UPDATE_DATE display-only:

  1. Go to the Page Definition for page 2.

  2. Under Items, select the item P2_REC_UPDATE_DATE.

  3. From the Display As list in the Name section, select Text Field (Disabled, saves state).

  4. Click Apply Changes.

    Next, create a new region and move the display-only items to the new region.

Create a New Region

To create a new region:

  1. Go to the Page Definition for page 2.

  2. Under Regions, click the Create icon.

  3. For Region:

    1. Identify the type of region to add to this page - Accept the default, HTML, and click Next.

    2. Select the type of HTML region container you wish to create - Accept the default, HTML, and click Next.

  4. For Display Attributes, enter Audit Information in the Title field, accept the remaining defaults, and click Next.

  5. Click Create Region.

Move Audit Items to the New Region

To move the items to the new region:

  1. Go to the Page Definition for page 2.

  2. Under Items, click the Edit All icon. The Edit All icon resembles a small grid with a pencil on top of it.

    The Page Items summary page appears.

  3. For P2_REC_CREATE_DATE and P2_REC_UPDATE_DATE:

    1. In the Prompt column, add a colon to the end of the label name.

    2. In the Region column, select Audit Information.

    3. Click Apply Changes.

  4. Click the Run Page icon in the upper right corner.

    Figure 5-14 demonstrates how these items would display in a running page.

    Figure 5-14 Audit Information Region

    Description of Figure 5-14 follows

Change the Region Template to Hide/Show Region

The Hide/Show Region template enables the user to click a plus (+) sign to expand the contents of the region or click a minus (-) sign to hide the contents. By changing the region template to Hide/Show Region, users can decide whether they want to see the Audit Information region.

To change the region template to Hide/Show Region:

  1. Go to the Page Definition for page 2.

  2. Under Regions, click Audit Information.

  3. Under User Interface, select Hide and Show Region from the Template list.

  4. Click Apply Changes.

  5. Click the Run Page icon in the upper right corner.

    Figure 5-15 demonstrates how Audit Information displays as a Hide/Show region. You can hide the region by clicking the icon to the right of the region title.

    Figure 5-15 Audit Information as a Hide/Show Region

    Description of Figure 5-15 follows

Adding a Region Header and Footer

Regions can have headers and footers. Headers and footers typically contain text or HTML that displays at either the top or bottom of the region.

To add a region footer:

  1. Go to the Page Definition for page 2. Click Edit Page 2 on the Developer toolbar.

  2. Under Regions, select Audit Information.

  3. Scroll down to Header and Footer.

  4. Enter the following in Region Footer:

    <i>The Record Create Date is the date that the record was initially entered in
    to the system. <br/>The Record Update Date is the date that the
    record was last updated.</i>
    
    
  5. Click Apply Changes.

  6. Click the Run Page icon in the upper right corner.

  7. Click the arrow next to Audit Information to display the two date fields and new footer text as shown in Figure 5-16.

    Figure 5-16 Audit Information Region with Footer

    Description of Figure 5-16 follows

As shown in Figure 5-16, the text of the footer is wrapped with the italic HTML tag and there is an imbedded break. Without the manual break, the text would take up the entire width of the region (as defined by region template).

Making a Region Conditional

To make a region conditional, you create a display condition for the Audit Information region so that it only displays if the Employee ID is not null. Since the Employee ID is set by a trigger, it only exists for records retrieved from the database. You can control the display of the Audit Information region by using a built-in condition that checks for the presence of a value for the item containing the Employee ID (that is, P2_EMP_ID)

To display the Audit Information region conditionally:

  1. Go to the Page Definition for page 2.

  2. Under Regions, select Audit Information.

    The Region Definition appears.

  3. Scroll down to Conditional Display.

  4. Under Conditional Display:

    1. From Condition Type, select Value of Item in Expression 1 is NOT NULL.

    2. In Expression 1, enter:

      P2_EMP_ID
      
      
  5. Click Apply Changes.

Adding a Region to Contain Hint Text

You have the option of displaying regions in columns as well as in rows. This exercise explains how to create another region to display explanatory text (hints) for the user.

To create a region to display hint text:

  1. Go to the Page Definition for page 2.

  2. Under Regions, click the Create icon.

  3. For Region:

    1. Identify the type of region to add to this page - Accept the default, HTML, and click Next.

    2. Select the type of HTML region container you wish to create - Accept the default, HTML, and click Next.

  4. For Display Attributes:

    1. Title - Enter Hint.

    2. Region Template - Select Sidebar Region.

    3. Display Point - Select Page Template Region Position 3.

    4. Sequence - Accept the default.

    5. Column - Select 3.

    6. Click Next.

  5. In Enter HTML Text Region Source, enter the following:

    Use this page to enter and<br/>
    maintain employee information.
    
    
  6. Click Create Region.

  7. Click the Run Page icon. Figure 5-17 shows the new Hint region on the page.

    Figure 5-17 Hint Region

    Description of Figure 5-17 follows

Changing Item Types

This exercise describes how to change item types to make data entry easier for the user. To change an item type, go to the Item attributes page and select another Display As option.

Topics in this section include:


Tip:

For simplicity, this tutorial has you alter items by editing item attributes. As a best practice, however, you can also create named LOVs and reference them.


See Also:

"Creating Lists of Values" in Oracle Database Application Express User's Guide

Change an Item to a Radio Group

Because the Part or Full-time item only has two valid choices, this item is a good candidate for either a check box or a radio group.

To change the Part or Full-time item to a radio group:

  1. Go to the Page Definition for page 2. Click Edit Page 2 on the Developer toolbar.

  2. Under Items, select P2_EMP_PART_OR_FULL_TIME.

    The Edit Page Item page appears.

  3. Locate the Name section. From the Display As list, select Radiogroup.

  4. Locate the Label section. Specify the following:

    1. Label - Remove the text in the Label field.

    2. Template - Select No Label.

  5. Under List of Values, create a static list of values. Specify the following:

    1. Named LOV - Select Select Named LOV.

    2. List of values definition - Enter:

      STATIC:Full-time;F,Part-time;P
      
      

    This definition will display as two radio buttons with the labels Full-time and Part-time, but the value being inserted into the database will be either F or P.

  6. At the top of the page, click Apply Changes.

  7. Click the Run Page icon in the upper right corner. The modified form appears as shown in Figure 5-18.

    Figure 5-18 Part or Full-time item Changed to a Radio Group

    Description of Figure 5-18 follows

    Notice that Full-time and Part-time displays as a radio group that is stacked in one column. You can have these buttons display side by side.

To display the Full-time and Part-time radio buttons side by side:

  1. Go to the Page Definition for page 2.

  2. Under Items, select P2_EMP_PART_OR_FULL_TIME.

  3. Scroll down to List of Values.

  4. In Number of Columns, enter 2.

  5. At the top of the page, click Apply Changes.

  6. Click the Run Page icon.

    By changing this setting to match the number of valid values (that is, Full-time and Part-time), the values display side by side as shown in Figure 5-19.

    Figure 5-19 Part or Full-time Item Displayed Side by Side

    Description of Figure 5-19 follows

Change an Item to a Select List

In the DDL you used to create the HT_EMP table, the Department is validated by a check constraint. You can implement the Department as a radio group, a select list, or a Popup LOV.

To change Department to a select list:

  1. Go to the Page Definition for page 2. Click Edit Page 2 on the Developer toolbar

  2. Under Items, select P2_EMP_DEPT.

  3. From the Display As list in the Name section, select Select List.

    The other Select List choices are for either redirecting the user to another page or URL based on the selection, or submitting the current page which is used when other information needs to be retrieved based upon the selection in the Select List.

  4. Scroll down to List of Values.

  5. Under List of Values, create a static list of values. Specify the following:

    1. Named LOV - Select Select Named LOV

    2. List of values definition - Enter:

      STATIC:SALES,ACCOUNTING,MANUFACTURING,HR
      
      
    3. From Display Null, select Yes.

    4. In Null display value, enter:

      - No Assignment -
      
      

      The last two selections take into account that the EMP_DEPT column can contain nulls. As a best practice, whenever you implement a select list and have a column that can be null, you should set Display Null to Yes. Failure to do so results in the item defaulting to the first item in the select list.

  6. At the top of the page, click Apply Changes.

  7. Click the Run Page icon.

    The revised form appears as shown in Figure 5-20.

    Figure 5-20 Department Changed to a Select List

    Description of Figure 5-20 follows

Change an Item to a Check Box

The item Telecommute is ideal for a check box. When you change the Display Type, you can also move it up on the page and place it next to the Full-time and Part-time radio group.

To change Telcommute to a check box:

  1. Go to the Page Definition for page 2. Click Edit Page 2 on the Developer toolbar.

  2. Under Items, select P2_EMP_TELECOMMUTE.

  3. From the Display As list in the Name section, select Checkbox.

  4. Under Displayed, specify the following:

    1. Sequence - Enter 136.

    2. Begin on New Line - Select Yes.

  5. Scroll down to List of Values.

  6. To have the label precede the check box, specify the following:

    1. Named LOV - Select Select Named LOV.

    2. List of values definition - Enter:

      STATIC:;Y
      
      

      This List of values definition displays the check box after the label, but will not display a value associated with the check box. If the check box is checked, the value passed to the database will be Y.

  7. At the top of the page, click Apply Changes.

  8. Click the Run Page icon.

    Note that the check box appears for Telecommute as shown in Figure 5-21.

    Figure 5-21 Telecommute Field Changed to Check Box

    Description of Figure 5-21 follows

About Label Templates

You can control the look of an item label by using a label template. You can view the templates associated with the current theme on the Page Definition.

To view templates associated with the current theme:

  1. Go to the Page Definition for page 2. Click Edit Page 2 on the Developer toolbar.

  2. Locate the Shared Components area and note the Theme section as shown in Figure 5-22.

    Figure 5-22 Templates and Theme

    Description of Figure 5-22 follows

    The current theme is Blue. In the Templates section, note that this theme includes two Label templates: Optional Label with Help and Required Label with Help.

    The Required with Help label template prepends a yellow asterisk to the left of the item label. You can change the appearance of an item by selecting another template.

To change to a different label template:

  1. Go to the Page Definition for page 2.

  2. Under Items, select an item.

  3. Scroll down to Label and make a selection from the Template list.

  4. Click Apply Changes.

  5. Run the page.

Changing Buttons

The wizard that created the form in this tutorial also created buttons. These buttons display conditionally based upon whether the page is being used to create a new record (that is, P2_EMP_ID equals null), or the page is being used to update an existing record. These buttons were created as HTML buttons and positioned at the top of the region.

You can also position buttons at the bottom of the region, to the left or right of the page title, above the region, below the region, or in any button position defined in the region template.

To change a button position:

  1. Go to the Page Definition for page 2.

  2. Under Buttons, click the Edit All icon in the Buttons section. The Edit All icon resembles a small grid with a pencil on top of it.

  3. Make a new selection from the Position column.

  4. Click Apply Changes.

  5. Run the page.

Buttons can also have templates associated with them to refine how they look.

Running the Page for Update

You can run the page and provide it with an Employee ID to retrieve. Typically, this would be done with a link from a report page; but for this example, run the page and add P2_EMP_ID:1 to the end of the URL as shown in the following example:

http://apex.oracle.com/pls/otn/f?p=9659:2:1284393467360777225::::P2_EMP_ID:1

This will pass the value 1 to the item P2_EMP_ID. If you run the page, note that the Delete and Apply Changes buttons now display as shown in Figure 5-23. The Create button appeared previously because the page was expecting a new record to be created. Also note that a value now appears in the Record Create Date field.

Figure 5-23 Revised Update Form

Description of Figure 5-23 follows


See Also:

"Understanding URL Syntax" in Oracle Database Application Express User's Guide.

Making Data Bold

One way to make the information in a region easier to read is to make the labels (or the data) more pronounced. You can accomplish this by changing the color, specifying another font, or using bold. To make a label bold, you could bold the data manually, or create a new label template. In the latter approach, you would create a new label template that would wrap the HTML tag for bold around the label and then associate that template with the items in the Audit Information region.

To make data bold manually:

  1. Go to the Page Definition for page 2.

  2. Under Items, select an item name.

  3. Scroll down to Element.

  4. In HTML Form Element Attributes, enter:

    class="fielddatabold"
    
    

    This example references a class in the Cascading Style Sheet associated with this application.

  5. Click Apply Changes.

  6. Run the page.

PKsiPK%mUIOEBPS/content.opf8 Oracle® Database Application Express Advanced Tutorials, Release 3.0 en-US B28842-01 Oracle Corporation Oracle Corporation Oracle® Database Application Express Advanced Tutorials, Release 3.0 2005-07-10T12:57:20+08:00 Features a series of tutorials that demonstrate how to use the Oracle Application Express development environment to develop Web applications. Each tutorial offers step-by-step instructions that explain how to create applications and different types of application components. PKQ:88PK%mUI OEBPS/toc.htmZu Table of Contents

Contents

Preface

1 About these Tutorials

2 How to Create a Tabular Form

3 How to Create a Parameterized Report

4 How to Create a Drill Down Report

5 How to Control Form Layout

6 How to Work with Check Boxes

7 How to Implement a Web Service

8 How to Create a Stacked Bar Chart

9 How to Upload and Download Files in an Application

10 How to Incorporate JavaScript into an Application

11 How to Build an Access Control Page

12 How to Review a Packaged Application

13 How to Create a Master Detail PDF Report

14 How to Build and Deploy an Issue Tracking Application

A DDLs and Scripts

PKbZZPK%mUIOEBPS/rprt_query.htm(fי How to Create a Parameterized Report

3 How to Create a Parameterized Report

In an Oracle Application Express application, a report is the formatted result of a SQL query. You can generate reports in three ways:

This tutorial illustrates how to create a report in which the results depend on the form input, otherwise known as a parameterized report. In this exercise, you create a report region based on a SQL query that references the value of form items within the application.

Before you begin, you need to import and install the OEHR Sample Objects application in order to access the necessary sample database objects. See "About Loading Sample Objects".

This section contains the following topics:

Sample Report Utilizing a Form Input

Figure 3-1 is an example of a form in which the report results are based on user input. In this example, the user populates the form by entering an employee ID in the Search Employee field, or by making a selection from two select lists. The easiest way to create this type of report in Application Builder is to define a report region based on a SQL query.

Figure 3-1 Sample Report

Description of Figure 3-1 follows

Creating an Application

First, you need to create an application using the Create Application Wizard.

To create an application using the Create Application Wizard:

  1. On the Workspace home page, click the Application Builder icon.

    The Application Builder home page appears.

  2. Click Create.

  3. Select Create Application and click Next.

  4. For Name, specify the following:

    1. Name - Enter Parameterized Report.

    2. Application - Accept the default.

    3. Create Application - Select From scratch.

    4. Schema - Select the schema where you installed the OEHR sample objects.

    5. Click Next.

      Next, add a blank page.

  5. Under Add Page, specify the following:

    1. Select Page Type - Select Blank.

    2. Page Name - Enter Employees.

    3. Click Add Page.

      The new page appears in the list at the top of the page.

    4. Click Next.

  6. For Tabs, accept the default, One Level of Tabs, and click Next.

  7. For Copy Shared Components from Another Application, accept the default, No, and click Next.

  8. For Attributes, accept the defaults for Authentication Scheme, Language, and User Language Preference Derived From and click Next.

  9. For User Interface, select Theme 18 and click Next.

    A theme is collection of templates that define the layout and style of an application. You can change a theme at any time.

  10. Review your selections and click Create.

    The Application home page appears.


See Also:

"Managing Themes" in Oracle Database Application Express User's Guide

Creating Regions

Next, you need to create regions. A region is an area on a page that serves as a container for content. For this exercise you need to create two regions: a Search region to contain search criteria items and a Query region that displays the resulting report.

Topics in this section include:

Create a Search Region

To create a search region:

  1. On the Application home page, click 1 - Employees.

    The Page Definition for page 1 appears.

  2. Under Regions, click the Create icon as shown in Figure 3-2.

    Figure 3-2 Create Icon

    Description of Figure 3-2 follows

  3. For Region:

    1. Identify the type of region to add to this page - Accept the default, HTML, and click Next.

    2. Select the type of HTML region container you wish to create - Accept the default, HTML, and click Next.

  4. For Display Attributes, specify the following:

    1. For Title - Enter Search.

    2. Accept the remaining default values.

    3. Click Next.

  5. Click Create Region.

    The Page Definition for page 1 appears. A confirmation message displays at the top of the page: Region created.

Create a Query Region

Next, you need to create a report region based on a SQL query.


See Also:

"Understanding Regions" in Oracle Database Application Express User's Guide

To create a report region based on a SQL query:

  1. Under Regions, click the Create icon.

  2. For Region, select Report and click Next.

  3. For Report Implementation, select SQL Report and click Next.

  4. For Display Attributes:

    1. Title - Enter the following, making sure to include the trailing period:

      Employees &P1_TEXT.
      
      

      &P1_TEXT is a substitution string that will determine region title. You create this item in the next section.

    2. Accept the remaining default values and click Next.

  5. Enter the following SQL query:

    SELECT
       "OEHR_EMPLOYEES"."EMPLOYEE_ID" "EMPLOYEE_ID",
       "OEHR_EMPLOYEES"."FIRST_NAME" "FIRST_NAME",
       "OEHR_EMPLOYEES"."LAST_NAME" "LAST_NAME",
       "OEHR_EMPLOYEES"."EMAIL" "EMAIL",
       "OEHR_EMPLOYEES"."PHONE_NUMBER" "PHONE_NUMBER",
       "OEHR_EMPLOYEES"."HIRE_DATE" "HIRE_DATE",
       "OEHR_EMPLOYEES"."JOB_ID" "JOB_ID",
       "OEHR_EMPLOYEES"."SALARY" "SALARY",
       "OEHR_EMPLOYEES"."COMMISSION_PCT" "COMMISSION_PCT",
       "OEHR_EMPLOYEES"."MANAGER_ID" "MANAGER_ID",
       "OEHR_EMPLOYEES"."DEPARTMENT_ID" "DEPARTMENT_ID"
    FROM
       "#OWNER#"."OEHR_EMPLOYEES" "OEHR_EMPLOYEES"
    WHERE
         (lower(first_name) like '%' || lower(:P1_NAME) || '%' OR
          lower(last_name) like '%' || lower(:P1_NAME) || '%') 
     AND department_id = decode(:P1_DEPT,'%null%',department_id,:P1_DEPT)
     AND manager_id = decode(:P1_MGR,'%null%',manager_id,:P1_MGR)
    
    

    The WHERE clause forces both the search criteria and value from the database to be lower case. This makes the resulting search case insensitive for first and last names.

  6. Click Create Region.

    The Page Definition for page 1 appears. A confirmation message displays at the top of the page.

Adding Form Items

An item is part of an HTML region. An item can be a text field, text area, password, select list, check box, and so on. The previous SQL query references the following items: P1_NAME, P1_DEPT, P1_MGR, and P1_TEXT. Next, you need to create these items.

Topics in this section include:


See Also:

"Understanding Page-Level Items" in Oracle Database Application Express User's Guide.

Create a Search Employee Text Field

To create the text field P1_NAME:

  1. Under Items, click the Create icon.

  2. For Item Type, select Text and click Next.

  3. For Text Control Display Type, select Text Field and click Next.

  4. For Display Position and Name:

    1. For Item Name - Enter P1_NAME.

    2. For Sequence - Accept the default.

    3. For Region - Select Search.

    4. Click Next.

  5. For Item Attributes:

    1. Label - Enter Search Employee.

    2. Accept the defaults.

    3. Click Next.

  6. Accept the defaults and click Next.

  7. Click Create Item.

Create a Hidden Text Field

Next, you will create a hidden text field named P1_TEXT. The value of P1_TEXT is used as the basis for the region title that displays.

To create the hidden text field P1_TEXT:

  1. Under Items, click the Create icon.

  2. For Item Type, select Hidden and click Next.

  3. For Display Position and Name:

    1. For Item Name - Enter P1_TEXT.

    2. For Sequence - Accept the default.

    3. For Region - Select Employees &P1_TEXT.

    4. Click Next.

  4. Accept the remaining defaults and click Next.

  5. Click Create Item.

Create Department and Manager Select Lists

Next, you need to create two items named P1_DEPT and P1_MGR. These items will display as select lists and be based on two named (or shared) lists of values.

A list of values (LOV) is a static or dynamic set of values used to display a page item. To create these items, you first define two dynamic LOVs and then create the items P1_DEPT and P1_MGR.

Topics in this section include:


See Also:

"Creating Lists of Values" in Oracle Database Application Express User's Guide

Create a Named LOV for Department

To create a named LOV for department:

  1. Under Lists of Values, click the Create icon.

  2. For Source, accept the default, From Scratch, and click Next.

  3. For Name and Type:

    1. Name - Enter DEPARTMENT.

    2. Type - Select Dynamic.

    3. Click Next.

  4. For Query or Static Values, replace the existing text with:

    SELECT department_name,department_id FROM oehr_departments
    
    
  5. Click Create List of Values.

    The Page Definition appears.

Create a Named LOV for Manager

To create a named LOV for manager:

  1. Under Lists of Values, click the Create icon.

  2. For Source, accept the default, From Scratch, and click Next.

  3. For Name and Type:

    1. Name - Enter MANAGER.

    2. Type - Select Dynamic.

    3. Click Next.

  4. For Query or Static Values, replace the existing text with:

    SELECT y.first_name || ' ' || y.last_name d, y.employee_id r
    FROM oehr_employees y 
    WHERE y.employee_id IN ( SELECT x.manager_id FROM oehr_employees x) 
    
    
  5. Click Create List of Values.

    The Page Definition appears.

Create an Item Named P1_DEPT

To create the item named P1_DEPT:

  1. Under Items, click the Create icon.

  2. For Item Type, select Select List and click Next.

  3. For Select List Control Type, select Select List, and click Next.

  4. For Display Position and Name:

    1. For Item Name - Enter P1_DEPT.

    2. For Sequence - Accept the default.

    3. For Region - Select Search.

    4. Click Next.

  5. For List of Values:

    1. Named LOV - Select DEPARTMENT.

    2. Null Text - Enter the following:

      - All -
      
      
    3. Accept the remaining defaults and click Next.

  6. For Item Attributes:

    1. Label - Enter Department.

    2. Accept the remaining defaults and click Next.

  7. Click Create Item.

Create an Item Named P1_MGR

To create the item named P1_MGR:

  1. Under Items, click the Create icon.

  2. For Item Type, select Select List and click Next.

  3. For Select List Control Type, select Select List and click Next.

  4. For Display Position and Name:

    1. For Item Name - Enter P1_MGR.

    2. For Sequence - Accept the default.

    3. For Region - Select Search.

    4. Click Next.

  5. For List of Values:

    1. Named LOV - Select MANAGER.

    2. Null Text - Enter the following:

      - All -
      
      
    3. Accept the remaining defaults and click Next.

  6. For Item Attributes:

    1. Label - Enter Manager.

    2. Accept the remaining defaults and click Next.

  7. Click Create Item.

Adding a Button to Submit the Page

Why do you need to submit the page? Once the user enters search criteria, the page needs to be submitted so that the query will be rerun against that criteria. To submit the page, you add a button.

To add a button to submit the page:

  1. Under Buttons, click the Create icon.

  2. For Button Region, select Search and click Next.

  3. For Button Position, select Create a button displayed among this region's items and click Next.

  4. In Button Name, enter P1_GO.

  5. Accept the remaining defaults and click Create Button.

    The Page Definition for page 1 appears.


See Also:

"Creating Buttons" in Oracle Database Application Express User's Guide

Adding an Onload Process

Next, you create a process that sets the value for the hidden item P1_TEXT. The value of P1_TEXT determines the region title that displays. By adding this process, the region title displays as:

Employees in department_name

If you choose to not add this process, the region header simply displays as Employees.

To add an onload process:

  1. Under Page Processing, Processes, click the Create icon.

  2. For Process Type, select PL/SQL and click Next.

  3. For Process Attributes:

    1. Name - Enter get region title info.

    2. Accept the remaining defaults and click Next.

  4. For Process, enter the following SQL query:

    DECLARE
       l_dept varchar2(100);
       l_mgr varchar2(100);
    BEGIN
    :P1_TEXT := null;
    
    IF :P1_DEPT != '%null%' 
       THEN SELECT department_name 
              INTO l_dept 
              FROM oehr_departments 
             WHERE department_id = :P1_DEPT;
            :P1_TEXT := :P1_TEXT || ' in Department ' || l_dept;
    END IF;
    
    IF :P1_MGR != '%null%'
       THEN SELECT first_name || ' ' || last_name 
              INTO l_mgr 
              FROM oehr_employees 
             WHERE employee_id = :P1_MGR;
            :P1_TEXT := :P1_TEXT ||' reporting to ' || l_mgr;
    END IF;
    END;
    
    
  5. Click Create Process.

The Page Definition for page 1 appears.

Running the Page

To run the page:

  1. Click the Run Page icon in the upper right corner as shown in Figure 3-3.

    Figure 3-3 Run Page Icon

    Description of Figure 3-3 follows

  2. If prompted to enter a user name and password, enter your workspace user name and password and click Login. See "About Application Authentication".

  3. When the Employees page appears, make a selection from the Department or Manager lists and click Go.

An Employees report appears as shown in Figure 3-4.

Figure 3-4 Form Results Being Populated from Select Lists

Description of Figure 3-4 follows

PK-f(fPK%mUIOEBPS/about.htmS* About these Tutorials

1 About these Tutorials

Oracle Database Application Express Advanced Tutorials contains a series of tutorials that explain how to use Oracle Application Express to create applications and application components. The goal of this book is to help you understand how to use Oracle Application Express through hands-on experience.

This section contains the following topics:

What this Book Is Not

Oracle Database Application Express Advanced Tutorials contains 12 tutorials with step-by-step instructions. The objective of these tutorials is to demonstrate how to build a particular type of application or application component using the Oracle Application Express development environment.

Where appropriate, this book describes concepts relevant to understanding or completing a task. However, this book is not intended to be a complete discussion of Oracle Application Express concepts. For this type of information, see Oracle Application Express online Help or Oracle Database Application Express User's Guide.

If you are new to Oracle Application Express, please review the Oracle Database 2 Day + Application Express Developer's Guide. This guide introduces you to application development using Oracle Application Express. It leads your through the process of setting up your development environment and walks you through building an initial application.

Tutorial Topics

This document contains the following tutorials:

TitleDescription
How to Create a Tabular Form
Illustrates how to create a tabular form within a new application and how to change one of the updatable columns from a text field to a select list.
How to Create a Parameterized Report
Illustrates how to create a report based on a SQL query that restricts the query to the value of a form item within the application.
How to Create a Drill Down Report
Describes how to create a report on a table. You then modify the report to contains drill down links to details in another report.
How to Control Form Layout
Explains how to create a data input form and then change the form layout by editing the region and item attributes.
How to Work with Check Boxes
Illustrates the different ways in which you can create and process check boxes within an application.
How to Implement a Web Service
Explains how to call a Web service from within an application.
How to Create a Stacked Bar Chart
Explains how to create a stacked bar chart within an application.
How to Upload and Download Files in an Application
Illustrates how to create a form and report with links for file upload and download.
How to Incorporate JavaScript into an Application
Describes some usage scenarios for JavaScript and includes details about how to implement them in your application.
How to Build an Access Control Page
Explains how to build an Access Control Administration to restrict access to an application.
How to Review a Packaged Application
Explores the OEHR Sample Objects packaged application. By reviewing the supporting objects behind this application, you can learn how the Supporting Object Utility works so that you can create your own packaged applications.
How to Create a Master Detail PDF Report
Explains how to create a master detail form, define a report query and RTF template, and then create a button to expose the new report.
How to Build and Deploy an Issue Tracking Application
Provides step-by-step instructions on how to create and deploy an application that tracks the assignment, status, and progress of issues related to a project.

About Loading Sample Objects

In Oracle Application Express, users log in to a workspace. Think of each workspace as a shared work area that separates your objects, data, and applications into a virtual private database.

Before you can start these exercises, you need to create the appropriate sample objects within your workspace. These sample objects are copies of the objects that are typically installed in two schemas:

To create the objects locally in your workspace, you need to import the OEHR Sample Objects application.

This section contains the following topics:

Downloading OEHR Sample Objects

To import the OEHR Sample Objects application, you first need to download it from the Oracle Technology Network (OTN):

  1. In your Web browser go to:

    http://www.oracle.com/technology/products/database/application_express/packaged_apps/oehr_sample_objects.zip
    
    
  2. Locate the OEHR Sample Objects application.

  3. Download the oehr_sample_objects.zip file to your computer.

  4. Unzip and extract the oehr_sample_objects_installer.sql file:

    • Microsoft Windows - Double-click the oehr_sample_objects.zip file

    • UNIX or Linux - Enter the following command:

      $ unzip oehr_sample_objects.zip
      

Importing and Installing OEHR Sample Objects

After you download the OEHR Sample Objects application, you need to import it into Application Express. During the import process, specify that you also want to install both the application and the supporting objects. Installing the application creates the objects and sample data needed to complete the exercises in Oracle Database Application Express Advanced Tutorials.

To import and install the OEHR Sample Objects application:

  1. Log in to Oracle Application Express. See "Logging In To Oracle Application Express" in Oracle Database Application Express User's Guide.

  2. On the Workspace home page, click Application Builder.

    The Application Builder home page appears.

  3. Click the Import button.

  4. For Specify File, specify the following:

    1. Import file - Click Browse and go to the oehr_sample_objects_installer.sql file.

    2. File Type - Select Application, Page, or Component Export.

    3. Verify that File Character Set is correct.

    4. Click Next.

    Now that you have imported the file, you want to install it.

  5. To install an imported file, click Next.

    The Install Application Wizard appears.

  6. In the Install Application Wizard, specify the following:

    1. Parse As Schema - Select a schema.

    2. Build Status - Select Run and Build Application.

    3. Install As Application - Select Auto Assign New Application ID.

    4. Click Install.

  7. For Supporting Objects, select Yes and click Next.

  8. Confirm your selections by clicking Install.

  9. Click the Home breadcrumb link at the top of the page.

    The Application Builder home page appears.

Checking Available Space in Your Workspace

If you experience problems installing the OEHR Sample Objects application, verify the available space in your workspace. You many need to request additional storage space.

If you are a workspace administrator, you can:

  1. Determine if you need additional storage space. See "Viewing the Workspace Overview Report" in Oracle Database Application Express User's Guide.

  2. Request additional storage space. See "Requesting Additional Storage" in Oracle Database Application Express User's Guide.

Deleting the OEHR Sample Objects Application

Deleting the OEHR Sample Objects application and selecting to deinstall the supporting objects completely removes all associated objects and sample data.

To delete the OEHR Sample Objects application:

  1. Log in to Oracle Application Express.

  2. On the Workspace home page, click Application Builder.

    The Application Builder home page appears.

  3. Select the OEHR Sample Objects application.

    The Application home page appears.

  4. On the Tasks list, click Delete this Application.

    The Deinstall page appears.

  5. To remove all associated objects and sample data, select Remove Application Definition and Deinstall Supporting Objects.

  6. Click Deinstall.

Viewing Database Objects

Now, take a look at the objects you just created by going to Object Browser. Object Browser enables you to browse, create, and edit objects in your database.

To view the objects:

  1. On the Workspace home page, click SQL Workshop.

  2. Click Object Browser.

    As shown in Figure 1-1, Object Browser appears.

    Figure 1-1 Object Browser

    Description of Figure 1-1 follows

    Object Browser is divided into two sections:

    • Object Selection pane displays on the left side of the Object Browser page and lists database objects of a selected type within the current schema.

      The list of objects that appears depends upon the available objects in the current schema. Note that any object having a red bar adjacent to it is invalid.

    • Detail pane displays to the right of the page and displays detailed information about the selected object.

  3. From the Object Selection list, select Tables.

  4. In the Object Selection pane, click OEHR_EMPLOYEES from the list.

    The Detail pane shows details about the table.

  5. Click the Data tab in the row at the top of the Details pane.

    The data in the OEHR_EMPLOYEES table appears. Note that other tabs show additional details about the object you select.

  6. To search for an object name, enter a case insensitive term in the Search field.

  7. To view all objects, leave the Search field blank.


See also:

"Managing Database Objects with Object Browser" in Oracle Database Application Express User's Guide

About Application Authentication

As you create new pages, you can view them by running the page individually or by running an entire application. When you run a page or application, the Application Express engine dynamically renders it into viewable HTML based on data stored in the database.

By default, all the applications you create in these tutorials use Application Express Authentication. Application Express Authentication is a built-in authentication scheme that uses the same internal user accounts you use to log in to a workspace.

The first time you run a page in an application, you are prompted to enter a user name and password. To continue, simply enter your workspace user name and password and then click Login.

When you create your own applications, you can choose from a number of preconfigured authentication schemes or build your own.


See Also:

"Establishing User Identity Through Authentication" in Oracle Database Application Express User's Guide.

PKHSSPK%mUIOEBPS/bar_chart.htmOe How to Create a Stacked Bar Chart

8 How to Create a Stacked Bar Chart

A stacked bar chart displays the results of multiple queries stacked on top of one another, either vertically or horizontally. Using a stacked bar chart is an effective way to present the absolute values of data points represented by the segments of each bar, as well as the total value represented by data points from each series stacked in a bar.

Although Application Builder includes built-in wizards for generating HTML, Scalable Vector Graphics (SVG), and Flash charts, only SVG and Flash charts support stacked bar charts.

This tutorial describes how to create a Flash stacked bar chart. Before you begin, you need to import and install the OEHR Sample Objects application in order to access the necessary sample database objects. See "About Loading Sample Objects".

This section contains the following topics:

About the Syntax for Creating Chart Queries

The syntax for the select statement of a chart is:

SELECT link, label, value
FROM   ...

Where:

You must have all three items in your select statement. In the next example, the link is defined as null because there is no appropriate page to link to.

For example:

SELECT null link, 
       last_name label,
       salary value
FROM   employees
WHERE  DEPARTMENT_ID = :P101_DEPARTMENT_ID 


See Also:

"Creating Charts" in Oracle Database Application Express User's Guide

Creating an Application

First, you create an application using the Create Application Wizard.

To create an application using the Create Application Wizard:

  1. On the Workspace home page, click the Application Builder icon.

    The Application Builder home page appears.

  2. Click Create.

  3. Select Create Application and click Next.

  4. For Name:

    1. Name - Enter Bar Chart.

    2. Application - Accept the default.

    3. Create Application - Select From scratch.

    4. Schema - Select the schema where you installed the OEHR sample objects.

    5. Click Next.

      Next, you need to add a page. You have the option of adding a blank page, a report, a form, a tabular form, or a report and form. For this exercise, you add a blank page.

  5. Add a blank page:

    1. Under Select Page Type, select Blank and click Add Page.

      The new page appears in the list at the top of the page.

    2. Click Next.

  6. For Tabs, accept the default, One Level of Tabs, and click Next.

  7. For Copy Shared Components from Another Application, accept the default, No, and click Next.

  8. For Attributes, accept the defaults for Authentication Scheme, Language, and User Language Preference Derived From and click Next.

  9. For User Interface, select Theme 2 and click Next.

  10. Review your selections and click Create.

    The Application home page appears.

Creating a New Page

To create your chart, you can either add a region to an existing page and define it as a stacked bar chart, or you can create a new page. In this exercise, you create a new page within the Bar Chart application you just created.

The chart will display the sum for sales by product category. It will contain sales for the twelve months prior to the current month. In the following exercise, you use a wizard to create the chart and the first query. Then, you add additional queries (or series) for other product categories to make it stacked.

To create a new page:

  1. On the Application home page, click Create Page.

  2. For page, select Chart and click Next.

  3. Select Flash Chart and click Next.

  4. For Page Attributes:

    1. For Page Number, enter 2.

    2. For Page Name, enter Revenue by Category.

    3. For Region Template, accept the default.

    4. For Region Name, enter Revenue by Category.

    5. For Breadcrumb, accept the default.

    6. Click Next.

  5. For Tab Options, accept the default, Do not use Tabs, and then click Next.

    The Chart Preview appears. Use Chart Preview to configure chart attributes. Click Update to refresh the preview image.

  6. On Chart Preview, specify the following:

    1. Chart Type - Select Stacked 3D Column.

    2. Show Legend - Select Right.

    3. Click Update.

      Notice the changes to the preview.

    4. Click Next.

  7. For Query:

    1. Enter the following query:

      SELECT NULL link,
             sales_month value,
             revenue "Hardware"
         FROM (
      SELECT TO_CHAR(o.order_date,'Mon YY') sales_month,
             SUM(oi.quantity * oi.unit_price) revenue,
             TO_DATE(to_char(o.order_date,'Mon YY'),'Mon YY') sales_month_order
        FROM OEHR_PRODUCT_INFORMATION p,
             OEHR_ORDER_ITEMS oi,
             OEHR_ORDERS o,
             OEHR_CATEGORIES_TAB ct
       WHERE o.order_date <= (trunc(sysdate,'MON')-1)
         AND o.order_date > (trunc(sysdate-365,'MON'))
         AND o.order_id = oi.order_id
         AND oi.product_id = p.product_id
         AND p.category_id = ct.category_id
         AND ct.category_name like '%hardware%'
      GROUP BY TO_CHAR(o.order_date,'Mon YY')
      ORDER BY sales_month_order
      )
      
      

      The value label (in this instance, Hardware) is displayed in the legend of stacked charts.


      Tip:

      You can also create a chart query interactively by clicking the Build Query button.

    2. For When No Data Found Message, enter:

      No orders found in the past 12 months.
      
      
    3. Click Next.

  8. Review your selections and click Finish.

    The Success page appears.

Adding Additional Series

Now that you have created a page with a region defining the query, you need to add additional series. In the following exercise, you add a series for the categories software and office equipment.

To add additional series:

  1. On the Success Page, click Edit Page.

    The Page Definition for page 2 appears.

  2. Under Regions, click Flash Chart next to Revenue by Category.

    The Flash Chart page appears with the Chart Attributes tab selected. Scroll down to Chart Series. Note that only one series appears.

  3. To change the name the existing series:

    1. Click the Edit icon.

    2. In Series Name, enter Hardware.

    3. Click Apply Changes.

  4. Add a chart series for software:

    1. Scroll down to Chart Series and then click Add Series.

    2. For Series Name, enter Software.

    3. Scroll down to Series Query.

    4. In SQL, enter:

      SELECT NULL link,
             sales_month value,
             revenue "Software"
         FROM (
      SELECT TO_CHAR(o.order_date,'Mon YY') sales_month,
             SUM(oi.quantity * oi.unit_price) revenue,
             TO_DATE(to_char(o.order_date,'Mon YY'),'Mon YY') sales_month_order
        FROM OEHR_PRODUCT_INFORMATION p,
             OEHR_ORDER_ITEMS oi,
             OEHR_ORDERS o,
             OEHR_CATEGORIES_TAB ct
       WHERE o.order_date <= (trunc(sysdate,'MON')-1)
         AND o.order_date > (trunc(sysdate-365,'MON'))
         AND o.order_id = oi.order_id
         AND oi.product_id = p.product_id
         AND p.category_id = ct.category_id
         AND ct.category_name like '%software%'
      GROUP BY TO_CHAR(o.order_date,'Mon YY')
      ORDER BY sales_month_order
      )
      
      

      The value label (in this instance, Software) is displayed in the legend of stacked charts. Note that this SQL matches the previous series. The only difference is the category in the WHERE clause.

    5. For When No Data Found Message, enter:

      No orders found in the past 12 months.
      
      
    6. At the top of the page, click Apply Changes.

  5. Add a chart series for office equipment:

    1. Under Chart Series, click Add Series.

    2. For Series Name, enter Office Equipment.

    3. Scroll down to Series Query.

    4. In SQL, enter:

      SELECT NULL link,
             sales_month value,
             revenue "Office Equipment"
         FROM (
      SELECT TO_CHAR(o.order_date,'Mon YY') sales_month,
             SUM(oi.quantity * oi.unit_price) revenue,
             TO_DATE(to_char(o.order_date,'Mon YY'),'Mon YY') sales_month_order
        FROM OEHR_PRODUCT_INFORMATION p,
             OEHR_ORDER_ITEMS oi,
             OEHR_ORDERS o,
             OEHR_CATEGORIES_TAB ct
       WHERE o.order_date <= (trunc(sysdate,'MON')-1)
         AND o.order_date > (trunc(sysdate-365,'MON'))
         AND o.order_id = oi.order_id
         AND oi.product_id = p.product_id
         AND p.category_id = ct.category_id
         AND ct.category_name like '%office%'
      GROUP BY TO_CHAR(o.order_date,'Mon YY')
      ORDER BY sales_month_order
      )
      
      

      The value label (in this instance, Office Equipment) is displayed in the legend of stacked charts.

    5. For When No Data Found Message, enter:

      No orders found in the past 12 months.
      
      
    6. Scroll up to the top of the page and click Apply Changes.

Updating the Sample Data

The sample data that installed with the OEHR Sample Objects application is not current. To make the data current, you need to update the dates in the sample data. You will accomplish this by running an update statement in SQL Commands


See Also:

"Using SQL Commands" in Oracle Database Application Express User's Guide

To update the dates in the seed data:

  1. Return to the Workspace home page. Click the Home breadcrumb link at the top of the page.

  2. On the Workspace home page, click SQL Workshop and then SQL Commands.

    The SQL Commands page appears.

  3. Enter the following in the SQL editor pane:

    DECLARE
       l_date_offset  number;
    BEGIN
    
    FOR c1 IN (SELECT TRUNC(max(order_date)) max_date
                 FROM oehr_orders)
    LOOP
       l_date_offset := round(sysdate - c1.max_date);
    END LOOP;
    UPDATE oehr_orders
       set order_date = order_date + l_date_offset;
    COMMIT;
    END;
    /
    
    
  4. Click Run (Ctrl+Enter) to execute the command.

Viewing the Chart

Now that the chart is complete, you can view it.

To run the chart:

  1. Return to page 2, Revenue by Category:

    1. Click the Home breadcrumb link at the top of the page.

    2. Click Application Builder and then click your Bar Chart application.

    3. Click 2 - Revenue by Category.

  2. Click the Run Page icon in the upper right corner of the page.

  3. If prompted for a user name and password, enter your workspace user name and password and click Login. See "About Application Authentication".

    Your bar chart should resemble Figure 8-1.

    Figure 8-1 Revenue by Category Stacked Bar Chart

    Description of Figure 8-1 follows

    The chart displays the revenue for each product category by month. A legend that defines the color associated with each product appears at the top of the page. Note that the text in X Axis is spaced too closely together. In the next section, you edit the chart attributes to correct this issue.

Editing Chart Attributes

In this exercise, you change the appearance of your chart by editing chart attributes.

To edit chart attributes:

  1. Click Edit Page 2 on the Developer toolbar.

  2. Under Regions, click Flash Chart.

    The Chart Attributes page appears.

  3. Under Chart Settings, edit the chart width. In Chart Width, enter 800.

  4. Scroll down to Display Settings. From Animation, select Dissolve.

  5. Scroll down to Axes Settings. From Show Group Separator, select Yes.

  6. Scroll down to Font Settings. For X Axis Title, select the Font Size 10.

  7. Click Apply Changes to a the top of the page.

  8. Click the Run Page icon in the upper right corner of the page.

    You chart should resemble Figure 8-2.

    Figure 8-2 Revised Stacked Bar Chart

    Description of Figure 8-2 follows

    Note that the chart displays on-screen gradually using a dissolve and the X Axis displays correctly.

PK1ƲnOOPK%mUIOEBPS/javascript.htm7iȖ How to Incorporate JavaScript into an Application

10 How to Incorporate JavaScript into an Application

Adding JavaScript to a Web application is a great way to add features that mimic those found in client/server applications without sacrificing all of the benefits of Web deployment. Oracle Application Express includes multiple built-in interfaces especially designed for adding JavaScript.

Remember that JavaScript is not appropriate for data intensive validations. For example, to verify that a name is contained within a large database table, you would need to pull down every record to the client, creating a huge HTML document. In general, complex operations are much better suited for server-side Application Express validations instead of JavaScript.

This tutorial describes some usage scenarios for JavaScript and includes details about how to implement them in your application.

This section contains the following topics:

Understanding How to Incorporate JavaScript Functions

There are two primary places to include JavaScript functions:

Topics in this section include:

Incorporating JavaScript in the HTML Header Attribute

One way to include JavaScript into your application is to add it to the HTML Header attribute of the page. This is a good approach for functions that are specific to a page as well as a convenient way to test a function before you include it in a .js file.

You can add JavaScript functions to a page by entering the code in the HTML Header attribute on the Page Attributes page.

To add JavaScript code in the HTML Header attribute:

  1. On the Workspace home page, click the Application Builder icon.

  2. Select an application.

    The Application home page appears, displaying its set of pages.

  3. Click a page.

    The Page Definition for that page appears.

  4. In the Page section, click the Edit page attributes icon.

    The Edit Page appears.

  5. Scroll down to the HTML Header section.

  6. Enter code into HTML Header and then click Apply Changes.

For example, adding the following code would test a function accessible from anywhere on the current page.

<script type="text/javascript">
  function test(){
    window.alert('This is a test.');
  }
</script>

Including JavaScript in a .js File Referenced by the Page Template

In Oracle Application Express you can reference a .js file in the page template. This approach makes all the JavaScript in that file accessible to the application. This is the most efficient approach because a .js file loads on the first page view of your application, and is then cached by the browser.

The following code demonstrates how to include a .js file in the header section of a page template. Note the line script src= that appears in bold.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>#TITLE#</title>
    #HEAD#
    <script src="http://myserver.myport/my_images/custom.js" type="text/javascript"></script>
</head>
<body #ONLOAD#>#FORM_OPEN#


See Also:

"Customizing Templates" in Oracle Database Application Express User's Guide

About Referencing Items Using JavaScript

When you reference an item, the best approach is to reference the item name as it is defined within the page. Note that item name is different than the item label. The item name displays on the Page Definition and the label displays on a running page. For example, if you create an item with the name P1_FIRST_NAME and a label of First Name, you would reference the item using P1_FIRST_NAME.

Referencing an item by the item name enables you to use the JavaScript method getElementById() to get and set item attributes and values. The following example demonstrates how to reference an item by ID and display its value in an alert box.

<script type="text/javascript">
  function firstName(){    
    window.alert('First Name is ' + document.getElementById('P1_FIRST_NAME').value );
  }
 // or a more generic version would be
  function displayValue(id){    
    alert('The Value is ' + document.getElementById(id).value );
  }
</script>
 
  // Then add the following to the "Form Element Attributes" Attribute of the item:
  onchange="displayValue('P1_FIRST_NAME');"

Calling JavaScript from a Button

Calling a JavaScript from a button is a great way to confirm a request. Oracle Application Express uses this technique for the delete operation of most objects. For example, when you delete a button, a JavaScript message appears asking you to confirm your request. Consider the following example:

<script type="text/javascript">
  function deleteConfirm(msg)
  {
var confDel = msg;
if(confDel ==null)
  confDel= confirm("Would you like to perform this delete action?");
else
  confDel= confirm(msg);
  
if (confDel== true)
  doSubmit('Delete');
  }
</script>

This example creates a function to confirm a delete action and then calls that function from a button. Note that the function optionally submits the page and sets the value of the internal variable :REQUEST to Delete, thus performing the delete using a process that conditionally executes based on the value of request.

Note that when you create the button, you need to select Action Redirect to URL without submitting page. Then, you specify a URL target, such as the following:

confirmDelete('Would you like to perform this delete action?');

Changing the Value of Form Elements

In the following example, there are four text boxes in a region. The fourth text box contains the sum of the other three. To calculate this sum, you add a JavaScript function to the HTML Header attribute and then call that function from the first three items.

To add a function to the HTML Header attribute:

  1. Go to the appropriate Page Definition.

  2. In the Page section, click the Edit page attributes icon.

    The Edit Page appears.

  3. In the HTML Header section, enter the following:

    <script type="text/javascript">
      function sumItems(){
        function getVal(item){
       if(document.getElementById(item).value != "")
         return parseFloat(document.getElementById(item).value);
       else
         return 0;
        }
        document.getElementById('P1_TOTAL').value = 
      getVal('P1_ONE') + getVal('P1_TWO') + getVal('P1_THREE');
      }
    </script>
    
    
  4. Click Apply Changes.

To call the function from all three items:

  1. Go to the appropriate Page Definition.

  2. For each item:

    1. Select the item name by clicking it.

    2. Scroll down to Element.

    3. In HTML Form Element Attributes, enter:

      onchange="sumItems();"
      
      
    4. Click Apply Changes.

Creating a Client Side JavaScript Validation

Client side validations give immediate feedback to users using a form. One very common JavaScript validation is field not null. This type of validation works well in the page header rather than in a .js because it is so specific to a page.

Before you begin, you need to import and install the OEHR Sample Objects application in order to access the necessary sample database objects. See "About Loading Sample Objects".

Topics in this section include:

Create an Application on the OEHR_EMPLOYEES Table

To create a new application on the OEHR_EMPLOYEES table:

  1. On the Workspace home page, click Application Builder.

  2. Click Create.

  3. For Method, select Create Application and then click Next.

  4. For Name, specify the following:

    1. Name - Enter JavaScript Example.

    2. Application - Accept the default.

    3. Create Application - Select From scratch.

    4. Schema - Select the schema where you installed the OEHR sample objects.

    5. Click Next.

  5. Add a page containing a report by specifying the following in the Add Page section:

    1. Select Page Type - Select Report and Form.

    2. Table Name - Select OEHR_EMPLOYEES.

    3. Click Add Page.

    The new pages appear in the list at the top of the page. Next, change the name of page 2 to Update Form.

  6. To change the name of page 2:

    1. Under Create Application at the top of the page, click the page name OEHR_EMPLOYEES for page 2 as shown in Figure 10-1.

      Figure 10-1 Newly Created Pages

      Description of Figure 10-1 follows

      The Page Definition appears.

    2. In Page Name, enter Update Form.

    3. Click Apply Changes

    4. Click Next.

  7. For Tabs, accept the default, One Level of Tabs and then click Next.

  8. For Shared Components, accept the default, No, and click Next.

  9. For Attributes, accept the defaults for Authentication Scheme, Language, and User Language Preference Derived From and click Next.

  10. For User Interface, select Theme 2 and click Next.

  11. Click Create.

    The Application home page appears. Note the new application contains three pages:

    • 1 - OEHR_EMPLOYEES

    • 2 - Update Form

    • 101 - Login

To view the application:

  1. Click the Run Application icon as shown in Figure 10-2.

    Figure 10-2 Run Application Icon

    Description of Figure 10-2 follows

  2. When prompted for a user name and password, enter your workspace user name and password and click Login. See "About Application Authentication".

    A standard report appears. To view the update form, click either the Create button or Edit icon.

  3. Click Application on the Developer toolbar to return to the Application home page.

Add a Function to the HTML Header Attribute

Next, you need to add a function to the HTML Header attribute on page 2 that displays a message when the Last Name field does not contain a value.

To add a function to the HTML Header attribute on page 2:

  1. On the Application home page, click 2 - Update Form.

    The Page Definition for page 2 appears.

  2. Under Page, click the Edit page attributes icon as shown in Figure 10-3.

    Figure 10-3 Edit Page Attributes Icon

    Description of Figure 10-3 follows

    The Edit Page appears.

  3. Scroll down to HTML Header.

    Note that HTML Header already contains a script. When the user clicks the Delete button, this script displays the following message.

    Would you like to perform this delete action?
    
    
  4. In HTML Header, scroll down and place your cursor after the last </script> tag.

  5. After the last </script> tag, enter the following script:

    <script type="text/javascript">
      function notNull(object){    
        if(object.value=="")
       alert('This field must contain a value.');
      }
    </script>
    
    
  6. At the top of the page, click Apply Changes.

    The Page Definition for page 2 - Update Form appears.

Edit an Item to Call the Function

Next, you need to edit the P2_LAST_NAME item to call the function.

To edit the P2_LAST_NAME item to call the function:

  1. Under Items, click P2_LAST_NAME.

  2. Scroll down to Element.

  3. In HTML Form Element Attributes, enter the following:

    onblur="notNull(this);"
    
    
  4. At the top of the page, click Apply Changes.

    The Page Definition appears. Next, run the page.

Test the Validation by Running the Page

Next, navigate to page 1 and run the page.

To test the validation:

  1. Enter 1 in the Page field on the Page Definition and click Go.

    The Page Definition for page 1 appears.

  2. Click the Run Page icon in the upper right corner.

  3. When the application appears, click Create.

    The Update Form appears.

  4. Position your cursor in the Last Name field and then click Create. The message This field must contain a value appears as shown in Figure 10-4.

    Figure 10-4 Update Form

    Description of Figure 10-4 follows

Enabling and Disabling Form Elements

While Oracle Application Express enables you to conditionally display a page item, it is important to note that a page must be submitted for any changes on the page to be evaluated. The following example demonstrates how to use JavaScript to disable a form element based on the value of another form element.

First, you write a function and place it in the HTML Header attribute of the page containing your update form. Second, you call the function from an item on the page. The following example demonstrates how to add a JavaScript function to prevent users from adding commissions to employees who are not in the Sales Department (P2_DEPARTMENT_ID = 80).

Topics in this section include:

Add a Function to the HTML Header Attribute

To add a function to the HTML Header attribute on page 2:

  1. Go to the Page Definition for page 2.

  2. Under Page, click the Edit page attributes icon.

    The Edit Page appears.

  3. Scroll down to HTML Header.

  4. In HTML Header, scroll down and place your cursor after the last </script> tag.

  5. After the last </script> tag, enter the following script:

    <script language="JavaScript1.1" type="text/javascript"> 
    function html_disableItem(nd,a){
         var lEl = document.getElementById(nd);
         if (lEl && lEl != false){
           if(a){
             lEl.disabled = false;
              lEl.style.background = '#ffffff';
            }else{
            lEl.disabled = true;
              lEl.style.background = '#cccccc';
             }}
         return true;}
    
     function disFormItems(){ 
      var lOptions = document.getElementById('P2_DEPARTMENT_ID').options
      var lReturn;
      for(var i=0;i<lOptions.length;i++){
         if(lOptions[i].selected==true){lReturn = lOptions[i].value;}
      }
      var lTest = lReturn == '80';
      html_disableItem('P2_COMMISSION_PCT',lTest); } 
    
     </script>
    
    
  6. Click Apply Changes.

Edit an Item to Call the Function

The next step is to edit the P2_DEPARTMENT_ID item and add code to the HTML Form Element Attributes attribute to call the function.

To edit the P2_DEPARTMENT_ID item to call the function:

  1. Under Items, select P2_DEPARTMENT_ID.

  2. Scroll down to Element.

  3. In HTML Form Element Attributes, enter the following:

    onchange="disFormItems()"
    
    
  4. Click Apply Changes.

Change the Item to a Select List

To change the P2_DEPARTMENT_ID to display as a select list:

  1. Under Items, select P2_DEPARTMENT_ID.

  2. From the Display As list in the Name section, select Select List.

  3. Scroll down to List of Values.

  4. Under List of Values, specify the following:

    1. From Display Null, select No.

    2. In List of Values definition, enter:

      SELECT department_name, department_id FROM oehr_departments
      
      
  5. Click Apply Changes.


Tip:

For simplicity, this tutorial has you create an item-level list of values. As a best practice, however, consider creating a named LOV and referencing it.


See Also:

"Creating Lists of Values" in Oracle Database Application Express User's Guide

Create a Call to the disFormItems Function

Finally, you need to create a call to the disFormItems function after the page is rendered to disable P2_COMMISSION_PCT if the selected employee is not a Sales representative. A good place to make this call would be from the Page HTML Body Attribute.

To create a call to the disFormItems function:

  1. Go to the Page Definition for page 2.

  2. Under Page, click the Edit page attributes icon.

    The Edit Page appears.

  3. Locate the Display Attributes section.

  4. From Cursor Focus, select Do not focus cursor.

    Selecting Do not focus cursor prevents conflicts between generated JavaScript and custom JavaScript.

  5. Scroll down to the HTML Body Attribute section.

  6. In the Page HTML Body Attribute, enter the following:

    onload="disFormItems(); first_field();"
    
    
  7. Click Apply Changes.

  8. Run the page.

Figure 10-5 demonstrates the completed form. Note that Department ID displays as a select list. Also notice that the Commission Pct field is unavailable since the Department ID is Administration.

Figure 10-5 Revised Update Form

Description of Figure 10-5 follows

PK>J Oracle® Database Application Express Advanced Tutorials, Release 3.0 Cover Title and Copyright Information Contents Preface 1 About these Tutorials 2 How to Create a Tabular Form 3 How to Create a Parameterized Report 4 How to Create a Drill Down Report 5 How to Control Form Layout 6 How to Work with Check Boxes 7 How to Implement a Web Service 8 How to Create a Stacked Bar Chart 9 How to Upload and Download Files in an Application 10 How to Incorporate JavaScript into an Application 11 How to Build an Access Control Page 12 How to Review a Packaged Application 13 How to Create a Master Detail PDF Report 14 How to Build and Deploy an Issue Tracking Application A DDLs and Scripts Copyright PKgL=8PK%mUIOEBPS/frm_tabular.htmDZ How to Create a Tabular Form

2 How to Create a Tabular Form

A tabular form enables users to update multiple rows in a table at once from a single page. You can use the Tabular Form Wizard to create a tabular form that contains a built-in multiple row update process. This built-in process performs optimistic locking behind the scenes to maintain the data integrity.

This tutorial explains how to create a tabular form within a new application and then how to change one of the updatable columns from a text field to a select list. Before you begin, you need to import and install the OEHR Sample Objects application in order to access the necessary sample database objects. See "About Loading Sample Objects".

This section contains the following topics:

Creating an Application

First, you need to create an application using the Create Application Wizard.

To create an application using the Create Application Wizard:

  1. On the Workspace home page, click the Application Builder icon.

    The Application Builder home page appears.

  2. Click Create.

  3. Select Create Application and click Next.

  4. For Name:

    1. Name - Enter Tabular Form.

    2. Application - Accept the default.

    3. Create Application - Select From scratch.

    4. Schema - Select the schema where you installed the OEHR sample objects.

    5. Click Next.

      Next, you need to add a page. You have the option of adding a blank page, a report, a form, a tabular form, or a report and form. For this exercise, you create an application containing a blank page. Then, you create a tabular form.

  5. Add a blank page:

    1. Under Select Page Type, select Blank and click Add Page as shown in Figure 2-1.

      Figure 2-1 Add Page

      Description of Figure 2-1 follows

      The new page appears in the list at the top of the page.

    2. Click Next.

  6. For Tabs, accept the default, One Level of Tabs, and click Next.

  7. For Copy Shared Components from Another Application, accept the default, No, and click Next.

  8. For Attributes, accept the defaults for Authentication Scheme, Language, and User Language Preference Derived From and click Next.

  9. For User Interface, select Theme 2 and click Next.

    A theme is collection of templates that define the layout and style of an application. You can change a theme at any time.

  10. Review your selections and click Create.

    The Application home page appears.


See Also:

"Managing Themes" in Oracle Database Application Express User's Guide

Creating a Tabular Form Using a Wizard

The Tabular Form Wizard creates a form to perform update, insert, and delete operations on multiple rows in a database table. Additionally, the wizard creates a multiple row update process that checks for MD5 checksum values before doing the update to prevent lost updates. In the following exercise you create a tabular form on the OEHR_EMPLOYEES table.

To create a tabular form using the Tabular Form Wizard:

  1. On the Application home page, click Create Page.

  2. For the page type, select Form and click Next.

  3. Select Tabular Form and click Next.

  4. For Table/View Owner:

    1. Table/View Owner - Accept the default.

    2. Allowed Operations - Accept the default, Update, Insert, and Delete.

    3. Click Next.

  5. For Table/View Name, select OEHR_EMPLOYEES and click Next.

  6. For Displayed Columns:

    1. For Select Columns, press Ctrl and select the following columns:

      FIRST_NAME, LAST_NAME, HIRE_DATE, SALARY, DEPARTMENT_ID
      
      

      Note:

      This exercise limits the number of columns to optimize the display on-screen. For a real form, you would probably want to include additional columns.

    2. Click Next.

  7. For Primary Key, accept the default, EMPLOYEE_ID (Number) and click Next.

  8. For Source Type, accept the default, Existing trigger, and click Next.

  9. For Updatable Columns, select all columns and click Next.

  10. For Page and Region Attributes:

    1. Page - Accept the default.

    2. Page Name - Enter Tabular Form.

    3. Region Title - Accept the default, Tabular Form.

    4. Region Template and Report Template - Accept the defaults.

    5. Breadcrumb - Accept the default.

    6. Click Next.

  11. For Tab, accept the default, Do not use tabs, and click Next.

  12. For Button Labels, specify the following:

    1. Submit button - Enter Apply Changes.

    2. Cancel, Delete, and Add Row buttons - Accept the default label text.

    3. Click Next.

  13. For Branching, accept the defaults and click Next.

    Branching tells the Web browser what page to display when the current page is submitted for processing. In this case, you want the user to remain on the current page.

  14. Confirm your selections and click Finish.

Next, run the page to view your new form.

To run the page:

  1. Click the Run Page icon as shown in Figure 2-2.

    Figure 2-2 Run Page Icon

    Description of Figure 2-2 follows

  2. If prompted to enter a user name and password, enter your workspace user name and password and click Login. See "About Application Authentication".

    The tabular form appears as shown in Figure 2-3.

    Figure 2-3 Tabular Form

    Description of Figure 2-3 follows

As shown in Figure 2-3, note that the tabular form contains four buttons. Cancel, Delete, and Apply Changes display in the upper right corner and Add Row displays in the bottom right corner. Additionally, a check box appears to the left of each row to enable the user to select the current row. Users can also select all rows at once by selecting the check box to the left of the column headings. The same check box is also used in conjunction with the Delete button to identify the rows to be deleted.

Note that the overall form layout (that is, the color scheme, button placement, region header placement, and so on) are controlled by templates in the currently selected theme.


See Also:

"Managing Themes" in Oracle Database Application Express User's Guide

Changing an Updatable Column to a Select List

When the Tabular Form Wizard creates a tabular form, updatable columns are displayed, by default, as text fields. In the next exercise, you change the default display of the Department Id column to a select list. To accomplish this, you create a named list of values (LOV) and then edit the column attributes.

Topics in this section include:


See Also:

"Creating Lists of Values" in Oracle Database Application Express User's Guide

Create a Named List of Values

To create a named LOV for the Department Id:

  1. Click Edit Page 2 on the Developer toolbar as shown in Figure 2-4.

    Figure 2-4 Developer Toolbar

    Description of Figure 2-4 follows

    The Page Definition for page 2 appears.

  2. Under List of Values, click the Create icon.

    Figure 2-5 Create Icon

    Description of Figure 2-5 follows

    The Create List of Values Wizard appears.

  3. For Source, select From Scratch and click Next.

  4. For Name and Type:

    1. Name - Enter DEPTID.

    2. Type - Select Dynamic.

    3. Click Next.

  5. For Query or Static Values, replace the existing text with this:

    SELECT DISTINCT department_id a, department_id b FROM oehr_employees
    
    
  6. Click Create List of Values.

    The Page Definition for page 2 appears. Note that the LOV does not yet appear on the Page Definitions.

Edit the Column to Display as a Select List

To edit the column to display as a select list:

  1. Under Regions, click the Report link.

    The Report Attributes page appears as shown in Figure 2-6.

    Figure 2-6 Column Attributes on the Report Attributes Page

    Description of Figure 2-6 follows

  2. Under Column Attributes, click the Edit icon next to the DEPARTMENT_ID column as shown in Figure 2-6. The Edit icon resembles a small page with a pencil on top of it.

    The Column Attributes page appears.

    Next, change the default display of this column to a select list.

  3. Scroll down to Tabular Form Element. From Display As, select Select List (named LOV).

  4. Scroll down to Lists of Values. From Named LOV, select DEPTID.

  5. Scroll up to the top of the page and click Apply Changes.

  6. Click the Run Page icon in the upper right corner of the page.

    As shown in Figure 2-7, notice the Department Id column now displays as a select list.

    Figure 2-7 Tabular Form with Department Id Column Changed to a Select List

    Description of Figure 2-7 follows


Note:

Do not modify the select list of a SQL statement of a tabular form after it has been generated. Doing so can result in a checksum error when altering the data in the form and applying updates.

Consider the following example:

SELECT first_name FROM oehr_employees;

Note that this should not be altered to:

SELECT lower(first_name) FROM oehr_employees


PKV8ߪDDPK%mUI OEBPS/acl.htm l How to Build an Access Control Page

11 How to Build an Access Control Page

You can control access to an application, individual pages, or page components by creating an Access Control Administration page. The page contains a list of application modes and an Access Control List.

This tutorial explains how to build an Access Control Administration page and then restrict access to an application so that only privileged users can perform specific functions.

This section contains the following topics:

How Access Control Administration Works

You create an access control list by running the Access Control Wizard to create an Access Control Administration page. This page contains a list of application modes and an Access Control List. Once you create the Access Control Administration page, you:

  1. Run the Access Control Administration page.

  2. Select an application mode:

    • Full access to all, access control list not used.

    • Restricted access. Only users defined in the access control list are allowed.

    • Public read only. Edit and administrative privileges controlled by access control list.

    • Administrative access only.

  3. Add users to the Access Control List.

In addition to creating the Access Control Administration page, the Access Control Wizard also creates:

  • two tables within the application's default schema to manage access control

  • the authorization schemes that correspond to the application mode list options

  • the privileges available in the Access Control List

You can control access to a specific page or page component by selecting one of these authorization schemes on the page or component attributes pages. Once you create an Access Control, you can customize the page, tables and values to suit the specific needs of your application.

Creating an Application

First, you need to create an application based on employee data in a spreadsheet.

Topics in this section include:

Download Spreadsheet Data

Download the following *.csv file to you local machine:

  1. In your Web browser go to:

    http://www.oracle.com/technology/products/database/application_express/packaged_apps/acl_employees.zip
    
    
  2. Download the acl_employees.zip file to your computer.

  3. Unzip and extract the acl_employees.csv file:

    • Microsoft Windows - Double-click the acl_employees.zip file

    • UNIX or Linux - Enter the following command:

      $ unzip acl_employees.zip
      
      

Create an Application Based on Spreadsheet Data

To create a new application based on spreadsheet data:

  1. On the Workspace home page, click the Application Builder icon.

    The Application Builder home page appears.

  2. Click Create.

  3. Select Create from Spreadsheet and click Next.

  4. Select Upload file, comma separated (*.csv) or tab delimited and click Next.

  5. For Load Method:

    1. Select Upload file, comma separated (*.csv) or tab delimited.

    2. Click Next.

  6. For Data:

    1. Text File - Click Browse and navigate to the acl_employees.csv file.

    2. Accept the remaining defaults and click Next.

  7. For Table Properties:

    1. Schema - Select the appropriate schema.

    2. Table Name - Enter ACL_EMPLOYEES.

    3. Accept the remaining defaults and click Next.

  8. For User Interface Defaults:

    1. Singular Name - Enter Employee.

    2. Plural Names - Enter Employees.

    3. Click Next.

  9. For Summary Page:

    1. Summary by Column - Select DEPARTMENT_ID and click Next.

    2. Aggregate by Column - Do not make a selection and click Next.

  10. For Application Options, accept the defaults and click Next.

  11. For User Interface, select Theme 2 and click Next.

    A theme is collection of templates that define the layout and style of an application. You can change a theme at any time.

  12. Click Create.

    The Application home page appears.

Run the Application

To run the application:

  1. Click the Run Application icon as shown in Figure 11-1.

    Figure 11-1 Run Application Icon

    Description of Figure 11-1 follows

  2. If prompted to enter a user name and password, enter your workspace user name and password and click Login. See "About Application Authentication".

    The report appears as shown in Figure 11-2.

    Figure 11-2 ACL_EMPLOYEES Application

    Description of Figure 11-2 follows

    The ACL_EMPLOYEES application enables you to view and update employee data. To update a specific record, click the Edit icon in the far left column. Clicking the Analyze tab provides you with access to both a visual and tabular breakdown of the number of employees in each department.

Creating an Access Control Administration Page

Next, you need to secure your application so that only privileged users can perform certain operations. When you implement access control on an Application Express application, the best approach is to use an authorization scheme defined at the application level. The first step is to create an access control page by running the Access Control Page Wizard.

Topics in this section include:

Create an Access Control Page

To create an access control page:

  1. Click Create on the Developer toolbar.

  2. Select New page and click Next.

  3. For Page, select Access Control and click Next.

    The Access Control Wizard appears.

  4. In Administration Page Number, enter 8 and click Next.

  5. For Tabs:

    1. Tab Options - Select Use an existing tab set and create a new tab within the existing tab set.

    2. Tab Set - Select TS1 (Employees, Analyze).

    3. Tab Set Label - Enter Administration.

    4. Click Next.

  6. Review the confirmation page and click Finish.

    A Success page appears.

View the Page

To run the page:

  1. Click Run Page.

    A new page appears as shown in Figure 11-3.

    Figure 11-3 Access Control Administration Page

    Description of Figure 11-3 follows

    Notice the page is divided into two regions: Application Administration and Access Control List. Also note that the default Application Mode is Full Access.

  2. Under Application Mode, select Restricted access. Only users defined in the access control list are allowed.

  3. Click Set Application Mode.

Add Users to the Access Control List

Next, add three users to the Access Control List:

  • Luis Popp (LPOPP) will have View privileges.

  • Adam Fripp (AFRIPP) will have Edit privileges.

  • John Chen (JCHEN) will have Administrator privileges.

To add users to the Access Control List:

  1. Under Access Control List, click Add User.

    A new row appears.

  2. Enter the first user:

    1. Username - Enter LPOPP.

    2. Privilege - Select View.

    3. Click Apply Changes.

    4. Click Add User to add a blank row where you can enter the first user.

  3. Enter the next user:

    1. Username - Enter AFRIPP.

    2. Privilege - Select Edit.

    3. Click Apply Changes.

    4. Click Add User to add a blank row where you can enter the next user.

  4. Enter the next user:

    1. Username - Enter JCHEN.

    2. Privilege - Select Administrator.

    3. Click Apply Changes.

  5. Click Application on the Developer toolbar.

    The Application home page appears.

Creating an Authentication Function

Next, you need to make employees in the ACL_EMPLOYEES table the users of the application. To accomplish this, you create a simple authentication function in the current authentication scheme. Note that the function checks for the userid and its associated last name as a password.

To create the authentication function:

  1. On the Application Builder home page, click the Home breadcrumb link.

    The the Workspace home page appears.

  2. Click SQL Workshop and then SQL Commands.

  3. In the SQL editor pane:

    1. Enter the following code:

      CREATE OR REPLACE FUNCTION acl_custom_auth (
          p_username IN VARCHAR2,
          p_password IN VARCHAR2)
      RETURN BOOLEAN IS
      BEGIN
        FOR c1 IN (SELECT 1 
                    FROM acl_employees
                   WHERE upper(userid) = upper(p_username)
                     AND upper(last_name) = upper(p_password))
        LOOP
          RETURN TRUE;
        END LOOP;
        RETURN FALSE;
      END;
      /
      
      
    2. Click Run.

  4. Click the Home breadcrumb link.

    The Workspace home page appears.

Updating the Current Authentication Scheme

Next, you need to update the current authentication scheme to use the new function.

To update the current authentication scheme.

  1. Click Application Builder and then click ACL Employees.

    The Application home page appears.

  2. Click Shared Components.

  3. Under Security, click Authentication Schemes.

    The Authentication Schemes page appears.

  4. Click the Application Express - Current icon.

  5. Scroll down to Login Processing.

  6. In Authentication Function, replace -BUILTIN- with the following:

    return acl_custom_auth
    
    
  7. Scroll back to the top of the page and click Apply Changes.

Applying Authorization Schemes to Components

Next you need to associate the authorization scheme with the appropriate application components. As you may recall, you previously added three users to the Access Control List:

  • LPOPP had View privileges.

  • AFRIPP had Edit privileges

  • JCHEN had Administrator privileges

In this exercise, you associate the View, Edit, and Administrator privileges with specific application components to control which users are allowed to perform what actions.

Topics in this section include:

Associate an Authorization Scheme with the Application

First, you need to specify that users will only be able to access the application if they have View privileges. To accomplish this, you associate the access control - view authorization scheme with the application.

To associate an authorization scheme with your application:

  1. Click the Application ID breadcrumb link.

    The Application home page appears.

  2. Click Shared Components.

  3. Under Application, click Definition.

  4. Click the Security tab.

  5. Scroll down to Authorization.

  6. From Authorization Scheme, select access control - view.

  7. Click Apply Changes at the top of the page.

Associate Edit Privileges with the ID Column

For this exercise, only users with at least Edit privileges should be able to edit or delete data. To accomplish this, you associate the access control - edit authorization scheme with the ID column. This hides the Edit icon on page 1 for users with View privileges, but displays it for users with Edit or Administrator privileges.

To associate edit privileges with the ID column:

  1. Click the Application ID breadcrumb link.

    The Application home page appears.

  2. Click 1 - Report Page.

    The Page Definition for page 1 appears.

  3. Under Regions, click the Report link.

    The Report Attributes page appears.

  4. Click the Edit icon for ID. The Edit icon resembles a small page with a pencil on top of it.

    The Column Attributes page appears.

  5. Scroll down to Authorization.

  6. From Authorization Scheme, select access control - edit.

  7. Click Apply Changes at the top of the page.

Associate Edit Privileges with the Create Button

Next, associate the access control - edit authorization scheme to the Create button. This will hide the Edit icon for unprivileged users.

To associate edit privileges with the Create button:

  1. Go to the Page Definition for Page 1. Click the Page 1 breadcrumb link.

    The Page Definition for page 1 appears.

  2. Under Buttons, click the Create link (not the icon).

  3. Scroll down to Authorization.

  4. From Authorization Scheme, select access control - edit.

  5. Click Apply Changes at the top of the page.

    The Page Definition for Page 1 appears.

Associate Edit Privileges with Page 2

Next, associate the access control - edit authorization scheme with page 2.

To specify an authorization scheme for page 2:

  1. Go to page 2. In the Page field enter 2 and click Go.

    The Page Definition for page 2 appears.

  2. Under Page, click the Edit page attributes icon.

  3. Scroll down to Security.

  4. From Authorization Scheme, select access control - edit.

  5. Click Apply Changes at the top of the page.

Restrict Access to Page 8

Lastly, you need to restrict access to page 8, Access Control Administration. To accomplish this, you specify the access control - administrator authorization scheme with all of page 8 and with the Administration tab.

Specify an Authorization Scheme for Page 8

To specify an authorization scheme for page 8:

  1. Go to page 8. In the Page field, enter 8 and click Go.

    The Page Definition for page 8 appears.

  2. Under Page, click the Edit page attributes icon.

  3. Scroll down to Security.

  4. From Authorization Scheme, select access control - administrator.

  5. Click Apply Changes at the top of the page.

    The Page Definition for page 8 appears.

Specify an Authorization Scheme for the Administration Tab

To specify an authorization scheme for page 8:

  1. Under Tabs, click the Administration link.

  2. Scroll down to Authorization.

  3. From Authorization Scheme, select access control - administrator.

  4. Click Apply Changes at the top of the page.

    The Page Definition for page 8 appears.

Testing the Application

At the beginning of this tutorial, you added three users to the Access Control List:

  • Luis Popp (LPOPP) has View privileges

  • Adam Fripp (AFRIPP) has Edit privileges

  • John Chen (JCHEN) has Administrator privileges

Next, test your application by logging in as each of these users.

Topics in this section include:

Log In with View Privileges

Luis Popp (LPOPP) has View privileges.

To log in as Luis Popp:

  1. Click the Run Page icon in the upper right corner.

  2. When prompted, specify the following:

    1. Username - LPOPP.

    2. Password - Popp.

    3. Click Login.

    The Employees Report page appears as shown in Figure 11-4.

    Figure 11-4 Employees Report with View Privileges

    Description of Figure 11-4 follows

    Note that the Edit icon and the Administration tab no longer appear.

  3. Click Logout in the upper right corner.

Log In with Edit Privileges

Adam Fripp (AFRIPP) has Edit privileges.

To log in as Adam Fripp:

  1. When prompted, specify the following:

    1. Username - AFRIPP.

    2. Password - Fripp.

    3. Click Login.

    The Employees Report page appears as shown in Figure 11-5.

    Figure 11-5 Employees Report with Edit Privileges

    Description of Figure 11-5 follows

    Note that the Edit icon now appears to the left of the Employee Id column, but the Administration tab still does not appear.

  2. Click Logout in the upper right corner.

Log In with Administrator Privileges

John Chen (JCHEN) has Administrator privileges.

To log in as John Chen:

  1. When prompted, specify the following:

    1. Username - JCHEN

    2. Password - Chen

    3. Click Login.

    The Employees Report page appears as shown in Figure 11-6.

    Figure 11-6 Employees Report with Administrator Privileges

    Description of Figure 11-6 follows

  2. Click Administrator tab.

PK$M+l lPK%mUIOEBPS/issue_track.htm How to Build and Deploy an Issue Tracking Application

14 How to Build and Deploy an Issue Tracking Application

This tutorial describes how to create and deploy an application that tracks the assignment, status, and progress of issues related to a project. This tutorial walks you through all the steps necessary to create a robust issue tracking application, including planning the project, creating the underlying database objects, loading demonstration data, and building a rich user interface.


Note:

This tutorial takes approximately four to five hours to complete. It is recommended that you read through the entire document first to become familiar with the material before you attempt specific exercises.

Topics in this section include:

Planning and Project Analysis

Effective project management is the key to completing any project on time and within budget. Within every project there are always multiple issues that need to be tracked, prioritized, and managed.

In this business scenario, MRVL Company has several projects that must be completed on time for the company to be profitable. Any missed project deadlines will result in lost revenue. The company's project leads use various methods to track issues, including manually recording statuses in notebooks, organizing issues in text documents, and categorizing issues by using spreadsheets.

By creating a hosted application in Oracle Application Express, project leads can easily record and track issues in one central location. This approach offers each project lead access to just the data they need and makes it easier for management to determine if critical issues are being addressed.

Planning and Project Analysis

Before beginning development on an Oracle Application Express application, you first need to define application requirements. Then, you use the defined requirements to design a database and an outline that describes how the user interface accepts and presents data.

For this business scenario, the project leads establish requirements that define the information that must be tracked, security requirements, data management functions, and how to present data to users.

Topics in this section include:

Gather the Necessary Data

Currently, each project lead tracks information slightly differently. Together, everyone agrees that the application should include the following information:

  • Summary of the issue

  • Detailed description of the issue

  • Who identified the issue

  • The date on which the issue was identified

  • Which project the issue is related to

  • Who the issue is assigned to

  • A current status of the issue

  • Priority of the issue

  • Target resolution date

  • Actual resolution date

  • Progress report

  • Resolution summary

Define Security Requirements

Because the project leads are concerned about everyone having access to all the information, they agree upon the following access rules:

  • Each team member and project lead is only assigned to one project at a time

  • Each team member and project lead must be assigned to a project

  • Managers are never assigned to a specific project

  • Only managers can define and maintain projects and people

  • Everyone can enter new issues

  • Once assigned, only the person assigned or a project lead can change data about the issue

  • Management needs views that summarize the data without access to specific issue details

Select Data Management Functions

Next, the project leads determine how information will be entered into the system. For this project, users must be able to:

  • Create issues

  • Assign issues

  • Edit issues

  • Create projects

  • Maintain projects

  • Create people

  • Maintain people information

  • Maintain project assignments

Select Data Presentation Functions

Once the data is entered into the application, users need to view the data. The team decides that users must be able to view the following:

  • All issues by project

  • Open issues by project

  • Overdue issues, by project and for all

  • Recently opened issues

  • Unassigned issues

  • Summary of issues by project, for managers

  • Resolved issues by month identified

  • Issue resolution dates displayed on a calendar

  • Days to Resolve Issues by person

Define Special Function Requirements

Finally, the project leads determine that the application must support the following special functions:

  • Notify people when an issue is assigned to them

  • Notify the project lead when any issue becomes overdue

Designing the Database Objects

Once you have defined the database requirements, the next step is to turn these requirements into a database design and an outline that describes how the user interface accepts and presents data. In this step you need to think about how information should be organized in the tables in the underlying database. Given the requirements described "Planning and Project Analysis", for this project you need to create three tables:

  • Projects tracks all current projects

  • People contains information about who can be assigned to handle issues

  • Issues tracks all information about an issue, including the project to which it is related and the person assigned to the issue

In addition to the tables, you also need to create additional database objects, such as sequences and triggers, to support the tables. System generated primary keys will be used for all tables so that all the data can be edited without executing a cascade update.

Topics in this section include:

About the Projects Table

Each project must include project name, project start date, target date, and actual end date columns. These date columns help determine if any outstanding issues are jeopardizing the project end date. Table 14-1 describes the columns to be included in the Projects table.

Table 14-1 Project Table Details

Column NameTypeSizeNot Null?ConstraintsDescription

project_id

integer

n/a

Yes

Primary key

A unique numeric identification for each project.

Populated by a sequence using a trigger.

project_name

varchar2

100

Yes

Unique key

A unique alphanumeric name for the project.

start_date

date

n/a

Yes

None

The project start date.

target_end_date

date

n/a

Yes

None

The targeted project end date.

actual_end_date

date

n/a

No

None

The actual end date.


About the People Table

Each person will have a defined name and role. Project leads and team members will also have an assigned project. To tie the current user to their role within the organization, email addresses will be used for user names.

Table 14-2 describes the columns that will be included in the People table.

Table 14-2 People Table Details

Column NameTypeSizeNot Null?ConstraintsDescription

person_id

integer

n/a

Yes

Primary key

A numeric ID that identifies each user.

Populated by a sequence using a trigger.

person_name

varchar2

100

Yes

Unique key

A unique name that identifies each user.

person_email

varchar2

100

Yes

None

User email address.

person_role

varchar2

7

Yes

Check constraint

The role assigned to each user.



Note:

For the purposes of this exercise, this application has been simplified. User data is usually much more elaborate and is often pulled from a corporate Human Resource system. Also, users typically work on more than one project at a time. If the roles that are assigned to a user need to be dynamic, you would implement roles as a separate table with a foreign key that relates to the people table.

About the Issues Table

When the project leads defined their application requirements, they decided to track separate issues assigned to each person. Issues will be included in columns along with additional columns to provide an audit trail. The audit trail will track who created the issue, when it was created, as well as who modified the issue last and on what date that modification was made.

Table 14-3 describes the columns to be included in the Issues table.

Table 14-3 Issue Table Details

Column NameTypeSizeNot Null?ConstraintsDescription

issue_id

integer

n/a

Yes

primary key

A unique numeric ID that identifies an issue.

Populated by a sequence using a trigger.

issue_summary

varchar2

200

Yes

None

A brief summary of the issue.

issue_description

varchar2

2000

No

None

A detailed description of the issue.

identified_by

integer

n/a

Yes

foreign key to People

The user who identifies the issue.

identified_date

date

n/a

Yes

None

The date the issue was identified

related_project

integer

n/a

Yes

foreign key to Projects

Projects related to the issue.

assigned_to

integer

n/a

No

foreign key to People

The person who owns this issue.

status

varchar2

8

Yes

check constraint

The issue status. Automatically set to Open when new and set to Closed when actual resolution date entered.

priority

varchar2

6

No

check constraint

The priority of the issue.

target_resolution_date

date

n/a

No

None

The target resolution date.

progress

varchar2

2000

No

None

The progress of the issue.

actual_resolution_date

date

n/a

No

None

Actual resolution date of the issue.

resolution_summary

varchar2

2000

No

None

Resolution summary.

created_date

date

n/a

Yes

None

Populated by a trigger.

created_by

varchar2

60

Yes

None

User who created this issue.

last_modified_date

date

n/a

No

None

Populated by a trigger.



Note:

A real-world application might need more extensive auditing. For example, you might need to track each change to the data rather than just the last change. Tracking each change to the data would require an additional table, linked to the issues table. If the valid priorities assigned to issues need to be dynamic, you would be required to add a separate table with a foreign key that relates to the issues table.

Implementing Database Objects

This first step in building an application is to create the database objects.

Topics in this section include:

About Building Database Objects

There are several ways to create objects in Oracle Application Express. You can:

  • Create an Object in Object Browser. Use Object Browser to create tables, views, indexes, sequences, types, packages, procedures, functions, triggers database links, materialized views, and synonyms. A wizard walks you through the choices necessary to create the selected database object. To create an object in Object Browser, navigate to SQL Workshop, then Object Browser, and click Create. See "Managing Database Objects with Object Browser" in Oracle Database Application Express User's Guide.

  • Execute SQL Commands. Run SQL Commands by typing or pasting them into the SQL Commands. To access SQL Commands, click the SQL Workshop icon on Workspace home page and then click SQL Commands. See "Using SQL Commands" in Oracle Database Application Express User's Guide.

  • Upload a script. Upload a script to the SQL Script Repository that contains all the necessary create object statements. To upload a script, click SQL Workshop on the Workspace home page, click SQL Scripts and then click Upload. See "Uploading a SQL Script" in Oracle Database Application Express User's Guide.

  • Create script online. Create a script online in the Script Repository. You will use this method to create database objects for this exercise. To create a script online, click the SQL Workshop icon on the Workspace home page, select SQL Scripts and then click Create. See "Creating a SQL Script in the Script Editor" in Oracle Database Application Express User's Guide.

For this exercise, you create and run a script.

Create and Run a Script

To build database objects by creating a script:

  1. Log in to Oracle Application Express.

  2. On the Workspace home page, click SQL Workshop and then SQL Scripts.

  3. Click Create.

  4. In the Script Editor:

    1. For Script Name, enter DDL for Issue Management Application.

    2. Copy the data definition language (DDL) in "Creating Application Database Objects DDL" and paste it into the script.

    3. Click Save.

  5. On the SQL Scripts page, click the DDL for Issue Management Application icon.

    The Script Editor appears.

  6. Click Run.

    A summary page appears.

  7. Click Run again.

    The Manage Script Results page displays a message that the script has been submitted for execution.

View the Created Database Objects

You can view database objects using Object Browser.

To view database objects in Object Browser:

  1. Return to the Workspace home page. Click the Home breadcrumb link.

  2. On the Workspace home page, click SQL Workshop and then Object Browser.

  3. From the Object list on the left side of the page, select Tables.

  4. To view the details of a specific object, select one of the following tables:

    • HT_ISSUES

    • HT_PEOPLE

    • HT_PROJECTS


See Also:

"Managing Database Objects with Object Browser" in Oracle Database Application Express User's Guide.

Loading Demonstration Data

Once you have created all the necessary database objects, the next step is to load data into the tables. You can manually load data using the import functionality available in SQL Scripts. In the following exercise, however, you use SQL Scripts to load demonstration data.

Look at the DDL you copied from "Creating Application Database Objects DDL". Notice that the sequences used for the primary keys start at 40 in order to leave room for the demonstration data. The BEFORE INSERT triggers are coded so that the sequence is only accessed if a primary key value is not provided: they will not need to be disabled in order for you to load data.

Topics in this section include:

Load Projects Data

To import data into the Projects table:

  1. Click the SQL Workshop breadcrumb link.

  2. Click SQL Scripts.

  3. Click Create.

  4. In the Script Editor, specify the following:

    1. Script Name - Enter Load Project Data.

    2. Script - Copy and paste the following:

      INSERT INTO ht_projects
            (project_id, project_name, start_date, target_end_date)   VALUES
            (1, 'Internal Infrastructure', sysdate-150, sysdate-30)
      /
      INSERT INTO ht_projects 
            (project_id, project_name, start_date, target_end_date)   VALUES
            (2, 'New Payroll Rollout', sysdate-150, sysdate+15)
      /
      INSERT INTO ht_projects 
            (project_id, project_name, start_date, target_end_date)   VALUES
            (3, 'Email Integration', sysdate-120, sysdate-60)
      /
      INSERT INTO ht_projects 
            (project_id, project_name, start_date, target_end_date)   VALUES
            (4, 'Public Website Operational', sysdate-60, sysdate+30)
      /
      INSERT INTO ht_projects 
            (project_id, project_name, start_date, target_end_date)   VALUES
            (5, 'Employee Satisfaction Survey', sysdate-30, sysdate+60)
      /
      
      
    3. Click Save.

  5. On the SQL Scripts page, click the Load Project Data icon.

    The Script Editor appears.

  6. Click Run.

    A summary page appears.

  7. Click Run again.

    The Manage Script Results page displays a message that the script has been submitted for execution.

Update Dates to Make the Projects Current

Although you have created the projects, the dates need to be updated to make the projects current. To accomplish this, you run another script.

To update the project dates and make the projects current:

  1. Click the SQL Scripts breadcrumb link.

  2. Click Create.

  3. In the Script Editor:

    1. Script Name - Enter Update Project Dates.

    2. In Script, copy and paste the following:

      UPDATE ht_projects
         SET start_date = sysdate-150,
             target_end_date = sysdate-30
       WHERE project_id = 1
      /
      
      UPDATE ht_projects
         SET start_date = sysdate-150,
             target_end_date = sysdate+15
       WHERE project_id = 2
      /
      UPDATE ht_projects
         SET start_date = sysdate-120,
             target_end_date = sysdate-60
       WHERE project_id = 3
      /
      UPDATE ht_projects
         SET start_date = sysdate-60,
             target_end_date = sysdate+30
       WHERE project_id = 4
      /
      UPDATE ht_projects
         SET start_date = sysdate-30,
             target_end_date = sysdate+60
       WHERE project_id = 5
      /
      
      
    3. Click Save.

  4. On the SQL Scripts page, click the Update Project Dates icon.

    The Script Editor appears.

  5. Click Run.

  6. Click Run again.

    The Manage Script Results page displays a message that the script has been submitted for execution.

Load People Data

After you have loaded data into the Project table, you can load People data. Because of foreign keys in the Projects table, People data must be loaded after Project data. You load data into the People table by creating and running a script in SQL Workshop.

To load data into the People table:

  1. Click the SQL Scripts breadcrumb link.

  2. On the SQL Scripts page, click Create.

  3. In the Script Editor:

    1. Script Name - Enter Load People Data.

    2. Script - Copy and paste the following:

      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
           (1, 'Joe Cerno', 'joe.cerno@mrvl-bademail.com', 'CEO', null)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
           (2, 'Kim Roberts', 'kim.roberts@mrvl-bademail.com', 'Manager', null)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
           (3, 'Tom Suess', 'tom.suess@mrvl-bademail.com', 'Manager', null)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
           (4, 'Al Bines', 'al.bines@mrvl-bademail.com', 'Lead', 1)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
           (5, 'Carla Downing', 'carla.downing@mrvl-bademail.com', 'Lead', 2)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
           (6, 'Evan Fanner', 'evan.fanner@mrvl-bademail.com', 'Lead', 3)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
        values
           (7, 'George Hurst', 'george.hurst@mrvl-bademail.com', 'Lead', 4)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
      VALUES
           (8, 'Irene Jones', 'irene.jones@mrvl-bademail.com', 'Lead', 5)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
           (9, 'Karen London', 'karen.london@mrvl-bademail.com', 'Member', 1)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
         values
           (10, 'Mark Nile', 'mark.nile@mrvl-bademail.com', 'Member', 1)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
           (11, 'Jane Kerry', 'jane.kerry@mrvl-bademail.com', 'Member', 5)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
           (12, 'Olive Pope', 'olive.pope@mrvl-bademail.com', 'Member', 2)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
           (13, 'Russ Sanders', 'russ.sanders@mrvl-bademail.com', 'Member', 3)
      /
      INSERT INTO ht_people
           (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
           (14, 'Tucker Uberton', 'tucker.uberton@mrvl-bademail.com', 'Member', 3)
      /
      INSERT INTO ht_people
            (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
            (15, 'Vicky Williams', 'vicky.willaims@mrvl-bademail.com', 'Member', 4)
      /
      INSERT INTO ht_people
            (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
            (16, 'Scott Tiger', 'scott.tiger@mrvl-bademail.com', 'Member', 4)
      /
      INSERT INTO ht_people
            (person_id, person_name, person_email, person_role, assigned_project)
        VALUES
            (17, 'Yvonne Zeiring', 'yvonee.zeiring@mrvl-bademail.com', 'Member', 4)
      /
      
      
    3. Click Save.

  4. On the SQL Scripts page, click the Load People Data icon.

    The Script Editor appears.

  5. Click Run.

  6. Click Run again.

    The Manage Script Results page displays a message that the script has been submitted for execution.

Load Issues Data

The last data you need to load is the Issues data. As with People data, you create and run a script to populate the Issues table.

To load data into the Issues table:

  1. Click the SQL Scripts breadcrumb link.

  2. Click Create.

  3. In the Script Editor:

    1. Script Name - Enter Load Issue Data.

    2. Script - Copy and paste the script in "Creating Issues Script".

    3. Click Save.

  4. On the SQL Scripts page, click the Load Issue Data icon.

    The Script Editor appears.

  5. Click Run.

  6. Click Run again.

    The Manage Script Results page displays a message that the script has been submitted for execution.

Building a Basic User Interface

After you create the objects that support your application and load the demonstration data, the next step is to create a user interface. In this exercise, you use the Create Application Wizard in Application Builder to create an application and then the pages that support the data management and data presentation functions described in "Planning and Project Analysis".

Topics in this section include:

Create the Application

You use the Create Application Wizard to create an application containing pages that enable users to view reports on and create data for the selected tables within a schema. Alternatively, you can create an application first and then add pages to it. As the application requirements include customized overview pages, for this exercise you will use the latter approach.

To create the application:

  1. Click the Home breadcrumb link.

  2. On the Workspace home page, click Application Builder.

  3. Click Create.

  4. For Method, select Create Application and then click Next.

  5. For Name:

    1. Name - Enter Issue Tracker.

    2. Create Application - Select From scratch.

    3. Click Next.

  6. Next, add a blank page. Under Add Page:

    1. Under Select Page Type, select Blank.

    2. Click Add Page.

    3. Click Next.

  7. For Tabs, select No Tabs and then click Next.

  8. For Shared Components, accept the default, No, and click Next.

  9. For Attributes, accept the defaults for Authentication Scheme, Language, and User Language Preference Derived From and click Next.

  10. For User Interface, select Theme 10 and click Next.

  11. Click Create.

To view the application:

  1. Click the Run Application icon on the Applications home page.

  2. When prompted, enter your workspace user name and password and then click Login. See "About Application Authentication".

    This authentication is part of the default security of any newly created application. As shown in Figure 14-1, the home page appears.

    Figure 14-1 Issue Tracking Application Home Page

    Description of Figure 14-1 follows

    Although the page has no content, notice that the Create Application Wizard has created the following items:

    • Navigation Links - A navigation bar entry displays in the upper right of the page. Logout enables the user to log out of the application.

    • Developer Links - The Developer toolbar appears on the page. These links only display if you are logged in as a developer. Users who only have access to run the application cannot see these links.

  3. Click Application on the Developer toolbar to return to the Application home page.

    Notice that the Create Application Wizard also created a Login page.

Once you have created the basic application structure, the next step is to create individual pages.

Add Pages to Maintain Projects

First, you need to create pages that enable users to view and add data to tables. To accomplish this, you use the Form on a Table with Report Wizard. This wizard creates a report page and maintenance page for each table.

Topics in this section include:

Create Pages for Maintaining Projects

To create pages for maintaining the HT_PROJECTS table:

  1. On the Application home page, click Create Page.

  2. Select Form and then click Next.

  3. Select Form on a Table with Report and click Next.

  4. For Table/View Owner, select the appropriate schema and then click Next.

  5. For Table/View Name, select HT_PROJECTS and click Next.

  6. For Define Report Page:

    1. Page Number: Enter 2.

    2. Page Name and Region Title - Enter Projects.

    3. Accept the remaining defaults and click Next.

  7. For Tab Options, accept the default, Do not use tabs, and then click Next.

  8. For Select Column(s), select all columns except PROJECT_ID and then click Next.

    Note that Project Name is unique and identifies the project. The ID was added to simplify the foreign key and enable cascading updates.

  9. For Edit Link Image, select the fourth option (the word Edit) and then click Next.

  10. For Define Form Page:

    1. Page - Enter 3.

    2. Page Name and Region Title - Enter Create/Edit Project.

    3. Click Next.

  11. For Tab Options, accept the default, Do not use tabs, and click Next.

  12. For Primary Key, accept the default, PROJECT_ID and click Next.

  13. For Source Type, accept the default, Existing Trigger, and click Next.

  14. For Select Column(s), select all columns and click Next.

  15. Under Identify Process Options, accept the defaults for Insert, Update and Delete, and click Next.

  16. Review your selections and click Finish.

  17. Click the Run Page icon.

As shown in Figure 14-2, the newly created report displays the demo data.

Figure 14-2 Projects Page

Description of Figure 14-2 follows

Click the Edit link to view an existing row or click the Create button to create a new record. If you click Edit to the left of Employee Satisfaction Survey, a form resembling Figure 14-3 appears.

Figure 14-3 Create/Edit Project Form

Description of Figure 14-3 follows

Refine the Appearance of the Projects Report Page

You can change the appearance of the Projects report page by adding a format mask to the dates.

To add a format mask to the dates on the Create/Edit Project page:

  1. Go to the Page Definition for page 2, Projects:

    1. Click Application on the Developer toolbar.

    2. On the Application home page, click 2 - Projects.

  2. Under Regions, click Report next to Projects.

  3. Edit the format for START_DATE:

    1. Click the Edit icon to the left of START_DATE.

      The Column Attributes page appears.

    2. Under Column Formatting, for Number/Date Format, enter DD-MON-YYYY.

  4. Edit the format for the TARGET_END_DATE:

    1. Click the Next button (>) at the top of the page to go to the next Report Item.

      The Column Attributes page appears.

    2. Under Column Formatting, for Number/Date Format, enter DD-MON-YYYY.

  5. Edit the format for the ACTUAL_END_DATE:

    1. Click the Next button (>) at the top of the page to go to the next Report Item.

      The Column Attributes page appears.

    2. Under Column Formatting, for Number/Date Format, enter DD-MON-YYYY.

  6. Click Apply Changes.

    The Report Attributes page appears.

  7. For PROJECT_ID, delete the Heading Edit.

  8. For the START_DATE, TARGET_END_DATE and ACTUAL_END_DATE columns, select center for Column Alignment and Heading Alignment.

    Next, enable users to sort on column headings.

  9. To enable column heading sorting, check Sort for all columns except PROJECT_ID.

  10. For PROJECT_NAME, select 1 for Sort Sequence.

    This selection specifies PROJECT_NAME as the default column to sort on. Note this functionality can be overridden by any user selections.

  11. Scroll down to Sorting. For Ascending and Descending Image, select the light gray arrow.

  12. Scroll down to Messages. In When No Data Found Message, enter the following:

    No Projects found.
    
    
  13. At the top of the page, click Apply Changes.

To view your changes, click the Run Page icon in the upper right of the page.

As shown in Figure 14-4, note the addition of a sort control on the Project Name column and the format of the dates in the Start Date and Target End Date columns.

Figure 14-4 Projects Page with Sort Control

Description of Figure 14-4 follows

Refine the Create/Edit Project Page

Next, you need to customize the Create/Edit Project page to make the Project Name field larger and the date fields smaller. You also need to change the date picker type, add a format mask for dates, and add validations that check if the target and actual end dates are after the start date.

Edit Fields

To make the Project Name field larger and the date fields smaller:

  1. Go to the Page Definition for Page 3, Create/Edit Project:

    1. From the Developer toolbar, click Application.

    2. Click 3 - Create/Edit Project.

  2. Under Items, click the Edit All icon.

    The Edit All icon resembles a small grid with a pencil on top of it.

  3. Scroll to the right and locate the Width column:

    1. For Project Name, enter 60.

    2. For Start Date, enter 12.

    3. For Target End Date, enter 12.

    4. For Actual End Date, enter 12.

    5. Click Apply Changes.

  4. Return to the Page Definition. Click the Edit Page icon in the upper right corner. The Edit Page icon resembles a small green piece of paper and pencil.

Change the Date Picker Type

To change the date picker type and add a format mask for dates:

  1. Edit the item P3_START_DATE.

    1. Under Items, click P3_START_DATE.

    2. From the Display As list in the Name section, select Date Picker (DD-MON-YYYY).

    3. Click Apply Changes.

  2. Edit the item P3_TARGET_END_DATE.

    1. Under Items, select P3_TARGET_END_DATE.

    2. From the Display As list in the Name section, select Date Picker (DD-MON-YYYY).

    3. Click Apply Changes.

  3. Edit the item P3_ACTUAL_END_DATE.

    1. Under Items, select P3_ACTUAL_END_DATE.

    2. From the Display As list in the Name section, select Date Picker (DD-MON-YYYY).

    3. Click Apply Changes.

Add a Validation

Next, add validations to check if the target and actual end dates are after the start date.

To add validations:

  1. Under Page Processing, Validations, click the Create icon.

  2. For Level, accept the default Item level validation and click Next.

  3. For Item, select Create/Edit Project: 40. P3_TARGET_END_DATE (Target End Date) and click Next.

  4. For Validation Method, select PL/SQL and click Next.

  5. Specify the type of validation you want to create. Accept the default PL/SQL Expression and click Next.

  6. For Validation Name, enter TARGET_AFTER_START and click Next.

  7. For Validation:

    1. Validation - Enter:

      to_date(:P3_ACTUAL_END_DATE,'DD-MON-YYYY') >= to_date(:P3_START_DATE,'DD-MON-YYYY')
      
      
    2. Error Message - Enter:

      Actual End Date must be same or after Start Date.
      
      
    3. Click Next.

  8. For Conditions:

    1. Condition Type - Select Value of Item in Expression 1 Is NOT NULL, or click the shortcut link [item not null].

    2. Expression 1 - Enter:

      P3_ACTUAL_END_DATE.
      
      

      This selection ensures that this validation executes only if the user enters an Actual End Date.

    3. Click Create.

To view your changes, click the Run Page icon in the upper right of the page. (See Figure 14-5.)

Figure 14-5 Modified Create/Edit Project

Description of Figure 14-5 follows

Add Pages to Track People

Once the initial Projects pages are complete, you create pages for maintaining people.

Topics in this section include:

Create Pages for Maintaining People

To create pages for maintaining the HT_PEOPLE table:

  1. Click Application on the Developer toolbar.

  2. Click Create Page.

  3. Select Form and click Next.

  4. Select Form on a Table with Report and click Next.

  5. For Table/View Owner, select the appropriate schema and click Next.

  6. For Table/View Name, select HT_PEOPLE and click Next.

  7. For Define Report Page:

    1. Page - Enter 4.

    2. Page Name and Region Title - Enter People.

    3. Click Next.

  8. For Tab Options, accept the default, Do not use tabs, and click Next.

  9. For Select Column(s), select all columns except PERSON_ID and click Next.

  10. For Edit Link Image, select the fourth option (the word Edit) and click Next.

  11. For Define Form Page:

    1. Page Number - Enter 5.

    2. Page Name and Region Title - Enter Create/Edit Person Information.

    3. Click Next.

  12. For Tab Options, accept the default, Do not use tabs, and click Next.

  13. For Primary Key, accept the default, PERSON_ID, and click Next.

  14. Specify the source for the primary key columns. Accept the default, Existing Trigger, and click Next.

  15. For Select Column(s), select all the columns and click Next.

  16. For Insert, Update and Delete, accept the defaults and click Next.

  17. Review your selections and then click Finish.

To preview your page, click Run Page. As shown in Figure 14-6, notice the newly created report displays the demo data.

Figure 14-6 People Page

Description of Figure 14-6 follows

To preview the page for adding or editing people, click the Edit button in the far left column.

Modify the People Report Page

Next, you alter the People Report by changing the query to include a join to the Projects table and modify the headings.

Change the Query to Include a Join

To change the query to include a join to the Projects table:

  1. Go to the Page Definition for page 4 - People:

    1. If you are viewing a running form, click Application on the Developer toolbar.

    2. On the Application home page, click 4 - People.

  2. Under Regions, click People.

  3. Scroll down to Source.

  4. In Region Source, replace the existing query with the following:

    SELECT a."PERSON_ID", 
           a."PERSON_NAME",
           a."PERSON_EMAIL",
           a."PERSON_ROLE",
           b."PROJECT_NAME"
       FROM "#OWNER#"."HT_PEOPLE" a,
            "#OWNER#"."HT_PROJECTS" b
     WHERE a.assigned_project = b.project_id (+)
    
    

    Note that the outer join is necessary because the project assignment is optional.

Modify the Headings

To modify the headings:

  1. Click the Report Attributes tab at the top of the page.

  2. Under Column Attributes, edit the following column headings:

    1. PERSON_ID - Remove the Heading Edit.

    2. PERSON_NAME - Change Heading to Name.

    3. PERSON_EMAIL - Change Heading to Email.

    4. PERSON_ROLE - Change Heading to Role.

    5. PROJECT_NAME - Change Heading to Assigned Project and then select left for Heading Alignment.

      Next, enable column heading sorting.

  3. To enable column heading sorting:

    1. Select Sort for all columns except PERSON_ID.

    2. For PERSON_NAME, select 1 for Sort Sequence.

      This selection specifies PERSON_NAME as the default column to sort on. Note this functionality can be overridden by user selections.

    3. Scroll down to Sorting. For Ascending and Descending Image, select the light gray arrow.

  4. Under Messages, enter the following in When No Data Found Message:

    No people found.
    
    
  5. Click Apply Changes at the top of the page.

Run the Page

To view your changes, click the Run Page icon in the upper right of the page. As shown in Figure 14-7, note the addition of a sort control on the Name column.

Figure 14-7 Revised People Page

Description of Figure 14-7 follows

Refine the Create/Edit People Page

Next, you customize the Create/Edit People page by adding lists of values to make it easier for users to select a Role or Assigned Project.

Add a List of Values for Projects

To add a list of values for Projects:

  1. Go to the Page Definition for page 5, Create/Edit Person:

    1. If you are viewing a form, click Application on the Developer toolbar.

    2. On the Application home page, click 5 - Create/Edit Person Information.

  2. Under Shared Components, locate the Lists of Values section and then click the Create icon.

  3. For Source, accept the default, From Scratch, and then click Next.

  4. For Name and Type:

    1. Name - Enter PROJECTS.

    2. Type - Select Dynamic.

    3. Click Next.

  5. In Query, replace the existing statements with the following:

    SELECT project_name d, project_id v
      FROM ht_projects
     ORDER BY d
    
    
  6. Click Create List of Values.

Add a List of Values for Roles

To add a list of values for Roles:

  1. Under Shared Components, locate the Lists of Values section and then click the Create icon.

  2. For Source, accept the default, From Scratch, and then click Next.

  3. For Name and Type:

    1. Name - Enter ROLES.

    2. Type - Select Static

    3. Click Next.

  4. Enter the display value and return value pairs shown in Table 14-4:

    Table 14-4 Display Value and Return Value pairs

    Display ValueReturn Value

    CEO

    CEO

    Manager

    Manager

    Lead

    Lead

    Member

    Member


  5. Click Create List of Values.

  6. On the Lists of Values page, click the Edit Page icon in the upper right corner.

Edit Display Attributes

To edit display attributes for P5_PERSON_ROLE:

  1. Under Items, click P5_PERSON_ROLE.

  2. From the Display As list in the Name section, select Radiogroup.

  3. Scroll down to Label.

  4. Change Label to Role.

  5. Under Element, enter the following in Form Element Option Attributes:

    class="instructiontext"
    
    

    This specifies that the text associated with each radio group option is the same size as other items on the page.

  6. Scroll down to List of Values.

  7. From the Named LOV list, select ROLES.

  8. Click Apply Changes.

To edit display attributes for P5_ASSIGNED_PROJECT:

  1. Under Items, click P5_ASSIGNED_PROJECT.

  2. From the Display As list in the Name section, select Select List.

  3. Scroll down to List of Values.

  4. Under List of Values:

    1. From the Named LOV list, select PROJECTS.

      Next, specify that the underlying column is not mandatory.

    2. For Null display value, enter:

      - None -
      
      
  5. Click Apply Changes.

To alter the display of fields and field labels:

  1. Under Items, click the Edit All icon.

  2. For P5_PERSON_NAME:

    1. Prompt - Enter Name.

    2. Width - Enter 60.

  3. For P5_PERSON_EMAIL:

    1. Prompt - Enter Email Address.

    2. For Width, enter 60.

  4. Click Apply Changes.

  5. Click the Edit Page icon in the upper right corner to return to the Page Definition for Page 5.

Create a Validation

The Form on a Table with Report Wizard created not null validations for Name, Email, and Role. You must manually create another validation to ensure that Leads and Members have an assigned project while the CEO and Managers do not. As a best practice, it is generally best to use built-in validation types because they are faster. However, for this compound type of validation, you will write a PL/SQL validation.

To add validations to ensure the correct people are assigned projects:

  1. Under Page Processing, Validations, click the Create icon.

  2. For Level, accept the default, Item level validation, and click Next.

  3. For Item, select Create/Edit Person Information: 50. P5_ASSIGNED_PROJECT (Assigned Project) and click Next.

  4. For Validation Method:

    1. Select PL/SQL and click Next.

    2. Accept the default, PL/SQL Expression and click Next.

  5. For Sequence and Name:

    1. Validation Name - Enter PROJECT_MAND_FOR_LEADER_AND_MEMBER.

    2. Accept the remaining defaults and click Next.

  6. For Validation and Error Message:

    1. Validation - Enter:

      (:P5_PERSON_ROLE IN ('CEO','Manager') AND
      :P5_ASSIGNED_PROJECT = '%'||'null%') OR
      (:P5_PERSON_ROLE IN ('Lead','Member') AND
      :P5_ASSIGNED_PROJECT != '%'||'null%')
      
      

      Oracle Application Express passes nulls as %null%. It also replaces %null% with a null when it processes data. Therefore, to keep it in the validation, you need to break the string apart so that it is not recognized and replaced.

    2. Error Message - Enter:

      Leads and Members must have an Assigned Project. CEO and Managers cannot have an Assigned Project.
      
      
    3. Click Next.

  7. Click Create.

Run the Page

To view your changes, click the Run Page icon in the upper right of the page. The revised form appears as shown in Figure 14-8.

Figure 14-8 Revised Create/Edit Person Information Form

Description of Figure 14-8 follows

Try entering some records to test the validation. Enter a CEO with a project and then enter a Lead without a project. Both cases should fail and display the error message you defined.

Add Pages to Track Issues

Lastly, you need to create pages for HT_ISSUES. This application needs multiple views on Issues. You can create these views as single reports or as separate reports. For this exercise, you create a complex report that includes an Issues maintenance form. You then link this maintenance form in multiple places. Ultimately, the Issues report will display Issues by the person who identified the issue, project, assigned person, status, or priority.

Topics in this section include:

Create a Report for HT_ISSUES

To create a report for maintaining HT_ISSUES:

  1. Click Application on the Developer toolbar.

  2. Click Create Page.

  3. Select Form and click Next.

  4. Select Form on a Table with Report and click Next.

  5. For Table/View Owner, select the appropriate schema and click Next.

  6. For Table/View Name, select HT_ISSUES and click Next.

  7. On Define Report Page:

    1. Page Number - Enter 6.

    2. Page Name and Region Title - Enter Issues.

    3. Click Next.

  8. For Tab Options, accept the default, Do not use tabs, and click Next.

  9. For Select Column(s):

    1. Press CTRL to select the following columns:

      • ISSUE_SUMMARY

      • IDENTIFIED_BY

      • RELATED_PROJECT

      • ASSIGNED_TO

      • STATUS

      • PRIORITY

      • TARGET_RESOLUTION_DATE

      • ACTUAL_RESOLUTION_DATE

    2. Click Next.

  10. For Edit Link Image, select the fourth option (the word Edit) and click Next.

  11. On Define Form Page:

    1. Page Number - Enter 7.

    2. For Page Name and Region Title, enter Create/Edit Issues.

    3. Click Next.

  12. For Tab Options, accept the default, Do not use tabs, and click Next.

  13. For Primary Key, accept the default, ISSUE_ID, and click Next.

  14. For Define the source for the primary key columns, accept the default, Existing Trigger, and click Next.

  15. For Select Column(s), select all the columns and click Next.

  16. For Insert, Update and Delete, accept the default value, Yes, and click Next.

  17. Review your selections and click Finish.

  18. Click Edit Page.

Refine the Create/Edit Issues Page

You refine the Create/Edit Page for the following reasons:

  • Add lists of values to make it easier for users to select foreign key columns

  • Organize and clean up items

  • Change the display of audit columns

  • Add a button to make data entry faster

Add Lists of Values

Next, you need to add lists of values for Status, Priorities, and People.

To add a list of values for Status:

  1. Go to the Page Definition for page 7, Create/Edit Issues. On the Page Definition, enter 7 in the Page field and click Go.

  2. Under Shared Components, Lists of Values, click the Create icon.

  3. For Create List of Values, accept the default, From Scratch, and click Next.

  4. On Create List of Values:

    1. Name - Enter STATUS.

    2. For Type, select Static.

    3. Click Next.

  5. Enter the Display Value and Return Value pairs shown in Table 14-5:

    Table 14-5 Display Value and Return Value Pairs

    Display ValueReturn Value

    Open

    Open

    On-Hold

    On-Hold

    Closed

    Closed


  6. Click Create List of Values.

To add a list of values for Priorities:

  1. On the Lists of Values page, click Create.

  2. For Create List of Values, accept the default, From Scratch, and click Next.

  3. On Create List of Values:

    1. Name - Enter PRIORITIES.

    2. For Type, select Static.

    3. Click Next.

  4. Enter the Display Value and Return Value pairs shown in Table 14-6.

    Table 14-6 Display Value and Return Value Pairs

    Display ValueReturn Value

    High

    High

    Medium

    Medium

    Low

    Low


  5. Click Create List of Values.

To add a list of values for People:

  1. On the Lists of Values page, click Create.

  2. For Create List of Values, accept the default, From Scratch, and click Next.

  3. On Create List of Values:

    1. For Name, enter PEOPLE.

    2. For Type, select Dynamic.

    3. Click Next.

  4. In Query, replace the existing statements with the following:

    SELECT person_name d, person_id v
       FROM ht_people
     ORDER BY 1
    
    
  5. Click Create List of Values.

  6. Go to the Page Definition for page 7.

Edit Specific Items

Next, you edit individual items.

To edit P7_IDENTIFIED_BY:

  1. Under Items on the Page Definition for Page 7, click P7_IDENTIFIED_BY.

  2. From the Display As list in the Name section, select Select List.

  3. Under List of Values:

    1. Named LOV - Select PEOPLE.

    2. Display Null - Select Yes. The base column is mandatory, but you do not want the first name in the list becoming the default value.

    3. Null display value - Enter:

       - Select Person -
      
      
  4. Click the Next button (>) at the top of the page to go to the next item, P7_IDENTIFIED_DATE.

    The Edit Page Item page appears.

To edit P7_IDENTIFIED_DATE:

  1. From the Display As list in the Name section, select Date Picker (DD-MON-YYYY).

  2. Scroll down to Default:

    1. Default value - Enter:

      to_char(sysdate,'DD-MON-YYYY')
      
      
    2. Default Value Type - Select PL/SQL Expression.

  3. Click the Next button (>) at the top of the page to go to the next item, P7_RELATED_PROJECT.

    The Edit Page Item page appears.

To edit P7_RELATED_PROJECT:

  1. From the Display As list in the Name section, select Select List.

  2. Scroll down to List of Values. For List of Values:

    1. Named LOV - Select PROJECTS.

    2. Display Null- Select Yes.

    3. Null display value - Enter:

       - Select Project -
      
      
  3. Click the Next button (>) at the top of the page until you go to P7_STATUS.

To edit P7_STATUS:

  1. From the Display As list in the Name section, select Radiogroup.

  2. Under Label, enter the following in the Label field:

    Status:
    
    
  3. Under Element, enter the following in the Form Element Option Attributes field:

    class="instructiontext"
    
    
  4. Under Default, enter Open in the Default Value field.

  5. Under List of Values:

    1. Named LOV - Select STATUS.

    2. Number of Columns - Enter 3.

      This selection enables the three valid values to display side by side.

  6. Click the Next button (>) at the top of the page to go to P7_PRIORITY.

To edit P7_PRIORITY:

  1. From the Display As list in the Name section, select Radiogroup.

  2. Under Label, enter the following in the Label field:

    Priority:
    
    
  3. Under Element, enter the following in the Form Element Option Attributes field:

    class="instructiontext"
    
    
  4. Under Default, enter Open in Default value.

  5. Under List of Values:

    1. Named LOV - Select PRIORITIES.

    2. Display Null - Select Yes.

    3. Number of Columns - Enter 4.

      This selection reflects the fact there are three valid values plus the null value.

    4. Null display value - Enter the following.

      None-
      
      
  6. Click the Next button (>) at the top of the page to go to P7_TARGET_RESOLUTION_DATE.

To edit P7_TARGET_RESOLUTION_DATE:

  1. From the Display As list in the Name section, select Date Picker (DD-MON-YYYY).

  2. Click the Next button (>) at the top of the page until you go to P7_ACTUAL_RESOLUTION_DATE.

To edit P7_ACTUAL_RESOLUTION_DATE:

  1. From the Display As list in the Name section, select Date Picker (DD-MON-YYYY).

  2. Click Apply Changes.

Create Regions to Group Items

Currently all items are grouped into one large region. Displaying items in logical groups makes data entry easier for users. Therefore, you next create four new regions named Buttons, Progress, Resolution, and Audit Information. You also rename an existing region.

To create new regions to group items:

  1. Under Regions, click the Create icon.

  2. Select Multiple HTML and then click Next.

  3. For the first row:

    • For Sequence, enter 5.

    • For Title, enter Buttons.

    • For Template, select Button Region without Title.

  4. For the second row, in Title enter Progress.

  5. For the third row, in Title enter Resolution.

  6. For the fourth row, in Title enter Audit Information.

  7. Click Create Region(s).

Now that the new regions exist, rename the first region, Create/Edit Issues:

  1. Under Regions, click Create/Edit Issues.

  2. In Title, enter:.

    Issue Identification
    
    
  3. Click Apply Changes.

Move Items to the Appropriate Regions

Next, move each item to the appropriate region. Note that you also need to modify some item widths.

To move items to the appropriate regions:

  1. Under Items, click the Edit All icon.

    The Page Items summary page appears.

  2. Under Region, select Progress for the following items:

    • P7_ASSIGNED_TO

    • P7_STATUS

    • P7_PRIORITY

    • P7_TARGET_RESOLUTION_DATE

    • P7_PROGRESS

  3. Under Region, select Resolution for the following items:

    • P7_ACTUAL_RESOLUTION_DATE

    • P7_RESOLUTION_SUMMARY

  4. Under Region, select Audit Information for the following items:

    • P7_CREATED_DATE

    • P7_CREATED_BY

    • P7_LAST_MODIFIED_DATE

    • P7_LAST_MODIFIED_BY

  5. Under Width, make the following edits:

    1. For P7_ISSUE_SUMMARY, enter 60.

    2. For P7_IDENTIFIED_DATE, enter 12.

    3. For P7_TARGET_RESOLUTION_DATE, enter 12.

    4. For P7_ACTUAL_RESOLUTION_DATE, enter 12.

  6. Click Apply Changes.

  7. Click the Edit Page icon in the upper right to return to the Page Definition of Page 7.

To move buttons to the Button region:

  1. Under Buttons, click the Edit All icon.

  2. Under Region, select Buttons for all buttons.

  3. Click Apply Changes.

  4. Click the Edit Page icon in the upper right to return the Page Definition of Page 7.

Change the Display of Audit Columns

Because the Audit columns should be viewable but not editable, you need to make them display only. In the following exercise, you create a condition for the Audit Information region. As a result, the Audit Information region displays when a user edits an existing issue, but does not appear when a user creates a new issue.

To create a condition for the Audit Information region.

  1. Under Regions, click Audit Information.

  2. Scroll down to Conditional Display.

  3. From Condition Type, select Value of Item in Expression 1 is NOT NULL.

  4. In Expression 1, enter the following:

    P7_ISSUE_ID
    
    
  5. Click Apply Changes.

Next, change the audit columns to display only.

To edit P7_CREATED_DATE:

  1. Under Items, click P7_CREATED_DATE.

  2. From the Display As list in the Name section, select Display as Text (saves state).

  3. Under Label:

    1. For Label, enter:

      Created Date:
      
      
    2. For Template, select Optional Label with Help.

    3. For HTML Table Cell Attributes, enter:

      class="instructiontext"
      
      
  4. Under Source, enter the following in Format Mask:

    DD-MON-YYYY
    
    
  5. Click the Next button (>) at the top of the page to go to the next item, P7_CREATED_BY.

To edit P7_CREATED_BY:

  1. From the Display As list in the Name section, select Display as Text (saves state).

  2. Under Label:

    1. For Label, enter:

      Created By:
      
      
    2. For Template, select Optional Label with Help.

    3. For HTML Table Cell Attributes, enter:

      class="instructiontext"
      
      
  3. Click the Next button (>) at the top of the page to go to the next item, P7_LAST_MODIFIED_DATE.

To edit P7_LAST_MODIFIED_DATE:

  1. From the Display As list in the Name section, select Display as Text (saves state).

  2. Under Label:

    1. For Label, enter:

      Last Modified Date:
      
      
    2. For Template, select Optional Label with Help.

    3. For HTML Table Cell Attributes, enter:

      class="instructiontext"
      
      
  3. Under Source, enter the following in Format Mask:

    DD-MON-YYYY
    
    
  4. Click the Next button (>) at the top of the page to go to the next item, P7_LAST_MODIFIED_BY.

To edit P7_LAST_MODIFIED_BY:

  1. From the Display As list in the Name section, select Display as Text (saves state).

  2. Under Label:

    1. For Label, enter:

      Last Modified By:
      
      
    2. For Template, select Optional Label with Help.

    3. For HTML Table Cell Attributes, enter:

      class="instructiontext"
      
      
  3. Click Apply Changes.

Remove Unnecessary Validations

The Form on a Table with Report Wizard created not null validations for Issue Summary, Identified By, Related Project, Status, Created Date, and Created By. Since the Audit columns are set by a trigger, you need to remove these validations.

To remove not null validations:

  1. Delete P7_CREATED_DATE not null:

    1. Under Page Processing, Validations, click P7_CREATED_DATE not null.

    2. Click Delete.

    3. Click OK to confirm your selection.

  2. Delete P7_CREATED_BY not null:

    1. Under Page Processing, Validations, click P7_CREATED_DATE not null.

    2. Click Delete.

    3. Click OK to confirm your selection.

Return the User to the Calling Page

Because this Create/Edit page will be called from several places, when users finish with the display, they should return to the calling page. To accomplish this, you create an item and change the branch on the Create/Edit page. Every time the Create/Edit page is called, the item must be set with the number of the calling page.

To create a hidden item:

  1. Under Items, click the Create icon.

  2. For Select Item Type, select Hidden and click Next.

  3. For Display Position and Name:

    1. Item Name - Enter:

      P7_PREV_PAGE
      
      
    2. Region - Select Issue Identification.

    3. Click Next.

  4. Click Create Item.

    The Page Definition for page 7 appears.

    Next, edit the Cancel button.

To edit the Cancel button:

  1. Under Buttons, click Cancel.

  2. Scroll down to Optional URL Redirect.

  3. In Page, enter:

    &P7_PREV_PAGE.
    
    

    Note the period at the end.

  4. Click Apply Changes.

    Next, edit the branch.

To edit the branch:

  1. Under Branches, select the After Processing branch, Go to Page.

  2. Under Action, enter the following in Page (be sure to include the period):

    &P7_PREV_PAGE.
    
    
  3. Click Apply Changes.

Add Functionality to Support Adding Multiple Issues Sequentially

Next, you add functionality that enables users to add more than one issue at a time. To accomplish this, you first add a new button and then create a new branch.

To add a new button:

  1. Under Buttons, click the Copy icon.

  2. For Button to copy, click CREATE.

  3. For Target Page, accept the default, 7, and click Next.

  4. For New Button:

    1. Button Name - Enter CREATE_AGAIN.

    2. Label - Enter Create and Create Another.

    3. Click Copy Button.

Functionally, the Copy Button currently works the same as the CREATE button. Next, create a branch that keeps the user on the Create page.

Note that this branch also resets P7_PREV_PAGE because the value of that item will be lost when the cache of the page is cleared. The sequence of this new branch will be 0. Setting the sequence to 0 makes the branch fire before the default branch but only when the Create and Create Another button is used.

To create a branch that keeps the user on the create page:

  1. Under Page Processing, Branches, click the Create icon.

  2. For Point and Type, accept the defaults and click Next.

  3. For Target:

    1. Page - Enter 7.

    2. Clear Cache - Enter 7.

    3. Set these items - Enter the following:

      P7_PREV_PAGE
      
      
    4. With these values - Enter the following (be sure to include the period):

      &P7_PREV_PAGE.
      
      
    5. Click Next.

  4. For Branch Conditions:

    1. Sequence - Enter 0.

    2. When Button Pressed - Select CREATE_AGAIN.

  5. Click Create Branch.

    The Page Definition for page 7 appears.

  6. Under Branches, select the newly created branch, Go to Page, next to 7.

  7. Under Action, select the include process success message check box.

  8. Click Apply Changes.

Run the Page

To see the changes, click the Run Page icon. The new form appears as shown in Figure 14-9.

Figure 14-9 Create/Edit Issues Form

Description of Figure 14-9 follows

The branch you just created is looking for a value in P7_PREV_PAGE. Since the page was not called from another page, the value has not been set. You need to fix that next.

Refine the Issues Report

Next, you refine the Issues report page to support dynamic modification of the query. To accomplish this, you must:

  • Move the Create button to a new region and edit the label

  • Create new items that enable the user to restrict the query

  • Add a WHERE clause to reference those new items

  • Alter the report column attributes to display each person's name and the project

  • Modify headings

Move Create Button to a New Region

To create a new region for the Create button:

  1. Go to the Page Definition for page 6, Issues.

  2. Under Regions, click the Create icon.

  3. Select HTML and click Next.

  4. Select HTML for region container and click Next.

  5. For Display Attributes:

    1. Title - Enter Buttons.

    2. Region Template - Select Button Region without Title.

    3. Display Point - Select Page Template Body (2. items below region content).

    4. Click Next.

  6. Click Create Region.

To move the Create button to the Buttons region:

  1. Under Buttons, click the Create link.

  2. Under Name, enter the following in the Text Label/Alt field:

    Add a New Issue
    
    
  3. Under Displayed, select Buttons in the Display in Region field.

  4. Under Optional URL Redirect:

    1. Set These Items - Enter:

      P7_PREV_PAGE
      
      
    2. For With These Values, enter 6.

  5. Click Apply Changes.

Change the Query and Display

Next, change the query to display the actual values for people and projects instead of the ID and then clean up the report display.

To edit column attributes for ISSUE_ID:

  1. Under Regions, select Report next to Issues.

    The Report Attributes page appears.

  2. Click the Edit Icon to the left of ISSUE_ID.

  3. Scroll down to Column Link. Under Column Link:

    1. For Item 2, Name, enter:

      P7_PREV_PAGE
      
      
    2. For Item 2, Value, enter 6.

  4. Click Apply Changes.

To edit column attributes for IDENTIFIED_BY, RELATED_PROJECT and ASSIGNED_TO:

  1. Click the Edit Icon to the left of IDENTIFIED_BY.

  2. Scroll down to Tabular Form Element. From Display As, select Display as Text (based on LOV, does not save state).

  3. Scroll down to Lists of Values. From Named LOV, select PEOPLE.

  4. Return to the top of the page and click the Next (>) icon.

    The Column Attributes page for RELATED_PROJECT appears.

  5. Scroll down to Tabular Form Element. From Display As, select Display as Text (based on LOV, does not save state).

  6. Scroll down to Lists of Values. Under List of Values:

    1. Named LOV - Select PROJECTS.

    2. Display Null - Select Yes.

    3. Null Text - Enter a hyphen (-).

  7. Return to the top of the page and click the Next (>) icon.

    The Column Attributes page for ASSIGNED_TO appears.

  8. Scroll down to Tabular Form Element. From Display As, select Display as Text (based on LOV, does not save state).

  9. Scroll down to Lists of Values. Under List of Values:

    1. Named LOV - Select PEOPLE.

    2. Display Null - Select Yes.

    3. Null Text - Enter a hyphen (-).

  10. Click Apply Changes.

    The Report Attributes page appears.

Next, you customize how the report displays by changing report attributes.

To alter the report display:

  1. From Headings Type (the radiogroup row at the top of Column Attributes), accept the default, Custom.

  2. For ISSUE_ID, delete the Heading text.

  3. For ISSUE_SUMMARY, change the Heading to Summary.

  4. For TARGET_RESOLUTION_DATE:

    1. Force the heading to wrap. In Heading, enter:

      Target<br>Resolution<br>Date
      
      
    2. For Column Alignment, select center.

    3. For Heading Alignment, select center.

  5. To sort on ISSUE_ID:

    1. For all columns except ISSUE_ID, check Sort.

    2. For ISSUE_SUMMARY, select 1 for Sort Sequence.

  6. Scroll down to Layout and Pagination. Specify the following:

    1. Show Null Values as - Enter a hyphen (-).

    2. Number of Rows - Enter 5.

  7. Under Sorting, select the light gray arrow for Ascending and Descending Image.

  8. Under Messages, enter the following in When No Data Found Message:

    No issues found.
    
    
  9. Click Apply Changes.

Add Support for Filtering

Although the report now displays nicely, it does not support filtering by the end user. To add this functionality, you first create items that enable the user to set values to query against. You will store these new items in a new region that will display above the report.

To create a new region:

  1. Under Regions, click the Create icon.

  2. Select HTML and then click Next.

  3. Select HTML for region container and click Next.

  4. For Display Attributes:

    1. For Title, enter Issue Report Parameters.

    2. For Region Template, accept the default, Reports Region.

    3. For Sequence, enter 5.

    4. Click Next.

  5. Click Create Region.

Next, create the items.

To create the item for Identified By:

  1. Under Items, click the Create icon.

  2. For Select Item Type, select Select List and click Next.

  3. For Select List Control Type, accept the default selection, Select List, and click Next.

  4. For Display Position and Name:

    1. For Item Name - Enter P6_IDENTIFIED_BY.

    2. For Region, select Issue Report Parameters.

    3. Click Next.

  5. For Identify List of Values:

    1. For Named LOV, select PEOPLE.

    2. For Null Text, enter:

      - All -
      
      
    3. For Null Value, enter:

      -1
      
      
    4. Click Next.

  6. For Item Attributes, accept the defaults and click Next.

  7. For Source, Default, enter:

    -1
    
    
  8. Click Create Item.

To create an item for Assigned To:

  1. Under Items, click the Create icon.

  2. For Select Item Type, select Select List and click Next.

  3. For Select List Control Type, accept the default selection, Select List, and click Next.

  4. For Display Position and Name:

    1. For Item Name, enter P6_ASSIGNED_TO.

    2. For Region, select Issue Report Parameters.

    3. Click Next.

  5. For Identify List of Values:

    1. Named LOV - Select PEOPLE.

    2. For Null Text - Enter:

      - All -
      
      
    3. For Null Value - Enter:

      -1
      
      
    4. Click Next.

  6. For Item Attributes, accept the defaults and click Next.

  7. For Source, Default, enter:

    -1
    
    
  8. Click Create Item.

To create an item for Status:

  1. Under Items, click the Create icon.

  2. For Select Item Type, select Select List and click Next.

  3. For Select List Control Type, accept the default selection, Select List, and then click Next.

  4. For Display Position and Name:

    1. Item Name - Enter P6_STATUS.

    2. For Region - Select Issue Report Parameters.

    3. Click Next.

  5. For Identify List of Values:

    1. For Named LOV - Select STATUS.

    2. For Null Text - Enter:

      - All -
      
      
    3. For Null Value - Enter:

      -1
      
      
    4. Click Next.

  6. For Item Attributes, accept the defaults and click Next.

  7. For Source, Default, enter:

    -1
    
    
  8. Click Create Item.

To create an item for Priority:

  1. Under Items, click the Create icon.

  2. For Select Item Type, select Select List and click Next.

  3. For Select List Control Type, accept the default selection, Select List, and click Next.

  4. For Identify Item Name and Display Position:

    1. For Item Name - Enter P6_PRIORITY.

    2. For Region - Select Issue Report Parameters.

    3. Click Next.

  5. For List of Values:

    1. For Named LOV - Select PRIORITIES.

    2. For Null Text - Enter:

      - All -
      
      
    3. For Null Value - Enter:

      -1
      
      
    4. Click Next.

  6. For Identify Item Attributes, accept the defaults and click Next.

  7. For Source, for Default, enter:

    -1
    
    
  8. Click Create Item.

To create an item for Related Project:

  1. Under Items, click the Create icon.

  2. For Select Item Type, select Select List and click Next.

  3. For Select List Control Type, accept the default selection, Select List and click Next.

  4. For Display Position and Name:

    1. For Item Name - Enter P6_RELATED_PROJECT.

    2. For Region - Select Issue Report Parameters.

    3. Click Next.

  5. For Identify List of Values:

    1. For Named LOV - Select PROJECTS.

    2. For Null Text - Enter:

      - All -
      
      
    3. For Null Value - Enter:

      -1
      
      
    4. Click Next.

  6. For Item Attributes, accept the defaults and click Next.

  7. For Source, for Default, enter:

    -1
    
    
  8. Click Create Item.

Next, create a Go button. This button enables the user to execute the query once they select report parameters. Buttons can be created in region positions or displayed among items.

To create Go button:

  1. Under Buttons, click the Create icon.

  2. For Button Region, select Issue Report Parameters and click Next.

  3. For Button Position, select Create a button displayed among this region's items.

    This selection displays the button to the right of the last report parameter.

  4. Click Next.

  5. For Button Attributes:

    1. Button Name - Enter P6_GO.

    2. Button Style - Select Template Based Button.

    3. Template - Select Button.

  6. Click Create Button.

    The Page Definition for page 6 appears.

Currently the items display stacked on top of one another. To use space more efficiently, change the position of P6_RELATED_PROJECT, P6_STATUS, and P6_PRIORITY so they display next to each other. Place P6_RELATED_PROJECT, P6_STATUS on the first line and P6_PRIORITY on the second line.

To change the position of P6_RELATED_PROJECT, P6_STATUS, and P6_PRIORITY:

  1. Under Items, click the Edit All icon.

  2. For P6_RELATED_PROJECT, P6_STATUS, and P6_PRIORITY, select No for New Line.

  3. Click Apply Changes.

  4. Click the Edit Page icon in the upper right corner to return to the Page Definition for page 6. The Edit Page icon resembles a small green piece of paper and pencil.

Next, you need to modify the report to react to the parameters. To accomplish this, you need to modify the query's WHERE clause as follows:

WHERE (IDENTIFIED_BY = :P6_IDENTIFIED_BY OR 
       :P6_IDENTIFIED_BY = '-1')
   AND (RELATED_PROJECT = :P6_RELATED_PROJECT OR 
       :P6_RELATED_PROJECT = '-1')
   AND (ASSIGNED_TO = :P6_ASSIGNED_TO OR 
       :P6_ASSIGNED_TO = '-1')
   AND (STATUS = :P6_STATUS OR 
       :P6_STATUS = '-1')
   AND (PRIORITY = :P6_PRIORITY OR 
       :P6_PRIORITIY = '-1')

To use the preceding WHERE clause, you must convert the Issues region into a PL/SQL Function Body Returning a SQL Query.

To turn the Issues region into a PL/SQL Function Body Returning a SQL Query:

  1. Under Regions, click Issues.

  2. Under Name, for Type, select SQL Query (PL/SQL function body returning SQL query).

  3. For Region Source, replace the existing statements with the following:

    DECLARE
    
       q VARCHAR2(32767); -- query
       w VARCHAR2(4000) ; -- where clause
       we VARCHAR2(1) := 'N'; -- identifies if where clause exists
    
    BEGIN
    
       q := 'SELECT "ISSUE_ID", '||
            ' "ISSUE_SUMMARY", '||
            ' "IDENTIFIED_BY", '||
            ' "RELATED_PROJECT", '||
            ' "ASSIGNED_TO", '||
            ' "STATUS", '||
            ' "PRIORITY", '||
            ' "TARGET_RESOLUTION_DATE", '||
    
            ' "ACTUAL_RESOLUTION_DATE" '||
            ' FROM "#OWNER#"."HT_ISSUES" '; 
    
       IF :P6_IDENTIFIED_BY != '-1'
          THEN 
          w := ' IDENTIFIED_BY = :P6_IDENTIFIED_BY ';
          we := 'Y';
       END IF;
    
       IF :P6_RELATED_PROJECT != '-1'
          THEN 
          IF we = 'Y'
             THEN 
             w := w || ' AND RELATED_PROJECT = :P6_RELATED_PROJECT ';
          ELSE
             w := ' RELATED_PROJECT = :P6_RELATED_PROJECT ';
             we := 'Y';
          END IF;
       END IF;
    
       IF :P6_ASSIGNED_TO != '-1'
          THEN 
          IF we = 'Y'
             THEN 
             w := w || ' AND ASSIGNED_TO = :P6_ASSIGNED_TO ';
        ELSE
             w := ' ASSIGNED_TO = :P6_ASSIGNED_TO ';
             we := 'Y';
        END IF;
       END IF;
    
       IF :P6_STATUS != '-1'
          THEN 
          IF we = 'Y'
             THEN 
             w := w || ' AND STATUS = :P6_STATUS ';
          ELSE
             w := ' STATUS = :P6_STATUS ';
             we := 'Y';
          END IF;
    END IF;
    
       IF :P6_PRIORITY != '-1'
           THEN 
           IF we = 'Y'
              THEN 
              w := w || ' AND PRIORITY = :P6_PRIORITY ';
           ELSE
              w := ' PRIORITY = :P6_PRIORITY ';
              we := 'Y';
           END IF;
       END IF;
    
       IF we = 'Y'
          THEN q := q || ' WHERE '|| w;
       END IF;
    
    RETURN q;
    
    END;
    
    
  4. Click Apply Changes.

Note that this function first sets the variable q to the original SELECT statement. It then builds a WHERE clause (w) composed of just the variables set by the user. If any variables have been set, it appends the WHERE clause to the original SELECT and passes that new SELECT to the database.

Run the Page

The report is now complete. Click the Run Page icon. The revised report appears and should resemble Figure 14-10.

Figure 14-10 Issues Report

Description of Figure 14-10 follows

To change the report parameters, make new selections under Issue Report Parameters and then click Go.

Add a Page to Support Assigning Multiple Issues Simultaneously

Currently, you can assign an issue by editing it. Next, you add a new page that enables users to assign multiple issues at once and modify the Related Project, Status, and Priority.

Create a Tabular Form

To add a new page to support assigning multiple issues:

  1. Go to the Application home page.

    
  2. Click Create Page.

  3. Select Form and click Next.

  4. Select Tabular Form and click Next.

  5. For Table/View Owner:

    1. Table/View Owner- Select the appropriate schema.

      For this exercise, assume that the purpose of this form is to enable users to assign issues, or update existing records, and not create or delete issues.

    2. Allowed Operations - Select Update Only.

    3. Click Next.

  6. For Table/View Name, select HT_ISSUES and click Next.

  7. For Displayed Columns:

    1. Press CTRL and select the following columns:

      • ISSUE_SUMMARY

      • IDENTIFIED_BY

      • IDENTIFIED_DATE

      • RELATED_PROJECT

      • ASSIGNED_TO

      • STATUS

      • PRIORITY

    2. Click Next.

  8. For Primary Key, accept the default, ISSUE_ID, and click Next.

  9. For Primary Key Source, accept the default, Existing trigger, and click Next.

  10. For Updatable Columns:

    1. Press CTRL and select the following columns:

      • RELATED_PROJECT

      • ASSIGNED_TO

      • STATUS

      • PRIORITY

    2. Click Next.

  11. For Page and Region Attributes:

    1. Page - Enter 8.

    2. Page Name - Enter Assign Issues.

    3. Region Title - Enter Assign Issues.

    4. Click Next.

  12. For Tab Options, accept the default, Do not use tabs, and then click Next.

  13. For Button Labels:

    1. For Cancel Button Label, accept the default.

    2. For Submit Button Label, enter Apply Changes.

    3. Click Next.

  14. For Branching, accept the defaults and click Next.

  15. Review your selections and then click Finish.

Add Lists of Values

Once you have created the initial tabular form, you need to add lists of values to make it easier to select issues. Additionally, you need to restrict the query to display only unassigned issues.

To add lists of values:

  1. From the Success page, click Edit Page.

    The Page Definition for page 8, Assign Issues, appears.

  2. Under Regions, click Assign Issues.

  3. Under Source, for Region Source, replace the existing statements with the following:

    SELECT "ISSUE_ID",
           "ISSUE_SUMMARY",
           "IDENTIFIED_BY",
           "IDENTIFIED_DATE",
           "RELATED_PROJECT",
           "ASSIGNED_TO",
           "STATUS",
           "PRIORITY"
      FROM "#OWNER#"."HT_ISSUES"
    WHERE assigned_to IS NULL
    
    

To edit report attributes:

  1. Select the Report Attributes tab at the top of the page.

    Edit the heading for ISSUE_SUMMARY.

  2. For ISSUE_SUMMARY, enter the following in the Heading field:

    Summary
    
    
  3. To sort by ISSUE_ID:

    1. For all columns except ISSUE_ID, select Sort.

    2. For IDENTIFIED_DATE, for Sort Sequence, select 1.

  4. Edit the following attributes for IDENTIFIED_BY:

    1. Click the Edit icon to the left of IDENTIFIED_BY.

    2. Under Tabular Form Element, for Display As, select Display as Text (based on LOV, does not save state).

    3. Scroll down to Lists of Values.

    4. For Named LOV, select PEOPLE.

    5. Click the Next button (>) at the top of the page to go to IDENTIFIED_DATE.

  5. Edit the following attributes for IDENTIFIED_DATE:

    1. Under Column Formatting, for Number/Date Format, enter DD-MON-YYYY.

    2. Click the Next button (>) at the top of the page to go to the RELATED_PROJECT column.

  6. Edit the following attributes for RELATED_PROJECT:

    1. Under Tabular Form Element, for Display As, select Select List (named LOV).

    2. Under List of Values, for Named LOV, select PROJECTS.

    3. Click the Next button (>) at the top of the page to go to the ASSIGNED_TO column.

  7. Edit the following attributes for ASSIGNED_TO:

    1. Under Tabular Form Element, for Display As, select Select List (named LOV).

    2. Under List of Values:

      • Named LOV - Select PEOPLE.

      • Display Null - Select Yes.

      • Null Text - Enter a hyphen (-).

    3. Click the Next button (>) at the top of the page to go to the STATUS column.

  8. Edit the following attributes for STATUS:

    1. Under Tabular Form Element, for Display As, select Select List (named LOV).

    2. Under List of Values, for Named LOV, select STATUS.

    3. Click the Next button (>) at the top of the page to go to the PRIORITY column.

  9. Edit the following attributes for PRIORITY:

    1. Under Tabular Form Element, for Display As, select Select List (named LOV).

    2. Under List of Values:

      • From Named LOV, select PRIORITIES.

      • For Display Null, select Yes.

      • For Null Text, enter a hyphen (-).

    3. Click Apply Changes.

    The Report Attributes page appears.

  10. Scroll down to Sorting. Under Ascending and Descending Image, select the light gray arrow.

  11. Under Messages, enter the following in When No Data Found Message:

    No Unassigned Issues.
    
    
  12. Click Apply Changes.

Delete the Unnecessary Cancel Button

The wizard created an unnecessary Cancel button.

To delete the Cancel button:

  1. On the Page Definition for page 8, click CANCEL in the Buttons section.

  2. Click Delete.

  3. Click OK to confirm your selection.

Run the Page

The tabular form is now complete. To view the new form, click the Run Page icon. The Assign Issues form appears as shown in Figure 14-11.

Figure 14-11 Assign Issues

Description of Figure 14-11 follows

To assign an issue, make a selection from the Assigned To list and then click Apply Changes. Notice that once an issue has been assigned, the issue no longer displays.

Create Summary Reports

Lastly, you need to add four summary reports.

Topics in this section include:

Add an Issue Summary by Project Report

The Issue Summary report enable users to select a project and then see a summary of issues related to that project. This report includes the following summary information:

  • Date first issue identified

  • Date last issue closed

  • Total number of issues

  • Number of issues by status

  • Number of open issues by priority

  • Assignments by status

To create this report, you code the information in two SQL statements. The first statement gathers information having a singular result and the second statement gathers information having multiple results.

To add an Issue Summary by Project report:

  1. Go to the Application home page.

  2. Click Create Page.

  3. Select Report and click Next.

  4. Select SQL Report and click Next.

  5. For Page Attributes:

    1. Page - Enter 9.

    2. Page Name - Enter Issue Summary by Project.

    3. Click Next.

  6. For Tab Options, accept the default, Do not use tabs, and click Next.

  7. For SQL Query:

    1. Enter the following SQL SELECT statement:

      SELECT MIN(identified_date) first_identified, 
             MAX(actual_resolution_date) last_closed,
             COUNT(issue_id) total_issues,
             SUM(DECODE(status,'Open',1,0)) open_issues,
             SUM(DECODE(status,'On-Hold',1,0)) onhold_issues,
             SUM(DECODE(status,'Closed',1,0)) closed_issues,
             SUM(DECODE(status,
                        'Open',decode(priority,null,1,0),
                        0))                     open_no_prior,
             SUM(DECODE(status,
                        'Open',decode(priority,'High',1,0),
                        0))                     open_high_prior,
             SUM(DECODE(status,
                        'Open',decode(priority,'Medium',1,0),
                        0))                     open_medium_prior,
             SUM(DECODE(status,
                        'Open',decode(priority,'Low',1,0),
                        0))                     open_low_prior
         FROM ht_issues
      WHERE related_project = :P9_PROJECT
      
      
    2. Click Next.

  8. For Report Attributes:

    1. Report Template - Select default: vertical report, look 1 (include null columns).

    2. For Region Name - Enter Issue Summary by Project.

    3. Accept the remaining defaults and click Next.

  9. Review your selections and click Finish.

Now that you have the first query, you need to edit the headings and create the item to control the related project. First, create a region to display above the report to contain the Project parameter.

Create a New Region

To create a new region to display above the report:

  1. From the Success page, click Edit Page.

    The Page Definition for page 9, Issue Summary by Project, appears.

  2. Under Regions, click the Create icon.

  3. Select HTML and click Next.

  4. Select HTML for region container and click Next.

  5. For Display Attributes:

    1. Title - Enter Issue Summary Report Parameters.

    2. Display Point - Select Page Template Body (2. items below region content).

    3. For Sequence, enter 5.

    4. Accept the remaining defaults and click Next.

  6. Click Create Region.

Create the Project Item

To create the Project item:

  1. Under Items, click the Create icon.

  2. For Select Item Type, select Select List and click Next.

  3. For Select List Control Type, accept the default, Select List, and click Next.

  4. For Display Position and Name:

    1. Item Name - Enter P9_PROJECT.

    2. Region - Select Issue Summary Report Parameters.

    3. Click Next.

  5. For List of Values:

    1. Named LOV - Select PROJECTS.

    2. Null Text - Enter:

      - Select -
      
      
    3. Null Text - Enter:

      - 1
      
      
    4. Click Next.

  6. For Item Attributes, accept the defaults and click Next.

  7. For Source, for Default, enter -1.

  8. Click Create Item.

Create a Go Button

To create a Go button to execute the query:

  1. Under Buttons, click the Create icon.

  2. For Button Region, select Issue Summary Report Parameters and click Next.

  3. For Button Position, select Create a button displayed among this region's items and click Next.

  4. For Button Attributes:

    1. Button Name - Enter P9_GO.

    2. Button Style - Select Template Based Button.

    3. Template - Select Button.

  5. Click Create Button.

Edit Headings and Report Settings

Next, you need to edit the headings and report setting for the report region. You also need to set the report regions to conditionally display when the user has selected a project.

To edit the headings and report settings:

  1. Under Regions, click Report next to Issue Summary by Project.

  2. For Headings Type, select Custom.

  3. Under Column Attributes:

    1. Change the Heading for FIRST_IDENTIFIED to:

      First Issue Identified:
      
      
    2. Change the Heading for LAST_CLOSED to:

      Last Issue Closed:
      
      
    3. Change the Heading for TOTAL_ISSUES to:

      Total Issues:
      
      
    4. Change the Heading for OPEN_ISSUES to:

      Open Issues:
      
      
    5. Change the Heading for ONHOLD_ISSUES to:

      On-Hold Issues:
      
      
    6. Change the Heading for CLOSED_ISSUES to:

      Closed Issues:
      
      
    7. Change the Heading for OPEN_NO_PRIOR to:

      Open Issues with No Priority:
      
      
    8. Change the Heading for OPEN_HIGH_PRIOR:

      Open Issues of High Priority:
      
      
    9. Change the Heading for OPEN_MEDIUM_PRIOR to:

      Open Issues of Medium Priority:
      
      
    10. Change the Heading for OPEN_LOW_PRIOR:

      Open Issues of Low Priority:
      
      
  4. Scroll down to Layout and Pagination. Specify the following:

    1. For Show Null Values as, enter a hyphen (-).

    2. For Pagination Scheme, select - No Pagination Selected -.

  5. Select the Region Definition tab at the top of the page.

    1. Scroll down to Conditional Display.

    2. For Condition Type, select Value of Item in Expression 1 Is NOT Contained within Colon Delimited List in Expression 2.

    3. In Expression 1, enter P9_PROJECT.

    4. For Expression 2, enter -1.

  6. Click Apply Changes.

Create a Query to Retrieve Assignments

To create a query to retrieve assignments by status.

  1. Under Regions, click the Create icon.

  2. Select Report and then click Next.

  3. For Report Implementation, select SQL Report and click Next.

  4. For Display Attributes:

    1. Title - Enter Assignments by Status.

    2. Column - Select 2.

    3. Accept the remaining defaults and click Next.

  5. For Source:

    1. SQL Query or PL/SQL function returning a SQL Query - Enter the following:

      SELECT p.person_name, 
             i.status, 
             COUNT(i.issue_id) issues
        FROM ht_issues i,
             ht_people p
      WHERE i.related_project = :P9_PROJECT
        AND i.assigned_to = p.person_id
      GROUP BY person_name, status
      
      
    2. Rows Per Page - Enter 20.

    3. Break Columns - Select Column 1.

    4. Accept the remaining defaults and click Next.

  6. For Conditional Display:

    1. Condition Type - Select Value of Item in Expression 1 Is NOT Contained within Colon Delimited List in Expression 2.

    2. In Expression 1 enter:

      P9_PROJECT
      
      
    3. For Expression 2 enter -1.

  7. Click Create Region.

To edit headings and report settings:

  1. Under Regions, click Report next to Assignments by Status.

  2. For Headings Type, select Custom.

  3. For PERSON_NAME, change Heading to Assigned To.

  4. Scroll down to Layout and Pagination. From Pagination Scheme, select Row Ranges 1-15 16-30 in select list (with pagination).

  5. Scroll down to Messages. In When No Data Found Message, enter:

    No issues found.
    
    
  6. Click Apply Changes.

Run the Page

To see your newly created report, click the Run Page icon. Note that initially no data displays since no project is selected. Select a project and click Go. Your report should resemble Figure 14-12.

Figure 14-12 Issue Summary by Project Report

Description of Figure 14-12 follows

Add Resolved by Month Identified Report

The Resolved by Month Identified report is a line chart. This report first calculates the number of days it took to resolve each closed issue, averaged by the month the issue was identified, and finally displayed by the month.

To add a Resolved by Month Identified report:

  1. Go to the Application home page.

  2. Click Create Page.

  3. Select Chart and click Next.

  4. Select SVG Chart and click Next.

  5. Select Line and click Next.

  6. For Page Attributes:

    1. Page Number - Enter 10.

    2. Page Name and Region Name - Enter Resolved by Month Identified.

    3. Accept the remaining defaults and click Next.

  7. For Tab Options, accept the default, Do not use tabs, and click Next.

  8. For Query:

    1. Series Name - Enter Resolved.

    2. SQL - Enter the following:

      SELECT NULL l,
             TO_CHAR(identified_date,'Mon YYYY') month, 
             AVG(actual_resolution_date-identified_date) days
         FROM ht_issues
        WHERE status = 'Closed'
        GROUP BY TO_CHAR(identified_date,'Mon YYYY')
      
      

      Note that this query has no link (that is, the l column). It extracts the month from the identified date so that the data can be grouped by month. Lastly, it calculates the average number of days it took for the issues to be closed that were identified in that month.

    3. For When No Data Found Message, enter:

      No Closed Issues found.
      
      
    4. Click Next.

  9. Review your selections and click Finish.

Edit the Chart

Next, add a correct axis label and turn off the Chart Title and legend.

To edit the chart:

  1. From the Success page, select Edit Page.

    The Page Definition for page 10, Resolved by Month Identified, appears.

  2. Under Regions, click SVG Chart, next to Resolved by Month Identified.

  3. Under Chart Settings:

    1. Chart Height - Enter 300.

    2. Deselect Show Legend.

  4. Scroll to Axes Setting:

    1. For X Axis Title, enter Date Identified.

    2. For Y Axis Title, enter Days to Resolve.

  5. Click Apply Changes.

Run the Page

To view your newly created line chart, click the Run Page icon. Your line chart should resemble Figure 14-13.

Figure 14-13 Resolved by Month Identified Line Chart

Description of Figure 14-13 follows

Add a Calendar to Display Issues

The Target Resolution Dates report is a calendar that displays issues that have not yet closed along with the assigned person on the day that corresponds to the issue target resolution date.

Create a Calendar

To create a calendar of target resolution dates:

  1. Go to the Application home page.

  2. Click Create Page.

  3. Select Calendar and click Next.

  4. Select SQL Calendar and click Next.

  5. For Page Attributes:

    1. Page Number - Enter 11.

    2. Page Name and Region Name - Enter Target Resolution Dates.

    3. Click Next.

  6. For Tab Options, accept the default, Do not use tabs, and click Next.

  7. For Table/View Owner:

    1. In Enter SQL Query, enter the following:

      SELECT I.TARGET_RESOLUTION_DATE,
             I.ISSUE_SUMMARY || 
                ' ('||nvl(P.PERSON_NAME,'Unassigned') ||') ' disp,
             I.ISSUE_ID
        FROM HT_ISSUES I, 
             HT_PEOPLE P
        WHERE I.ASSIGNED_TO = P.PERSON_ID (+)
         AND (I.RELATED_PROJECT = :P11_PROJECT OR
              :P11_PROJECT = '-1')
         
      AND I.STATUS != 'Closed'
      
      
    2. Click Next.

    Note that:

    • The target_resolution_date is the date on which the issue displays

    • The issue_summary is concatenated with the person assigned

    • The issue_id does not display, but is used to create a link to enable the user to view and edit the issue

  8. For Date/Display Columns:

    1. Date Column - Select TARGET_RESOLUTION_DATE.

    2. For Display Column - Select DISP.

    3. Click Next.

  9. Review your selections and click Finish.

Add an Item to Support Project Look Up

To enable the user to look up one project or all projects, you need to add an item.

To add an item to support project look up:

  1. From the Success page, select Edit Page.

    The Page Definition for page 11, Target Resolution Dates, appears.

  2. Under Items, click the Create icon.

  3. For Item Type, select Select List and click Next.

  4. For Select List Control Type, select Select List and click Next.

  5. For Display Position and Name:

    1. Item Name - Enter P11_PROJECT.

    2. Accept the remaining defaults and click Next.

  6. For List of Values:

    1. Named LOV - Select PROJECTS.

    2. Null Text - Enter:

      - All Projects -
      
      
    3. For Null Value - Enter:

      -1
      
      
    4. Click Next.

  7. For Item Attributes, accept the defaults and click Next.

  8. For Source, Default, enter:

    -1
    
    
  9. Click Create Item.

Create a Go Button

To create a Go button to execute the query:

  1. Under Buttons, click the Create icon.

  2. For Button Region, select Target Resolution Dates and click Next.

  3. For Button Position, select Create a button displayed among this region's items and click Next.

  4. For Button Attributes:

    1. Button Name - Enter P11_GO.

    2. Button Style - Select Template Based Button.

    3. Template - Select Button.

  5. Click Create Button.

Modify Calendar Attributes

Lastly, you need to modify the Calendar Attributes to add link support for viewing and editing the displayed issues. To accomplish this, you need to call page 7, View/Edit Issues, clear any data from the page and pass in the current issue ID along with the fact that page 11 was the calling page. Then, you need to add a note that displays when the query excludes Closed issues.

To modify the Calendar Attributes:

  1. Under Regions, click Calendar to the right of Target Resolution Dates.

  2. Scroll down to Column Link, enter the following:

    1. Page - Enter 7.

    2. Clear Cache - Enter 7.

    3. Set these items - Enter:

      P7_ISSUE_ID,P7_PREV_PAGE
      
      
    4. For With these values - Enter:

      #ISSUE_ID#,11
      
      
  3. Select the Region Definition tab at the top of the page.

  4. Scroll down to Header and Footer.

  5. In Region Footer, enter the following:

    This excludes Closed issues.
    
    
  6. Click Apply Changes.

Run the Page

To see your newly created calendar, click the Run Page icon. Your report should resemble Figure 14-14. Note that you can click Weekly or Daily to see the corresponding calendar views.

Note that you can also click the text displayed for an issue to display the Edit Issue page. To return to the calendar, click Cancel.

Figure 14-14 Target Resolution Dates Report

Description of Figure 14-14 follows



Add a Bar Chart that Displays Average Days to Resolve

The Average Days to Resolve report is a bar chart that calculates the number of days it takes to resolve each closed issue and then averages that number by assigned person.

To add the Average Days to Resolve report:

  1. Go to the Application home page.

  2. Click Create Page.

  3. Select Chart and click Next.

  4. Select HTML Chart and click Next.

  5. Select Bar (HTML) and click Next.

  6. For Page Attributes:

    1. Page - Enter 12.

    2. Page Name and Region Name - Enter Average Days to Resolve.

    3. Accept the remaining defaults and click Next.

  7. For Tab Options, accept the default, Do not use tabs, and click Next.

  8. For Chart Definition:

    1. Chart SQL - Replace the existing statements with the following:

      SELECT NULL l,
             NVL(p.person_name,'None Assigned') person, 
             AVG(i.actual_resolution_date-i.identified_date) days   
        FROM ht_issues i,
             ht_people p
       WHERE i.assigned_to = p.person_id (+)
         AND i.status = 'Closed'
       GROUP BY p.person_name
      
      

      In the above SELECT statement:

      • The first item selected is the link. This report does not link to any other page, and so NULL was selected.

      • The second item is the person's name, or None Assigned if assigned_to is NULL.

      • The third item selected is the average number of days it took for that person to resolve all their issues so the issues have a status of closed.

    2. For Include in summary, select only Number of data points. Deselect all other options.

    3. Accept the remaining defaults and click Next.

  9. Review your selections and click Finish.

Run the Page

To view your newly created bar chart, click Run Page. Your report should resemble Figure 14-15.

Figure 14-15 Average Days to Resolve Report

Description of Figure 14-15 follows

Add Content to the Home Page

Now that you have completed all the detail pages, you next need to add content to the home page and tie all the pages together. In this section, you modify the home page to display the following information:

  • A menu of all available reports

  • Navigation to the maintenance pages

  • A button to Add a New Issue

  • Overdue Issues

  • Recently Opened Issues

  • Open Issues by Project as a chart

  • Unassigned Issues

Topics in this section include:

Add a List

First, you add a menu implemented as a list.

To add a menu:

  1. Go to the Application home page.

  2. Click the Shared Components icon.

  3. Under Navigation, click Lists.

  4. Click Create.

  5. For Name, enter Main Menu.

  6. For List Template, select Vertical Sidebar List.

  7. Click Create.

Create List Entries

Now that the list has been created, you add list items to it. You need to add one list item for each report page.

To add a list item for Assign Issues:

  1. Click the Create List Entry button on the far right of the page.

  2. For List Entry Label, enter Assign Issues.

  3. Under Target, specify the following

    1. Page - Select 8.

    2. Select reset pagination for this page.

  4. Click Create.

    The List Entries page appears.

Now you need to create four more list items, one for each of the reports in your application.

To add four more list items:

  1. On the List Entries page, click Create List Entry.

  2. To define a list item for Issues:

    1. For Sequence, enter 20.

    2. For List Entry Label, enter Issues.

    3. Under Target, specify the following:

      • Page - Select 6.

      • Select reset pagination for this page.

      • Clear Cache - Enter 6.

        This clears any selections for page 6 from the session state.

  3. Click Create and Create Another.

  4. To define a list item for Issue Summary:

    1. For Sequence, enter 30.

    2. For List Entry Label, enter Issue Summary by Project.

    3. Under Target, specify the following:

      • Page - Select 9.

      • Select reset pagination for this page.

      • Clear Cache - Enter 9.

  5. Click Create and Create Another.

  6. To define a list item for Resolved by Month Identified:

    1. For Sequence, enter 40.

    2. For List Entry Label, enter Resolved by Month Identified (chart).

    3. Under Target, select 10 for Page.

  7. Click Create and Create Another.

  8. To define a list item for Target Resolution Dates:

    1. For Sequence, enter 50.

    2. For List Entry Label, enter Target Resolution Dates (calendar).

    3. Under Target, specify the following:

      • Page - Select 11.

      • Select reset pagination for this page.

  9. Click Create and Create Another.

  10. To define a list item for Average Days to Resolve:

    1. For Sequence, enter 60.

    2. For List Entry Label, enter Average Days to Resolve (chart).

    3. Under Target, select 12 for Page.

  11. Click Create.

Include the List on the Home Page

Now that the list is created, you need to include it on the home page. To display the list in the left margin, you need to change the page template to one that supports the appropriate region position.

To change the page template on the home page:

  1. Click the Edit Page icon in the upper right corner.

    The Page Definition for page 12, Average Days to Resolve, appears.

  2. In the Page field, enter 1 and click Go.

  3. Under Page, click the Edit page attributes icon.

    The Page attributes page appears.

  4. Under Display Attributes, for Page Template, select No Tabs with Sidebar.

  5. Click Apply Changes.

Next, create a region to contain your menu.

To create a new region:

  1. Under Regions, click the Create icon.

  2. Select List and click Next.

  3. For Display Attributes:

    1. Title - Enter Menu.

    2. Region Template - Select No Template.

    3. Display Point - Select Page Template Region Position 2 (or select the quick link [Pos. 2]).

    4. Click Next.

  4. For Source, select Main Menu.

  5. Click Create List Region.

Add Maintenance Navigation

Next, you need to add maintenance navigation as a list. This list will display just below the reports in the left margin.

  1. Go to the Application home page.

  2. Click the Shared Components icon.

  3. Under Navigation, click Lists.

  4. Click Create.

  5. For Name, enter Maintenance.

  6. For List Template, select Vertical Sidebar List.

  7. Click Create.

Next, create three list items. The first list item acts as a separator between the two navigation regions. The other two enable users to view people and projects.

To add list items:

  1. Click Create List Entry.

  2. To define the first list item:

    1. For List Entry Label, enter:

      &nbsp;
      
      
    2. Under Target, select 1 for Page.

  3. Click Create and Create Another.

  4. To define a list item for Projects:

    1. For Sequence, enter 20.

    2. For List Entry Label, enter:

      Projects
      
      
    3. Under Target:

      • For Page, select 2.

      • Check reset pagination for this page.

  5. Click Create and Create Another.

  6. To define a list item for People:

    1. For Sequence, enter 30.

    2. For List Entry Label, enter:

      People
      
      
    3. Under Target:

      • For Page, select 4.

      • Check reset pagination for this page.

  7. Click Create.

To create a region to display the new list.

  1. Click the Edit Page icon in the upper right corner.

  2. Under Regions, click the Create icon.

  3. Select List and click Next.

  4. For Display Attributes:

    1. Title - Enter Maintenance.

    2. Region Template - Select No Template.

    3. Display Point - Select Page Template Region Position 2 (or select the quick link [Pos. 2]).

    4. Click Next.

  5. For Source, select Maintenance.

  6. Click Create List Region.

Add a New Issues Button

Next, you create a button to navigate the user to page 7, Create/Edit Issue.

To create a region to contain the button:

  1. Under Regions, click the Create icon.

  2. Select HTML and click Next.

  3. Select HTML for the region container and click Next.

  4. For Display Attributes:

    1. Title - Enter Buttons.

    2. Region Template - Select No Template.

    3. Display Point - Select Page Template Region Position 1 (or select the quick link [Pos. 1]).

    4. Click Next.

  5. Click Create Region.

To add a button:

  1. Under Buttons, click the Create icon.

  2. For Button Region, select Buttons and click Next.

  3. For Button Position, accept the default, Create a button in a region position, and then click Next.

  4. For Button Attributes:

    1. Button Name - Enter ADD.

    2. Label - Enter:

      Add a New Issue
      
      
    3. Action - Select Redirect to URL without submitting page.

    4. Click Next.

  5. For Button Template, select Button and click Next.

  6. For Position, select Top of Region, accept the remaining defaults, and click Next.

    On the Branching page, you need to call the correct page, clear the cache, and specify that the Create and Cancel buttons return the user to the home page.

  7. For Branching, specify the following:

    1. Page - Select 7.

    2. Clear Cache - Enter 7.

    3. Set these items - Enter:

      P7_PREV_PAGE
      
      
    4. With these values - Enter 1.

  8. Click Create Button.

Add An Overdue Issues Report

Next, add some content to the home page. In this exercise, you add a report to display overdue issues. The query for this report retrieves all unclosed issues with a past target resolution date.

Add a Report of Overdue Issues

To add a report to display overdue issues:

  1. Under Regions, click the Create icon.

  2. Select Report and then click Next.

  3. For Report Implementation, select SQL Report and click Next.

  4. For Display Attributes, enter Overdue Issues in the Title field and click Next.

  5. For Source, enter the following in Enter SQL Query:

    SELECT i.issue_id,
           i.priority,
           i.issue_summary, 
           p.person_name assignee,
           i.target_resolution_date, 
           r.project_name
      FROM ht_issues i,
           ht_people p,
           ht_projects r
     WHERE i.assigned_to = p.person_id (+)
       AND i.related_project = r.project_id
       AND i.target_resolution_date < sysdate
       AND i.status != 'Closed'
    
    

    The outer join is necessary because the assignment is optional.

  6. Click Create Region.

Edit the Overdue Issues Report

Now that the region has been created, you need to edit the headings and turn the summary into a link to display the issue details.

To edit the column headings:

  1. Under Regions, click Report next to Overdue Issues.

  2. For Headings Type, select Custom.

  3. For ISSUE_ID, remove the Heading.

  4. For ISSUE_SUMMARY, enter the following for Heading:

    Summary
    
    
  5. For ASSIGNEE, change the Heading to:

    Assigned To
    
    
  6. For TARGET_RESOLUTION_DATE:

    1. For Heading, enter:

      Target<br>Resolution<br>Date
      
      
    2. For Column Alignment, select center.

    3. For Heading Alignment, select center.

  7. For ISSUE_ID, deselect Show.

    This enables the query to pass in the link, but not display it.

  8. To sort by issue ID, select Sort for all columns except ISSUE_ID.

  9. For TARGET_RESOLUTION_DATE, select 1 for Sort Sequence.

  10. For ISSUE_SUMMARY, select 2 for Sort Sequence.

To edit column attributes for ISSUE_SUMMARY:

  1. Click the Edit icon to the left of ISSUE_SUMMARY.

  2. Scroll down to Column Link:

    1. For Link Text, click the quick link of [Icon 3].

    2. For Page, select 7.

    3. For Clear Cache, select 7.

    4. For Item 1, enter the Name:

      P7_ISSUE_ID
      
      
    5. For Item 1, enter the Value:

      #ISSUE_ID#
      
      
    6. For Item 2, enter the Name:

      P7_PREV_PAGE
      
      
    7. For Item 2, enter the Value:

      1
      
      
  3. Click Apply Changes.

To select layout and pagination attributes:

  1. Under Layout and Pagination:

    1. For Pagination Scheme, select Search Engine 1,2,3,4 (set based pagination).

    2. For Number of Rows, enter 5.

  2. Under Sorting, select the light gray arrow for Ascending and Descending Image.

  3. Under Messages, enter the following in When No Data Found Message:

    No Overdue Issues.
    
    
  4. Click Apply Changes.

Add an Unassigned Issues Report

The next report you add displays unassigned, open issues. This report is very similar to Overdue Issues. Rather than creating it manually, you can copy the Overdue Issues report and modify it.

To create a new report by copying an existing report:

  1. Under Regions, click the Copy icon.

  2. In the Name column, click Overdue Issues.

  3. For To Page, accept the default 1, accept the remaining defaults, and click Next.

  4. For Region Name, enter Unassigned Issues.

  5. Click Copy Region.

To modify the query and edit the report region:

  1. Under the Regions section, click Unassigned Issues.

  2. For Region Source, replace the existing statements with the following:

    SELECT i.issue_id,
           i.priority,
           i.issue_summary, 
           i.target_resolution_date, 
           r.project_name,
           p.person_name identifiee
      FROM ht_issues i,
           ht_people p,
           ht_projects r
     WHERE i.assigned_to IS NULL
       AND i.status != 'Closed'
       AND i.related_project = r.project_id
       AND i.identified_by = p.person_id
    
    
  3. Select the Report Attributes tab at the top of the page.

    Note that previously defined columns have retained their modified attributes.

  4. For IDENTIFIEE, enter the following Heading:

    Identified By
    
    
  5. Under Messages, enter the following in When No Data Found Message:

    No Unassigned Issues.
    
    
  6. Click Apply Changes.

Add a Recently Opened Issues Report

Lastly, you add a report of recently opened issues. The underlying query displays the five most recently opened issues.

To create a report of recently opened issues by copying an existing report:

  1. Under Regions, click the Copy icon.

  2. Under Name, select Unassigned Issues.

  3. For To Page, accept the default 1, accept the remaining defaults, and click Next.

  4. For Region Name, enter Recently Opened Issues.

  5. Click Copy Region.

To modify the query and edit the report region:

  1. Under Regions, click Report next to Recently Opened Issues.

  2. For all columns:

    1. Disable sorting by deselecting Sort.

    2. Set Sequence to -.

  3. Select the Region Definition tab at the top of the page.

  4. For Region Source, replace the existing statements with the following:

    SELECT issue_id,
           priority,
           issue_summary, 
           assignee,
           target_resolution_date, 
           project_name,
           identifiee
    FROM 
    (
    SELECT i.issue_id,
           i.priority,
           i.issue_summary, 
           p.person_name assignee,
           i.target_resolution_date, 
           r.project_name,
           p2.person_name identifiee
      FROM ht_issues i,
           ht_people p,
           ht_people p2,
           ht_projects r
     WHERE i.assigned_to = p.person_id (+)
       AND i.related_project = r.project_id
       AND i.identified_by = p2.person_id
       AND i.created_date > (sysdate - 7)
     ORDER BY i.created_date desc
    )
     WHERE rownum < 6
    
    
  5. Select the Report Attributes tab at the top of the page.

  6. For ASSIGNEE, click the up arrow to the right of the Sort Sequence column until ASSIGNEE appears after ISSUE_SUMMARY.

  7. For ASSIGNEE, change Heading to:

    Assigned To
    
    
  8. Scroll down to the Layout and Pagination section. From Pagination Scheme, select - No Pagination Selected -.

  9. Under Messages, enter the following in When No Data Found Message:

    No Recently Opened Issues.
    
    
  10. Click Apply Changes.

Add an Open Issues by Project Pie Chart

Next, add a pie chart displaying Open Issues by Project.

To add a pie chart:

  1. Under Regions, click the Create icon.

  2. Select Chart and click Next.

  3. Select SVG Chart and click Next.

  4. Select Pie and click Next.

  5. For Display Attributes, enter Open Issues by Project in Title and then click Next.

  6. For Source, enter the following in SQL:

    SELECT NULL LINK,
           NVL(r.project_name,'No Project') label,
           COUNT(r.project_name) value
      FROM ht_issues i,
           ht_projects r
     WHERE i.status = 'Open'
       AND i.related_project = r.project_id
    GROUP BY NULL, r.project_name
    ORDER BY r.project_name
    
    

    Note that this query does not include a link, the label is the Project Name, and the value calculated and used for the pie chart is the total number of open issues by project.

  7. Click Create Region.

To edit the chart.

  1. Under Regions, click SVG Chart next to Open Issues by Project.

  2. For Chart Width, enter 500.

  3. For Chart Height, enter 200.

  4. For Chart Title, remove the title.

  5. Under Chart Query, enter the following in When No Data Found Message:

    No Open Issues.
    
    
  6. Under Font Settings, for Legend, select 14 for the Font Size.

  7. Click Apply Changes.

Run the Page

To view the revised page, click the Run Page icon. Your home page should resemble Figure 14-16.

Figure 14-16 Revised Home Page

Description of Figure 14-16 follows

Add a Breadcrumb Menu

In the previous exercise, you created menus on the home page to enable users to navigate to various pages within your application. Next, you need to provide users with a way to navigate to the home page. You can accomplish this by utilizing breadcrumbs. You can add breadcrumbs when you create a new page, or manually after you create your pages.

In the next exercise, you add breadcrumb entries and then include that breadcrumb within a region on page 0. Adding components to page 0 makes them display on all pages with an application.

Topics in this section include:

Navigate to the Breadcrumbs Page

To navigate to the Breadcrumbs page:

  1. Go to the Application home page.

  2. Click Shared Components.

  3. Under Navigation, click Breadcrumbs.

  4. Click the Breadcrumb icon.

    The Breadcrumb Entries page appears.

Add Breadcrumb Entries

Next, you edit the existing breadcrumb entry and add breadcrumb entries for other pages.

Edit Breadcrumb Entry for Page 1

To edit the breadcrumb entry for page 1:

  1. Under Breadcrumb Entries, click Page 1.

  2. Under Breadcrumb, enter 1 in Page.

  3. Under Entry, enter Home for Short Name.

  4. Under Target, enter 1 in Page.

  5. Click Apply Changes.

Create Breadcrumb Entry for Page 2

To add a breadcrumb entry for page 2:

  1. Click Create Breadcrumb Entry.

  2. Under Breadcrumb, enter 2 in Page.

  3. Under Entry:

    1. Parent Entry - Select Home.

    2. Short Name - Enter Projects.

  4. Under Target, enter 2 in Page.

  5. Click Create.

Create Breadcrumb Entry for Page 3

To create a breadcrumb entry for page 3:

  1. Click Create Breadcrumb Entry.

  2. Under Breadcrumb, enter 3 in Page.

  3. Under Entry:

    1. Parent Entry - Select Projects.

    2. For Short Name - Enter Create/Edit Projects.

  4. Under Target, enter 3 in Page.

  5. Click Create.

Create Breadcrumb Entry for Page 4

To create a breadcrumb entry for page 4:

  1. Click Create Breadcrumb Entry.

  2. Under Breadcrumb, enter 4 in Page.

  3. Under Entry:

    1. For Parent Entry - Select Home.

    2. For Short Name - Enter People.

  4. Under Target, enter 4 in Page.

  5. Click Create.

    Note that the People breadcrumb entry is a sibling to Projects.

Create Breadcrumb Entry for Page 5

To create a breadcrumb entry for page 5:

  1. Click Create Breadcrumb Entry.

  2. Under Breadcrumb, enter 5 in Page.

  3. Under Entry:

    1. For Parent Entry - Select People.

    2. For Short Name - Enter Create/Edit Person Information.

  4. Under Target, enter 5 in Page.

  5. Click Create.

Create Breadcrumb Entry for Page 6

To create a breadcrumb entry for page 6:

  1. Click Create Breadcrumb Entry.

  2. Under Breadcrumb, enter 6 in Page.

  3. Under Entry:

    1. For Parent Entry - Select Home.

    2. For Short Name - Enter Issues.

  4. Under Target, enter 6 in Page.

  5. Click Create.

Create Breadcrumb Entry for Page 7

To create a breadcrumb entry for page 7:

  1. Click Create Breadcrumb Entry.

  2. Under Breadcrumb, enter 7 in Page.

  3. Under Entry:

    1. For Parent Entry - Select Home.

    2. For Short Name - Enter Create/Edit Issue.

  4. Under Target, enter 7 in Page.

  5. Click Create.

Create Breadcrumb Entry for Page 8

To create a breadcrumb entry for page 8:

  1. Click Create Breadcrumb Entry.

  2. Under Breadcrumb, enter 8 in Page.

  3. Under Entry:

    1. For Parent Entry - Select Home.

    2. For Short Name - Enter Assign Issues.

  4. Under Target, enter 8 in Page.

  5. Click Create.

Create Breadcrumb Entry for Page 9

To create a breadcrumb entry for page 9:

  1. Click Create Breadcrumb Entry.

  2. Under Breadcrumb, enter 9 in Page.

  3. For Entry:

    1. For Parent Entry - Select Home.

    2. For Short Name - Enter Issue Summary by Project.

  4. Under Target, enter 9 in Page.

  5. Click Create.

Create Breadcrumb Entry for Page 10

To create a breadcrumb entry for page 10:

  1. Click Create Breadcrumb Entry.

  2. Under Breadcrumb, enter 10 in Page.

  3. Under Menu Option:

    1. For Parent Entry- Select Home.

    2. For Short Name - Enter Resolved by Month Identified.

  4. Under Target, enter 10 in Page.

  5. Click Create.

Create Breadcrumb Entry for Page 11

To create a breadcrumb entry option for page 11:

  1. Click Create Breadcrumb Entry.

  2. Under Breadcrumb, enter 11 in Page.

  3. Under Entry:

    1. For Parent Entry - Select Home.

    2. For Short Name - Enter Target Resolution Dates.

  4. Under Target, enter 11 in Page.

  5. Click Create.

Create Breadcrumb Entry for Page 12

To create a breadcrumb entry for page 12:

  1. Click Create Breadcrumb Entry.

  2. Under Breadcrumb, enter 12 in Page.

  3. Under Entry:

    1. For Parent Entry - Select Home.

    2. For Short Name - Enter Average Days to Resolve.

  4. Under Target, enter 12 in Page.

  5. Click Create.

Create a Page 0

Now that the breadcrumb exists, you need to create page 0 and then create a region to contain your Breadcrumb menu. Adding components to page 0 makes them display on all pages with an application.

To create a page 0:

  1. Go to the Application home page.

  2. Click Create Page.

  3. Select Blank Page and click Next.

  4. For Page Attributes, enter 0 for Page Number and click Next.

  5. For Page Name, enter Breadcrumbs for Name and click Next.

  6. On Tabs, accept the default, No, and then click Next.

  7. Review your selections and click Finish.

Create a Region to Contain the Breadcrumb

To create a region to contain your breadcrumb:

  1. From the Success page, select Edit Page.

    The Page Definition for page 0 appears.

  2. Under Regions, click the Create icon.

  3. For Identify the type of region to add to this page, select Breadcrumb and click Next.

  4. For Breadcrumb Container Region:

    1. Region Title - Enter Breadcrumbs.

    2. Region Template - Select No Template.

    3. Display Point - Select Page Template Region Position 1.

      This selection displays the breadcrumb above all other content on the page.

    4. Click Next.

  5. For Breadcrumb, accept the defaults and click Next.

  6. For Breadcrumb Entry, accept the defaults and click Next.

  7. Click Finish.

Return to the home page by clicking Edit Page. When the Page Definition for page 0 appears, click the Next Page button (>). The Page Definition for page 1 appears.

Run the Page

To see your completed home page, click the Run Page icon. Your home page should resemble Figure 14-17.

Figure 14-17 Revised Home Page with Breadcrumb Menu

Description of Figure 14-17 follows

Notice the Breadcrumb in the top bar. Click one of the items on the Maintenance menu on the left side of the page. Notice how the breadcrumb changes.

At this stage your application is fully functional, but is missing the security and email notification. Those topics are discussed in the next section.

Adding Advanced Features

Once your application is fully functional you can focus on adding advanced features outlined during the planning and project analysis phase.

Topics in this section include:

Add Support for Email Notification

The planning and project analysis phase produced two email requirements:

  • Notify people when an issue is assigned to them

  • Notify the project lead when any issue becomes overdue

Topics in this section include:

How Email Notification Works

To send mail from within an Oracle Application Express application, you create a PL/SQL process that calls the supplied APEX_MAIL package.

Email is not sent immediately, but is stored in a temporary queue until a DBMS_JOB pushes the queue. The DBMS_JOB utilizes two preferences, SMTP Host Address and SMTP Host Port, to send mail in the queue. By default, these preferences are set to localhost and 25. If Oracle Application Express is not configured for SMTP services, you need to change your Email Environment Settings.


See Also:

"How to Send Email from an Application" in Oracle Database Application Express User's Guide to learn about configuring Email Environment settings.

The following is a description of the SEND procedure of the APEX_MAIL package.

PROCEDURE SEND
Argument Name                  Type                    In/Out Default?
------------------------------ ----------------------- ------ --------
P_TO                           VARCHAR2                IN
P_FROM                         VARCHAR2                IN
P_BODY                         VARCHAR2                IN
P_BODY_HTML                    VARCHAR2                IN     DEFAULT
P_SUBJ                         VARCHAR2                IN     DEFAULT
P_CC                           VARCHAR2                IN     DEFAULT
P_BCC                          VARCHAR2                IN     DEFAULT

Add Notification of New Assignments

First, you add a notification to a person when the person has a new assignment. An assignment can be made or changed from two different pages: Create/Edit Issue and Assign Issues.

On the Create/Edit Issue page, you can store the initial values and then check them against any changes to see if an assignment has been made or changed. The Assign Issues is a tabular form, so there is no way to check the old values against the new values. For that reason, the best way to implement the notification is with a before insert and update trigger on HT_ISSUES. You can create this trigger programmatically using SQL Workshop.

To create a before insert and update trigger on HT_ISSUES:

  1. On the Workspace home page, click SQL Workshop and then Object Browser.

  2. Click Create.

  3. For Select the type of database object you want to create, click Trigger.

  4. For Table Name, select HT_ISSUES and click Next.

  5. For Define:

    1. For Trigger Name, enter BIU_HT_ISSUES_NOTIFY_ASSIGNEE.

    2. For Firing Point, select AFTER.

    3. For Options, select insert, update.

    4. For Trigger Body, enter the following:

      IF (INSERTING AND 
          :new.assigned_to IS NOT NULL) 
         OR
         (UPDATING AND
          (:old.assigned_to IS NULL OR 
           :new.assigned_to != :old.assigned_to) AND
         :new.assigned_to IS NOT NULL)
         THEN
            FOR c1 IN 
               (SELECT person_name, person_email
                  FROM ht_people
                 WHERE person_id = :new.assigned_to)
            LOOP
      
            IF c1.person_email IS NOT NULL
               THEN
                  FOR c2 IN 
                      (SELECT project_name
                         FROM ht_projects
                        WHERE project_id = :new.related_project)
                  LOOP
      
                 -- APEX_MAIL.SEND(
                 --    p_to => c1.person_email,
                 --    p_from => c1.person_email,
                 --    p_body => 
                 --       'You have been assigned a new issue. 
                 --       'The details are below. ' ||chr(10)||
                 --        chr(10)||
                 --       ' Project: '|| c2.project_name ||chr(10)||
                 --       ' Summary: '||:new.issue_summary ||chr(10)||
                 --       ' Status: '||:new.status ||chr(10)||
                 --       'Priority: '||nvl(:new.priority,'-'),
                 --   p_subj => 'New Issue Assignment');
                  END LOOP;
            END IF;
      
        END LOOP;
      END IF;
      
      
    5. To make this work within your environment, uncomment the APEX_MAIL.SEND and replace the p_to and p_from with your own valid email address.

    6. Click Next.

  6. To review the code, expand the SQL arrow.

  7. Click Finish.

Add Notification for Overdue Issues

The second email notification notifies the project lead whenever an issue becomes overdue. An issue becomes overdue when the target resolution date has passed, but the issue is not yet closed. There is no human interaction to determine if an issue is overdue, so you cannot check for it on a page or in a trigger.

The best way to check for overdue issues is to write a package that queries the HT_ISSUES table. If it finds any overdue issues, the package initiates an email to the Project Lead. This procedure checks for issues by project so that the project lead can receive just one email with all overdue issues rather than an email for each issue. The package will be called once a day by a dbms_job.

You can use the Create Object function as follows:

  • Create the package and package body from within the SQL Workshop

  • Use SQL Command Processor to run the create commands

To create the package:

  1. On the Workspace home page, click SQL Workshop and then SQL Commands.

    SQL Commands appears.

  2. Enter the following in the field provided:

    CREATE OR REPLACE package ht_check_overdue_issues
    AS
       PROCEDURE email_overdue;
    END;
    /
    
    
  3. Click Run.

To create the package body:

  1. On the Workspace home page, click SQL Workshop and then SQL Commands.

    SQL Commands appears.

  2. Enter the following in the field provided:

    CREATE OR REPLACE PACKAGE BODY ht_check_overdue_issues
    AS
    
    PROCEDURE email_overdue
    IS
       l_msg_body varchar2(32000) := null;
       l_count number             := 0;
    BEGIN
    
    FOR c1 IN
       (SELECT pr.project_id,
               pr.project_name,
               pe.person_name,
               pe.person_email
          FROM ht_projects pr,
               ht_people pe
         WHERE pr.project_id = pe.assigned_project
           AND pe.person_role = 'Lead')
    LOOP
       FOR c2 IN
          (SELECT i.target_resolution_date,
                  i.issue_summary,
                  p.person_name,
                  i.status,
                  i.priority
             FROM ht_issues i,
                  ht_people p
            WHERE i.assigned_to = p.person_id (+)
              AND i.related_project = c1.project_id
              AND i.target_resolution_date < SYSDATE
              AND i.status != 'Closed'
         ORDER BY i.target_resolution_date, i.issue_summary)
    LOOP
       IF l_count = 0
          THEN
             l_msg_body := 
               'As of today, the following issues '||
               'are overdue:'||chr(10)||
                chr(10)||
               ' Project: '|| c1.project_name ||chr(10)||
                chr(10)||
              '     Target: '||c2.target_resolution_date ||chr(10)||
              '    Summary: '||c2.issue_summary ||chr(10)||
              ' Status:     '||c2.status ||chr(10)||
              ' Priority:   '||c2.priority ||chr(10)||
              'Assigned to: '||c2.person_name;
     ELSE 
            l_msg_body := l_msg_body ||chr(10)||
                chr(10)||
             '     Target: '||c2.target_resolution_date ||chr(10)||
             '    Summary: '||c2.issue_summary ||chr(10)||
             '     Status: '||c2.status ||chr(10)||
             ' Priority:   '||c2.priority ||chr(10)||
             'Assigned to: '||c2.person_name;
    END IF;
    l_count := l_count + 1;
    END LOOP;
    
     IF l_msg_body IS NOT NULL
       THEN
       -- APEX_MAIL.SEND(
       --    p_to => c1.person_email,
       --    p_from => c1.person_email,
       --    p_body => l_msg_body, 
       --   p_subj => 'Overdue Issues for Project '||
                       c1.project_name);
     END IF;
     l_count := 0;
    
    END LOOP;
    
    END email_overdue;
    
    END ht_check_overdue_issues;
    /
    
    

    To make this work within your environment, uncomment the APEX_MAIL.SEND and replace the p_to and p_from with your own valid email address.

  3. Click Run.

    Next, you want to update the demonstration data to include your employees' valid email addresses.

To update demonstration data to include valid email addresses:

  1. On the Workspace home page, click SQL Workshop and then Object Browser.

  2. From the Object list on the left side of the page, select Tables.

  3. Select the HT_PEOPLE table.

  4. Select the Data tab.

  5. For each person, edit the email address:

    1. Click the Edit icon.

    2. Change Person Email to a valid email address.

    3. Click Apply Changes.

  6. Repeat step 5 for all people within the HT_PEOPLE table.

  7. Return to the Workspace home page by clicking the Home breadcrumb link.

    Next, you want to create a DBMS_JOB that executes your newly created package at a time interval you specify.

To create the DBMS_JOB:

The following is an example of a DBMS_JOB that executes your newly created package. To make this a valid DBMS_JOB, however, you need to set the interval appropriately and execute it using SQL Commands within the SQL Workshop.

DECLARE
   jobno number;
BEGIN
   DBMS_JOB.SUBMIT(
      job => jobno,
     what => 'BEGIN
              ht_check_overdue_issues.email_overdue;
              END;',
next_date => SYSDATE,
 interval => desired_interval 
             );
   COMMIT;
END;
/

For this DBMS_JOB, replace desired_interval with the appropriate interval. For example, to have this job execute once each day, you would replace desired_interval with the following:

'TRUNC(SYSDATE)+(25/24)'

See Also:

Send email from Application Express applications How To on OTN at:
http://www.oracle.com/technology/products/database/application_express/howtos/index.html


Add Application Security

The planning and project analysis phase produced two security requirements:

  • Only the CEO and Managers can define and maintain projects and people

  • Once assigned, only the person assigned or a project lead can change data about the issue

Within Oracle Application Express, you can define authorization schemes. Authorization controls user access to specific controls or components based on user privileges. Once defined, you can associate an authorization scheme with any page, region, or item to restrict access. Each authorization schema is run only when needed and is defined to validate either once for each page view or once for each session.

Topics in this section include:

Restrict Project and People Definition

The first requirement states that only the CEO and Managers may define and maintain projects and people. To address this requirement, you:

  • Create an authorization scheme to check the current user's role

  • Associate the authorization scheme with the items on the Projects and People report that navigate to the Create/Edit pages

  • Associate the authorization scheme with the Create/Edit pages themselves so that a user cannot bypass the security by manually editing the URL to the target page

To reference the current user, use the session variable :APP_USER. This session variable is compared with the person's email address (which is the same as their workspace or workspace name). Whenever coding this type of security, you should always code in a user that can pass all security. You may find this user very useful for development and testing. If you do not take this approach, you may not be able to access the restricted pages unless you define yourself as the CEO or Manager.

Create the Authorization Scheme

To create the authorization scheme:

  1. On the Workspace home page, click Application Builder.

  2. Select the Issue Tracker application.

  3. Click Shared Components.

  4. Under Security, click Authorization Schemes.

  5. Click Create.

  6. For Create Authorization Scheme, accept the default, From Scratch, and click Next.

  7. Under Authorization Scheme, enter the following in Name:

    USER_CEO_OR_MANAGER
    
    
  8. Under Authorization Scheme:

    1. Scheme Type - Select Exists SQL Query.

    2. Expression 1 - Enter:

      SELECT '1'
        FROM ht_people
       WHERE (upper(person_email) = UPPER(:APP_USER) AND
              person_role IN ('CEO','Manager'))
          OR (UPPER(:APP_USER) = 'HOWTO')
      
      
    3. Identify error message displayed when scheme violated - Enter:

      You are not authorized to access this function.
      
      
  9. Scroll down to Evaluation Point. For Validate authorization scheme, select Once per session.

    This selection is sufficient in this instance as the assigned role typically does not change within a given session.

  10. Click Create.

Next, you need to associate the authorization scheme with the appropriate objects.

Associate Objects on the Projects Report

To associate the authorization scheme with the Projects report:

  1. Click the Edit Page icon in the upper right corner. The Edit Page icon resembles a small green piece of paper and pencil.

  2. In Page, enter 2 and then click Go.

    The Page Definition for page 2, Projects, appears.

  3. Under Regions, click Report next to Projects.

  4. Click the Edit icon to the left of PROJECT_ID.

  5. Under Authorization, select the Authorization Scheme USER_CEO_OR_MANAGER.

  6. Click Apply Changes.

  7. Click Cancel.

To associate the authorization scheme with the Create button on the Projects report:

  1. Under Buttons on the Page Definition for page 2, click the Create link (not the icon).

    The Edit Page Buttons page appears.

  2. Under Authorization, select the Authorization Scheme USER_CEO_OR_MANAGER.

  3. Click Apply Changes.

Associate Objects with the Create/Edit Report

To associate the authorization scheme with the Create/Edit Project page:

  1. Go to page 3 by clicking the Next Page (>) button.

    The Page Definition for page 3, Create/Edit Project, appears.

  2. Under Page, click the Edit page attributes icon.

    The Page attributes page appears.

  3. Under Security, select the Authorization Scheme USER_CEO_OR_MANAGER.

  4. Click Apply Changes.

Associate Objects with the People Report

To associate the authorization scheme with the People report.

  1. Go to page 4 by clicking the Next Page (>) button.

    The Page Definition for page 4, People, appears.

  2. Under Regions, click Report next to People.

  3. Click the Edit icon to the left of PERSON_ID.

  4. Under Authorization, select the Authorization Scheme USER_CEO_OR_MANAGER.

  5. Click Apply Changes.

  6. Click Cancel.

To associate the authorization scheme with the Create button on the People report:

  1. Go to page 5 by clicking the Next Page (>) button.

    The Page Definition for page 5 appears.

  2. Under Buttons, click the Create link (not the icon).

    The Edit Page Buttons page appears.

  3. Under Authorization, select the Authorization Scheme USER_CEO_OR_MANAGER.

  4. Click Apply Changes.

To associate the authorization scheme with the Create/Edit Person Information page:

  1. Under Page, click the Edit page attributes icon.

    The Page attributes page appears.

  2. Under Security, select the Authorization Scheme USER_CEO_OR_MANAGER.

  3. Click Apply Changes.

You can test this by creating a user with the user name of HOWTO. The HOWTO user should be able to see the edit link. Then, create another user, HOWTO2. This user should not be able to see the link.


See Also:

"Create Users"

Restrict Issue Modification

The second requirement states that once an issue has been assigned, only the person assigned (or a project lead) can change data about the issue. This requirement is a little trickier since it changes for every issue.

Currently, there are two pages that enable users to modify an issue: the Create/Edit Issue page and the Assign Issues page. On the Assign Issues page, the only issues that are displayed are those that are unassigned. As the issues are unassigned, security is not necessary.

There are many places that a user can navigate to edit an issue:

  • Three regions on the home page display issues or have edit links

  • The Issues report has links to edit each issue

  • The Target Resolution Dates report enables users to select an issue to edit.

Although other users are not allowed to change the data, you do want to enable users to view all the detailed data about an issue so that they can view the progress and resolution. Given this requirement, the best approach is to create an authorization scheme to be evaluated once for each page view.

The authorization scheme will be associated with both the Apply Changes and Delete buttons on the Create/Edit Issue page. This way, unauthorized users can view all the details, but if they do change something, they have no way of saving that change.

For added security, you can also associate the authorization scheme with the process that performs the insert, update and delete on HT_ISSUES. This protects your application against someone changing the URL to call the Apply Changes process. To let users know why they are not able to make changes, you can aWdd an HTML region that displays an explanation when the authorization fails. The SQL for this scheme must be specific to the Create/Edit Issues page because it needs to reference P7_ISSUE_ID. It also needs to retrieve data from the database because at the time it is evaluated, the necessary data will not be available in the session state. The only item that will be available will be P7_ISSUE_ID because it will be passed by the link.

Create the Authorization Scheme

To create the authorization scheme:

  1. Go to the Application home page.

  2. Click Shared Components.

  3. Under Security, click Authorization Schemes.

  4. Click Create.

  5. For Creation Method, accept the default From Scratch and then click Next.

  6. Under Authorization Scheme, enter the following in Name:

    P7_ASSIGNED_OR_PROJECT_LEAD
    
    
  7. Under Authorization Scheme:

    1. For Scheme Type, select PL/SQL Function Returning Boolean.

    2. For Expression 1, enter:

      DECLARE
         l_related_project   integer;
         l_assigned_to       integer;
         l_person_id         integer;
         l_person_role       varchar2(7);
         l_assigned_project  integer;
      BEGIN
      
      -- User is HOWTO or new Issue
      IF :APP_USER = 'HOWTO' or
         :P7_ISSUE_ID IS NULL
         THEN RETURN TRUE;
      END IF;
      
      FOR c1 IN (SELECT related_project,
                        assigned_to
                   FROM ht_issues
                  WHERE issue_id = :P7_ISSUE_ID)
      LOOP
         l_related_project := c1.related_project;
         l_assigned_to     := c1.assigned_to;
      END LOOP;
      
      -- Issue not yet assigned
      IF l_assigned_to IS NULL
      THEN RETURN TRUE;
      END IF;
      
      FOR c2 IN (SELECT person_id,
                 person_role,
                 assigned_project
            FROM ht_people
           WHERE upper(person_email) = upper(:APP_USER))
      LOOP
         l_person_id        := c2.person_id;
         l_person_role      := c2.person_role;
         l_assigned_project := c2.assigned_project;
      END LOOP;
      
      -- User is lead of related project
      IF l_person_role = 'Lead' and 
         l_assigned_project = l_related_project
         THEN RETURN TRUE;
      
      -- User is assigned to issue
      ELSIF l_assigned_to = l_person_id
         THEN RETURN TRUE;
      ELSE
         RETURN FALSE;
      END IF;
      END;
      
      
    3. For Identify error message displayed when scheme violated, enter:

      This issue is not assigned to you, nor are you the Project Lead. Therefore you are not authorized to modify the data.
      
      
  8. Under Evaluation Point, for Validate authorization scheme, select Once per page view.

    This selection is necessary since each issue may have a different result.

  9. Click Create.

Now you need to associate the authorization scheme with the appropriate objects on the Create/Edit Issue page.

Associate Objects with the Create Edit Issues Report

To associate the authorization scheme with buttons and processes:

  1. Go to the Application home page.

  2. Select page 7 - Create/Edit Issues.

  3. Under Buttons, click Delete.

    1. Under Authorization, select the Authorization Scheme P7_ASSIGNED_OR_PROJECT_LEAD.

    2. Click Apply Changes.

  4. Under Buttons, click Apply Changes.

    1. Under Authorization, select the Authorization Scheme P7_ASSIGNED_OR_PROJECT_LEAD.

    2. Click Apply Changes.

  5. Under Buttons, click Create.

    1. Under Authorization, select the Authorization Scheme P7_ASSIGNED_OR_PROJECT_LEAD.

    2. Click Apply Changes.

  6. Under Buttons, click Create and Create Another.

    1. Under Authorization, select the Authorization Scheme P7_ASSIGNED_OR_PROJECT_LEAD.

    2. Click Apply Changes.

  7. Under Page Processing, Processes, select Process Row of HT_ISSUES.

    1. Under Authorization, select the Authorization Scheme P7_ASSIGNED_OR_PROJECT_LEAD.

    2. Click Apply Changes.

Create an HTML Region

Lastly, create a new region to display an explanation when the authorization fails

To create a new region:

  1. Under Regions, click the Create icon.

  2. On Region, accept the default HTML and click Next.

  3. Select HTML for region container and click Next.

  4. For Display Attributes:

    1. For Title, enter Not Authorized.

    2. For Display Point, select Page Template Body (2. items below region content).

    3. Click Next.

  5. For Source, enter the following in Enter HTML Text Region Source and then click Next:

    You are not authorized to modify the data for this issue because<br>you are not the Project Lead nor is the issue assigned to you.
    
    
  6. For Authorization Scheme, select {Not P7_ASSIGNED_OR_PROJECT_LEAD}. This selection makes the region only display when the Authorization Scheme fails.

  7. Click Create Region.

Figure 14-18 displays the Create/Edit Issue page being run by a person for whom the Authorization fails. Notice a new region displays at the top of the page and that the only button being displayed is Cancel.

Figure 14-18 New Region Displaying Authorization Failure

Description of Figure 14-18 follows

A more elegant solution to this security requirement would be to create a different page for viewing the details of an issue. You would need to have a procedure that would take in the issue_id and current user and pass back a flag for view only or edit. Then you could dynamically build the link for all the reports to call either the View page or the Edit page based upon a call to that procedure. You would still want to protect against someone accessing the edit page without using a link so you would also check permission before firing the insert, update and delete process.

Deploying Your Application

Now that your application is complete, the next step is to deploy it. Typically, developers create applications on one server and deploy it on another. Although this approach is not required, it enables you to resolve bugs without impacting the production instance.


Note:

To deploy an application on another server, you need to install and configure another Oracle Application Express instance.

Topics in this section include:

Move the Application Definition

The definition for your application lives within the Oracle database. The application definition includes everything that makes up the application, including the templates, but it does not include database object definitions or the underlying data. To move an application to another Oracle Application Express instance, you must export the application definition from your development server and import it into your production server.

Topics in this section include:

Export the Application Definition

To export the application definition from your development server:

  1. On the Workspace home page, click the arrow on the Application Builder icon and select the application you just created.

  2. Click the Export/Import icon.

  3. For Export/Import, click Export and then Next.

  4. For Application, make sure the application created in this exercise is selected.

  5. Click Export Application.

  6. When prompted, click to Save the file.

  7. Specify a location on your local hard drive and then click Save.

Create the Required Objects to Support the Application

On your production instance, you need to create the objects necessary to support the application. Log in to the production instance and follow the directions in "About Building Database Objects".


Note:

Although the supporting objects do not need to exist for you to import the application definition, be aware you cannot test the code until they exist.

Import the Application Definition into the Production Instance

Log in to the production instance of the Workspace home page:

  1. On the Workspace home page, click the arrow on the Application Builder icon and select the application you just created.

  2. On the Application home page, click Export/Import.

  3. On the Export/Import page, click Import and then click Next.

  4. For Import File:

    1. Import file - Click the Browse button and then locate your exported file.

    2. File Type - Select Application, Page, or Component Export.

    3. File Character Set - Accept the default and click Next.

    Once the success message appears, the next step is to install the file.

  5. Click Install.

  6. On Application Install:

    1. Parse As Schema - Select the schema on your production server that contains your application objects.

    2. Build Status, - Select Run and Build Application.

      This option enables other users to run the application and enables you to log in and change the code if necessary. Alternatively, you can select Run Application Only. Be aware that if you select this option you will not be able to access the source code for the application.

    3. Install As Application - You can select:

      • Reuse Application ID from Export File - Only select this option if the application ID is not being used on the production instance.

      • Auto Assign New Application ID - Select this option to assign a new application ID.

      • Change Application ID - Select this option to change the existing application ID. If you select this option, you will be prompted to enter a new application ID.

        When you install an application having the same ID as an existing application in the current workspace, the existing application is deleted and then the new application is installed. If you attempt to install an application having the same ID as an existing application in a different workspace, an error message appears.

        If all statements are successful the install commits and becomes permanent. If any errors are encountered, the install is rolled back, resulting in no permanent changes.

    4. Click Install Application.

    If the install is successful, the Post-App Install Utility Options page appears. From here, you can select one of the following:

    • Select Run Application to see the application running

    • Select Application Attributes to view the application definition within Application Builder

Load the Data

The next step in deploying your application is to load the data. At a minimum, you would need to populate the project and people tables.

Note there are various mechanisms you could use to accomplish this task, including:

  • Use the application itself to create data.

  • Use the Data Loader to load data copied from a spreadsheet.

  • Use SQL Scripts and run scripts to create data.

  • If you have data existing already within an Oracle database, use either export/import to move data between machines or use SQL to retrieve and transform existing data and load it into the application tables.


See Also:

"Loading Demonstration Data" and "Importing, Exporting, Loading, and Unloading Data" in Oracle Database Express Edition 2 Day DBA

Alternate Authentication Mechanisms to Consider

When the application login page calls the login API with a user name and password, the Application Express engine calls the credentials verification method specified in the application's current authentication scheme. You have three choices as to how credentials are verified from within the login API:

  • Implement the method yourself as a PL/SQL function returning Boolean and put it in your application's schema.

  • Use the built-in LDAP authentication method, which checks user name and password against the LDAP directory that you specify.

  • Use the built-in Oracle Application Express authentication method, which checks the user name and password against the Oracle Application Express workspace repository.

Your application is currently using the built-in Oracle Application Express authentication method.


See Also:

"Establishing User Identity Through Authentication" in Oracle Database Application Express User's Guide

Create Users

In order for your application to be accessible, you need to create users. If you are still using Oracle Application Express authentication, the simplest way to create users it to access the Manage Users page.

To create a new user:

  1. Go to the Workspace home page.

  2. From the Administration list on the right side of the page, click Manage Application Express Users.

  3. From the Tasks list on the right side of the page, click Create End User.

  4. Under User Identification, enter the required information.

  5. Click Create User or Create and Create Another.

Publish the URL

Now that you have deployed your application, loaded data, and created users, you can publish your production URL.

You can determine the URL to your application by positioning the mouse over the Run icon on the Application home page. The URL appears in the status bar at the bottom of the page.

The Run icon gets its value from the Home link attribute on the Edit Security Attributes page. This link is only referenced by this icon and by applications that do not use the Application Express Login API. Consider the following example:

http://apex.oracle.com/pls/otn/f?p=11563:1:3397731373043366363

Where:

  • apex.oracle.com is the URL of the server

  • pls is the indicator to use the mod_plsql cartridge

  • otn is the data access descriptor (DAD) name

  • f?p= is a prefix used by Oracle Application Express

  • 11563 is the application being called

  • 1 is the page within the application to be displayed

  • 3397731373043366363 is the session number

To run this example application, you would use the URL:

http://apex.oracle.com/pls/otn/f?p=11563:1

When users log in, they receive a unique session number.

As you may recall, you created the Issue Tracker application using the Create Application wizard. This wizard creates a process on the Login page (page 101) that controls authentication. The contents of the process are:

WWV_FLOW_CUSTOM_AUTH_STD.LOGIN(
    P_UNAME => :P101_USERNAME,
    P_PASSWORD => :P101_PASSWORD,
    P_SESSION_ID => :FLOW_SESSION,
    P_FLOW_PAGE => :APP_ID||':1'
    );

Note that the Page is hard coded into this process. Because of this, the page you pass in to the URL is overwritten and does not need to be included. You can access the application by using the following URL:

http://apex.oracle.com/pls/otn/f?p=11563:1

As you can see from the example used, the URL has no meaning and can be rather long. The host name can be changed to make it more symbolic. You can also configure Apache to rewrite your URL so that you can publish an abbreviated format and a URL that would be more intuitive to your users. See your Apache documentation for details.

PKv4&PK%mUIOEBPS/dcommon/doccd_epub.jsM /* Copyright 2006, 2012, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2012.3.17 */ function addLoadEvent(func) { var oldOnload = window.onload; if (typeof(window.onload) != "function") window.onload = func; else window.onload = function() { oldOnload(); func(); } } function compactLists() { var lists = []; var ul = document.getElementsByTagName("ul"); for (var i = 0; i < ul.length; i++) lists.push(ul[i]); var ol = document.getElementsByTagName("ol"); for (var i = 0; i < ol.length; i++) lists.push(ol[i]); for (var i = 0; i < lists.length; i++) { var collapsible = true, c = []; var li = lists[i].getElementsByTagName("li"); for (var j = 0; j < li.length; j++) { var p = li[j].getElementsByTagName("p"); if (p.length > 1) collapsible = false; for (var k = 0; k < p.length; k++) { if ( getTextContent(p[k]).split(" ").length > 12 ) collapsible = false; c.push(p[k]); } } if (collapsible) { for (var j = 0; j < c.length; j++) { c[j].style.margin = "0"; } } } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(compactLists); function processIndex() { try { if (!/\/index.htm(?:|#.*)$/.test(window.location.href)) return false; } catch(e) {} var shortcut = []; lastPrefix = ""; var dd = document.getElementsByTagName("dd"); for (var i = 0; i < dd.length; i++) { if (dd[i].className != 'l1ix') continue; var prefix = getTextContent(dd[i]).substring(0, 2).toUpperCase(); if (!prefix.match(/^([A-Z0-9]{2})/)) continue; if (prefix == lastPrefix) continue; dd[i].id = prefix; var s = document.createElement("a"); s.href = "#" + prefix; s.appendChild(document.createTextNode(prefix)); shortcut.push(s); lastPrefix = prefix; } var h2 = document.getElementsByTagName("h2"); for (var i = 0; i < h2.length; i++) { var nav = document.createElement("div"); nav.style.position = "relative"; nav.style.top = "-1.5ex"; nav.style.left = "1.5em"; nav.style.width = "90%"; while (shortcut[0] && shortcut[0].toString().charAt(shortcut[0].toString().length - 2) == getTextContent(h2[i])) { nav.appendChild(shortcut.shift()); nav.appendChild(document.createTextNode("\u00A0 ")); } h2[i].parentNode.insertBefore(nav, h2[i].nextSibling); } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(processIndex); PKo"nR M PK%mUIOEBPS/dcommon/cpyr.htmd Oracle Legal Notices

Oracle Legal Notices

Copyright Notice

Copyright © 1994-2016, Oracle and/or its affiliates. All rights reserved.

License Restrictions Warranty/Consequential Damages Disclaimer

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

Warranty Disclaimer

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

Restricted Rights Notice

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, then the following notice is applicable:

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

Hazardous Applications Notice

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Trademark Notice

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

Third-Party Content, Products, and Services Disclaimer

This software or hardware and documentation may provide access to or information about content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services unless otherwise set forth in an applicable agreement between you and Oracle. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services, except as set forth in an applicable agreement between you and Oracle.

Alpha and Beta Draft Documentation Notice

If this document is in preproduction status:

This documentation is in preproduction status and is intended for demonstration and preliminary use only. It may not be specific to the hardware on which you are using the software. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to this documentation and will not be responsible for any loss, costs, or damages incurred due to the use of this documentation.

Private Alpha and Beta Draft Documentation Notice

If this document is in private preproduction status:

The information contained in this document is for informational sharing purposes only and should be considered in your capacity as a customer advisory board member or pursuant to your beta trial agreement only. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described in this document remains at the sole discretion of Oracle.

This document in any form, software or printed matter, contains proprietary information that is the exclusive property of Oracle. Your access to and use of this confidential material is subject to the terms and conditions of your Oracle Master Agreement, Oracle License and Services Agreement, Oracle PartnerNetwork Agreement, Oracle distribution agreement, or other license agreement which has been executed by you and Oracle and with which you agree to comply. This document and information contained herein may not be disclosed, copied, reproduced, or distributed to anyone outside Oracle without prior written consent of Oracle. This document is not part of your license agreement nor can it be incorporated into any contractual agreement with Oracle or its subsidiaries or affiliates.

Documentation Accessibility

For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program website at http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.

Access to Oracle Support

Oracle customers that have purchased support have access to electronic support through My Oracle Support. For information, visit http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info or visit http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs if you are hearing impaired.

Oracle Logo

PKS\UKPK%mUIOEBPS/dcommon/oracle-logo.jpgcpJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222'7" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE!KEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEzE7V%ȣOΏ9??:a"\fSrğjAsKJ:nOzO=}E1-I)3(QEQEQEQEQEQEQE֝Hza<["2"pO#f8M[RL(,?g93QSZ uy"lx4h`O!LŏʨXZvq& c՚]+: ǵ@+J]tQ]~[[eϸ (]6A&>ܫ~+כzmZ^(<57KsHf妬Ϧmnẁ&F!:-`b\/(tF*Bֳ ~V{WxxfCnMvF=;5_,6%S>}cQQjsOO5=)Ot [W9 /{^tyNg#ЄGsֿ1-4ooTZ?K Gc+oyڙoNuh^iSo5{\ܹ3Yos}$.nQ-~n,-zr~-|K4R"8a{]^;I<ȤL5"EԤP7_j>OoK;*U.at*K[fym3ii^#wcC'IIkIp$󿉵|CtĈpW¹l{9>⪦׺*ͯj.LfGߍԁw] |WW18>w.ӯ! VӃ :#1~ +މ=;5c__b@W@ +^]ևՃ7 n&g2I8Lw7uҭ$"&"b eZ":8)D'%{}5{; w]iu;_dLʳ4R-,2H6>½HLKܹR ~foZKZ࿷1[oZ7׫Z7R¢?«'y?A}C_iG5s_~^ J5?œ tp]X/c'r%eܺA|4ծ-Ե+ْe1M38Ǯ `|Kյ OVڅu;"d56, X5kYR<̭CiطXԮ];Oy)OcWj֩}=܅s۸QZ*<~%뺃ȶp f~Bðzb\ݳzW*y{=[ C/Ak oXCkt_s}{'y?AmCjޓ{ WRV7r. g~Q"7&͹+c<=,dJ1V߁=T)TR՜*N4 ^Bڥ%B+=@fE5ka}ędܤFH^i1k\Sgdk> ֤aOM\_\T)8靠㡮3ģR: jj,pk/K!t,=ϯZ6(((((((49 xn_kLk&f9sK`zx{{y8H 8b4>ÇНE|7v(z/]k7IxM}8!ycZRQ pKVr(RPEr?^}'ðh{x+ՀLW154cK@Ng C)rr9+c:׹b Жf*s^ fKS7^} *{zq_@8# pF~ [VPe(nw0MW=3#kȵz晨cy PpG#W:%drMh]3HH<\]ԁ|_W HHҡb}P>k {ZErxMX@8C&qskLۙOnO^sCk7ql2XCw5VG.S~H8=(s1~cV5z %v|U2QF=NoW]ո?<`~׮}=ӬfԵ,=;"~Iy7K#g{ñJ?5$y` zz@-~m7mG宝Gٱ>G&K#]؃y1$$t>wqjstX.b̐{Wej)Dxfc:8)=$y|L`xV8ߙ~E)HkwW$J0uʟk>6Sgp~;4֌W+חc"=|ř9bc5> *rg {~cj1rnI#G|8v4wĿhFb><^ pJLm[Dl1;Vx5IZ:1*p)إ1ZbAK(1ׅ|S&5{^ KG^5r>;X׻K^? s fk^8O/"J)3K]N)iL?5!ƾq:G_=X- i,vi2N3 |03Qas ! 7}kZU781M,->e;@Qz T(GK(ah(((((((Y[×j2F}o־oYYq $+]%$ v^rϭ`nax,ZEuWSܽ,g%~"MrsrY~Ҿ"Fت;8{ѰxYEfP^;WPwqbB:c?zp<7;SBfZ)dϛ; 7s^>}⍱x?Bix^#hf,*P9S{w[]GF?1Z_nG~]kk)9Sc5Ո<<6J-ϛ}xUi>ux#ţc'{ᛲq?Oo?x&mѱ'#^t)ϲbb0 F«kIVmVsv@}kҡ!ˍUTtxO̧]ORb|2yԵk܊{sPIc_?ħ:Ig)=Z~' "\M2VSSMyLsl⺿U~"C7\hz_ Rs$~? TAi<lO*>U}+'f>7_K N s8g1^CeКÿE ;{+Y\ O5|Y{/o+ LVcO;7Zx-Ek&dpzbӱ+TaB0gNy׭ 3^c T\$⫫?F33?t._Q~Nln:U/Ceb1-im WʸQM+VpafR3d׫é|Aү-q*I P7:y&]hX^Fbtpܩ?|Wu󭏤ʫxJ3ߴm"(uqA}j.+?S wV ~ [B&<^U?rϜ_OH\'.;|.%pw/ZZG'1j(#0UT` Wzw}>_*9m>󑓀F?EL3"zpubzΕ$+0܉&3zڶ+jyr1QE ( ( ( ( ( ( ( (UIdC0EZm+]Y6^![ ԯsmܶ捆?+me+ZE29)B[;я*wGxsK7;5w)}gH~.Ɣx?X\ߚ}A@tQ(:ͧ|Iq(CT?v[sKG+*רqҍck <#Ljα5݈`8cXP6T5i.K!xX*p&ќZǓϘ7 *oƽ:wlຈ:Q5yIEA/2*2jAҐe}k%K$N9R2?7ýKMV!{W9\PA+c4w` Wx=Ze\X{}yXI Ү!aOÎ{]Qx)#D@9E:*NJ}b|Z>_k7:d$z >&Vv󃏽WlR:RqJfGإd9Tm(ҝEtO}1O[xxEYt8,3v bFF )ǙrPNE8=O#V*Cc𹾾&l&cmCh<.P{ʦ&ۣY+Gxs~k5$> ӥPquŽўZt~Tl>Q.g> %k#ú:Kn'&{[yWQGqF}AЅ׮/}<;VYZa$wQg!$;_ $NKS}“_{MY|w7G!"\JtRy+贾d|o/;5jz_6fHwk<ѰJ#]kAȎ J =YNu%dxRwwbEQEQEQEQEQEQEQEQEQE'fLQZ(1F)hQ@X1KEQE-Q@ 1KE3h=iPb(((1GjZ(-ʹRPbR@ 1KE7`bڒyS0(-&)P+ ڎԴP11F)h&:LRmQ@Q@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?l:ϊw "{{-3j3%{sj~2= 7 ~MڅKrHb|P3 r=Ҁ +Ş/$iu7=q2dԂxn⸷9$l]H #WI񯄴;\[ݚD8C3p&0U9^AnK vI+!I8>5(zqj03Y.X ,@85ߛ8>pq8=} \xmm常8` $Q@$v7zwp]ɝA GX;y_]覮O&4 SPtY.X),@84U=7Vuv K4,$g{@<+uqtiGw3; I@ORմn5MBp%8'ƫ%u6uBJrHRN2@ϸ J(9i[[m$|@񗌯|-(0Y8~[_w׮F?kiZҴeեՕVQȠ78w KVtku5 K,S,J[ g{Ee^%tk56v@DrF@b2ϱ'+yc PVҩYH4yGپgn͹񎹠 giսis=칎pTH>r?6=RM[MTKPMBdLW^yTH[;J\~xn↓\Wm+[ƾldK;>_c]V=<7^Ig *VҮW:kF1弲7a@} 闒YJ8rRr2?lPESVf&-P7h)Y3>e֩zvv Ү`GlNO@QEQEQEQEQEQEQEQEQEQEQEQEQEx( *m{xikc6y$(ܒI9z''~C?Us`on2Q\2;;dž~VrYqCw1t,`NzEy`5M7>{,j7T lRQK1!*m9}\h{= )-HLm㜜e de|?]{~ϝs.^Ѵ_'<3D$WAi:7s|%x2g̚ޠ!Eh#>\~uw_2_zW.d v#ʸ?.⯇Б4-Lcnp;QNӎotfoMPGkt\3(wv,|{I

bJ$=[~n|۶o-8q τ b &o*<6Bi`ETPp7r[??Ҹ_|?o7A]ic$s*G:<#< Z|f]GltK U<>!{M'Z֤t[VeH237FT gy5c[ԸB>B#3BB|xVjbOFSߩ”,p;lryG=o,I4;U1|Y xndu t7 %ԾxÞ2ԼA&׿gD2xM@yV?-\>n--_IkSP]!pnI$?lcfK/Ye9.2%Aݶ3 v?hpͫw#xuqu oRW_I='_g8gUNAPwGp[/ƃyZc{)4-cpdux8$Mv<>%PH<>vBH:mO⇉aǯk\Am(8 t$g@lze/Yhrj67BUei8ˆ1 c8 7ԟ;ٳ3), 1GB uP'TۊFxx }"ï켁3ЊJ q@|'`?_E D5m **Hn 'uV>7:i0oݛ 126;TĹ|N$:&Hp r 5xG_t #oug 6v&o^ 伋66ho[y \8r XM_JVQ\ _%#ʄbNJ\?}KM:KgP5,Q،:pyOQ6;y_]覠 Do̺h'KnцbI%@II¼ ?J ((((((((((((O>˿ݍqszW? K ;q+( zno03haX r(?BK9HȂY!At9ֶ"? fH&ՠ-D#R#]z_t l&vܧ  co߅|#_d# ?%(H$a؎?*(Ğ׋i]͖@pІ83Y <iph%̐2_0Nֻ (?N{,'ؼfͻ޹ 4"H$@Yy]ild]ot=" I$iHAW{~PvkbS Y1#`2*y>LO,!#v*zu]mAuK2Ⱥ%v_,s$]clQ@޿ x]cCvp:BBqqxG·G t AیuPs ռG4I#C+ q1Yñ˰dPI `3mKEVfcqɭ ( EcI^^J\K+I*ysEsHNncݡp*áVR  /[o\d))Fv C(嘒ܒOzJi:nni}uC`s@޳:>K2II%F',y>h9,4,Wd)71̀2$ZPni EKʒG"WR@+?9|<<6qcWY&ͪCK> lS*/<+ |=ϭ\"@TP0[FuRL.I|]n[P=DžkZx{=F.<miwVP}:SxrB(s׭u6{NK " +U cq z` 8օ? </=$$YlrǓVïOAL{?%=|;m#{~2_q;y}aggiݬ AS |b [IѾ}._Lw)S9G" (5ߊ- tnJӻIm&t !XnpOs4 s?i*{oi%y3+B rHCסaD\xDž>>_ۻ8#æ>]s~ &kSzp-mΡTN b: 7[okDdmH<|d3PQ^|N>%nLKo0pN2F]/?5#HʷJ,˹pkQ-}!ܺm70HAF\ w:5izwqہow, @MA! d+h'cRp|$Tujt"$jqfBŽEy?ux1|=sEj;,A FC򟘸YtZKȤʀ>|98(;Ck6$hWـ$+X4k]7^|H]ݥĚL-y|weActW?>]n[߉u'-U+d"30Cg#\+Kf_Ēx{Q[,<ۙ\8VlrW+unڗ|iGy)&WjฬtgM_UZLRqz{_LGVxad lhSAxw{iw⸾~PUV$~z}R_?6wVm%y7Jm g%^}oi7yv<>vXrp@+h'cR??%g5K4. cq*67s| F|%-m \  #e@!I~ u=9KD_2*(;AL ?L`c8Y}|S+ZVպZ>Y:Ex&y#2ƦhApy`9.3|Csxg@=h(?7KKq|vWzםmk㞳Ho,n>v*IJrWk X4W|OUO4R:5ef U=}# d|mϓvw@x( *ma_ߏ?J[Ym#dpXd`E(>|NN{ϨKK g|U=бz( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<???6޽|8 }Z_;;:cq>T<}wᄰдĚÈ:b PԱbN_?dM/[cfcj\Aq(,7ڦsPtv#`UP^(0 4[S/,$n>b$P) >Nw|Hw$Ŀ MVA׶iWBuw<(pOz-?u=73@G:y~p9Rs7[}:T~>Ί68̄dwTs6[__=UP nTgOo} owxՀ((ypq@$O*Z k7ǚ4:^=0Ep ֮łVÞޕPΟ/ _7wv:>oZ^[{dgRNqoBH㧃xMռW4xWR2"<G9P9xKm7Zи}JaЫ)OQGי8?ZPAžZ'XḕIQ]p Ƞ%>EI7Mq4VuEy%( os]F#Z-vRX,z xt}oG5>k1˻,& X`s@Ci >)xwO%Zvzs"Hт&ݤLF Ezi,.YO|ICO -ϷXA=@80*O+%lP $ž29F8rN0; yuf.eሧu8dND(#pwW=> C:SEwaw+2 VVNT $䚦騷%Lc~BQ@<[oqsA*92<Ggn~~9wϠ|݄𫐬B3v2OR=?7ms^kkchI8f[ 碨@x]=zD@)`N1sOĶ_?Oyfi\BW16øvmbpx{CkoQH8Ppb9玑WnM^[Qwx`qs@w' <+4'RHKm0S&6 x  ?J~+N]o$&%XYK w͐X6 0Ewݟ|9iI<< r@C²訨iEK]炼FK绚 n՘1U\ A֏+MOw \-µ`;0緥r4k_Kfg}^L0@*x?_;}COhmR]l9Fr@݌+/~+W^%w62XI z @ ͜7pIuk[WrW#N\1 VM ߕG*E |"InVRh^ 9̗~YgkEi2LQqA,FB?ς/#iu[9{rQ=8Tmmⷷ8`GjQ@P_a>6KA?}/X}">JP]2r4? =l93@5~ o- $B޸@Uo.,I[%R22RH`]nlJ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +m ,_4h4b%,;,O7<|4ѨX[dkxFpx@7ZvUw0\ mWPUm=:?2'dF`C FA=*g뺟'=[i-ϕn[npqc84h& 'I=ŏ,Is=;A@Q@Q@8@'c#(Tjk x-h%@WR2#5s^'j:=O+;dq5\|w jDe gD1H IrT!Nk<M{׺5-vh>bw0 GO<7:*?ֽ<k>5 SKV Dp qN=\O{mG=ϲ0LE%)ۗu*jEEX|c{=[Y4NG#jfV8},k=Kf#Om&9Pj6RP9-;I ǤxSY_ZhBH܍8<:׊|NSNK5}H꒺Ѱ],`)'9޿TJ> !пJ$?Ǎ~3^_jPx6VHl$c4Y xR;7VڠgKIoQ%WxkHg>:ywrNhkO7gִ7 m#6N H O|"񯆴{I㥊Cq VTf H +t( o;OCj[̒n,cropx?}gSեH'DL3@F9>Z>Oc]K2Ϝn*oápxqZB5xy |\'fѼ+iw Oee %K"$dA^W1/=ά\q'eBʟxW6+𾝮ZS$n2@ 3q|zƯ[xúvs[9ɔUam\Euz~#|:Ěo-uݥHzYf 8*⦳4I#%eu#gq@u-&QQ-㻍B" a?\ > !пJ$_Q:(Ԧ=ZKls"O~Waϯ+ƧO2OghԱdҸ?:x"?pb#qݱvNM Lwm"v߱N3&4((((((((((((+Ӽ ?| E/!~t>=WG &_hzm\K dvCcI5P]R嵿Z"Vu@\?|rۑ 'DN𭎃qAoedclʨNF9޵(n(j4?-~F<UhQ@Ï¿Ɠ:|#Qn773?ּ@|Cj~K=ʱ!0Wl<צQ@7suK [jàY`!rX'nFk?y?+y{g}]'xB@g>~n׵ps ]>Y|!g;(gVmd8\zϮQ@gOv:/u^:>觻U (V ,냂[ToH~3xFgI43UE0T2m$7SzQE?xڿ.yϲۤg8u\~~0bm'5ضTK( H$z5m>i.f9^^G^)ONGM"Có.-[9,jQsA<֥q Դ|Bt=xP,RDu8O|-M'^u)I-M;wu  ( /ƺvimwi&6K! u?)S99>Z!k:0`wm /#Fzz65R_8G rە@s61G1 /}^_3nFs{AEgZg''inv2qg5ݎ WYU Jdd &2? ||@ꑈ53=Z]'yuLG*)g^!8C?-6(29K"Ĩ0Яl;U+K9^u2,@@ (\Ȱ Ë $P`lj 8x I$4H *(@͉0dа8tA  DсSP v"TUH PhP"Y1bxDǕ̧_=$I /& .)+ 60D)bB~=0#'& *D+l1MG CL1&+D`.1qVG ( "D2QL,p.;u. |r$p+5qBNl<TzB"\9e0u )@D,¹ 2@C~KU 'L6a9 /;<`P!D#Tal6XTYhn[p]݅ 7}B a&AƮe{EɲƮiEp#G}D#xTIzGFǂEc^q}) Y# (tۮNeGL*@/%UB:&k0{ &SdDnBQ^("@q #` @1B4i@ aNȅ@[\B >e007V[N(vpyFe Gb/&|aHZj@""~ӎ)t ? $ EQ.սJ$C,l]A `8A o B C?8cyA @Nz|`:`~7-G|yQ AqA6OzPbZ`>~#8=./edGA2nrBYR@ W h'j4p'!k 00 MT RNF6̙ m` (7%ꑀ;PKl-OJPK%mUIOEBPS/check_box.htm How to Work with Check Boxes

6 How to Work with Check Boxes

In Oracle Application Express, you can create check boxes as items, or you can create check boxes in reports. Check boxes on a form work similarly to a list of values. When you define an item to be a check box, you need to provide the check box value in the List of Values section of the Item Attributes page. You define check boxes on a report using the supplied function, APEX_ITEM.CHECKBOX.

This tutorial illustrates different ways in which you can create check boxes and explains how to reference and process the values of checked boxes. Before you begin, you need to import and install the OEHR Sample Objects application in order to access the necessary sample database objects. See "About Loading Sample Objects".

This section contains the following topics:

Creating an Application

First, you need to create an application using the Create Application Wizard.

To create an application using the Create Application Wizard:

  1. On the Workspace home page, click the Application Builder icon.

    The Application Builder home page appears.

  2. Click Create.

  3. Select Create Application and click Next.

  4. For Name:

    1. Name - Enter Check Boxes.

    2. Application - Accept the default.

    3. Create Application - Select From scratch.

    4. Schema - Select the schema where you installed the OEHR sample objects.

    5. Click Next.

      Next, you need to add a page. For this exercise, you add a report and form.

  5. To add a report and form:

    1. Select Page Type -Select Report and Form.

    2. Table Name - Select OEHR_PRODUCT_INFORMATION.

    3. Click Add Page.

      Two new pages appear in the list at the top of the page. Note that each page has the same page name. Next, edit the page names to make them more meaningful.

  6. To edit the name of page 1:

    1. Click OEHR_PRODUCT_INFORMATION next to page 1 at the top of the page as shown in Figure 6-1.

      Figure 6-1 Page Name in the Create Application Wizard

      Description of Figure 6-1 follows

    2. In Page Name, replace the existing text with Product Report.

    3. Click Apply Changes.

  7. To edit the name of page 2:

    1. Click OEHR_PRODUCT_INFORMATION next to page 2 at the top of the page as shown in Figure 6-1.

    2. In Page Name, replace the existing text with Update Form.

    3. Click Apply Changes.

  8. Click Next.

  9. For Tabs, accept the default, One Level of Tabs, and click Next.

  10. For Copy Shared Components from Another Application, accept the default, No, and click Next.

  11. For Attributes, accept the defaults for Authentication Scheme, Language, and User Language Preference Derived From and click Next.

  12. For User Interface, select Theme 2 and click Next.

  13. Review your selections and click Create.

    The Application home page appears.

Run the Application

Next, review the application by running it.

To run the application:

  1. Click Run Application as shown in Figure 6-2.

    Figure 6-2 Run Application Icon

    Description of Figure 6-2 follows

  2. If prompted to enter a user name and password, enter your workspace user name and password and click Login. See "About Application Authentication".

    The application appears. Note that the report contains ten columns displaying product information. Users can link to an update form by clicking the Edit icon in the far left column.

  3. Click the Edit icon next to a specific product. As shown in Figure 6-3, an update form appears.

    Figure 6-3 Update Form

    Description of Figure 6-3 follows

Editing the Update Form

Page 2 of your application is an update form. In this exercise, you modify this form by hiding the Warranty Period field and creating a new check box.

Topics in this section include:

Hide the Warranty Period Field

First, hide the Warranty Period field by changing the Display As attribute.

To hide the Warranty Period field:

  1. Click Edit Page 2 on the Developer toolbar.

    The Page Definition for page 2 appears.

  2. Scroll down to the Items section.

  3. Under Items, select P2_WARRANTY_PERIOD.

  4. From Display As in the Name section, select Hidden.

  5. Click Apply Changes.

Add a New Checkbox

In this exercise you create a check box that automatically sets the minimum product price to 75% of the list price.

Topics in this section include:


Tip:

For simplicity, this tutorial has you create a checkbox by editing item attributes. As a best practice, however, you can also create a named LOV and reference it.


See Also:

"Creating Lists of Values" in Oracle Database Application Express User's Guide

Add a New Item

First, you add a new item. Initially, you create this item to display as a radio group and later change it to a check box.

To add an item that displays as a radio group:

  1. On the Page Definition for page 2, scroll down to Items.

  2. Under Items, click the Create icon as shown in Figure 6-4.

    Figure 6-4 Create Icon

    Description of Figure 6-4 follows

  3. For Item Type, select Radio and click Next.

  4. For Radio Group Control Type, select Radio group and click Next.

  5. For Display Position and Name:

    1. Item Name - Enter P2_SET_MIN_PRICE.

    2. Sequence - Enter 9.5.

      Note that this sequence positions the item below the P2_MIN_PRICE item (the Minimum Price field).

    3. Region - Select Update Form.

    4. Click Next.

  6. For List of Values:

    1. Named LOV - Select Select Named LOV.

    2. Display Null Option - Select No.

    3. List of Values Query - Enter:

      STATIC:Yes;Y,No;N
      
      
    4. Click Next.

  7. For Item Attributes:

    1. Label - Replace the existing text with Set Minimum Price.

    2. Accept the remaining defaults.

    3. Click Next.

  8. For Source:

    1. Item Source - Select SQL Query.

    2. Item Source Value - Enter:

      SELECT 'Y' FROM DUAL WHERE :P2_LIST_PRICE*0.75=:P2_MIN_PRICE
      
      
    3. Accept the remaining defaults and click Create Item.

Create a Process

Next, you create a page process that sets the minimum price at a 25% discount of the list price.

To create a page process:

  1. On the Page Definition for page 2, locate the Page Processing area.

  2. Under Processes, click the Create icon.

  3. For Process Type, select PL/SQL and click Next.

  4. For Process Attributes:

    1. Name - Enter Update Min Price.

    2. Sequence - Accept the default.

    3. Point - Select OnSubmit - After Computations and Validataions.

    4. Click Next.

  5. For Process:

    1. Enter the following:

      UPDATE oehr_product_information 
      SET MIN_PRICE=(:P2_LIST_PRICE*0.75) 
      WHERE PRODUCT_ID=:P2_PRODUCT_ID;
      
      
    2. Click Next.

  6. For Messages:

    1. Success Message - Enter:

      Product successfully updated.
      
      
    2. Failure Message - Enter:

      Unable to update this product. Contact your system administrator.
      
      
    3. Click Next.

  7. For Process Conditions:

    1. Condition Type - Select Value of Item in Expression 1 = Expression 2.

    2. Expression 1 - Enter:

      P2_SET_MIN_PRICE
      
      
    3. Expression 2 - Enter Y.

    4. Click Create Process.

Run the Page

To run the page:

  1. Click the Run Page icon in the upper right corner.

  2. If prompted to enter a user name and password, enter your workspace user name and password and click Login. See "About Application Authentication".

    The revised form appears as shown in Figure 6-5. Note that the Warranty Period field no longer displays and a new Set Minimum Price radio group appears.

    Figure 6-5 Update Form with Set Minimum Price Radio Group

    Description of Figure 6-5 follows

Edit the Item to Display as a Check Box

Next, change the Set Minimum Price radio group (P2_SET_MIN_PRICE) to display as a check box.

To edit P2_SET_MIN_PRICE:

  1. Click Edit Page 2 on the Developer toolbar.

    The Page Definition for Page 2 appears.

  2. Under Items, click P2_SET_MIN_PRICE.

  3. From Display As, select Checkbox.

  4. Scroll down to Label. In Label, delete the existing text, Set Minimum Price.

  5. Scroll down to Default. In Default Value, enter N.

  6. Under Lists of Values:

    1. Number of Columns - Enter 1.

    2. List of values definition - Enter:

      STATIC: <b> Set Minimum Price</b><br/> (25% Discount on List Price);Y
      
      
  7. Click Apply Changes at the top of the page.

Run the Page

To run the page, click the Run Page icon in the upper right corner. The revised form appears as shown in Figure 6-6. Note the new Set Minimum Price check box.

Figure 6-6 Update Form with Set Minimum Price Check Box

Description of Figure 6-6 follows

Change the Report Display

You can alter how a report displays by editing report attributes. In the exercise, you change the number of columns that display on page 1 and then change the format of two columns to include a currency symbol.

To edit report attributes for page 1:

  1. Click Application on the Developer toolbar.

    The Application home page appears.

  2. Click 1 - Product Report.

    The Page Definition for page 1 appears.

  3. Under Regions, click the Report link as shown in Figure 6-7.

    Figure 6-7 Report Link

    Description of Figure 6-7 follows

    The Report Attributes page appears. You can use this page to precisely control the report layout. First, change the number of columns that display.

  4. Deselect the Show check box for the following columns:

    • Weight Class

    • Warranty Period

    • Supplier ID

    Next, edit List Price and Min Price columns to include a currency symbol.

  5. Edit the List Price column:

    1. Click the Edit icon next to List Price.

    2. From Number / Date Format, select $5,234.10.

    3. Click the Next (>) icon at the top of the page.

      Clicking the Next icon submits your changes and then displays attributes for the next column, Min Price.

  6. Edit the Min Price column:

    1. From Number / Date Format, select $5,234.10.

      Note that you select a format by selecting an example. However, the value that actually displays field is the Oracle number format.

    2. Click Apply Changes.

  7. Click the Run Page icon in the upper right corner.

    The revised report appears. Notice the Weight Class, Warranty Period, and Supplier ID no longer appear and the List Price and Min Price columns include a currency symbol.

Create Multi Value Check Boxes to Filter Content

In the next exercise, you change the Search field (P1_REPORT_SEARCH) on the Product Report page to a multi value check box. These check boxes enable users to filter the report by product category (obsolete, orderable, planned, under development).

Topics in this section include:

Change the Search Field to a Multi Value Check Box

To change the search field to a check box:

  1. Click Edit Page 1 on the Developer toolbar.

    The Page Definition for page 1 appears.

  2. Under Items, click P1_REPORT_SEARCH.

  3. From Display As, select Checkbox.

  4. Scroll down to Label. For Label, delete the existing text and replace with Product Status.

  5. Scroll down to Source. In Source Value or Expression, enter:

    obsolete:orderable:planned:under development
    
    
  6. Scroll down to List of Values. Specify the following:

    1. Named LOV - Accept the default.

    2. Number of Columns - Enter 4.

    3. List of values definition - Enter:

      SELECT DISTINCT product_status display_value, product_status return_value
      FROM oehr_product_information
      ORDER BY 1
      
      

      Note:

      Note that to create a multi value check box, the List of Values query must return more than one row.

  7. Click Apply Changes at the top of the page.

    The Page Definition for page 1 appears.

Edit the Report Region Definition

To edit the report region definition:

  1. Under Regions, click Product Report.

    The Region Definition appears.

  2. Scroll down to Source.

  3. In Source modify the WHERE clause to read as follows:

    ...
    WHERE  instr(':'||:P1_REPORT_SEARCH||':',product_status)> 0
    
    
  4. Click Apply Changes at the top of the page.

    The Page Definition for page 1 appears.

  5. Click Apply Changes at the top of the page.

    The Page Definition for page 1 appears.

Change the Default Check Box Behavior

Although the Product Status check boxes correctly filter the content on page 1, if you deselect all the check boxes, notice the report returns all products. This behavior results from the fact that if a check box has a NULL value (that is, it is deselected), then it defaults to the default value Y. The default value of Y, in turn, enables the check box.You can alter this behavior by adding a computation that remembers the state of the check box.To add a computation that tracks the state of the check box:

  1. Under Page Processing, Computations, click the Create icon.

    The Create Page Computation Wizard appears.

  2. For Item Location, select Item on This Page and click Next.

  3. For Item, specify the following:

    1. Compute Item - Select P1_REPORT_SEARCH.

    2. Sequence - Accept the default.

    3. Computation Point - Select After Submit.

    4. Computation Type - Select Static Assignment.

    5. Click Next.

  4. In Computation:

    1. Enter:

      none(bogus_value)
      
      
    2. Click Next.

  5. For Condition:

    1. From Condition Type, select Value of Item in Expression 1 Is NULL.

    2. In Expression 1, enter:

      P1_REPORT_SEARCH
      
      
  6. Click Create.

    The Page Definition for page 1 appears.

  7. Click the Run Page icon in the upper right corner. Note that the Product Status check boxes display at the top of the page.

Change the Check Boxes to Display in Bold

Next, you edit the check box display values (or labels) so that they appear as bold text.

To edit check box display values (or labels) to appear in bold:

  1. Go to the Page Definition for page 1.

  2. Under Items, click P1_REPORT_SEARCH.

  3. Scroll down to Element.

  4. In Form Element Option Attributes, enter:

    class="fielddatabold"
    
    

    Form Element Option Attributes are used exclusively for check boxes and radio buttons and control the way the Application Express engine renders individual options.

  5. Click Apply Changes.

    The Page Definition for page 1 appears.

Adding Check Boxes to Each Row in the Report

In the next exercise, you add a delete check box to each row in the Product Report. To accomplish this, you must edit the report query and make a call to the APEX_ITEM package.

APEX_ITEM is a supplied package for generating certain items dynamically. In this instance, you use APEX_ITEM.CHECKBOX to generate check boxes in the Product report. When the page is submitted, the values of the check boxes are stored in global package arrays. You can reference these values using the PL/SQL variables APEX_APPLICATION.G_F01 to APEX_APPLICATION.G_F50 based on the p_idx parameter value that was passed in.

Topics in this section include:

Call APEX_ITEM.CHECKBOX

To edit the query to call APEX_ITEM.CHECKBOX:

  1. Go to the Page Definition for page 1.

  2. Under Regions, click Product Report.

  3. Scroll down to Source.

  4. In Region Source, add the new line appearing in bold face to the query.

    SELECT 
    "product_id",
    apex_item.checkbox(1,product_id) del,
    "product_name", 
    "product_description",
    "category_id",
    "weight_class",
    "warranty_period",
    "supplier_id",
    "product_status",
    "list_price",
    "min_price",
    "catalog_url"
    FROM   "oehr_product_information" 
    WHERE  instr(':'||:p1_report_search||':',product_status)> 0  
    
    

    APEX_ITEM is an Oracle Application Express supplied package that you can use to generate certain items dynamically. Note that the value passed in for p_idx in the above example is 1. You reference the check box values using the global variable APEX_APPLICATION.G_F01 later on.

    Oracle Application Express automatically adds new columns to the end of the column list. Next, you need to move the DEL column.

  5. Scroll to the top of the page and select the Report Attributes tab.

  6. Under Column Attributes, locate the Del column.

  7. Click the Up arrow on the far right until the DEL column is directly below PRODUCT_ID. (See Figure 6-8).

    Figure 6-8 Report Column Attributes Page

    Description of Figure 6-8 follows

  8. Click Apply Changes.

    The Page Definition for page 1 appears.

Add a Button to Submit Check Box Array Values

To add a button to submit the check box array values:

  1. Go to the Page Definition for page 1.

  2. Under Buttons, click the Create icon.

  3. For Button Region, select Product Report (1) and click Next.

  4. For Position, select Create a button in a region position and click Next.

  5. For Button Attributes:

    1. Button Name - Enter DELETE_PRODUCTS.

    2. Label - Enter Delete Products.

    3. Accept the remaining defaults and click Next.

  6. In Button Template, accept the default selection and click Next.

  7. For Display Properties:

    1. Position - Select Top of Region.

    2. Accept the remaining defaults and click Next.

  8. For Branching, select 1 Product Report and click Create Button.

Add a Process

To add a process that executes when the user clicks the Delete Products button:

  1. Under Page Processing, Processes, click the Create icon.

  2. For Process Type, select PL/SQL and click Next.

  3. For Process Attributes:

    1. Name - Enter Delete Products.

    2. Sequence - Accept the default.

    3. For Point - Select On Submit - After Computations and Validations.

    4. Click Next.

  4. Enter the following PL/SQL process and then click Next:

    FOR i in 1..APEX_APPLICATION.G_F01.count
    LOOP
       DELETE FROM oehr_product_information
       WHERE product_id = APEX_APPLICATION.G_F01(i);
    END LOOP;
    
    

    APEX_ITEM is an Oracle Application Express supplied package that you can use to generate certain items dynamically. When a page is submitted, the values of each column are stoFred in global package arrays, which you can reference using the PL/SQL variable APEX_APPLICATION.G_F01 to APEX_APPLICATION.G_F50. In this exercise, the value passed in for product_id is 1, so you reference the column values using the global variable APEX_APPLICATION.G_F01.

  5. On Messages:

    1. In Success Message, enter:

      Product(s) deleted.
      
      
    2. In Failure Message, enter:

      Unable to delete product(s).
      
      
  6. Click Create Process.

  7. Run the page.

    Notice that the Delete Products button appears above the report as shown in Figure 6-9. To remove a product from the report, select the Del check box and then click Delete Products.

    Figure 6-9 Product Report with Delete Products Check Box

    Description of Figure 6-9 follows

PKPFPK%mUIOEBPS/pckg_app.htm How to Review a Packaged Application

12 How to Review a Packaged Application

A packaged application is a fully functional application that you can view, use, and customize. Each packaged application includes installation scripts that define the application's supporting objects (including database objects, images, and seed data) as well as any preinstallation validations. Packaged applications can also include a de-installation script which can be used to remove all the application's supporting objects.

This tutorial walks you through the OEHR Sample Objects packaged application. By reviewing the supporting objects behind this application, you can learn how to define them in your own applications.

Before you begin, you need to import and install the OEHR Sample Objects application. See "About Loading Sample Objects".

This section contains the following topics:

What Is a Packaged Application?

Importing and installing an application is a complicated process. First, you create the target database objects and seed data. Second, you import and install the application definition and all related files, including images, themes, and any other required static files.

Creating a packaged application simplifies this process. Instead of performing numerous steps to create the database objects and then import and install the application and all supporting files, you can define the supporting objects so that the application and supporting files can be installed using one simple wizard.

After users import and install the application definition, a wizard guides them through a few simple configuration steps. Then, the wizard asks whether or not to install the supporting application objects. Users have the option of installing the supporting application objects then or doing it later.


See Also:

"How to Create a Packaged Application" in Oracle Database Application Express User's Guide.

About the Supporting Object Utility

In "About Loading Sample Objects", you imported and installed the OEHR Sample Objects application. Installing this application creates the database objects and loads the sample data needed to complete the tutorials in this guide.

You create a packaged application like OEHR Sample Objects using the Supporting Object Utility. By creating a packaged application, users can install and deinstall your application as well as the underlying database objects, files, and other supporting objects. Supporting objects consists of everything that your application needs to work properly, including the application definition, images, themes, and any other required static files.

Creating a packaged application is also an effective way to move an application to another Oracle Application Express instance or to share an application with others. The Supporting Object Utility provides the easiest way to ensure that all objects your application depends on are migrated in an efficient manner.

Accessing the Supporting Objects Page

You access the Supporting Object Utility on the Supporting Objects page.

To go to the Supporting Objects page:

  1. On the Workspace home page, click Application Builder.

  2. Click OEHR Sample Objects.

  3. On the Application home page, click Supporting Objects.

    The Supporting Objects page appears.

    Description of pck_supobj.gif follows

    The top of the Supporting Objects page displays a detailed report about the currently selected application, including the number of scripts and the amount of required free space. After that, the page is divided into these sections:

    • Installation

    • Upgrade

    • Deinstallation

    • Messages

About Supporting Objects Installation

During the installation of supporting objects, a sequence of scripts and validations are run. If a validation fails, the installation process stops. At certain points in the process, messages also display for users to review.

Description of pck_instl_mes.gif follows

This section describes the Installation and Messages sections of the Supporting Objects page. Depending upon the needs of your application, you may use all or only some of the functionality.

In order to give context, this section describes the supporting objects in the sequence that they would appear to a user who is performing the installation.

Topics in this section include:

Welcome Message

The welcome message contains text that displays to users immediately after they indicate that they want to install the supporting objects. Use this message to introduce the application to users and to explain any information that they may need during the rest of the installation process.

To review the welcome message text:

  1. Go to Supporting Objects page as described in "Accessing the Supporting Objects Page".

  2. In the Messages section, click Welcome message.

    The Supporting Object Messages page appears. The Welcome message appears in the first section.

Prerequisites

Prerequisites include anything that must be valid for the installation process to continue.

To review the prerequisites:

  1. On the Supporting Object Messages page, click the Prerequisites tab.

    The Prerequisites page displays the following sections:

    • Required Free Space in KB

    • Required System Privileges

    • Objects that will be Installed

Description of pck_prerq.gif follows

About Required Free Space

If you are creating tables and loading data during the installation, you should specify the amount of required free space. If there is not enough free space available, specifying this prerequisite prevents an error during the installation of supporting objects. For the OEHR Sample Objects application, the required free space is 4800 kilobytes (KB).

To determine the space that your objects require:

  1. Remove your supporting objects by either manually deleting them, or running your deinstallation script.

    1. Go to the Supporting Objects page as described in "Accessing the Supporting Objects Page".

    2. From the Tasks list on the right side of the page, click Deinstall Supporting Objects.

    3. On the Deinstall page, select Deinstall Supporting Objects and click Deinstall.

  2. View that amount of used space:

    1. Go to the Workspace home page.

    2. From the Administration list on the right, click Manage Services.

    3. Under Workspace section, click Workspace Overview.

    4. Click the Detailed Tablespace Utilization Report (may take several seconds) link.

      The Detailed Tablespace Utilization Report appears.

    5. Write down the number that appears in the Amount Used column.

      This shows the amount of used space in the tablespace where your schema is located.

  3. Install your supporting objects by either manually creating them again, or running your installation scripts.

    1. Go to the Supporting Objects page as described in "Accessing the Supporting Objects Page".

    2. From the Tasks list on the right side of the page, click Install Supporting Objects.

    3. For Install Supporting Objects, select Yes and click Next.

    4. Click Install.

  4. View that amount of used space again:

    1. Go to the Workspace home page.

    2. From the Administration list on the right, click Manage Services.

    3. Under Workspace section, click Workspace Overview.

    4. Click the Detailed Tablespace Utilization Report (may take several seconds) link.

      The Detailed Tablespace Utilization Report appears.

    5. Write down the number that appears in the Amount Used column.

  5. Subtract the initial Amount of Used number from the new number to determine your required free space.


Tip:

The value in the Amount Used column is in megabytes (MB). To calculate the amount in kilobytes (KB), multiply the final figure by 1,024 (1 MB = 1,024 KB).

About Required System Privileges

The Required System Privileges section contains a list of system privileges. If you are creating objects through installation scripts, you need to select the appropriate system privileges. Selecting these privileges runs a pre-installation check to determine if the user has the appropriate privileges. This prevents the user from creating some objects but not others due to a lack of privileges.

For the OEHR Sample Objects application, required system privileges include: CREATE SEQUENCE, CREATE TRIGGER, CREATE TYPE, CREATE PROCEDURE, CREATE TABLE, and CREATE VIEW.

About Objects Installed

The Objects that will be Installed section lists all objects that your installation script creates. If the target schema contains an object with the same name, an error displays to the user. This prerequisite prevents the user from getting errors during installation that result in some objects being created while others are not created because an object of the same name exists.

This prerequisite is important because of the deinstallation implications. If a user installs and already has an object with the same name, the deinstallation script might drop the previously existing object.

For example, if a PROJECTS table already exists and the installation script creates a table with the same name, you would want to alert users before they start the installation process. This warning provides them with the opportunity to rename their table or decide to not install supporting objects.

License Acceptance

If your application requires that users accept a specific license, specify the terms in this area. For a required license, users are prompted to accept the terms. If they do not, the installation does not proceed.

To review the license area:

  1. On the Supporting Object Messages page, click the Messages tab.

  2. Locate the section, License.

Since the OEHR Sample Objects application does not require a license, no text appears in the License section.

Application Substitution Strings

Each application can include substitution strings defined within the Application Definition. You can use substitution strings to include phrases or labels occurring in many places within an application that might need to be changed for specific installations.

When you define substitution strings for your application, they display within the Supporting Object Utility. You can then decide which substitution strings you want to display during the installation process.

For substitution strings that display during the installation process, you can provide a custom prompt to explain what each string is used for to assist the user in determining the proper value. You can also define a custom header message if you are including substitution strings.

Since the OEHR Sample Objects application does not contain any substitution strings, in the next section you add two substitution strings and then view them the Supporting Object Utility.

Add Substitution Stings

To add substitution strings to the OEHR Sample Objects application:

  1. Go to the Shared Components page:

    1. Click the Application breadcrumb.

    2. Click Shared Components.

  2. Under Application, click Definition.

  3. Scroll down to the Substitutions region.

  4. Enter the following Substitution Strings and Substitution Values:

    Substitution StringSubstitution Value
    APP_DATE_FORMATDD-MON-YYYY
    APP_DATETIME_FORMATDD-MON-YYYY HH24:MI

  5. Scroll back to the top and click Apply Changes.

Review Substitution Strings

To view the substitution strings in Supporting Object Utility:

  1. Go to the Supporting Objects page:

    1. Click the Application breadcrumb.

    2. Click Supporting Objects.

  2. In the Installation section, click Application Substitution strings.

    The Edit Substitutions page appears, showing the two substitution strings that you defined. If have a prompt appear during installation, select it and enter text in the Prompt Text field.

    Description of pck_subst.gif follows

Build Options

Build options are shared components that enable you to conditionally display objects. Each build option has a status set to Include or Exclude. If an object is associated with a disabled build option, the object does not appear to the user.

Use build options to include functionality in an application that may not be ready for use, or should not be accessible to all installations. The code is included in the application but not exposed to end users. Later, you can enable a build option so that the feature becomes accessible. For each build option, you can define a custom header message to display to the user.

Build options display in the same way as the substitution strings. You specify which build options you want to appear to users. The users can then select them and determine their status.

The OEHR Sample Objects application does not contain any build options.


See Also:

"Using Build Options to Control Configuration" in Oracle Database Application Express User's Guide

Review the Build Options Page

To review the Build Options page:

  1. On the Edit Substitutions page, click the Build Options tab.

  2. To view the Build Options message:

    1. Click the Messages tab.

    2. Scroll down to the Build Options section.

Pre-Installation Validations

Validations ensure that the target database and target schema are capable of running the installation scripts. Built-in validation types include Current Language, Exists, and so on. You can also use any SQL or PL/SQL expressions. Validations can also be conditionally executed.

Use these validations to check for anything that is not built-in under Prerequisites. For example, you can check for a minimum database version or for the installation of Oracle Text. Just as with other supporting objects, there is a Validations Message.

The OEHR Sample Objects application does not contain any validations.


See Also:

"Understanding Validations" in Oracle Database Application Express User's Guide

Review the Validation Page

To review the Validations page:

  1. Click the Validations tab.

  2. Click Create.

    The Validation page appears.

    Description of pck_prinstval.gif follows

  3. For this exercise, click Cancel.

  4. To view the Validations Message:

    1. Click the Messages tab.

    2. Scroll down to the Validations section.

Pre-Installation Confirmation Message

If the installation process is not terminated early, one last confirmation message appears before the installation scripts display to the user.

To review the confirmation message:

  1. Click the Messages tab.

  2. On the Supporting Object Messages page, scroll down to the Confirmation section.

Installation Scripts

Installation scripts are the core of a supporting object installation. Each application can have several installation scripts.

The OEHR Sample Objects application contains nine installation scripts. These scripts create objects and load data.


Tip:

You can also create a custom installation script that loads files. See "About Creating Scripts to Install Files".

Topics in this section include:

View Installation Scripts

To review the installation scripts in the OEHR Sample Objects application:

  • On the Supporting Object Messages page, click the Install tab.

    The Installation Scripts page shows the list of scripts.

Description of pck_instscrpts.gif follows

Notice that each script has a name and a sequence. It is very important to order your installation scripts so that dependent objects are created or compiled correctly.

Review an Existing Installation Script

To review or update an existing script:

  1. Click the Edit icon adjacent to the script name.

    The Script Editor page displays the script for you to edit or review.

    Figure 12-1 Supporting Object Script Editor

    Description of Figure 12-1 follows


    Tip:

    You can toggle between this page and a text page, where you can also edit the script, by clicking the Edit Using Text Area button.

  2. To view and edit the properties of the script, click the Script Properties tab.

    Use the Script Properties page to change the script name or sequence. You can also specify if it should be conditionally executed.

    Description of pck_scrprop.gif follows

  3. For this exercise, click Cancel.

About Creating Installation Scripts from Files

You can create objects and install seed date through files that you create from scratch or upload.

Topics in this section include:

Creating a New Script from Scratch

To create a new script from scratch:

  1. Go to the Installation Scripts page:

    1. Click the Supporting Objects breadcrumb.

    2. Under Installation, click Installation scripts

  2. On the Installation Scripts page, click Create.

  3. Accept the default, Create from Scratch, and click Next.

    The Create Script wizard appears.

  4. For Script Attributes:

    1. Name - Enter Test Script.

    2. Sequence - Accept the default, 100.

    3. Use Editor - Select this option.

      Selecting Use Editor enables you to use the built-in editor to define your script. If you do not select this, a standard text area appears instead.

    4. Click Next.

    The Script Editor opens, where you can type in or paste your script contents.

  5. For this exercise, click Cancel.

Uploading a File

Often, you have files that you want to use as the basis of your installation scripts.

To upload a file:

  1. On the Installation Scripts page, click Create.

  2. Select Create from file and click Next.

  3. For Script Attributes:

    1. Name - Enter Test Script.

    2. Sequence - Accept the default, 100.

    3. Click Next.

  4. For Define Script, select the file to upload.

  5. For this exercise, click Cancel.

Creating Scripts for Access Control Tables

If your application includes an access control list, you can create scripts to create the underlying access control tables.


See Also:

"Controlling Access to Applications, Pages, and Page Components" in Oracle Database Application Express User's Guide

To create scripts for access control tables:

  1. On the Installation Scripts page, click Create.

  2. Click the Create Scripts for Access Control Tables link.

  3. If you had wan9[ted to create installation scripts for access control tables, you would click Create Script.

  4. For this exercise, click Cancel.

About Creating Scripts to Install Files

To include other types of objects, such as cascading style sheets, images, and static files that your application references, you need to create scripts that install the files as well as bundle the files as supporting objects.

Before you begin, make sure the files you want to include have been added as Shared Components.


See Also:

"Using Custom Cascading Style Sheets," "Managing Images," and "Managing Static Files" in Oracle Database Application Express User's Guide

To create a script that installs files:

  1. On the Installation Scripts page, click Create.

  2. Click the Create Scripts to Install Files link.

    A list of file types appear. Each object is created by its own script, but you can select to create more than one at once.

    The OEHR Sample Objects application does not include any files to install.

    If you had wanted to include a script you would select the appropriate scripts and click Create Scripts. The name of the script defaults to the name of the object being created, and the sequence is defaulted as well. You can alter these attributes after creation.

    For each file that you install, the appropriate deinstallation statement is also written to the deinstallation script.

  3. For this exercise, click Cancel.

Success Message

Upon completion of the supporting objects installation, either a success or failure message appears. Use these messages to give the user information they may need to continue.

For example, for a successful installation, you may want to provide instructions on running the application, such as built-in usernames and passwords. For a failed installation, you might want to tell users whom to contact or instruct them to deinstall the application.

To review the success or fail messages:

  1. On the Installation Scripts page, click the Messages tab.

  2. Scroll down to the Post Installation section to review the messages.

About Supporting Objects Deinstallation

The final part of Supporting Object Utility is the deinstallation process. Deinstalling enables a user who has installed your application to cleanly remove all objects created during the installation process.

On the Supporting Objects page, the Deinstallation section includes a Deinstallation script link.

Description of pck_deinstall.gif follows

Topics in this section include:

View the Deinstallation Confirmation Message

When a user initiates the deinstallation process, a deinstallation message appears.

To review the deinstallation confirmation message section:

  1. On the Supporting Object Messages page, scroll down to Deinstallation.

  2. Scroll down to the Deinstallation section.

    For the OEHR Sample Objects application, no deinstallation message is defined.

Review the Deinstallation Script

When a user selects to deinstall supporting objects, the deinstallation script runs. Unlike installation, only one script exists for deinstallation. This script should remove each object created during installation, including database objects, as well as any loaded files, cascading style sheets, or images.

To review the deinstallation script for OEHR Sample Objects:

  1. On the Supporting Object Messages page, click the Deinstall tab.

    The Deinstall Script page appears.

  2. Click the Edit icon to the left of the script.

    Notice that the drop table statements contain CASCADE CONSTRAINTS clauses. Using these clauses is the easiest way to avoid contention between foreign keys when dropping tables. If you create installation scripts for any files, the code to drop those is included in the deinstallation script for you.

  3. For this exercise, click Cancel.

View the Deinstallation Success Message

The final part to the deinstallation process is the deinstallation success message. This is the message displayed after all the deinstallation scripts have been executed.

To review the deinstallation success message:

  1. On the Deinstall Script page, click the Messages tab.

  2. Scroll down to the Deinstallation section.

    For OEHR Sample Objects, note the post-deinstall message.

About Supporting Objects Export

After defining your supporting objects, you can decide whether or not to include them when you export your application. You set a default value for this export setting on the Export tab.

Topics in this section include:

Review the Supporting Objects Export Setting

To review the export setting:

  1. On the Supporting Object Messages page, click the Export tab.

    Use the Export Status page to specify whether to include supporting objects in the export. For OEHR Sample Objects, note that Include Supporting Object Definitions in Export is set to Yes.

  2. For this exercise, click Cancel.

Where the Export Default Appears When Exporting

Now that you know where to set the export default, next you learn where this setting appears in the export steps.

To see where the export setting default appears in the export steps:

  1. Go to the Supporting Objects page by clicking the Supporting Objects breadcrumb.

  2. From the Tasks list on the right, click Export Application.

    In the Export Application section, notice that Export Supporting Object Definitions is set to Yes. If this option is set to No, your export only included your application definition.

  3. To return to the Supporting Object Installation page, click Manage Supporting Objects on the Tasks list on the right.

About Creating Upgrade Scripts

Creating upgrade scripts enables you to modify a distributed application, but enables users to retain their existing objects. You can use upgrade scripts to add database objects, alter existing database objects (for example, add columns or change column definitions), or create new files.

If you plan to include upgrade scripts, remember to also modify your installation scripts and deinstallation scripts. Then, when new users install your application, they will have the full set of supporting objects and if the upgraded application is removed, all the objects will also be removed.

The wizard that installs the supporting objects needs to be able to determine whether to run the installation scripts or the upgrade scripts. This decision point is determined by the Detect Existing Supporting Objects query. If the query returns at least one row then the upgrade scripts are run. If the query returns no rows, the installation scripts are run. A common approach is to have the query check the Oracle data dictionary for the existence of the tables that the application depends on as shown in the following example:

SELECT 1 
  FROM user_tables
 WHERE table_name in ('OEHR_ORDERS','OEHR_ORDER_ITEMS')

If your upgrade consists only of application-level changes (that is,there are no supporting objects changes) you do not need to create upgrade scripts. You can simply instruct users to install the new application, but not install supporting objects.

Utilizing Upgrade Messages

When creating an upgrade, there are four messages you can use: Welcome Message, Confirmation Message, Success Message, and Failure Message. Use these messages to inform the user that they are upgrading their supporting objects instead of just installing them.

If you distribute an application that is used as an upgrade, you should recommend that users install the application using a new application ID. This approach retains the initial application and its associated supporting object definitions. Once the user runs and reviews the upgraded application, they can then delete the prior version. Remember to also make sure users understand that they should not remove supporting objects.

About Refining Your Installation Scripts

Once you create your supporting objects, you should test them. As a best practice, be sure to:

  1. Perform the test in another workspace, or in the same workspace using a different schema.

  2. Export your application and include the supporting object definitions.

  3. Then, import the application into another workspace and experience the installation process.

    This will enable you to edit the messages to fit your application.

  4. If the supporting objects are created successfully, you should run and test the application.

  5. If the applications displays and performs as expected, delete the application and then deinstall your supporting objects.

  6. Finally, use Object Browser to verify that all your supporting objects have been removed.

    Since installation scripts are rarely correct the first time, this is typically an iterative process.

Downloading Public Packaged Applications and Sample Code

If you are using Oracle Application Express 2.2 or higher, you can download packaged applications and sample code from the Oracle Application Express Web site. Packaged applications are fully functional applications that you can view, use, and customize. Sample code is provided as packaged applications that contain a snippet of code to explain a solution.

To download public packaged applications and sample code:

  1. In a Web browser, go to the following Web site:

    http://www.oracle.com/technology/products/database/application_express/packaged_apps/packaged_apps.html

  2. Scroll down to review the available applications or code.

  3. Click the link for the zip file you want to download, and save the file to your computer.

  4. Unzip the file.

  5. Review the Readme file.

    Each application includes a Readme file that contains details about the application functionality, installation procedures, how to remove sample data (if appropriate), and default user names and passwords (if applicable).

  6. Log in to the workspace in Oracle Application Express where you want to use the packaged application or code.

  7. Import and install the application.

    Follow the same steps you performed when installing the sample objects for this guide. See "About Loading Sample Objects".

PK%箹PK%mUIOEBPS/rprt_drill.htmR How to Create a Drill Down Report

4 How to Create a Drill Down Report

A drill down report is a type of report that displays summary data with links to related detail data in other reports.

In this tutorial, you create a report on the OEHR_ORDERS table that contains links to drill down to additional data in the OEHR_ORDER_ITEMS table. Additionally, you also learn how to change the format of a column by editing column attributes.

Before you begin, you need to import and install the OEHR Sample Objects application in order to access the necessary sample database objects. See "About Loading Sample Objects".

This section contains the following topics:

Creating a New Application

First, create a new application.

To create an application:

  1. On the Workspace home page, click the Application Builder icon.

    The Application Builder home page appears.

  2. Click Create.

  3. Select Create Application and click Next.

  4. For Name, specify the following:

    1. Name - Enter Drilldown Reports.

    2. Application - Accept the default.

    3. For Create Application - Accept the default, From scratch.

    4. For Schema - Select the schema where you installed the OEHR sample objects.

    5. Click Next.

      Next, you need to add pages. You have the option of adding a blank page, a report, a form, a tabular form, or a report and form. For this exercise, you add two blank pages.

  5. First, add the first blank page. Under Add Page:

    1. Select Page Type - Accept the default, Blank, as shown in Figure 4-1.

      Figure 4-1 Add Page

      Description of Figure 4-1 follows

    2. Page Name - Enter Orders.

    3. Click Add Page.

  6. Add the second blank page. Under Add Page:

    1. Select Page Type - Select Blank.

    2. Subordinate to Page - Accept the default.

    3. Page Name - Enter Order Items.

    4. Click Add Page.

    The two new pages appear at the top of the page.

  7. Click Next.

  8. For Tabs, accept the default, One Level of Tabs, and click Next.

  9. For Copy Shared Components from Another Application, accept the default, No, and click Next.

  10. For Attributes, accept the defaults for Authentication Scheme, Language, and User Language Preference Derived From and click Next.

  11. For User Interface, select Theme 2 and click Next.

  12. Review your selections and click Create.

    The Application home page appears. Note that your application contains three pages:

    • 1 - Orders

    • 2 - Order Items

    • 101 - Login

Creating Reports for OEHR_ORDERS and OEHR_ORDER_ITEMS

Next, you need to create reports for the OEHR_ORDERS and the OEHR_ORDER_ITEMS tables.

Topics in this section include:

Create a Report for OEHR_ORDERS

To create a report on the OEHR_ORDERS table:

  1. On the Application home page, click Create Page.

  2. For page type, select Report and click Next.

  3. Select Wizard Report and click Next.

  4. For Page Attributes:

    1. Page Number - Enter 1.

    2. Page Title - Enter Orders.

    3. Region Title - Enter Orders.

    4. For Region Template, accept the default.

    5. For Breadcrumb, accept the default.

    6. Click Next.

  5. For Tables and Columns:

    1. For Table/View Owner, select the default.

    2. For Table/View, select OEHR_ORDERS.

      The columns in the OEHR_ORDERS table appear.

    3. From the Available Columns list, press Ctrl to select and move the following columns to the Displayed Columns list as shown in Figure 4-2:

      ORDER_ID, ORDER_TOTAL, ORDER_DATE
      
      

      Figure 4-2 Selected Columns

      Description of Figure 4-2 follows

      Next, create a join with the OEHR_CUSTOMERS table to display the customer name. First, select the table.

    4. From the Table/View list, select OEHR_CUSTOMERS.

      The columns in the OEHR_CUSTOMERS table appear.

    5. From the Available Columns list, select CUST_LAST_NAME and move it to the Displayed Columns list.

    6. Click Next.

  6. For Join Conditions, accept the defaults and click Next.

  7. For Report Options, accept the defaults and click Next.Click Create Report Page.

  8. Run the page by clicking the Run Page icon. If prompted for a user name and password, enter your workspace user name and password and click Login. See "About Application Authentication".

    As shown in Figure 4-3, a report on the ORDERS table appears.

    Figure 4-3 Report on OEHR_ORDERS Table

    Description of Figure 4-3 follows

    Note the report displays four columns: Order Id, Order Date, Cust Last Name, and Order Total. Also notice the format of the Order Date and Order Total Columns. Also note that your data might appear in a different order. You can ignore this difference and continue with the steps.

    Next, you will change the format of these two columns.

Change the Format of Order Date Column

To change the format of the Order Date column:

  1. Click Edit Page 1 on the Developer toolbar.

    The Page Definition for page 1 appears.

  2. Under Regions, click the Report link as shown in Figure 4-4.

    Figure 4-4 Report Link

    Description of Figure 4-4 follows

    The Report Attributes page appears.

  3. Click the Edit icon next to ORDER_DATE. The Edit icon resembles a small page with a pencil on top of it.

    The Column Attributes page appears.

  4. Locate the section Column Formatting.

  5. From Number/Date Format, select the date format DD-MON-YYYY (for example, 12-JAN-2004).

  6. Click Apply Changes.

    The Report Attributes page appears.

    Next, change the format of the Order Total Column.

Change the Format of Order Total Column

To change the format of the Order Total column:

  1. Click the Edit icon next to ORDER_TOTAL.

    The Column Attributes page appears.

  2. Locate the section Column Formatting.

  3. From Number/Date Format, select the number format that includes a dollar sign (for example, $5, 234.10).

  4. Click Apply Changes.

  5. Run the page by clicking the Run Page icon in the upper right corner as shown in Figure 4-5.

    Figure 4-5 Run Page Icon

    Description of Figure 4-5 follows

    As shown in Figure 4-6, the revised report on the OEHR_ORDERS table appears.

    Figure 4-6 Report on OEHR_ORDERS Table with New Column Formats

    Description of Figure 4-6 follows

  6. Click Application on the Developer toolbar to return to the Application home page.

Create a Report for OEHR_ORDER_ITEMS

To create a report on the OEHR_ORDER_ITEMS table:

  1. On the Application home page, click Create Page.

  2. For Page, select Report and click Next.

  3. On Create Page, select Wizard Report and click Next.

  4. For Page Attributes:

    1. Page Number - Enter 2.

    2. Page Title - Enter Order Items.

    3. Region Title - Enter Order Items.

    4. For Region Template, accept the default.

    5. For Breadcrumb, accept the default.

    6. Click Next.

  5. For Tables and Columns:

    1. Table/View Owner - Accept the default.

    2. Table/View - Select OEHR_ORDER_ITEMS.

      The columns in the OEHR_ORDER_ITEMS table appear.

    3. From the Available Columns list, press Ctrl and move the following columns to the Displayed Columns list:

      ORDER_ITEM_ID, ORDER_ID, UNIT_PRICE, QUANTITY
      
      

      Next, create a join with the OEHR_PRODUCT_INFORMATION table to display the product name.

    4. For Show Only Related Tables, select No.

      Next, select the table.

    5. From the Table/View list, select OEHR_PRODUCT_INFORMATION.

      The columns in the OEHR_PRODUCT_INFORMATION table appear.

    6. From the Available Columns list, select PRODUCT_NAME and move it to the Displayed Columns list.

    7. Click Next.

  6. For Join Conditions, accept the defaults and click Next.

  7. For Report Options, accept the defaults and click Next. Click Create Report Page.

  8. Click Run Page.

    As shown in Figure 4-7, a report on the OEHR_ORDER_ITEMS table appears.

    Figure 4-7 Report on OEHR_ORDER_ITEMS Table

    Description of Figure 4-7 follows

Customizing the ORDER_ITEMS Report

Next, you need to customize the Order Items page. In this exercise, you add an item to hold the value of the ORDER_ID, add a WHERE clause that constrains the report by the value of ORDER_ID item, and modify the Region Title to note which order is being viewed.

Topics in this section include:

Add an Item to Hold the Value of ORDER_ID

To create an item to hold the value of ORDER_ID:

  1. Click Edit Page 2 on the Developer toolbar.

    The Page Definition appears.

  2. Under Items, click the Create icon as shown in Figure 4-8.

    Figure 4-8 Create Icon

    Description of Figure 4-8 follows

  3. For Item Type, select Hidden and click Next.

  4. For Display Position and Name:

    1. Item Name - Enter P2_ORDER_ID.

    2. Sequence - Accept the default.

    3. Region - Select Order Items.

    4. Click Next.

  5. Click Create Item.

Add a Where Clause to Restrict the Report

Next, you add a WHERE clause that constrains the report by the value of ORDER_ID item.

To add a WHERE to the ORDER_ITEMS report:

  1. Under Regions, select Order Items as shown in Figure 4-9.

    Figure 4-9 Order Items

    Description of Figure 4-9 follows

  2. Click the Query Definition tab.

  3. Click Modify Join Conditions.

  4. On the Modify Join Conditions page:

    1. For the first Column, select OEHR_ORDER_ITEMS.ORDER_ID. Note that you may need to click Search to view available columns.

    2. In the second Column field, replace the existing text with the following condition:

      :P2_ORDER_ID
      
      
  5. Click Apply Changes.

Modify the Region Title

To modify the region title of the ORDER_ITEMS report:

  1. Under Regions, click Order Items.

  2. In Title, replace the existing text with the following:

    Order Items for Order # &P2_ORDER_ID.
    
    
  3. Click Apply Changes.

Linking the ORDERS Report to the ORDER_ITEMS Report

Lastly, you link the OEHR_ORDERS report to the OEHR_ORDER_ITEMS report. To accomplish this, you must edit the attributes of the ORDER_ID column on the OEHR_ORDERS report and create a link. The link will populate the P2_ORDER_ID hidden item on page 2 with the clicked ORDER_ID.

To create a link from the ORDER_ID column on the OEHR_ORDERS report to the OEHR_ORDER_ITEMS report:

  1. On the Page Definition, enter 1 in the Page field in the Navigation bar and click Go.

  2. Under Regions, click Orders.

  3. Click the Report Attributes tab.

  4. Click the Edit icon next to ORDER_ID.

  5. Scroll down to Column Link.

    1. In the Page field, select 2 Order Items.

      Next, populate the P2_ORDER_ID hidden item on page 2 with the clicked ORDER_ID.

    2. From Item 1 Name, select P2_ORDER_ID.

    3. From Item 1 Value, select #ORDER_ID#.

    4. For Link Text, select #ORDER_ID#.

    Your Column Link attributes should resemble Figure 4-10.

    Figure 4-10 Column Link Attributes for the ORDER_ID Column

    Description of Figure 4-10 follows

  6. Scroll to the top of the page and click Apply Changes.

  7. Click the Run Page icon in the upper right corner of the page.

    As shown in Figure 4-11, you can link to page 2 by clicking an Order Id.

    Figure 4-11 OEHR_ORDERS Report with Link to Page 2

    Description of Figure 4-11 follows

PKERkRRPK%mUIOEBPS/scripts.htm;`ğ DDLs and Scripts

A DDLs and Scripts

This appendix contains DDLs (data definition language) and scripts necessary to complete a number of tutorials in Oracle Database Application Express Advanced Tutorials.

Topics in this section include:

Creating Application Database Objects DDL

The following DDL creates all the required database objects for the issue tracking application in "How to Build and Deploy an Issue Tracking Application" on page 14-1.

-- 
-- This DDL creates all the database objects used by the
-- Issue Management Application featured in 
--
-- HT_PROJECTS
--
-- The HT_PROJECTS DDL:
--    + creates the projects table with the necessary columns, 
--      including a new column for a system generated primary key
--    + declares the new primary key
--    + implements the real primary key, project name, as a unique key
--    + implements a sequence to generate project id
--    + assigns the sequence to populate the project id 
--      whenever a new record is created
--    + declares table and column comments
--






CREATE TABLE ht_projects (
   project_id              INTEGER           NOT NULL,
   project_name            VARCHAR2(100)     NOT NULL,
   start_date              DATE              NOT NULL,
   target_end_date         DATE              NOT NULL,
   actual_end_date         DATE

)
/
ALTER table ht_projects
   ADD CONSTRAINT ht_projects_pk
   PRIMARY KEY (project_id)
/
ALTER TABLE ht_projects
   ADD CONSTRAINT ht_projects_uk
   UNIQUE (project_name)
/
CREATE SEQUENCE ht_projects_seq
   INCREMENT BY 1
   START WITH 40
/
CREATE OR REPLACE TRIGGER bi_ht_projects
     BEFORE INSERT ON ht_projects
     FOR EACH ROW
  BEGIN
     IF :new.project_id is null
        THEN SELECT ht_projects_seq.nextval
               INTO :new.project_id
               FROM DUAL;
     END IF;
  END;
/

COMMENT ON table ht_projects IS 
   'All projects currently underway.'
/
COMMENT ON column ht_projects.project_id IS 
   'The system generated unique identifier for the project.'
/
COMMENT ON column ht_projects.project_name IS 
   'The unique name of the project.'
/
COMMENT ON column ht_projects.start_date IS 
   'The start date of the project.'
/
COMMENT ON column ht_projects.target_end_date IS 
   'The targeted end date of the project.'
/
COMMENT ON column ht_projects.actual_end_date IS 
   'The actual end date of the project.'
/

--
-- HT_PEOPLE
--
-- The HT_PEOPLE DDL:
--    + creates the people table with the necessary columns, 
--      including a new column for a system generated primary key
--    + declares the new primary key
--    + implements the real primary key, person name, as a unique key
--    + implements a check constraint to validate the roles that people 
--      can be assigned

--    + implements a foreign key to validate that people are assigned to 
--      valid projects
--    + implements a check constraint to enforce that all project leads 
--      and team members are assigned to projects
--    + implements a sequence to generate person id
--    + assigns the sequence to populate the person id whenever a 
--      new record is created
--    + declares table and column comments
--

CREATE TABLE ht_people (
   person_id              INTEGER           NOT NULL,
   person_name            VARCHAR2(100)     NOT NULL,
   person_email           VARCHAR2(100)     NOT NULL,
   person_role            VARCHAR2(7)       NOT NULL,
   assigned_project       INTEGER
)
/
ALTER TABLE ht_people
   ADD CONSTRAINT ht_people_pk
   PRIMARY KEY (person_id)
/
ALTER TABLE ht_people
   ADD CONSTRAINT ht_people_uk
   UNIQUE (person_name)
/
ALTER TABLE ht_people
   ADD CONSTRAINT ht_people_role_cc
   CHECK (person_role in ('CEO','Manager','Lead','Member'))
/
ALTER TABLE ht_people
   ADD CONSTRAINT ht_people_project_fk
   FOREIGN KEY (assigned_project)
   REFERENCES ht_projects
/
ALTER TABLE ht_people
   ADD CONSTRAINT ht_people_assignment_cc
   CHECK ( (person_role in ('Lead','Member') and assigned_project is not null)
   or (person_role in ('CEO','Manager') and assigned_project is null) )
/
CREATE SEQUENCE ht_people_seq
   INCREMENT BY 1
   START WITH 40
/
CREATE OR REPLACE TRIGGER bi_ht_people
      BEFORE INSERT on ht_people
      FOR EACH ROW
   BEGIN
      IF :new.person_id IS NULL
          THEN SELECT ht_people_seq.nextval
                 INTO :new.person_id
                 FROM DUAL;
      END IF;

   END;
/

COMMENT ON table ht_people IS 
   'All people within the company.'
/
COMMENT ON column ht_people.person_id IS 
   'The system generated unique identifier for the person.'
/
COMMENT ON column ht_people.person_name IS 
   'The unique name of the person.'
/
COMMENT ON column ht_people.person_role IS 
   'The role the person plays within the company.'
/
COMMENT ON column ht_people.assigned_project IS 
   'The project that the person is currently assigned to.'
/

--
-- HT_ISSUES
--
-- The HT_ISSUES DDL:
--    + creates the table with the necessary columns, including a new column 
--      for a system generated primary key
--    + declares the new primary key
--    + implements a foreign key to validate that the issue is identified by a
--      valid person
--    + implements a foreign key to validate that the issue is assigned to a 
--      valid person
--    + implements a foreign key to validate that the issue is associated with 
--      a valid project
--    + implements a check constraint to validate the status that is assigned 
--      to the issue
--    + implements a check constraint to validate the priority that is assigned 
--      to the issue
--    + implements a sequence to generate issue id
--    + assigns the sequence to populate the issue id and the creation date 
--      whenever a new record is created, records the user creating the
--      row and also assigns status of 'Open' if no status is provided
--    + records the current date and the user whenever an issue is edited and
--      sets the status to 'Closed' if an ACTUAL_RESOLUTION_DATE is 
--      provided
--    + declares table and column comments
--

create table ht_issues (
   issue_id                INTEGER           not null,
   issue_summary           VARCHAR2(200)     not null,
   issue_description       VARCHAR2(2000),
   identified_by           INTEGER NOT NULL,
   identified_date         DATE              not null,
   related_project         INTEGER           not null,
   assigned_to             INTEGER,
   status                  VARCHAR2(8)       not null,
   priority                VARCHAR2(6),
   target_resolution_date  DATE,
   progress                VARCHAR2(2000),
   actual_resolution_date  DATE,
   resolution_summary      VARCHAR2(2000),
   created_date            DATE              not null,
   created_by              VARCHAR2(60)      not null,
   last_modified_date      DATE,
   last_modified_by        VARCHAR2(60)
)
/
ALTER TABLE ht_issues
   ADD CONSTRAINT ht_issues_pk
   PRIMARY KEY (issue_id)
/
ALTER TABLE ht_issues
   ADD CONSTRAINT ht_issues_identified_by_fk
   FOREIGN KEY (identified_by)
   REFERENCES ht_people
/
ALTER TABLE ht_issues
   ADD CONSTRAINT ht_issues_assigned_to_fk
   FOREIGN KEY (assigned_to)
   REFERENCES ht_people
/
ALTER TABLE ht_issues
   ADD CONSTRAINT ht_issues_project_fk
   FOREIGN KEY (related_project)
   REFERENCES ht_projects
/
ALTER TABLE ht_issues
   ADD CONSTRAINT ht_issues_status_cc
   CHECK (status in ('Open','On-Hold','Closed'))
/
ALTER TABLE ht_issues
   ADD CONSTRAINT ht_issues_priority_cc
   CHECK (priority in ('High','Medium','Low'))

/

CREATE SEQUENCE ht_issues_seq
   INCREMENT BY 1
   START WITH 40
/
CREATE OR REPLACE TRIGGER bi_ht_issues
      BEFORE INSERT on ht_issues
      FOR EACH ROW
  BEGIN
      IF :new.issue_id IS NULL
         THEN SELECT ht_issues_seq.nextval
                INTO :new.issue_id
                FROM DUAL;
      END IF;
      IF :new.status IS NULL
         THEN :new.status := 'Open';
      END IF;
      :new.created_date := sysdate;
      :new.created_by := nvl(wwv_flow.g_user,user);
  END;
/
CREATE OR REPLACE TRIGGER bu_ht_issues
      BEFORE UPDATE ON ht_issues
      FOR EACH ROW
  BEGIN
      IF :new.actual_resolution_date IS NOT NULL
         THEN :new.status := 'Closed';
      END IF;

      :new.last_modified_date := sysdate;
      :new.last_modified_by := nvl(wwv_flow.g_user,user);
  END;
/

COMMENT ON table ht_issues IS 
   'All issues related to the projects being undertaken by the company.'
/
COMMENT ON column ht_issues.issue_id IS 
   'The system generated unique identifier for the issue.'
/
COMMENT ON column ht_issues.issue_summary IS 
   'A brief summary of the issue.'
/
COMMENT ON column ht_issues.issue_description IS 
   'A full description of the issue.'
/
COMMENT ON column ht_issues.identified_by IS 
   'The person who identified the issue.'
/
COMMENT ON column ht_issues.identified_date IS 
   'The date the issue was identified.'
/
COMMENT ON column ht_issues.related_project IS 
   'The project that the issue is related to.'
/
COMMENT ON column ht_issues.assigned_to IS 
   'The person that the issue is assigned to.'
/
COMMENT ON column ht_issues.status IS 
   'The current status of the issue.'
/
COMMENT ON column ht_issues.priority IS 
   'The priority of the issue. How important it is to get resolved.'
/
COMMENT ON column ht_issues.target_resolution_date IS 
   'The date on which the issue is planned to be resolved.'
/
COMMENT ON column ht_issues.actual_resolution_date IS 
   'The date the issue was actually resolved.'
/
COMMENT ON column ht_issues.progress IS 
   'Any progress notes on the issue resolution.'
/
COMMENT ON column ht_issues.resolution_summary IS 
   'The description of the resolution of the issue.'
/
COMMENT ON column ht_issues.created_date IS 
   'Audit Column: Date the record was created.'
/
COMMENT ON column ht_issues.created_by IS 
   'Audit Column: The user who created the record.'
/
COMMENT ON column ht_issues.last_modified_date IS 
   'Audit Column: Date the record was last modified.'
/
COMMENT ON column ht_issues.last_modified_by IS 
   'Audit Column: The user who last modified the record.'
/

Creating Issues Script

The following script populates Issues table for the issue tracking application in "How to Build and Deploy an Issue Tracking Application" on page 14-1.

--
-- Email Integration Issues
--
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
     (1, 'Midwest call center servers have no failover due to Conn Creek plant  fire','', 
     6, sysdate-80,
     3, 6, 'Closed', 'Medium', sysdate-73,
     'Making steady progress.', sysdate-73, '')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
       identified_by, identified_date,
       related_project, assigned_to, status, priority, target_resolution_date,
       progress, actual_resolution_date, resolution_summary)
  VALUES
      (2, 'Timezone ambiguity in some EMEA regions is delaying bulk forwarding to mirror sites','', 
      6, sysdate-100,
      3, 14, 'Open', 'Low', sysdate-80,
      '','','')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
       identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (3, 'Some vendor proposals lack selective archiving and region-keyed retrieval sections','', 
      6, sysdate-110,
      3, 13, 'Closed', 'Medium', sysdate-90,
      '', sysdate-95, '')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (4, 'Client software licenses expire for Bangalore call center before cutover','', 
      1, sysdate-70,
      3, 6, 'Closed', 'High', sysdate-60,
      '',sysdate-66,'Worked with HW, applied patch set.')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (5, 'Holiday coverage for DC1 and DC3 not allowed under union contract, per acting steward at branch 745','', 
      1, sysdate-100,
      3, 13, 'Closed', 'High', sysdate-90,
      '',sysdate-95, 'Worked with HW, applied patch set.')
/
--
-- Employee Satisfaction Survey Issues
--
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (6, 'Review rollout schedule with HR VPs/Directors','', 
      8, sysdate-30,
      5, null, 'Closed', 'Medium', sysdate-15,
      '',sysdate-20,'')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (7, 'Distribute translated categories and questions for non-English regions to regional team leads','', 
      8, sysdate-2,
      5, 8, 'Open', 'Medium', sysdate+10,
      'currently beta testing new look and feel','','')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (8, 'Provide survey FAQs to online newsletter group','', 
      1, sysdate-10,
      5, 11, 'Open', 'Medium', sysdate+20,
      '','','')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (9, 'Need better definition of terms like work group, department, and organization for categories F, H, and M-W','', 
      1, sysdate-8,
      5, null, 'Open', 'Low', sysdate+15,
      '','','')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (10, 'Legal has asked for better definitions on healthcare categories for Canadian provincial regs compliance','', 
      1, sysdate-10,
      5, 11, 'Closed', 'Medium', sysdate+20,
      '',sysdate-1,'')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (11, 'Action plan review dates conflict with effectivity of organizational consolidations for Great Lakes region','', 
      1, sysdate-9,
      5, 11, 'Open', 'Medium', sysdate+45,
      '','','')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (12, 'Survey administration consulting firm requires indemnification release letter from HR SVP','', 
      1, sysdate-30,
      5, 11, 'Closed', 'Low', sysdate-15,
      '', sysdate-17, '')
/
--
-- Internal Infrastructure Issues
--
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
 VALUES
      (13, 'Facilities, Safety health-check reports must be signed off before capital asset justification can be approved','', 
      4, sysdate-145,
      1, 4, 'Closed', 'Medium', sysdate-100,
      '',sysdate-110,'')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (14, 'Cooling and Power requirements exceed 90% headroom limit -- variance from Corporate requested','', 
      4, sysdate-45,
      1, 9, 'Closed', 'High', sysdate-30,
      '',sysdate-35,'')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (15, 'Local regulations prevent Federal contracts compliance on section 3567.106B','', 
      4, sysdate-90,
      1, 10, 'Closed', 'High', sysdate-82,
      '',sysdate-85,'')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (16, 'Emergency Response plan failed county inspector''s review at buildings 2 and 5','', 
      4, sysdate-35,
      1, null, 'Open', 'High', sysdate-5,
      '','','')
/
--
-- New Payroll Rollout Issues
--
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (17, 'Training for call center 1st and 2nd lines must be staggered across shifts','', 
      5, sysdate-8,
      2, 5, 'Closed', 'Medium', sysdate+10,
      '',sysdate-1,'')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (18, 'Semi-monthly ISIS feed exceeds bandwidth of Mississauga backup site','', 
      5, sysdate-100,
      2, 12, 'On-Hold', 'Medium', sysdate-30,
      'pending info from supplier','','')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (19, 'Expat exception reports must be hand-reconciled until auto-post             phaseout complete','', 
      5, sysdate-17,
      2, 12, 'Closed', 'High', sysdate+4,
      '',sysdate-4,'')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (20, 'Multi-region batch trial run schedule and staffing plan due to directors by end of phase review','', 
      5, sysdate,
      2, null, 'Open', 'High', sysdate+15,
      '','','')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (21, 'Auditors'' signoff requires full CSB compliance report','', 
      5, sysdate-21,
      2, 5, 'Open', 'High', sysdate-7,
      '','','')
/
--
-- Public Website Operational Issues
--
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (22, 'Review security architecture plan with consultant','', 
      1, sysdate-60,
      4, 7, 'Closed', 'High', sysdate-45,
      '',sysdate-40,'')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (23, 'Evaluate vendor load balancing proposals against capital budget','', 
      7, sysdate-50,
      4, 7, 'Closed', 'High', sysdate-45,
      '',sysdate-43,'')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (24, 'Some preferred domain names are unavailable in registry','', 
      7, sysdate-55,
      4, 15, 'Closed', 'Medium', sysdate-45,
      '',sysdate-50,'')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (25, 'Establish grid management capacity-expansion policies with ASP','', 
      7, sysdate-20,
      4, 16, 'Open', 'Medium', sysdate-5,
      '','','')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (26, 'Access through proxy servers blocks some usage tracking tools','', 
      7, sysdate-10,
      4, 15, 'Closed', 'High', sysdate-5,
      '',sysdate-1,'')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (27, 'Phase I stress testing cannot use production network','', 
      7, sysdate-11,
      4, 17, 'Open', 'High', sysdate,
      '','','')
/
INSERT INTO ht_issues
      (issue_id, issue_summary, issue_description, 
      identified_by, identified_date,
      related_project, assigned_to, status, priority, target_resolution_date,
      progress, actual_resolution_date, resolution_summary)
  VALUES
      (28, 'DoD clients must have secure port and must be blocked from others','', 
      7, sysdate-20,
      4, 17, 'On-Hold', 'High', sysdate,
      'Waiting on Security Consultant, this may drag on.','','')
/
PKᯬ@`;`PK%mUIOEBPS/img/run_ico_green.gifGIF89aqqqqrrssxxyyzzzzzz{{{{||ĮůŰűƱDzǴȵɶɷ˹̺̻ͻͼνоп!,p  c~a#@2@Ø1UV8b G+0ČI@2|"#% L:>1L(xQ!&J84|ცY>rsW>b&'DA1SB|-&&L(^͏!FPAGniqA2J8 >l 1҂E$B8$ ,XP6;PK@fPK%mUIOEBPS/img/rpt_input_eg.gif96GIF87aDBD̄|z| &lڔLb$Bd:T2L2TO)褗nzbwR:JKrn')o&oqo<\k0Sʊ}[Ė6/g`duB9l -Q$u}ˣF𭑍ZEmdz!Ȗ E8Tx2A LgB2G$\4bHЛ2 hHG j hL ux`g9kΆ33̯:O}&oT&%kԯ Z0@iF`7]8G…3JњXu+_wgU{gQ~. +@+kB0,X *`@tA磱#Øu~r(`^7 2(zތ1m6қ@> @*n}Wm P {in%=;DLy+Inaov΄pNx{c P@/O<3<;}:~{GOқG=B `G'|gOW[>*{?~_;+G籟{^$럯w#>Qa}~_OS|c0}~g x}Ge4~w ~Gė~ ȁ H|$b JWq0}瀩 8(|ׁx&(z6#DR+Ȃـ~׀K؁NP=(zkEDzk7~ xQb:~S8z?FCaؐg1(!(9xl{[(0ȇS~nx Hy~шxlj؉sAxX ^H xP9Tc8x"X¸ BPH o"vehgVĘh8 &fѨvXE؂HQ8nHX 5mFmaj{G ymfhm8яxyؐ!jXW[&U (iQy m;)Fؒ.M(y5 9 aSDf[D$^&& FiI09kIP^)hՓ_ٓsiHYUы)jIQpɗcC 1[Y!m5w\IBɈ 9&ٛ Q0i% ќ0霉"ٗ89Yy虞ɝ)) i X9  Q@4Db"e&&hvِʋ)vYV` bjq JPy%jq:.LDmQ°z9'qT{Aɢ1~8DZF )zFjL!*8Q eQhu ^ &Pb5R r:JY ٧q{~:Zzڹp:Zzڨ {ʩZzJڪ ZzʨګzƚڬʬګԺպzj:P:z:j*麮P隭캭`*zʯ ۬ʩ+ 9 JZ[튱zJJ\š@@!@*j!pW$۩1˭X ˦аP('/[2;ʱ,kCB?[:BA;F@ T{"˴N+EZUb)kA[J GMC2d;L lKO[TkS@Kk]; K[E> ٦鳉;WK^;XkPK[۴S{q˵[{˻뻽Jۻ˻ i[˼ ˺+[{;b<~f_%ɥ[%Km ۪۸K {;_˿;+˺ܿ,+Kt˷(< AɡDy9mWiÕy{ \F<)L,|ۻɥ,rvİy|*,ʳzܠ=[ȑeĨC˝È,JƟ·۶K\.iSUK glc>L|\|˛#~<_Ȍ[+K-˿D[Lmп,JT& PlbѲ.lѺs|˹\Ƥ΁ ڬ'=ھNzܠV] |v<.Ц\ЛaZ.Ll¿,Hf=/:mR uz֑^t{=4]:<'mƞ-Ζb kEL'K+ ڙڠҷjˉ}l׮fl*zʝ۲c]ŝbϭJYؿ 5m-ҽݨZh$قm-ޥ:j߽]ͯmȋ݌ބ8Kkᐋ|9 P&~(*¨!wD 7 $O0.;N=?A>.C^b`I&e[JԒ[pPBS^@:k] V `^s^uwy%d>ђIheަ0\ɰc r9 :<f5 xnN@H~Σt٤{Zk:Ӧˬ \U-PmR9NCUdm~|@O ^eB} ZN' .ۘ﹩ WH*0 OzIRHkÿ5^TNX[8z~si@4 hޞsOhN% 8i^ }n' >:/V6P>? /3NJN A_no z_]nw9oÜ{/Y/ Oo wȯϧC00HXH(`X(8HؘH(hi0J YYz9j99Kk [[K `*: -]<}MXP m@p;| ̺N*YϾz*(Q #&kգ a=EpBa!Q〄lʕغ{YӅ9RRM;,QΝCWG3J!4^ҕ7q:]GM{bTFCFV`ձcb=QQtզ,)WNf]WsFy8Cs ddlq 9żz5/q&_Ƭ4ՈYT-JkiWW:foMLKVO&zȵsOktЧ6a:3sr<-9噹v;w^}Żoxt4ӀL9v~9ZIvna~b"Hb& p$`(QQr֊K/tb:c>dBIdFdJ/PHdR P@!hHݓP(eZv&]ddkiVYYw\ztoJg{96kf"e1[ƚ"{an̵6E:~SH<:ըAk7 CmnP'DUhGER?Tڱ`*C+C]Cy*\YVB 2ƚHvTIsC>takڿnX~-5)M!*dca"EIא$H&@δ*xL75Y[UXV?:,JsiԘ;*WZas ]KvKfo vaͱۭnEBy>'rغN8S𥮷*MnK =.;V{ .n[b]:5FnlW`AZX5Ȼ#6ex,f}o íɵVq66w}^nqI:$S V5`Sԟ)SJЌJ0yeCыAd4*_r~t&L KRvur[)OISWuI/}7YՒ/Ο_ ԔҲg@geΫ]*VNUիP4WclI}dԯsK7B.O">K;֓XO&|u]rmaZguck \)L?4I&{Xa-0`ѺN5ጷEGz1N<"j7r3VU{mwgjmqdroJxZX54+Y2xo%h*kv)"/iikx?'1)O9,bmV=Wwn#^kYVeЮާv=.gosZ?oҜ1=x{}H̋oWG#Q}ǻd/Oԫ~fB{wUtO^azؿ;pԪ%Ψj²#Sz.ڽ+ Rl-t~֥ax2~v:]#W'<'Vw_|0H8? RbKmh gi~d7~^he:@NgrAr:YvZDJ":\rG h;xgCZumtBF'.gk9(X$ Exa 7F.(~h['8aZ>/q_y7Fm,XpWjFh[bgUcwn'q(,'i_V)|ctYv Xʠl|nh|b}dHwcn؆ԉSKDmc;6^µn%s8|F&3;:BCs=ȃ9YJGmex}t;dVÌ'ow" Hr4;E|~:8ktZX9Cjׇ#/ng}~8puY%8bRFx7&qM3 Xfh8Npp (˷=8}PK(8 fEf%*7ic*v&p"2a6L(E{4h 7ט Ri@x(pvVw&H pĕ gqx`&(p\c$i ɍ^03XaǓVE[i9Yt7)U%9tsB&DtIf:H~~NW`Z9 dQwux& 'דϗ'v{FVw_;u9Z Sʹ:EfƅDx`U訂vɛi}g {@hb'>MWK(wg֛皇z4595lF7Iz !*#yW 8 IP*q)} vʜI74N*NjiIgCUrJ-ڒ 0WwFLgEW[Z] S'v2y[wPiex oyKxZYNxɚ1m8YE["tkA7z*p>p8gx]]5 æ+ȟG(%~8 iǦ-~݆acJ5jHHF6l=4DQʪ 6"cI_郑ɉ ŕ[Z '}y)YCؕ3x\%y֑Xv4?Qha_Ú'w7(Ӥ|kCX9 DypЃxS7zjٍmJJTu7 +:ǰS_"AN:cyȩ R4K;賳ګ)JګBTٶکjUkPK\]rDgT,C+B =nCAWuٴFR9;UDpEQ0/ J:L6b*+)14Q_@{$Yt:Adzi&tI9XVL҄)s4dxy0ekggy7:\? +cq:9Bz⋢ٹ9@Cnk7iG;:ʰ9D33;^ `{ z%[:C E仜ZyA,5˽-f*V/;=/l\EfEf,~ujv;"SLUlWYŘZB\sjDe ̿^zČPerʥtwl`g-췊ñj{rz6Gk*kkFH"\lʟ6YZcl wGⅯy[ۮ6˜SjLL|psE+٭U޸5I UP8|cx辔[g, Dr8̘+lOysՌ#T|Wը>̙01>M 3=:V&. NG D5IсÉ}m꧹Xw"lʈ ӠECI ŒkwE Eh8 ٨-:&ͽ2i_CE-w-D-ܞkh!%܉|tnܖz̪8|[ҹm.ʮւL]|yC}{>p];H^Л&-Ci?T?Jh䁶 rmmþBZ}\_]GІoA\'&yA*ٸdON?j*KhևN3OnSKl4nڂ"}-Kݵ:Ja\,ۀ@Z1فT>݌׎!tVgDZ*Jh٤kӫ8|p_]oY A/# j^>ǎ(i&Oi<݊͠M!iƼ }L(B~ܨ}l7hC_8Oƻ?MoA~/,nOٯFr %^㳿o/o ƼńɂЋ̉Ԓָхۃ;&n /Q}Z$ HZ:ޚ9$ȐXCIJ%AidE KXS̙12iɒ:RC&QA9RfHऍʲѱ|SKڒy۳[W% 3/WznVEmߎWj/]nҷ2+rj/lٷ^?5׳7#a5<PnXZ9|/cAFK=c E&HyzވSɢ|Ɂ_n߃8*G &bY GuBL;m\f5WoO }^xY֝yH^16{wVilU&^c#9ՏZ9I$_Kv jvy j [#!)btRHjvO0 JG>vhqehșjd8kFyi|Fէ~2R)ih].l]?ʉE:%>;l$UEѯkA/-;o0jQ󾴝 A:LX;}/Ub+K$_Ֆ,mQ5PX稯%Tw;$:hNC0`RkСAFꀿ s@>+ !YᄮsJQxlTqD3ժW|H`oMa5F6a](“$ UBU{$9+NV\b&Dwt"xK%QJeR'~Տ\9!,=YPK@IQJҖhI,6" "Ca*|,eCvKX1׉S`/մ2pA\'i~BMiIy|#HX a/=NjK]سPm~)[nP+Ao]h Z= = >l(KnԬH*]}r5-HST2McEYOmSRm:_ɮt9L wݐӓt3!%H  *VgT.^y!ef: AԨ_ leP֓mtkNPxL+:e4;nnܪwe.{%f6obGTMz|KvEt+RRWo~WQT_N."_B~+ Tzefãpr/A~"LWk"FXՋnUH˱#dt@q{KcdBٗaiFiyd! ޶YZ{#! 71&g9ً~3Q TUjV^BANņ0|WfZHxMGOIc謴pt*5I.ˆ +p\9gHSCsIUs9([O}}Zc< 3r#!])X.QzjkeXwƂщ&Z?*z1 V{͎VEV١5`\1[}h>pF8Oe"ЊmgPI>͵9Υo&5-W\ן4쑬K Fq k\n'V{iS6Ň}e耿z,<ǧk1U}湢x`vӮ2FIg^r ڔOg4EB`7)~˳߻w{mͯXlaSQrELܗd/)A,-uD 2ȅ@gR-e|Fenh/"HcۦUn6Q_zhL#9 z8D}gDTYtfy_16q0WrYei64uj3Ruc8oXsl sĊ_ELOxǃn7npyku'U7Fl?G3m8G-MJgL7koFU`hnHXGJb![Q献*pYf/dG7'K Rxw4X"Gs-f7F)^hU3օyfʶHx8vui;G? ԅhWVxx{gЎBWsyiQh9IR@juޘ9?K$YxMPX8B'oxwOGyoSOyXr6xXZw[uQy2I|s{i/vqWC,JQ0)!8htapQx(xɊ1ņeeZ[hIW9IfV4|We|Tt`I+ȂbB)X1f/ׂ.[᷃ 8Iy1ɜ*H0h:깞ٞ9Yyٟ:Zz ;PK+99PK%mUIOEBPS/img/acl_edit_priv.gifGIF87a䬪dfdΜdf4f̜Dn ZXq`{oN캷=8bF/qn_䱘"ckνËOӫ_Ͼg}Ͽg݀ H[)29JAGlIi yHH؈+YI($4XpTViWgNR`)dihliNŝxx:'XXT0&袌6裐F*餔Vj饏V D\`)*ꨤJ@ 茡*무j뭚9|+KC ZF+6k)2vm@<[뮵|Щk@ =4_貢l0׎&Qj1d1.2 , qǩXEP񹮲2-7# ӓ'9pC &lT>SS~ }ꀟZW@P 6h 7eTz§lUYLW\:֑ 5Ī\U^Cݫy\%+QҴ-_3Դ4"@>:S^$!QSSV dZnmf%k~'۱oW׶DZklN5.t56;ILe[bֺmMwN|_[W&Vu/uFwq\ҦW=k^7=&Zu mx `+k{;a_xo+a 1\]/.pKN[Wg-*[Lڎ0M_.z rg=f M2cL]$^.I& 8aWعg^\\N'V j9ln-HX v|bKϕ٣)g_Ov:ԋ.rU>qo;cZWٲ{^6/BM0 3IMQjGt}pSn{7wrvwOuwlw:B}6Q~GVqNG %z+Gwϸ7{ 9ǁ Ay?Ta>dQGt>6 ?Htx4A @S}h@я>ONy@3jP@`tR=馰s|9O>w?|$ @v (~{b7ydo> ^ׇe/{}tO>|}ߓ땟|e>>a}_G7 7G~sH}{wǧgz hX@xx~؁7Bgy{~!H|`zz}W -} $$(uR { *X,nwG'N|P}`}9XT耾}w0( ~]~U}mH \0P'{x bXr KH'}ׁ'}'~ׅyxKCXv`~`h0rpP~`~1WPx8ww~jX sP(v @` Lg+7v'r8Xx蘎Ǥ @`.rHBtm.GVguXu Ɉ=Ygvkw跆~ ZwWh|.ɉ`芒7upy2y 7*ْpp7)Q(wSvBI>8F rWz39 χh9gY U@ẋw{l#~tVHMwh'd hzyY ׋ȕ_)9x甼0ViٔY '59ˇ81H ~)Iɒq=H~(txaQ }ٚ+)x`ܩ8uG8~i8PKyG/ْә(ɝy 8dhh xʼnك  \(iHə J*pgT *:}yIrG9h(]w1y j{XhGڐLNj Jzz]i{hHZُ gjnczmoj)xz|ڧ"珰IhZskڎsu"Z e:*!pڤߗ[!I9W)Jj Z[vlg$ix,饤3h9 ʫ: yF :[: U\ٰٛi)8#KJy}0;?[(+|[Z㙄7k+=;kG ڠ g8ZWkޠ9Yrz ؋(qʶ;Ji Mو9.Z粿ڰMe٪C:$Z)j᭰H:J` ȑ갮* j;Ի " [{𨶋$O( ) r˪+uY<窈{!)T'z ?* K6I"A ڗ> ̬ŹKw\'G b+=T^V4*u>5 M`.;ξM=Zo_gm,3mpnuD\~؋Ll_Թ&ȵn >n|l늻3]Q n alMߊ-,M/z;~F^ H#:в #Ւ[Nj^ 'Ngb:NZ/Kn{8[G;(|~M}^r,>%}|~ؔ)ovs$-*HmHNds}YJW0/jB^j ܐjZ>LΓ,J ٽyRI^ l mpon !xI ,엞=_Ǔʦ | 8HXh(`8H(()I9I@8P0@0J@ +;K[hYhYjk y)\K\|غxN-/NZ2mòIOBB5ouW1s (X`,JƣZM3 DfZ$[ tf744l72Ty(un"91˩RM9Ê]>)˨PH59 +׽Nx_?IX 7/?׾6Zr}&^ɆKk4\W\ ::I׺c8ءSrSn^ :_H2\ړw{+ŋoؗ?ۿ?`H` ;PKEPK%mUIOEBPS/img/chk_rpt_edt_attr.gifk GIF87ar|~|dfdfĴƴ伺ƼԬʼtztdnd´܌||촺̼μ줶􌎌||܌줢,r«ղܶ  '1,(( 1@r1B8*^#2 .\Șq#GR@AP"C<*ނ0_ʒ)M@xJAA @}Es8aP3.m e̘h5[ \HH`hKM“APO`WΩܻxd̮o60١ƍ%x;yPTf.5_ѣiI&NW˞]ʅo1݈v2&Gu1P;Ӧ_G5ԯ}6$Nnj ;zWoտ>~ϵk?z:l& Y݁100vA @0TQ1Zt!}ubue_եjB 7hV[ՙ1}@V)d8u&)v0f) @%BA&YXcD6v$AƤO(UR Q C3Xn \9'd x DJ椓ΉXyj*=/ p UKA|vVj*jWؕ:%6 = +H>L8٤qʩ+|Bi.{^Y..:.5Т L 8-*dɑ˜d y!#yfvk9$΢ H PP`d0xezXt -Ǻ 4N%l5JB[|p ?-خյפfg-Mp\PJrCnǭ8߀w')/C.Sn_9ܙoӝ.:ánzzw.`nV߮{D<.6` o)̇(O/K_'S<*я2ϸʇ~Ͼ)'?Ks?)3_)?}{ρ$zz d=~/v(_7P/eCB!wCp)ay8*` khD n0,\(pC"QLT"kHE4a'Dqc'ڰ##!1@,#)rQ^GBҐ]tc (<9ь4'+gchHDFro HQF*aWDI^k\#wUz43aZaySM{`$2LdJ75s5}aJϘ8Aq<:ku|vOung=0O ࠥ>C! @=ED=Љ¢8F0 4C(A b'FM*z4/}EL? #NKP1hhP-Рu(*PT NU'^JժTLiڷt;UH*ՈgM*Z.5p]k(Nxv+L՚zU$-HO{SPĕ%aV5]7WZ@Wk&k][Һ{jeWZ&C`+Ҷm}jSԥuC%*K:Wǽ*U'w6R ʶ'mk Պz xKFVMWӋ^#۬{_wШ>r_n:4~f`"8Xp<C܁sJa _[G"O)πM@peV[ϋ݄4! Ҙδ7C͑۬&%9VО5Y^ c8JRb0t^MjCFvbY{҇1tc&DHqڧ% W]f>[}&ܯfޜkfB%MJ4Bڰ; b{z.==J*rcoQ'6j6wAn;w7>r38xh8؊󊰈h8 ؋;PĶp k PK%mUIOEBPS/img/pck_instl_mes.gifa=GIF87aϫٴμԜ|||vyqrs}z||ƴdjolmqdfh\`gTTZrx׼ּݬάдtnl݄||¬´|~|؇ꜲtimNIGܺZll܌tvuTLLRTybmlm|lr|DDEw<:<Ե_LMS<>=?dr\f|،|tlzܔ̌̄LVlܔń~Y䤲ܤt}|ԮLᏉq464Td*zd̲tTԾ.>|ƌ|ʔԘ||v_lڤﶼtr䌏\Z_⤡llԜ|tĮĦtzdjTbLVDeaa¼Ҽʴtlz\jLZ=uƗӶyӷ/>8Ǔ'{oWϾ}|ȹO٭t^xuG`xW~Rw'!lQ}`maM("Nz|( ai 4\m2b5M@8@axvx_?Pv)S;6&&3́Ǣ~hcZyxa(&8jހRb>ɣɨK2hUigFvnekJ&8~:\^|S7~O*똕&6+lujöv+k覫+(kN״'T!GWl0QKt옓D?SRs E()ӢTФ(7!PA&FY#8S%b0o\t]x -A1T%QJѽzU0F,pCEб*@) K`!b S` hUSJ>3;ERھ6SmPTo N(JPy%P׀6 NpB d\C6CpPC.D ՠ-!]:^W>]f(',P Xm' R@&, 0cV1L}Y:8iMԿV]Z^S:ә~)t2!(nyǪ@384p7:Ёg<ȅ,,Ӆ6@saxad=Ɉk^h$(k55pX(X(Y؂BNaj/,)9}mQm1pcN1;8Ё @ @T=կFC.L(c&t +K`A&hN7u 9ivc!@D]@ Zгp y嵯sa WE*k a~, $;@ N`sKA  ִ"j[ָFMjK`'0@ $h/͝Y;kql3xj冱YezT:'ɑg7C0`hU~w;p"wnnj7p s ($<OxO,bx-?l{ "8$_Xs@ WOPi 0fp'6pGao|w\ # 7DaPLJL:sw7spstFB D zsh7mH_fumA!0 t6Ån1D\eG˗}%wWj=DW0h)0< 887x/aS;{z^(}23W\̶'w[{.'pE 0\1,2jGBuP}pi6j3>({7 @q@ wp^0Fpx<3H(h_up\i!'@q88q4`w~84`X hH戄5t0 t tp0 ^PR9T M0i2$Y1!0!-f@s7vp:iyyrf1уN@yK40=57FD0}!pc?Dwbu@ I t@ 0 Д9YiP*ٕx`)Ȑ(0s߸ljXDiy`xt:19I'3X@ips`gsy`\}]40jX}I?JIP ٟYcshippy(Q3P0 SC< =@D7o P6ZkP p@B:Bb_Y*Ep4HJC @iwB[U՝P)j0ta0?6(qzPuЧ}Z @!!Gڥ] 9ss)ࠍxKEDP)Q9v*^5"Ũ!0:__NDLT?/`9 {@zTRp 02p ;Vؚ2 ,iPA! >f9S*0ig a<D FBA48.U+24LIآLԫO5jZ!Kml ziZvVq"Z|pV8@/ȱ[@ +@I˱O7` HAJ !f(+ }02;J^{r@<>K[8@kwOO  LɚU20빱tXO[[(.c0 +5O*Rj,iD}q `Ku ?<۷Uk>hw7 U N۴UN05{Xk7!~*m没&j0\ ;># <0;{; 5P#@ | 󓽊7`ؽJ+[|+% pl(ŲQԺ66P;6e6icnóP  6p`N, Řf m[w"L%\K+.E) }8)fE4wÐ1hA· f'twMD|L׫0a]lEWY]ٌ uN~^\n)ppІmxp`K0}};1a&&ubV^^d}Fl20p펞~H 0 צ޴nPDw%ן)^FqcciͲ+.X竀;@g|~vW'Hnurk[M`U R @ a_P@S@ 0 ?8)F8h~_ F !n(beNf.[Urn0iX kjipЁ 4` 0%:mnFnf#R6hɎZdkс80.@D@  `k W"݉~??=T$A ,xA\h"C&l(F d$D=fdċ$]S&_x;I \t(E/4' A e`zZ}80JeHaua#A8^eX"Tv$D`&$ff!7gwv3`$z Thp^* ApkQ+#$HAu9+^ ,*c1,a}C;cEnfl'6,h SOt+^x_ 2+rg6OdA|?'4&0 bR{AQ4pca?|? ԯ8f_;SxɄ[Ǔ<0@5u3 8_[_%3܍ B4Xr(G91Bop$ =o  lH1:z 7! `@ i XD"6TъWĢ&E. VzŭmyˌtJ^p @@ U,1]c7TAXѐ4jXF6 mlc81 fGw#!{#GAD\@/RJU\4Pі\0^×@%:τ @ӠF5 y l$F7q Tbv@)pzq'`/H O~ӟ/M/U|9`́%} (/ԣ4ÂbHF2eh3dr`ݜـ?pҧT0 < EjRÓ@ g&K# F5 Q_D}R_Ժ>6h`S# 0@VV&71 2!@"h? Uʫlf2VĨ50[$/H`àk`BX܃[UMj&`(@(PpUIjEnrowN}6hh^L1.' apfsl\$?3 Rx'=Q@ Sloؘ0}wpܙ/^0@yXx7c?G? D:/ _,a1/f\8b+HPt+9ՉF ɛ/pW. %P ǏkM}! @sՌ,8*as;e)w@/'g!/y&P7тIeZ/4i}a+n4EHyҾ@uUjK -2YQsuukPGBV w6Iɯi]뾔Z|tn- ?.r晳om.7}{\%!5k red:ywޒGyґ{UWziSNN7>vļ.p:ҭ= >wLkzڇ=cxz.7&zqٽuBw$?y!nW{_Ќ;E?w)ONy>&r;] ]l=E?|[>ؘc?{YB?3ծG~9zc?<}~|ox%W>oK3Z>4kĿXC@S@[sC ?Y 7\Wc 8=K& x 8tc׻@}ýX=[:8[!$|[S?:*jBB7P0>KqJC\RFq307<=4B6i 4jB z, C3/J8c IrĚLl7ׁDě)Rt ULSL.;*BZ]_Ə`$b4 cTedƔfhIikF¨FG{lnFizFQKřpsDGGL+GB\GSx4v|w4zt[5+PG\y ȏbH{tsdH[4H[ĤHA3;,î e;#ý3Sn6]+H9e#ɒKHHȗۖP^hy\I IF|I\It+I:ImtHBHC7`|"B(;&48'8ϳ=;BH‘`I$KJ@'6!t|l‹QH &HG:LA˔K ,?cD@{L@ ܾ $$]6h]|<L#D@1K=;LcItΓLMlĬ4*5Ͱu{5ݫʎ뒶Ol\N{B$=T<]U/9l|9^%b=gsR%/D0HiWMVDRVp-Qsd]wVuVLWxq\Ez%,|#}G؀};{؂5g"؃U؅EFve؇XJ؈؊ՙEͬwX*׎W՗%ٯؔ &DZY0cY=~$@7[ٚ }&Y MYU.JHXȤťX١کu ɭ/@| 5۳VdŻIYJxuʧ,NLI]|F_7NKd d=hBR=/4 eQS.ڢNpeV\5Ys:,e]-Le.M0ZU[aZ jUDYd&_ޢigoDk+JFCwfAWp Bqygtr/~#vxgyngn|gw~6W~.UfH6脎GVh`lfkfŇv或[hdY6YnY|u\ژhڒVZZږ^.W6]`TI}ei~46 f۶SȟjBCԕ(<Ӹ\A}C}d~dIF֥6W~^c~b-i},SkiћNcMkCc/깎^ PN^"&6Lk-, Vu}7l!* c6RS5nl<ӆFB>Tf>],f]n#jTmfQNGCj3m6[\mn/en֬Y.oFpf^o-u~oŽoWz"nnoep 7p*Wr>_ Op [ pp 'pq?# /qpO?p@qq q?qOr q$wo G*Y,o qp-p.w %q)"5_07762Gi _#qs s?s:W*޵,au+j]Njv s$qJI'{Jc UtazIgq8OOTMvjԳ,KuӪFn&:Es6un O[ƦҾ^*v&qcO kѻkW-braRƬl vn3l#6năt_I}ЀGRȃGWgwxl"ӵдkkv#~wy߶b+ifW\w[@m0M%wveF v@#n^%­V.n;+ n6U44_{BHoz{{( 7GW|,(8nヌ44؀/=!f;y{0 \eOd h Py@[ګ%c>O~ pȁw',h A -j!,  @0A7r쨱#H/,i$ʔ*Wl%̘2gҬi&Μ'2"+%JL J2Eڢ $PaDլWjD1 (!D'*͑>ȝk.޼z/_7 ªՒĊ+i1Ȝŋ̚7s&᪃ZgI Dp:dpY(M)΅JhC Nxi 8!zZ*N wz|Y&AH"R+Zʜf kp- L:kJZY`-bMz-R!uTP ˮ;pJuo/~# +0Ãfc|' Wl_[1yܐ *8 JM{^Yr2aR Lp39뼳aGqQ'E}4IQK=5R!KBx5ؠX`ָ\oHfÆ%jhu焁Ixl71Ϝ4`6n87S[~yTt%{޹\(PB&6Q5, 7lBtb[`?T~74a0+S*W7J H9ds}9䐂SLAS`y(: FÎ, pA[|Ǜ0| #( RһI ΡyRMz'U,< Q}8t˟`;Ak}T#$N|"x3*kdpk$圭@ 6-1I˰n|#'QVІs_t9*t?dZ'D1Y$D&&Rf|$0IR1H$< fƋ&;IA20ZأU%. =԰}ww@d 9H׹`vu$2Xe `x&4IJ:Y˳@kV!3ƒ4 8':өuH$6ГUP-)Pӟ0IK&2]΅Fʙ|(4kF %FQlqXR6-bh"p6At\F.~A0{7AAy0N}*T*ҩB) [*V M9ϛ57-Fi H$z$g\s׹ҕ@D"`D)v)xΧ@ ]WԘj}l)-h%dYGЂA%%dm֎8x-lҶ=!<wp6r=B ~ԡUG!bR73xllhp*䰭.DNGCE1եj9@ /~{_/{"Р1H 8tDr[܁BK*߫a!@B:"UKrR"0|O.~10!i@ `׸}prX-hQ?AD RV2dw#,d,枅a>X ?Bt=L Y]Fȗ;7K"il^6s{N::̳ƙkpTH`kf6ȗt&9v;U;V36X"s`wش|hgwЇ;qؼsI 8[|7xgAsst^<@c|Qw7Д)hAfCE2p{z>tU'_Zr5x"`NHVA%ɩ΄Uݰ_4- @\qQA\%`]5zahُ2.AAu_9 @TQA0A y Dah  ܁4ʀ D@A! aaJxf%F PT!! h 4 bNWubLHp2'y X t!A A !@ Acb @:$V2N3ބD#D(Q̟ԁb )h  ;1#?b>HX7-Y$]1%!@<ŁT@0"  A h @ @ TTHtdUvhKRHXILTKTW'&_$4MpA%`et an_&b&&br@c>&_"fl=%EXfTtQzJtݔqpQqxzjڰ&GU@!@\%|@dnq fat LtJtN'uVguJvJ@@`IB)Dg~DŽG}&i6yEyuͦL @"N` (hsN04>(F("4gxB4fezVZuJg5Yyl$9&@S@ Dd'pA@ \R )^^R\A ODN)V)bA|Cqh4`X&y}h'jMhm@l(  Aٝv~ t @Vzt@,V^*ZY UenՇYDqӈ(ZZͩ[Jʀ @`T/TV Mefl4dh6+&ReaֶlbW!H&'hiȠi}kD> @ A((H5:U#VtWX\f~%\WvmWw]FMxǘX)l Ǝkf>֜)s, 9cX_FB`kW,v؇G!U丶DUQ@_b01@Zl6ٓEYNYm-v~ͧTَڪ- @ % $ Rbdj& 0*nJ@N-ՂZeR i@c:qN.&aVp `dZvqgH@elZZI^؂@"f.N'LF'.VtnHJZ $(N2(^o"@X&./?J2G@@>/od*coSo4oB@/cp0O&072-G_O_p?.o0Mw00| K _0 0 _0 װ)00]1'1 #7 3G1/W_1go1w11111;PKŊf=a=PK%mUIOEBPS/img/tab_frm_new_page.gif"GIF87aX|ttttttt||~|Ĝ||Դδ4<$,LTLLlltt||ƌΜ֬œڼƤʬ䜲\~$Vltl\dl$$ʔҜ,$$$LLD<<4ޤTTܤT~Tz|>tN|dLrĴLnļ̴dfdtT~μ,XH*\ȰÇ#JHŋ3jȱǏ C4ɓ(S\ɲ˗0cʜI͛8sɳϟ@ JIF*]ʴӧPJJ*MVjʵׯ`Ê= `ٳhӪ]˶mNnʝKݻ3˷߿ L`ǐ#KL9˘3k̹3gNjY9ӨS h8c˞M۸s-*KNq}1j4УKN1Zq?=#q}h X1 6F(Vŀ.JbIHȁ("~0X1H#7851q aK%xK*F)exaXfZZ9_fcvih^9dGo.'&hb'ڙ|YWiY j袌 IҜjęMVdxjN)jڨe~9^j;ʪ\"lF!z':I鰙j[^Z+6KӢѢ EBꝤnx*J(+3[/[k[+!~,+n /k0osp(}7IZ ,Š,笳NbH$kClG\4@̰-7JLI,;w5M5-%,A+]|NmxL/[!7YZ㐯7ߔWnyҗϛ%O5y椗>9sK?5z[N8+:ql!o'7/|pWorw/o> "m^3Qwa`(}KS75'HA ! s l@FH(L OB4U:Hz6̡s!HijHL&:PXXX̢.z` H2hL6pH:> IBy<"F:򑐌$'GP̤&7NzR(GIR$c(SV򕰌W)Z)i^ &y)bLff:%3IjZ󚃜&6nz8INnL:yute;Iz34> E~џWܧ>(}9fѡ|(!F&B'ЁZG=Q)I%ZҒs!mhFgJSQnT miNeS=)P)SzԟERz|tH (PPn1:*N9ՠR` "ՂԪ<ժZR.IW*ֺ7*K!SԫOջôVBUk-c {UUͬfTT(U_ؗvԢ}uihֺdmET,&ZFblK2Hr:ЍtK]v.vMj #+7=zHu{K?B o׿ \`ؼ. ! BBuÍ-`X\AHpN8*"c0rX51uc7،=.2;!A a% 9;y4 er|e,&[ f19Ŭ\<7oi(6p63xfB,A tMzF!=ECёδ-iLwi?[Ӑ1+ZՇl5_ ;ժkMi`{X6S4ӽbMk\.vlI'.v+c 'D b`%"A֙rM<ܮft wK[n}@{淿m3[6=~w1qQ8'>[ߒ&8Ul?|/CrV6Pނ+L(BfM#k\cȀF[ID7MqM߷.kV'$)_:\V{ɝuj|tZ{;*c+.L ^p!!;Vy(0Fp<#4p ܵ>k隷t7ozoYf}CO7G,P 8ݽ ]ZX$ǣ3q}3ߏG~~{Sߢn~7|{7~DnQhRpS@UHpԷr5vhG@ 0ޗ/'|G~n't} xvqg7rHw87sHH߷KLE}zmH8HM'p{nO~f{%Hdf82iH{GghHmjvІ)ȅ'{kUlGm&yq4\CKQeK}(l$TnhKxH؉FxP&DPFpHc$aI(Ih8(K(]` &`֌ `(^e_ڸZ8%xe踎ॎ8%xeX_9I羅_*,9Y*N =0"9$Y&y(y=ԑ^*-P6y8::* K8GXFyHLٔHNM RYF9H*;\ٕ^``* zԐlٖ)H*tYqvu)|l闀8٘٘8PgɑCG Y+H*9&ɒ)iYɚ6py6fw4>9oI@Lڤ-HTZQ*HSj\JXJ]::G/l pʙiMH*yxٞY:zf:H x}%P"0  @ݙGʡoJ:ZJ2~ڪ Z*jzG *zZɠƊکhڣ@ڬ Ч~Қں>Z`Gʭ:jJ躭z:z:9wmگH[+H{ ۰kk PdڱOZtn !*,0;2;P6K9k{z+۲, 1;2{6:۳ZP&BKFHN T[DW+Y;J[L[ۮ"  "ɨvkLu@+)b{e{i[`Gе}뷀;{G* [.+Y[{~HKiK˶p;2&m굥{F7;|"ۼk`, 4K {G+ @拱 0۾盾l;A˹V4+˽9 ̣zJF_;;˿L ̲ ,`%lKvtr8, n@" { LNP /t Z ݻIܸ`[ۿU{j't\w5o\i)--, y×l",LlFľ S56+ F @!B S v$Ǥ%LGlTIk:ks @ٌ 5΃" <  ʜˢLʥ\3,-,|˄|h [\f\$}+TPі [Ź:l>%*LGYp;D LT0 'S|lL,=4W̾ \kxm`Gdl02^m"=όl3=r;ԠՄ,ŨOٚݻ|r{:5|%r(øMC",5mL|i<ٔ}0ӎ-/m|r9zmn F\ *,Y ޢ(;ڒϏ,÷} %ܤ{׍n$)F 8$ЛF247\ޞ\0ޘ  7; -|,>ܟLս,L<`ϰ Ї T+-mՍnl3->!,/,9&.mȈ+㖬]'n;kWM( kV2XB4rVZm݊m۟)#$+a^%X, ۴'ڹ]YdN\#ɕ/A;x PCOs ! b [Cho܋7A” P:  Y.ʧR"8:Q8cʅ[v:b͆/@).G:kl ; @~z ?,&CA"OP 1dLÞHKKJ*rqZ ;8MKbSN.%IkKdJ7C@I!O+$Ϗ 䳮j##)3LxRK-=K3N=G3$&B`U>=Yg K2U~2/|:6RSؼB:-Ioή2.SI_1PO]wmEՍ8`H؏`]F8xH?`7˜tA,OQ {eף)e_r6uOw{@%(gBHN~((RԂtKF8w9護]iP_H_ [ee)vciWװDk =DEƷjSuTCMZYí6N3ޣe`PyZW}iC oF]NW[0G}o+$l@56<  d 3_5L]yY+T'ouߝxuSvYww ``6K_bWA@*ñj8гMkZ >d|@@uŻ6H0N+] $@5v1l6_zbWt[E*Ќ'<ԸF6эoLюwģ8Gя'@{# )?{[Ȟxχf,!(@e(ߣtH'EJVr\*[9PI%-u)W2|R kW&Y )yOiX49MjlAiҞjvӛ&m~Ӝ:Nu3Ԧ9jSƘ9NBSÀLj@VBЅ2,B:Qrˡզn* nRD=:R>ԌKd"^>7?FQ@ >Ԧ7iNuSҧCՔGEjRT65UFujT:UVժʄUUvի_e&X:Vլ9YպVխ5-kk]./xBwls{[v6.a;_ַH^zWɵ,u+.&p;]"ؼno9^7pKZ 3X.rJ>1a86~gb xok_ȉec&o;>qv̢!-pCL"Xvke8xz/< 'P~3igNώ tp_ɘq[c%ٿy~_~]Nz0UZY3YȆvmjWmn$wmq&2nvw=ozwo~xU Gxp7x%>qWsxE>r'9^n(ye>s\+wK?:on뜄<zҕxZLƄz@/G3 twN*ZeȆ.uo;j=;aIr#$xW|tElA~"s}[?i xлo|UCcHM1s>$|?op=Ozw=ޓǞGm2;ƒ^ꑟ^K=I<#>$_/g?O~Nz1?Q >8˿L?>?;;;?3۾?4 2+;_#A+KAt>A:sBA0 8&$B#| *+,-.%\Bs1@(<6$0$5?3T>RC6CsC_C<=>?:,?)B4DCTEDdGD!HJ,ILD?qMLOEH Q4C,STE7LUtElWE׋YE[E]Ŝ_FR a4FT,cTFVLetFXlgFZiF\kF^mF`pq$r4sDtTudvtwxyj ;PK""PK%mUIOEBPS/img/frm_radio.gif MGIF87a',Vt|DFDDBD܄\$Vltdl䤶ܤTz$4424f,'@pH,Ȥrl:ШtJZԀvzxL.zni!|N~{~xkl[ƿ0 o*WpÇ# ŝmȱ?^,82\F(S˓/1̒4gԩ-˒]zTI(7"Th͛KgM 4ԩFfyΥ9YP\lMpSreVlZmc[QغM߼+%L١av2V+&ތisfvo鷮qӸxT3'#mrKSnz:s}9ӫm lſ(!u!&8 6 >(\DHZjy $h(,XF0( !88 /'X7` BAIyGLŁ_,YRn$t@eDq b:J9u ]%Z'w&pIUOIfK9'9ꆠctV6&6j^靎rbXz砡vfzi:^<W7ǩZŪQZJ kMd6YlJ,kشV !BV.p*ۦlkP.J6o4-ں+Lʖ7+Fav7gUJ<1noGk2G-r%ܱG1L ʚNyBQ$L7PG-QHXg}u2`bm\+Mtlvpvt9wx?zw|u߀}^w=xሇ!b/8?xMyx_9ݚow瞳 z\NЦ.sKzhÉ{`λ^cH|7G/Wo7 pp T/Ղ_">곿=?dψd?<دF@@444`7%(Bu#?r p@%P X@]` O8!'C-C/D ^_0T$pD%KB S0F+!$b-Q]؈0) E3}"F$Vp" YXH/=P$MFBt!:2Ž!LY )B,gIZڒ+^rB+1w,{Ќ4IMoȋ6Imrv)ޑ;':uL<$ P`Y D XuN``#`(p%@CQ|@gP:P2 h&Vr(/(@1m(PS$7t@Kaڀl($zUt~jG}zmK|=.zNg7O-.,hAgo$ G.$ ȀoRxR6W*ԧC  @ 0Z jFzay)-ZЃ/'I_gffxʴ %x/uTI؁xl8ayGFpZ@Іnm^]ׄGb{4?Xu(sJxĄU`~x! (88 5mmfh!H `X}be=ƇQxvXLFWG PxǸH`x |9{TW@Řٸ~J (U xH߸z8 X('1X`Px{K H yI }} (Y=R i-ɒ,鏔r49wcב:) 9ٓ'B9DYFyHJA;PKX· PK%mUIOEBPS/img/pdf_report1.gifGIF87a̜fdfddf4Μd|tvt􄞴$V>tN|llLrĴLn̴|T~,@pH,Ȥrl:ШtJZجvzx,zn|N~Bt5"/¿(ɿ""5n~5/1"m"123421 D$K0,ȰÇE\4Au jȱ#.BIɓ(Gjxq ;0cʜII"8sؙϟ~ E5/i*]ʴ)JJԫXVzQ5IK)Ԭ[jugڵ;ׅeVuӶU;X.. ˷^};Uʆ^*b@bC]K" R Z5kfnw 6*Z(FØ/Il=׫#?^xj+v&X};ص=J;Oޜ{/'"t3Խ=X` (z&zkq"Z}q݇"xh,X(2!h7"Xbv:?Y L PFIxb'Ib>XC Mi*%lf $dH؟vz)yv$wJ)蠒$$袌6裐&Z '``%\"ce}(jj#lA꫰*무z!dpuer9&KTM9F+-vje)I{Mo榫.- &o׽/SD l' 7G,Wlgw ,ѿ(<*@,,L8bsmKtZ3a B6|x'zˠ/ *rV" h# 3ڱ`̟hF<b777"IG~y!ۄ"8|728TIE°רDPr+(_JN2Te-'ZQ%+UIb(˽ɜ!4=jqٽNΒj= ;^qgIAR23!OU%(7ٷ^~r%>9IAT!X. L@)Mz sJXR'AOgzsC Q)aIKx/l$9jMIn,X|"Q>){Zo&(!Kr4&%JyҔ%V֨5dD8)ԎvLX:׶h+ԳUZXGPՁTBS ֨vL*" C- GjX.NjTt6-Sӗ֛]lHO{Ls8U$cZLʖck튶ZuyMr\ҁSKZbvf܍n x{Mz^əq퍯|K~LPwv'L [ΰ7{ GL(NW07`8αw@CHN&;P\D /X.{`< pÖ6p_LeX p>π4|4Ј@ F;ѐ'Lh4̠I{Ӡ\i y =VհK]S#x@-^~4)|LNuf;Þۀl:@l.lw;npsg޶#nmp0Ma~.wco ޶w"nm}늯Z7~~[ǶCd{8In&{/_{&fUs7#n*[:f0m<;87qǘ.wq)k\6֫>uv?~/z/Ɏȃ=Z={O㠗}?^𫗺|KWM$  (@[S2~} y/WW2y/m˷mWbvzr|8uǧc?'}v waWlgtW~qxwuwx@~gxx7{ |.|(}*{&׀?ȃq h=sG~Vtvvtj}i`!0,ho'~CgzBI0f~ cp8^|5wxbh6Z8|}*(:XfhJtw'sgrqw뗉0'wbyGg{3ȉP؄vuGo08wehW'hhrh'8Fz}V(ih`plԈxxb p(l8X`x؇{~8jgo8 ~6Ȑ9 fIyّW$Y&)cy*,c)ْ02ib/96y8e6Г>@B9DYFyHJLٔNPR9TYVyXZ\ٕ^yu`b9P9yhْflٖnreZ6xfz lygy jXq hPeۘt ii9g9IfYqɦjYٚMVlYbFtw~{ƈbp7bQWzxr17iywvv}998 GlcIdpnoH}gyW{~xi6wNI,v{wzX0omku WLJwH:ʠ8rIt;8'x‰7_q &|m'E({9p胟芻xJ88i}'rwGP(H{ZnIo(|87hmx٤Zkxw:h(Lׁjvh~:D~PSz"*K5GIx! < 1dž'݈ih j4ȩo8|H GLJZJjJ*چъժꟵ*ȁhs Jy蠥W`fз"X8zu {cux(譴J7ʢ@tgJsVڱvgЍɱ$kpͩ9~+&{똲1{8|oy᧏9;DKc;;r"yEL-*:6AM[8 ꖴh\{Xٵb۱_;f[e{jGn۵ur;t[v{xz|۷~˷aI;o{iYve[۶痖9ɹ;\}ۖiۺ7i9;8 Fil%9lى xbк,!ۂ#G\8gIKfvq/iۣGX0cڞٽK:rٲttqHx(nL%XWGϻsYhzw";V١J}iN }lmzKu6ڭ)h|*:wZ4|@z"LnTȬy-6\[C}] *۫RzvO/[Ωvwd~װz:}xXwbsds芫IwWH\e+ ͛xڻ 2J<{[lN[fs ̞MZiRL]r"lz,yX+5F'28F8L!-"n ݿxtnΖ\>ZńX;t6vty,~:㔼Do>xdlC&mc싯q岈|r<~ޛ࿘Ľ o~f n<̐~:8ʧ74؅Z:=. 8}l갦nȺPrm)%ΰ:kŶ,ŷ5H͈ͦLmEWڬЃCzl,$+"}},u L(3~{p1|~amثܿ޸jIm&cPݳS-U}.cYC4b_%_:o-oK@h~f6A$6H#LP?t&}XZ\^O؊b?vT:Plcfh/ tOc]m﹬uڥ |/ۜjl۳l9l2ڽ%NjT=3^͝9}H7Y '`͜YWtťqw ]ܫ1\?7( I܉9 h`0|Ě@@ A$*BBDUNw ^Re7UmϹVsӫ PP`pP k!! !A *JsL tT-to43ՌOuu,3ֵV9Yy9+/44 а: k1; P28ϯoSw^پt߫h.1?z t"heFBز)(鐁UInzfeQ0v`t?g`j7gt}iRiYKjiAY0Y;XL*}VF+u.{Kq֤obi=PJ_#RQf o@8ţIF&tꧪYv ˇ0W1A>~8i'~8֦r#{{M~{v۹wg9rRME-¸!*-V]ITUm^Le KUsDwSju3dsN!+vc\jY+|ngv5h-r[gs}m᝗|SW~Gv/^~%-5ޘ=EM>'6ϖ]~emuޙ}蠅袍>gG^馝~ꨥꪭ:jޚ뮽죵.^~ល[[ ?_%n)5i9EM?U_]emuߝ};PKeQPK%mUIOEBPS/img/frm_reg_att.gifGIF87a|DFDDBD܄$4μʴƴƬҼԬ424f\z*<,@pH,Ȥrl:ШtJZجvz€xL.zn|N~amhxóʓe,zύlld,kchbP;ʙF [I*_42/?-dƇ Q\E)M)C3s YM;J70yR:O5jϧEj=ϫ)KZ+GbmUv۷|bTiXu.׮R| G(sDHaara Na$*8b(w ,0(4F8樣)HƊ;))8HX>“PF)TViR,b`^%MGa&cpƩBd褜xIo駘[IJiis*(2V"iFJ%BIi9rکo*jªSZOJkzejc$" jZ :hXjb{nӚr.>;Vɭ/ o&l+F<2m[1_p  1#1bPi.l|a [lr03钚ێ<5 W.!'5PS(vEkYq ]7j gxgZ5kxu@jG.W>g/.:7n{nĪՉǎ ׎^N  o' 7 Go W gw_އ◟ _ǿ==?#¾`HL: `qWAupu`D ~:C!yB̅y3$@ޡ4CڰC2p ? 5ķPACߐEtU6D gXbvD'nqK ?Lh S|TSE5L&P-vь:1d$cHE>`&* T8d"57r}<$(7EB2psd G 2$,9DH6Q $S0S5D@YLf.?YZ1t(i2 G\N1Lj򲙥%4moҔcf9m!tq9@"5Dvȟq! Ƞ(І:D%zJJBPFQСl4CLG[R^BLJWҖPڼJ$jxB*5FS0է!j :\hW/z5c=W RoeA9$iDT{|2`צ敬k%30]]֗eC`[!7¨'L -o`/b谇d]x\)p@A1%s6sLL!dL"Y%d2l+䁲: )s0&]2Q;+Ƶ KzA6̇1Ń3l on,Kme~vy˕cXf?72fxs^B`Et%(iIL0fwNVvj.rdW^8b\}fͱL8^p3סv5 ڢS4_RCe79NbV7C/Jn;h޺8/} 81B8'Nǔ u2.ޅ"j,dCU7˯ sԜxt8y/ns9<׏ya~yQtc[MU 0*\agY7: s~G$&mhu Wok\yִz!E둏\[5,5.O]}>_+/tq;K5kOFxmWL;xzF߆uOMX/[W[Jz"?=X~IX߄}t_f OP~ ÿ Qs ~( ,@ |7cX=vd< ؁Ԁ$X&A B) +/8<"ȂZqD:13B;H It}nZa3f\'vmEǣ vgmK&zRQ- 5xvlVifK]HR_ ަl6Ik GlzMs9ih JḊl&wu w(Z&|7nn5T}ntC4`w" 'f:( z׊IKeԃxhu耼³Hx1("،28qC Y D i^j٨jȎANnH8HXLz-`LvVkKCdIbhNxNאІHVmh}|z8iIz#@8en&il(0 il-)lyvxpQiwg•vdIdb)Ch9jЖn;.tese| SxeCIx=8Py9`dc0 Pyob0 p  0 6jjU6bsLiNu 40Y9yVtW{UWfh8 О(䩟Um\ٛmPAy&9w1t *z*Ri[q׉)k̵kj*zjșGwa砻:Zi )'` pJK=Z*f]C`Rw%e 7I_-Qəy ЦlomZsRyF)4 }J \j~*@PJؙ`ک pa7y o!֗(@:zê ګvN:Uƚ[ ڬ'IjzxiZ) ʭ g Ugch{~&u[6J ym\YiZzS7v* ?D@%fNZ[e&i$ '3)eZ^ٟiXkgȉY(X,sj@uC tEmxڴ/tFDn𫞀(`\[ !jnh jжn p0 xzkg xopd0 p$@%P!![` !'p~ہ{P{ ʸ K0ۭ$&𻆹&˸}k%ϻKӫ[門;ދ[ {ϛԋu{k И ˋlK !  ,܌+","@˼ (̾̋p8 Ҹnon)m@/lkl?hkŦHj`o@i|x#h@fwg`ƒo 9U*p(ل{A|E JxE&f( 㹓j䔍LKlM7t^neɝ%:۠Ƴ x܌L}|h)v,vĠŝС1J Y,k\6<,[DJӗv<ą y\Iz~|n1[:PPsb'Ny :c t }2 =Qs,Me#]%}M!>|@<"L&ͼй[*A;) H}kӱ['LÛ2-KO>ۿ]پk e80!]a]ػ{m<[qXlה?=#\½i&+-ۡ"3\8;òMg{Fftk'r]x^ܫΝ ݧ0؀hݎ0 ݍ݌']'MjJ < F~X}Ly,Z*Nay:kʬ|<\M}=Wy'KlL, > g jy*{ܟ͵ɗ≷L٠C^ ^靁/:x^8LzL..ZhUxydM 4^z%dL~f٭ܥ]搷E.=ezx瀾>ZA&܌8;z`ӊŕ 7;Ozͮ8Yٚn!c͜Ngl9);" 6ί7+Թ9[ThuAʞ N ~hBbDZW)l@3iy>lx zin_.zZJ{(Z3^KL _F+^5쟮n0|Ƈ;\N<6偆I<)`:P_΀pZ 0= euRħ~J .xkMDxlYoq9P2`o^lrxd^듑^3? .- ꨩ隷DDI>^M칾9u Њi[wYϞΝ wm`.x~Y.N6|xU_6_a?9fMRp 2\ҍ:0C#"q&c;CdG[I& XQt93e*ys$OhPC5jN.c :@Ԩ\*UQXnʭ)P(0+*i2nV Эk.zX -ߴo3w@bŋ5|+(W|sf͛9wthѣI<̲Z2൱i׶}[kdܻyJoÉw4xr˅gztΥW~u۹w{xi'}!շw{ǧo߿  <\AzlyyP -l- 5 *<EM<U\]|emu";PKXfPK%mUIOEBPS/img/chk_rename_pg.gifVGIF87aZĬ|~|42dfdbdtvtLJL䄂ԜDBDdfdTVTD>յVsNh":Ն7nbljq8̰L~ݰa X.b : b8b`a` . G[ 0RS3C{L]ՅZjύ$z($H>^lX_5aC0gDy j0e\F_ݰ 0(j~06Xl٥b_y_6i"mu0>% 3e$P `OB!|࣍mFBVʁ c(>ZZIwl&BxQj=%@*>5 +HMh_qf8B_n+n\rXh 6 ;Zézp벚Zu Csl ) [is'\vm=)/)*>Hx' )| 2*5XOs0 L5MTCfp[ nehShog}6x=m%i^̚ecx5S1  Vl2řIk7.8g+{?x# wMwP_:hx͸clЇ~cpBOzc x=`.y# +ϵ/"(5VZ9.5A=WG 4m߳o~9*pܰnpS7hP>m coy ޸=@j /f8{QѩOůrK6ιIJ u{P@%\D:HHDc7D9No˻C7 xh <菽qW^¤+M $'ԡ F N~:Ao{π2MB34F;Š~'MiFGҘδ|KC L@C\@Cy_:ֳ4Cs;TWupd@lld0v@ k/6] @u`vk!@,m~]{[><@ dcG<w7c֡7sdϚL o {0}Z$_r\-9̓m+77pwsnԝqC|XÎc#Oy 4-v=l/nϽ.4`9ڻ.]@>@{oǞ w <xy»^80ƻї|;/>}z];G}k^5/k{kf>{k8Z>w{?&"lV}|7Zw`ygXah{WYG~m7azmǦaH}Gt,xAzzƃ8Ȁ((tg|1aF|n-Ȁ=haXmv6m'Ga_(xyWcwfHzZާCgxciz׆mwgj'pe&nug`m3x`X&mvx{o28Uz薁umx}Paքmwu}D(8p8vjh`(oXc(rĘnƨorzhaph|h(fu`2uH`(kW'@YxJuXꖎ 茹gƏ`'Hamu-֐Ɠ@9DY &FJ|6`NPR9TYVyXZGم`b9dYfyhjlٖnmٕtYuvzIix~֗9gYjv٘e)c 0 69ayٙ70 F &``陮Y^di``99雼yƉibٛIFIyǙHiԙ9yЩhbY虞Y9)뙟R Ɵ$֞9i) 9Kf p`` ɝc١éYZ:~Ex(uj$~l&p׀C j<obע7:+6 9D:bp  LO:b!96=XvHFI:H ]shjrge<ڢ>Jhzm*bP Rʧ~:"p:cyڨcX0j[ځ**o5Jevڥr ; 8کZʥFZCZcʥ~}*J`&*jqqfGF.~1*jꦘ7Ī*:ZbzZb6{c/*:d꩞&i:zn=ڭ:bگZz:w :HV믧J rʯK튭ZZ$a*ګKZDjȺ:mʦdZ9gq*Jb10 bjaΩjʭʦb者J @=Ke Xꦥ*۶t+bwX{ k @^k>֚iafiˠJ]۝IZ;[e%mzg)\dY:"ʜ++iZbK)99ۻgKb;*{{vּ#+ԛ̉˼ckZ1[gdO󛿁y<ۨ[fd\ gd i{fl|`I_g0$\&|(*,.<\/\6|8:<>@B[ڭp KlO.m|X&c>U~x΅.dpnгlp~y^Ёl蒮J>c><玾N\>+֨ꨏNꠎG>l~l븾Y&H>^~Ȟʾ/żr&>-&~&fؾ>v~~l [>^~^^c?_V;PK=3[VPK%mUIOEBPS/img/iss_assiss.gif8yGIF87a9  DBDΤTVD<>4|œtr\|~dltdfLtt$V>tN|ldLrĴLnd̴tT~섂<ҤƜl|,9׻AڳB H*\#JHŋ3'+Ï C0Ɠ(S\ɲ˗9H͛8ɳϟ@ zO+9*]Zp'ѧPJJ*J2S`ÊKZXh8[ 5u׳x˷/knpˠBݏt뷱ǐ#K  puZHb!$ f6L<sڠ[68{mȓ+_rAσ% _.v[:ٽs^nk\vMϿzy&D O9xZ@1(V=x]'$h/2b`x0@8`5EXg\w,7 ͚B]\] lpǭd݇-|߀n*ݝJq#7LTng^Nw砇䢗n騧:ܤ.N/<=@'7G/}%Щg݃?=p}觯GCY<`oLBY @c˟H H:'H @c z"FH(L W4A5u>8 @ b""FLf980K"$ q\ #QhLxD$QnT7:ȁE5}H9z#F-b|$"%HE1z,c 7N͊4e(BRLe)QJUR+Y KSڒ*eYQ}0I̗|e.ce"S<%aL\Z4/Ynz" n KR*D*_LhVeD9MXjŞ>/3IL.OleAEYlsD'+:RG;<4MJW:*vT笧Hgs(=eJPQdPRb =.Ԧ:N)P5RZ4jSJӤFQ)XCӓhM+'I p\J׺x ^`V, ^@Mb:A JTZ7< Rz hGKҚ= XЂb%7-J`A4 pwUqw΍t/ ZV.v]j o1+=zכ-{Koͯ~LN;'L [ΰ7{ GL8ĞoV0gL8αw> !Hq&;PL*KXe7 ſԖL23359m~|853=UTLByІ1]E3ѐ^#ISŖ}MeZӠEO Oj6Ϋt!eS~H:ԩ_džs]\k׊y/ր2h߹nqqo< 8NfPm;I+u}nw Mn'I52~0M7b}Ә=c[2acsjG.9$''ȳlvZS6tf" <|$6˽-=]M6Bx6_yzW&Ooj0ffG>y |=>^;[N0{nP@l +~%_Ա@$=bmY -HpIvgv0Ɓ{smx (}Z؇ƉȊA3He|D~sdSxu07tv4tns&֌DGG`ȆFg@ϸᘅ6a0xy+!|TG{F (莾ȏ:ֈHxtr8gd، bɌ 9{bَh!uy*؍QV|toh$8hs:qEIhиpW BFWJ G n`1{,|iV"7\ Syh -tɐ c1RyKy}Ym~8c8mۦ< Yf$Gpz苀I*6h_WHG z)oPp9Xib1lh )f 7b  pQtO؛a(=b9ɛi-fB6X+d8I.9ogouHxI7r5IvQyHingGqhtHhW89‹ؠUwtJn剠#m!:|{y '|y/J-/YHx/:w)im'#oNjbIJt6!燅cq$ ۲Fe XX<9qX&D|ҙ{ CpY#sJx5B⛙yPwОNj9AzX{etjmz-}ا>ƀ_mʧWxzzتj`Czy#y#SmP}*w1z0F:rHZ)~xʕ0eeګJm":c*jZzdrZƮ#gfz |s ;}G *&'+X94w5i:{Cy*h;;Hֳ8G#k@+몴R[tML;WVub`b;d[f{hjl۶np`Ak'B wy[=/p˷qC K; xK[ë?Y  n1 {  kzU몼q뼿қ ˽PO@fKK k L0 ,||Ll&< kA!@tK != C($޾d|˗Lk%b̾0\UW>JM~Od nم { 12^~~^.O@_uļ  \M8l\aD/ @j칬~s?^/ ?^}57OOnA@ J/K\RKNʠoʥ^xd˒ 젟+lˡUl }׏\.NN O~l(rNxVO꨿OЀ 8@x8؀8h(HYXyy yiI)* iI:9Jy!ɺjZZ[: ;z, (| ىhz N=>[N<{ 1ؠ'b%yu$cPq.sHbtcPBj plrM0cE s|HEnLs3|!J9\ԭ\gL"n*հWhwP@ybh\% e$TqKt9.52䐐z4Uyp軗n2KvJkZ,#%#Rƪ/Xl}fZ[[DnAT*ժ Wu\`뻷`_3AEv__(`]MW . 3;$ A e_nr_s:ax|+1VHc}Xc#icd<]m(''!!!nufR)|IIf*Yh*nrI\r䛬Yg)$~y(r`ΧN[xifʩu| j2i،*VU9t*&|kƄxl.l>Oy@Km"+8nlr xbÞbu¶ /8/hPvu K,x 0s$l*Ù }9 %m _d1w챷 ?E]S.L˯,34׬nЗNaaE6,)*m4L4Qɳ^>&m^:a)|?w/_CY*p lJp/ jp?p$, Op,l _F GC^R;dM02fD"xIJĵ)jC;5eXwEUn[bt_L` #ҨF+vh/DpyZrWnAX6*qױq8G=92HlظBj@#Ir;in'q(jl+_ Xr%+E[r%.`1]9iol̆9 %d59 69άbdؽjl; xsr6zs=~ 4@΂b/$M|!MmbpDvbp-<("E&tTJH5)J oX"4qFa]HʱH-HTҘ,͓ZNSKeURE<$:ڶŢd2:EiSΓUҒdjTohJ W(-M4֬ikje rB j^ZWu eJ&U,ºIK&TidX>HU(fFtp,\6\:Ӆ27"Ek+xfA.#eQCmqs|݌'4Z|\nmW&ho {HzƓ/tnkƗ51a4A2¦)xá7\t+( ;y ym'g+V׍ .7c3f_v1x$[ʳmeȰN7fۭ}Jg[V3TĴ5̄ƹP7攻~-L;zvYc34pY9 A+:] kS2 l -b+#ee/]2E'ݬ,]8N}U7x+_{=_nu*|y|Ư:pr;ڼk#Ͼx֩MwU7ǥ>\~ز5km@.z~aX.wbl%5N=h*c_d: n| ˴fn~L|}S8t~eGrh77Zh|gm_mlYUF}di%WC~u iyWxE˦.̇ySk-&eoMb~K94$  O6_W*,h|GEIPwxYzQՃy(.e8(gx[~†J&78r{zwN>b8O'0{AK#xyu(95g@}^(RaS,≟X-0%hh-RGThS3zzXm|WHua8@MuI1?ZveevbW9J#vP1g5V8xQc6 ȉu(:Lf3׎򳎼8;G=duXT=Pd`W)yĐL=Qd4?)YRi0$#I%i')+ɒ-/ 1)$9R6yZq 9nY0A)=ny&41{QJm[H{awυ+f]|J D)7V 8L^WYQɷsY:9_Pj7)@B}:} LDŽ0ū sJhYIwqH D9$hNǙMTRv$OPj犮ʮ) :P^7wJ1qi \\"TɕTX 9Sk[Wvuy5yyt睥%}zȰaE{ \+Y<ʬ)yZ| {s4G@7i iق*Px-UM꧑g"z7 xʢiM ⶂ q`])c\Ʌ,1}Kc^&b^HfƯ&~';)p[Fdե\AK+pQ )}QrhE걤U׸ofõ}vow{vvg֡Y;Yl O؅qHදY#F>ʚjyiwzxG%8d滭9;pD%g}6uR  _ho:eg szαvZk+Ik[K[e rn3w!{) !j2D<'VA<V{lI&{2\]FpT| ر6yI0l~felREseV}oPp[kVR^m Wp <xszƸYIlA^破ǻpGJs)qs zxYQu\ɌȇLúCw\v̏ɞȋ{{u|Y۬|VvE$ xuQIe+ k,©[&|lgk?tؠ9LdKWB{3mLuh.ۂ ψϪ^r*:f+H:qV<3MtIFw#W or\a97Ԏ[p~W ' W̦rkd`!̘.wa9;#r."ͽȬ SD*NJ4] F1ӔM>.텪 B^םS.✌kn쉎nof],n9> /ؐNΪTHn6 ;4># ./,O韎Cξ6cn63KMOQ/SOU. N@/ W6?&EGAm>^/O=kx/MZ| ~~͎+h%[!3iGd,,%oeDgO9ӄ ؿi{r˵vwaz'|.88_{oۻϝG\*X ZHk+s _ܨ4޻=WÜ WYWܯ nTIfwߠ  ǫ̇̄ ˖ݘߗ蛈 puLp†B,j,J n^GQUGRȎKi_yDGS>7Vϟ$JtТH%5F4j;RpVRTH|&z򥻬`jtֱ1r*+O\Clz)~ 9X0ת ԩ@*Z }yBRBMӨS^ͺװc Z۸s=JoܼE:jQvʳfGk 9ËOӫ_ࡶO}Ii~Ľ' zr\F]݂E LnA Gᅰ<v|l*P&"­8Q&hE%8 :U/5ф<E&9Hl$a1*9ʓR9?YyXBe6s`r)Qt33$'Ѹ "ix(g}`䧝r)`&R`Lԉ$AJe .JcH- ,h&:jc\/RNPNSW=Ys&;-[[e*+ɺn&z+s[W»@vHR뿲ᾸJkK,; Ri^gQMaqFqV˱a=񺴦jk)/+r\̬!.:ZslQ^_u3@ (L!Io*q;XMGuJJY-QͱlOim[CV$|wlb\ڋ3x)VE ?.}nڸmt4}ҺI)MrmXdSuUw;q_ɣWܵ^=ȄC+~rx̶WK>mꖣo۳/&p[LnϚA.I;&s $ f2mxn]U7!ME#ս-V+%@ b*< 7A  uh?[N%o@Tb Ha pR\ "S=h m 6VQ0u fMOCAX8>νC{#z97dBX$?awB=66ٱoT0E1R0yiTCYE(BBOww$I [֮FPfddH<&Dɜd-TfbrrK2lPLFso޸W ZV`~Ywڳ}kʒTA NX(>4B'ΰ[}Y ’°d, ULGSLc X13 uɻvv5cVdu1@%mVfm 9Wsټ\5]lZK]uF=]s eU;0uuDkފy;h\rƓ;'L ϰΰ| {iVn5 Nqh{^xYb7NJBit3umbg*UAg9xFKW '([g@>~6eXa2hQDZeSvg~S#@71KIZ].UF9}Lw:JB~NN=(yG>9 FZMԚIftP[޺7DjjTqlV0;kl7ث;;ΕmM41Bfu7Rkv &*]WÚOnйG{WYE< zəSE*Jvx`$oSsIڊ#߳ǼoWxG>\,Q]$Q+1ˑs9=LГs:E(]1OxM[k7Q:ӯӼFNhOpNxϻOOoG񐏼'O[ϼ7{GOқOWֻ5gOϽws/O;Џ/[Ͼ{OOaO۾Ͽ'x x~PyX7׀Xx'8yhy"8$X&yy!x.02X~)y+('6:<؃>h|5)7?xHJG CȂFȄTXVx>Ha88XuX`b؀Z(Rcjl~eo)-؆tXvx7x|؇~x}z8X7hz؈8x؉Vȉ8X1( 犲Xx߇؋WP xȘ' Pƨ8~x(@؍8Xx蘎긎؎8Xx؏9YhpP ِ9Yyّ ""9$Y&y(*,ْ.0294ɑ;PKW788PK%mUIOEBPS/img/pg_def_create_ico.gif GIF89a>CİƵ!,>C9H*\ȰÇ#JHŋ3jܨ@ C x ?:0IQ0a K2ܹ7! @hQ#}(ӧP Xj*jՅ"Kvlׯ`!@ڷ΢M(@܃0! -(`K^xq޶1+PP2a$k`VŜS-8 xMp„68q9hFǞ]گ' һ'W>{OyѷP{ ye w5ؠn NHa~Χ!zn !El`(,n`-(/z73X<#t(jأ2%d%dDSJd&i*VYF)MBZY"!YK'_&c.Ygrj`mfzw*٣)$荐'⥘jজv[@;PKelз PK%mUIOEBPS/img/web_name_2.gif(TGIF87aڴΜҤ֬4fdœtƜ|lԄ̜䔮ܼΤ,@pH,Ȥrl:ШtJZجvz`@@0 zn|N~|B(g hBefBffH@*\Ȱa :Hŋ{AėǏ CX`-(SrxV "cʜIIR\٬5 J4M:$jD NfUg֩UK,ͣxJUk]䢤k߿-pD!Vu!cm kMahk8d@G3QװibS:)Lɧ=wȓ+--B +ν.@90}yT&6zO?9ltÇZǀUvSa1VXfᆴ` 7!$h(,y2"4h8Ñ_=FL@,sy{~:s8N:L]ثNqFκ2.@Aly@Ҳs7:s W.~B>c1K[V;p6-ptW(5 mՐ=qmcsY> Z-bX! H`(C=b飀`gZXA ^`}hd16pH:񎉺eīY# AVFG!D2|dY)IyDE$.I“e0DI R”0e'tU(]i YrE,KZR*{d-u9M.$1wWrќfr"ygz&.9ad9éMd33yNWғ4&8IOl,')i c89h@7Y·.Tg7 Ѕ Dxde';clruH/ `A u(*o*N5efL}zєU(F-ҟ:54)HPJs)LR$w͔՚JeK)R U[2լm=k\myPP+P˷tXӢ4]ekWVը/ ػVU^?BՁJD}V#ԺS}E/ԸfӌiSMV"mmd; RVfIZQ>_*]ik[RĮ8ڼ7:.jF65GY}TVpJ}l|ZyB,DiZ7o|Yw6Mpm׋\E#Ecavt_ Gb0c{C6jvY#L"HN)\}l{@6Ǐ|SS2Efd 21+Df>FyG٦}@^R}U埥v5mO)d݆ANEYaxKT„ N#l=У7;֙v+ߐڗ]g}Qu[OcVnchW[W\\-[9+,-9}[ޖE{mZs>0 GZ=U*Tn?7Yrqߙ  `MW^k=lҸPv>^9ۙEM,}Ul.%.fUƸrM 9xINؐ5 %^No|Ζԧ݇;9o4,S}n}ڨӧI!t;UԽtGzE߲`{;NAo}Y^ke7dDEylƚg"p9eRzoZߣSe7ɵ}4V{z=!d&O|:~d_/}5W_︷!ޗvLLj-S~v<'|οݍ璚sbw^6`Pg~ H_`X׀kMNŀ vWyWPZ't&^^_&[ZVEl)mnWy2`yׂ;w]}IJuY"mn@n#]XEV\u GFmuWdxsL7r0vnv&oЖ}z*iڧn٘*ej ڗ :*yBʺڬꬽ:jp7J ؚJح]&ژZ\zة[<a%zl֢'JuXit٪|h٥arbv&zs x'oyn]5虮:!vnڑ(XYڲ̆,k9љqhxJckX [j dؤBWuIZ9U M*+dp8(f] h7J|nJt9YJxc{q$ }uIhwZAJZn5vjD]K[(Iuʠ9J=릨۶nո 5J8wpgˏˊ[+k8xu;IvJ꼐v3r(#{.f&I{ʳz: {cے+񻯨6WjǿZ|z pG> jЇ*aIPZ2)ۺ9~hڮqYjʐ IDiBjjd HhX9\ы;5kZl1z# ٽe|/ćr\\pu>fV,Y3~8vqڣEy ۦi!±fkXppKȫֆE8þw#̶則\Xq{w J- 7k6Xs,Pz:ىW(׼lʸ}eٷ I[U؛;+HL(̺lɟq3)/Ov)uʣx\ɉ<;<Ɏk |M! cf|)((͋4̢2<)벣Z%d <|lAKJfQwi)սGgiպci `b=}\Zm{giM{k͕e} cqsLh7L: a b kČ]̤1ƀO}G;RlT|"5;|,Gh֌ۃdկ^α~ճن^{9HjW]r}O9IءIً-Y "X%N3dct}^؎ ;P0Μ1 \}ӛr͛i=ϙۖ/~skĭn}>~ L T*X)Y ƻYX YNokx!ڟ [j ҭ߂MN5|5pJȃٹЁv+6j̟l^fł+cyKOVݟm_(g\*/swZ_euot**LI1Om.Ҏڜ<,k˱/ZA=Km-.ջ빞/ֿMyȟrn=[lZM-oI辺Nik>ٙg՛kxK/_o -@p*¡hT.MNg=n\RJL~_ujU&I-,+. ,qH,qq Kr(Rm 4TjN1R+ͬhPvrsWX8oP3q:U[[8\t1s[{yws:{]I]}`rZRzM/*1,`ƌ5AGM< ˜YX KQ'm-cٍVwӵBݭ0wy:z[0_ J~"p{/zk/0Y-ooj JgM|H5t &XA%ς9HIO DXC}Y YB1 iXCB!4IC&4D"EAgD&>Fx"D*BWl,"Sj`_?Oq;d8C~q n2en+H3QXS(PxE2yB$` >FMZ.2!uZB.W/~1'yUI_ðt:35lq}1'*Tʀb!!CjsS=$֟ igLjH]rS+ft0-w :o =g; Kƭ-WmMKd.|~yIA<辙8\ʏ|5~35*Iǭ{XwgX,#-*.Pmm>%IIQBU|::Ǒy.yCjGJ4^Ju3jw떦OQ:K=("' Α+}Fѕ'Fyӏµg✞LS>&Vw6vqm\_KL1D_tVHgW鐎T}ԩ%k#OHǁt4zVדPΩkh쵗feSukDA,-[RNb UyeĤU&ΏەcG[:|;2.Duoˆ3(Ѯؠ#NH$hLzL?E+Ϫœsި=i`-.כmRY2k/whSŒYY*vB> 6B)ce Yz;~li9^ miN=ˠfEȞ67/ZP)ىyfZQx(N["X\u:+|yi9 n<], RzƲ6ls>׾ݚ,[Q;v;:-|WPgthp65z_۞Kme/&t[zxKUݦwLJ[\#^}E/:o Μ6fb̏>>82\_ȱ{{L}G|/&W|?7W_7'G(}GhѸ?fhM|HuZN+| URn n/4Ͻi@,v ʘ 9gΕ6Po-n@^͢M4Tɺ4bKmnk{Gn0FjFdŤ,/-4^P/wn>P K*NnnZ cnkJqtC y.Ȱd`OLwjtnª Mnn|⍜e(J8OlE-& VЗH {hlJɞmaiͦBTj i$lQۮP@ 𯆮T5uG j@Q mr1=(*qJq y-XGIK.qBWdn +lHqJH| G*Oa6ɒ0$_hZт0R! |#_%QT2+<A"#Pz$B((M)9R*"R+c+2*R,-R-üR,--2 R.2, R//r3QR0_0%(O@|Vj:'(!Yw)~2"02rQ2dpN LӖC7S*PFF024'$䊉.B#ْKmԂrXҀA1-Jd4i4F z0p3R! 4iӰtaN4OmJN5ffb,3sP:^qnQ*fJ\:iss.j`*P0jA3TAQo 'm/ 3A;/(S5Fp3;Eo5:֓E9&Ec $XCݓJwr2h=ED%8G W:pVBNܴ" GG@co8/C*z"ɦܒdNk򭨧%7RztdL2E>3 6e.HT*4T(eubVVaKsUUy-UXXXmWC/,YYS)ZOZӄ0Tw[aY)1 d-$T%rT5\/,UOmKO4#9RTД"OT0RuZoJ{ 8+?٬@1P!RI cY.ñHi )/&)3d^ -Tōtm2c0Fd/œڈݱ8qriW v_q5qbmΑ3xjV+,XV@VJ_v93Eq3[+DԼ@RSnl2Itp[n ;1"8/#_QHw .qh)KO0q pHW@+w^/jRԼLs r1_ANrV !w'S7MO6 dTr"J9T40]5d$Wevk{{gkݗe_-917kUYwnuRE!\Hd A7`u6oqb9z+ qv}X?CXG8kO8RWQT_P\gNdoxMlwGtF|EDXB?x;2)8#8Ę8Ԙx  䘎8|X3nfׄyf ؐQ,n_%)5SC8-W.yaX'W DkoXw{ؘٗYw܂ِ @y@ YיٝY癞ٞYٟZ Z@#Z'+ڢ/3Z7;ڣ?CZGKڤOSZKz cZgkڦosZw{ڧZڨZ;PKٚ((PK%mUIOEBPS/img/frm_htemp.gifbGIF87a,Vt|DFDDBD܄$4μʴƴƬҼԬ424f,@pH,Ȥrl:ШtJZجvzxL.zn|N~~{}nhc̰ʹdba+޹fԼjF@h)\PuawǏ 鄳obɎ%!Ŏ!cʜ9f$:/ѝ2g8OI(H79ygUoHoגԌP 4ٳFu [j9|Kn˷޾ ^wh #^xs#KL˘3k̹ϠCMӡ^ͺװc˞Mkնsͻ}Nȓ+'=|УKn9سk:Ë;ӫn>˟Oϟf^ȟ !.7`(*8H{Z @dRavh≶M(Ɉ((#k*")8Oo@&˫_@}^@oL  m}+d("p7 Y# atb 8B:QxtθGIdL9Αv EAr,Y 7CFQYc !@-6Pb#-ɏM5}('WJr~,gIZ|*Cqysa1̀%K4IjZﶹgr=897qS`<:u3E,6kNcM>뉝v*i(?$ 3(鱄jơ /iш&_4 DR,)jQ`H=:T$iIs:~4NU*K~iT T2G)qj:5 N E*Q^;U2+ZAҵvm$!_zֲ*2,xE= 5+ZYL:2maISɰ0 %QZʐ5*hCnQa! yX&:)q''+?ze;su(\׻/[e_yŇZN>YYne}D8֨Ok}kϗin~}zn{ѻP>]MSƟ3m٢/Q?<Ͼ;fx؀,>>?1;7h5q _ⷍJw~.yQ2]6q@fDD"'rj~MEU:Gq&x`5ۡiKsyxgaXoVZI MHqthZ'Yya5xeV%JgJWy5rVdrV:!>-7TzZhk-Q4/.a(1ch:_j9~}np(|lX}Ut5vxWz85|؇jxlLJ\rB!KBʁc4X(Hx'biaMg"j S(s'q]O s(jBqezt1BA7c&xVšÉq6f9gw|tfg`gYcD%w8gx¸(7ȟY8 0Z雯r9A [M&CYڜoRyu6&Z *jڌɐ0KMyip:ikCp;z@-%5ii"9 SjUzX:K*뙛#`Z[$M9yhz;ʉHZmʦl3^]:Wv:}xַ|6eYliZMsV(LK;OJ|J> #?Ybz@jafJ`;ȏǏʂ I*eM؃tSqPՖZai)vUg>֍iv!ך{~舝tefg TwX {JV%wgB J("{1z4:zhچz۬mۺX˥![O ;cT,۲.A$a %P&`"p" 9۱dza?Vk "(д a@WO! !ekh@l{nPq{sw;y{6˷W{+BN 6k;%ฃ۰kKk; _`" :4N B{}KAF ۶k{N6 C{{#r$H{H;Jkˋ `!Kﻺ{dy NC \l[p+¼PI( *,N&,/%" n,l5\ <; =l?Lk II,,<<\Yp8G.,Ų Hv%KXjd BKFJ˴|,d]0U\~\q+hK‡;\{pr~KL•ҋۻ[+}̺KӏKĬ {6;LO"3= ?-&]ЫGÛ;^hj拾竾u֥[\Q=b/؎&l7<Ζͤdٜ}7MQ7-{v- ڞ[tJX nۧR!j)KHp؋źYt ۶xvs7Fer\Tgm4ރ,ǃ χܕ孒y#NQ=f]b߮ݴɨyZ ^ފ .3+FF;&nZ<&Nm8v-~1S.>ܷ=9;.=.7g?چrH~"CzPR>qfZ}@?ZXf.‹i ZX)ʩ\`)i0Y͊M̊䳩W,3su)m>Sn)L #d=:Ѝ@ݜB4EʩI묉!sK k>~Nnx>-ӎꮠnHy!LBhL@ '(',?o2>di8Ej>ZsJ*ߜCEzIj1e^L/pI?enHI2R娱Z_Mɦ_XV6X_0gjodmo6gb[_8WJ?TdϓjR.ޔtޕ_cYg9U|bO Δ/tix {.腞=>?Ƽ>ݡ#Ji `IyfӸxnɝ_wnޔՎ/` FǩԊ(y տ$Gv@ET.M2n+8AL ׁؖCzn/lvޏꌰl0`@a1RQ+1SSlӉ O nT/uv/Uh7WwwhQؒxyt9Zz@ZAۘygN3R@PC5ziRK6ujTBXU?lXcx%{mZͮun\Omֵ{oyv_ s \qb,,vrƑ)WLe͛5gbϡI[ujիYvvlٳi׶}wnݻyxpe;PK!gbPK%mUIOEBPS/img/chk_app_frm3.gif~GIF87a]\ڴΜҤ֬|j4R$$4fҬƔ޼”|||l|ʔܬ´δʼƼΤĴtļtԜt̬|ʜִ,]\ƿ5  H*\ȰÇ#JHEjfA CIɓ(S\ɲ˗0cʜI͛8sɳϜ8ـH*]ʴӧPJJfP pVׯ`ÊKٓ z۷pʝK5֮߿ È+^x1 37Lr*%[̹ϗ!TwoSyÀKb˞M۸i3!֯s N\'.μЍ$iخνdȀӫ_^xQ/|$(7uyݡp $fvJВZ,$8^8/XueDWG CxJH&$Xj$RTY)[F9%H ylYVetix)b(耄+)zj{H裐F*| Hivꕄ0t2@|!*hjsj!**uJj+ 鐞&SQH"epC@kJ>QѦDmId-ڊЖے( Ph;Ȧ/O@1'< @o&[ 3Hd1IRqS/\,vǮ,Ǵ w+6:P&33\34L=Ί!\CKoW-^ < t"l$NN]Y|xٮ!Kv=tb |wWm8x0>xx!-mn:HoCNtsۏ:{ώzG~SN0ǺM$Գ[|J+n7{׼=s>61o_0G(DBr@Dd")4LyXr<$0NZ24';iI3` 6J*N(=JR$)SJ2efaҘe05JZȌ3ychde9L"8 )oBҜJT":IHqR$j`̧>~s9\(% φ: ( ZЃ~$цv (BQԠ>LY" xHs,&H$TiN O&0 f@HMRT-p H3AjSծQjUTJjZVzQ*UZ5dzSU#;mHiO#@`md'KZ,e*'r,dҚ < 6lgKڦGp`oJؘ41b#8@#tKZؽ. J`T%}nvKVwH ]|]VmK I*6%I'N \.8;',x[IL{0Oa(N#, $\`a*CW+I*# h< F&B&c$yPsЈ4nJuZ@LjŲou\ h. zup3\֬6YxγBgyπwgЈNF;ѐ'|Vk7N{ӠG KwШNRUհIcMZzwAϺ6-b> d3fMjsjζm{6MnNWέv)~MhnwN~%NO;''+[(6bƩq(C~m{%OgNsmb^\7ǹtn:HDЅN$DŽf8KF=XϺ#9cshZO suF7NZVZ4k|v|%u?!3SvNy ^9 Ë=n S3a.|OŵSd=S579cOrsϿ3c?N|%Z !w_PwO~~Jo/~b8?~X su ؀5 HqaP,ȁ$hg2%؂6woFq4X6x8:Hp0*؃@h?D(gCXHfGL\K؄PIOTX=Sh$;Z\؅W&iƂ.H'OqEBeg&hƆm(oKDBuw&gƇ}x?1mPxQG.3vX1fXw}׉ڣA=(Q(}k/w8>W?7<~76׊}WxoHC'~~ȊxHz(zȋ苿x|ǘA7yH4ʨz(GX>|W{⸌h8(hhA<YF8ǏH}Ÿ6"ѐv/1ӍXuFc?͈A Z7$z3IXg7DYFyHɀ.A9 =ɔGOyQ SI>gWfd[ɕ5_R|4^lٖnpgwqY˒v`zٗ|~MYHcI7Ș=urf'v9QqYٚq132釚iYCQ4ћKșU5x?yIiG񘍔3 y9{9xy_0)HgW'Ĺc ɟy>͸ Z i9*k(u/'t)*+*Iy8*60Auz@JB:*70qsJJLZ5DyX 7.\^bdZyhjj٦fr:XYQuv:x*p{vEJpZzا`93i7YdqڏY5vC1yv:xje*e'2AZxي)|),YtZzJ}~i٫7h[T) BQΊk|ڒȗ-IZcB_SڬjjW6JŪ) zڕʯ=;EwCZ=Ǯ-Jګ :Jey/G4ױ(cʲb*xHaA<۳^hx@;ϊiD{4ʨH,L;B&RT[UxXZMصb;7`;6[8 g+ikkQ[t*S;`ضQYN`ǩbzZiUCKNZ9 ;Cʐ nw'ʹ£ww\ % 7Z*W뚼r++kwKgx{G[P襽 *z˽_+`JQQL"[ K}ۻ0{~ <d qǛ^ \(xl\} ±7H(_kf ̣ \&/1L35|79;= ?AܠC܃Gx})GG I Kⲛ# tIQww'ع_ UY{*2;: کj~ ǀl q$<ȝx(D̛]㛘젍|o:Q۟ʌǥ,l헬>;˙<+3Ix"+¼,L.\t٘,,s͗lLO[ro~ЖJlLPnlR>VVlX弶\~k^N0d^dp#`P0o"mrNwJ~>@ $'" an#ޜ%fltNꕾ>!pN 쒾~>..nE;ꋎ뮞Ю^N~؎r ';h^NNOڮ.n흾 un#_ F Ao gp@3_(+?I?-_/O-L^>n^HeroLa?gS_f舿}y2<Ö&|_oI-n쬾?8%1_1!n??.4KO%?O?/4s/Oo 8(HxXhبX )Yɸ *:JZjzڊ`00K;`pIy99i\li)LL 8[8Ō'<ױɔ+[9͜;{֛ѤK; mԂլ[~ ;ٴk۾;ݵS7U?<̛;=38vNĩ{>o?Q;Bɻ?g~O}z` W߀rS`L L'v2) " ^lj̑hߥX$MU8𱨜 >ȣ.^ȉth!Hȡ"x68cURi%Xdx]2cbcJF&@airH!l"&hJV)#Q"e{^"6#[jx蕄h)HeNIaɩ)ed!u^Hgs9p"!By(,Byi2ꧣܤ ,'(v,fr9*i* )'.q#jlq=k\,YȒfi&zhʼnb:n l.oɅ|Q-+,*ݲ /K#̮pK/>[I%R:0q*3. !C n&}3c 4+NQ&v|0#i-5Yi^}3-N)\ȃbJ"ḵB4ڽ֫xb kzzN7 {N{oܗwF8|i#})͓oz^?oO~柏>k?oqN/oG?Z@/, ah*.\BplW߲A'DO¬ `@NJP%0@C n< qD,$*qLl(JqT,jqT-Ћd,ψ4qll8qt6z{,#)=Jol IH;z2x8AbґT=V1Se#8>Rc0y9.2,#0a:l\WVS6aig$&1PΑ(ӉNOq7)JYyL-OoDe3HcyDhÂ2'6A͊ Ϝ֩=+T {ͧzU^I׭t,Y:vuig9}=-l ]rtno?jݩְ3ElqOԣT˚RE.XgX6wo߼Կw5R[>(xu{m2 n`{Z֎md W*r?棯qEb푸h\#L>Ol@_L"75CNx&;2Le*KXrq&P`Ñ l@bN ,LgC6*P:K D@_$! X`GJ[Ҙδ7N{ӠGR>W@հYֳ5wR6~-bN>홆ЎMj[ζn{MrNvkp6Mo ގ.~jpNp< /! 3@|*|aqQx< _7ăyY~ŕ|w2?^Εwdx` wGG:ͭH//ρ2ͷZ:nȦ|b?>vggWp[|Xw{wpW{NxhG|񭆔a_Nk^b:?Oσ1n[~G=Mc~g; vEzץW}'w߻_7~^uɇ~?|ڿO[߉k{O޷]_zG\ÿw}4pC|@B8DXFxHJL؄NPR8TXVȃ5(W\؅^`b8dXfxhl؆npr8ctxxz|؇~v80Xx؈hGXx؆(p60؉xbaU3FȊT㊨8H4H3XIx_؋)Bh(،/eŒ@HbϸH^rTM3FF>8ܘ8h9x瘎Ȏjَhy ȃ )x؏u~y' x. 0;ؒ}@7 :;8D)HF)ٔX?)/>0T) A< 9X)7)f9 _OLD )IYLȏNC Cf渎WyY Z9Id٘8gYn$m9qN|ixy )(iyi\ ^\I )oəGɔ雟9DP)H險/i)@yI9XHȉi9.9YI ]Y{y'ɑIƩ]i٠ɠԹ ٝp )ZWXhY鐭)빢iY I:z&j-J;ZRأUw@FMT蘢{PvRHHSh¥(jʅd*fz'hzk:UئQxz|HvZʍZʆzjY8:Zzڪ:Zzګ38 کȚZǺڬ:zZؚz)::jں*izb*Zoj'qjqX8ZFz}i8c)xй `ʰxsٙH * 1[)Ph7kٳ :%Kٳ=#ʃB@=F}`HC:P TLE+{ը`^m`L$䜍eYb֝x7 @Jf\l5.lؼ̘뼜M^&= ی־ 9,)+IuPd@9Ԙ \<+«Y6iܮ Bdi->Pퟴ ™88Ȗ[{nβ~kn)r~-ެywN8fɀA(zO.-ݐ0>忭 ,y|h K{뼞>* ](L~qPgys=LshMdq(U=:~y t ^J芻4?_o9 o oO ?ߩ"|%Ϧqݾ"N&"̾k1pG ݺ띭݇}=mEmIx>ۜx\YKkmݥtڣ-\q6 `Nǀ_䈿ݴpp/^ގl뙿z.?:n\Ub?܈V_ r~o˿yʏ?)ڏ -~ /ʺ@` "iD.MNUn aT4P.a9?`/Ў-QPppr2mRnsQ44q+-TM(6VvvoLhͳR4R2QTkXYP2[qyY|:Wi-IV~ N7t#b1Do}j+L&VMEKuc˿6[WdduXtrJ>91>lty11i.dϞ@V9T@G9Ը3jP[?lX2,c5kٶu[)oֵ(X{B6Y3b5|m^)7v,N_ɓ), ?:0}uʫYw`0hoN}1'qupÛ m}7o s=B'~d(Y|xɗ7}zٷ}|_3ۥ\@ -PuÐ=DY4)TViXNe\v`ibihi%jpƹ"rixIg|W 蠄j荂袌6aF*餑BJ饘fvar ꨤʤnjʪʤI$$녻a눪`B: Bb&,Jpkˆ-kmRh."*&ƻܾ#b8k,  ,0vb 7pJ,,,W(04p[n31і 57#l"-@IFC4)Lp,2eW\rd6 ^6cG\g˯~-.7sw2b ]xuS7ފ zHמ|懗2 WO>{~u'yv~||<7/}<6Om܏-'/>',py_o⿭sn}[ WNts+ނX//dhԴyiSvw;ix@t" ]Cc[&7kah5mrhE* }_|G1q{A5KCCX$HJ~h د(n5,d 6Yx`1iя!,hN&r}sqGOvt y!"g;.XD`)(NS^pD%EʞIs /?D"d# _glc0(xFȬ^$yftf6w?>4=yQ SjYsbtZH3@}hǁlشh??N.3mM7K^*OAM39Ùo()L%96u{IØKpS[Ĩ㉸JE‹K7U/2DBaH+Uu$[FZ:?2C5O{ZX%UHm[azv`UFKҚMjW֦m6+-nw[궷 .g+WS=r˨2sKiͮvńzk -xK4uMΫwF}|{ux6 YdX>;X ~ [ {nʱ~u+^&ы-7Ųm+Q6!z16Y_1a8#X2d)_NrYd6{`rUdgNh/9Y>Qɦ:9JZ39{7y%3V-.yϰ:21ysWY\eCsј L{LCҡ?MLԨԩSEհ&ԫe h/SVVQv-O*fN #<+n~L^ZFNSzٵд m/ g\28k+1>! ya-3y'.r*pvXܢ}:wYstmgt84otCkKzVi>uG9^%q\| i~P3v9ˏnIk/_{VS$ @-vGbhYQcW.jRPkj؆:# E!`xxnC1MxVu#x `^"8((`#kҊ ! p u*2`xr Xu<؋ ǘ^.!?TEHh!ӈ)!U B^p.y-kfB/13 ӏx*SuCxqRǒHθM! 2 "eR-"VI*9&>/5x:ڸ6I^i2y!Gt >0A9!gTZn5pDGT%)R )0,ySeyȏ#L`%c5岒陑*RRiI>m o6 ri=8YKkF d%`'` ("B6陎IycɕIy! ֹY9KIt GùC6VCotSV"0@%!2eڒɝ쩞 X.9Yi")rB)>O *x3t=3YU$4X !`H٢y﹞ʀ J4iaʢy6IfZ %HӤ@<؉C)@ xG{MCIjD% $CZXʡ٥)-Jgٍg*+z8i*ɒrw! ` VtHCV*% jyȩi\:*:ijښ_yڡd ` @ ë$#PT0 zZ[J*J3 Qj:[ ۊ݊X ) *CA$$*B{ ڝ˲ذ  ` d6.7k`cY_={ ד hlL۴ڈ+9*# ^d{bRz{r˃VU;[{kȩ۸[Uv{uc!v!2;<"{5b0%;[{ۻ;[5ʻۼܩ;s{jfػR"腃[{,ȩ軾$XB뽥Wx; R̶B]n pHL l!xZ^~ gZȃ艠(l3+0{ìJҋXɸ!u;՚$\"/((ryTܦfKKN-W EU\&ܶL #iTSvyMpe‘ "W$'wjś<<  0ZDiux#MV*$LPɘ H4ƹ̦{ۈR > tɛ|ʲD\X2y;\Imy|f앯ieŮ VSژ{̸AD$H6p<7)9yl*Pl\ &m̔z ?:8lTɠǣ Z:* ]!ʢ|,]τ81-/;ڣ?J4=ʠ׌T¤N R|I J ]jt $-4k2eZ z}JB5^z$T>vnq~z#k~>^~舞Ëgnu^閮瘞v.瞮];^ꮢ~;f<.[Rꊝ!\䓮ݝ<䍘Fr{^Ůn! fx *b=^X^Ұ>ʾ8Hxߥ)^/n=3!2戎-}<ˍΠ /y .PmӞztSG|_qo3Ո-EDm {&Q@ˤMgKݕB/;.Z\sYw P6fbU ϡ[gn$=MuڮOiA-r{Z==)} +ژGʹ| foYծ*_/ZZ13]Ix:=:g**칟αM/m^X]'DO=5*^ͣt(rʟz/@OS/@@:aH:G'AɔU  cT}n]/(}\nΠ+pl/MQ +"b`AB@ALuLI5vT7Wb#bqJJj1yگiiښQPX]O|| ,rRA‚3T1YXFBkRTb<8ȠDDAleM@%Fm,:voҖ5iN{XP`B E@ujTJ\(@A9o Ƀ$g&?~mzn:#lp3iXf-:,]C)18aR>Rqd` Xof͛6֒Ņ9&C(A 7r˥קߺү33;%? #L@<E4M<U\Dc]d+Uq/>̑;T Ej)Q&|(RJ&,ܒ.02̈́3\6|R䜓:<ܓ>@B =D]F}H#J-L5ݔN=E)7ERM(SU]VGMXe(a\u[yտ`b=de}?fg_q-Cnpr!0n]]td^s1[G<2mtMHA+7z `7G,p~- b yՃ;97,yĀ(K]wI_% ZvYTp@k0Mv8YzaoEh`xiC$ z Z@-Įlæn-6qGҮhۅvV%;Z]B`p$d&qQFAz\dh#(\&ms;'}Q^);Vp4 ol۝ȵ9y`"7dr! AltK<@Ή)C @2 'tCKI:X H "RBxjlʹPd="y^8wp{(Er='#Lp^h@BcWƿ+3dYRC8(k=a G-K~ `@&vDW!ԓ[L"pӠX/殍a#PSO}ԑs b@[\OxQ5ќ!ohb!aMxX:oO% 1d\,.|#8&K* 3JAΫhSQW_ѿ<gsksQ*dzQBQuQD1QlqQǂq%P^2lq_Qq`Ԍ!OQ",1hQbJ !3p1 72#dL* ,"&q Y "h6 iiGjWr[8x&/\XߊF'W${p( M9P nٌr(r-ni]dEXu~M-+;+%'&' r Mߚ߄IP1sG|.2/(9/;&0p:Flo5Ue&.(+-p+=*S)~O TJ&$h5S5ПrZ(ZB3/ 1oh8C8 9uI /PT.)"̇| <hz4m>5Mp5n<d 4dt4BO5 :U p|<;@0AOɱ0#it,m.!GrB2gqJ\4t/E3]I, !G(L𪺔WFs¬T2~s7iAS+3 ,Sq [8 2r(59gQ4Ki6P4 0SS/STm=0"n c]V5T(?f#U0 q UT338KYZ0ի6[uE.\YDǕ\g[CZ3cEHJ1]5^__x` `aVa%ab#b`+(b30Vc;8cC@VdOZz eWY>1H6kf%nV^Lgw]!WrV!u(6^$Oð"Sb߇Z#SV[EaFИf1%vjjuQS fBl&=-*W'llTөW]#)OBצm*Sp*}Mjb"VQk/ kUB,,2gshJnt)L d. 77//S$vU#m(WNRsgMm 1 z)HO :_K&3,sMQbw*{r/oV{7ZN4S3Sy42 yzb-d6y6_N$F`PP3 . 9ִ8v9}N<۞~J|$;3I^ ?IQ5|{n)x3׶=sR>?NyYz?@v̔tyT+v4JٳUo=!ªBUC'pSlԑ~At@DTJT@}/,Oܔ8 "w7jlTBqԎu/?rHSzG1HLX'%z|؁ Mmo,WLU98 )6Y-Ltw.wY*NM8&yJG|'JЪ.TSn@ ا~o |k׸Jmn55  $ 2p ԊVoԓKײR5pw48wAW #ebW:b]z?֡E6V7Y3Q֨K\@\EDzk]S]ګZdzWԚߚVUvaZzP䚮T[ M"[۱#['+۲/3[7;۳?C[GK۴O۱;PK֋m8)3)PK%mUIOEBPS/img/chk_del_prod.gifkx𰣻ËO ;LbΝ˟~csϿDqo`& 6ȁDI H`f!F8}=߈$hj!qTr1@%'<8c :'DiHtBv0PF)Nm0Ғ4I` Xj}"&l&] t>hKHpX矀ޙg8&hF !/IʑRLх (M:Kv} zQ,J0qE Fڒ +y(F+P K쭶nK*MGm+.檚&.FׂbQoۑ{0-D> ,2ijvmc2Fs,J,sŢ\oB&@*-\͗Ξ os*3,; 5F<d)qQl뤶p-7q 置2cC]xh7O7|#߁ޱl'aQۤܠ.ݝ8͊wFQL2[~zg}zooy_[^5/=!g=Ȥ@vK ?i_vsEL/췿~׬>C+lл氇=2y4[o \۶J (L W) A>0 $dw03 ^A-Om΃ DePFbEZBB %0 ` H2>F!"x:fLF!&xA z adh̤&7Nzld\` QҒj*WN2, yE.lb-)E#n0.#Ib-p `f:Ќ4 `4NILjz5Mj #Hޒ¬e.(Eu̧>` @JЂ# A ~D PrLG IsLJ_иJZҚ41OQP,F{Q!R(JԦzASJժ:yUծxѪWJֲHZֶp\J׺xU+t `KM[3:] X#KZ6-f7Yd hsњEIiSֺY|}lgmsnu pU IM:3IqKd8Avz)Eck'N|݁ytģ$T_& ;&咗{Q"Sc` }Ӈ%?.'78d40yuqRYa,&6]xӛՎ7\ %G1=_Nu;o]i6wg0x]-^TͶqlbγq63!7[<*@q:s7 Xϐ~lCZutCG:[#Mj9ʌh6%h5߼yM7.M]7J:8StmN#zqp ];ywlm کe};9wcMnv~kїOT_͇?x;ķw>{o\wֆ#;.l eHCs׬E`gp*Qsh'n!;v{tO; v~톷jf{,:'ߙ/}^s󢏽2D(CTާ l0?R1"[zb^5X d>P@ Y0% $3|~?2>P"ܠ c) 0XX Uр(:~֧}dwx0Lb.&(5f~k7d%e7Jcd0@  285x9d2H6:=h@(jRfd(yWH`}؁#dbu'1jm ,sdq8DG WL}ȀERȇX"8#wUXȅ@g(c#g33c*R+^LfpViFSi&CgSD  0(q&ȋhxxƸ؈1a@8*"H=!SV5n4f46WVhPڧׁZX8Eskfk";\WZ7(g蘐ih1izԘxY!HH8 @iوXh=c&D~*}ZKy3i5&[GAye<(i`f4a%9%)vryyhIjٖHIwyXy{З9l開yuyok)8٘i 5cfa,UXG}IL8dH|TIc1[jwaٓ dhՙh))mi~HIɘY鑓IYXo9yY)y)婙 ji)zɟB֕i ɓћ\EKy}R8ُtVmX4Zt\Ily&ڜch.h詠K:JY\ڙʡ `NڥO JLSʦZq YTʥr cVC:(y)*{+O{28Üzs~8ojv9mHڤ)yFt:gsQ 񉪌s* Zj:jͺ:lAj):i)PO 8`ZmUi:6pnj: H9  J{hX*S:9`|pxڰʠ { J ъ$k2A֙5j8ꭔh5@7O`:{9g?1oKnp$mx|۱ZMPYk ЋX[vȴa봜Ժ{Y۬%+'{,IlB W79=p8p)qDxq@4;[{ cz+# +[yڪ&;Պyu { *+}뷲W7`{:k8)`qt4rbTr|riw軀Cg g!sћy5`x2j9۫zJ1wsszg& {)|{)ܫ@wttMJ~S̅PguPY7 lKy6|8x$uEv4-gB\FFJNR\žEVŷ5Y^`bo L,m -l*aX {=9f"ւr5EM u]dד=l Wppm0t=Հ]٦=ـ׹0ӢѤ]xc}WU ۫֠Vhyk ^ݙ׹}̭1 ۺڽm#]ضγ=НĽ؍޼ݙMR=ؽԍߩv-O}zmv ~^eMت4n9n+< F>B^CK@; Q>BN9^}JNT]6.4柭]Us.Lp.mzG[c⼬r2.e*H>-Z~ >.謭sN,]#^ N} .籾xNڰNW-"n0N\TҨ|ھNn n4]RN>(o]:yeO^n\qnʎ~N]~u(_|N23"o]$NACOȽ}?OPM@ ^}G}p`boa::첝t?o~JKPM:=ѳnL؞.u"/ͥv>̟ܲ-=.̭n,nu_)Ο?W А Toɠoްղoۀ 8HXhxH)i8iy I00:Z` @JZ Z (Ky 8K\liY, \m=H}] > -^.(j: ?mN)_Ik=~wa„zs.*wuƌmh#k"G492JIHEdG$#,Wi3g&:SOC}v8} 5ԩTZ5֭\z 6رd˚=6ڵlۺ} 7ܹt릅>8ţ3~ 9ɔ:9sc͜;/9taѤc>:/' ZslմϮ;7ۺC |tpʿ.nggo~7Oz7^| F5:H!i-ug2X@ %`bx"&8(cwc!p=zAُIHJJ΋9a(dYBfn]ze ގ'OB"f Zesd*gzʦp "傍(iN!zV$"秅qj*J觩 :Y릾s^i)jΒ 볬J,y֗&譅+`kþ{-}gj[(2zd J_n|boˮ*KV+:iL& ǬKs0?q1)+,0-'rB2g|-35S-eқۊY5teD.-.F(~u)rK{)c4MWf@te e~%ȹZ:dv袧ݶ㟫M8>art丿n4_/; z!#8fbds;|ߤ97{>YCֵ7{;s' lP%X,PZPA.x?oa;Z`Pb[35f(-Z7FAY|ˠ|6h4$<1Z0 p~!l),ڡ_(]{^c`%@zՌ_XTT@Ί{qKmUTHPfެ"VS(q,톗<pgZ)=nq`ΨJUmt"ŃٮxB}pu2t#''R IJru!f/Ƥ#%iΑϤ0jlg$$sQ4gJ!,Ιt'=NQĎ8wM哔2$7O}JQ@L|u Irʬ`>9H񣭬jD-6j\eI~>aP3# ~)Įe3;K;$SQ~!=EHq𜋓FV}́ 8eBR8sk [vcXaֲ^.iZO$Vt\Q 'M>\vWU2UЮ2ʤ%(15[2fy7'SK1-k(š[W\%EnĽ&Wxۑ-4z1sEUbw"- }c&Ziݥ,+ݍ~}-zuKX޶׻u{ZvoG- h|nJQ(7Ypj Ż2Dž(ގVՠ \~e_r.eiyB4`/ hd5_q]kÞ1x1ID.񦝤uM\P_pl`|N޸91ke28!0 `4d`( @` ;6w-/ k2Ӹ p?+#>l&!+Cj5Z:X`lH왱V?fl D;ڂ"p%z@I32i-{fupS_sK%$~s&aN"d m{' u7> 33K>{g8+yr4 , ` iI/ 7Y.ʉ{sǏK17[FT>x%;`/7$i/uqN$;q>'N 0 շ޹۫nL~#Twه#z\~~xGiVk*NqRM}r^3BMgSkk!o-ogWf%*ovOE=xbyzb mXh|VFp?/@eӁW<q%i%&8TUob6t:5_YQp7zZ[]|DŽ~y(l{EYhR]6VXl@'yQ6*7 Vo^}_f]F{4ryXbWfS!5nBcwl" DLe؄o=4cS/2b6j]%>5DĘlVZf8}1Iag-\n:{HR[A X`-]kxP7efjLGjJWHEQ#Ydq21^g\l5H^7x\A5eUŋ{Zكs-a^ׇ wbavpJǒԨHETla6~42טqwXf`64)h^n"l5~Go?_PFt[3镄Dl.}b$/ Jvy喀ZveSxq&Z9\gDbb(Y?pd׈荀I\Î@9^2DvF)ROIo  鉦Iwn5I.V(roFQ3o02KBnG3ظ-%Yؖ7pye)Ȝr#wZ5gE}9S);+oUyީYN)쉝=ٞe{i}iHɅyyYɝ y鉟٠9){ITUTNwTơr8kTRe&ݔ,O:0rXzkKൊvV曍cVtT J1٢ڡyaEۘKy3sȟݩ9I%SlXwD璢fj3v,2ZL $kS [ *(W*qzZ~bm|,~L \'cL(O#Ҡޗ\/}B|#-޲̿pt-Iضٶ.3np>-'lC~FJhtӛpYgS|Ŏl]۽z{V{וKΈgp(!huHk┈YoVi\!)3[kuWy%9j6KIfNEdG-ռT,({-Ξuӟ mt-,~|R>,БEkU l V9Iت}FTyk2.@?ѩK*- ݺꢼŜ͘K]Y+ [oKxsSϐF3?֨ /?_SfUѡay%Jū,ٗ}ի oΩO[ NejNOv_>\暳MGY߰Τ5N/g؃hD Ńîдդٚڡݽ׌D  <*\Ifx LPĊfTuq#@HҟCfIWҘȖ0_V SMr7q AIo։v0c>mGqIB;F^׮0 ' d`3X@@@7{#m4"êPY, Kz&"It$9#H ЈcXdy. ? >mU'ճZc [gVk;zPNMkqΩmg/A6.ֶeúM;/̣5ް`ree'؍}F]@l2ߋWw9jeX]׈pGDxH c-損4Jjk_D E葊'ww?hT<_u=_'wNF G9)Kԓ@ENCix#NHt5yX siy(TKID9EaQӃ'dR&MKu,IX (y)s8tQ]D+IGDDge>8y1`$qHsNiJQ4Y H!hf&Rus26gyQwkPT0jdVݩW[砻,izmi ue6%ωG4{_tfT[ף[Ý0C[[9$\QxSbT:_gXe F%1i(7yfRi5-p3uOȈ}zA8[yH?@`D:e3E+bcxu} Y|U)^8y{Ŗyt(Iq*.EI(RCAeHUhi؜~Zw|0F(Hy"]k ֫\!h&hwjg0ZJj4wڅz<|*0*:gKt2J_膶wdvfJf *z:PWfrt[7CS ۮv*NؙO:i; ؝Ef^eʢ 0Zq1't?PY˩يV+jfx絠ma@hT+[I[KwY([v۷ǮElKa];W۳ 7۹;[o9{˨y[{ +&|GGɸf+0( BڶDJ>K;PKPp<k<PK%mUIOEBPS/img/pck_prinstval.gifJGIF87aĬDBDfdd̤tvtĔʴƴμĜԤ|~|ܜĴ,@pH,Ȥrl:ШtJZجvzxL~zn|N~qBwhپg`hOÇHb$u2jހ{C:Rɓ I\Pŗ0cȱ͎YԧrO= RѣHмԦǒCOJ5Ԫ+&&M'Μ0LxalXg,>(!@w__~4`k5'_M"!@b "c}WjϠ)L1)8lW] -"og~Oixb$x _1x0qZCk>@ 3(֥Hb ۍ1Flj-vnr[f{ }( b{u!( OvX!\az>z}  ٦Wt҅ y",60<^' 2X „.x>q'唧4zQiB{͐ZX't 7[م\t}ؒY# 4e'_#䙧OPFFgrBu`Dr(c0czZg 0^m # q#n{y_}ʟxJTkl:A;2@ Y, PN%eXRW /I%foGZ: zCrHpZ$*( *+,^wRn[#vkh}ihKr~Vr lo\u+pR r% HSW]8,M+ `}Qg,^i\Fk`vemxhv^/~zvcFꁿz@ QZ`}J]ye9>\tło1*UZcyw{텻 @oGK۸vE~l`Ղ#DU5Dpύօ*!0VS f;T-|8޺q(I^귱9zk&4g$ KF9*H HAL!2B"e°%&̡׀BNЂ7 XQ;Lb{ó "b)FQX 0.z1(#H,wxHG-x̣=IBR}<"Q$$!IZC%3Nz(GIRL*WV򕰌,gIZ̥.w^ 0ILV ! H2f:Ќ4IjZ̦6nz 8IrL:~^ӝ@JЂMBO"D'JъZu(F7юz >L(MJWR:0LaLfPf hB3 L@DmRԦ:u&4L @>j4:T>` X*PӤ)lO35@(@Ը5? ]zJH@ayZW:J0M6ঈOyuA*_Kt*Q5KZ=lgK"T Ҵ,_Ѐ@ܩV՛Rժ^MpCXBOZZn:w" @r/2}kZ [^6[uKShZx.0Lj`VכL#8mZ-+o`B"&1nͰgLcn81MVrkK;P荻e:mv7zV#e.7=jR{69p :exxγ[gwπRWyЈNE;ѐh#MJ[:7zfӠP+ԨNWVծ.5gMZָεw YMbNf;@6Mj[ئn{vMrv.ȺMzη~N@|;0'N[ϸ7{ GNr@ O'Wk垈w^[8ׄyNto@:&^_!T 0JӝuhC X@~ud=[ڗu3` >0`HNCf@B8DXFxB.&H如R(08VxXkN\؅^Ub8dxhxzfk׆npi򷆼q%wxq,(|ttk) {؇8sk Xpk ؈nkx Xxn(uT'wt  p(J؉ptzd7k@whg`'}xD7Wh ȋhmt(xw|EX͘4?!ypw}zygǀPxH|y ~~8ȈXzא}莒v}'xh9﨑*B~#'i:u-A/Y!~|8ɨL l"i㈀8{ yxMٕ+1B^y(!?A`hS耸r7T2ؗ@HKI=mpk٘AYI͈9Yyoujv9Yyٛix鈏Iov ~Atjny)'8Wѹ}pr?Xrɝ}ͩ8|QH8Iَjiɟiك{zCqȟIymnt`Zʃ{z%ɖ9u ֈ~:ijx@ aJ)@z@zBZIKD8H-SjC6Xፔiy}WM A Js:rj-EqʤzZ* :7' Ƈ})ZrʧGuꎕZ{کw*iU0:o978PyEqHFڤڟ ꩁʫjꦻj^ɞ7jk/9Qz ڭֈJʭ*ZZjZk*ŚZ}꧜0:Ȫ|kYw8)󉥔+JLJ+WZkJk$ {騦j9{ǰ>A]14{ 6 o:?i>P6J涴N} Wvb;d[f{hjl۶5EǵDtt;Jzp+~r;˄{K6;2׸*׉XڏkY9ǐ벚 <.$1>M^<9 >+A@~6mJI'N.VTS~,^\N[ZDNdclCt^q.}l|nkx_΁~nr^䊾yڎ}z┾nۓn钎枎͉> 톮^Q[ʪn?_m[??m_l $r{U[,\ּ-?!ĺz둤{4;a2y9+N'ˏԫMZ?DIo +Xf?[wWϣH_/@r]{GOkϼV?|Q ƺl>>?b?kLǾ&O/sw<2L/og\@PE#` MA8n]eVmu.}_i JjP*Oq2Rrr Ss3pj05UuOvH663*ju8Xv֘HpPw:ZzPԠ<\||zI>^XVשyzQY-`B 6d4u)Vxc :9]F#I1[m Mt*$"ygNtfSJȝC5ef& =jԑ=RgSjV[&Mf*KcɖGǰMͶuVךbֵ{ךzsp?'6|1|&v2RǪ>Y8rfƺth+uꨝKeOul7I5yvn&Yvn^zup˙}vө3n5:۹{7n9:w}}G^9pӎ|?[00%& =B?T 0] _q??Gb1uԐ"۱E#\F|R7$oJ՚<,EI-1.$|0692֒tN<2SL=N(>$Q0Fq2OG%iI- RA/J9LT<-UDMɳ.[#l5“XϤx#b"9}6d#W9[jMvY5\`[] ݸ7gӝd x~[|Q=m x`fIww QxrU%VV!EY_ifYgM.oڠ袍>餕^馝~ꨥꪭ묵޺jlT8<>^~垛ޛp ?_\-5ߜ=?EM?E]]esiuߝwm_}%襟ꭿߞ?__(ߟ X@ T@>)XA ^pA;PKm;OJPK%mUIOEBPS/img/drill_selcol1.gif^GIF87aDBDܼ̼씒, dihlp,tmxspH,Ȥrl:ШtJZLvzxLjzn3|NŦEȓ̾SDϿڽܮ⩫p/50Sh^ mmܹ".|ӯbƊ=(qCx <i5#W#O,jN5s:uvF"ŕBV'>:ʲXNH. LXʴUc]1yvϚ  +ԘȒ%vWޛ4r_ ƒx/z6jDZnp *r-qk\_py3TΝ7NzRkνËOyRΫ_ϾW;Ͽ(7 6F(gPv ($h(v(@Qd0(4h%0@)DiH&Lc>r0TNieX^e\ne`~)fdifhfl^$btix&&.J矀*蠄zDh袌s6*餔Vj锏~*䨤NꑡzjZꪅfD~Z+J+;$jϦ,^z(lD꩐~&-*6jܪۮK-n . 벻lZ+?(NJþF<)IJ"\/&1jL'&-2)K s̒rD$W20 4C-- eoWkȆ<%KXRjDz7 u*EFsg3H8t@S Nc_&t;pA')G_x%.qk #E1qV"h6 )HGbqut#(I+B(iIRߴ(;_R]LktAQ^Ja&'Li`3+@omH ׿jN{!b>R]w7=i]0 n^eAL8)(s΃ANyΎ,kT":놯XVgg$=I(I ׸w_1h73RqyЍRte#]A>Ot2>QPR(J85K8N*zq"IJ'Q#Ztn\&TyK׍'Fmu[~*y~m)G)׺jw\BN*WzՂΊVj%8k@ҕtdk1Zhҕ| cC,q<+涃lHUu5-U!MT{T"ML+!KE,oś^׏]j{I֫{_&Ɨ[{L:w  pxkL +,S @ "@Z?EzGp"[vRS(մ]Yf{ζ!Xf*\rF5Hu`B*`tW'mr=ձշcmOu,kj٦Ofw4G:@&  RohRWze}ꬆAZq䅦.iG?dži۟Q F; D/{F!#pM6f}<>j'@@}O\HqO?߸CH@{(Q'=})V2O?SdYyoبso7W'fO'vft5t*"g(zBWwpfiiH XpW8ԂĀ4g.H{u7&xCr78_.Xg1udKjwă=?7(p7fMO EMxU8hI؂YX8g#rPfup@$VQh6bdwu$>ww_'f(q(>HL(NT}y|؈H~舜؉|95ySJww_(A؇艐yN'w2K~dXwM$e#=*hXp'xfj!⦌϶h,(V2(k3XKb8zxdE84CUE=hcH{Ĩ]sP@ng`Ȇ8VtCeI̘Xc){ fImvLjXuy]8yz,"aȈ|/ia1i3 {5a7I_Aܘ~;ɓX8ՓYxH^JلLٔ=R ^TAW`YVٕ b Hd99mgEyfٖrIGiYk tw9tىvٗm(ևhȘz(Ii29} `ݨDWl#|)s9K5l:ɚxə8ICWX&@yp-|  ZƖI·-) @z|҉Y,%$I?טDIo"A|e&0 @$)ٟiD\'P Aқ9 ^VvP0@қ퉡*C 2j" x"|ީ'C)~} GY@tHC7;'B: ]a)AڤZYuۇGVzIFi~ǕabOZ Znp m:jBIIxJz|*j-D~Y8L}ڨjG U'{-9.驒ʨڙJWeyj_ꧢZ:{ C ߹jʩ*@I:O@z 5$Jt*JzO[jl z-: *Jhڪۘ 쪮{-z{*ڬ۰DrhK:+ [*['ޘ&#{}*-[+K3! )[13[: xJ k,{zL ( /k=紅L{W Z[\[^kd{bm;P{qx!z۷~ɮt *"{j{0k۹x[ tj@[0[ ;DK{˹ɻk;{{k ٻ <;[{蛾k!;PK?c^PK%mUIOEBPS/img/o_brws_oehr.gif;GIF87aĬ̄DBD<<δ||μƬĄllҼ¤ʬ424|~|ܼ䴶Ĥܤ|||ttԔlnldnd\j\LNLĜœּԄtt||ttdvd\f\|z|trtTZTtztdzdlllrl\b\dfdttdrdlldjdljlll||̼LJLdbdtvt,ǻ HAp*\ȰCJ(!ŋ3j0"Ǐ-IɓXɲ˗0cʜI͛8sDOɟ@ YH*]ʴӧPJJըx9ׯ`mvٳhӪ]˶۷pʝ떀ݻx3߿<0`f`Fb1-Ď/+8`†xY#3V ЇeV۸s뾝Q[ ^ ė0 @BcgWKp癷PݟGx.:tFlwϿ?۬yHoZq 0SӽYxBc_ @ i65|3&F8ܗ0(c\ }%p``7@}F{ J0sKB#t@0 Xd=1?.pefZchjh]8~]bwIcj5,6@n8*dqRV4/Uj]3f)Wrj䜎Rs| Yb$Y{&kpa"eoi˟6ρ6Kғꇋ@u Yh2#B'F:i4K&a_[~YU#w)QHIE'fE+ޚ3+hk ["kٍ{0dɁa6Zs؂6343|C?ӣv'4KS,Xʄ>,CfDgzڹw 1k feOS%'VrY~OcWnwyToC娧f#s9❷ɣGr?O8ɉgn0*2pBBIOY/soyD/Do\Va HL:'H Ztњ6z GA~(L W>.~z"8!3?@@ Hija&:yGDbHH*ZK .z` H2hLD,ptx̣s8=~ώxL$] bml&7I0-#@!@B pf\$*w^l9J(Z/b'8 0( ,A [(Az].L$0"(@*PiS-)@l L!B$Mux (Ǚ  NЁt-)3P*TT@.ю:h T04QYRp :9``a]ԍeĤ{٦@mph@7@KR AUjزT@@~**PT܀57>xXwԣ^E \ڟ&իA*Qق 4nY0R6cGPYRP"0 DHBlPӛnt7>TOGU:<,Rꖸr*DmATbZV-;hpt-\b; 7}^ .rI #Nh"X@!$-i:X +Xٚ$ L B.2 xT JW"`jm `^qkpUC]j6*['܀ eT/U9PaH®en[>+b1f? T 6=mB>@5.mZBV0Ce uWq"eE+!Ky .Hf* ?+WY8J+\Ła4Jy!(>`&U܌j Ze-z ز\ ׼W c qIT_׵n{ZPZmXϺر- Vfp_8.v2Yu馫 1}9nAljpXouMzz@PRtrwE@ >@@U؛W0i Yx=Ƕ~~l_xv1TLl oe\uwN~|CW22hwYݞض?܉t=-tg[(! $x:e<X$)!@iZ tf+&w~f`}^Z/8P+f{VɎۋ՗>"W{cǵ->fis?|=`#GGp r"IP KprL EMO&z6,/6S%[W?e%XtS}gtJT,x7PkFjEpņ\ǥXeͧM9xu7guw%UFXnY7tK'؄{&|fa`[Hfjwd ),l?r 2OBC@EgYebsFiwC'%pip`jXTGіkSp 'g ZZʼna=puYl[le g[_uTFqGDHsG\~F\to_XU|K~`PuTnj%(epQk'T8T~FPmXMpP3i,G4("4U6׈RftV}|XxxcGn&]i=YfZ\ff y9gVxVUUfb#Y T:V.&nŐ |51ّr!VET߇:n=9qD9U;TGIb!ƓqVƒe-yw5NQ"4tY&3N-vDC{i,^j})#gfw9Ejt)FIR4s)QTq(p G9 QmyF) AlҹYVԜΙйٝiQS$y虞깞ٞ9YyIĉ:Zz Ȱ ڠ Ѱ9Y d8 JIzoq **N7ܒ1"* &+T0$~3 5: 7 )HG<7$A Cj8TI}z P f;B`'Z WAwzΰ/SJ#j !jढ़j*ꫢZ0-:ϺJ㚬J j $h@π @`Z3Ԁ&~ {[0Ҁp ["jĮJ)_ ~ #P ) бp,{" z!P) A DKzp3EC[({!{KKSk+ZbE+3˦Ӭ бBN0 %@2˸j"`1۳Z2%[;紳 K;[̀ +"K~[; ˻+˶^۲Ͱϰ+{ { ;z+ ʐ<\| V &`;k O{;l(<[>{cK"L¡ ;•f&̸-.L-kY{%,-{FlO@< [)QK [Q]L`˼\\±۸s\b d̾LN<VP\ƩȺu5 rDJ;gɊśLʈH"Cɠ\&^Ğ|:LǢlˤfl:Ťm{LſLUʷ̟ḽϜ=l|N4\‰<ˌȍ ΒL*l߫L߬ ^ϵl.Ll[&PK?klа ׼ϋG ]& Xơ<$M Zpa}$'@ B K+Er, ;EM/ЊADkp]^JM# ЌlF-i:/mXx!w}K R}j=np C-t]]msk5 8} ~ )\R۶h⻻ {mX+Z} Mͼ ;eѺK }$׺} kܴʍ&` ۖ;];ȝѶ]ѽKݍ ]o8oaA]ǜ ?Zz607/Z^'2nS.tsn~ ܳ* |0n5o"jѠ;@>u:C~H-')N27>UY, <M>bnKH^BQl1zԪ68n!#jzk>zcOtި~@4ΪLn/oL'BnprΗ.NEGa>D>j"n낎#Q~K4:~nNfN߮[~lA4Ү=뵎{37LϞNӢ P 1D1(ABD)_YA& _ "z8:<> B?D_FH*?P:u; Z\^`b?d_fhjlnpr?l?0ӰWO|~?_Ovxo Vl?__T?zk?_O{?]?67INvB._pʿpoo﹞_^oo^/@U?yaPgmh]Ym 8H`pQX 8I01H٩@a :* +@kښ;[[ ܻ{,@=-]M{Y.?ѐA_OOU8? Ӈp:a80c=8(T] 8 I[*FW1Z4[D 峝<{4ly; % 0BBP6`jABG fhU &<VhAr#߱%#9lԌD%3׭^,+0Y4a3tB(ңJ .@ԍCf@/0X,$ĥ'ˀrW9E@5~5^i"@ &R~ bYh :`f!хTw ` 8XO@| 8o$ p@gB27$p w t= 2U71mMw|E}YA|WL6h6$I>iZ@czɦ|Z&l!kr>mɣA*TN*IJ 0{6J0R9oZ=CxҒAVtӀu#Ez5E,r\JOgU1EP72)ˆl;Y\#ߏ.3 p,No Ԟ?/ .7 ?p$, Op,l g.L4 oC)l*ec ,jq\0qd,ψ4qllG5t#3x !1T@ r,!D*rldhHJrQ 4Ijr'Ox%Qrl%'C}HkarU)jWTDJ*d*sceU `B t7K 颚,e4fs,'O`OmSU촦sc@s&8a|sDg<}]6ITK*/c ] %csMw"%嗪҉yI'DWsJ{;+{R6sZ2'iNw'C_I<9TU:Y*NKM>sTSwRZb5jYZ0UQ-3M:)e*\GNU&: yҵ,eOJStF(>V%{]kt?gRVLlJZªI LYI&t`ZӦqJZW%Zf̾iBWwviҚzj*[wǍR+^WM:JظUEtג}_ʛޒzSrvSٯF5pt 6'{fG,Բwa,fJ`4^5s]3鄁K*%҉IBaDQ'Klt,ky\zMI%|`H ^q 8Or㗗:yʤ3{0τ.'lhyɃNDDCz{sLkzӜ? PzԤ.OTzլn_ Xz՚JoJcʂqM` \d+{n hKjp]V I:$(ͽe7w!Myz[%vm<{69ݖN0 ~K|FmXT\ն~q]o ~(OgŽ=v"r2Xr|'+47q\9cNӝ^kl:ԡYô2r'qc8m9_ڜ a x')Oga{ֹvX e<.$ݮV}^1;t3{v^'Md3^7˷-.Gꆗ<(z='͜m6}a!5O@owy\B7 y ͏˿C_V=뇞_}|c]m]5~xO;h Ȁ (Hf~^CiWos6Vj*^xMv4rMr4GL]vL<ڨjq2%pjw|gW&NX:ݚͺae  WúnLqڣ_n DQrzP+`Ĩf +KkVmIExyL˱u]gwmuTC t+˲Y[Je S. 5 Tfby<7 ,; OK07;GǨ0K:P˵&6IU< M]!PU{LYsRwy#ԶH;i jK:bJEɛGzzZNk}˲kɪR{xZJfqqt+˂d{q{\Lis~ktJPJdqkpꪧ_* 'VK>;ѧpOZNǪI'GŻ˚ͷzY*UP:]{c83J`kc܂Lq$\/g{cke ԃW޺k:fg봵b%hy*lɩŽw٫O 'e gkQ+d7f5_;}I,[ūQf @U:lMAPJ>*q| C\RL* '\ +ur]_ Ȁ WeqzƗțʗI{tLʥlʧʨEs\+˳L˵lɱțǹzʤQ ̒^,Ō ьeĂ) LǬw &\ wG}ț @(PRL#; tyt۬rTeuM+fʹ/<Z|/]@ N'CzKp \r۞є⪛JI6uy^'ٕpjg+d*ȉ|뚂|P) ۤj$?=owef )}Ł w% ')ȸt ӉpAz_ܺ~=gF}҉{lm-Tmzvodu7K{ϻYY<=-LJ-פ)?էժQ Ӥw=žkڥ|]_%[ܘ-IaCzGڦ[CFϹݷB&:Ӟ}Vf{H|Iͽ\ VM]ZMhL><| 2 eKng9lIν^m--޵\:N&ⓛ͖i79;)wvCNEnG.H,KMB-N/+~R>AXPέ^TnV>dޭ?r\>j ɞy&۸il=Fj|o3k46|GZԆ.ڒPutZUĽܢ_dUЍm`ժvIÝMH<|?T`JZIǠ=н%ڷ}ʮ2\9MԷTD"]ˈN}*{eNNθ5o}\Mkꐞ|vwZ x߫qt=>JgR ]Su>>u1}]lr)0܆癜U*$V|vs'wN &lvFt vCt?Oq]歹syUP?qR\oeoҜa/q/sOu/kmooH}Oxozk/oEOЌW_ <ڕbђG\1ދ.^fB꼛*p:bOn3]OGqNGnBͿ?IďgTxd5hŠuWS_/sy ŅѢ޺㨵޽붻8}{-$qQ8I䇬Eϲ)vc5=ltD~%}P0u)<“8s*H@ UT"8zsWI\2j,%酀\b_3 g8`jrQvmVpvMb. ,D"`u5R(<@)DiH&L6PF)T6шQm(`)dihlpy%CZ(t^5ZgAm'ޘ&h11dkxSFXTA\R劋*j"&TuǚS7<6 ꨸a~:Yv3ζXk]qF"&f~^z!i{U&CWnx覫Z똪XU{l^%ܦ[/R.X9ʗ~l5AzJJgf,DcΙ)r0Ɗr_9m9*FMuw1&6V>JGf-̀ca#tr1dgV;ҧ/<%-Ϋ^قŶn{V0eUXu߰{u9U(NŘ&/§}y@]8yPڙԮuoX Ř#GWog?^j2k4q-/CBtJЇSq3ma)?N&5 PW;?Xs)L L܄3X 2 \7};YWB { !)U*0`GֳM[oqt:$^ 4L2ө}JX̢.z` Įm j G3Zq:(Nx̣> d>-gyK2birw0LuŽ&G+"MD:K .U`w:)ғ.))LїfHيOh?5e3u*̙X]w\j$֛dKSiW Ir㐞KI*8Ur9%֑ul.Ol*`qԔ*cDauX][gF\z&CV"5i{eV2bUk!龩uA 7U!jVZr% kxNU muw׉]rhנg)[vۖ) .4OPj `{ƳkaJ #QjZO)~_GNpˊv8NaMY7408cŵE|;Y~%C`确p}'d[&vs1*2놖=jeWd,ҵSlDV4P8>πMh+X|WꂨKin&c;/(y6?%N{ӠGMjz̤TQ-U:0}f5igpS.q7oy}D_#Jë~Xbr=ё.@7[~,Yr؋x:}2y=k,EOvg33Qԧ0(4k#qD|׀qjQjb']'e)Ʒ~Ƿ WKlHW@W}}47glQ—0<6(378L{t2@L؄NP}'KUjVxXZ4сuwGf8Hi3Xj(c!腛prItX'X ׇ~ՓzX~wC8bW=pO>^`xl@fyIYw{҈V>h 7d\|V=6(sYwY5hN16x:EVaxSWu'EoշxB;_Gxga‘H}edȍku}}h%g.pxS%BeG ؍v~0wa'\&DHB.I:^O c{47eKq-{J yǒ|g4ZQy5+jcp #f_O{'kX8$ؕF$13gb^I 6ԙ)n^$YmA9?{ahp9 ԗ`_֜dyA98Vta Aٝ&8_-aY_ }"^"%ZMGH 9V@YtBmGa'IBZ`4v-(/(Ya98qaؠpF sp{IjƖ/*uA[Z֎ʣP?(AʢO"%n77exLjEix2@VJ3gjmTZ_k 4tI|H|ڧ yCv *MA:@ڨ:A?zo*6\Q=yy~.Ta4M':EDBF炻x7fR:YXfCFg}s5(i)jsyc#:htẆxX꺮ʮ+:Zzگ;[{  ;[{۱ ";$[&{(*,۲.k;PKJO f;;PK%mUIOEBPS/img/frm_edit_all.gif1 GIF87aynĬ|~|줦dfdܬttllμʼļμԔƴƼtztdnd´ܜ̄Ԝ||Č,ynı׽ 2.,--'/=!%:: 8PG R,D{BRIHq NȐG? BT-&*IJQo Bś8sZⓉ L4h~ܥ[1ሔZ|)P1g ׯq!ćBXKB-[Zx℻sQ{%L8$IdAI _@_.6`ϛ;W?=p7V߰);h8p@߻28219x2 V'=۞` CnS@a_嬨!1$ǑNۗ- '~VZyrwtwl84(S&ST{v Aq2<0F!%~ֱ@m-Œ3X`vba݆vA L~@Ca 2Zph-<v\7#(;VYd䀒M^!1@}MVdaBF& Mq馐~85DAPq-Ȱ\:e-h a謳Nf.HakeZL 5P)~ՀC y CeߊqHq}+ۣLJkqyE^5 :C:Bz{ VV^9`~Bҫ1NU0(*p %nl͡4PdxB@ .h`Cݞ< P0TS@!г 3u4X5HwY4=.Vsto5.8p@OO7qrW\,=sDu'ݨ(U (h0 )ʷNCd938כOx鬯wҬ셽3N8ܳό/죜>7'[=4;o}=ʓ22_=6}2o4'LLO ׏_/?à_nL`0"PcZˠ(8 "R8F*@ (L 0ܠ+:8̡BCTL`* ?aR{(&:Pl(hXCT`)~ȑ1'20"8p%pc_8*;E C! HPOpe$0q( (bF{G)G)Vnn|l1H@"D,IM&!pZ2D1a@"('J86I)¼?vMlv',@` $'n Q oj yN?4B.!Q9DfRQMfDt%c5_  ؔiGsA{J@@)>tةM)lƔV)(nSs6/թ=G4T DJơPTkPdz5Gy'T"JQy<~u`W mb;Y>.H٭rL,dEų. DV؀]K`o!JuDvS0Vhe9"]UFVѭlrK x (V>)Cj,8|!->[i֯ͯ4XOddVi>/s#{S<t*u[Tt&FS$E(P(p04]OTrFכ!v:ܛ+?MDvD$t|бz,ί~a[ʘXJ&caA,sY$m&S: <ާe>πh63-}{/׹*^LJ ђδ+(mihYӠ_GMVP1ԆWO85g!R;؞6]lR(ى^~MmX:uPmmg[fvqo[q^v-Mn['CI3柯wo;6.|g&T66lTt?PԧNS5ַ. sv:n :Ncf ˝}F6t7{p3;Wop_#|޷aNz˻1mo~۩]կ=]>5_4 PyK6|o|ἯK/_я)[ݛ 'Ox~6{FsΧtӣy&އqw rzWsFtgg|x}ݧs'h{wxr l>>7{oǧwvv7v@VWFxHJhAh C؄[PtR8VVkX\hmu_bjxWt>(hl=xW>}Axg?x|z' h?ǁCy6|wzw}5p38v3i;yx> p/XwgzH ~؃zȃt&48nXg}-w7c~Ӂ8rG;oH(ȋ|؋+ ht8˗'"HHp5xwyx;|~s})hȐ7xm288:HtЗ!؉evR&y(*u#i dؒ0ih2976<ٓ>@B9D ;PK)u6 1 PK%mUIOEBPS/img/pck_inst_edit.gif:=GIF87an̤̔μƬ¬Դƴܴʴ´ܼʼ䴾ҼƼ|~|伺tvt̔Ĝ̄|$V>tN|ldLrĴLnļ̴dfdtT~̤μČ܌dd\\ttԬ䤦llll||촲,n%x#ͼޡp.`ow`}H*T 3#JHŋ3jx15 5\&ɓ(S\ɲ˗/r͛8sɳQ09 Jш+(ӧPtիXjݚGÊ[ 86ʶ[hrKݻZ㬨蠯-/Y=!Q7* =@JC-SNcI:Mi[&𕨸hkŭ-V C&ܔDs緽M9O+_μHlYM엵_ڰŗ=1NCw_IH )?9p$9!H^ ԥY'"4Df6裓 F=)BX$B${Ve*1KB*무2:UʩND[v:njQUQe"_*m:TfεFuJiQxFQa ,v1l"lhphcKg q 0[(Y, e,B8ϖ4LgJӚ5ͩNwӾ `p7u!"&©j!R~E1:`ͩ_ºS 7YֶB%jJRX6w]^;uD7Es}bЋ:c% Zuf/ע\,iGPV=(jQkP֖Ե!u@B"&Sx(D#Ql p/KYWr\vvOXU9nλbۻWMEk~68xYSԾ4]+} տh)K` uD,=kY䢷%a[X6 Qusxp׼C^GLb.15aoLcǃMs’ȯ3o+܀LVuz;NA r}// ;R~Le~YLfo e*SOfse2\̀9d.̀ yk?9YyٙiAB C0:֗ٚ)iDIz)c<5P6`JٜbG;@49٘ٝ‰Hx~-:PcȩɞyiGy=韶0P繠6#`:ZJ3wQ4U3Z&z(*ڢ-zڡ9 +z8< YڡY1 "P zHJ* p0@?TZVzԤ0+ ,b:dZ[*,dpr:΃P&p(8|ڧ~:Zz~CQ:Zzک:Zzڪ:Zzګ:ZzȚʺڬ:Zzؚںڭ:Zz蚮꺮ڮ:Zzگ[; ;@;K0k+۰"&;! %{,;)-);408{:;5z>[۳H@+N+k6(K2{iVkh3[[[۴O[SK(j ol nckxh p{6}T[~L[Ky;Rk|˷ 빎 {]۸~i;K;;nY+˹;.ۺ뻝KK;:ʫ+*۸Ћ뼿ۼK{ ̻V۾{۽[ዾD+ܶ ۿ 5;LlG |-SK  (1 ۵,0)\6|8:<>@B@B=D]F}HJLNPR=T]V}XZQ-%p҉P=l]\pr=t]v}xz|v`mӌ`hjln׎ْؐ=ٔ]ٖ}٘؁b͇}]3 mI7Ֆ۲=۴]۶}۸ۺۼ۾=]}ȝʽ=]ܜٟ}.Mڥ؃=ޫս=]}}ݸm}|N्l M~і} "X%߅P]ޝ 0 >P@88=}<=~HJLNPR>T^V~XZ\^`b>d^f~hj Y,26zFPz7g@舞芾>^~阞难>^~ꨞꪾؖ5(N\.n P5~~>Ȟʾ>^־ ֱ>Lj15p;^ǎ.>^~˞=c0~^뿞>>_'j=0.6n`.02?4_68:<>@B?D_FHJLNPRm@)+S_fhjlnpr?k/|xYx~^UU?_?_x{ON?)/܌ʄ?_ȟ?f #]lʹʯ γ\˷<?_ϼ]?/ݏ 8HXhxȘXP@)9))  i z0:`z`i)Hh{ ,4)hɎP K>`f. yСDWR@N$0U^UE'kFQcS<֠M+2nIʊ.;[t ?; XSWY}A-dMJȕk+~$]iНo䨚[e~7&^tڵӿ2xW~oƝHygYäݥ!2w= 1ŌC~N\esW|oof]q( glYz4p-(`v tr5H!MUnש[@cViw"8"_B6#?-eAM~ :N7o>eb+$va\ډ`,Vt#o83.h&x™ܘС8dS5GSQUĒՔ^ꢙ ny)(mb珦ѩyc#:昬Jk~RP~ #{"+뮠>JmN*~sP_fmhᴁZ:{jm^GeaY8l`/F )+溪Fgmmȓ ԍ&uJ@G͌q}sw ҭ9Jsϱ@ryT47-JyX7rU]JJ  6/tT^ r?:@vߍwPʦWK^rX4 _873GNy{#'KbZebR3[MN{߾9G~sO||ܞy$?fr.:_}o}cP/b>DqqlluE-b؜* |x8v4_(E)Ka{  HQ|SXr%R+C% P}%yBCRԌGrqS:+"m ` sԝ. )Fpl3yKz䣣*{Lhjs$^1wd:S9ωNj}S|\!(#=1󝼌9Di|GNLc$L Un,tVʰ8OuT.HT~T#d8]ATִfE%MUn&1SR=j_pԟHj$V`c[F \P)',d? Z|^u3!R҇tm]O65- moVS(p pl.Y= wniZfԭn[Q*w]F7wϋڅ%o ~lt6.w -6zRt`<;kw! Mjc)FkupkJYyg9fkEXmʚ7zx[۫˞1-a5g"~uY%1ʉT JuM1"f+ګnkUnܮ^jY⑎b1:1VM֙\̈́/)Bifd#ehb~SP*w=Rt?MAib5vaa[ZX]373NMc( Լv\:ս.v<~]35|hpNv-ﲟ^#p?p Fō6{v߽u]k{iY C{e|5 xZŮǃ$nOҐsuu$_hSeYnW|uH:$An}>cvL:Ls[}Թ;{=Uvz}錻wt53H&h8ϟ~n{Y{-}g\ކOOk[s󥍳;TqZmڬ>_WO~ol]'r8GEq6\&f/ƀܧ6 $h8jXȁ $%'"!#,/؂E+Gg^ԡ:w1>8@h~?EGMȄO~DQhVXX}@fEN:BahyWhXgmj(ebnlXyxsh!}(vH{~ȇx8h8XhhuѵhB48H(HxhXȊ8X\7xs9iv}fXvQ7.qrΈӅ(7[Eh'=haFZ|JX<(H;hHyҘo1(N8mOg _[ J^H8%[cc.6)uWaaǠ8* n9 %`Ȉx/<'|a7!"i}Vr6m+g“"ƨ 8/GB%;7'[bf25WgcuEDӕqHc.v:+Q#"+v:4W#QIUc0#Xɗ,bRc&6*kUո3za3,J6'`f#S/&aeW(h0Kf4,u0"yC+Ty@"K"<*ٚaXSeS H+RsY"W8we4YIdf֖Kp {h(,J69҉.e48hysXYk2-x%~I0ٓɝ 9YX雽,~b"KaMU3űZ&畂d*i+1d j:ʞ;(3H01 'i ɘ]q7cUt1vkyc [֍jTf/3Sk`JfVci&y"bZtD}G\֥if9[ʁzʀTFx9vIcʩD J0pʪҰ @n;tv3jB3l::&)Ġc/ 8$l07(gRd#>Z8:E 6:Պ859>+g9wclÒf:vz[+F멥Zٯ\ &ef e)~'փIʛ޺Y`fL ,.❣dɲ6x$!'q곅XH;{15HT/&  Q˝}dk7G8=ȳ zTPǹ]+ nx%)+# gѷ0ڢh6kk4I۹`~{ʤP++ʷt Ӻ Leʧ+["f55] GvrZ:8y)6&8V!Z?\Ji~R޻Zk2ٸz9T*^ɐֽʬa^Rv@˿ L0p w ,@j`$uyJdվ,‚\5x#%lY'¤{-/2, 6g =? uv1<,IKĥOQ,ŝJU,ElQ<5[x_L*IK[mZO\̶Y}rkyqǭ0{LX\ehs!ƍt,G\ȔWɝ (ʣlww mh*{Vshl ʱg|d_az/ov,C#:8")z0l)EKkcZILo &e۴yX'RrhdKAkγd܈Mk͑I" Vx @JG|24ܡ|L)я&l&jXCJ 粙+8jCSң.y8XfV68ŒѻoڗxbӐ3tQ-z,,GPm4]{_=V` xX ll(k {m֫qmz/Uڼ֧|ǩH8]u%bx|ۓۿ\Y6MJc/CZ:+=(u -6vZ3q }{]nj N˚ ms ~'@`svi!vd׾;x˸R~ץ`αN=؅̓L㞕j-kW,ڰsЪI֧FS{KJV>2V<2l=k +=SwX zQSnvlmṗk40]#-]Zls `mEw^zNޚDId myᙤ>2w҆+#6"!G&. a;QJҊbrp~V}:|_A6->2K1"Ni^%Ӄ,4s/DZi'<~Hك갅J-͘@<$nh=s x5n-WEt]PV?o %s'0+rv C;+cm DОsX+= t̵:d59w"2Oeⴏ5絪}(8 Û*aE늝^jJ6ekgObʞ{ b %Jݔ si`v| T]_̛4|s`?<ѣH*u/Z>}3R7E*B.JHt,Yӊ] bYhU:WVVoeoۿzݛ0K.]̸cxM='_UK vkrWlIslkК# N5Š}s0mּW;z'k?U+e`nqL[:Yֶlhr5G,8 g\jոk?|\Wr0Xݵ}k-1~)\-W\Q.`jn ⥨,B^!1Tt{hvSXH]dań"t z(_#܁](" jQN(el4P3z۰8B=yaB sbux u-"rd(E"zgF#q bdiꩨ* 1y 65ډc:c1TZ:ܔghf%Z8jRud:bJ-vw"N+zHTzPg|'RZjًۓ]╛NMhܤ)\e[\RcK] o~_2䦬ʬ;@ιniY880$#H' 0G%$vc3yJ31g].[dM 5RZf-tmcLk[Uz}Ibpډ9xc#7jö77luw砗=yS5TnΡǾPߙC;eO[w۹.o7cvfԺ G }ӷx}}$ g:rJ 7@ lX<)]T^H 9NPgG?Q\x+!k` ]~ 5Ǿ&pcRA4=c>(%vяL"Hpd"'IJ:tR%EZ e00@n<(WV))IW򖶄 e=%R 0K#}afƱX! sE`:"4јV3 җ:I@rjҜ[_IzZ;c9Ӟ (yE$1yT@PTiD7Jъ$iюzn]jђTt>ߩQ=0BR8ihJN.S@ jxx:KNTHMjcQZTP*#SJ:/ e5uXTVmhTʺִgUk\VUw+^Wum^;W$ y.OQ$Wi2ɎLdUe5lMh9KњVlhU[Vg]+v=mniڶݭp}\┩ Xl2i5a&ҫtJؾ vץ`f u XjMoyѻ(Sf;^:͑! 76~_HFpW~SN 7-bWx'aJT萹p)o @qGc":Nd#+y&rRuz4 Fo69a}TLU V՗2͵@Aӧ=`* W쳠m?;NaahzѐVtR=F҃t!Ngr4zeִO9Vg]Ѫ,]kװŭE}:d^vm٣'.u=]59ی!FMaoKl{Є,p!f[M\J*])KD.o7ܾx—!qaTR_-QYQmhdrw0Sw7|g||}wzeR)'-2yw$}xEEve6\!~ 'в$fh2yrwѲu3!#x;؂p- ~:8-bwp>}?؄:Hu)AX~n`vn?svPU7mJtE[2r2l2(I1SuRzwrrrnrCVr2CtQ0EUxm&[\F2Equ'za28z[e~n#j%kh"c~qcq犥j"dԊRm'SĈÆ$ՌQϨv^zb䍯k⸎Tkh4Rx8il&.9Yy ِ9YyYk@׏)k&y(*,ْ.029+9$ n"4@B9DYFyHbȓ궓9YJ9TYVyXZ4ɔ"NIP Rɕfyhjlٖ)镪N9(nyxz|ٗFi~rat_~٘ٓ)cp= ٙ-)9 Y㠙e)ٚ)9ٓ>ٛIvٓʹٜYWsyivڹٝ")iy虞 xiYyx iI:EɓH ڠ& I9: J:0$Z&z(*,ڢ.02:4Z6z8:<ڣ>@B:DZFzHJzzӤNPR:TZVzXZ\ڥ^`b:dZfzhjlڦnpr:`tZvzxz|ڧ~:Zzڨ:Zzک:Zzڪ;PKhGe::PK%mUIOEBPS/img/iss_home2.gifrWGIF87ah޼  ԬtrĬDBD tΤTVD<>4tdfLtr\|~d|tœl<Ҥ伾켺Ɯl|ttrlČdB4zdĮʬ|̶ZLn\lҬ̾Ƥ޴ڴڬ֬ΤҤ֤t$V>tN|ldLrLnd̴tT~,hHIJJK$LMijk FM [ȰÇ#JlUdʘ-q̙x CIɓ(S\ 0cʜIS (Nɳϟ>-V<$%EcɴӧPJJ5[Xj݊/(9KٳBb<ʱǪpʝKݐQ˷߿ La,̀M(ǐ#JKQII,˹ϠCrӨS^ͺװceNɸs6KZmM=Ga.سkν;mۍwOaoa32˼9ܺGߝEiwzW[X%o|VhGvX}"vgF1 :Q 4h#Uc~$67>Hx$FB6ɜ ("XJ E]aR2(dN}`t`o&j)gp٦nIx9juAFY6X."^3Ig楘f5hjj*Ꞡy*ꩈ(j+D[v9F`ncizIj,Y-Z-Zyi0Vf覫gQ#{'ԢZ(:Ȯjgbϒ+HH¹6Qk,ԮڬN\ozVlzIiGB0$1!V6<}s\H{ʼPGVmXg\wM@p[dߚ1JlkCp-rmx; 3߀n'7C`0vޘxv,*[n騧ꬷ;]Hqw/7[RQWo'7G| XdA}ycf._PDa觯/?RL1 cO. h{J d2C Z̠7z GH(L W0! (E8̡w@ H"HL&:PH*ZX̢!h.` H2hL6pH:x̣> iBL"F:򑐌$'IJZ̤&7Nz (GIRL(hV>D,gIZ̥.w^ 0ILҕ\H p$+Ќ4IjZ̦6nz&+IN^, :vzԦ:P*L|J "=UyU&R XJ֜&u@*xz<`-\J׺vB Xf;BZq@A:+Zؽ6m,c5ˊ\5`ꋸMjyVY6A`E%@moU@j26-mmY`iru\Қ\vbAquY A0/z9K^Vlnem׫Vmllk^ֻWZXa@ WuU#67[0` [Xj_\w(N ^XxĠeEZ\X f1YXqq-Wĺ8&ô+V핳Y=qe`sYԶc-M]:xsH[Ve,l۬B8fX0ЄN4Uyl@:@ sB##/qM`3: 8C m^Bߜ9߹ԛ|r# 38 8 V <+pFHgF?{.t;}h{ ]$ߟawtzwx}OMՓ|h0<1 $h* tޑ'Aaz @d/`ڧ~X?Yqyۜ/ /ď}5_wfy p#e~?d]G`ӧxyG|}p7 7~瀹{ywҡ{ ox(*,؂.0284X6x8:<؃>,`gWu70X' u^G`'vWv vyTxz u`gA_4Il؆npr8tXvxxz|؇~, `Wt ІGt-twv|f'wz{ kww z꧊| LWxt7؋8x. G-\v}}yȉLw|hALѨҡ"xw {ӈsĘ؏&.0s 񵌵rO(9Yyy]= ( 醗&A*,ْ. )%ZeXF/c5Z!#'Y/JL P&p5o[\ec\<]ӕ\ACIFYהhj 0i [_`Dc5_acɆfIAynqTXFa)Yvk"a}9ۦyr nud6dy љٛspٚZXqfefef[fofg&gYyL]6ivhfiY )i)uF ™3ўٟeVf1 ڠI9j)ʝ8 :$Z-  X1q&2:ء,Z"J<ڣ> 69 . 0HJZC .;R:=O WE:GJ^&jY*Q h)Eegr:ɦoqJ|ڧN"ѥ~zvzZx*jWꨎZZWfZJW*dAf6Y ^ 6Ы`f+Ț{s՝WYu`Љ ]8QXr*W9YƓgkŮ9Y>:a8Z|Ef &XB0[e9:Pe hh 1U= fY ֢ằMJW\Y\镭ЯB`[3ke F\`mFc=-{W`*][u8 ]̉`z%ڱXZVix5[Ű]e9YeGX:U& \~V_8ErY[d՝ڰ @@Uvfc`:nE^{+V~\vU"Qۺ;[{ۻ;[{țpc>vc9d`kg븭`|V\ 殲 KJaIt!Abȁ oWeřkn`0[ fiv{yKefiW;KVMYS[eS[]:[-/,&1\;K+: [ui& =@h:0⹽Y/ƾW5cT i:VYiu훱+,3i\kL#mo\pË73[,k zp q \!rt܆+Vj\ɖ|ɘɘ<)R!Aqa la ;ā"AkRʯ,,4)i,!IQ%<l,rQ@oӰs̈g̍̿ {+r*ϳ LP\  Gw λ @Pe|Ǭ wϙ7 ̜\  m, }!M ts<= 3v,7j9;}=m&L E}"M,[_ J;L͚_0Ո\erӐyZM  MXvHc;e cjhjlnM&pMxLw"M|ؽ1 mM] Ѝϛ 3p0Sq#ۜaܷׯǴm=ʋ=&7}]f,̡Q݌\ŭ ׭=L=Pw|ޠFV6Թpk ka6gpk@\ l YWE@~ J{]ͥ ="̹l sm -5>PՐ}m:sX-]Pbni ξw YZH6n2 /7`Ҋ }z+aF= 0z=ANm>>L,MM5 L|Ŷ c80b;~5d{9cJasY!&_ت;ZWگY;Y[u`l*h DpҖ`]y!ڂN'Ր|HK. ΣWn0r"0 33̓mzvP&^nn?by(7-\8 /N> \P+]X<0S< ?O^cBWEK9_ƴQ:{_?pG[ ]W/\Y^ |g%7+9+ ư_i[m ґu]~ /{ / |.-v0wtg=|y-M{|{p聎ί`]o$/zz# ~ {ˋM-_Х|f b{y^ WJ\ph}fC#HdX#HHx8X8Y(I`# izzZ`p ++`{@+ " B\l\a !A!MMѡ L }<~\q>]}ݽ=oAqѻX[&qQPYiq 9I>DD +0dG(|Fp؅rڕ$DD=jA[ x0+ԩTZ5V@T"8`Z!:@%H"redIl^BD(mZrӨy&~0do/U>K-^6*V˛1t!!:x5*gɡlڶe(\'Cm#Fs8zwq5u?]xgs<àН vG`ʗM=eZ>atUh`9TV?E@ ҈8쀃 h@`(nW\ 6"$$6W)eee&-ZIIg0Z(*8Zԣk$[{YEAv|)@̗vm"'BttI,I7TӁtSNau#SJh>zRDFh|1q 651;gJQJ TjR%*HD8C_C*F؊|ȃ-f?hVz(# +d. ¬ޚkql6u!=d($} +XM` e A h9ΧP2IC2 {&A 6ocMsQN5SAp԰LEl]2SrG8 p1lEYΖ,@DC3Y'ۭmf`}7 8)f42dn y <,kU \^{|M!PP[0!068Thl/ OӽI/@?`)PNBWv,l c%Խp4! 'gðq.d1aQ8(ÈKǾ$ R"R*jqSSL04+|cΈ4qll8qt#h~J@1{!?~Rl#99 +GKjr'Eql*Trl+_Y P-DAQw*t m(*♕y&hR,jO~ @Ńm uIORxJ wԤ%G͎~r H7>A"Le |#,HStLm !> q*Lb9L_QNpTdPR5B%u[V^EA|iY{y\j5nEnpf5 !ҺȒQpe*WЕGK6BC=\*@ KV唬mvlU65-O1dC@X;芩)Qj pW6ָ1 ^ֵ7+]֭,rwݝwXw}ʡ^MB־~ [Rog aIu9QF!n|Ih [9S3mqhZG5^$KX2/m x:0#!^rl'Gyٝ2-\ sܤ/flR3lθJ#,fxMwFKhA1'RV_/4{{e=_ *>R_ 3ѹ!O,jYDĤo[pS>-qї1gs5_7iox(> |w.$r!z! y~7" y }$ȁz 4di\{ ,Ȃ /Y'+ƒBBuMٔ:9mԣ;=i׀CݤR!I'_Π=}Z.z2mM.b{~mH}ݻYO !41^Y?-Βmy]Nls^`~Nk^m ojȫ| xLԎ|,/J-ȡ ӓ=G}H KzQ>yͦ!|Ti.=VN8ɮHK.Rخ>팋bݾ^WAn 6^{엮  /ZkN>?o;}] ~OQ ?}/1/3O5o7v|,O_?; =.LEoH?JL;T/VX~C_> |aNec@aB/Ύ oBq/sO]zjhi!螢<ɼސᕭ< "ߢYAcoOa|SIʹo>[\/ 1:ٰ͌V\T:yJ(Nnҟ-n{ <\^5J_⒪~  ɂƼˆև ͓χŃߕo:+N_w"8bn )Q CS(S\ɲKQr#{(H@T5F(B蓘U=-vq:\֋fjjıRZnTTĸGI{ l+^xqL]j\"OUZHlH m[9;[lέ׫uEhuܩ mTiۮ!{.^.\:NسkLNmF8Ҩ^tP6oullE&Ʌkݖ\%weV~6I7VrwvᇯxdħYs7 gegIiH77 z%m "&fq9dx|f]#fl`4H_63(O]tVvSevE$YĩURD>ܝ;*j^XpQHR祘j*Jdgf$nv{៶j때d!z&kJѮ JX jfmJ`:.:ɧ綛 8 ,nsbp Z G\IVl1f/ oKlsv {0'1&7273H@GArH'}̗|;uъRX84Yz` Ӗ8 hlp-tmx|߀.ͩ]،7.IQEcs;u^S@v%fZ) ;˧S4 {|{絯|<<ҽO;ԖhkN|Y}aϗlLz6O<ڼӋ!y$V˟< 5ey`fA H IP8a. ~\S`׿~Lg(.rQhҞ/#X$:(Rp ^UhB&"PX&MmQ >a2"DHFd4$7O>h i]*,yCGqvc$ HHPV O đA#=1 Eaв pMZ$U!t膔8}lM:ܽc.ٵ^vG g eľ?*׍nXj~9mv7oȉmC͍? .m&We!8/Xhݳq wi<( j+H,N׊0 =G|sDz^TCRgH=4ϠnԵy2ě{<ﹺh?ZGӝCQOJkh`YJ`e\g:Tިdž|m\ak.qu[tCtqQag>LshܩYJeD&w L\õ\e^?TU"I*$)n&p8dؒQ_%_Eded֓b}Z\ٕ^`jhaka~aeWɆc&tYvyxz|ٗ~9Yy)o\& H&dQMVdq e+ٙ9yoW5f4i\˕vUfe'$4Sٛ‰%piXaHUyIiYyؙڹyg+i*ǝy虞깞Y ]k96R왟ٟ 6z z [)4Zzi`:jm13Z&z'Z3@~"Q4(:&*4$})F5;$ʣJLj3@:BʗDz}FzM\ڥ-W^j 0T:߹vf?hʦxzʡp} 8Xu*6wj~:UꍄZzezʨP*:Zzb :;exɪ*i mjʺ:W:Ț>ZֺZzZZ/z< @⺮ZczaZjZa*9y陯!* Ie! ˰[j,:"k :tګ ;0T%`'ܪʲ 2B%(*)O毜'`?;T[V{XZ\۵^`b;d[f{hjl۶n۶1 6J˴T`(P;+{K; ;K ˸K븥+ۺ뺪 ;+{˻{k%&.0.p)` ۽ + ۽˽;+;[k{ Kl̾ <[l+&'TK+C*p2<4\6|8:<>@B,NڰF~@rMo޲}gl]ڭnN$ sNyp..X> Z/]&z ׍f~$@ר{pk}|jr^>w̼VNN" м1Vs ь$济޾#^!u Ҏ1/l>,G0~ ҕj> P7N>Oj ?E XyɊ + ^@0@}<0a :|ĉ+Z!ƍ2@ ș<9x,[| XƜ< 4bСDvi4 J 5TF+cZ5k֙Tib%-k,ڵlym6%ڽkֽ|-ŵM[o+0b;~<atZM͜;c \o0NIg4m(7We̴k/9@{:?;g9n[;^ =yQx'Ӷl/c?g߳[p'>l`\P`Aq0[m(:Q6R](}Vup h`` <B!tiMNFebRN  r(>dyQAEn&lLdDIezb$X%|vIXyF )D:瞚nJϋ f3Ф\Vzidi)$"F*Ehxp=HAظ\GJ-c&6-$ >+arI`AJAA*[^˯?ö-uK"߆p:RhkTx@A+sb"'rp&p# w ۨ4 s2,op<% 4o)38+==sRw6"Etnf]OlfW"W?_5NMpg߭>l/Q}w$mr'~ ok~TwD wbT/\CBP1su ``bAzJЂF~t,bkVx! d6TC}$pjq>X$~-u !΋QBI Qg٩# 1G E$Q2[+q@`1hMd&IF|,$){(MGtt?6QEF>R@$K$>bl (Y MC&M-ގG>%0} e.]}I?)Г`|Hؚ$G͎I1@ #H"(yR dr@59|6{'>w&Tk*Jr}zKSG Ҽ/oTSZ ’UU*G!`hPCs1Nc;*wE;N=dLn ?z7ЃTE2U "Rӗe,5tݩ]*T\T}W'Rvsg_35.ml_{#j]5R:"Bu!RS|M~PYu5]e:"(>'' G'L{ BOnN)ȮovumrvW>w})rȶJm0['rvcv,ƘԵw 2:VHem1>Y$RK_f2M]>:<&f،Xdp ,Q3,0u[bb8\-]tI%/g=[*7bs9!U:퍮 6.кڕ, T5rx6lry ~h[/2S^pDȗ>]11 Llw>Ɋe~?x봱Q(cdSi #CfaiD廋lQDz4k] a\zִu X\՗޵'Ae\8v\5Uن7Ӏ9,s6z%3m8Iڐ 7dmAn&<-)*6>t[v }>7'u  @tvkO5ij$pz r<GsY%rAFʈD#7Uh<:ʶ{~J~y@HPAoPoE}zեsW sVИTe@g1ruK_>CK?{7n3On?|J2anH7)?wf<]NKCwid,p"~.!ρ{J.q=E}y tYv|Mη0]gq17c>>}?Uܦ 4~'FPq~+xo8WvPz m)pw$lA{ €v1A~&wO{ؠ;ȃ=?A(CHE h4x{6JpU%hM7O-X?b^dfg(yܒc3rTlhgx8 ]frhw1ӈ|Hzyx~P(8cXu{H`40(Qq0#aƨsXXPsx#HȊ&㊿s0Xhx똎ҘhθX`(Xc ~H.H8 '((4 ;(ȓx79F91By)ux31 HIIX$s .(Z9O9Px' ,.yk26@J9wDhNivbYacIbF(Ix m+ɚYX蘌T9B3I9ّ)Xi)x$iyƙ$Yn( Ñ0 䀚oI*/iȩY؞ɜI<鑍i9˙ٜ9x ҉$iٹ))lXؚtɗ ɟ&Jϩ/JZ2r.ʐ᠜H0ء !*쉓):i雐9W٢5*Iazѣ@*.۩2iybz Ф(s ]YSYy\~ 활^9(ڕn: #P{ʧT(3i4ڋڪzʋZOc:9pJ4rZ+j׊jNJ*޺m V#Uِ*íW8>Jz"JZjڮ H::"j)*(*~FHkˣ["$&[(k*lz. 6z2[4+ -!ʳ䳗ډ ȈنB;U7HjzV6K ۲]kBڠx ڟZɫJɌxvvʨx!␷Ӫɵln{0) JZ+7Z (%Z〪9 ;YYk /!ikڒjjI?ki:[کPYثvZ{ *ԫW۸+K OM뻩˒隆 '۔9,ʺpۻ 7^`Ji)e ;{i! plv_:}{jRzyǩ!-YʷKE/y¤8*;UqN|d;K4̤Kuٻ LY ł[%LO|yR^ٍ\ĴKY )E<ܿn{F:ט@Ǻ9ŋ+ʨ-0̼|LˀNȐő^YPJh5jL9z ܥ2iDS\\DŽ\ȸlI,ļ΍ @Ĝc|˳pyɿ;>ɫIQڽ =);IɔO ;Ѡ,\Ǒ{u˾ͻ|jN,i[ʹЪ[(l hx8*,2G]4=8D+0+) .A٪[8f{VU WͯL uexHfƮڽI.EƩ^{NO>1\X<"ߋžGŜrYHnoլ~q\ʙ9$=r_l  k4$1}J%M45?~~azӋ񻪩0_?n 6.R&( b+3_v(c!?#WmEQyԊ/_+O_Ȯ}Yիm? ް4km~?޿oܒ_)am_} ;9>ٛ/σ|O'/Oo  Έޑ頵ۼ؋ 'u*\p!;\Hŋ3j CR װɓ(Q>tM"Ǘ0cʜI<"sh0ϟ@ZѣH*]ΧPuJU cʵׯ`*0 `Գh#ʶrDKݻlx4ߴS LTܖx+^e^Kdk k.CM:Ri`ΰc t۸s^0cAZ Y igt7;ȳk'sË)uuξЬ,?O~ƖMvH |Eg΃2$ (]]f0 & :$nW%n,Z0>a4"wb%)<aX㐜HI=&?ߌDFY Xפ )mQ)YinUPUbFBtؖkV|F\v*hxZ}&U;vj(k{*jC"馜v%!z ɜEW WjY8>k4 @yЯО# {"l &lzF+*:f(·]>; ',l' 7G,Wlg ݲ@uk(6&P,0s6<2|?3@-tC'G73O;3SK3W[t\Wu_o`-vhamiýZmw%`.'N@ʌ$ ) A'wxCC^y3K{袗N靟zc޺s.{.|Oz瞼߼;nB '߬,Ʉ /o觯/o'PȰgm_#:Ǖ@Z̠7 NP\GHT Bx0aN<_P8̡wPV7H"?U&:$CbGD(ZX̢@8EKUQ` .zVcLGpь}H:x̣> IIG4~c$$'IJZ̤&7Nz (I0Dױ#)Ho`,gIZڒD.wiEM7|-Ib%/LF_ &2IjZӓl6OKhJI 8iln|7JF5WIF@d8 OrӒ$'&͉΂R;) ( $`@)NJң$A JR-34Z=QJ2%3l$d h|K' $hC-X zzљt>P_zIn)Q% Dd5M9Oꔧ,Yq˒EiTH:<Vp$KX6M,JYzة%kjB}b[ؖ@mcIv QIX`l@[HVHJ\&T+d߉Hrvu.l%ܥBŮCOfwgIP7奮KŊ^nUxox^7ͯ\ U_t'K\j[ *ռ|nPǻ U |/ Tpda S"@90gLcz;9n=t "df*IY]/W*ɦlSIթwGްt7dO/T\-_(֌t *1 3ٷGe[O=6~Fb 52ލE[U/h2σf`;]ʒx$A-j$`қ]E/ҟYW 7/zڇcʽ7KlqWȇ8~|{؟/$OgQe-{)~720~w*؀b h)8.f"rw(*x&Gx4($/ 5؃=r: %{)\ZB^h?P,ŢKUl)|܋L,|;glAlK0, z,A`lŕ5ոȌzVLkƹnyG,U3)eb0ZS< {J`:ȮȠ|I\ /˨;+ln˓QNS^UfM^Ϊ18d~K.-NĉrUlyܭoqNnPN@zLݑ9|+nLsUXʕ{{<2Jrn0.wZˡ 6Nnvomz^Щ|Jx jn͆iM#ݭ.:ڻC9*-ANii~nF씉N | .}%1E9UUf7QnF ʔO,U[XCi=ae=D~[LJgc-ˈ=Hp(^ؑ$3H}+06" 677W'WU+ m[l)}N[j@%HY FafX̬tUWw.c2z4gX!:7Mz@^dB^bيf߆hM UށKHS}$Jeha۔-ȓyhfph)IEYNW>WPtoiu2JhC#x- '};.f=&d(;-w>)żke V\b;uy J|2+9zh>c-hq5{D*kmk)a&%Ocn;"jr: g("Vfr0 mOl6R(nVP&QQ+kRx޹0|V, oKAO;Gb4)A&X+(w8!|F+aހ S vbc1375] |EikCvuzwM-ݷqj_xlr=jܖ_y7ÐK#~礟*T⍦]Þxw.js|?ڽȳ?6gʊA9l}~~O~柏~~Oߏ 0(*p lJp (ʁ jp?p$, Op,l _p4 op<y;PKrrPK%mUIOEBPS/img/drill_order1.gifpGIF87amΜ4f,m(0I8ͻ`(ZDihl+tm|/羠p_ţr\:&tJR֫z6,)2zc<{/\d}:(*p~/5O|A.4~<&]j)-;,W%'ŪY*Ț‚,׸܉Aј&“1@}Ch*BvAE`i.")$ȍ(1t;n3GDtĕ!7 Ҩ*- V?FsDAQQ ZhuMZ#ҼNjWr.-+g]XsqUlλX3tJ%ݽ]2nݤ;c֩. 7V}!Or(K5wײۚʎ]Tlhڗzj౹Z#Yʅ-v\qVfܛ?bǎTty [o[3d7*R2r_?_BvgYsC _f`8!"yE&"+r3^X2hD7򈆏:C0‘H&L6PZTViXf\N)@`)dVeh`pftv9gxyg|9~*&Ihnyhֹh> 韓Vzfڦbi~gJjkJ^9@JenI묭j)NɫY Zr+q2j;.K-:륟Z+~݂nK-~[k+ڲY ꮸ * ] {p.Т{/S1f ki˺.ð-sG +|ݶnB5GBr!^((φ2,_Ʉ>0q?aӄ) YG$b/B"ЉZh(*Zg<ȹ#_9{QmҊWF1YC2Rw:Zk:Ŏ 0( >iΎv%HK|L5:N:QVע. ۣPOB-Y#xЌCF(OJzH51l]>xD`_ZkVc6LlZ)J+j& `ukb&5cgYV5lf/zՈmhh)ـn^Hˉ`{bL-z6ݓjMmJԲ1&,YPKime8B(}O^d;L2R'*S)Yaרa(2c=cEצj^SjIꎖmw\vy^Z%Paw.~)+PGؿq`ۇ ؿ-5=0ւMWȭqd#p;Vtk'oVj<[z^<طu}bc|rVg1'MAk'ċlGX? ~d F;ѐ^ҡw&t*IYӛtK jJt(O^,Ju=$!iUl[ʰ._XzilDeQݞ^&iLY:鶅[Ou)0G^?ޱqq(:Zf*S<`pHY f{-7|3ڪcT-Qr|巇ﺜh]r'Lֱ:U e+o;~ʽ}*Xo`{1>$'{LE1lg\qQ u$2N\q]{Nn)!}_3mFVmS4^ g6eU?ʏJr<E-yﺈGOҋmռ h>ɬW_?(דw=QVգyеSsPk~ouG{}ȯd^?pEޘmt_C4:dZ}SK6nvuoSk&vY%wb|&׀r('1wqto#F;gMcy}eSkoxqffKUrr]Gpqzo00vR6st7oŤP/U&\%f%o!w~)th7V~Phv+UlT~b";D~Hfcw~7PW|a=(~p7wB.F_v"TnX}Hu8_V{{x{4V؂{8GiV(*Y|؆gz8NRK׊{Xs芩׋#h{˜VjԳOFlx|1;w7}y{x9p4fXH YZy`HIQd}(x&5+s_Y\f)cz*ƣ׉mGByw\k lG zx鶙,yK!jɜvzjjgڪ&:Zzګ:ZzJ ;PKu٬upPK%mUIOEBPS/img/pck_deinstall.gif5GIF87afľľĄ|z||zttz||~|~|tv|lrtlntljl|dbdlfldԶd̲^t̼ĬtrtdjlTV\tTLTٴLNTDFDDFL|DD>D464̮\<\^dĴ̬̔dflܲ44zl䔞|tnltn\ܮ,,<Ԫ4|쬾䔖ܲ,䔦ԶTԼܜ̦4ܤ|vdĤTbtԲDdz\\܌ĴlLlDlv\TĤ|윎l̪DLL|\blLbL^|TjTdd\TLTr\DNl̲t|ldTdL\LԾtd|dtdt\lTtlƌt|tl|ldT\\ʔ|Œ|dҔʔΘƔ„|֜DJDl~d֤Ҝl\tlڤDVDtdt|t\f\\r\Ɯ|欄|򼔮tvt,fH*\ȰÇ#JHŋ3jܨ1Ǐ CIɓ(S\ɲ˗0cʜI͛3ɳϟ@ J΢H*]ʴӧ)BJիXJʵׯ`n KٳhYM˶۷UKݚr˗o޾ .wÈǘ1?(\IR9L7f|#/CE{`_sG> 9 @[@}ā<9̩taoR 0_%]h u7ycwsБgr쭲?%@ҙj6jn8~ݖ@UF!(¦~^>^u*IG8j)G]v@?VُD;P:yY:i䘆)8mkawa\'vu9]ߏ)]VZzMi'M)ȷYJJ靐)\:VGvM?G e)>6!?rǛ~*lZ kSlF\Tkfv+k覫.#=+$o[ҽ/L/,B`5@"W\ CpY 4$qn 53>0s']!@ 95=DcuRLq> U4$`848|<@7M\=wwu~M:\ N3 8XL;Ըw2砇s~,N뮏PT{ׂC@ 5_s 6d9Ȳ۝c2O%~ƹ?P@'M7ǻM5<1D8dV3r*Lwإn|a7n a:bP`URZP`H@ ^P$؀AjXrs6h"4 Hۈ65)N{ 4Ev cG1rqE2#+JR \`' pA> E3g@KF4D%&f,y469 "CF7~ZL#MF1Qg,+SX`/B @:(# l'X.K4(1dQXF t@Ld'+NqRL+=X V0\g,mAT#P0@ʐD9R@/~AI]B%7u6Ԥ9;=WJX\#L]EWQ6>}!p@0+ $tP'`\""ΩdbYX:V*JljM)SSzQ,ZqΜl^04םlR@PH],bJܠuz0"ZQnE΢+ DדY,f[[l  Pɠv-q7ap+X:nX,u{ LN ]v!h@:AaPz^}`oЊEAL&X3Igld# )m'@$mA8P{ q:XD4Q ')ًl2YAL2hNsCd  r9H*{ %;~փ 6 ULòIJzS:[dZȘ65iNpaPB&* x0 ;YLla: C(,U|4Ѧ{ cC j[p0"S | :p \ЃP(! 9pzZb j$1I4(x8ē=k*@ҠqsCNr< ~D* C"Jd= sD"`.-AtlP" a;H !\⏾ ;p_zf(LA7 O0N1D@ /z1< g Ґ?~{HtCH1M{7{ <=F f1bwm>WW^֡w🕹J9HFwpZx重{7<0 wpH MOwG *.pt(|pcz> `8prDpzک J)iwj.9tt@XRxku`~kkPǚʺkm jxzGjvx{KKvZШ&doWp`jJJP(mywHhmYHfPĆ욦(~JX{9@8PM:fyz0~6c*X{0ڨc~m)IqWx&P7Q;{0@CE/edd0T*{Lzwf4kX2_;I8gK @yo@p{((\@??+}q<Vo7K~ؗ{!R >@|;0J@$;[K1,FrK|״yx~v Mb04ۿ><^ , ! !=b0wzj$ KQbl`0j 35|467lc(0CXoX3P@PI.`G'`WXVV\!0B@&,QB0lnpNF@/$`P:&0u!,@ "@Ab|B(h|,Dox3"@pI9J +pT#0aLB)?Ea-04P6p8@1Xx;+>˿La<pÆLp`'0(`)4*P+s'u!_ 1,e#GʬN?MYիBMfWKYJ+ֳh.kΑ }԰ ˗[7j\طǞf'%˘32ϚCmJcQ^ͺ$Ӯc˞3۸sӂߘNȓ+_μУKNسkνOӫ_Ͼ𡉏OϿ(h` 6F(a| Nhf V ($Ja(,&xb 0(4h8ޘ\<裏-)AHŽI6K)Tfh$)*DyXjY`9ddb)qYliܹ [&*szNB&6ꨣc 2:lХji 觠XQZtv*TXa4%D׮?FLsTZJ̪hkHDWm MJT*ի͆+[[թ-8S߲;BX;P[l .So՛ *Vl1Hj$I~,9c|fjBNƼ%3{'WB"@9PG×n Gg\wm]ϗ`m'[{ḿmЩ] sm|߀.8LnbGWnߍgw.耆N騇izꬷ^$ծ.n{߮{'7w?/EO+g}wއ/>qۏo埯~/o߯n<͖:0j &H Z̠7zDGA(L =H>JTadXr͆C/"H$ɇbw3"<̡/CLj$D!ɐJM.MԢy02. Pָ%&,FG"="gq# 3ZǐGEF!BiFʑϩ%*r~<&G HNǔ$q, U6~$ ҍz$Ble'r#L_3|2Ldr-m_̣4Ia%~(` T`d^6g0N_E茦@IN} %h(YObBt'ǀfH.`>~E3O_^@ MT6eiM_Z )]%!JS2Ԣ"wNݩ2jTt(LYf6.3ЩS=SRFtm8V6գ)~$0mկhNZrU^eM׌uxeNdW5`[B*U-9K.Wժ+#)ӲrvT%kQ7SL@kiѰճSҫrkNeՙ? :֬Xe[NfB".J7S]gTG1SLkn+!G|KjC#K7"Λ"ǁ$ Nx"0q4<('0k5#čZW#4!gLc+8]hsq@^֏LdP Hԑ;-5`d1weiyD&Fp\syrό=o|kNvVlns]:G)PA5\\ v-Ьk`D.6l8iz5F+ԭY*L7 -jiOvTk[؀osTٽqSDش~TkلϐNtIk@[ܝ#Ijvс[[^-O[iw{j>j^ASoA=^q\u?qD )|B1ѓs 'ܹz \_"z^t):zӧC}%c]HZGɫaa7$K{y>Q~[-U+{;Pn {zL5$?Iy.Ԧ8zY&rzNYPEp; o{qĶ/cʿ CFY/з*9o_?ӯ~&?OgSG!g Xq =&8ۑ{sv`"gga4$RquwIKDO2H%GHb,8".(k%[zEj\=؂(vXPxnwXI("?QYX5o6UVXZEXX;8qb!WxTA8YN8|Wwd\QewrhG(zH.dƔ7TVa҆p`‰_"GE׊5U耲dX=vcԋ@X'Ƙ6v=ɧ&ugU">Ԙ %`W7 ؎Pvtb  pHI̸aсv@ Бƃ(=Aw9. i]鱒7␚5]M9(^H JL!MV]Uyy<Y| @iyvPi\Po q]񵖳vlBC|}y7SOmu(h[|>HeU!Iyb ЗILX2Z[8ɍSP%8QiYgx#\Kb:dZ8<_ׇˁY'inǦ %P&`"Ч" o&q*Ǧuʨ p"(0kR8zlڨw&ډїʨ @&:Ǧ%'b|ʩ'0xc`:К%pr$ʬЊ:Z`x:ފ#æ"抮xzyJzzʧߺH:ڮʚ y ۧ#0 ˯#J !"++=04 [Gʱ+[+ )*A=FH#}M{OCRU<>hկʡ%̳Z F:Vb䪩ZܩF<&вkƫMZ'wzz!ɬκxiyʨڭHle*ꚯ*;ɛrl y*N ۧz+ʔȐ۱۪ seZq!\;-1K5{9;͑`f _ܥܣɜ|ґ)Hrτ:0*( 7ЂRegd p'ؐ]%aWo [쇱V:͈u5sm2ݫvEZ_ӕӑg9l"pvPyTMVUAFclհ֫9{jHD鿳;jwA~ `u{ׯӃ-y-tl{؈`M;Ж8wٜ@٢6b5!ذ ^鈣]S͇ xyȏ9:J>6]GynI|ؑ  -A-gظ&(֕4ۏ. 2IP.эqpYkY~x.]ݍ0M]Ʊiu{k e}a:fR˺̛k >~,VVӡ) ]MN&.my)C7WWV7nѾkh|ܯy[ݛ[jEyWo5K8of J}({!)Z!=Y鞮K}^݁}Z >]ޗzޡ>p^;h(Zp.ԇ}쾠Ƒ+&,ZEGʢN(,LF*~nf+!j>Β>ۮ.9y_͡v ͑0ZǷ;_.P=7䥷/hZv*] tm.CsNceU<Y[?g6\=Yd= 5-J~~j}hh功B=D_lcO\h֚: ;HDT:)w瑾E߷^k^gn~)~n=ί Sj/b)Z&ʏ?9OLBΡo>_@ET.MNUn]Vmuٞ}0Pp o1Qq1RrRstR35kT6VU7V7Ly:Zz;[{<\|=]<;PKetoPK%mUIOEBPS/img/dn_app_rpt_link.gifAGIF89acccckckks{s{{{{{Ƶƽν!,;H*\ȰÇ#JHŋ3j CIɓ(S\ɲ˗0cʜI͛8sϟ@ JQ<*]ʴӧPeP8h5I[v%4ٳhӪmƒF(!w.]sK>_}G]KÈIbX1ƇoAF8$`ph!e͜C@4eN̺ x0r c2حc?}9gËmtjaKNiVrXݿ?Η1f5{e0W낂)B`8 }f eR|"E'C[$/@ /DZ @s#k*$+ AXUAoUMn؁C}hZ2hI'V)Ui!id pC|Twi |S~Ԝi"آ'|2(ftEZ)H aR肍qjS,` @Mf*(=ʜi hh* 0QȒ*iF*vC ,d ᾀy.{({ .bPd6glHbۥeZt[d"`jh-k`2-{PvWimaYd. e'd<%miػEtwTIS&)w?jz.Uˮ@@Er۴(@F ŧPvm^D ,@4‚lz(v1]M\`)Mʹt}w97mA|8i"rM8"A8`x8$XIe0q8Hŋp( G:>|r9EpA%ٸJd.s+ =񓣼$ǹǫdH8/_<$4׸kd8[FDxӥ#gNv|_/yп Q:ڟ\C׺w]//{'/y>C1|/0.W_qD9Cy,&KOQ7yۻ>./8s_>߾_޻"mKc7azM~gp,WvG'6'>F=Ww!~GttjzMgzJwׁ h (jgbt{'L{ Xyz2hs7w7:71FuA}C=؃7xgvOȁWrHVNahW<8_+Ho{zagrv"Hs w7zXkj(n,q8-!p1g|8XǗH}׉c8UXQXJHIXtHԋHH4GxxXG،ƌF8kT֘FؘyhTemjVb&^(Pi0TuNɶK-AX¶_8O3S4S?\EOQTRa!~Ffa65UL9KBZiM%cUU݅S)RٔQU]Ȑ'W/WW%Y uS[$Yq\PdV_Z}UYuSGXuUF[~h` . H ӄw9K#Hc@";#3VNwꝖyeHqt+Xc9Ryhbj)ȱ]t1$cxZrHBg䐵䆂VܔJX]cYޔGZXĥViGbm ~eZid~)蝼֧Vj<)[*w&gzdrIW?ncN%sP(Z%< 8bHd!F.lB>+@NkD^-n-߆˭SmmbnrnK/nzo ,m;p.p?`+Hq^o `rL2<*3r sl8$;PK/>PK%mUIOEBPS/img/pck_prerq.gifP@GIF87aĬDBĎԜ\^\TVTԔTRTܴܴ\Z\̤tvtĴ̼ƼʼĤ¼trlľD><~|dfdƼdd\\tt¬䔒Լllllʴ||,;߻ H<\Ȱ!=:H1 D[+j$xVƍ:rY$K:<)+zd8sɳϟ?mREsѣH*]ʴӧP*J(ЫXj*hͭ`Êڵױh,;˪ڭle}KwT67ܽA漣ɫ+^̸ǐ#KDrѣϠCMӡy@Yp93ɰc˞rkim̸_Nj jrj e-N(񦜇b)}FfKfvlQJo竤f:iu;*j뮹޺`+o͵.\:K k+qvO *KgdR r3{V'r>`pE4+8@D]j'Wpw~,rUb=oǏR]i>*i\ ,#O&6+moun`;6*u{vqLVu{r;N8}'. J wk6mvޞxG"+,hBgMDM}|/O@L(_}Fs+| ?{wz6glO»)7s/}[_t5P~\Xc ˁCTXal`3P}1?*³1n +@l-R H8t(Qh<&3 DQZTE'`Y(,z/Y*xÑ0xxh@PE{- FЄ-d36## <`&hJ򒛄c;JiIa۲8N+eTU8G[0[QEQR'&'ٯӞܦ+έ?z/Rr H2(f& LT[ASO iHRBd srSmqL$OZ$;TFzUpU2G(ZTmYS}'D6+^ %(x'E)Ζ=4MKfYw$i{FH1c$L1-l(kY*FHk[oIթbSh])j׈]h;krs_njG sgmYZejE[H!#̨b}tsH[V]-C1zv/I3-1~QD0{_v ʐy> 37p*>h":'.APnw@ # ,熹 DeS'lrN=S,wR([8n\vF*wy=KKت@n񊷔rME$)}[i1G[.4Yi3\99IvNX[g:Ӧ񲒸{Ob ]|23Z=j4ٜ>I K']J;IN$GPsZ6xDZ4NPZ:5 xu)]־t'=k`>$ge}jzEЎ6m3ۃA$nN̹cbaHMoF o}7{>8;'N[ϸ7{ GN(OW08Ϲw@ЇNHOҗ;PԧN[XϺ֓o`NhONxϻ_rOO;|ݱ 򘏅{;oGOқWֻgx穧w}{?~E;п|O}+Ͼ}^ۜOOw?Oǹi~7X~}G~ ؀؀ {8g~! ؁ig8}!X&}X~ħ:0U3p'7}q|<{6:8CxٗDŽƇ7R(,vRsW%2؅^8w4z7:05p1PI({>hsa{0'0|k({cXgu޷M?u67SX|_Hvo0 ׆}8pGzȇ8izNz1YXY(%0$`s)@#@*psȋs(08Ȍ% R%Phθ6Xxtoxz2p';03@72z6'9zzw:p3@3p z<P g'؎z10xihxKnz4&.yw؍H!XBixh=6NjS(LA9OiR9Z~H{xs(PbYe)i5@dك5I608pG'}s5`8bIpdic9n&p)Аշ7x5PX5`$;x8&`y! H(##X.MsisiɕY蕊z;*9Hh7zቄُWY}(pCX<h8y&ٝ9J(79;@ {;Й48):`hy"z# -js$j[zpib8':ʆ9 Y75zEzFʣ '! zz4-Ȝ)K)YΨ!+\(r:7Gv ~ڈoFzjt)}wrYiyzzJR GXڕ`*^yw`d|fMsg9W!&(ʔ zd;꺯?jǻ|ȻȸG[Wg ̻&}+k[Mܻh +;tPۿ+|  [\/l4\6L.x:< 9@B,?db=I` Ӡĝم]ڠMMm}=ν܈z=ҹ ޕ-m-mQ ෭ݦ}o΍۬bр] 1Nحmx-ヽḍEm* ,LN0܁=rmMmV>Sm5Mݐd]eMJMWՋl}f]D~n K.焞tnxȉA0|^.ʽ>^~ꨞꪾMl>nʔѰ0|];'~ ~>^^؞~ޮ>-~>~w\_?~ s o_>W]ٝa|o&_O^e%-u~2)m},]]b~:63]>Q.n=RT_9.N?"_j߂Mj\Dod tNP^]Xw-/fxu? ?n_?S !S_?]Ob//P̍WZ[/_p]Hڵ\.O/_ǃ_O_o_ 8HXhx)9IYiyIX`zjJZ[Zk{)J ,<:ZjNmL8M]=On0 ss&BB p!DV,Ä2tcC jhRƉR"ǒ1i$ #˝7gXs$ʡ=S^4čG0hEI9S#X6WԙUڵD[•tC>5ii^D-Xw߾DOKP܃| /d#;R{bvzw޺ا\ 99qfִ&]X3ݼ{LwڠjкVo6[h˞ Zl_ߖNd魩OWqm P7u]ᜣW'7Zz H'At`HW_s֞{gY`G~7^"~=ǜ\iaTuv >x!txacB9ɁpkI!G6}AIMif"VEVEwdY9}Q~e_~Yd1HcwKifWS%hԝOIhUpIHc(aeS#-fm&'xR`U(Mpt֙)"6MjzPjh b %l'$zYqeBiR6q#mV" ǘ lB?8lCHz@xNرS[wlX ~zrq뜼f6z1L$0@s6Wc'OXpsk!WI`;O)ʶrP%}ҏ =X{]a'} slp]m x @x/NL?yO_yoΖz袏礟zꪣnꮿ{솷.{ߎ;o{8O|b.,M0<,}&ߍ7M0Y?I|~ s/rS򫅽AS cOՠ_ 6c6ڗZ(7ȱ V& V`_G@]jz–52a+'Ce,\0C0qQjlX/ uQBׅLk> R -F11SI*a^a\,QC|bĦP/"D(N2J !,:ȱ\ & d- Qq"#̨Q 5L#8I-O thUfKĄi9U,-"02]Rs##IJ 2XKR}G1)1̘js4Z .fqM=ؕ@{],l=RX;FevK "D/32ڐi9UHIP 6m0^ɦ͞e\۠lMZ6$:W-*6Uu5'Oe*Ш3an+_v-?k*v;c 6-e/ bvݬf; .-iJӪvK-k_ %oz{6^[މpQ\vgpsCFWg;4b5MG2VGi ֶݬ$l ^7U [-xtRp֕v5F ecTY@;"_ d0 KJL-ś`o:G/'YH qBzT{cHQJjhGM1F<-&Ipk׽/oo?o(H h|Ȁ(hx!H%h 8'+Ȃ-1(3h7vǃ=?A(CHEhGIb!OQ(SHUhWY[ȅ]_a(cHehgikȆmoq(axshwy{ȇ}(H^XȈ舏(oxhȉ{X(Hh&0#0&#0SH_X+؅(ȅXȅȨ(ӈ("Ћhhȍ_Ȍ8xZHHH(HX-0"P!PNH)0)@#@*9xH+숍9%鄹H (0x َY i/ )x#Y Y! ɐOXO Q)X&%#)N@y_!hIXNؓHZ9.0#!.В}@9\bɎ.)h)!YYIٔe9xX8|I׸XX}' (bXRw#ɏx)èٚhIYyi׉ىy+Yr ]ɜNHɍȍ%=IQ+#(Y}y"ɏ੝ zU9I9Iꗀ-ڗM١Oh, z ʟ9i *i(I}*CJxCɓ) Qx* ZI%(yI Ȥ‰yi[O (+ZEJujh@ (> lQH6Jg Ęjw=j>JI9xʨHjwȊK9ɚ(j*xwfꕽّXw(yJzygZ 9ʑJڐ2锫j犮nȊ] 뺅rjHʯKkل ˰ ˅+Ft[sr˱[r #q"K'[q&+j*˲/_. 3 [^0JCF&-RB۾D*eČ:|bR^m3LŘ;2f Լ.1o6I-LVf\`^3x"PUBɄ̻g<þȅf#M/| LT¸ctɉ6ʬff0.|QCN\,'L2ZȇǜO|qR[\ ̌GLː\Tw,l,d5*߂^$TC5ޜadtnV$L2<ş T*OlX A%l fK{r\Ulйle =@k A˺+IY}ָO> (kbGQm֑le28 W | R~7] sY ]k MJM]ZٟY ڣ]YMڧX3 W೘ɸ i;͂JVpŘ0 Ϻ,9}ٲn%ڸBo R = y ݵ92skeӠ+_sKLm5&L3ͼZ-M߸˽yjh+ݹ NoƺwQS޻B=Uc5ڴg=,B#^-{jM1DV9K`o] Bρ=u Y, Nї#*mHP[+кvQ^QÞqon1,Zn,L=nN$Ls.ĀЉNf>M%o~.e:ɫjxȆGck&^k=^xmnΆ4s,\ɴ^dI<{9ºȚ&]9i~e 9R|4kˀKNT\ȿLVÝ^b\mE^x8~>k/L Ю]ϒlE(~. a~Yҿa)V3O)_'?O86,hE]?׳Mvlft] N>֩,?K0Qu;g^9Kdz|0PsYy;|eڨm˅釯V/&oS/oS"/oS/oTǯQNY/o_ׯпݯ:?ڌgpOo_ eݘⱳ(*\ȰÇ#JHŋ^ mBVʤɓ(S\IFz嚹&<&@HѣH*MD@:$˫XjʵKwn*ϲg͖Ehҷpʝ۰)x T!vL f>1gA̹v?MztߏpSM7İc˞MbFuε.VȗtzH]$*سk^6nbI.z?z> zj݀h(6y; D=$Y&{ea{vua< v_(7*b$(4r.a7Z9| sl{Zp_ KW'W=%Wig5s(I;usKv'YxT7~^<^}c\6o{{/8yv}!Zx%izWW{'=Q{Iz_|>:=9_}]־9<޵w|ya ǣD=/ݜTyTeWWecgGz'pHsz$fx+ dր8dxqLPp8gh&vҁd (E~G'dg~]vtUe1c3"xhox'jKueP+anv|EjG IHDŽG^u&rN%s+DЅ/VicqH,8Gq4XȆ|`rxz3qxiT؇~Ȁ8 Gz7jor׃6vh1]n }d ChZ H'AhY ȋ⋿xZ8:F2ch[8>Ȍ Ȋ؆H?juI6hBH6Vw(X@q{G*EqgR puHehhA%#~wzI\FyIFaxo}t~ )rȐ IKsJiiȋ 6r()btl8 #%lx!c> @ iE)GHhj7~79@0Py>*)AE`g#aĖo5i)D`yi|RɗՒ4(qI㗤ɘ㘣FՍVF?yDV6wNW>IcbhaH N9WU{9if;ل}iYGs : IgsX™tI{fМbؙ >8$I_{٩?ĝYVKHҹ4#8g'IwqyM >fc2fm׎'90&8aTi:v #@KN7GXנ z9" $%e yMeȕh>031IYEI/kLHFHA[Wt\:3Kvꃦ` KbdZrDap*hڧuju]yt啈f?ʣjz.~J_ )ע7 `옉Iu^_x:jꤋś)ڏwx*wV*+oQ;_z rZyA() dNk9=JX[:]+_a[D;SIyʴZ˶0~Mth~ȴ'Kcˮsxzx~纮B**8K˱jX{8uٹ˂wȹgs{&U ڣ)gRHoUl[[7^x%ڮ JҒKvm )˃I`2KkK7ɋ9a;7ֻ鋺 ij"09׉5i 6o-Tzқt{Lvp&k 5#Kjf;Vk">S0KÙ¸7Ż:,56$^&~(*,.02>4^6~8:<>7B>D^F~HJLNPR>T^V~XZ\^`_;PKU@P@PK%mUIOEBPS/img/frm_audit.gif9GIF87aDBD$4\z*<쬶t\jtԼ, dihlp,tx|pH,ȤrI1ШtJZΫvz,xL.zn|@|zl;K88=A `9~9Jmp!ċql]$h^z O`G+q.PWd>y(/q.]R) p\[IJCm.(GgJj{Y2x.ѕՊ) %aVbbT[R|l-@:l-&j-O!i^uWg=W҆ɺwdV|Lt7k>*'kq83m3Rn]> ?]QH'0i:I@S9MO8Ig10x't@0@cӅ x;.㌊H㍃؈㎆㏄DiH&L6PF)TV)%>e:ne_Gbflfp*ft1gxe|ʹggYM h>fIif^nen j@J*cj0 +Ϊbkka–ll.륲m96K^[ +k'+k;ѶIdk'eop1lTlpaqo JE9<8̲/r)La2) tw 2HLtC 4F?=4#VrG  $d/FM-sl gm4g]C (j]uO-s/uxzwŷd} uAGM8ڧNGC.]e3㋓wM7sB>솮?K4< ?Py_-ӟsLo7½~ (@ԏt@E$0 ;UET7z GH O[aZ ʡ.t c D3!@ ծ|HL"*i`b#(B8"H,6ʆ xa r8 x[P=)qCFdW'=jZ 9r$G?2 w!z<6~$:Ғ8@eTQoëe,I5NOqssLj 3%2I3xh$L=l%)Jjԃ]ꁗL@f ):fZVPg$ӡFF} Ԧ:PT];PK#=PK%mUIOEBPS/img/js_message.gifN,GIF87aUGҤΜ֮DBDj4Ģ|δl̶ּ̮ԾƬҼ߼׼ʿ<6l4.d42b,.d tlTR|4̦ܲԬj,"lXܶTFTl$tbTҜ4d l|b\l$0|^$,2|̬$$(,$*,*dD4|Ī Lzt\F$&dlZdR4iԾTBD2L4"l<&L,\N  LD,2d|z <DlV$$T>,D>\tr 4\N, |`$DB\ljĺLJTdbľ\\^lLTRL$ڴ4ތ &l *l-q2t5y:|$=~$B,F,J4N4S{[޾}ɷTJA`$ 6B,6 XfNؒ"$>!K,$I"(N|3hL>RDKd)ԩ,S1I"譸ڵjc*FJ0$JϺD*>EҴ\ ̒ꧮ2;jk/.ͲˮJ;8RolҋW 6ksn [gy*(qJAr&r*q\iD=6K 0:lU,s)MRYgoL FyݪYگO113+u]mͼ6~7-60)8+mJTKcO 8Ɇ_7e ApO0ͥ+n.˺^xNuR:{41ߒ2u9In<#L/λp|C%42'rhC7ndy[I(hHNj|`VHfՉ@%~U'N7T@ iCP_ Qą0ܡ k)%*ч=(D"kI"E)n>a !JGع \9:'f@z*\΍ YHHCb>2F:򑐌$' I}kG;(4C&(GIFZ$'SIE򕰬%3Iy0܆8 m%s4PAh )E/ p9W|ݤ@ЈFeюI[c47ihӠQ>-R'>W=Tհ>sgMkָs^MbNfخsXζn{Mrv5mT@Mzη~NEO3\tup[ϸ ߪϩGN򒛜@^iK%x@N"8Ϲq'4yv'7߹җxjL=< @ ,,N'T̋΀ 7 N `IқNPwEE ױ.78蒊@ٽU` h׍^@` Jn{x;W=%P@h.8U@~SFW ?;ďBu ;}vIa^^}7"äb z_^]~?tjQ●3_r:vu2{~ ~'AS.b'0yXg8lv2 z 2t,؂o37:<؃>(8BXw5h{C#WF(HJȄTxqNvqЅ^`b8dXfxhjl؆erX ZXUX:*2x|"n8Xx ~*nvvXm8|X=閈؉^H8шX ` Њx  Xp Ћ 0   8 H XX ؘ` ȍȐ X ːꨎЎ( x  ؏ 9 9@ Y ְp ؐ YpڀxXqX (X@xʸ8Xژh戎븎ؔ0PY@iԐ ɐ Yɑfhjlnpr9tkpx$'(,ْ1)4Y6yȘЌȓ @8EiHKɔNP9R9XVy^Y ِay 9d o piYV+vn9yXȊ| .)2 i;阐)HCi )yɎَIXXٕٚ c9Նi!S({wiiʉ 9ox阏铒Iٍy G9JYَ)i\ Iiyٟ5nfWAx p ʒ Jjx o*:# %':)+-:025_X]9 ɖi@&VAr~ɠ頄 x Sjz ɓXjZꝖ^j`j cZQٞ*zl^I1zdtjyy+*JUaoIjop zƋo9 * YJ R ` _Z BF p `ox `٦b3Jʟ|~:B17sG *TA`HJZ '{ " Tjx x Эު=+F*p jaڮ Prj o˪_:`Ȱ fO1_|Ƕ7;py+J&k(+&-˲/3{يj;=ẍF;oɐ* o%*@8oY\^ ZiwZzڧ2vxu_ʗu@vfvjvnwrsVRq{:Ȭ*p{ 0+2K4۸˳ݚ+kEKɹخO;Q[W[z+ +[]Ȱz3uxLxwxx'yGwyW}(֫؋ ڻ۽;k;j˾[ KF{뮞۴ JK,ں/ c|jB!,G{zW;G2=AÂLQ1z{ o8 { o҉ēhL|D[𖿜U|& o:`ܪYdy@fp|qvWȷ }}l5Ȃ„  LڨNHIى[کNi ik)7iK1G~}~KCr;TXOq Kj̋,̌WZxI, |T;][ Klƭ@+3u 8bMZ͗}٤J|ܓAɥ$]'͙,,Ư{м0"8,zȁ){X&O 2l%i˩}Йц =cEHy+=mm0ͺ2Ϸ, {m׺SVͨZ=}`͝ D% c,͞oc m L|?X}ь 3H=:-<*G>> F>x0gQM">$. .],ne" :!6~3^15@䆨H5=6?.JjHtL>T^N.4FEUS~Z+\f`.kRlnpl>e~vinI~肾m^uf@ w,)>N~ r0 %މe}>^f \ b"^7bd b鮰^H$wBbh k ƾl2m,n b > ~'pwN]x@` k^ C` ohQxgvk̾e7)y rk,xp7y@]{/τ!>) /-/w||z;Ow=?? `r ,KC:?BX<_Gbdo,l/n!rG0 (?\@ j|f[O/}__5?к!SP hxOOx; gSi3R;w:.pkP\ĞO?iJπ؟qP@Z rÅ"\*@D-^0ƌ:rF#Ij$yǒ)O4ȐAVQ͚+c^x E5ZH>Uԧ ^ŚU֫FVXe͞EVZmݾku-:^>nt2EN,~ș2e "EPyOWΞwbl3N-^6]ˑ%)lڵmF5n޽}{.nuJM*SN gOk~L!S&"r,U{iS\ >w9uy>S./kز0u @D0A N68;h5; P2ܳ XPL>O\o%/2HرH#D2I%ܑ.!<8 c:1*2`RbCFlygy矇>z駧4x·7 <u! wGw8 {N'4pAk@ :4A=7Bp,<%/a e@2u: M8D" SDH`ObfaCb8`IBэocG@,jюhQH(ViUGALHߘ`hc$%-(xYe4d!HR-$'I1)H 'i <$@r%Q`^*(KTU*e$"p0қDeTJrjѕE1EIdR` dLV ;@yB`T>LPJ|@@LR=€$f85rvF,rHy:\2 ]EYȓT7Rvj)5:.zԨ;glDj849Su*NZЬ< jX8TqgM[R NLKZH3)WAUvԭ^ X:X5\fEkbV9g=yo%@J 3 aB-J7 Z#NSllإօ=.P̨rL 0Q):6 .ֺl8 F׻ n`{]-U^׽V]&(nyˤzkn}HצpEw0MWDupqdp &'̈́A,bn"kpe[~d&7O;:d#WIC20Trqˬ1Ϳμ4OlGg>t%3Ysne\E ;Ёym>븑>-n' ɓMa|kIP*̵lt׻;A/Rdzm~8nS>ԟlN#@Q}>ͺl9Оv;m-bժ*}S'Ѐ` Mx?S$_OKֳwܽ0\څ>ހ7_{~շ;tɺ>(Q(zzF|%?l) dW"+?Z6 Pd>Ԁ 2C:p?Х|:# -S@+:@AhdA   \3 <7#de  "4B!AA}A? * Ar .< 0L1Ե۠-4'{3,Bɹ. 00L»XlKDH"cC8e XDFGDCClKLEl Ģ5\#ZD0PTʼn(D+CDR+ I2\ZV|\EKE[ 2\`F>E_1`dTFDct;7\hFhFgNlFFklClp\n 7TtTudGA#42+GkDF"{@{|DSrǑ]W *~GGH(ńŅ챆tȌzTjǍȎȏEHprǔTɕdɖtslճM:<L$W%۞̳D |Jfr&hB&ȍBb[x\:A=Q*AJ5\@%?,B(У]^JwڦAȚŧ;@jJ]][ׅJȴ]ª]8]޷^-ZJ\(m^um9 "(Ⲋ`_or.Բ[52a\+%(D`oݹLU]uo[ K̭ կ v.m` Fo&hzJ`naҭ_W a_!pQu',-*eb8_+^ڜ)6*\bp1cE45 c8Z2./V<>ؑ@N9B1B6D/DVF[=vH6VHJEFM;d(ZOF]d^i=WY}5V.#We \e].5^e幵 9E_f0.f1cZ+fghFi'T?m{bAbӺJẺd:Zggf%fnoOZ Te'i;Ce಄~"h~^yfzz'vꅺLuVʔ+[Z<樠%MRVeUZU'b^Z.iehiiɜ醶֣BJMrif6&FM>Hj;@@$3=irx6C%f>X6ܜK`kov"i ֕YZkȾZVjF:cYlN6KlmFdf9ֆb#ئym^mn5~.2-fK+n6Ѿ~ZiX.i^Xh -_yVn]QoQ ۓIoo5CvJ{&fz`2ps{*fefu2M _gD 8(|鿪jo Wl LTN-]ի*ꚦ '⽨z]e!g# %`e*q*rr*lOr!r,j _r_>Os-@2Tba;Awi%ޫs,h>XvI/f@7NbĞoMevXQeRoSWTeU"6nX4?5g^O`ub'[7vTFdegvIvgwhvEjvl'mnotq'0wxy\z{|}~'7GWgwk/Ŋ'7GWgwy;PKZ~S,N,PK%mUIOEBPS/img/chk_rpt_attr.gifAqGIF87ac-|tnddbdĜ|z|ԌRLJL ttLb䔮,*,DFDdfd  DBD\Z\䌊tvtTVTTRT464<:<$$䜲\~$VlԼtl\ԼdlΜ$$ʔĤҜ,$LLD<<4ĬޤTTܤTzT~,c-H*\ȰÇ#JHŋ3jȱǏ CIɓ(S˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJR`Xjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߬ LÈ+^̸ǐ#KL˘3k̹ϠCMӨSװc˞M۸s1 Nȓ+_.7УKN;ν{ӟ/˟O:ǿ@%.a"F >`}F(VsXi(X&Zh("v42 &H5X"Ҙ2c!fL6䓟؋%V$Xf[]$y:lM_I$tH5执xY(z袌6z-&FjY鞇ߥj:jꩨ:}'^) \:*kZQ9(Zʬz왺Ziizv!+'WN鯳ciJڂk +bە )}b_Ӓ[oG,1:gu# ,ȴݗ,$,q0,.L8: Dm@$L7PG-TWmXg\w`-dmhlp/ttmx|߀.UM'7G.yֆOngwVW褗n騧梯.zٷ.o7@Wo7|w[}o=~o߯ H@pu_C0|w \`2ЁA ˟d4j̈́& Vm b`T07a Sk&P6.͇n ihC%;!Ӏ62qIcĦ qwCsDUkBa o(>tEdB)υ6>m C i0ӀH6h)HBt#C)-9<(1b(d0IGZMW UEЕ+7)5YZ򐉔.ȿ;Pi,\Z2IB&.\aZsҤ&21TR@@l#MBd:E)BrM7 q'/JςFҠ'>Y넧;xN&4L&*ӖUhЂB4i%?INF(,S~T< KbRϘ|6)Tf4jRz̢b3לؠҤudKSuv*!u J ]r]w\5դȒTj]}Yn7PiBj궨2M2xQ @ =GW:|=~IG sxL)1 V$pC!zBJa(.abw8O/xa**[Ml|Uco0m,ܪB}0S6^+fof 9r3T ֩QP}.uI]{dgC~qϏue}e pv`g˱}6mZ7Y.1F6M"sn9l.Ҵ&ŋOxl.--ptcGӜ(@rStr+9ڠ2Cؼ9/Y/ΜN79w\[^GiS>áw6jQҠT; 5wrKIf=ۻx)_;ێ0_!@3!<=^k6~ 07>b|]O8Ͼ' QA~O8羀;ЏO}>v{>OOO;?".s?M8cxRc ؀x 8x~؁ٷ"` 8&xT(,H?*؂02X6xfw:C<@;>DX3FJx:HNR8ӄT=as3R~YJcW=\u[hVׅwĆCeh=jbnȅ1bjIvrBsfeFztRvCa;r8cvuj60fhR(y^'5<Ȉ㈙艚j#h_؇X{؏49<=&I{X58u:5HH<]wnC16se6xo[sΓAWI5{ؐ)\=71E֦7;)L6HCk7uHS!i:4uI IR^(9%;K9\)hchc}(81Ǎ`ǑUhhxXGsZ_NSoy9,|ٍ ϸٍ ٓTYFy }7Ø)IE`Py(AiMʨEVy)x59 V 蝛yt;ٕ IOYɖX ɌYIu_ɜعi4$g\i9נYڟù!ʟ& %u*@Z B)ܨ ʝ ^ ʼngɢ:+x~@ښ zDox_\J`zBjOS7,ɎL/>35˭w]Hom-6EުCE>8=4/ 5SC   "LPrT2ˌ9p-92"6{胾ӵո-*n,Ύݖ㩺&雞4 -D=1ҝ&ꢎ5"`H6O6}hYWNTh4/dL Ś .nȜ&҄S012^6hʹ}^ݑ-5jNܡ쾝>>An޿mM6ܫ.5mfN/`^W*n~لvQ]wow 9).fSGi͗~~5n.~8~;h?i`obeVSW5ldδnqsPQ]s@a[$p;Z+>6?(C]~VXe8SZmݾ9N7.O z ~WǾ.|Xʕ-W6[fʙ%r\6bҍ?0I=v f$B;ؽ}\xGܺk'B խ_^Cֈnz݇G~w[~A;w>_~0cj=uB dpH kd#е>%-DP xB ) &Z1Fgn1GwG2H!$G $8Lr%i2(%zJ-r,* L3D3M5d3Mڄ3N93O=(K>4PA%PCE4P?eQG4RI'E+4SM7SO?RPG%TSOE5UUW_5VYgV[o5W]wW_6Xa%XcE6YeeYg6Ziu666[m[o7\q%\sv"je]w߅7^y祷^{7_}MW}8`&`F8a78b'b/׆ȸc?9dG&KFVfe_9fgfoyzճgg}N9ᡏyfb:jj:k\Z쇚6xJrxi`m?^ng^ն ,0$@_>o'|C;`It@Vvm]w}]u}/Pڱ={_cAݶ@8PAlPfYowe#@ zw' lߏxO_G 3^`cPGePc9rGpcሯ*:@ p'A *,NREuW_^VT B.߳gj-sKNrWr# BBː"SLd=34`⒘oljPӜD8iUW]#$d 0y2"=KS2+o0zqABf;g4Xз$w =BCa!ӎxF,C^S$Jetڲ0QW5 ȩ֊r)p@80*)QjLY?1e@%Z0fѪBo}}VWDZzƽs YHClfDZj\wR`(Z1SP _w[d?ُuy=9XXBtUdzW/ӾUl=(Ymwt57ϒϞ|W*T^VO|4 kl1sC<|iԭDYl{>_z_'>~<'xG>W>zy#@Y1ksS 9Slq  ?n@ 1 >,I")TdLA"@A\lADo6 !44d9%D#J()*,-*.01ܧ/$3D4TC15t78:;<=>U@A$BLQ1DTEdFtDAGIJK|BLMNDNOĜ!R4SDES<`V|VȈq  "X 4ɓ\ś|*bHPɶxH`> $|4G*p"("@J>  K:ڵ-Bp LU˟@K/ILpJ:+iKx&hʱAKl̰$Ɣ x$ OQ,|؜xMڤ M߄@) *(YTo̒ (Ua]ɮAмaΚl d̖L߰&ʣL:|&oMH4'0Ͷz'hMMެ0P=M \Pl UPB,h p'0 l%XN:䵽«N$ \QjѮ)Lfb+-KzNŘѲ2+OOZd":* MPR.-P/ EP QQېh%`,UR.0[#҇;1bHC 32*RdlNS<ӹZ%E,j԰+J|L  MK5ԯ,"2b )2*@R0%`4MR ! "ph#HPN@3lM3۵;"%3BMI :+c%%̇1prߚv.wU zA3U(kɸfۮS:*QWڰV/'Ҵj [U2^ uP2V/bٓeP/S z :xexbZ#w ן]  S1}5s}ڝ@Z S (HXE Z/xtDUZ ["32 %[2x$(2|˯U4bY-5LV= p:\ux ;mܾTM.<ךض67S63Еԭ%͗4 eD@kSU[=[]>]W؊ۻU R3xS5\35V2]a%5YO)hy3TӅNs]m3oC466]-(XM`8^F`  ^0 ӌYwT^^3aM-Vh h\T\y"nڠ8x9tߝ 2[XcUc`&A^ );㮸=XMa뽉:+Xװ 󺯓䰃b)\ų=ќ@>>C>Cc ˰dLhs֖}NKڸ y&z緸gg?(hk]ih i^Jnb 4  &rݖ!j_.jvꨖj#!ݵiq)Cu^D1!|ŲFJEV뷆븖kLqṶ&6l~ 9Tfɦʶl&md FVG.wΫk9ի傽C'Ag=|' @ՔTeYJWaM 9U Rhx՝{,gf~"+&6 RI"_Ł @0>hEnv$d-l-V!3C 1 C%tre-M$'NY's}t"]^[p*f}"8"XO!8gZE kaaBi\(q= ( _~6+b DcA@ VjYdu%u:Flm%O^)-`fCݵ ywgy^Ǯg[g%&W&>??_vw;Y,6By`x[׿%$@= Vq!~@G?* p,АX!sCO>?χĈa )DGrD%.eM|"FqT8A-^d<#Fn F  #$  U:1{UEM>$d!G>g4##3M$(C)Q<%*SUҔd;SH"RYK2%0]Ӎ!2e2|&4hR֤0ikr/)q<':өus|'<)yҳl=}= Ё=(B9]YD}(D#*щR(F3эr(HC*ґ&=)JSҕ.})Lc*ә1c1sӝ>)P*ԡFMХ2N}*T)ШRV*Vzj^*XÊPf=+Z Lx+\*׹ҵv+^׽7+eNsf['w"lMVsR,f3r,h1@-i!Z p ;%hq G{I1]Bki6=qKۣK\>F7Uqlnf*d 5%,з GL |-1L_,twVh^_p#)^սʭWmaTy)^]\ϸnb"[C+8`P 4aoK@DL;;` 2>L0d+AmWbyeVb ^h}Ha d?̩6*3wULb/ٿuHo}ߦ!#[θNC?-1o}\}AJ B.򑓼ea6DHlB`#-hZYblX p4-rxut!3gpR{\FU#D}fVb-l/5;eZ#lTG3`E.{? PLd-p+>J¹㗪ZA @yu`֮u*=LKxj;Z\B6^͢@n!B]aiJD#jKjWEfN\q Og@q12_R_@q-!)2 E}a_(Veʜv[w!_ vIpfg"YHJl` nnqj`B3 .2o62 7Gb >b.] 8s֥_a=b4Nh5m ?_rA}aƺK v310seXڨ&b^0-dE\4^⊳pV% :HH_(JC(CdrnY\DzP?qUuۓ.pG$4qM2t8f N+j+- wqR[jà v.rˤ-AOzBYV \Bb1΋qWDԡE[KcFk%\<K2/;@gmko3?4U H:2m$@ڤB>vC 7}7̲6:lO@FEs/П5wYJ`ynü~mj:h%4KuE [m\:rO<#D@wyje*oN .~ h? @~"3'AkhNtY'sd( /n1'>YA -(?HK )e(JPΙ;̑,HPJԢCeAԦ:5K}jj8Un|AEҗa` +@*ղ[`Y׊V-Y0'xX4_jnaHPiU*)JZ֬Xe.hvM,>{T.֜mlQEѴ* ͭnk+v .o[4elr[\n mAll[^0Ȯvz7*vKWݥr7YiK_5 ӫ@'U-WO:姀[:pn{ oAq]/sЖ Ka n 0gL8qOlbxoh1!s0rAM^TFÔl^Y`L2hNüe.nnr$әs<πf}5ЈNtF;ѐ'MJ[Ҙδ+BϞV2CPǣOmT{zլ%k.pHq|qA˺b׿&v uӰlfϚ-ȈiO նvkBr{-bIv;GP9y 7qQm4N/^|c;,pCw12SɌ ,baRb%'@0?0yuEJǿPR R/ 0 nH? <ضc4h?=8I b;溎z<y `Ύsafgw:OG0|}; @]qW>ϼ7Σ|[h4|œtr\tdfL|~dltt$V>tN|ldLrLnd̴tT~섂<ҤƜ|l,$CĩDިCC HQ3ÇLHŋ3ZXaď MHɓ(q$1˗#SʜI̕Z<#"0ͣH*3NqA`e.ʵW\MJv6\a焴<ۦ]؞8xY֯ \YB32T#1aps0YѲL飅Ee|D&Xpvpa%CuO N G9У/gy.fËOӫ_Ͼ˟O(9FlFDpDv~'Vhfv ($h(,\ 71cefDa-7^![-6PF)TVi*:@Xa9VGZ%ݘtYvSYE|m3x|V:`CVv[ 裐F*餔VZr.i8j騤jꩨ@h(#jj뭸^jk:NNЎc Vk: j!4+`kz+2 @n,O W 'D,WlS o ,r? ,o <'#@'H' 4PG-TKESXJw' dmh} 4d=a_-'4`x|7nK܄o{3xx͵Wn,y;n/<[nb~s9,/;9N)6oO#||; :.Ag= /C/>=[췏 9>'K|6/9 t}{;>NH l`?"{ţA "x4 "`?%~#_ EHݡ8 >>"q@L(DIF" O@*ZX̢E- HF 1H6pl f!xd V IBR.xb$')1cOc#7,e %'RRC<*Wy=1B4e*cIMβ,Ƙ^ & )bRLff4IjZ̦6nz 8IrL:v3fIzg(~ @JЂ'BІ*DЉZ@<]I UHGJҒ&M?QҖ".iF Ԣ7NwZҜ>P*ԝj%QZԦJ4M]S#*թV)Mz!ԫY*T ְf(Z*ѣ.Ҧ&]+BD#Ѐ=yҁy @ZP`@^z2}gcIt~=?Y@VM3ГJVl,O>6 ?DZHŭA:ZTMf1J TbC \ܯ V@nFY`hwN`MhjC v2]y-í6@օ9kp+O&.  \@;=@v5o`B_7S?86hN9b , 8*1c׻,fm c 0@P`l' ^po y‘qy`(M7jWV+ͯxy1SL G@r/`{›@pE@Zl|`<Ū=,̊  ~:Y :c:;u1ZP=ZЈ_od}2foա>y_Nuc$fwj{g*s3~-]ג יl}p)Xgԛ_ n,;mu=y{'up+ܻw3ϛN8rܻ놹rjԸʹ'T4r/w b+>tғÖ&`3m U._nWLwzį+^\"/:Wl{\ʉd7כo֝ӗyL{/8<Щ OxAnh!\?^d=sM=!0-y9;Lڟnmxsy^0͢x9w'*N@xԧ_q~jG]W`w6se|)VwY~wWw~]x|ކxox.xE&ftQ`|XoBfcvev(H}lprAׂ0&ւAfbIw}^$Wdf`AHe+}?`AxaYyٞixɞ*隽 Y ™q{)BOٜ&y99韢i-X.*\Y& ʣ餻*2*9#D' Y|GZc K:`ʥ0ڔMIVZyzuʦ2AazU{jhY闇*ꨟZZj;^A iIz(kE˙9Е:ZJt oJ_y[yzzZ iJgZJ:IʪJ8jٚV: 횮)m縯گ;T :Jj3:) hs: [Zjz [+8[Z ˤڨzVY <; * 9Ek2iEIʫJ٪\: )sjJwb *h+ I Z纶 [ Iڳ٪V uۦd)h9dK uڞXz@ڧzɺom;۷JJɷIk zT:M9W+Oz:ZEl{ԛj:*{k{P[[떹ګIܷy󻥺;::y˿{%kʡ`6w& 㹼"l>sʼ{YxkZڦN2L L< â6Z;<߻任ف wK]ۆll|}-ܠ0켯^:0ȟ*ll龡 LYsڝ @Mhc~ qeNS. s~ynX>^膾 No {~mnj~>i~^4O-퐩J1Y➾ˉ>Ӟތ^[N^n~~ޘ~.;}?~ 3P*l'`( +ZdD⧌qXn %ȕUDeL"k1b<'ДCduD:54APS1uZPV\ʺuPX]=5u$$,ܹRmT(- 5[z 0IBR:,L5W\Uf9 Ή?s -eVI[̀;wnӒ;.^奈DGSV ymu> ;y]v̿:5pSL}q@C&ycYHa֕pfs!uaUBp5Z}8al}E܊1x$Vr dbhHn eXGeVT^|n&`1c48"8$9JԂH8&f:g:8*rG_E~Nyyb^^cv> %by(#q3gDNf$y6}[*{fEI`*dI95klHz7jyΈt٘Yk+*KoM{JX[U"VZxU)qxV=J|Hx ۅ2k-of:#T;I+\<:4(*#t͉ E[C| ^Ua5%Z\He--ҹ/0`k}9iMx/x?y4 OtSe'? PTMCІBth<zшfh= ѐ~#M `PLf)Mm ֔9N}Su>jQ ԣ*5L)RT6QT{z՟JuV*Vծc +Yjִ5kk[VUOk]zW1 P v-a*vmc Jve/jV;PKG+PK%mUIOEBPS/img/dn_app_1b.gif'GIF87aڴΜҤ֬4fΤҬƔ޼”|||l|ʔܬ´δʼƼĴtj4ļtԜt̬|ʜִ||$V>tN|ldLrĴLn̴T~l,׬ $H*\ȰÇ#JHŋ3Z` C(S\ɲ˗0Ur4j͛8A ϟ@ *іH*ѧPJJjuTӪ`ÊKv]Ӫ۷pq[ 7_-hŷ{w^~ _j_qX`w&A.=lbޅw $(z b 0V!wDEHeo*Zݐ ZXud\b3a`9Ԗ]9͗bKd&,h)杫̞|矀*d''6裐F*i/襯I禜6t(j騤)Zt**kfek]ZJ"l.kVڰHm$nq} n⒫.Y_[UBEo,l' 7#LTlgat +xо/QBܟyDa8KnMEh/ Wng[ܝmPQ8._Q#r^ '?n3įw݃oAg+/./?a~W+ >}π 8ɡ|Û?zG? .3*V(Rx .! _8!>Ig=1 DD dE (CpU EN =2ψk>#ɘqUH.ы` Hэh|$܊GVVoh/Ridos:5>2zg|F5O%|b)99PrSKKj2 `9e f:Ќ4IgR 4!y . 8΂ v @FN(OW p ƕdݎcIv@Ї> ,i9_9nP:]WZ wǥWk}:j]d/rub'V;v}$ r8lQc ;gW;񐏼'O[ϼ7{=繁cJWֻ0=? ϽwwOO;ЏO[Ͼ{OO&OϿ? Կ8XH(' Ѐ8Xx 'x Ax`"x(3Q<. `i4.l75B8>x,9I׹ )ڟ牝 i ʜ yzɜ ڡZ7j(J9.J*JY)ة>Z7Z +ڣEzy˙MGU -\ZWZ] [d_ezi\z9ʦ0p:'J xiQ:ZzXiZIQ U Vz񒩝UJꨕc ઒SJ*Djz*ګʫɪÚ::z:jڬ1/Za  j ڮ㚯گۭZK k [z ۰;˯";{#ka*:799@(D+ ;+?;{5;ڭʱ䪭Rk%${`Kc<ۊ>/%  3[_U{eުክ;\[tKiKN y}[q K_ n˰+ۺۺk/+K2Jl[~민z;:oK ~;K+Ӌƻ QSk˼拹m웼)[klKk \X[z:k,;ĚWߛ˻*! \,[+\ lܴ-<O8e-4]1 [IɹҮ<+˰|[i:Mxq;( +@n5οk,5~CԱN۬ݎ;)>#O ݳE0nNNꁽ׋+װɭJ?ʜgx1|m.Q|ӾܫNRJyk8㔭z.^:D[R=9zJ.R~8~K)Pa#MbC]s|i]a9<>ݭ]>೜=x^}&Nl/niZN>%\fxO},}Gr,L?!^!m^[N^n~ލn.?_ZO?=x- g0B:G!(C6n0J`ȑ$KE5'Ns%]eI/w4HQwL1UɪQٯGUkW߆o6ޖ~oeG7<jwwewH^FvxdCyr~m{j!kň 0 Wpc sbP'w{ hc6bj/ʘ"Nh_&%D _0fy`7.89EB\bZ]ߏnZ|}'ܗ0'5:G!t-F)bY'JveW&%*)J*|ϫ\vJB &Ҳ&(Zu]4*`X) 15 [ʛ9j1e}}M!li{#YidS-2[jDg*S2<(h(qsL[͍"HE&6i5dk4<jWho$q<<ǣmdoh<򗶜-i^_Ӑd3^(eJU9殆,*eY Yk-A| dk{WN֬YflItq6x :8A\q_5Kn¦yB 9 cvzpެʊxEyՓ {>dhi ^.;N<f\iV,&SoKٿ,-w*t h4MuF ?{?|+'.nLa8Nۋ_wJc(yb>{ޏ.%܊8TηI;MkŞWxX沷-ǽLNoŨz'oŶ%?>ͳX7ob`!KYo8oHrp}L6$0^\&}sv&Sf\u|f+x׀DGdΤfyGf|{a11rhb0qX08b8CyME{$4xhGcPxfU_!h%So _6w<OooEH\ YEOhȄƒEEtiUB(I %v/}mSnasU76PsP5tY;$n&Qƈlֈx7Dxe7(ۖSƉ艟Skh Cu:nȊ88(FsvyFJHWqJHhV3<op| p6bQBq|6s׌'0х|5g5yhw5$syHkXP<ւ7%͗})(`Md&7rȋ8v_\ن&}dXZC%C.|}{X/o"fvyyu7'txg(1~'9ixǓ[(~_w,xhM\ƃWX`sAp$aWS}Mӑ1ƕ ȋ}4`'Kx+x=>0G/@+ZdPQc f츐bG#`YFaap9oghCXH&IV)oi BV^19H1cj9lWY9Hmɘ )(ɝ)c:䙝RY a칊8 &D3VɚVMӱgi_fV.fd@6Ep2T Hי \ev_nH[hdfV?wJ[X&6,G`aw+Ʌ^VGC_ףu툢d$`T'ZMu84Pvg@&EV(zG¤7(xgwZwǐ$];ByMكtZz5x;iYW[|tK9Kh=tҤzsicg1ƛ)w=T8d]mʣ&:!D(nj硆)/z^U/ʦ%Ʃ'I:pW3¤jq~!I\@#kY0꜏5)~w|z|DBDLb$Bd:T2L2TѱH*T'pVE\Hŋ3jD0Hɓ(Sk*X| Ĉ.UɳϟX)3&ȘF*ɴfNPJJuСDo&q֪`ÊKՖNaʼntkRKʝKݠruۥO L0ϳE]6ү#KLy!5mM*+ʠC2ӨSwװcn-۸ͻ߯vN+_μУKNسkνËOӫ_Ͼ˅O`/?h 6؎F(@Hfxvᇶp$~(bE,0(4h8(c:}^jkA.ꮱګ+l*v@dy,"'vk,Ȓ+.F;(첆 ~lֻj[hm+0?i;&j)l1>/ w,q1,_r<֒r 1쮉'K@ϖOmˬPG](Wĉ)h}Жy ҈mp-tmx|]7ڀfچ'Y/+5䔣xg.w9^RI-褗c9@AN.fn;GDXz#P?2S|XUWK<VvOoΌ{++}ރ//ؿb0FCpϲsKtș62V)UW/}\ZpO} t[HYԏX0ٸ4c,\8 uE6m#,]qBn0dD$DHE"d["JljAV9jao Z <<.q^Lb@5ш;YC*qҫ(e1d1<#F񏆅V5*$r"Ǘ-L038IRύ#&57q(Wwpګ .H]Kf;vO$e#SLFЌ&/jNJfz9L:y7qJӝ<9IO ͳ\=O?ݡ̂T@Ѻ9mR8ÛDq@2@ R?H@Q Ytt EA 0ԧ=XPDz:bja1Pa` `ծ%p hp"AJMS+TB$ Z`& L}5 B ѐX,ֶ7i `pW * N! &2((L%6*I[‚5ߪ>AR !*ljR@gb/N\+195blwIYƒۍv+( P,*Av"2 #`Do&Q&ΒxL9Э pd@=&0B5f@%8YȆ ^g`1}ČZ 1H r 5AVP` t/CA~/IvWd=snq5m3f'YfmjަbM-r_@(M v%۔%YFEG6! Ԟ)>@*H &pXvw񁂋`jW>|Fҝ79@4 `SG@8@@m񍬕"פ P`g+WCp\}!G`cThހ`|T;O Ǭ:3Q<'Sp<7Os룥_2T?~4 3 /6/ G~~{׀^a}l91Za{" HȂm'7(H36Q<~xDHCMXQ(@~DGYX1M&H~ MKX,؅pQnSuNȁyZxs؅؂pzȇ>ȀhvqHd؆9r8ih?x~-艄j.؉Xu!HȆoAs}78(oĸxRt؇Ոո~88˨T︋*X0،8'$h_xP؈!Xbؐ h聎 bc& +I-i 1yr24IDiBWHCLPR9TYVyXZ\ٕ^YKٔHbIdY4yhjؖnip8t9}vyϗz||ٗw_9Yy٘)9YyIЙ9yiٚ9)Yٙ9)IyIٜЉ9֙y9ٝ ƙ;9ԉy9ٞ9Ii)өi) ٟJɠ *#*%ʛ' z^> .` 3땣3ڢ5C@ʣ@7JG1ZFʤH?Z)N9 Wڣy4 ^ڤH ٚ.*O Fڥɞ3ʥnjo\NJKzOڦC*zqJGVjh*QʙoJr ~pZ_jjS:u ^IZz꣛ ,ꨃz i:jJiwZ6*ʩ:zڪȺdJQJlqzL*v:ʬʪúTڥʪsڨ :蚭JJZj: کڬVJzʰ: 효j˱隮h*zZ ,k-Yj:_:"{6Jʯ?;*[ ڲ<7YY:=+^;j*E˰Sf_۱j+[kz]taZ0 n|G˶4 6+1kj+kX9겊ʴM+ y[WJw ]zH+{; k?빜[XK+| <*\[QK(eΫY8Kq;|{˲+˽˶ڽK 뮽` +ͻKK ʻ}[[ۮ{S {3kP;&K/LD۾Zڧtr˿?\+S[{¯+>\+zJo; ĵ{U+k|`\[zt+zvĆyڿ^,Lp[m쩥+kF+w|HlJhjWƎg|` Rvm+‹ʛ;˝{<ǹ@:LĞ2,˶)L ;ț_\dofj>V$YFj&j6F㶄//NK%6^ 8m%5ݵpDN WNj~ab1 Zos.^CU~^PFvjj* ͆Eo-NpϦ{Vj]= >sN涀;~H,g @ nv絴_o[^C'dAjI꬞V[^GvHN@njdĮ跮>H}oOQ~.Ej@Ug]uߡ.nNMUNaNž~dq~ݾ.N ~N>Y&o$J|n(/ ng̀/D#n^)_|,/Fn<^`n*gۏ~>IVL^HgFQ7_[h2 o(4_d&#C~H߮jP_e?_PN፟cXoT])eo<e/TOt~.`opܩ_/ q+>Οi??묯Ka~Ͽ¯z? ^V00@ 8HX yXXy)9*9ʉxyi踨*j)ki8I{xj ;L::]Lܻ*LKi=N^n~n.Ɍ_._o?I<> 1l:v"Z8Ō;~ 9ɔ+[9͜;s۔MH|Y.Ꞡvx캹v{wI;{Z兊tI].vr죨]cxK[O:>v3O/}> rR57ټ,- ( f0Ř2K4dI8R`2(T3#x6"ۙh!6 vHmͰM-^X%h$djM*Rc5L ٬  P"5RdДY֤6_VɖI ygSgO#!NdE*Bix'rצ3PrZh2檮i'9ʈjk~j"+jx4I΁dsKy&vR*}樱ܪ 歲Z[ *zʕ hݖ'/*Kml߿nFS *78!~׮,z$ln;a:8ng++gq;0n,+CKRI1Bʧ5q3QեDW0QeP{-(Z !*ƊcFeGJX@  d\7.q8^<HC\Ȳ?rLd:꘱Bd"Jb{'? Pr,)OTr $ eH$@jYY2Жz!ytIKӒ]}bFQ$GebĤ4JB:4pz0Ma}5YEf-P-b5 ;zEF>B /(0xZçUsaD׍~h ݠJnݢ!(0JC_np+iZ dO;g#q1C&f'8Z.ZWUSW{U5ͭXCVǎ/{#YAoC'ERLIh0;QPa%VS30XkvvԠ&SF*_SH. uzJ K |RA4JCD֫\YWMi?IqrM潪)/w*LUb~]/q^V6.Ş>56Ka]H=Ё]UVk!B@̹~M(j営LCn٩)mR^:ݳRO)9Y[QY b&'%.L[9/ ZŸ oh[o3%" t#E,r<]q [oUè abe!ot0{;o" 扎WhJi~m۬~b&ҕ)u\ "-<r^yjf6c9jdnoH AitEqZrՒrn4'VJ`0xW5 zvX@A5jmԾTpV!(L_:ط,VhM,q(Dvj)^L&Duw7#o%3oTc2 -su> A.x[tGs )ZΊ?8+.܋I g;Z|,o_\m.i7mF:izq=Bjfaqu]ROͫksCzo,b?_7B:. wjP>F}]K>Fe"\wv%.+(|uT-d{?U[J2CC,H6#*4Z̛aԞMOU}YCr+vWuab\y0l5tQX{.{WO ~f;Xs9ϧp 5GZ6r__S.vDeD(^)nShFh.0Xe'_~ǧV97FA]ׁgYefǖfr}UFxlWu4dM6wgb7dm=^|e}8kf-g1xb{"cHzbwXgbK l3aa%b`؄wRH9EXo?C;xw(b$kj.X&WCRd[fГ}* ]jg_DžDzG(QvjwB=7V0,xB3bzW8OW1k8P^=(piHuWhhh;~6hCeuxXaȈI؈iV֍[{H{eVEx bw$G  $wd,8$>v>i⒆c#m)XnS4y#ncWNdOƌTm(g.x~'YuHXvNwtglt_q5uqSyvEYo\fgo^)%g&ontHv_sQvaOh`I6MvOI3 )Ii]iɖvxt#lniHp Iie)Iui<;ǔIWuw97 ǕqMטYc?א/oߵzNF} )lyr |4xR>PijyC'kdj?9A8`-6iixՒ+BjEy d٣?hcwhf!!{DEXTljɍ I0Cu\<EYTeւWI[C9}ZȃYb&Izk5hh]ih~,ux&ŋsfz|%WHghg$:etAMnw*eV%%Xzy93ȥ6\!m3~.*XHK\@9QZk(dQeJlb61ʅb[r*|wF_-lhVZ**Fhٟo\;fr}*K}#BXEvK9ȍkRsktj8V4h(sj iEQS*bAalũ*9_[ʪbv(ij?ihz3Y:q؇گNifJ^y^ei5Yi{ '[aj0*@U{:ʰ愧F6Es+ASc~׌DUæjVp&#'Qݢw0)kZxk͟;^PbX~(/80 MI7\H1a{C x-Cɣ:q/^HƵU'ȓ_fQ f8\HHRj"[ ψ;mӫf skB&21Y 5-^cUB:ͷށ&X5 yǐZsst5EEZuß"fՄ h≞x12: H3Ȩ"Lѹ(&,PF98RViP\vy^)昤Ih9jl)W""x|矀*蠄j衈&袌6裐F*餔Vjzډ馜v駠*ꨤjꩇjꪬ꫰*무j뮼믊 k&[6F+-Nkf-n+nݎk覫KlkJo￈ /  pÊvp @gp y!Hrc8\j C0p@m4w@2 "%IrJd{3xܰi߹6 oͰyrwJ@~ } 8=\z^#w3{ nj;N 8뒞sӎێx}! 7|'o5NS:B080_wF?= "w#M?ѭ<2~gā OA'-d;$6Llx0v' r΂%՜&<xO>1~0!.]l?sT; ~7]`mmk=L1c.0aXp=၅XĜ,5]hX-f+d7^ruLehW7SHf &Gg&srb#p7f˼f=Kym4e g~Pp7b19՝n#gOǂ4w\hgRܡ2 0kԨ+;}C걩ǺjVդwtb~rf;Ўζn{MrN79| [TƎw۝O&~Gx.'Oxb!.{ȸ7{ GNANW(gNۼ1w\9ЇN}A?җ:NԧNuBXϺַ֫s`ֽ.C';\nix{v;O—UO ;xo<'OyK{GsOWֻGCD'iϽՃ=O|O?;;m+); -/*q \v”4(1 V3$('`2.0D#Gݱ4a}za e1F!uQ"_a!xEq!/D(0q#"! !JaaIa 1eȁqqhQp`HH!~ġ/v(uA~(|Xh{q%ٱ>h lȈhhT艊}?)Ȋ񰈘(" `6@ 聍Aakx8X"r!"؇2! (!H2_r1~xwؘ#F# ؏1'}d|zJZ $?%*jLJZfjҚBL vP~z pƬ:ZEjOgv몫 Jjz?eo:֯y `jj^JI>j:[ꚲ٬ʪ*JЪgjyZ(,!;!b+.{^whk}*g:# ZJgT[+@fʵ%f:g\[FKjٚZb t:-;W4 K D:a[jf:jڸO[[z/Jtk Vd0ycjtssK0 5*v37Iһ:hP&`ü:BmfmV{蛾껾۾;(K,ܛL( /l:|F| l. +r<\|3LlhlW\h֝YNkMɝvx,'FduۨV1ꡚI:[L_{@m; {ʫ, ;ˍzs|,kɝCE,\O:ZyʴKż |{_ߜܰܦL;3T\ZgW[:鲫:\)e̶7˶KZe;+kZ[tl,ˌIg8+/+&=l=ƪΡ= mpd] Z],tM,vI̠$ Ш\ Շj{Oݲ<;Bk=wrnj˟#=ǀY{׍Z CLyΒ;'ʸJ;,̷+d:"~b൒ ' N+ .?|&]#.%~,Z)~.+2>Y/n.1>8~X5+(7@i-H(?HnW;+HL<4;sI>j|JK\Nݍi;#]aerPvGgj>B()nNN>@hN~Z_.aCIZ>l渒;Ԉ~Vn-,瓞9O}S^ꢎ.+ ݑ~ꮮU-8R뺾颩CUCʾOήlҎ.w>*~ڎ*پ>*n6>,~>)+$%*8ECc^(ʩsz"R?%R~EP._9Oi(SSț5o(xy5| _QswhFv)L~P'o`t6m?DCTKe8"?]I JoLDItIOFHܠm9#Z&RFN#D_?^wkPxFPLm?To$Mb? vm$m`%eXVhk_n$OSIStB@$'_{}OYFCGa}Po/\mu?z뜯2:[E_]LҥOڶ'GcPf)'h$'//m9ob/ž(_@ ET.M UmeVm[(u}N逰1Qqp3RP4Tt5UuյUvv2wX@7o8:i9v{ۛR[|,<]}>Z.?_`@ 4xaB 6tbD)V'%LF9vdH#I4yeJ+YtfL3iִ M;yhPC5z2QK6ujTS3&zkV[vWcɖ5{mɰiٶun\kֵ{o^tp|6|qb.7v2YƑ)W|d̛9wRgѣIw]ujՆOvֱi׶umݻyxp27~yə7GNbtөW~{v۹w/(GAxɗ7}zٷw~|׷~O <\|#P - 5ܐ=EM< Q]|e=iuܑGCt< tO&%0(S*+)t  ./ς&-$/t38圓N)Tl < Od@<.)XTE,x<\S $ J8SQH']S4*SRAXe= aCĀR%wxWqTw])Ǎ@` cdvQGK^`Lل]~ m^8)}L_hIMG PI}U9ԔOf7樥A[7mN?etP|HZ\u` _%0ƏB?T7(%2쌓ll&Eq0)XAaHЂA~Ix )L UB} pG4CADE 7  Pb$aJLb* )tE6C1c cA"i,x3OH=4#FCo=Td4$>ޱc&yHO/3!8I>bMb'3S\'i&\% 0KY^ҏt0Zd._K%Dc4LkZ $iIRf%9ykc!iN`r$ ۉGc:[K}Sd?ZmԠ 4"P>UDW!F9Q~!HIZR)UJYR1LiZSTbE@APZTIURT>QTZU^YVU>:E2|3PZVu d5ZZWȄ$>jW0am` WUb"X²հqX^-}Z#V#mJFKdiA"Z kaӖֵkw p1n;C@;>%5pKۍHWtgxnqs6c\ oz9[w孀;󪖷/k^~f&0z]zYkZz9nF_彯9C4qwcX#?毇apF \b$Cb˘)΋f7 ٷEqs,VLb'ʭq6&Yĺ5p"k-Z]fr?HC:=st }8cҚ&4'OGzʝ4hhv#dK梷қ%mK'ƴ{lxϥ633}efϨ>v!j.Bb\_osX%fsjpIlA^7M:_6m}l ;kRpWn-H%._TgԽN'Y~1iM9y{:c=˼)9љ`>5/,S΅<]lۭdWWrulg߾׍c;i}ջۻuV{+7mO$j4;oW莰a Af3|wX4n}WVz̫?yB~}jI=~w7r?__aO_Ͼ~͑G=y%wO$w<L.Lt j MpĤ,,0/00ض׺^.؄ӭ ,M*Pm-L0Ԑ0LnL ypҀ PW-0 ePׄPM%V KBf&00͖0#P /pN /P Ͱ qpӨ/#V:O0l-PCВ w{T15 @ a=,5ɘ= PQO1 pP@,~-ޏ 1`ɍ$MMq/ oԑWm-/{kQ!ߑ., G Q! $o<12RnVB n$(.xt6|%ဒ&Q)YPŮjA*rB&$+M*RR,] +2-S+Q)o;%+,]2b&Њr(3F./'O1&-0m%010.2,-O-4Rs8R*ʱ gˆ~56q#ױzOEo4M02/0q _/sp/QҶ9Qךqp Q-29p9>T:;M2όBk@ 0p$ P:EsBkR>1C-nT@tHMRTF ǒQc9Q=st1-3t=!rܬZ)!/ ԹxlR"_ odSEtPMT8۠ t),U21'؊8#O.QcN$'-(?9JC;U)#u6UJLo_VG5GkUW#VAuVwXV4WXW#WUR"SYXbXeuC)(6LO5/.?3Z9u>UYU2n1C툴HB3 ϳD]UU.3 35QO80aM]55Q6! w4;5\Ua Yr`ѯ`ϲbc40TgFmLEN=!ߓfƤtN]uZ}uCitTm?)QiCv{VPI@ssGciC - QOk5Y/hY9TB^qQ^?4?mgUk@smO p_DCqpiujGsoPir<#+D pDJ='gGWUHqhwXV56# R5_4_cgqNsNUsFUu'2B7b+ֿucm!6Z3o51(^>kbev)x7Tϗ[nݗ4w+WS~vw47~9ͷ2؁#》'X1"Aّ75+5>3[9-XNQ=R4VG4O/2M8]#8WK"cmۗYox0 _V'Wx~G[V>|SvKTP/׉u7%{ S1v90h}mE8"#"]xcAVCQ32*lxw]ueGw8-ؘY59' 6;+=YbavOy*@ٔ~{x\Y"oóiU/_.B%2w6Yo]yI7"w rE9(6gOPw yhGI}8ucmq(Uth rԕI6Ns Ś؞i"yl0\'/lף?uq43ew}_w줹1;;GZ)"bNMz\:bWX q:+&tڪZ'JZ&ګ%Z˚%ڬ$Zz$Zַ׭KR١mfgr (z'v9jv۳o;, ~:: 92z1ЧٹWxɭذb3mByseTmeWw̶SFja9UAUkSv23ojaVsxډc+fk n/TQ1}/:-Zց-b>wqiyLw6ٌAW ~xZ{AT2*\_6y1\MROR5VZ]֒5y7pܪW\{|ƿ}LJ!ۺȓ\^|x%<5v1P L36O=|EEQ`o[oU&s<3xd;x z4W76M[loz;ϥpoyշ16Isc!WvmD)=z;YdS\/׹#qbE\<(q{!kգ_V1;h{ o;6M='XMRiwx}|g|xIq}u;w̻"C5;|4 UV@Kӊ1vP1 T& o?Է6}͏糍M뼣ŗM =KOZs]om}Vz]MoEٙtOH݋ۥ^}x~x#9ΧkNQ\ #w5o}~[ރ#>Aq?u^q'_%9ߑٟ_uCKB!bh%|B)jb-€l.d7`#F=1G %%INRVZ^bfjnrZѹف!!: Fv }"ʑvE".R6%rjO/%#.5}v3V{?}ϣ (p  S뇍?@pK+? )rj-sO=[`lh.F/i>$Ϟ>4SoMEiRNBzNTHf%R + Ue A:v-۶nn)+jQmͫw/߯r}/†k:ZC,y242Ξ?3QL7ѴNz5[ˣe\hKέ;躂M/v祣zݧ^;۞{ަ_#3߼CS_cs߽߃>qh]䛟_۟/ *0B':0s+% Z0+ ;8!z0K0A [0jh0:!{13h#"1J\"'B1R"h+b1Z"/1b#ˈD"1j\#71r#XE41z#?2<"iC"2\$#B:2$%+iKN$';OҌt@ t@`#2Pb,e[2%Z.E0/pD FfDf6Ҝ&5K< @fȀ\@ &K ,Ete!g.g+<@$(Mr h@y|.sg8Jўԧ5+jыb@OF,e^Nzγ)>Z4&@ϗ&󤵤L]ISfB*QCZ ti4%2Sdf9@LqF'+ISbv'6ʭ,ufQַ.0ߙ"b`@0uJN5(_]MUժJJOuh}gb/Xf,gIL(2EҴv]";!PʤBӈ =XǞUjnI~v.q;F*fCǹrJa>e^Nx*v?j7l)U~ hCJ.N=,PkZږ7x _׶]0\B2 ,x%,Uʳ%nK sFS U.=(E!KO? ^klcjr1{%X;1\ 'rF^2&C9Rv㓧l+cyU2e%nbq39j^sQ79β3l;pt3?mπ4 gA:ъ^GC:Ҫs+mKWҘ&:O:Ԣ5KmS:ժ.6M9M:lvkm[:׺5{_;¦b8Xk_8d;!_}8h[dv 'nm6&;mPҝnƱkf-o6kHL> 9I@~,1MM8ٻhw-A_øa['DYڑ4|T#! `9cn:P|7m6m|XhcX.&ȈFvM.x_{7sR=߻;E6Rp+5(!Enx<>t[8.#Ez{7T[?FO2"??O~c~Ƿ?UDҿ3!! _>>B.vx])M <[`}-] ϥС ɠT^EYD d` ǩYaME0jlB4Qj,! Oڐa@aab h!ġͷ1 ">8$`b&j&rY V' @"مb)b*Yb+u+,NN,-ⵝb.b/.b0 .01z[1"22ɁAc4J4Rc5Z5bc6Opc7z7c88c99c::c;;c<>c;PKv88PK%mUIOEBPS/img/web_name.gifrGIF87aWڴΜҤ֬4flԄ̜䔮ܼΤDBDj4̶ּļlδĢ|Ծ̮ƬҼҬƔ޼”|||l|ʔܬ´δʼƼĴtļtԜt̬|ʜִ,W   H*\ȰÇ#JHŋ3R$ʀ T4Iɓ(S\ɲK|<͛8sɳO>"IѣH*]*L2JիX%p1ׯ`ÊKl<۷p\r`/x˷߿}Zr+^̸qCpѣ˘3k̙N{; UӨS]M۸s=e /F5_){s HMνD=ӫ__^A'\N0 w칇[Дp5E{h@*MPa(&@ T(P ѸχF @ٓӽl1&G>ɤX8D<㣐\vI]Q$M6yj ^[~ix>dveh)hy1碌6О.t!RyX&> *j P8dj@<Ѐ# jj+??ViHUX1gZ*@Vhʡ^mDIñlHs`OjA3oZlﲢ0.n@p˯> <(7- FN Lr̓\0 .[rJHDCii2Kf/ԣJpL^lģv,աioMXJ)}_pL߀.ބO E-׳NTKT`ꪕ+pyJMO~TK>$lJC;ɳN݀/*v5aH$7G<A19Ȁ]'>h6_:~~/;oӏ~3`8JxMhqІ:T1 }D'zR=E3юd HUґ))JW҇0iA^*Ӛ4HNw@;)PQHMRԦ:PTJժZXjFXJֲhMZֶp+Z=UЫ)k׾ `KMbX>^KZ,f%լhGKҚ>{ОlQ[W1R, RAAMneSkۺY m6ceD@ø xW6e5 'BG HC&J  kV+e{D#c AuWD1pKx i l`lFvaF&P `@3w˒Ďb( r` c;ɇ1uL}o|$1? 2YSnbb宆'\C8F vc3hNpʷ%K6m|2 yXӠ7%BԨNQP:&XkOֱD.w^Hf;ЎMj[vkKl<{$wroܜ(׽Nݷ27 y7}_$N7m'Nq[axE~-/7o)q<qF>MWr81)[yr=29j!9 -Hя+1Lgp @ ~u wAԩr_1YtS(p0 ((uto5W=:D4vD`&j% ~Q]}A@ ~wT׾PѤXx=e?{^1>}:΀M>_"P}7~ȥW g_l~+UrjSQs!jhK xi Ilڶ؁  gKW61G+g*؂T.&2XA6:؃> BXAF3NAT U&dXfxhjl؆npr8tXvxxz|؇~8| p؈ W0؉8Xx؊8Xx8 |%(88XȘʸvH^8xؘU؍ȍ8X((明긎9XxF؏9y9 ِY9yxΘ"9؋y0, ˀ0i` c(6y8I<  ZXP^ؓDy3 XLytMP0M98n@ZirVIPj[͘S by֕ehٖ&Pɂ9a*%lxYfp#(%wc{y//#1h/D*R1'YVp9jIpIF,Fy`i`{,E#HcEYl9^60+>*٘\0tUB,PK? @֙ɜZ5ERdBb/#CMA 04lL]AI4ٝ9%*K@d;T#$C˔* 4pIjYjN١"zX N!:(*X%M'.WԒ2 $/zH 0tN|ldLrĴLnļ̴tvttT~μdd\\ttԌܬ伺llll||촲,MĎƼ G>LV>LݶH@X ;L‡"Z'B#H~Iɓ(S\ ! dI͛4]”IH@ JѣHΌ3qJJΘPCVuUZUYd/1zm˗Xղu2GCT|פ*K>(]̸c@$eÓ-U|0eQz :tч6o$[@t``m}ȓ+7 dwo;šGnȷu y^3<۝&DI%_)ϙ{UU}K UQ(UO  >\QSw~`|߆X^I(߆#!_%!7"}x"]4-/=x3wy6M#}m(p`|9<:xb:iNo.BWߊ=.w7&پ0P{ۻ;λ,>=|^a᚟}+6Kf>![n}kϹ3TtUъaH3YF=g Ҧ3Lc  m9ol{v¯0k<7&Õ `_7?9pF3`kw /SPmh2*rnH\ XD'FO+Ùwܙu]SAFALZ%4 ݔRR^X8xF8nsԗ) rВ"#C$IΌ~Ԥ?i.*^J)/ё9TzxC)+鳣uB0ci4^6 s (+d6_Bnjy ؘ;` D _'MZ0<1k :)JdfHD_S\[OeʳdN[1 %8 m$59e 4fY^]W>K%(׸EDj"ЊL̛I7,wyT!EьDES}JmX'T*nP-i8ԭj*ih꼈V#ԗH(5kaW@鰈uL 6qmln h_. X"3\l<@1*B+mpD/RʦV,g 'q N;׷;TnL^ŭfZͮv2]V74wy]wG.z^"]/Nt_ܮ~ۜ-o`.yƾ]0#,0 3^=qtu0gL8αw@L"HN&;P!@*[Xβ.{`L2hN6pL:x>s>πMBЈNɼE;ѐ'MJ[Ҙs3N{ӠGM@oԨNW]i i{ `Ͼso|+~㏟챯2 ֏fCcf2߿sW{qkxq  }^V؁$X&w%GxWvgdFg2e6He;=8BqpH(G,x(K#SWZ؄YVx^XqO(gekm9'xHYƆq>xxmH~hnC ȁ(XU3 \8xGXJxŠx_XJxh؋0889h~xtXʈe;ȇȇƨ8AXhhȊx x]*8Ȏ؏؎ȁȏ Hˆ 9ؐƧHez( y؇}HȌȈ!ii-#"9X:<>ٓ E G9C:1-h|L9LJXiZI\ɓK[iWcٕ>TLPse<ɖ]K)ň%,ّ~9}0y8,)|٘396i`YeEi_FjYGiYi]镜ɕIXDeqsYe);YViʸɘ IzI舒yuv0j)Ii9w9Y$Yɞ㉞ٖ牔YW99 . i2ڠ.IعiET/dhTig٢) 9yIek;@I@@*0RwBL۴NPR˳DkHrJ+U{AWk4;d{g "l۶npr;q;$P``viK~;[mkx[Ʒj;\Ƹt+e{fpq Pl빠pKv7m+q;f 0[{[Ke;[{Ȼ{Ykؽ\;ěΫ۾[ee[ˮ{Kۿ|v-| <\| "<$\&|(*.02<4\6|8:<\-@B{Mׂ*n' N %.׆ 7-lߝ&5#X~gz  ~Md*~9 Xgbϓbc im*~~g݊|Sf ߀-n^^w̦ݣj⿼'ܩ\"|}ƶ^ƿțN^Ȟʾ|.>~؞D\^~<>~{lf?_Q, < )_L" ?&^(,*02_6?4:Ş<@>D_|ʽv_‰\E‰~φхѬuouĔȉ{Ly_I!ML/?]hϡ_?ÏѦ? JR-ИO˸~O/  HhX8xXHIX *:JZjzj : (x)X jK;yۻ<;Hkɬ{ K}\\[ l(> /?ϩʚ~mO.,}6 L7ټg1k} Y!BE|omK<=P#h$ˎ/%kpHhs˜!"/ҥ-wք%KZq姦 a4z-$)q*=p些*ړd(Wp X׷NɡEW;ǔ99̓7{ SdzCEլǖn ;6Ѳk۾;ݼC <ċ̛;]Sԫ[=Ѫ{>˛?>ۻ?ۿ?׾h H`` .`>aNHa^ana~b"HJʉ*b.f7݋2Hc6n:c>rBId4iddN> eRNIeV^eZne^~ &<"dPbjfn0ffnމgzi ;Igg~FhNJ)ب)li> EVJjxb:@ ,PM0h'Mwi.bӡ<5TWmb[3#[]1@m_q]s9̎mwszb@S+@V[dW$޸jRlۖ/g8'|zꪟ^W}G;gf|,6I~N >^k_/%nދ.pSoߊ׉[Oz_> Rp0 l@d64؁5"$ fpfpSxq!v(CL"(JqX),ˆ^\,c`„4qllG#qt㐴h^+]VΞ!P,1?N , Bt ht j|,pC]xm'2 xw仙GUqH͢SP蔧dS:Q uʪfƸ)u*LjԀo]=b`=u{ifbemOOJ-e#['<岷 Yisؘu8}fZߙ%cYQ46*q=K([=5}}pV*ue r[\Qж;sۿM.]IG*X7eYqc閭Zɍ1]]qI]>Ի'vAz[5 `6x|s)M# EX.1 E/ f](WfM"K++wqgk$?db(Jn'XqmkN*WٜWV>))Oyl>P#O5'Im囍g9u坋g=}埉hAn 4XєmLkܴ?='LzԤ3[Tzլn_ Xzִ5.K\OZ׼;`  b#{΍ hҮAkk{ۡ6 Hx;ˍni;L[u{茎(oz뛯feT^x{Gx x$>q[|{wJqɑ%_s\1\5߹Ϲ A?X+QI_CK=MՅTkOQߺ韰}d/ώ}lo;PKY`= 8 PK%mUIOEBPS/img/iss_edit1.gif@GIF87a+; @@@HHAʂvaaWsshðɶDDDCCC݃ѽnn_::1WWK33.!!\\Em{ɗ>ѣUUBssY??1řr~~beeOyjw$VM۸sZٻ N)@X@8УKN: 8ν ӫ_Ͼt @ᄒS/(hg& z|Vhan"x҅ ($h#~qZ0X-h84\ZӚX> RԨN5D=J}d`MZSֶε] 3g bB>ݠd3#@h[ߡ@5 Ts(`hG  Wv&r# @~N>. HH`.qsx3>rw'/O\0]Ns5us=G9·sB/ҏ3Nzˑ>WWz̃o_zر>v\/I6 0Ȼ~wGx+<'1y|3OΗ>Wz֫zڻ%/z텟{_x,`3)H0Ⱦgů}G~?8Ȁ ؀~ Hh(ȁ(H'؁&WqX284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxXL|؇~8Xx؇y؈H{8Xx؉XL ؊8(HȋXhʸJ8XH#P(V0M(䘋x86Ȏ(x娊HY1h؏QQ0 ِ9U1UO`xhX VVÏXRQN/) I&hB9*؏(Q,y0ȎZP[ُTi O)QYRy9OM7YgMSH`D FɎ/'IyQIOh)HȘU9옔Y~5aُV{1?yh)M9yW i)Lp9Z0n[ɗ{Hști)y H٘9LnYaȐQ@9jQ@m SYhyl Qpyvz,**HW1X61O`-nR@A ʡ 鐓RSڤ:YK -ڥ,;Ffz^1dQh:tjʦxujy:qѧ~}I*†cZ~H*Qm::z|)mڪpꪲjm:kz kjĪfZZZaJɺкW*Z֬#ֺZ"z!z C aڮ:D!b 2 ;.Z  [ {m"{Aa(š.;!4a:5DE%NkB+>TQS[Z[L `b;d[f{hjl۶npr;t[v{e >v1?p۸;[{۹Ʒ᷀ A C0B@9{ԺKE ME@;a۵KF McKa;ˬ; GIHpS+;^~sJJ@қԛվ B1HP#+뿪 % C1I3 V )HL!5 —Q&L(,[p4D#KNMR J7W 7YU:BzE ;{ILNr,tcA[XvW|0d\fRh~˽ ⋿q@B=D]F=̫̾`bBi [;յ҈AXK-YթqbMVM,=he0i֋ t!x;t]v}xz|~}I[`b{؈؊،؎ْؐ( N2Pqٜٚ]X a `ERҦ(9ځ=pc_ٲ,A8mۘg}mmmӽ!Q2}ݕݯ}Qaޟ}m=cDr e }/] ^ }ᵋ-M !)kK2⛺߮ ;㴍F^HVC^I"( .ZNX[>V!=GnnA~jme^`>I>@S]"hㄎކ^޴ wgVC%.5 ~iNn^>qy&5nꌎm\W'1" n{\#1# ```>Pۮ~`1%>[<ގ~$뺞ܪ~znq$.~p) PL!\N}1*`  1) >뀮@!'@67$ 8@)=^R.1Y[d<\^Ё<`PS_*a|EO5,b)o!? o/+]ョyNuqÎ!F?> #NO._^+Ǝs^$ C՞싿_^qup.s!A@ D`6tQD-^ĘQF=~RH%MDRʏRfL męSΝ$40#EETR>UTU^jLj2{N$VZm:=W\ukq^n-;7_… #Wbƍ?w`;f΄CZhҎ%wye]n lڵm6y&ezd824I j&tI)SA*iR$- M7n92̐7t܀H4/O@?4ƊC'L%lG%5Թ,%;1M20-;USQ_u1M=DQVs5V_Eip w]W`e#a!$DcQDU/6ېUձZ ն\l%4]9TUNŽ\s{7_vWOx H&`F8afa8b'b/0>z?$dOF9e=_9fg9,\ҵfwg{y&hFz:i:ꝗiS7kk;L&v7fm!}离n;oV\5:B!" ڎZ17p/?U+c" *#QD$H#*q?ʁ>嘳%  % e< K>̅g~@P!A BX~$0"AJ`_ǿO)?@@@%A CH C<&-@C( DC d~! шDa$f;:ăIIz, oBCd (D o̡%tȌ -MяOܻ8@ P*dd IJ&/IH6}E8ώmQyDi кe ~-J5 w>//|aC`rƬ&IfvI+ehJ RHC)Tq&b9Kr)"R<1yГ2IdӞħ I2qkd%):T%(Er6gDI:vk2)Ifӣ<7JzRrqD(*CRkZdղ d0ƻkzlhYV\H!EmjU~omlWiXnuַHl{@ָ H{\6{ r;]n8nv̦m/ ׼x׽z^HI`K3Ϳa[_/89r3 $ܐ4`>{,!1Lv p|>L#WӼs :8k 7KX=Tˈ[C+#33") Aӳ(B `(,.,A<2 ԯj$Ǣ1jíK8;T||{@|x0C#Ë(<=CZ¼{A h DDL[DhD[SDTD-sWX̰dh^lP =ڭcd 2f_ FHŊ(ŞaNtmlq$GFrT1 Zw 8Gz$yt}Ԯabȁ$Ȃ41~|9÷ Ȋȋ0vQj0鬐-L ȦBIgbIqIjLӌKfEz|Ò`dòĦL SM9;+ z%4ΰBΝTڬMϼh!,P%5dBC3+-+OOPQHS5=N{=,z8->9΍)E:"ʬS?J5}ѿȼ!J',T&aSPTUUIrRUScD[\ŘX- լÛKAc_Ee)eeg%gi"ikkmmo,-p%*tsGuד (ֳЀw|J (|ׂyXx؉؊؋،؍؎؏ِّ%ْ5ٓEٔUٕeٖuٗ٘ P Hx % ڢڣEZ-Z%ZMZZZZګڭڮگ]Z [mZ-[}ZM[ڱu۳}۵۶ۺ[ۻۼ[[[[[e[E\[ \\-\\ xH@P`p%]E]-]%]M]ԍ]م]ӕ]ۥۭ]] ^m]-^}]M^u}^^ܝ^^^^e^E_^ __-_`P@ 0>&`6N`^n`>`. ` ` ```aa.a>a 6aVaf`ab#.bNb ^b!nb"Na(6  ,-./01&263F4V5f6v789:;<=>?v&A&B6CFDVEfd&G&JKLMN&HQ&SFTVeLvdRvWS^YZV\dY^eOe]>_6c`eb䂸df`fjnfMJifVpcgldsn,*K'tVgv*x(u~gde^cr>g(gnh',),d-htdzhJ~&8&Hgfh-xKnt~J~iKiiK~g,8jNFv/Xj{hdd+xgnd&ٴVfv뷆븖Ѐ+mFhꞦjKvV6r*٘>ldNi(*n6mfNW 웰dw~ykJvgd*n6nnm&W - jc)HnfvnY% &p&hKf~neƉNfo~WoonHIovǜhpBVppuI g o .'qaq-.woTqw_!w /"Gr0rK&7%O9'r+W*7<,`0z <5/W26A0874/C;sW:|sF5tR3/tjϋ_'9Ou3R̛;Sp74x):3 f/cggVe`8kw|vw+`hĴP'|dv_Vw{w`X!yLwwK HqO HwxyyVvxd񀗏x0xazG*"xxo֡g 0X (/zO{(OaZy;wu'cGV'πg/{'#zd?Vh iw y?{ wvϏ$GxO֊|Vo  yk}8~o!/go|cVי}cUWV%VzpGeu:Yr~1~RrU]}[ (h „ 2lȐB'Rh"ƌ7rF"G,i$ʔ*W%̘2gҬiK `3%DB-j(ҤJ2m)T:yZ2hԬZr+ذbN*چXɲm-ܸr5µt/\-\PĊ3nX.ax?l2̚9RHP͢G.mγR>5زaF^mwc6e׶b@2DH Snrq,'M}<{kW]n"F`oʾ=JypI$![HAXRؗiXgxf?J,qJ4A%a1v aW0H\6ƈ=߇W(DxH" b1V8iqIX%]@90DxIyb DDId$Qs"TyDZ$ypYhMrF^~PYK uhx%)Bz'EhF$h/ )I:CCi,뮴.q梴r'}**~Zjj. .b4 *kѰᵘ a+^vK R|l;ꚫnWkQ{ rٯU" B) +2Lz@ 3l%{LGf :E)k2~7_}ݧF*C-%9v}[ 7r_={<5xmu\7\ 3؇gRcrP&3M7-o9g9Ǘۍ1/Y7mۊkx3sA'wÚ𱻍|'[oiHn;;_F+}WŌ| ,J(A2_L2 j) ]VAb]0&ajXHFD#2I⇖)R8AHX-rQ4+"(1V"ӨF=h\#6jr#sE0+~ )C2_"bGGRq& Q_: Wt?MK꽝^cb)Uר `/'ؤpQkYeHSE5.PfOiӆD5G9#E`Tw҈Y%W*啟__d%KpV3щzH ăԫlWʟ (bgK۸$-оWrVmnU8A-mWs5 J]y|ltWkj캣-9_Kv oXԼEozi^>5KW%x `W޿y)֞ĚgC6$/w {Dp[8(! #,g0q3f,9~a ?|M}CeЊ~t6k}*~M&e/XQ -m ` p᮶~gF6Iiy[:i@[=ގ nt lYĕZ z JKw0< lnbsjn]a\0"qH7";9"<n_+YP`x>4<R(j)#]mPۆ) >rP:WcTIo׼N2}|C X4"*4j8g_ (E/|? 7Iծ?ǩDi_˯5G?T+ c׬)? {Pm])U_;mұQ_C *`@. dٹ!15H~q\  —8% hٝ`Jt$ @ HF`_ OGE^f _LaN5*`D(x JU!@!\R`5P ^|IT㽒 ;Ffߡ] 힟 DT # xC!!I  & a ZP|UaD]r߽}E0R.FDxWnj }1%> \,z.W0~"(\@ b@8*a+Q|'^mcI @=@>=9F:AA$B&An%TFTN%UV%H۷ueQef ِH( eK@Z%Z%:" \X\%햴$^Vx$e`F]f`&@% !&cʤbP՚dN&eVe^&fffn&gvg~&hhZfe&kk&lƦl&m֦m&nn&o&ZdY'qqUr@c*p'tFt1m_MNw~'xQPu&p ugx'{mTg4g={'~'hTgFBl'i~(r'}}"(FSS.%S'F(!gHN~ht'LH.| h( څf^>樎6$|Z`(Z5JՈh iF*B%fN)vTS^iEh$m)Y))ΩU()i)Dkbh'ja'.jh"V*2vjN*vjX*dfGn**b©*ҩ2iƪV**Jhj(j6+|2(&:(.k^h^f)F*}Ű~~gjު09^tzhp}y˿}]=6gkp9TDPbE!Z,#/,~UÖ,ꪚJN:ɬSIC,ςgJ+jˊ[TҢٗlkF-+r+D,J:FaJ-n+,^l#f,b!b".ܺΖ-ޖ%բĪVM|-b|.cx;m>N+{;.B.NnR*$nv.nf*.")^jզRnn.Z.FjVn/ ᆱn>/ oڮ A-^O,6u+~oZH/n:/+.n/rU//R.0cޚ0X&Sh|6pY<0E#0: n0 3DIJ0 [D0p OpZ| ci fqon@i"10)Z)q_ Ϩ~ W/v~ϯq'/p q鬩q1on*er!2"'"/2#7#?2$G$O2%W! o2B/7&(W`o(ch10*+*@2,s7Z,2rٲ.E+.r/0Q03X222T@10s32X@0@Ps57W@(|;3<dz<3=׳=3>>3??3@@4AA4B'B/4C7tX`( $<DLGt4H{HtIItJHtKtHtLLôM4NӴNtNNtOOtPPO'P+Q35R/5T7uT?TW5U_L;uVOV[uWcMWuXkuYsY{uZKG<$ \ @(0@8__5``uaa v`+b'_/c76d;6eOeK6fekvff{vg#gvh36g6h6iikk6l϶lvdmvnnvevoopvqqvc3(@ @\@dvvowvwwvvw{yys7zzz7|{wx}x~wywz7w/8378?wS[x"c˷ksxxw@tOZ@;PK~@@PK%mUIOEBPS/img/iss_home3.gif_=GIF87aFsssBBBZZRRƭƔkk1)Zsޜ޽c֥ƔJ9s9)Z9c1BkBc֔ss1)s119sc1BZֽΌΌkkR9)1s)1RƜֵssRJs!kZRJJ{J9ZZ)RB!9kcc)Z!R9Z9Z9Z1ss)!J1BJ{1sJ9JZBBJR!{k!kJZk{skkckccν1)!sc{BBks1s)!)!焽Zk1!kR)k9s֜JBZJ!Z筌cs{ν罽ΥƜsƔޜޔZZ11cJsƄBkֽƵsssΥ9֥cRR1ckkBssJkkƜޭ֭ΥΥs!R9sJ{kcJsJkR{!!))JJ)cc9Zs99!{{JBB!ZcΌRZZ1R,FH*\ȰÇ#JHŋ3jȱǏ CIɓ(S$@KbʜI͛8sɳϟ@ JѣH*]ʴӧPJJիX hׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ Lp. +^̸ǐ#KL˘3WFUϠCMӨS_uװc˞M۸sͻX'@ȓ+_μУKNسkνOӫ_opʟOϿX{\& 6F(ށfv (}߈(,0U1h8<5p=)Dix"L6PF)JiXfQ`)7if3ݐfjIgf1fr6yӝ hS嘈&騛uBg2Z(Ro:z:}:'Tt(=i鬜r+Vh 篥$jxlNF;JZ-^:譁i췿Ӱdž;*55+ -j.g p}lz2+G%{m}'¡L219,,l$r 'ꪭ"!{)N*lHksƴRKTm9'4':ME'-dk4nj)5{JU0z1%0G6?L"F:򑐌$'IJJȤ9AHuh (GIRL*WV򕰌,gIZ̥.w^ 0I\bpF~ @MHBёhSD'JъZͨF7юz HGJҒ(MJWҖ0LgJӚJȩNɁg̃%ةPJԢHMRԦ:PTJժZXͪVծz` XJֲ58%81ep\J׺xͫ^׾]MP1ẓx+`:d'KZTBf7}d-$gGKҚMjWֺlgKͭnw pKiQyD#EtKZͮvz nzوx|KڷT*~_5 N;'L [ΰ7{ GL(0G31`s8αw@L"HN&;PL*[Xβ#=x-hN6pL:s٠1/ьyУvMBЈNh'Si'͋z4#N7N{ӠGMRԨNWVհgMZָεw^zՏ&5/ь{cf;ЎMj[6<S>rNvv5AzE5nq/NO;'N[ϸ7{ #>o_4a0gN8Ϲw|]5a>lҗ;Pԧ^dϐ끎z`'9̽xGpNxϻO/;񐏼'O[ϼ7{GOz_w6ֻgOϽwOO/_񟏾O[g|OzԧywOOϾOۿϿ5 Շ8Xx׀}<؁ǀ8$X&xy})Xz+<8{1 GJL؄N7vTXVh}A}< ׅw1x&f7gl؆npȁ;xtXvxY8zC<` }{bc(fXhXi؈Rx8vӇzs8IXxq8z{<٠hHdX(ȅ{҈Xx~x؍HFxXH긎؎XyฌЅ_؋9xxzH Y}Ђّi9G *($hǂEȒ6y8 . 4ILٔNyFRYJOyXڰ Е^`b9dYfyh zQ9n)iÑYYvɄ"ڐ mqɐw6 # I9'XCP#% YTY'<5ؙٚ0Ri9̃ٛ~D1V)ygٜ gT&Z$E1S܉y|йEfEԉEFgbGY˰y{9멞7oԟrPy!GY'Wd zRԞ!ڡIﱝ G 0 Jeb5I77;JJ:ʣt6ڣ$@:GjpʢPy 1Z9TBHڥ4z&IJYJFazĤ(QڦV2;=ʥeڥx*E*f2dz iڤ)ꦈ:߹rڨWJ\:ʧGJD`lxpꨤZڧzbʩSZʚʣ y::}vjqr|JkjԚJPکzPъTZ:׊٭9ڮN %U ʭꊨJ Tc ݰr +o ᰖjo ,hٱ li쪱*W'+˲2;/{:<۳>@B;D>6{<9 JL۴NPR;T[V{XZ\۵^`b;d[f{hjd{Hr;t[v{xz|۷~;[{۸n#i۹;[{ۺ;[{[k;[{aĻ @aҫ{қ_G+ Ľ++@[xk <;Xۿ,;8S] ׅ'L ,:L}"8)x()lŽG+26|\!<< 8%6¼PC E Fx0\LDA;T<6?9\B4xP, U~s8Ae">)= ! #m%<+ߣ@.085Qʣ7}˃'fbJJ HSߤMӝ(m7jڱݨ=-~ᏽ">$^&~(*nc n}ң ۋ >ѣ +^F~HJ> 21n#4ML\^`Nb"SNUapr>> `h &R>ɫlʝ|曗Wt芾 O]yƖNr,Gn>~~y.\ȁ蚮y,ͥ ^Ny5~>Ca >^οھ&fnȦ.̞ynߏz^W阾ɗnyN^|ì,ɮN.._GNA1?$_&on._y~4_6_)w87@~/LN^:o @!O\JN_V/XZhj.EG?\>qkx \"r/y>?k[yOMoZx'Y"xtv/_NW_o%ȟ^>RRo%Ο?ڿ#*/-?Lyny/y~J%n}xoϊQL@ DPB >QD-^Ę0a.RH%MDRJ-O1gSN:1OAΤLըRM>zT)ѭVz5إaDVZmˑ4śW^}X`9zXbƍU”IMlڵ•na޽}\pt\r!'K)gmN~:ֱ3k6 ֳw/cݩmi㞻xwqǟ_~Ǜ0)h#+@+:.#ĻbB e=? >DOD1EWdE_1FgFo1GwG2HO@# !T-(%2=D2 -;1LDDaD3M5dM7߄3N9N;3O=O?4PA"}A IE]L蘬lJ |4ըtS 붼RL7Tl&W_5VYgV[cmV]wW\}6Xa5WbEdeYg#";BQkEQmK<4,o$[,lN{r:Ty+C51U bZhշ__~&Ձ F8a5Ԡ"8gXy/X-0ژp3ԸK̅=ddSVh]egWiVbՖ2:h&hF:i0ނY٪j殿 zxgbfm j&]n>9ogoF=oƙd<&WiA{M~%`{Z x7xU4`~K4n Bt5Gw•o/! 20a6M7AU΀F4>0xEt 1BЉ_TB*ą1b7Co:MWo`7ϱO#P(DUю$ǧlD A`A6I4b} $ 8IXEq#SGNv2L\<VH~d >EJ AEpĥ%I;nғl@iQ͔ ;&P ~|X*hqtpIry/9Nrd%)漗 HF5npRrsdTqh9ItUڸP6ԡ &BKLs hF;9кl(ΐ( 1Qj")Y[Ԥ4#>wR?}KCQ ӊy>eW1U-ߢ*F5R><=B QiTV2m]'SQTAu][ǺVoc߉] ] w2Rf ƬlIwFopFJ &;HBY 5Z]B"ʲ<Zystm]-x,zΣ ՈKRR1r"P+͘:VPYr-lyPWQpb|aKYWxD}ԓ2O**[ gu\*; *Os:RpW%|7jTdXo~*fh3nPx-$9gD`;yc 7S X}4:CdJ=r2dx<_ꘚ񫯖1f4q+.sWdŜg4Դ&K"|Cqu;fJ.NhTҹJWB.S-Ns«!k[L?h3Bx:CPldlga%;~V--x_onw_W}ݦ6[E"<}n;.6umo7޵qna ż8=XoʒE$hWf GK_ ~ԂNF\1M:ß~taN(&'bsX}Goh:+g}džD ^,sz.Y 6s|=w;tϟr*DEgbw_nDg78}dž~qeꒋZ]AoէGu`Ɩ̱l]v3OZ}GѸ۷=ʶźL ѩGYÍ6bSBz?g?'lf/w?<,*~mC(=S =Ukt.s{,:ۭ~`3\ 6lg2s bAG=Exk3`G8A4Z38@;B` BÙ?S{,?Nَk0uq4.Ĕr/ɮ<ֳZ95@hr/ۺX º>[?(Ti <,aK"gFĽq۠r7K D:LÚсҸD+3Mt3WIE_۠DqcOB AX%?*Lâ*4b 89lf3g=˷DbE {&#D$' j BGQ13od1zwb4k,#щGWYb{ >lzF=#UtVD4h3^44,6m*in4820`ԙ+dɑ$ɒ4ɓDItefT>Ik|!'z2b-HDa,ơY{=zTʇ"G[ʧʧTʪʫBJʫlʮ˰T^JJT˷1J "-4;K+mY˽\+D&˟ˏKƜ2LL(4LfĖt4Ȝ>ʤKL1DCBDҬ/jZ-] `M4ΔMFMdN#8<ʜ͸A[,NLNEYϕ@tˏA ,GS4X l"# Ϸ`IqɢJ϶iRO X͈OcBTT Pе*PD ~7P -K MM ѣ:Pi<#dz?WŜ &e\T'eLycOs(|P#M _$euQܹQQ7,UP(R0 %S% :?N*̭|4s&iԦ~$$<$SYR@TԖRj*IH] I$ԟy0!,jH9U&ĚU4͞5E4Э˛UAQ-R]RxYձBƴ9BZ+YOU`V=%Vv1C:B K#9CW .3d グv}x.kRM%)CVo WׯBK@T;5MK9e0XfU \VT #15˂5Xc+ s1dmX͹ y.,@YzLP"%ڢ5ڣEڤUڥeڦeaE8X劒 kÛkmXԐ׊]@9k5 3"a+-X ڕa ffF:Y$ %} ߒ@) * db+ ^ /Vaaa (a0n5nN  0K;`#v$VKXfc~;V+EndF&@BnaK>3J1>K~ce4ddNc4'VVb'&JdCYdZ^Ma\^Q<^=?F%`l f8I6D G~kvdk In/V]^W.RKgU&d8dC oRevTea:^gp>yeqVpq~مb. 3M T[f)EhH nfwW&fr蒖c3vghQ6g~nftgh5gF߃FPVˆvN>g^ni@d)*hfJNi~wNgjvh jfA6ikiu.i^!f>jJ>kh^撠f~l6mꍶ6kijiiK6eilf}נ>>U0NbVCbbfĎ^뺮~iѮ^knVVklviNm^"b]9d&&&'gdf_cmVj`aLnN~ge{&mml^6fnc~mT .lp%`ݧ˼6pM cwo&*,qeʵpfϨwu#G$Wr%H' G r"r~[r+',o.?4[qs2&3g5r.g6sc9g@vA'B7CGDWEO7ꃕ֌QVHתbKF'qs=>7`GGhHeZcVMX:bQuS_0o_a<[QzޖeWK!bWuW 鐾fN_m-u^W_W_`Wz5"] BXѝ5t._u%\_sn_o]pwhYm :=Kw׼*:]zOsv]GbIZ.xMUYRcxGݪ>vǽپn `ONo >sJp7F磊ꖾgGzgFq>v^w,}ӭq<7=Myu^fAvphjܮbmV@e-l7fnķwojVG]L9mK3}v/Uw=3oaԶYFWkFgx.|mlOcFnɗpV /燦~gw6uCw״TKV?hWW5^fZ.,vS^1Ԓ^no|jHdXp c2l!CahX1nܘŎC~,9$ʁ'УI2]Ƅ qCI~lqLBy$(P?2MDaQZl Pr+X ,Yxm-ܸre֖]z/u ۷0ⶽ|"vŀ|ɑ)Q-}DX᱇F,MA ><3fol23k_{ھ) s%c/ xΞa-n[f깷*jVǓ:j m=ӯo>b=]UH-ŜlGE4QhV=x!t)M BWg'pEu搆B%"F#nmv9fGWI0Zy$䩗^ZQJ9%UZy^:dNc*QA(C ex`P"omxe`gYfgJ`vNϭTx>&i䣕ZՒh$z)zi D̑(/vw4a(^xb)&Ğhf %zllS*F5Րi-:钜:.[n\z% 7m-BIra һ.yzl(\ڐ: ")mՅZ5%w n➻2-W^uI &;1s|h܂<4Ҟa+ixI;-ʛ<5UsW3WdLa=6dsvyEm]n,rU$}7WQg5}]%\i-w}6+mۏ{-9l/=rӕkΐN9gؖ2[ܑyW:wE7Uv^y*;}6O'<޶{[OPo](hKIS=S( ??(< 2| #( R[ڇɯb?tx _PH< &][h2~6LE3&la4C cO$MN|^BKrC\!%,0}1䢥h1Q(b &98ϋѣc.29TשH",,oLDώHd$IzЌ'Act4A;E}dDۉMQ($#2卂/z%F\eXd`݉HK (IR׳D0 m2deѤf MYK_L36-F~9Y= *lm'H1eƼg enS! +âkҊM (xɨ#4.V쬲%rʜ)Ncs| %-YNG'Ӥ"=9b⳦CIUA`(jU&dկʨ<Pq4>*,^leNEʧ%sLDSj8uNʰjhj5yjZӨ]h-'Gz:V|Rra ۘ-o.J\ISQ(ZJ.{kC:XvwMlO#ˣ16?Ra!l%$D]quM `d"fka76w0pNw1;$`s#ņ8CӒMt=>5x4q( @rcs^V?n lWGZ±>?yV޳6DZz]y5Me3['tpim {.np[Ӷv}Vs7н}݁ .?8O6Z[޽ķ&팼8CGv Wr^#o暳p֬| qcs<( 5MA[z+z!tRozsOz2lQU۹'j0~rl@OzwD7^0`;apm}H=Sy!hRy N֎-sVn>l|/ȍN<7VY/_)cD`mDdtXs%/=6|Y ]NOu-.\b}R?}5ׯ3}\\_a^^in]t%fVSi}oUYJ`_ `͘^VB NqLWZBXXckE  `h  4{m-`׋ XRDl Yb_B b!a{!a$"RZ"2bVج]v_NW_=LdiTdQ_"<] =`!E!/#" c#c$ y!XDYA =ݡO*X8C9PcpK9Bb1c11r"r1^Oҽa#2 ޢY${<< ==#(:ħ%F ֙A:\;]<JJ6bLRXd`8t@H:] ^JK#1#RDҤ$#Y4OPPfNLj#c/LΤS TMUOJYUbBb4XMN1]I"_`.b f|eMNb-&c6c>&dFdNf$iaNRYd^ Yfafff%%UK_fiiPgTfڈ&fl>lzOJx$m&nk%o fumEEc(qfnfr2g 9'V*ཬ!KupٯMYc+U|Fߕ=碈!xbTށum-cVrwy'9F`x&qbl]jdގ^UE7mXMh_&Jy'FFfmva`zY9 uH.iu)fb!HAVǰ8i<@߂dL]["$t׊h]N]HouEUX !7nF")/)_M]HנUn}џPr~)xg jq" .hY8_u3n*Eit4UYu}_߬'ဢd:MA1V(^=h yrTqgOne%!~"`!ݖn*!.(5*VNihfjsur  lƩ