PK Û°-Aoa«,mimetypeapplication/epub+zipPKÛ°-AiTunesMetadata.plistÁ>û artistName Oracle Corporation book-info cover-image-hash 328991319 cover-image-path OEBPS/dcommon/oracle-logo.jpg package-file-hash 834396017 publisher-unique-id b65927 unique-id 583235501 genre Oracle Documentation itemName Oracle WebLogic Serverセキュリティ・プロバイダの開発, 12cリリース1(12.1.1) releaseDate 2012-01-10T09:31:24Z year 2012 PK¤TƒÛÆÁPKÛ°-AMETA-INF/container.xmlâÿ PKYuìçâPKÛ°-A OEBPS/atn.htm€ÿ 認証プロバイダ

4 認証プロバイダ

この章では、認証プロバイダの概念と機能、およびカスタム認証プロバイダの開発手順について説明します。

認証は、呼出し側が、特定のユーザーまたはシステムのかわりに動作していることを証明する際に使用するメカニズムです。認証は、ユーザー名とパスワードの組合せなどの資格証明を使用して「あなたは誰」という問いに答えます。

WebLogic Serverでは、ユーザーまたはシステム・プロセスのIDを証明するために認証プロバイダを使用します。認証プロバイダでは、ID情報を記憶したり、トランスポートしたり、その情報が必要な場合にサブジェクトを通じてシステムの様々なコンポーネントで利用できるようにしたりします。認証プロセスでは、プリンシパル検証プロバイダが、サブジェクト内に格納されるプリンシパル(ユーザーおよびグループ)のセキュリティを強化するため、それらのプリンシパルに署名して信頼性を検証します。(詳細については、第6章「プリンシパル検証プロバイダ」を参照してください。)

以下の節では、認証プロバイダの概念と機能、およびカスタム認証プロバイダの開発手順について説明します。

認証の概念

カスタム認証プロバイダの開発の詳細に立ち入る前に、以下の概念を理解しておくことが大切です。

ユーザー/グループ、プリンシパル、サブジェクト

ユーザーは、人を表すという点でオペレーティング・システムのユーザーに似ています。一方、グループはユーザーのカテゴリで、肩書きなどの共通の特徴で分類されたものです。ユーザーをグループに分類すると、多数のユーザーに対するアクセス許可を管理しやすくなります。ユーザーおよびグループの詳細は、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』のユーザー、グループおよびセキュリティ・ロールに関する項を参照してください。

WebLogic Serverのようなアプリケーション・サーバーでは、ユーザーもグループもプリンシパルとして使用することができます。プリンシパルは、認証の結果としてユーザーまたはグループに割り当てられるIDです。JAAS (Java Authentication and Authorization Service)では、プリンシパルなどの認証情報のコンテナとしてサブジェクトを使用することになっています。同じサブジェクト内に格納されている各プリンシパルは、ある人の財布に入っている複数のカードのように、同じユーザーのIDを異なる観点で表しています。たとえば、持ち主の身元を銀行に示すためにATMカードがあり、所属する組織に示すためにメンバーシップ・カードがある、という具合です。JAASの詳細は、「Java Authentication and Authorization Service (JAAS)」を参照してください。


注意:

サブジェクトは、WebLogic Server 6.xのユーザーに取ってかわるものです。


図4-1に、ユーザー、グループ、プリンシパル、およびサブジェクト間の関係を示します。

図4-1 ユーザー、グループ、プリンシパル、およびサブジェクト間の関係

図4-1の説明が続きます
「図4-1 ユーザー、グループ、プリンシパル、およびサブジェクト間の関係」の説明

認証に成功すると、その一環として、プリンシパルは署名され、その後の使用に備えてサブジェクトに格納されます。プリンシパルに署名するのはプリンシパル検証プロバイダであり、実際にプリンシパルをサブジェクトに格納するのはLoginModuleです。後で、サブジェクト内に格納されたプリンシパルに呼出し側がアクセスしようとすると、そのプリンシパルが署名されてから変更されていないことをプリンシパル検証プロバイダが確認したうえで、そのプリンシパルが呼出し側に返されます(それ以外のセキュリティ条件がすべて満たされている場合)。


注意:

プリンシパル検証プロバイダとLoginModuleの詳細は、それぞれ第6章「プリンシパル検証プロバイダ」と「LoginModule」を参照してください。


WebLogic Serverユーザーまたはグループを表すプリンシパルは、weblogic.security.spiパッケージのWLSUserインタフェースとWLSGroupインタフェースを実装する必要があります。

初期ユーザーおよびグループの指定

認証プロバイダでは、実行中のWebLogic Serverで認証を実行する前にユーザーとグループのリストが必要です。一部の認証プロバイダを使用すると、管理者は外部データベースを構成し(LDAPサーバーまたはDBMSにユーザーおよびグループを追加するなど)、そのデータベースを使用するようにプロバイダを構成できます。管理者が外部データベースのツールを使用してユーザーとグループをあらかじめ指定するので、これらのプロバイダはどのようにユーザーとグループが指定されたかを認識する必要はありません。

ただし、一部の認証プロバイダは、独自のユーザーとグループのリストを作成および管理します。ManageableSampleAuthenticatorプロバイダがそれに当てはまります。この場合、認証プロバイダは、ユーザーとグループの初期セットがどのように指定されたかを認識する必要があります。これを行う方法としては、プロバイダの初期化メソッドで、ユーザーとグループがまだないことを通知し、ユーザーとグループの初期セットを指定してリストを作成するというものがあります。

一部のプロバイダは、セキュリティ・レルムごとにユーザーとグループの個別のリストを持っているので、新しいレルムで最初にリストを使用する場合に、ユーザーとグループの初期セットを作成する必要があります。たとえば、ManageableSampleAuthenticatorプロバイダは、ユーザーとグループの個別のプロパティ・ファイルをレルムごとに作成します。この認証プロバイダのinitializeメソッドは、レルム名を取得して、そのレルムのプロパティ・ファイルが存在するかどうかを判別し、存在しない場合は、ユーザーとグループの初期セットでプロパティ・ファイルを作成します。

LoginModule

LoginModuleは、認証プロバイダの必須コンポーネントであり、境界認証用に別個のLoginModuleを開発する必要がある場合はIDアサーション・プロバイダのコンポーネントにもなります。

LoginModuleは、認証処理における「馬車馬」のような存在です。すべてのLoginModuleは、セキュリティ・レルム内のユーザーの認証と、サブジェクト内への必要なプリンシパル(ユーザー/グループ)の格納を担当します。境界認証に使用されないLoginModuleも、提示された証明情報(たとえば、ユーザーのパスワード)が正しいかどうかを確認します。


注意:

IDアサーション・プロバイダと境界認証の詳細は、第5章「IDアサーション・プロバイダ」を参照してください。


セキュリティ・レルムに複数の認証プロバイダが構成されている場合、各認証プロバイダのLoginModuleは同じサブジェクトにプリンシパルを格納します。したがって、ある認証プロバイダのLoginModuleによって、WebLogic Serverユーザー(WLSUserインタフェースの実装)を表すプリンシパル「Joe」が追加された場合、セキュリティ・レルム内の他のすべての認証プロバイダは、「Joe」に出会ったときに同じ人物を参照する必要があります。つまり、他の認証プロバイダのLoginModuleは、同じ人物を参照するために、WebLogic Serverユーザーを表す別のプリンシパル(「Joseph」など)をサブジェクトに追加しようとしてはなりません。ただし、別の認証プロバイダのLoginModuleは、WLSUser以外のタイプのプリンシパルを「Joseph」という名前で追加することができます。

LoginModuleインタフェース

LoginModuleは、ユーザー名とパスワードの組合せ、スマート・カード、バイオメトリック装置などの様々な認証メカニズムを扱うように作成することができます。LoginModuleを開発するには、JAAS (Java Authentication and Authorization Service)に基づき、認証情報のコンテナとしてサブジェクトを使用するjavax.security.auth.spi.LoginModuleインタフェースを実装します。LoginModuleインタフェースを使用すると、単一アプリケーション用に様々な種類の認証技術をプラグインすることができ、WebLogicセキュリティ・フレームワークはマルチパート認証用に複数のLoginModule実装をサポートするように設計されています。さらに、LoginModuleインスタンス間に依存関係を設けたり、それらのインスタンス間で資格証明を共有することもできます。ただし、LoginModuleと認証プロバイダの関係は1対1です。つまり、網膜スキャン認証を扱うLoginModuleと、スマート・カードのようなハードウェア・デバイスとのインタフェースを取るLoginModuleを用意するには、それぞれにLoginModuleインタフェースの実装が含まれる2つの認証プロバイダを開発して構成する必要があります。詳細については、「JAAS LoginModuleインタフェースの実装」を参照してください。


注意:

LoginModuleは、独自に開発するのではなくサード・パーティのセキュリティ・ベンダーから入手することもできます。


LoginModuleとマルチパート認証

複数の認証プロバイダ(その結果として複数のLoginModule)を構成する方法は、認証プロセスの全体的な結果に影響します。これは、さまざまな要素から成る認証で特に重要です。まず、LoginModuleは認証プロバイダのコンポーネントであるため、認証プロバイダが構成された順序で呼び出されます。通常、認証プロバイダの構成には、WebLogic Server管理コンソールを使用します。(詳細については、「認証プロバイダの順序の指定」を参照)次に、各LoginModuleの制御フラグがどのように設定されるかによって、認証プロセスでのエラーの処理方法が決まります。図4-2は、それぞれ別の認証プロバイダに属する3つのLoginModuleが関わるサンプル・フローを示すとともに、様々な認証結果でサブジェクトに何が起こるのかを示しています。

図4-2 LoginModuleのサンプル・フロー

図4-2の説明が続きます
「図4-2 LoginModuleのサンプル・フロー」の説明

カスタム認証プロバイダ#1の制御フラグがREQUIREDに設定されていた場合、ユーザー認証ステップで認証が失敗すると、認証プロセス全体が失敗します。また、ユーザーがWebLogic認証プロバイダ(またはカスタム認証プロバイダ#2)によって認証されなかった場合、認証プロセス全体が失敗します。認証プロセスがこのように失敗した場合、3つのLoginModuleすべてがロールバックされ、サブジェクトにプリンシパルが格納されません。


注意:

LoginModule制御フラグの設定とLoginModuleインタフェースの詳細は、『Java Authentication and Authorization Service (JAAS) 1.0 LoginModule Developer's Guide』(http://download.oracle.com/javase/6/docs/technotes/guides/security/)およびJava SE 6.0 API仕様のLoginModuleインタフェース(http://download.oracle.com/javase/6/docs/api/javax/security/auth/spi/LoginModule.html)をそれぞれ参照してください。


JAAS (Java Authentication and Authorization Service)

クライアントが認証の必要なアプリケーション、アプレット、Enterprise JavaBean (EJB)、あるいはサーブレットのいずれであろうと、WebLogic Serverでは、JAAS (Java Authentication and Authorization Service)クラスを用いて、信頼性とセキュリティを確保しつつクライアントに対する認証を行います。JAASは、プラガブルな認証モジュール(PAM)フレームワークのJavaバージョンを実装します。このフレームワークにより、アプリケーションは基底の認証技術から独立することができます。このため、PAMフレームワークを利用することで、アプリケーションに修正を加えることなく新しいまたは更新された認証技術を使用することができます。

WebLogic Serverは、リモートのファット・クライアントの認証および内部の認証でJAASを使用します。したがって、JAASに直に関与する必要があるのは、カスタム認証プロバイダの開発者とリモート・ファット・クライアント・アプリケーションの開発者だけです。シン・クライアントのユーザーまたはコンテナ内のファット・クライアント・アプリケーション(サーブレットからEnterprise JavaBeanを呼び出すものなど)の開発者は、JAASを直接使用したり、その知識を身につけたりする必要はありません。

JAASがWebLogicセキュリティ・フレームワークとどう連携するか

通常、JAASクラスとWebLogicセキュリティ・フレームワークを用いた認証は、以下のように実行されます:

  1. クライアント側アプリケーションがユーザーまたはシステム・プロセスから認証情報を取得します。このときのメカニズムは、クライアントのタイプごとに異なります。

  2. クライアント側アプリケーションでは、認証情報が格納されたCallbackHandlerを任意に作成できます。

    1. クライアント側アプリケーションは、LoginContextクラスを使用してCallbackHandlerをローカル(クライアント側) LoginModuleに渡します。ローカルLoginModuleは、WebLogic Serverの一部として提供されているUsernamePasswordLoginModuleの場合があります。

    2. ローカルLoginModuleは、認証情報が格納されたCallbackHandlerを適切なWebLogic Serverコンテナ(RMI、EJB、サーブレット、IIOPなど)に渡します。


      注意:

      CallbackHandlerは、可変個の引数を複合オブジェクトとしてメソッドに渡すことができるようにする高度に柔軟なJAAS規格です。CallbackHandlerのタイプは、NameCallback、PasswordCallback、およびTextInputCallbackの3つで、いずれもjavax.security.auth.callbackパッケージに収められています。NameCallbackとPasswordCallbackは、それぞれユーザー名とパスワードを返します。TextInputCallbackは、ユーザーがログイン・フォームの追加フィールド(ユーザー名とパスワードを取得するフィールド以外のフィールド)に入力したデータにアクセスするために使用します。TextInputCallbackはフォームの追加フィールドにつき1つ必要で、各TextInputCallbackのプロンプト文字列はフォームのフィールド名と一致する必要があります。WebLogic Serverは、フォームベースのWebアプリケーション・ログインに対してのみTextInputCallbackを使用します。CallbackHandlerの詳細は、Java SE 6.0 API仕様のCallbackHandlerインタフェース(http://download.oracle.com/javase/6/docs/api/javax/security/auth/callback/CallbackHandler.html)を参照してください。

      LoginContextクラスの詳細は、Java SE 6.0 API仕様のLoginContextクラス(http://download.oracle.com/javase/6/docs/api/javax/security/auth/spi/LoginModule.html)を参照してください。

      UsernamePasswordLoginModuleの詳細は、WebLogic Server APIリファレンスJavadocのUsernamePasswordLoginModuleクラスを参照してください。

      クライアント側LoginModuleを使用しない場合、ユーザー名とパスワードを他の方法で(たとえば初期JNDIルックアップの一部として)指定できます。


  3. WebLogic Serverコンテナは、WebLogicセキュリティ・フレームワークに働きかけを行います。認証情報が格納されたクライアント側CallbackHandlerが存在する場合、それがWebLogicセキュリティ・フレームワークに渡されます。

  4. WebLogicセキュリティ・フレームワークにより、渡された認証情報を使用して、構成されている認証プロバイダごとにCallbackHandlerが作成されます。これらはWebLogicセキュリティ・フレームワークによってサーバー側に作成された内部的なCallbackHandlerであり、クライアントのCallbackHandlerとは関係ありません。

  5. WebLogicセキュリティ・フレームワークは、認証プロバイダに関連付けられたLoginModule (認証情報を処理するために指定された特定のLoginModule)を呼び出します。


    注意:

    LoginModuleの詳細は、「LoginModule」を参照してください。


    LoginModuleが認証情報を利用してクライアントを認証しようとします。

  6. 認証に成功すると、以下の処理が行われます。

    1. プリンシパル検証プロバイダによってプリンシパル(ユーザーおよびグループ)が署名され、プログラムによるサーバー呼出し間での信頼性が確保されます。プリンシパル検証プロバイダの詳細は、第6章「プリンシパル検証プロバイダ」を参照してください。

    2. LoginModuleは署名済みのプリンシパルをサブジェクトに関連付けます。そのオブジェクトが認証対象のユーザーまたはシステム・プロセスを表します。サブジェクトとプリンシパルの詳細については、「ユーザー/グループ、プリンシパル、サブジェクト」を参照してください。


      注意:

      サーバー側ですべてが行われる認証の場合、プロセスはステップ3から始まり、WebLogic Serverコンテナはステップ4の前にweblogic.security.services.authentication.loginメソッドを呼び出します。


例:スタンドアロンのT3アプリケーション

スタンドアロンのT3アプリケーションの場合にJAASクラスがWebLogicセキュリティ・フレームワークとどう連携するかを図4-3に示し、続いてそれについて説明します。

図4-3 JAASクラスとWebLogic Serverを用いた認証

図4-3の説明が続きます
「図4-3 JAASクラスとWebLogic Serverを用いた認証」の説明

この例で、JAASクラスとWebLogicセキュリティ・フレームワークを用いた認証は以下のように実行されます。

  1. T3アプリケーションがユーザーまたはシステム・プロセスから認証情報(ユーザー名、パスワード、およびURL)を取得します。

  2. T3アプリケーションは、認証情報が格納されたCallbackHandlerを作成します。

    1. T3アプリケーションは、LoginContextクラスを使用してCallbackHandlerをUsernamePasswordLoginModuleに渡します。


      注意:

      weblogic.security.auth.login.UsernamePasswordLoginModuleは標準のJAAS javax.security.auth.spi.LoginModuleインタフェースを実装し、クライアント側のAPIを使用してWebLogic Serverインスタンスに対するWebLogicクライアントの認証を行います。これは、T3クライアントとIIOPクライアントの両方で使用できます。このLoginModuleの呼出し側では、CallbackHandlerを実装してユーザー名(NameCallback)、パスワード(PasswordCallback)、およびURL (URLCallback)を渡す必要があります。


    2. UsernamePasswordLoginModuleは、認証情報(ユーザー名、パスワード、およびURL)が格納されたCallbackHandlerをWebLogic Server RMIコンテナに渡します。

  3. WebLogic Server RMIコンテナは、WebLogicセキュリティ・フレームワークに働きかけを行います。認証情報が格納されたクライアント側CallbackHandlerがWebLogicセキュリティ・フレームワークに渡されます。

  4. WebLogicセキュリティ・フレームワークにより、渡されたユーザー名、パスワード、およびURLの格納されたCallbackHandlerが、構成されている認証プロバイダごとに作成されます。これらはWebLogicセキュリティ・フレームワークによってサーバー側に作成された内部的なCallbackHandlerであり、クライアントのCallbackHandlerとは関係ありません。

  5. WebLogicセキュリティ・フレームワークは、認証プロバイダに関連付けられたLoginModule (認証情報を処理するために指定された特定のLoginModule)を呼び出します。

    LoginModuleが認証情報を利用してクライアントを認証しようとします。

  6. 認証に成功すると、以下の処理が行われます。

    1. プリンシパル検証プロバイダによってプリンシパル(ユーザーおよびグループ)が署名され、プログラムによるサーバー呼出し間での信頼性が確保されます。

    2. LoginModuleは署名済みのプリンシパルをサブジェクトに関連付けます。そのオブジェクトが認証対象のユーザーまたはシステムを表します。

    3. WebLogicセキュリティ・フレームワークは認証ステータスをT3クライアント・アプリケーションに返し、T3クライアント・アプリケーションは認証済みのサブジェクトをWebLogicセキュリティ・フレームワークから受け取ります。

認証プロセス

図4-4に、ファット・クライアント・ログインの認証プロセスの仕組みを示します。JAASはサーバー上で動作してログインを実行します。シン・クライアント・ログイン(ブラウザ・クライアント)の場合でも、JAASはサーバー上で動作します。

図4-4 認証プロセス

<€ÿimg title="図4-4の説明が続きます" src="img/atn_sim.gif" alt="図4-4の説明が続きます"/>
「図4-4 認証プロセス」の説明


注意:

JAASプロセスを直接扱うのは、カスタム認証プロバイダの開発者だけです。クライアント・アプリケーションは、JNDI初期コンテキスト作成またはJAASのいずれかを使用してユーザー名とパスワードを受け渡します。


ユーザーがユーザー名とパスワードの組合せを使用してシステムにログインしようとすると、WebLogic Serverはそのユーザーのユーザー名とパスワードを検証することによって信頼を確立し、JAASの要件に従って、プリンシパルが格納されたサブジェクトを返します。図4-4にも示されているように、このプロセスではLoginModuleとプリンシパル検証プロバイダを使用する必要があります。これらについては、それぞれ「LoginModule」と第6章「プリンシパル検証プロバイダ」で詳しく解説されています。

呼出し側のIDの確認に成功すると、認証コンテキストが確立され、IDが確認されたユーザーまたはシステムに関しては、そのコンテキストを通じて他のエンティティに対する認証を行うことができます。認証コンテキストはまた、アプリケーション・コンポーネントに委託することもでき、それによって、そのコンポーネントは別のアプリケーション・コンポーネントを呼び出しつつ、元の呼出し側として動作できるようになります。

カスタム認証プロバイダを開発する必要があるか

WebLogic Serverのデフォルト(アクティブ)セキュリティ・レルムには、WebLogic認証プロバイダが含まれます。


注意:

WebLogic認証プロバイダをWebLogic認可プロバイダと組み合せれば、WebLogic Serverリリース6.xで利用できたファイル・レルムの機能のかわりになります。


WebLogic認証プロバイダは、ユーザー名とパスワードの委託認証をサポートし、組込みLDAPサーバーを利用してユーザーとグループの情報を格納します。WebLogic認証プロバイダを使用すると、ユーザーとグループ・メンバーシップを編集、表示、および管理できます。

WebLogic Serverでは、デフォルトのセキュリティ・レルムにおいて、以下の認証プロバイダをWebLogic認証プロバイダのかわりとして使用したり、WebLogic認証プロバイダと併用したりすることもできます。

デフォルトでは、これらの認証プロバイダは使用可能ですが、WebLogicデフォルト・セキュリティ・レルムには構成されていません。

追加の認証タスクを実行する場合は、カスタム認証プロバイダを開発する必要があります。


注意:

初期状態ではサポートされていない種類のトークン(新規、カスタム、サード・パーティのトークンなど)を使用して境界認証を行うには、カスタムIDアサーション・プロバイダを開発する必要があります。詳細については、第5章「IDアサーション・プロバイダ」を参照してください。


カスタム認証プロバイダの開発方法

WebLogic認証プロバイダが開発者のニーズを満たさない場合、次の手順でカスタム認証プロバイダを開発することができます。

  1. 適切なSSPIによるランタイム・クラスの作成

  2. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  3. 管理コンソールによるカスタム認証プロバイダの構成

適切なSSPIによるランタイム・クラスの作成

ランタイム・クラスを作成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム認証プロバイダのランタイム・クラスを作成します。

カスタム認証プロバイダのランタイム・クラスの作成例については、「例:サンプル認証プロバイダのランタイム・クラスの作成」を参照してください。

AuthenticationProviderV2 SSPIの実装


注意:

AuthenticationProvider SSPIは、このリリースのWebLogic Serverでは非推奨になっています。AuthenticationProviderV2 SSPIをかわりに使用してください。


AuthenticationProviderV2 SSPIを実装するには、「「Provider」SSPIの目的について」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • getLoginModuleConfiguration

    public AppConfigurationEntry getLoginModuleConfiguration()
    

    getLoginModuleConfigurationメソッドは、認証プロバイダの関連付けられたLoginModuleに関する情報を取得します。その情報は、AppConfigurationEntryとして返されます。AppConfigurationEntryは、LoginModuleのクラス名、認証プロバイダの関連するMBeanを通じて渡されたLoginModuleの制御フラグ、および他の構成情報をLoginModuleに渡すことを可能にするLoginModuleの構成オプション・マップの格納されたJAAS (Java Authentication and Authorization Service)クラスです。

    (javax.security.auth.loginパッケージ内にある)AppConfigurationEntryクラスとLoginModuleの制御フラグ・オプションの詳細は、Java SE 6.0 API仕様のAppConfigurationEntryクラス(http://download.oracle.com/javase/6/docs/api/javax/security/auth/login/AppConfigurationEntry.html)およびConfigurationクラス(http://download.oracle.com/javase/6/docs/api/javax/security/auth/login/Configuration.html)を参照してください。LoginModuleの詳細は、「LoginModule」を参照してください。セキュリティ・プロバイダとMBeanの詳細は、「MBeanタイプが必要な理由について」を参照してください。

  • getAssertionModuleConfiguration

    public AppConfigurationEntry
    getAssertionModuleConfiguration()
    

    getAssertionModuleConfigurationメソッドは、IDアサーション・プロバイダの関連付けられたLoginModuleに関する情報を取得します。その情報は、AppConfigurationEntryとして返されます。AppConfigurationEntryは、LoginModuleのクラス名、IDアサーション・プロバイダの関連するMBeanを通じて渡されたLoginModuleの制御フラグ、および他の構成情報をLoginModuleに渡すことを可能にするLoginModuleの構成オプション・マップの格納されたJAASクラスです。


    注意:

    getAssertionModuleConfigurationメソッドの実装はnullを返す場合があります(IDアサーション・プロバイダが認証プロバイダと同じLoginModuleを使用する場合)。

    IDアサーション・プロバイダのassertidentity()メソッドは、IDアサーションが発生するたびに呼び出されますが、サブジェクトがキャッシュされている場合、LoginModuleは呼び出されないことがあります。-Dweblogic.security.identityAssertionTTLフラグを使うと、この動作を変更する(たとえば、5分というデフォルトTTLを変更する、またはフラグを -1に設定してキャッシュを無効にする)ことができます。

    トークンが有効なだけでなく、ユーザーも引続き有効であること(ユーザーが削除されていないことなど)を確認するのは、IDアサーション・プロバイダの役割です。

    EJBの<run-as-principal>要素とカスタム認証プロバイダを併用する場合には、getAssertionModuleConfiguration()メソッドを使用します。このメソッドが実行するIDアサーションによって、<run-as-principal>要素に指定されているプリンシパルが検証されます。


  • getPrincipalValidator

    public PrincipalValidator getPrincipalValidator()
    

    getPrincipalValidatorメソッドは、プリンシパル検証プロバイダのランタイム・クラス(PrincipalValidator SSPI実装)の参照を取得します。WebLogicプリンシパル検証プロバイダは、ほとんどの場合に使用できます。WebLogicプリンシパル検証プロバイダの返し方の例については、例4-1を参照してください。プリンシパル検証プロバイダの詳細は、第6章「プリンシパル検証プロバイダ」を参照してください。

  • getIdentityAsserter

    public IdentityAsserterV2 getIdentityAsserter()
    

    AuthenticationProviderV2のgetIdentityAsserterメソッドは、新しいIDアサーション・プロバイダのランタイム・クラス(IdentityAsserterV2 SSPI実装)の参照を取得します。

    ほとんどの場合、このメソッドの戻り値はnullになります(例については例4-1を参照)。IDアサーション・プロバイダの詳細は、第5章「IDアサーション・プロバイダ」を参照してください。

AuthenticationProviderV2 SSPIと前述のメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

JAAS LoginModuleインタフェースの実装

JAAS javax.security.auth.spi.LoginModuleインタフェースを実装するには、以下のメソッドを実装する必要があります。

  • initialize

    public void initialize (Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options)
    

    initializeメソッドはLoginModuleを初期化します。引数として取るのは、結果として得られるプリンシパルを格納するサブジェクト、認証プロバイダが認証情報のコンテナにコールバックするのに使用するCallbackHandler、任意の共有状態情報のマップ、および構成オプション(すなわち、LoginModuleに渡す任意の付加的情報)のマップです。

    CallbackHandlerは、可変個の引数を複合オブジェクトとしてメソッドに渡すことができるようにする高度に柔軟なJAAS規格です。CallbackHandlerの詳細は、Java SE 6.0 API仕様のCallbackHandlerインタフェース(http://download.oracle.com/javase/6/docs/api/javax/security/auth/callback/CallbackHandler.html)を参照してください。

  • login

    public boolean login() throws LoginException
    

    loginメソッドは、ユーザーを認証し、認証情報のコンテナにコールバックすることでそのユーザーのプリンシパルを作成しようと試みます。複数のLoginModuleが複数の認証プロバイダの一部として構成されている場合、このメソッドはLoginModuleごとにその構成の順序で呼び出されます。ログインが成功したかどうか(すなわち、プリンシパルが作成されたかどうか)についての情報は、LoginModuleごとに格納されます。

  • commit

    public boolean commit() throws LoginException
    

    commitメソッドは、loginメソッドで作成されたプリンシパルをサブジェクトに追加しようと試みます。このメソッドも、複数の認証プロバイダの一部として構成されているLoginModuleごとに呼び出され、順番に実行されます。コミットが成功したかどうかの情報は、LoginModuleごとに格納されます。

  • abort

    public boolean abort() throws LoginException
    

    abortメソッドは、構成されている認証プロバイダの一部として構成されているLoginModuleのコミットが失敗した(つまり、関連するREQUIRED、REQUISITE、SUFFICIENT、およびOPTIONAL LoginModuleが成功しなかった)場合にLoginModuleごとに呼び出されます。abortメソッドは、LoginModuleのプリンシパルをサブジェクトから削除し、実行されたアクションを効果的にロールバックします。使用可能な制御フラグ設定の詳細は、Java SE 6.0 API仕様のLoginModuleインタフェース(http://download.oracle.com/javase/6/docs/api/javax/security/auth/spi/LoginModule.html)を参照してください。

  • logout

    public boolean logout() throws LoginException
    

    logoutメソッドは、ユーザーをシステムからログアウトさせようとします。また、サブジェクトのリセットも行うので、関連付けられているプリンシパルは格納されなくなります。


    注意:

    LoginModule.logoutメソッドはWebLogic認証プロバイダまたはカスタム認証プロバイダに対して呼び出されることはありません。これは単に、いったんプリンシパルが作成されサブジェクト内に入れられると、WebLogicセキュリティ・フレームワークはこのサブジェクトのライフサイクルを制御しなくなるからです。したがって、JAAS LoginContext を作成してログインおよびサブジェクトの取得を行う、開発者によって記述されたユーザー・コードでも、 LoginContext.logout メソッドを呼び出す必要があります。ユーザー・コードが、JAASを直接使用するJavaクライアントで実行される場合、このコードには LoginContext.logout メソッドを呼び出すというオプションがあります。これにより、サブジェクトはクリアされます。ユーザー・コードがサーブレットで実行される場合、サーブレットはサーブレット・セッションからユーザーをログアウトすることができます。これにより、サブジェクトはクリアされます。


JAAS LoginModuleインタフェースと前述のメソッドの詳細は、『Java Authentication and Authorization Service (JAAS) 1.0 Developer's Guide』(http://download.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html)およびJava SE 6.0 API仕様のLoginModuleインタフェース(http://download.oracle.com/javase/6/docs/api/javax/security/auth/spi/LoginModule.html)を参照してください。

LoginModuleからカスタム例外のスロー

記述したLoginModuleからカスタム例外をスローすることができます。そうすると、カスタム例外をアプリケーションおよび、実行された適切なアクションで捕捉できます。たとえば、LoginModuleからPasswordChangeRequiredExceptionがスローされると、その例外をアプリケーションで捕捉して、パスワードの変更が可能なページへユーザーを導くのに使用できます。

LoginModuleからカスタム例外をスローし、それをアプリケーション内で捕捉する場合には、以下のことを確認する必要があります。

  1. 例外を捕捉するアプリケーションがサーバー上で実行されています。(ファット・クライアントはカスタム例外を捕捉できません。)

  2. サーブレットが、コンパイル時でもデプロイメント時でもカスタム例外クラスにアクセスできます。これは、必要に応じて次の方法のいずれかで行えます。

方法1 :システム・クラスパスおよびコンパイラ・クラスパスを介してカスタム例外を使えるようにする
  1. LoginExceptionを拡張する例外クラスを記述します。

  2. LoginModuleインタフェースおよびAuthenticationProviderインタフェースを実装するクラスでカスタム例外クラスを使用します。

  3. セキュリティ・プロバイダの ランタイム・クラスをコンパイルする際に、カスタム例外クラスをシステム・クラスパスおよびコンパイラ・クラスパスの両方に入れます。

  4. WebLogic MBeanMakerを使用してMBeanタイプを生成する

方法2 :アプリケーション・クラスパスを介してカスタム例外を使えるようにする
  1. LoginExceptionを拡張する例外クラスを記述します。

  2. LoginModuleインタフェースおよびAuthenticationProviderインタフェースを実装するクラスでカスタム例外クラスを使用します。

  3. カスタム例外のソースをアプリケーションのビルドのクラスパスに入れ、それをアプリケーションのJAR/WARファイルのクラスパスに含めます。

  4. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  5. WebLogic MBeanMakerで生成されたMJF (MBean JARファイル)にカスタム例外クラスを追加します。

  6. アプリケーションのコンパイル時にMJFを含めます。

例:サンプル認証プロバイダのランタイム・クラスの作成

例4-1は、サンプル認証プロバイダの2つのランタイム・クラスの1つであるSimpleSampleAuthenticationProviderImpl.javaクラスを示しています。このランタイム・クラスには次の実装が含まれています。

  • initialize、getDescription、およびshutdownというSecurityProviderインタフェースから継承した3つのメソッド(「「Provider」SSPIの目的について」を参照)。

  • getLoginModuleConfiguration、getAssertionModuleConfiguration、getPrincipalValidator、およびgetIdentityAsserterというAuthenticationProviderV2 SSPIの4つのメソッド(「AuthenticationProviderV2 SSPIの実装」を参照)。


    注意:

    例4-1の太字のコードは、クラス宣言とメソッド・シグネチャを示しています。


例4-1 SimpleSampleAuthenticationProviderImpl.java

package examples.security.providers.authentication.simple;
import java.util.HashMap;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
import weblogic.management.security.ProviderMBean;
import weblogic.security.provider.PrincipalValidatorImpl;
import weblogic.security.spi.AuthenticationProviderV2;
import weblogic.security.spi.IdentityAsserterV2;
import weblogic.security.spi.PrincipalValidator;
import weblogic.security.spi.SecurityServices;
import weblogic.security.principal.WLSGroupImpl;
import weblogic.security.principal.WLSUserImpl;
public final class SimpleSampleAuthenticationProviderImpl implements AuthenticationProviderV2
{
   private String description;
   private SimpleSampleAuthenticatorDatabase database;
   private LoginModuleControlFlag controlFlag;
   public void initialize(ProviderMBean mbean, SecurityServices services)
   {
      System.out.println("SimpleSampleAuthenticationProviderImpl.initialize");
      SimpleSampleAuthenticatorMBean myMBean = (SimpleSampleAuthenticatorMBean)mbean;
      description = myMBean.getDescription() + "\n" + myMBean.getVersion();
      database = new SimpleSampleAuthenticatorDatabase(myMBean);
      String flag = myMBean.getControlFlag();
      if (flag.equalsIgnoreCase("REQUIRED")) {
        controlFlag = LoginModuleControlFlag.REQUIRED;
      } else if (flag.equalsIgnoreCase("OPTIONAL")) {
        controlFlag = LoginModuleControlFlag.OPTIONAL;
      } else if (flag.equalsIgnoreCase("REQUISITE")) {
        controlFlag = LoginModuleControlFlag.REQUISITE;
      } else if (flag.equalsIgnoreCase("SUFFICIENT")) {
        controlFlag = LoginModuleControlFlag.SUFFICIENT;
      } else {
        throw new IllegalArgumentException("invalid flag value" + flag);
      }
   }
   public String getDescription()
   {
      return description;
   }
   public void shutdown()
   {
      System.out.println("SimpleSampleAuthenticationProviderImpl.shutdown");
   }
   private AppConfigurationEntry getConfiguration(HashMap options)
   {
      options.put("database", database);
      return new 
        AppConfigurationEntry(
          "examples.security.providers.authentication.Simple.Simple.SampleLoginModuleImpl",
          controlFlag,
          options
        );
   }
   public AppConfigurationEntry getLoginModuleConfiguration()
   {
      HashMap options = new HashMap();
      return getConfiguration(options);
   }
   public AppConfigurationEntry getAssertionModuleConfiguration()
   {
      HashMap options = new HashMap();
      options.put("IdentityAssertion","true");
      return getConfiguration(options);
   }
   public PrincipalValidator getPrincipalValidator() 
   {
      return new PrincipalValidatorImpl();
   }
   public IdentityAsserterV2 getIdentityAsserter()
   {
      return null;
   }
}

例4-2は、サンプル認証プロバイダの2つのランタイム・クラスの1つであるSampleLoginModuleImpl.javaクラスを示しています。このランタイム・クラスは、JAAS LoginModuleインタフェースを実装するので(「JAAS LoginModuleインタフェースの実装」を参照)、そのinitialize、login、commit、abort、およびlogoutメソッドの実装を含んでいます。


注意:

例4-2の太字のコードは、クラス宣言とメソッド・シグネチャを示しています。


例4-2 SimpleSampleLoginModuleImpl.java

package examples.security.providers.authentication.simple;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Vector;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.LoginException;
import javax.security.auth.login.FailedLoginException;
import javax.security.auth.spi.LoginModule;
import weblogic.management.utils.NotFoundException;
import weblogic.security.spi.WLSGroup;
import weblogic.security.spi.WLSUser;
import weblogic.security.principal.WLSGroupImpl;
import weblogic.security.principal.WLSUserImpl;
final public class SimpleSampleLoginModuleImpl implements LoginModule 
{
   private Subject subject;
   private CallbackHandler callbackHandler;
   private SimpleSampleAuthenticatorDatabase database;
   // Determine whether this is a login or assert identity 
   private boolean isIdentityAssertion;
   // Authentication status
   private boolean loginSucceeded;
   private boolean principalsInSubject;
   private Vector principalsForSubject = new Vector();
   public void initialize(Subject subject, CallbackHandler callbackHandler, Map  
   sharedState, Map options) 
   {
      // only called (once!) after the constructor and before login
      System.out.println("SimpleSampleLoginModuleImpl.initialize");
      this.subject = subject;
      this.callbackHandler = callbackHandler;
      // Check for Identity Assertion option
      isIdentityAssertion =
         "true".equalsIgnoreCase((String)options.get("IdentityAssertion"));
      database = (SimpleSampleAuthenticatorDatabase)options.get("database");
   }
   public boolean login() throws LoginException  
   {
      // only called (once!) after initialize
      System.out.println("SimpleSampleLoginModuleImpl.login");
      // loginSucceeded       should be false
      // principalsInSubject  should be false

      Callback[] callbacks = getCallbacks();
      String userName = getUserName(callbacks);
      if (userName.length() > 0) {
         if (!database.userExists(userName)) {
            throwFailedLoginException("Authentication Failed: User " + userName 
            + " doesn't exist.");
         }
        if (!isIdentityAssertion) {
         String passwordWant = null;
         try {
            passwordWant = database.getUserPassword(userName);
         } catch (NotFoundException shouldNotHappen) {}
            String passwordHave = getPasswordHave(userName, callbacks);
            if (passwordWant == null || !passwordWant.equals(passwordHave)) {
               throwFailedLoginException(
   €ÿ              "Authentication Failed: User " + userName + " bad password." 
               );
            }
         }
         } else { 
          // anonymous login - let it through?
         System.out.println("\tempty userName");
         }
         loginSucceeded = true;
         principalsForSubject.add(new WLSUserImpl(userName));
         addGroupsForSubject(userName);
         return loginSucceeded;
   }
   public boolean commit() throws LoginException 
   {
      // only called (once!) after login
      // loginSucceeded      should be true or false
      // principalsInSubject should be false
      // user      should be null if !loginSucceeded, null or not-null otherwise
      // group     should be null if user == null, null or not-null otherwise

      System.out.println("SimpleSampleLoginModule.commit");
      if (loginSucceeded) {
         subject.getPrincipals().addAll(principalsForSubject);
         principalsInSubject = true;
         return true;
      } else {
         return false;
      }
   }
   public boolean abort() throws LoginException 
   {
      // The abort method is called to abort the authentication process. This is
      // phase 2 of authentication when phase 1 fails. It is called if the
      // LoginContext's overall authentication failed.
      // loginSucceeded      should be true or false
      // user      should be null if !loginSucceeded, otherwise null or not-null
      // group     should be null if user == null, otherwise null or not-null
      // principalsInSubject      should be false if user is null, otherwise true 
      //                          or false

      System.out.println("SimpleSampleLoginModule.abort");
      if (principalsInSubject) {
         subject.getPrincipals().removeAll(principalsForSubject);
         principalsInSubject = false;
      }
      return true;
   }
   public boolean logout() throws LoginException 
   {
      // should never be called
      System.out.println("SimpleSampleLoginModule.logout");
      return true;
   }
   private void throwLoginException(String msg) throws LoginException
   {
      System.out.println("Throwing LoginException(" + msg + ")");
      throw new LoginException(msg);
   }
   private void throwFailedLoginException(String msg) throws FailedLoginException
   {
      System.out.println("Throwing FailedLoginException(" + msg + ")");
      throw new FailedLoginException(msg);
   }
   private Callback[] getCallbacks() throws LoginException
   {
      if (callbackHandler == null) {
         throwLoginException("No CallbackHandler Specified");
      }
      if (database == null) {
         throwLoginException("database not specified");
      }
      Callback[] callbacks;
      if (isIdentityAssertion) {
         callbacks = new Callback[1];
      } else {
         callbacks = new Callback[2];
         callbacks[1] = new PasswordCallback("password: ",false);
      }
      callbacks[0] = new NameCallback("username: ");
      try {
          callbackHandler.handle(callbacks);
      } catch (IOException e) {
         throw new LoginException(e.toString());
      } catch (UnsupportedCallbackException e) {
         throwLoginException(e.toString() + " " + e.getCallback().toString());
      }
      return callbacks;
   }
   private String getUserName(Callback[] callbacks) throws LoginException
   {
      String userName = ((NameCallback)callbacks[0]).getName();
      if (userName == null) {
         throwLoginException("Username not supplied.");
      }
      System.out.println("\tuserName\t= " + userName);
      return userName;
   }
   private void addGroupsForSubject(String userName)
   {
      for (Enumeration e = database.getUserGroups(userName);
         e.hasMoreElements();) {
            String groupName = (String)e.nextElement();
            System.out.println("\tgroupName\t= " + groupName);
            principalsForSubject.add(new WLSGroupImpl(groupName));
      }
   }
   private String getPasswordHave(String userName, Callback[] callbacks) throws 
   LoginException
   {
      PasswordCallback passwordCallback = (PasswordCallback)callbacks[1];
      char[] password = passwordCallback.getPassword();
      passwordCallback.clearPassword();
      if (password == null || password.length < 1) {
         throwLoginException("Authentication Failed: User " + userName + ".  
            Password not supplied");
      }
      String passwd = new String(password);
      System.out.println("\tpasswordHave\t= " + passwd);
      return passwd;
   }
}

WebLogic MBeanMakerを使用してMBeanタイプを生成する

カスタム・セキュリティ・プロバイダのMBeanタイプを生成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム認証プロバイダのMBeanタイプを作成します。

  1. MBean定義ファイル(MDF)の作成

  2. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  3. WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

  4. WebLogic Server環境にMBeanタイプをインストールする


    注意:

    複数のセキュリティ・プロバイダのサンプルで、これらの手順の実行方法を示します。

    この節で説明する手順はすべて、Windows環境での作業を想定しています。


MBean定義ファイル(MDF)の作成

MBean定義ファイル(MDF)を作成するには、次の手順に従います。

  1. サンプル認証プロバイダのMDFをテキスト・ファイルにコピーします。


    注意:

    サンプル認証プロバイダのMDFは、SimpleSampleAuthenticator.xmlです。


  2. MDFで<MBeanType>要素と<MBeanAttribute>要素の内容をカスタム認証プロバイダに合わせて修正します。

  3. カスタム属性および操作(つまり、<MBeanAttribute>および<MBeanOperation>要素)をMDFに追加します。

  4. ファイルを保存します。


    注意:

    MDF要素の構文についての詳細なリファレンスは、付録A「MBean定義ファイル(MDF)要素の構文」に収められています。


WebLogic MBeanMakerを使用してMBeanタイプを生成する

MDFを作成したら、WebLogic MBeanMakerを使用してそれを実行できます。WebLogic MBeanMakerは現在のところコマンドライン・ユーティリティで、入力としてMDFを受け取り、MBeanインタフェース、MBean実装、関連するMBean情報ファイルなどの中間Javaファイルをいくつか出力します。これらの中間ファイルが合わさって、カスタム・セキュリティ・プロバイダのMBeanタイプになります。

MBeanタイプの作成手順は、カスタム認証プロバイダの設計に応じて異なります。必要な設計に合わせて適切な手順を実行してください。

オプショナルSSPI MBeanとカスタム操作を追加しない場合

カスタム認証プロバイダのMDFがオプショナルSSPI MBeanを実装せず、かつ、いかなるカスタム操作も含まない場合、次の手順に従います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true
     weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり認証プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

オプショナルSSPI MBeanまたはカスタム操作を追加する場合

カスタム認証プロバイダのMDFがオプショナルSSPI MBeanまたはカスタム操作を実装する場合、以下の質問に答えながら手順を進めてください。

MBeanタイプを作成するのは初めてですか。その場合は、次の手順に従ってください:

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true
    weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり認証プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. オプショナルSSPI MBeanをMDFに実装した場合は、次の手順に従います。

    1. MBean実装ファイルを見つけます。

      WebLogic MBeanMakerによって生成されるMBean実装ファイルには、MBeanNameImpl.javaという名前が付けられます。たとえば、SampleAuthenticatorという名前のMDFの場合、編集されるMBean実装ファイルはSampleAuthenticatorImpl.javaという名前になります。

    2. MDFで実装したオプショナルSSPI MBeanごとに、各メソッドを実装します。オプショナルSSPI MBeanが継承するメソッドもすべて実装してください。

  4. MDFにカスタム属性/操作を含めた場合は、メソッド・スタブを使用してメソッドを実装します。

  5. ファイルを保存します。

  6. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

既存のMBeanタイプの更新ですか。その場合は、次の手順に従ってください:

  1. WebLogic MBeanMakerによって現在のメソッドの実装が上書きされないように、既存のMBean実装ファイルを一時ディレクトリにコピーします。

  2. 新しいDOSシェルを作成します。

  3. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true
    weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり認証プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  4. オプショナルSSPI MBeanをMDFに実装した場合は、次の手順に従います。

    1. MBean実装ファイルを見つけて開きます。

      WebLogic MBeanMakerによって生成されるMBean実装ファイルには、<MBeanName>Impl.javaという名前が付けられます。たとえば、SampleAuthenticatorという名前のMDFの場合、編集されるMBean実装ファイルはSampleAuthenticatorImpl.javaという名前になります。

    2. ステップ1で一時ディレクトリに保存した既存のMBean実装ファイルを開きます。

    3. 既存のMBean実装ファイルを、WebLogic MBeanMakerによって生成されたMBean実装ファイルと同期させます。

      これには、メソッドの実装を既存のMBean実装ファイルから新しく生成されたMBean実装ファイルにコピー(または、新しく生成されたMBean実装ファイルから既存のMBean実装ファイルに新しいメソッドを追加)し、いずれのMBean実装ファイルにも入っているメソッドのメソッド・シグネチャへの変更が、使用するMBean実装ファイルに反映されていることを確認するといった作業が必要です。

    4. MDFを修正して元のMDFにはないオプショナルSSPI MBeanを実装した場合は、各メソッドを実装します。オプショナルSSPI MBeanが継承するメソッドもすべて実装してください。

  5. MDFを変更して元のMDFにはないカスタム操作を含めた場合、メソッド・スタブを使用してメソッドを実装します。

  6. 完成した、つまりすべてのメソッドを実装したMBean実装ファイルを保存します。

  7. このMBean実装ファイルを、WebLogic MBeanMakerがMBeanタイプの実装ファイルを配置したディレクトリにコピーします。このディレクトリは、手順3でfilesdirとして指定したものです。(ステップ3の結果としてWebLogic MBeanMakerで生成されたMBean実装ファイルがオーバーライドされます)。

  8. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

生成されるMBeanインタフェース・ファイルについて

MBeanインタフェース・ファイルは、ランタイム・クラスまたはMBean実装ファイルが構成データを取得するために使用するMBeanとのクライアント側APIです。「「Provider」SSPIの目的について」で説明されているように、これはinitializeメソッドで使用するのが一般的です。

WebLogic MBeanMakerでは、作成済のMDFからMBeanタイプを生成するので、生成されるMBeanインタフェース・ファイルの名前は、そのMDF名の後に「MBean」というテキストが付いたものになります。たとえば、WebLogic MBeanMakerを使用してSimpleSampleAuthenticator MDFを実行すると、SimpleSampleAuthenticatorMBean.javaという名前のMBeanインタフェース・ファイルが生成されます。

WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

WebLogic MBeanMakerでMDFを実行して中間ファイルを作成し、MBean実装ファイルを編集して適切なメソッドの実装を提供したら、カスタム認証プロバイダのMBeanファイルとランタイム・クラスをMBean JARファイル(MJF)にパッケージ化する必要があります。このプロセスも、WebLogic MBeanMakerによって自動化されます。

カスタム認証プロバイダのMJFを作成するには、次の手順を行います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMJF=jarfile -Dfiles=filesdir
    weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMJFフラグはWebLogic MBeanMakerが新しいMBeanタイプを含むJARファイルを構築すべきであることを示し、jarfileはMJFの名前、filesdirはWebLogic MBeanMakerでMJFにJAR化する対象ファイルが存在する場所を示します。

    この時点でコンパイルが行われるので、エラーが発生するおそれがあります。jarfileが指定されていて、エラーが発生しなかった場合には、指定された名前のMJFが作成されます。


    注意:

    カスタム・セキュリティ・プロバイダのJARファイルを作成する際には、一連のXMLバインディング・クラスと1つのスキーマも生成されます。そのスキーマに関連付けるネームスペースを選択できます。それにより、使用しているカスタム・クラスとOracleのカスタム・クラスとの競合を防ぐことができます。ネームスペースのデフォルトはvendorです。-targetNameSpace引数をWebLogicMBeanMakerまたは関連するWLMBeanMaker antタスクに渡すことで、このデフォルトを変更できます。

    既存のMJFを更新する場合は、単純にMJFを削除して再生成します。WebLogic MBeanMakerにも -DIncludeSourceオプションがあり、それを指定すると、生成されるMJFにソース・ファイルを含めるかどうかを制御できます。ソース・ファイルには、生成されたソースとMDFそのものがあります。デフォルトはfalseです。このオプションは、-DMJFを使用しない場合には無視されます。


生成されたMJFは、自らのWebLogic Server環境にインストールすることも、顧客に配布してそれぞれのWebLogic Server環境にインストールしてもらうこともできます。

WebLogic Server環境にMBeanタイプをインストールする

MBeanタイプをWebLogic Server環境にインストールするには、MJFをWL_HOME\server\lib\mbeantypesディレクトリにコピーします。ここで、WL_HOMEはWebLogic Serverの最上位のインストール・ディレクトリです。これで、カスタム認証プロバイダが「デプロイ」されます。つまり、カスタム認証プロバイダがWebLogic Server管理コンソールから管理できるようになります。


注意:

MBeanタイプをインストールするデフォルトのディレクトリは、WL_HOME\server\lib\mbeantypesです。初めて使用するバージョンが9.0の場合、セキュリティ・プロバイダは...\domaindir\lib\mbeantypesからもロードできます。ただし、サーバーを起動するときに-Dweblogic.alternateTypesDirectory=<dirコマンドライン・フラグを使用すれば、WebLogic Serverが追加ディレクトリでMBeanタイプを検索します。<dirは、ディレクトリ名のカンマ区切りのリストです。このフラグを使用する場合、WebLogic Serverは常に最初にWL_HOME\server\lib\mbeantypesからMBeanタイプをロードします。その後で、追加ディレクトリにあるすべての有効なアーカイブを検索して、ロードします。このとき拡張子は考慮されません。たとえば、-Dweblogic.alternateTypesDirectory = dirX,dirY,の場合、WebLogic Serverは最初にWL_HOME\server\lib\mbeantypesからMBeanタイプをロードしてから、dirXおよびdirYにある有効なアーカイブをロードします。WebLogic Serverに追加ディレクトリでMBeanタイプを検索するよう指示する際に、Javaセキュリティ・マネージャを使用している場合は、weblogic.policyファイルを更新して、MBeanタイプ(その結果として、カスタム・セキュリティ・プロバイダ)に適した許可を付与することも必要になります。詳細は、『Oracle WebLogic Serverセキュリティのプログラミング』のJavaセキュリティを使用したWebLogicリソースの保護に関する項を参照してください。


カスタム認証プロバイダを構成することによって(「管理コンソールによるカスタム認証プロバイダの構成」を参照)、MBeanタイプのインスタンスを作成して、GUI、他のJavaコード、またはAPIからそれらのMBeanインスタンスを使用することができます。たとえば、WebLogic Server管理コンソールを使用して、属性を取得/設定したり操作を呼び出したりすることもできますし、他のJavaオブジェクトを開発して、そのオブジェクトでMBeanをインスタンス化し、それらのMBeanから提供される情報に自動的に応答させることもできます。なお、これらのMBeanインスタンスをバックアップしておくことをお薦めします。

管理コンソールによるカスタム認証プロバイダの構成

カスタム認証プロバイダを構成するということは、そのカスタム認証プロバイダをセキュリティ・レルムに追加するということです。追加されたカスタム認証プロバイダには、認証サービスを必要とするアプリケーションからアクセスできます。

カスタム・セキュリティ・プロバイダの構成は管理タスクですが、カスタム・セキュリティ・プロバイダの開発者が行うこともできます。この節では、カスタム認証プロバイダの構成担当者にとって重要な情報を提供します。

ユーザー・ロックアウトの管理

カスタム認証プロバイダを使用する一環として、ユーザー・ロックアウトを構成および管理する方法を検討する必要があります。以下の2つの選択肢があります。

レルム・ワイドのユーザー・ロックアウト・マネージャの使用

WebLogicセキュリティ・フレームワークは、WebLogicセキュリティ・フレームワークと直接連携してユーザー・ロックアウトを管理するレルム・ワイドのユーザー・ロックアウト・マネージャを提供します。


注意:

レルム・ワイドのユーザー・ロックアウト・マネージャとWebLogic Server 6.1 PasswordPolicyMBean(レルム・アダプタ・レベル)の両方をアクティブにできます。詳細は、WebLogic Server APIリファレンスJavadocを参照してください。


レルム・ワイドのユーザー・ロックアウト・マネージャを使用する場合、それをカスタム認証プロバイダと連携させるためには、WebLogic Server管理コンソールを使用して以下のことを行います。

  1. ユーザー・ロック・アウトを有効にします(デフォルトで有効)。

  2. 必要に応じてユーザー・ロックアウトのパラメータを修正します。


    注意:

    ユーザー・ロックアウト・マネージャへの変更は、サーバーを再起動するまで有効になりません。管理コンソールを使用して前述のタスクを実行する手順は、『Oracle WebLogic Serverの保護』のユーザー・アカウントの保護に関する項で説明されています。


独自のユーザー・ロックアウト・マネージャの実装

カスタム認証プロバイダの一部として独自のユーザー・ロックアウト・マネージャを実装する場合は、次の手順を行う必要があります。

  1. レルム・ワイドのユーザー・ロックアウト・マネージャを無効にして二重ロックアウトを防止します。(WebLogic Server管理コンソールを使用して新しいセキュリティ・レルムを作成すると、ユーザー・ロックアウト・マネージャが必ず作成されます。)このタスクを実行する手順は、『Oracle WebLogic Serverの保護』のユーザー・アカウントの保護に関する項で説明されています。

  2. WebLogicセキュリティ・フレームワークのレルム・ワイドの実装からは何も借用できないので、以下のタスクを行うことも必要です。

    1. ユーザー・ロックアウト・マネージャの実装を提供します。ユーザー・ロックアウト・マネージャに関して、セキュリティ・サービス・プロバイダ・インタフェース(SSPI)は提供されません。

    2. ユーザー・ロックアウト・マネージャの管理に使用できるMBeanを変更します。

    3. 管理コンソールからユーザー・ロックアウト・マネージャを管理する場合、コンソール拡張を使用して管理コンソールにユーザー・ロックアウト・マネージャを組み入れます。詳細は、『Oracle WebLogic Server管理コンソールの拡張』を参照してください。

認証プロバイダの順序の指定

「LoginModuleとマルチパート認証」で説明されているように、認証プロセスの結果は、複数の認証プロバイダ(その結果としてLoginModule)の構成順序によって影響を受けます。

認証プロバイダは任意の順序で構成できます。ただし、構成済の認証プロバイダの順序を変更する必要がある場合は、『Oracle WebLogic Serverの保護』の認証プロバイダの順序の変更に関する項で説明されている手順に従ってください。

PK£½›¡‡‡PKÛ°-A OEBPS/atz.htm€ÿ 認可プロバイダ

7 認可プロバイダ

この章では、認可プロバイダの概念と機能、およびカスタム認可プロバイダの開発手順について説明します。

認可とは、ユーザーのIDなどの情報に基づいて、ユーザーとWebLogicリソースとの対話を管理するプロセスのことです。言い換えれば、認可とは「自分は何にアクセスできますか」という質問に答えるものです。WebLogic Serverでは、認可プロバイダはユーザーとWebLogicリソースとの対話を制限して、整合性、機密性、および可用性を確保します。

以下の節では、認可プロバイダの概念と機能、およびカスタム認可プロバイダの開発手順について説明します。

認可の概念

認可プロバイダを開発する前に、以下の概念を理解しておく必要があります。

アクセス決定

認証プロバイダのLoginModuleと同じく、アクセス決定は、「アクセスは許可されるのか」という質問に答える認可プロバイダのコンポーネントです。具体的には、指定された操作をWebLogicリソースに対して実行する権限をサブジェクトが持っているかどうかが、アプリケーション内の特定のパラメータを用いてアクセス決定に質問されます。この情報が与えられると、アクセス決定はそれに対する回答をPERMIT、DENY、またはABSTAINのいずれかで返します。


注意:

アクセス決定の詳細は、「AccessDecision SSPIの実装」を参照してください。


Java Authorization Contract for Containersの使用

Java Authorization Contract for Containers (JACC)はJava EEの一部です。JACCは、EJBおよびサーブレットに対する権限ベースのセキュリティ・モデルです。JACCはJSR-115 (http://www.jcp.org/en/jsr/detail?id=115)によって定義されます。

JACCは、WebLogic Serverドメイン内のEJBおよびサーブレット・コンテナに代替認可メカニズムを提供します。JACCが構成されている場合、WebLogicセキュリティ・フレームワークのアクセス決定、裁決、およびロール・マッピング機能は、EJBおよびサーブレットの認可判定には使用されません。


注意:

WebLogicセキュリティ・フレームワークと一緒にJACCフレームワークを使用することはできません。WebLogic Serverで使用されるJACCクラスには、決定を下すためのポリシー・オブジェクトの実装は含まれません。かわりに、JACCクラスは、java.security.Policy (http://download.oracle.com/javase/6/docs/api/java/security/Policy.html)オブジェクトに依存します。


WebLogic Serverは、JSR-115に完全に準拠しているものの、WebLogic認証プロバイダほどには最適化されていないJACCプロバイダを実装します。Java JACCクラスは、アクセス決定を下す際に使用します。JSR-115はロール・マッピングに対処する方法を定義しないので、ロールとプリンシパルの間のマッピングにはWebLogic JACCクラスが使用されます。JACCプロバイダの開発の詳細は、http://docs.oracle.com/javaee/6/api/javax/security/jacc/package-frame.htmlを参照してください。

認可プロセス

図7-1に、認可プロセスにおける認可プロバイダ(および関連する裁決プロバイダとロール・マッピング・プロバイダ)とWebLogicセキュリティ・フレームワークとの対話を示します。その後、この図について説明します。

図7-1 認可プロバイダと認可プロセス

図7-1の説明が続きます
「図7-1 認可プロバイダと認可プロセス」の説明

一般に、認可は以下のように実行されます。

  1. ユーザーまたはシステム・プロセスがWebLogicリソースをリクエストし、特定の操作を実行しようとします。

  2. リクエストされたWebLogicリソースのタイプを処理するリソース・コンテナがリクエストを受け取ります。たとえばEJBコンテナはEJBリソースに対するリクエストを受け取ります。


    注意:

    リソース・コンテナは、「セキュリティ・プロバイダとWebLogicリソース」で説明されているWebLogicリソースのいずれかを処理するコンテナです。


  3. リソース・コンテナは、ContextHandlerオブジェクトを作成します。このオブジェクトは、構成済みのロール・マッピング・プロバイダおよび認可プロバイダのアクセス決定で、そのリクエストのコンテキストに関連付けられている情報を取得する際に使用できます。


    注意:

    ContextHandlerの詳細は、「ContextHandlerとWebLogicリソース」を参照してください。アクセス決定の詳細は、「アクセス決定」を参照してください。ロール・マッピング・プロバイダの詳細は、第9章「ロール・マッピング・プロバイダ」を参照してください。


    リソース・コンテナは、サブジェクト、WebLogicリソース、そして場合によっては決定用の追加入力を提供するContextHandlerオブジェクトを渡してWebLogicセキュリティ・フレームワークを呼び出します。

  4. WebLogicセキュリティ・フレームワークは、構成済みのロール・マッピング・プロバイダを呼び出します。

  5. ロール・マッピング・プロバイダはContextHandlerを用いて、リクエストに関する様々な情報をリクエストします。また、ロール・マッピング・プロバイダは、リクエストする情報のタイプを表す一連のCallbackオブジェクトを作成します。そのCallbackオブジェクト群は、handleメソッドを通じて、配列としてContextHandlerに渡されます。

    ロール・マッピング・プロバイダは、Callbackオブジェクトに格納されている値、サブジェクト、およびリソースを用いて、リクエスト側のサブジェクトに付与されるセキュリティ・ロールを計算し、該当するセキュリティ・ロールをWebLogicセキュリティ・フレームワークに返します。

  6. WebLogicセキュリティは、リクエストされたアクションをリソースに対して実行する資格がサブジェクトにあるかどうかに関し、実際の判定を認可プロバイダに委託します。

    認可プロバイダのアクセス決定ではまた、ContextHandlerを用いてリクエストに関する様々な情報をリクエストします。アクセス決定は、リクエストする情報のタイプを表す一連のCallbackオブジェクトを作成します。そのCallbackオブジェクト群は、handleメソッドを通じて、配列としてContextHandlerに渡されます。このプロセスは、ステップ5のロール・マッピング・プロバイダの場合と同じです。

  7. 構成済みの各認可プロバイダのアクセス決定のisAccessAllowedメソッドが呼び出され、リクエストされたアクセスを実行する権限がサブジェクトにあるかどうかが、ContextHandler、サブジェクト、WebLogicリソース、およびセキュリティ・ロールに基づいて判定されます。各isAccessAllowedメソッドは、以下の3つの値のいずれかを返します。

    • PERMIT - リクエストされたアクセスが許可されることを示します。

    • DENY - リクエストされたアクセスが明示的に拒否されることを示します。

    • ABSTAIN - 明示的な判定をアクセス決定が下せなかったことを示します。

    このプロセスは、すべてのアクセス決定が使用されるまで続きます。

  8. WebLogicセキュリティ・フレームワークは、構成済みの認可プロバイダのアクセス決定から返された判定結果に食い違いがあった場合、その調停を裁決プロバイダに委託します。裁決プロバイダでは、認可判定の最終結果を決定します。


    注意:

    裁決プロバイダの詳細は、第8章「裁決プロバイダ」を参照してください。


  9. 裁決プロバイダはTRUEまたはFALSEの判定を返し、この判定はWebLogicセキュリティ・フレームワークを通してリソース・コンテナに転送されます。

    • 判定がTRUEの場合、リソース・コンテナはリクエストを保護対象のWebLogicリソースにディスパッチします。

    • 判定がFALSEの場合、リソース・コンテナはセキュリティ例外をスローします。この例外は、リクエスト側にはリクエストしたアクセスを保護されたWebLogicリソースに対して行う権限がなかったことを示します。

カスタム認可プロバイダを開発する必要があるか

WebLogic Serverのデフォルト(つまりアクティブな)セキュリティ・レルムにはWebLogic認可プロバイダが含まれています。WebLogic認可プロバイダは、このバージョンのWebLogic Serverの認可機能をデフォルトで適用するものです。WebLogic認可プロバイダは、特定のユーザーが保護対象のWebLogicリソースへのアクセスを許可されているかどうかを判定するためのポリシー・ベースの認可エンジンを使用して、アクセス決定を返します。また、WebLogic認可プロバイダは、システム内のセキュリティ・ポリシーのデプロイメントとアンデプロイメントもサポートしています。自社の既存の認可メカニズムを使用する場合は、カスタム認可プロバイダを作成してそれを既存のメカニズムに結合できます。

カスタム認可プロバイダでアプリケーションのバージョン管理をサポートする必要があるか

セキュリティ・レルムのすべての認可プロバイダ、ロール・マッピング・プロバイダ、および資格証明マッピング・プロバイダは、アプリケーションのデプロイにバージョンを使用するために、アプリケーションのバージョン管理をサポートする必要があります。認可、ロール・マッピング、または資格証明マッピング用にカスタム・セキュリティ・プロバイダを開発する際に、バージョン管理されたアプリケーションをサポートする必要がある場合は、第14章「バージョン管理可能なアプリケーションのプロバイダ」の説明に従って、バージョン管理可能なアプリケーションのSSPIを実装する必要があります。

カスタム認可プロバイダはスレッド・セーフか

最高のパフォーマンスを実現するため、デフォルトでは、アプリケーションおよびモジュールのデプロイメント中にセキュリティ・ポリシーおよびロールに対して並列変更を実行できます。この理由から、セキュリティ・レルムに構成されているデプロイ可能な認可プロバイダおよびロール・マッピング・プロバイダでは、並列呼出しがサポートされている必要があります。WebLogicのデプロイ可能なXACML認可プロバイダおよびロール・マッピング・プロバイダは、この要件を満たしています。

ただし、カスタムのデプロイ可能な認可プロバイダまたはロール・マッピング・プロバイダで並列呼出しがサポートされている場合とサポートされていない場合があります。カスタムのデプロイ可能な認可プロバイダまたはロール・マッピング・プロバイダが並列呼出しをサポートしない場合、並列セキュリティ・ポリシーとロール変更を無効にして、かわりに各アプリケーションとモジュールがキューに配置され、連続してデプロイされる同期メカニズムを実行する必要があります。


注意:

同期化メカニズムを有効にした場合、定義済のWebLogic Serverプロバイダも含めて、レルム内に構成されているすべてのデプロイ可能なプロバイダが影響を受けます。同期化メカニズムを有効にすると、これらのプロバイダのパフォーマンスに悪影響を与える可能性があります。


この同期化強制メカニズムを有効にする方法については、『Oracle WebLogic Serverの保護』を参照してください。

カスタム認可プロバイダの開発方法

WebLogic認可プロバイダが開発者のニーズを満たさない場合、次の手順でカスタム認可プロバイダを開発することができます。

  1. 適切なSSPIによるランタイム・クラスの作成、または必要に応じてバルク認可プロバイダを実装

  2. 必要に応じて、ポリシー・コンシューマSSPIを実装

  3. 必要に応じて、PolicyStoreMBeanを実装

  4. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  5. 管理コンソールによるカスタム認可プロバイダの構成

  6. セキュリティ・ポリシーを管理するためのメカニズムの提供

適切なSSPIによるランタイム・クラスの作成

ランタイム・クラスを作成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム認可プロバイダのランタイム・クラスを作成します。

カスタム認可プロバイダのランタイム・クラスの作成例については、「例:サンプル認可プロバイダのランタイム・クラスの作成」を参照してください。

AuthorizationProvider SSPIの実装

AuthorizationProvider SSPIを実装するには、「「Provider」SSPIの目的について」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • getAccessDecision

    public AccessDecision getAccessDecision();
    

    getAccessDecisionメソッドは、AccessDecision SSPIの実装を取得します。MyAuthorizationProviderImpl.javaという1つのランタイム・クラスの場合、getAccessDecisionメソッドの実装は次のようになります。

    return this;
    

    ランタイム・クラスが2つの場合、getAccessDecisionメソッドの実装は次のようになります。

    return new MyAccessDecisionImpl;
    

    これは、AuthorizationProvider SSPIを実装するランタイム・クラスが、AccessDecision SSPIを実装するクラスを取得する場合のファクトリとして使用されるためです。

AuthorizationProvider SSPIとgetAccessDecisionメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

DeployableAuthorizationProviderV2 SSPIの実装

DeployableAuthorizationProviderV2 SSPIを実装するには、「「Provider」SSPIの目的について」と「AuthorizationProvider SSPIの実装」で説明されているメソッド、および次のメソッドの実装を提供する必要があります。

  • deleteApplicationPolicies

    public void deleteApplicationPolicies(ApplicationInfo application) throws ResourceRemovalException
    

    deleteApplicationPoliciesメソッドは、アプリケーションのポリシーをすべて削除します。deleteApplicationPoliciesメソッドは、管理サーバーでのみ呼び出されます。

  • deployExcludedPolicy

    public void deleteApplicationPolicies(DeployPolicyHandle handle, Resource
     resource) throws ResourceCreationException
    

    deployExcludedPolicyメソッドは、アクセスを常に拒否するポリシーをデプロイします。ポリシーがすでに存在する場合は削除され、このポリシーによって置き換えられます。

  • deployPolicy

    public void deployPolicy(DeployPolicyHandle handle, Resource resource,
     String[] roleNames) throws ResourceCreationException
    

    deployPolicyメソッドは、セキュリティ・ポリシーの適用対象となるWebLogicリソースと、セキュリティ・ポリシー内に記載されるセキュリティ・ロール名を基に、デプロイ済みのWebアプリケーションやEJBにかわってセキュリティ・ポリシーを作成します。

  • deployUncheckedPolicy

    public void deployUncheckedPolicy(DeployPolicyHandle handle, Resource
     resource) throws ResourceCreationException
    

    deployUncheckedPolicyメソッドは、アクセスを常に許可するポリシーをデプロイします。ポリシーがすでに存在する場合は削除され、このポリシーによって置き換えられます。

  • endDeployPolicies

    public void endDeployPolicies(DeployPolicyHandle handle) throws
     ResourceCreationException
    

    deployExcludedPolicyメソッドは、アクセスを常に拒否するポリシーをデプロイします。ポリシーがすでに存在する場合は削除され、このポリシーによって置き換えられます。

  • startDeployPolicies

    public deployPolicyHandle startDeployPolicies(ApplicationInfo application)
     throws DeployHandleCreationException
    

    startDeployPoliciesメソッドは、アプリケーションのポリシー・デプロイメントの開始をマークし、アプリケーションがターゲット指定されているWebLogic Serverドメイン内のすべてのサーバーで呼び出されます。

  • undeployAllPolicies

    public void undeployAllPolicies(DeployPolicyHandle handle) throws
     ResourceRemovalException
    

    undeployAllPoliciesメソッドは、デプロイされていないWebアプリケーションまたはEJBにかわって、ポリシー定義のセットを削除します。

DeployableAuthorizationProviderV2 SSPIとdeployPolicyおよびundeployPolicyメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

ApplicationInfoインタフェース

ApplicationInfoインタフェースは、アプリケーションのデプロイメントに関するデータをセキュリティ・プロバイダに渡します。このデータを使用すると、アプリケーションを一意に識別できます。

セキュリティ・フレームワークは、ユーザーの利便を図るためにApplicationInfoインタフェースを実装します。このインタフェースのメソッドを実装する必要はありません。

DeployableAuthorizationProviderV2インタフェースとDeployableRoleProviderV2インタフェースはApplicationInfoを使用します。たとえば、DeployableAuthorizationProviderV2のメソッドの実装を例にあげます。セキュリティ・フレームワークは、DeployableAuthorizationProviderV2のstartDeployPoliciesメソッドを呼び出し、このアプリケーションのApplicationInfoインタフェースを渡します。ApplicationInfoデータは、アプリケーションのデプロイ時に管理コンソールで提供される情報を基に決められます。

startDeployPoliciesメソッドは、DeployableAuthorizationProviderV2の他のメソッドでこの後使用できるDeployPolicyHandleを戻します。

ApplicationInfoインタフェースを使用すると、このアプリケーションのアプリケーション識別子、コンポーネント名、およびコンポーネントの種類を取得できます。コンポーネントの種類は、ApplicationInfo.ComponentTypeクラスの定義に従って、APPLICATION、CONTROL_RESOURCE、EJB、またはWEBAPPのいずれかです。

次のコードは、このタスクを実行する方法の一例です。

public DeployPolicyHandle startDeployPolicies(ApplicationInfo appInfo)
    throws DeployHandleCreationException
     :
// Obtain the application information...
    String appId = appInfo.getApplicationIdentifier();
    ComponentType compType = appInfo.getComponentType();
    String compName = appInfo.getComponentName();

セキュリティ・フレームワークは、DeployableAuthorizationProviderV2 deleteApplicationPoliciesメソッドを呼び出し、このアプリケーションのApplicationInfoインタフェースを渡します。deleteApplicationPoliciesメソッドは、アプリケーションのポリシーをすべて削除します。このメソッドは、アプリケーションが削除されたときにWebLogic Serverドメイン内の管理サーバーでのみ呼び出されます。

AccessDecision SSPIの実装

AccessDecision SSPIを実装する際には、以下のメソッドの実装を用意する必要があります。

  • isAccessAllowed

    public Result isAccessAllowed(Subject subject, Map roles,
    Resource resource, ContextHandler handler, Direction direction) throws InvalidPrincipalException
    

    isAccessAllowedメソッドは、サブジェクトに格納されている情報を利用して、リクエスト側に保護対象リソースへのアクセスを許可すべきかどうかを決定します。isAccessAllowedメソッドはリクエストの前または後に呼び出すことができ、PERMIT、DENY、またはABSTAINのいずれかの値を返します。複数のアクセス決定が構成されていて、それらが相反する値を返す場合、最終結果を決定するには裁決プロバイダが必要になります。詳細については、第8章「裁決プロバイダ」を参照してください。

  • isProtectedResource

    public boolean isProtectedResource(Subject subject, Resource resource) throws InvalidPrincipalException
    

    isProtectedResourceメソッドは、指定されたWebLogicリソースが保護対象かどうかを実際にアクセス・チェックを行わずに決定するために使用します。これは呼出し側のサブジェクトに付与できる一連のセキュリティ・ロールを計算するわけではないので、軽量のメカニズムに過ぎません。

AccessDecision SSPIとisAccessAllowedおよびisProtectedResourceメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

レルム・ア€ÿダプタ認証プロバイダと互換性のあるカスタム認可プロバイダを開発する

認証プロバイダは、サブジェクト内へのユーザーおよびグループの格納を担当するセキュリティ・プロバイダです。ユーザーおよびグループはその後、認可プロバイダなど、他のタイプのセキュリティ・プロバイダによって、サブジェクトから抽出されます。セキュリティ・レルム内で構成された認証プロバイダがレルム・アダプタ認証プロバイダである場合、ユーザーおよびグループの情報は、他の認証プロバイダとは少し異なる形でサブジェクト内に格納されます。したがって、このユーザーおよびグループの情報もまた、少し異なる方法で抽出する必要があります。

例7-1は、サブジェクトへの格納にレルム・アダプタ認証プロバイダが使用された場合に、サブジェクトがユーザー名またはグループ名に一致するかどうかをチェックするために、カスタム認可プロバイダで使用できるコードです。このコードは、isAccessAllowedメソッドとisProtectedResourceメソッドの双方に属しています。

例7-1 サンプル・コード:サブジェクトがユーザー名またはグループ名に一致するかどうかのチェック

/** 
 * Determines if the Subject matches a user/group name. 
 * 
 * @param principalWant A String containing the name of a principal in this role
 * (that is, the role definition). 
 * 
 * @param subject A Subject that contains the Principals that identify the user 
 * who is trying to access the resource as well as the user's groups. 
 * 
 * @return A boolean. true if the current subject matches the name of the 
 * principal in the role, false otherwise. 
 */ 
private boolean subjectMatches(String principalWant, Subject subject) 
{ 
   // first, see if it's a group name match 
   if (SubjectUtils.isUserInGroup(subject, principalWant)) { 
      return true; 
   } 
   // second, see if it's a user name match 
   if (principalWant.equals(SubjectUtils.getUsername(subject))) { 
      return true; 
   } 
   // didn't match 
   return false; 
}

例:サンプル認可プロバイダのランタイム・クラスの作成

例7-2は、サンプル認可プロバイダのランタイム・クラスであるSampleAuthorizationProviderImpl.javaクラスを示しています。このランタイム・クラスには次の実装が含まれています。

例7-2 SimpleSampleAuthorizationProviderImpl.java

package examples.security.providers.authorization.simple;
import java.security.Principal;
import java.util.Date;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.security.auth.Subject;
import weblogic.management.security.ProviderMBean;
import weblogic.security.SubjectUtils;
import weblogic.security.WLSPrincipals;
import weblogic.security.service.ContextHandler;
import weblogic.security.spi.AccessDecision;
import weblogic.security.spi.ApplicationInfo;
import weblogic.security.spi.ApplicationInfo.ComponentType;
import weblogic.security.spi.DeployableAuthorizationProviderV2;
import weblogic.security.spi.DeployPolicyHandle;
import weblogic.security.spi.Direction;
import weblogic.security.spi.InvalidPrincipalException;
import weblogic.security.spi.Resource;
import weblogic.security.spi.Result;
import weblogic.security.spi.SecurityServices;
import weblogic.security.spi.VersionableApplicationProvider;
public final class SimpleSampleAuthorizationProviderImpl implements
DeployableAuthorizationProviderV2, AccessDecision, VersionableApplicationProvider
{
   private static String[] NO_ACCESS = new String[0];
   private static String[] ALL_ACCESS = new String[] {WLSPrincipals.getEveryoneGroupname()};
   private String description;
   private SimpleSampleAuthorizerDatabase database;
   public void initialize(ProviderMBean mbean, SecurityServices services)
   {
      System.out.println("SimpleSampleAuthorizationProviderImpl.initialize");
      SimpleSampleAuthorizerMBean myMBean = (SimpleSampleAuthorizerMBean)mbean;
      description = myMBean.getDescription() + "\n" + myMBean.getVersion();
      database = new SimpleSampleAuthorizerDatabase(myMBean);
   }
   public String getDescription()
   {
      return description;
   }
   public void shutdown()
   {
      System.out.println("SampleAuthorizationProviderImpl.shutdown");
   }
   public AccessDecision getAccessDecision()
   {
      return this;
   }
   public Result isAccessAllowed(Subject subject, Map roles, Resource resource, 
   ContextHandler handler, Direction direction) 
   {
      System.out.println("SimpleSampleAuthorizationProviderImpl.isAccessAllowed");
      System.out.println("\tsubject\t= " + subject);
      System.out.println("\troles\t= " + roles);
      System.out.println("\tresource\t= " + resource);
      System.out.println("\tdirection\t= " + direction);
      Set principals = subject.getPrincipals();
      for (Resource res = resource; res != null; res = res.getParentResource()) {
         if (database.policyExists(res)) {
            Result result = isAccessAllowed(res, subject, roles);
            System.out.println("\tallowed\t= " + result);
            return result;
         }
      }
      Result result = Result.ABSTAIN;
      System.out.println("\tallowed\t= " + result);
      return result;
   }
   public boolean isProtectedResource(Subject subject, Resource resource) throws 
   InvalidPrincipalException 
   {
      System.out.println("SimpleSampleAuthorizationProviderImpl.
        isProtectedResource");
      System.out.println("\tsubject\t= " + subject);
      System.out.println("\tresource\t= " + resource);
      for (Resource res = resource; res != null; res = res.getParentResource()) {
         if (database.policyExists(res)) {
            System.out.println("\tprotected\t= true");
            return true;
         }
      }
      System.out.println("\tprotected\t= false");
      return false;
   }
public DeployPolicyHandle startDeployPolicies(ApplicationInfo application)
{
   String appId = application.getApplicationIdentifier();
   String compName = application.getComponentName();
   ComponentType compType = application.getComponentType();
   DeployPolicyHandle handle = new    SampleDeployPolicyHandle(appId,compName,compType);
   database.removePoliciesForComponent(appId, compName, compType);
   return handle;
  public void deployPolicy(DeployPolicyHandle handle,
Resource resource, String[] roleNamesAllowed)
{
   System.out.println("SimpleSampleAuthorizationProviderImpl.deployPolicy");
   System.out.println("\thandle\t= " + ((SampleDeployPolicyHandle)handle).toString());
   System.out.println("\tresource\t= " + resource);
   for (int i = 0; roleNamesAllowed != null && i < roleNamesAllowed.length; i++) {
     System.out.println("\troleNamesAllowed[" + i + "]\t= " + roleNamesAllowed[i]);
}
database.setPolicy(resource, roleNamesAllowed);
}
   public void deployUncheckedPolicy(DeployPolicyHandle handle, Resource resource)
{
   System.out.println("SimpleSampleAuthorizationProviderImpl.deployUncheckedPolicy");
   System.out.println("\thandle\t= " + ((SampleDeployPolicyHandle)handle).toString());
   System.out.println("\tresource\t= " + resource);
   database.setPolicy(resource, ALL_ACCESS);
}
public void deployExcludedPolicy(DeployPolicyHandle handle, Resource resource)
  {
   System.out.println("SimpleSampleAuthorizationProviderImpl.deployExcludedPolicy");
   System.out.println("\thandle\t= " + ((SampleDeployPolicyHandle)handle).toString());
   System.out.println("\tresource\t= " + resource);
   database.setPolicy(resource, NO_ACCESS);
}
public void endDeployPolicies(DeployPolicyHandle handle)
{
   database.savePolicies();
}
public void undeployAllPolicies(DeployPolicyHandle handle)
{
   System.out.println("SimpleSampleAuthorizationProviderImpl.undeployAllPolicies");
   SampleDeployPolicyHandle myHandle = (SampleDeployPolicyHandle)handle;
   System.out.println("\thandle\t= " + myHandle.toString());

   // remove policies
   database.removePoliciesForComponent(myHandle.getApplication(),
                                       myHandle.getComponent(),
                                       myHandle.getComponentType());
}
public void deleteApplicationPolicies(ApplicationInfo application)
{
   System.out.println("SimpleSampleAuthorizationProviderImpl.deleteApplicationPolicies");
   String appId = application.getApplicationIdentifier();
   System.out.println("\tapplication identifier\t= " + appId);

   // clear out policies for the application
   database.removePoliciesForApplication(appId);
}
private boolean rolesOrSubjectContains(Map roles, Subject subject, String roleOrPrincipalWant)
{
   // first, see if it's a role name match
if (roles.containsKey(roleOrPrincipalWant)) {
     return true;
}

   // second, see if it's a group name match
   if (SubjectUtils.isUserInGroup(subject, roleOrPrincipalWant)) {
     return true;
   }

   // third, see if it's a user name match
   if (roleOrPrincipalWant.equals(SubjectUtils.getUsername(subject))) {
     return true;
   }

   // didn't match
   return false;
}

private Result isAccessAllowed(Resource resource, Subject subject, Map roles)
{
   // loop over the principals and roles in our database who are allowed to access this resource
   for (Enumeration e = database.getPolicy(resource); e.hasMoreElements();) {
     String roleOrPrincipalAllowed = (String)e.nextElement();
     if (rolesOrSubjectContains(roles, subject, roleOrPrincipalAllowed)) {
       return Result.PERMIT;
     }
   }
   // the resource was explicitly mentioned and didn't grant access
   return Result.DENY;
}

public void createApplicationVersion(String appId, String sourceAppId)
{
   System.out.println("SimpleSampleAuthorizationProviderImpl.createApplicationVersion");
   System.out.println("\tapplication identifier\t= " + appId);
   System.out.println("\tsource app identifier\t= " + ((sourceAppId != null) ? sourceAppId : "None"));

   // create new policies when existing application is specified
   if (sourceAppId != null) {
     database.clonePoliciesForApplication(sourceAppId,appId);
   }
}
public void deleteApplicationVersion(String appId)
{
   System.out.println("SimpleSampleAuthorizationProviderImpl.deleteApplicationVersion");
   System.out.println("\tapplication identifier\t= " + appId);

   // clear out policies for the application
   database.removePoliciesForApplication(appId);
}

public void deleteApplication(String appName)
{
   System.out.println("SimpleSampleAuthorizationProviderImpl.deleteApplication");
   System.out.println("\tapplication name\t= " + appName);

   // clear out policies for the application
   database.removePoliciesForApplication(appName);
}

class SampleDeployPolicyHandle implements DeployPolicyHandle
{
   Date date;
   String application;
   String component;
   ComponentType componentType;

   SampleDeployPolicyHandle(String app, String comp, ComponentType type)
{
     this.application = app;
     this.component = comp;
     this.componentType = type;
     this.date = new Date();
}

     public String getApplication() { return application; }
     public String getComponent() { return component; }
     public ComponentType getComponentType() { return componentType; }

     public String toString()
     {
       String name = component;
       if (componentType == ComponentType.APPLICATION)
          name = application;
       return componentType +" "+ name +" ["+ date.toString() +"]";
     }
   }
}

ポリシー・コンシューマSSPI

WebLogic Serverには、JMX (MBean)デフォルト・ポリシーとWebサービス・アノテーション用のポリシー・コンシューマが実装されています。このリリースのWebLogic Serverには、認可プロバイダがポリシー・コレクションを取得するために使用できるSSPIがあります。

PolicyConsumer SSPIは省略可能です。ポリシー・コレクションを消費するためには、このSSPIを実装する認可プロバイダのみが呼び出されます。

このSSPIでは、初期状態のポリシー・コレクションの配信と、更新後のポリシー・コレクションの配信の両方がサポートされます。

ポリシー・コレクションの消費においては、PolicyConsumer SSPIをサポートするすべての認可プロバイダが呼び出されます。各認可プロバイダは、特定のポリシー・セットのポリシー・コレクションを取得するかしないかを選択できます。プロバイダでポリシーが永続化される場合、ポリシーを取得する必要があるのは一度のみです。一方、プロバイダでポリシーがメモリーに保持される場合、ポリシー・コレクションを再び取得することも可能です。

用意されているWebLogic Server認可プロバイダでは、ポリシーはLDAP内に永続化されます。

必要なSSPIインタフェース

カスタム認可プロバイダでポリシー・コレクションの配信をサポートするには、以下の3つのインタフェースを実装する必要があります。

  • weblogic.security.spi.PolicyConsumerFactory

  • weblogic.security.spi.PolicyConsumer

  • weblogic.security.spi.PolicyCollectionHandler

  • これらのインタフェースについては、これ以降の節で説明します。

PolicyConsumerFactory SSPIインタフェースの実装

認可プロバイダには、PolicyConsumerのインスタンスをWebLogicセキュリティ・フレームワークで使用できるように、PolicyConsumerFactoryインタフェースが実装されています。WebLogicセキュリティ・フレームワークではPolicyConsumerFactoryの実装を呼び出して、プロバイダのポリシー・コンシューマの実装を取得します。

PolicyConsumerFactory SSPIにはメソッドが1つあり、このメソッドはPolicyConsumer SSPIインタフェースの実装を返します。

public interface PolicyConsumerFactory
{
/**
* Obtain the implementation of the PolicyConsumer
* security service provider interface (SSPI).
*
* @return a PolicyConsumer SSPI implementation.
*/
public PolicyConsumer getPolicyConsumer();
}

PolicyConsumer SSPIインタフェースの実装

PolicyConsumer SSPIは、ポリシー・コレクションを消費するためのポリシー・コレクション・ハンドラを戻します。これにはgetPolicyCollectionHandler()というメソッドが1つあり、このメソッドは引数にPolicyCollectionInfoの実装を取って、PolicyCollectionHandlerインタフェースの実装を戻します。

public interface PolicyConsumer
  {
    /**
     * Obtain a policy handler for consumption of a policy set.
     *
     * @param info the PolicyCollectionInfo for the policy set.
     *
     * @return a PolicyCollectionHandler or NULL which indicates
     *     that the policy set is not needed.
     *
     * @exception ConsumptionException if an error occurs
     *     obtaining the handler and the policy set cannot be consumed.
     */
public PolicyCollectionHandler getPolicyCollectionHandler(
           PolicyCollectionInfo info)
    throws ConsumptionException;
}

WebLogicセキュリティ・フレームワークではgetPolicyCollectionHandler()メソッドを呼び出して、ポリシー・コレクションに関するデータをPolicyCollectionInfoインタフェースの実装としてセキュリティ・プロバイダに渡します。(このインタフェースはあらかじめ実装されているので、ユーザーが実装する必要はありません。)

PolicyCollectionInfoのgetName()、getVersion()、getTimestamp()、およびgetResourceTypes()メソッドを使用して、このポリシー・セットに関する情報を検索します。検索後にはPolicyCollectionHandlerを返すか、ポリシー・コレクションが不要であることを示すNULLを返します。

public interface PolicyCollectionInfo
{
/**
 * Get the name of the collection.
 */
public String getName();

/**
 * Get the runtime version of the policy.
 */
public String getVersion();

/**
 * Get the timestamp of the policy.
 */
public String getTimestamp();

/**
 * Get the resource types used in the policy collection.
 */
public Resource[] getResouceTypes();
}

PolicyCollectionHandler SSPIインタフェースの実装

PolicyConsumer.getPolicyCollectionHandler()メソッドはPolicyCollectionHandlerインタフェースの実装を返します。PolicyCollectionHandlerにはsetPolicy、setUncheckedPolicy、およびdone()という3つのメソッドがあります。setPolicy()はリソースおよびロールの名前を取り、ロールに基づいてポリシーを設定します。setUncheckedPolicy()メソッドはすべてのユーザーにアクセスを許可します。

done()メソッドはポリシー・コレクションの完了を示します。done()メソッドでは、ポリシー・セットの古いポリシーをすべて削除することをお薦めします。

public interface PolicyCollectionHandler
{
     /**
      * Set a policy for the specified resource.
      */
     public void setPolicy(Resource resource, String[] roleNames)
        throws ConsumptionException;

     /**
      * Sets a policy which always grants access.
      */
     public void setUncheckedPolicy(Resource resource)
        throws ConsumptionException;

     /**
      * Signals the completion of the policy collection.
      */
     public void done()
       throws ConsumptionException;

}

更新後のポリシー・コレクションのサポート

更新後のポリシー・コレクションの配信をサポートするには、PolicyConsumer SSPIをサポートするすべての認可プロバイダでPolicyConsumer.getPolicyCollectionHandler()メソッドに渡されたPolicyCollectionInfoの内容を調べて、ポリシー・セットが変更されているかどうかを判断する必要があります。各プロバイダでは、初期状態のポリシー・コレクションとSSPIの外部から受け取ったカスタマイズ後のポリシーとの競合を解決する方法を(できれば構成によって)決定しておくことが必要です。

WebLogic Serverで提供されている認可プロバイダでは、カスタマイズ後のポリシーが更新後のポリシー・コレクションで置き換えられません。初期状態のポリシー・コレクションのポリシーはすべて削除され、カスタマイズ後のポリシーと更新後のポリシー・コレクションのみが有効になります。ポリシー・コレクションの情報に異なるタイム・スタンプやバージョンがある場合、更新後のポリシー・コレクションとして扱われます。コレクションの名前は永続キーとして使用されます。

PolicyConsumerMBean

ポリシー・コンシューマSSPIを実装する認可プロバイダには、そのプロバイダでポリシーの消費をサポートすることを示すためにweblogic.management.security.authorization.PolicyConsumerMBeanも実装する必要があります。

PolicyStoreMBean

このリリースのWebLogic Serverでは、weblogic.management.security.authorization.PolicyStoreMBeanという新しいMBeanがサポートされています。このMBeanは、管理者が生成したXACMLポリシーおよびポリシー・セットの標準的な管理操作(追加、削除、取得、リスト表示、変更、読込み)に使用できます。認可プロバイダMBeanやロール・マッピング・プロバイダMBeanには、必要に応じてこのMBeanインタフェースを実装できます。

セキュリティ管理者は、PolicyStoreMBeanのメソッドを使用して、サーバー内のポリシーをXACMLドキュメントとして管理できます。たとえば、デフォルトのXACMLプロバイダを使用するドメインを作成および管理したり、作成済のXACMLドキュメントを管理したりできます。これらのXACMLポリシーは、WebLogic ServerではWLSTを使用して管理できます。

WebLogic ServerにはこのMBeanの実装が含まれており、付属のXACMLプロバイダで使用できます。また、このMBeanの独自の実装を記述して、カスタムの認可プロバイダやロール・マッピング・プロバイダで使用することも可能です。WebLogic Serverに用意されているXACMLプロバイダでは、XACML 2.0のコア仕様(http://docs.oasis-open.org/xacml/2.0/access_control-xacml-2.0-core-spec-os.pdf)に記載されているXACMLの必須機能がサポートされています。Oracle固有の使用方法については、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』を参照してください。

ポリシーはXACML 2.0のポリシーまたはPolicySetドキュメントで表現されます。カスタム認可プロバイダでは、XACML 2.0のコア仕様(http://docs.oasis-open.org/xacml/2.0/access_control-xacml-2.0-core-spec-os.pdf)に記載されている標準のPolicyまたはPolicySetドキュメントを想定する必要があります。カスタム・ロール・マッピング・プロバイダでは、Core and hierarchical role based access control (RBAC) profile of XACML v2.0 (http://docs.oasis-open.org/xacml/2.0/access_control-xacml-2.0-rbac-profile1-spec-os.pdf)に記載されているロール割当てポリシーと整合性があるPolicyまたはPolicySetドキュメントを想定する必要があります。

具体的には、Targetに以下を含める必要があります。

  • ActionAttributeDesignator (anyURI-equalで一致する、urn:oasis:names:tc:xacml:1.0:action:action-idというIDと、urn:oasis:names:tc:xacml:2.0:actions:enableRoleという値の指定されているもの)。例:

<Action>
<ActionMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:anyURI-equal">

<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#anyURI">urn:oasis:names:tc:xacml:2.0
:actions:enableRole
</AttributeValue>

<ActionAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"
DataType="http://www.w3.org/2001/XMLSchema#anyURI" MustBePresent="true"/>

</ActionMatch>
</Action>
  • ResourceAttributeDesignator (string-equalで一致する、urn:oasis:names:tc:xacml:2.0:subject:roleというIDと、割り当てられたロールの名前である値の指定されているもの)。例:

<ResourceAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:2.0:resource:resource-ancestor-or-self"
DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/>

XACML Policyファイルの形式の調べ

XACML 2.0のコア仕様(http://docs.oasis-open.org/xacml/2.0/access_control-xacml-2.0-core-spec-os.pdf)および『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』で説明しているOracle拡張が、提供されているXACML認可プロバイダおよびロール・マッピング・プロバイダで使用するXACMLポリシー・ファイルについての最も確実な情報です。

ただしサポートされているXACMLファイルの形式を開発プロセスの一環として確認する場合は、おそらく、管理コンソールを使用して、XACML認可またはロール・マッピング・プロバイダのデータベースからデータをXACMLファイルとしてエクスポートする方法が最も便利です。エクスポートしたXACMLファイルをコピーして別の名前で保存し、任意のツールで確認します。


注意:

エクスポートしたファイルは読取り専用としてください。変更した場合、そのファイルはWebLogic Serverにインポートし直さないでください。エクスポートしたファイルを編集すると、WebLogic Server構成が使用できなくなる可能性があります。エクスポートしたファイルの編集はサポートされていません。


WLSTを使用してPolicyStoreMBeanにポリシーの追加

例7-3に、WLSTを使用してXACMLファイルからPolicyStoreMBeanのインスタンスに1つのポリシーを追加する例を示します。

この例ではこのスクリプトで使用するプロパティを、次のantスクリプトから抜粋した行に似た方法で、あらかじめ別の場所に定義してあるものと想定しています。

<property name="xacml-docs-dir" value="${xacmldir}/xacml-docs"/>
<sysproperty key="file" value="${xacml-docs-dir}/policy-getSubject.xacml"/>

例7-3 WLSTを使用してPolicyStoreMBeanにポリシーの追加

:
try:
      protocol = System.getProperty("protocol")
      host = System.getProperty("host")
      user = System.getProperty("authuser")
      passwd = System.getProperty("authpwd")
      port = System.getProperty("port")
      dom = System.getProperty("domain")
      rlm = System.getProperty("realm")
      fil = System.getProperty("file")
      prov = System.getProperty("provider")
      stat = System.getProperty("status")

def configure():
try:
      url = protocol + "://" + host + ":" + port
      connect(user,passwd, url)
      path = "/SecurityConfiguration/" + dom + "/Realms/" + rlm + "/" + prov
      print("cd'ing to " + path)
      cd(path)
      print("calling open()")
      xacmlFile = open(fil,"r")
      print("calling read()")
      xacmlDoc = xacmlFile.read()
      print("calling cmo.addPolicy")
      if stat == "none":
          cmo.addPolicy(xacmlDoc)
      else:
          cmo.addPolicy(xacmlDoc, stat)
      print("Add error handling")
:
:

『Oracle WebLogic Scripting Tool』のMBeanの移動と照会に関する項で説明しているように、WLSTが初めてWebLogic Serverインスタンスに接続すると、変数cmo(現在の管理オブジェクト)がすべての構成管理オブジェクトのルートDomainMBeanに初期化されます。MBeanタイプに移動すると、このSecurityConfigurationMBeanの場合、cmoの値はSecurityConfigurationMBeanを反映したものになります。MBeanインスタンス、つまりこの場合にはPolicyStoreMBeanを実装する認可プロバイダMBean(例では変数provで指定)に移動するときには、WLSTによってcmoの値が現在のMBeanインスタンスに変更されます。

この例ではPolicyStoreMBeanのaddPolicy()メソッドを使用して、XACMLファイルからポリシー・ストアに読み込まれるポリシーを追加しています。addPolicy()メソッドの2つのバリアント(ステータスを伴うものと伴わないもの)が示されています。

ステータスを指定しないaddPolicy()メソッドを使用する場合、デフォルトでACTIVEに設定されます。これは、ポリシーがそのターゲットで適用されるどのような決定でも評価されることを示します。ステータスは明示的にACTIVE、INACTIVE、またはBYREFERENCEに設定できます。INACTIVEステータスは、ポリシーが評価されずに格納されるだけであることを示します。BYREFERENCEステータスは、評価されるポリシー・セットによって参照された場合にだけ、ポリシーが評価されることを示します。

このタイプのWLSTスクリプトは、次のような方法でコマンドラインから呼び出せます。

java -Dhost="localhost " -Dprotocol="t3" -Dauthuser="weblogic"
-Dauthpwd="weblogic" -Dport="7001" -Ddomain="mydomain" -Drealm="myrealm"
-Dprovider="Authorizers/XACMLAuthorizer"
-Dfile="C:/XACML/xacml-docs/policy12.xml" -Dstatus="none" weblogic.WLST
XACML/scripts/XACMLaddPolicy.py

WLSTを使用してPolicySetをStringとして読み込む

例7-4に、WLSTを使用してPolicySetをStringとして読み込む例を示します。

この例ではこのスクリプトで使用するプロパティを、次のantスクリプトから抜粋した行に似た方法で、あらかじめ別の場所に定義してあるものと想定しています。

<sysproperty key="identifier"
value="urn:sample:xacml:2.0:wlssecqa:resource:type@E@Fejb@G@M@Oapplication@ENoD
DRolesOrPoliciesEar@M@Omodule@Eejb11inEarMiniAppBean.jar@M@Oejb@EMiniAppBean@
M@Omethod@EgetSubject@M@OmethodInterface@ERemote"/>
<sysproperty key="version" value="1.0"/>

例7-4 WLSTを使用してPolicySetをStringとして読み込む

:
:
try:
      print("start XACMLreadPolicySet.py")
      protocol = System.getProperty("protocol")
      host = System.getProperty("host")
      user = System.getProperty("authuser")
      passwd = System.getProperty("authpwd")
      port = System.getProperty("port")
      dom = System.getProperty("domain")
      rlm = System.getProperty("realm")
      prov = System.getProperty("provider")
      id = System.getProperty("identifier")
      vers = System.getProperty("version")
:
:
def configure():
try:
      url = protocol + "://" + host + ":" + port
      connect(user,passwd, url)
      path = "/SecurityConfiguration/" + dom + "/Realms/" + rlm + "/" + prov
      print("cd'ing to " + path)
      cd(path)
      polset = cmo.readPolicySetAsString(id, vers)
      print("readPolicySetAsString() returned the following policy set: " + polset)
      print"Add error handling."
:
:

XACML 2.0のコア仕様(http://docs.oasis-open.org/xacml/2.0/access_control-xacml-2.0-core-spec-os.pdf)で説明されているように、<PolicySet>要素には<Policy>のセットまたは別の<PolicySet>要素、およびそれらの評価結果を結合するための指定された手順が含まれます。詳細については、XACML 2.0のコア仕様を参照してください。

バルク認可プロバイダ

WebLogic Serverのこのリリースには、以下に示すバルク・アクセス・バージョンの認可プロバイダSSPIインタフェースがあります。

  • BulkAuthorizationProvider

  • BulkAccessDecision

バルク・アクセスSSPIインタフェースを使用すると、認可プロバイダにおいて1回の呼出しで複数の判定リクエストを取得できます。これまでのように、たとえば「for」ループで複数の呼出しを実行する必要はありません。バルクSSPIバリアントの目的は、プロバイダ実装において内部的なパフォーマンスの最適化を利用できるようにすることです。たとえば、渡されたResourceオブジェクトの多くが同じポリシーで保護されていることを検出することで、それらの判定結果が同じになると推測できるようになります。

バルク・バージョンでないSSPIインタフェースとバルク・バージョンのSSPIインタフェースの使用方法には若干の違いがあります。

BulkAccessDecision.isAccessAllowed()メソッドはロールのMapを引数に取ります。これは、第1にResourceオブジェクト、続いてロール名(Map<Resource, Map<String, SecurityRole>> roles)で索引付けされ、サブジェクトに関連付けられているもので、認可判定時に考慮に入れる必要があります。

BulkAccessDecision.isAccessAllowed()メソッドはMap (Resource、結果で索引付け)を返します。これは、リソースに定義された認可ポリシーが、リクエストされたメソッドの実行を許可するかどうかを示します。

WebLogic MBeanMakerを使用してMBeanタイプを生成する

カスタム・セキュリティ・プロバイダのMBeanタイプを生成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム認可プロバイダのMBeanタイプを作成します。

  1. MBean定義ファイル(MDF)の作成

  2. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  3. WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

  4. WebLogic Server環境にMBeanタイプをインストールする


    注意:

    複数のセキュリティ・プロバイダのサンプルで、これらの手順の実行方法を示します。

    この節で説明する手順はすべて、Windows環境での作業を想定しています。


MBean定義ファイル(MDF)の作成

MBean定義ファイル(MDF)を作成するには、次の手順に従います。

  1. サンプル認可プロバイダのMDFをテキスト・ファイルにコピーします。


    注意:

    サンプル認可プロバイダのMDFは、SimpleSampleAuthorizer.xmlという名前です。


  2. MDFで<MBeanType>要素と<MBeanAttribute>要素の内容をカスタム認可プロバイダに合わせて修正します。

  3. カスタム属性および操作(つまり、<MBeanAttribute>および<MBeanOperation>要素)をMDFに追加します。

  4. ファイルを保存します。


    注意:

    MDF要素の構文についての詳細なリファレンスは、付録A「MBean定義ファイル(MDF)要素の構文」に収められています。


WebLogic MBeanMakerを使用してMBeanタイプを生成する

MDFを作成したら、WebLogic MBeanMakerを使用してそれを実行できます。WebLogic MBeanMakerは現在のところコマンドライン・ユーティリティで、入力としてMDFを受け取り、MBeanインタフェース、MBean実装、関連するMBean情報ファイルなどの中間Javaファイルをいくつか出力します。これらの中間ファイルが合わさって、カスタム・セキュリティ・プロバイダのMBeanタイプになります。

MBeanタイプの作成手順は、カスタム認可プロバイダの設計に応じて異なります。必要な設計に合わせて適切な手順を実行してください。

オプショナルSSPI MBeanとカスタム操作を追加しない場合

カスタム認可プロバイダのMDFがオプショナルSSPI MBeanを実装せず、かつ、いかなるカスタム操作も含まない場合、次の手順に従います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり認可プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

オプショナルSSPI MBeanまたはカスタム操作を追加する場合

カスタム認可プロバイダのMDFがオプショナルSSPI MBeanまたはカスタム操作を実装する場合、以下の質問に答えながら手順を進めてください。

MBeanタイプを作成するのは初めてですか。その場合は、次の手順に従ってください:

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり認可プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. オプショナルSSPI MBeanをMDFに実装した場合は、次の手順に従います。

    1. MBean実装ファイルを見つけます。

      WebLogic MBeanMakerによって生成されるMBean実装ファイルには、MBeanNameImpl.javaという名前が付けられます。たとえば、SampleAuthorizerという名前のMDFの場合、編集されるMBean実装ファイルはSampleAuthorizerImpl.javaという名前になります。

    2. MDFで実装したオプショナルSSPI MBeanごとに、各メソッドを実装します。オプショナルSSPI MBeanが継承するメソッドもすべて実装してください。

  4. MDFにカスタム操作を含めた場合、メソッド・スタブを使用してメソッドを実装します。

  5. ファイルを保存します。

  6. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

既存のMBeanタイプの更新ですか。その場合は、次の手順に従ってください:

  1. WebLogic MBeanMakerによって現在のメソッドの実装が上書きされないように、既存のMBean実装ファイルを一時ディレクトリにコピーします。

  2. 新しいDOSシェルを作成します。

  3. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり認可プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  4. オプショナルSSPI MBeanをMDFに実装した場合は、次の手順に従います。

    1. MBean実装ファイルを見つけます。

      WebLogic MBeanMakerによって生成されるMBean実装ファイルには、MBeanNameImpl.javaという名前が付けられます。たとえば、SampleAuthorizerという名前のMDFの場合、編集されるMBean実装ファイルはSampleAuthorizerImpl.javaという名前になります。

    2. ステップ1で一時ディレクトリに保存した既存のMBean実装ファイルを開きます。

    3. 既存のMBean実装ファイルを、WebLogic MBeanMakerによって生成されたMBean実装ファイルと同期させます。

      これには、メソッドの実装を既存のMBean実装ファイルから新しく生成されたMBean実装ファイルにコピー(または、新しく生成されたMBean実装ファイルから既存のMBean実装ファイルに新しいメソッドを追加)し、いずれのMBean実装ファイルにも入っているメソッドのメソッド・シグネチャへの変更が、使用するMBean実装ファイルに反映されていることを確認するといった作業が必要です。

    4. MDFを修正して元のMDFにはないオプショナルSSPI MBeanを実装した場合は、各メソッドを実装します。オプショナルSSPI MBeanが継承するメソッドもすべて実装してください。

  5. MDFを変更して元のMDFにはないカスタム操作を含めた場合、メソッド・スタブを使用してメソッドを実装します。

  6. 完成した、つまりすべてのメソッドを実装したMBean実装ファイルを保存します。

  7. このMBean実装ファイルを、WebLogic MBeanMakerがMBeanタイプの実装ファイルを配置したディレクトリにコピーします。このディレクトリは、手順3でfilesdirとして指定したものです。(ステップ3の結果としてWebLogic MBeanMakerで生成されたMBean実装ファイルがオーバーライドされます)。

  8. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

生成されるMBeanインタフェース・ファイルについて

MBeanインタフェース・ファイルとは、ランタイム・クラスまたはMBean実装が構成データを取得するために使用するMBeanのクライアント側APIです。「「Provider」SSPIの目的について」で説明されているように、これはinitializeメソッドで使用するのが一般的です。

WebLogic MBeanMakerでは、作成済のMDFからMBeanタイプを生成するので、生成されるMBeanインタフェース・ファイルの名前は、そのMDF名の後に「MBean」というテキストが付いたものになります。たとえば、WebLogic MBeanMakerでSampleAuthorizer MDFを実行すると、結果としてSampleAuthorizerMBean.javaというMBeanインタフェース・ファイルが生成されます。

WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

WebLogic MBeanMakerでMDFを実行して中間ファイルを作成し、MBean実装ファイルを編集して適切なメソッドの実装を提供したら、カスタム認可プロバイダのMBeanファイルとランタイム・クラスをMBean JARファイル(MJF)にパッケージ化する必要があります。このプロセスも、WebLogic MBeanMakerによって自動化されます。

カスタム認可プロバイダのMJFを作成するには、次の手順に従います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMJF=jarfile -Dfiles=filesdir weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMJFフラグはWebLogic MBeanMakerが新しいMBeanタイプを含むJARファイルを構築すべきであることを示し、jarfileはMJFの名前、filesdirはWebLogic MBeanMakerでMJFにJAR化する対象ファイルが存在する場所を示します。

    この時点でコンパイルが行われるので、エラーが発生するおそれがあります。jarfileが指定されていて、エラーが発生しなかった場合には、指定された名前のMJFが作成されます。


    注意:

    カスタム・セキュリティ・プロバイダのJARファイルを作成する際には、一連のXMLバインディング・クラスと1つのスキーマも生成されます。そのスキーマに関連付けるネームスペースを選択できます。それにより、使用しているカスタム・クラスとOracleのカスタム・クラスとの競合を防ぐことができます。ネームスペースのデフォルトはvendorです。-targetNameSpace引数をWebLogicMBeanMakerまたは関連するWLMBeanMaker antタスクに渡すことで、このデフォルトを変更できます。

    既存のMJFを更新する場合は、単純にMJFを削除して再生成します。WebLogic MBeanMakerにも -DIncludeSourceオプションがあり、それを指定すると、生成されるMJFにソース・ファイルを含めるかどうかを制御できます。ソース・ファイルには、生成されたソースとMDFそのものがあります。デフォルトはfalseです。このオプションは、-DMJFを使用しない場合には無視されます。


生成されたMJFは、自らのWebLogic Server環境にインストールすることも、顧客に配布してそれぞれのWebLogic Server環境にインストールしてもらうこともできます。

WebLogic Server環境にMBeanタイプをインストールする

MBeanタイプをWebLogic Server環境にインストールするには、MJFをWL_HOME\server\lib\mbeantypesディレクトリにコピーします。ここで、WL_HOMEはWebLogic Serverの最上位のインストール・ディレクトリです。このインストール・コマンドによって、カスタム認可プロバイダが「デプロイ」されます。つまり、カスタム認可プロバイダをWebLogic Server管理コンソールから管理できるようになります。


注意:

MBeanタイプをインストールするデフォルトのディレクトリは、WL_HOME\server\lib\mbeantypesです。初めて使用するバージョンが9.0の場合、セキュリティ・プロバイダは...\domaindir\lib\mbeantypesからもロードできます。ただし、サーバーを起動するときに-Dweblogic.alternateTypesDirectory=<dir>コマンドライン・フラグを使用すれば、WebLogic Serverが追加ディレクトリでMBeanタイプを検索します。<dir>は、ディレクトリ名のカンマ区切りのリストです。このフラグを使用する場合、WebLogic Serverは常に最初にWL_HOME\server\lib\mbeantypesからMBeanタイプをロードします。その後で、追加ディレクトリにあるすべての有効なアーカイブを検索して、ロードします。このとき拡張子は考慮されません。

たとえば、-Dweblogic.alternateTypesDirectory = dirX,dirYの場合、WebLogic ServerはまずWL_HOME\server\lib\mbeantypesからMBeanタイプをロードし、次にdirXおよびdirYにある有効なアーカイブをロードします。WebLogic Serverに追加ディレクトリでMBeanタイプを検索するよう指示する際に、Javaセキュリティ・マネージャを使用している場合は、weblogic.policyファイルを更新して、MBeanタイプ(その結果として、カスタム・セキュリティ・プロバイダ)に適した許可を付与することも必要になります。詳細は、『Oracle WebLogic Serverセキュリティのプログラミング』のJavaセキュリティを使用したWebLogicリソースの保護に関する項を参照してください。


カスタム認可プロバイダを構成することによって(「管理コンソールによるカスタム認可プロバイダの構成」を参照)、MBeanタイプのインスタンスを作成して、GUI、他のJavaコード、またはAPIからそれらのMBeanインスタンスを使用することができます。たとえば、WebLogic Server管理コンソールを使用して、属性を取得/設定したり操作を呼び出したりすることもできますし、他のJavaオブジェクトを開発して、そのオブジェクトでMBeanをインスタンス化し、それらのMBeanから提供される情報に自動的に応答させることもできます。なお、これらのMBeanインスタンスをバックアップしておくことをお薦めします。

管理コンソールによるカスタム認可プロバイダの構成

カスタム認可プロバイダを構成するということは、認可サービスを必要とするアプリケーションがアクセス可能なセキュリティ・レルムにカスタム認可プロバイダを追加するということです。

カスタム・セキュリティ・プロバイダの構成は管理タスクですが、カスタム・セキュリティ・プロバイダの開発者が行うこともできます。この節では、カスタム認可プロバイダの構成担当者向けの重要な情報を取り上げます。

認可プロバイダとデプロイメント記述子の管理

Enterprise JavaBeans (EJB)やWebアプリケーションなどのアプリケーションの中には、Java EEの関連デプロイメント情報とWebLogic Serverデプロイメント記述子を格納するものがあります。Webアプリケーションの場合、デプロイメント記述子ファイル(web.xmlとweblogic.xml)には、セキュリティ・ポリシーの宣言を含むJava EEセキュリティ・モデルの実装情報が記述されます。この情報は、WebLogic Server管理コンソールで認可プロバイダを初めて構成するときに格納するのが一般的です。

Java EEプラットフォームはデプロイメント記述子でWebアプリケーションおよびEJBのセキュリティを標準化しているので、WebLogic Serverではこの標準メカニズムがWebLogicセキュリティ・サービスに統合され、WebアプリケーションおよびEJBリソースを保護する方法を選択できるようになっています。デプロイメント記述子のみを使用することも管理コンソールのみを使用することもできます。また、状況によっては、この2つの方法を組み合わせることもできます。

選択した方法によって、セキュリティ・モデルを適用する必要もあります。WebLogicでは、個々のデプロイメントについて複数のセキュリティ・モデルがサポートされ、使用する方法を組み込むレルム全体の構成についてはセキュリティ・モデルがサポートされます。

デプロイメント記述子を使用するように構成すると、WebLogic Serverによりweb.xmlおよびweblogic.xmlデプロイメント記述子ファイルからセキュリティ・ポリシー情報が読み込まれます(web.xmlファイルとweblogic.xmlファイルの例については、例7-5と例7-6を参照)。この情報は、認可プロバイダのセキュリティ・プロバイダ・データベースにコピーされます。

例7-5 web.xmlãƒwˆä•ã‚¡ã‚¤ãƒ«ã®ã‚µãƒ³ãƒ—ル

<web-app> 
   <welcome-file-list> 
      <welcome-file>welcome.jsp</welcome-file> 
   </welcome-file-list> 
   <security-constraint> 
      <web-resource-collection>
         <web-resource-name>Success</web-resource-name>
         <url-pattern>/welcome.jsp</url-pattern>
         <http-method>GET</http-method> 
         <http-method>POST</http-method> 
      </web-resource-collection> 
      <auth-constraint> 
         <role-name>developers</role-name> 
      </auth-constraint> 
   </security-constraint> 
   <login-config> 
       <auth-method>BASIC</auth-method> 
       <realm-name>default</realm-name> 
   </login-config> 
   <security-role> 
      <role-name>developers</role-name> 
   </security-role> 
</web-app>

例7-6 weblogic.xmlファイルのサンプル

<weblogic-web-app> 
   <security-role-assignment> 
      <role-name>developers</role-name>
      <principal-name>myGroup</principal-name> 
   </security-role-assignment> 
</weblogic-web-app>

セキュリティ・ポリシー・デプロイメントの有効化

カスタム認可プロバイダの開発の一環としてDeployableAuthorizationProviderV2 SSPIを実装し、カスタム認可プロバイダでデプロイ可能なセキュリティ・ポリシーをサポートする場合、カスタム認可プロバイダの構成担当者(つまり、開発者または管理者)は、WebLogic Server管理コンソールで「ポリシー・デプロイメントを有効化」チェック・ボックスがチェックされていることを確認する必要があります。チェックがはずれていると、認可プロバイダのデプロイメントは「オフ」と見なされます。このため、複数の認可プロバイダが構成されている場合、「ポリシー・デプロイメントを有効化」チェック・ボックスを使用して、セキュリティ・ポリシーのデプロイメントに使用する認可プロバイダを指定できます。

セキュリティ・ポリシーを管理するためのメカニズムの提供

WebLogic Server管理コンソールを使用してカスタム認可プロバイダを構成すると、必要な認可サービスにアプリケーションからアクセスできるようにすることはできますが、このセキュリティ・プロバイダに関連付けられたセキュリティ・ポリシーを管理する方法を管理者にも提供する必要があります。たとえばWebLogic認可プロバイダには、ポリシー・エディタ・ページが管理者向けに用意されており、様々なWebLogicリソースのセキュリティ・ポリシーを追加、変更、または削除することができます。

カスタム認可プロバイダを開発している場合、管理者はポリシー・エディタ・ページも認可サービスへのアクセスも利用できません。したがって、セキュリティ・ポリシーを管理するための独自のメカニズムを提供する必要があります。このメカニズムでは、カスタム認可プロバイダのデータベースのセキュリティ・ポリシー・データ(つまり式)を読み書きできなければなりません。

それには、以下の3通りの方法があります。

オプション1 :セキュリティ・ポリシー管理用のスタンドアロン・ツールの開発

WebLogic Server管理コンソールとまったく別のツールを開発する場合には、この方法を選択します。

この方法では、カスタム認可プロバイダ向けにコンソール拡張を作成する必要も、管理MBeanを開発する必要もありません。ただし、ツールでは以下のことを行う必要があります。

  1. WebLogicリソースのIDを特定します。IDがコンソール拡張によって自動的に提供されないためです。詳細については、「WebLogicリソース識別子」を参照してください。

  2. セキュリティ・ポリシーを構成する式を表す方法を決定します。この表現は完全に任意であり、文字列である必要はありません。

  3. カスタム認可プロバイダのデータベースの式を読み書きします。

オプション2 : 管理コンソールに既存のセキュリティ・ポリシー管理ツールの統合

WebLogic Server管理コンソールとは別のツールを持っており、それを管理コンソールから起動する場合には、この方法を選択します。

この方法の場合、ツールでは以下のことを行う必要があります。

  1. WebLogicリソースのIDを特定します。IDがコンソール拡張によって自動的に提供されないためです。詳細については、「WebLogicリソース識別子」を参照してください。

  2. セキュリティ・ポリシーを構成する式を表す方法を決定します。この表現は完全に任意であり、文字列である必要はありません。

  3. カスタム認可プロバイダのデータベースの式を読み書きします。

  4. 『Oracle WebLogic Server管理コンソールの拡張』で説明されているように、基本的なコンソール拡張手法を使用して管理コンソールにリンクします。

PKÎËш‹›w›PKÛ°-AOEBPS/cover.htmO°ý Cover

Oracle Corporation

PK[×ßpTOPKÛ°-AOEBPS/title.htm2Íè Oracle Fusion Middleware Oracle WebLogic Serverセキュリティ・プロバイダの開発, 12cリリース1(12.1.1)

Oracle® Fusion Middleware

Oracle WebLogic Serverセキュリティ・プロバイダの開発

12cリリース1(12.1.1)

B65927-02(原本部品番号:E24486-02)

2012年1月

このドキュメントでは、セキュリティ・ベンダーやアプリケーション開発者向けに、Oracle WebLogic Serverで使用するセキュリティ・プロバイダの新規開発に必要な情報を提供します。


Oracle Fusion Middleware Oracle WebLogic Serverセキュリティ・プロバイダの開発, 12cリリース1(12.1.1)

B65927-02

Copyright © 2007, 2012, Oracle and/or its affiliates.All rights reserved.

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007).Oracle USA, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

このソフトウェアおよびドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

PKe^I872PKÛ°-AOEBPS/post_aud.htm€ÿ カスタム・セキュリティ・プロバイダからのイベントの監査

12 カスタム・セキュリティ・プロバイダからのイベントの監査

この章では、カスタム・セキュリティ・プロバイダに監査機能を追加する前に理解しておく必要がある基本情報と、カスタム・セキュリティ・プロバイダに監査機能を追加する手順について説明します。

第10章「監査プロバイダ」で説明されているように、監査とは、リクエストの操作とそれらのリクエストの結果に関する情報を、否認防止を目的として収集、格納、および配布するプロセスのことです。監査プロバイダは、コンピュータのアクティビティの電子的な記録を提供します。

各タイプのセキュリティ・プロバイダは、セキュリティ関連イベントの実行前または実行後に、それらのイベントに関する情報を記録するよう構成済みの監査プロバイダにリクエストできます。たとえば、あるユーザーが(アクセス権を持たない)預金口座アプリケーションのwithdrawメソッドにアクセスしようとした場合、認可プロバイダではこの操作を記録するようにリクエストできます。セキュリティ関連イベントは、監査プロバイダの構成で指定されている重大度レベルと一致するか、それを超えた場合にのみ記録されます。

以下の節では、カスタム・セキュリティ・プロバイダに監査機能を追加する前に理解しておく必要がある基本情報と、カスタム・セキュリティ・プロバイダに監査機能を追加する手順について説明します。

セキュリティ・サービスと監査サービス

weblogic.security.spiパッケージのSecurityServicesインタフェースは、セキュリティ・サービスのリポジトリです(現在は単なる監査サービス)。SecurityServicesインタフェースは、以下のメソッドを通じて呼出し側に監査サービスの参照を提供します。

同じくweblogic.security.spiパッケージにあるAuditorServiceインタフェースは、他のタイプのセキュリティ・プロバイダ(認証プロバイダなど)に対する限定された(書込み専用の)監査機能を提供します。つまり、監査サービスでは構成されている各監査プロバイダのwriteEventメソッドを呼び出します。このメソッドは渡されたAuditEventオブジェクトに指定されている情報に基づいて、単純に監査レコードを記述します。

writeEventメソッドの詳細は、「AuditChannel SSPIの実装」を参照してください。AuditEventオブジェクトの詳細は、「監査イベントの作成」を参照してください。AuditorServiceインタフェースには次のメソッドがあります。

監査サービスを呼び出すと、監査イベントの実行前または実行後にそれらのイベントを記録できますが、操作の前と後の間のコンテキストは維持されません。監査機能を持つセキュリティ・プロバイダは、「監査サービスの取得、および取得した監査サービスによる監査イベントの書込み」の説明に従って監査サービスを取得する必要があります。


注意:

監査プロバイダが構成されている場合、SecurityServicesインタフェースとAuditorServiceインタフェースの実装は起動時にWebLogicセキュリティ・フレームワークによって作成されます。(監査プロバイダの構成については、「管理コンソールによるカスタム監査プロバイダの構成」を参照してください)。

また、SecurityServicesオブジェクトは、セキュリティ・プロバイダが構成されているセキュリティ・レルムに固有のものです。カスタム・セキュリティ・プロバイダのランタイム・クラスは、そのinitializeメソッドの一部としてレルム固有のSecurityServicesオブジェクトへの参照を自動的に取得します。(詳細は、「「Provider」SSPIの目的について」を参照してください。)


これらのインタフェースとそのメソッドの詳細は、Oracle WebLogic Server APIリファレンスのSecurityServicesインタフェースおよびAuditorServiceインタフェースを参照してください。

カスタム・セキュリティ・プロバイダからの監査方法

カスタム・セキュリティ・プロバイダに監査機能を追加するには、次の手順に従います。

各手順の例については、「例: AuditRoleEventインタフェースの実装」と「例:監査サービスを取得および使用してロール監査イベントの書込み」を参照してください。


注意:

カスタム・セキュリティ・プロバイダが監査イベントを記録する場合、必須のファイルに加えて、以下の手順で作成したすべてのクラスを、そのプロバイダ用のMBean JARファイル(MJF)に追加する必要があります。


監査イベントの作成

セキュリティ・プロバイダは、イベントのタイプ(認証イベントなど)や監査重大度(「エラー」など)といった、監査するイベントに関する情報を提供する必要があります。監査イベントには、この情報が格納されます。また、構成済みの監査プロバイダが理解できるコンテキスト・データも格納できます。監査イベントを作成するには、以下のいずれかを行います。

AuditEvent SSPIの実装

AuditEvent SSPIを実装するには、以下のメソッドの実装を提供する必要があります。

  • getEventType

    public java.lang.String getEventType()
    

    getEventTypeメソッドは、監査するイベント・タイプの文字列表現を返します。この文字列表現は、監査チャネル(AuditChannel SSPIを実装するランタイム・クラス)によって使用されます。たとえば、Oracle提供の実装のイベント・タイプは"Authentication Audit Event"です。詳細については、「監査チャネル」および「AuditChannel SSPIの実装」を参照してください。

  • getFailureException

    public java.lang.Exception getFailureException()
    

    getFailureExceptionメソッドは、Exceptionオブジェクトを返します。監査チャネルは、tostringメソッドから提供される情報に加えて、このオブジェクトから監査情報を取得します。

  • getSeverity

    public AuditSeverity getSeverity()
    

    getSeverityメソッドは、監査するイベント・タイプに関連付けられている重大度レベル値を返します。この値は、監査チャネルによって使用されます。監査チャネルはこの値を使用して、監査するかどうかを判定します。詳細については、「監査重大度」を参照してください。

  • toString

    public java.lang.String toString()
    

    toStringメソッドは、あらかじめフォーマットされた監査情報を監査チャネルに返します。


    注意:

    toStringメソッドは、任意の文字を生成できます。その際、エスケープは使用されません。監査プロバイダが、構文に文字を使用するフォーマットにtoString値を書き込む場合は、その前にtoString値をエスケープしてください。


AuditEvent SSPIとこれらのメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

監査イベント・コンビニエンス・インタフェースの実装

AuditEvent SSPIには、ユーザーの利便を図り、監査イベントの作成に役立つサブインタフェースがいくつか用意されています。

監査チャネル(AuditChannel SSPIを実装するランタイム・クラス)では、それらの各監査イベント・コンビニエンス・インタフェースを使用して、拡張イベント・タイプ・オブジェクトのインスタンス・タイプをより効果的に判断し、特定のタイプのセキュリティ・プロバイダを識別することができます。たとえば、AuditAtnEventV2コンビニエンス・インタフェースを監査チャネルで使用すると、拡張認証イベント・タイプ・オブジェクトのインスタンス・タイプを判断できます。(詳細については、「監査チャネル」および「AuditChannel SSPIの実装」を参照してください)。

監査イベント・コンビニエンス・インタフェースは以下のとおりです。

AuditAtnEventV2インタフェース

AuditAtnEventV2は、監査チャネルが拡張認証イベント・タイプ・オブジェクトのインスタンス・タイプを判断するのに役立つコンビニエンス・インタフェースです。


注意:

AuditAtnEventインタフェースは、このリリースのWebLogic Serverで非推奨になりました。


AuditAtnEventV2インタフェースを実装するには、「AuditEvent SSPIの実装」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • getUsername

    public String getUsername()
    

    getUsernameメソッドは、認証イベントに関連付けられているユーザー名を返します。

  • getAtnEventType

    public AuditAtnEventV2.AtnEventTypeV2 getAtnEventType()
    

    getAtnEventTypeメソッドは、認証イベントをより具体的に表すイベント・タイプを戻します。具体的な認証イベント・タイプは次のとおりです。

    AUTHENTICATE - ユーザー名とパスワードを使用する単純な認証が発生しました。

    ASSERTIDENTITY - トークンに基づく境界認証が発生しました。

    CREATEDERIVEDKEY - 派生キーの作成を表します。

    CREATEPASSWORDDIGEST - パスワード・ダイジェストの作成を表します。

    IMPERSONATEIDENTITY - 指定されたクライアント・ユーザー名を使用してクライアントIDが確立されました(カーネルIDが必要です)。

    USERLOCKED - 無効なログインの試行によってユーザー・アカウントがロックされました。

    USERUNLOCKED - ユーザー・アカウントのロックが解除されました。

    USERLOCKOUTEXPIRED - ユーザー・アカウントのロックが期限切れになりました。

    VALIDATEIDENTITY - 指定されたサブジェクト内のプリンシパルの信頼性が検証されました。

  • toString

    public String toString()
    

    toStringメソッドは、文字列で表された特定の認証情報を監査に返します。


    注意:

    toStringメソッドは、任意の文字を生成できます。その際、エスケープは使用されません。監査プロバイダが、構文に文字を使用するフォーマットにtoString値を書き込む場合は、その前にtoString値をエスケープしてください。

    AuditAtnEventV2というコンビニエンス・インタフェースを使用すると、AuditEventインタフェースとAuditContextインタフェースの両方を拡張できます。AuditContextインタフェースの詳細は、「監査コンテキスト」を参照してください。


AuditAtnEventV2コンビニエンス・インタフェースとこれらのメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

AuditAtzEventおよびAuditPolicyEventインタフェース

AuditAtzEventおよびAuditPolicyEventコンビニエンス・インタフェースは、監査チャネルが拡張認可イベント・タイプ・オブジェクトのインスタンス・タイプを判断するのに役立ちます。


注意:

AuditAtzEventコンビニエンス・インタフェースとAuditPolicyEventコンビニエンス・インタフェースは、後者がAuditEventインタフェースのみを拡張する点で異なります。(後者はAuditContextインタフェースを拡張しません。)AuditContextインタフェースの詳細は、「監査コンテキスト」を参照してください。


AuditAtzEventインタフェースまたはAuditPolicyEventインタフェースを実装するには、「AuditEvent SSPIの実装」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • getSubject

    public Subject getSubject()
    

    getSubjectメソッドは、認可イベントに関連付けられているサブジェクト(WebLogicリソースにアクセスしようとしているサブジェクト)を返します。

  • getResource

    public Resource getResource()
    

    getResourceメソッドは、認可イベントに関連付けられ、サブジェクトがアクセスしようとしているWebLogicリソースを返します。

これらのコンビニエンス・インタフェースとメソッドの詳細は、Oracle WebLogic Server APIリファレンスのAuditAtzEventインタフェースまたはAuditPolicyEventインタフェースを参照してください。

AuditMgmtEventインタフェース

AuditMgmtEventは、監査チャネルが拡張セキュリティ管理イベント・タイプ・オブジェクトのインスタンス・タイプ(セキュリティ・プロバイダのMBeanなど)を判断するのに役立つコンビニエンス・インタフェースです。このインタフェースには実装する必要があるメソッドは含まれていませんが、監査イベント実装のベスト・プラクティス構造が保持されています。

AuditMgmtEventコンビニエンス・インタフェースの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

AuditRoleEventおよびAuditRoleDeploymentEventインタフェース

AuditRoleDeploymentEventおよびAuditRoleEventコンビニエンス・インタフェースは、監査チャネルが拡張ロール・マッピング・イベント・タイプ・オブジェクトのインスタンス・タイプを判断するのに役立ちます。このインタフェースには実装する必要があるメソッドは含まれていませんが、監査イベント実装のベスト・プラクティス構造が保持されています。


注意:

AuditRoleEventコンビニエンス・インタフェースとAuditRoleDeploymentEventコンビニエンス・インタフェースは、後者がAuditEventインタフェースのみを拡張する点で異なります。(後者はAuditContextインタフェースを拡張しません。)AuditContextインタフェースの詳細は、「監査コンテキスト」を参照してください。


これらのコンビニエンス・インタフェースの詳細は、Oracle WebLogic Server APIリファレンスのAuditRoleEventインタフェースまたはAuditRoleDeploymentEventインタフェースを参照してください。

監査重大度

監査重大度とは、セキュリティ・プロバイダが監査イベントを記録するレベルのことです。構成済みの監査プロバイダが監査リクエストを受け取ると、各監査プロバイダは実行されるイベントの重大度を調べます。イベントの重大度が監査プロバイダの構成に使用されたレベル以上であれば、監査プロバイダはその監査データを記録します。


注意:

監査プロバイダの構成は、WebLogic Server管理コンソールで行います。詳細については、「管理コンソールによるカスタム監査プロバイダの構成」を参照してください。


weblogic.security.spiパッケージに含まれるAuditSeverityクラスは、監査重大度レベルを数値およびテキスト値として、AuditEventオブジェクトを介して監査チャネル(AuditChannel SSPIの実装)に、提供します。重大度の数値はロジックで用いるためのもので、テキスト値は出力用監査記録の作成で用いるためのものです。AuditChannel SSPIとAuditEventオブジェクトの詳細は、「AuditChannel SSPIの実装」および「監査イベントの作成」を参照してください。

監査コンテキスト

一部の監査イベント・コンビニエンス・インタフェースは、実装にコンテキスト情報も含まれていることを示すために、AuditContextインタフェースを拡張します。コンテキスト情報は、監査チャネルによって使用されます。詳細については、「監査チャネル」および「AuditChannel SSPIの実装」を参照してください。

AuditContextインタフェースには以下のメソッドがあります。

  • getContext

    public ContextHandler getContext()
    

    getContextメソッドは、ContextHandlerオブジェクトを返します。ランタイム・クラス(AuditChannel SSPIの実装)は、このオブジェクトから追加の監査情報を取得します。ContextHandlerの詳細は、「ContextHandlerとWebLogicリソース」を参照してください。

例: AuditRoleEventインタフェースの実装

例12-1に、MyAuditRoleEventImpl.javaクラスを示します。これは、監査イベント・コンビニエンス・インタフェース(ここではAuditRoleEventコンビニエンス・インタフェース)の実装例です。このクラスには以下の実装が含まれています。

  • getEventType、getFailureException、getSeverity、およびtoStringというAuditEvent SSPIから継承された4つのメソッド(「AuditEvent SSPIの実装」を参照)

  • ContextHandlerを介してコンテキストについての補足情報を返すgetContextという1つの追加メソッド(ContextHandlerの詳細については、「ContextHandlerとWebLogicリソース」を参照してください)。


    注意:

    例12-1の太字のコードは、クラス宣言とメソッド・シグネチャを示しています。


例12-1 MyAuditRoleEventImpl.java

package mypackage;
import javax.security.auth.Subject;
import weblogic.security.SubjectUtils;
import weblogic.security.service.ContextHandler;
import weblogic.security.spi.AuditRoleEvent;
import weblogic.security.spi.AuditSeverity;
import weblogic.security.spi.Resource;
/*package*/ class MyAuditRoleEventImpl implements AuditRoleEvent
{
   private Subject subject;
   private Resource resource;
   private ContextHandler context;
   private String details;
   private Exception failureException;
   /*package*/ MyAuditRoleEventImpl(Subject subject, Resource resource, 
      ContextHandler context, String details, Exception
      failureException) {
         this.subject = subject;
         this.resource = resource;
         this.context = context;
         this.details = details;
         this.failureException = failureException;
   }
   public Exception getFailureException()
   {
      return failureException;
   }
   public AuditSeverity getSeverity()
   {
      return (failureException == null) ? AuditSeverity.SUCCESS :
         AuditSeverity.FAILURE;
   }
   public String getEventType()
   {
      return "MyAuditRoleEventType";
   }
   public ContextHandler getContext()
   {
      return context;
   }
   public String toString()
   {
      StringBuffer buf = new StringBuffer();
      buf.append("EventType:" + getEventType() + "\n");
      buf.append("\tSeverity: " +
         getSeverity().getSeverityString());
      buf.append("\tSubject: " +
         SubjectUtils.displaySubject(getSubject());
      buf.append("\tResource: " + resource.toString());
      buf.append("\tDetails: " + details);
      if (getFailureException() != null) {
         buf.append("\n\tFailureException:" +
            getFailureException());
    $9ÛÆ  }
      return buf.toString();
   }
}

監査サービスの取得、および取得した監査サービスによる監査イベントの書込み

カスタム・セキュリティ・プロバイダから監査サービスを取得および使用して監査イベントを書き込むには、次の手順に従います。

  1. getAuditorServiceメソッドを使用して監査サービスを返します。


    注意:

    SecurityServicesオブジェクトはinitializeメソッドの一部としてセキュリティ・プロバイダの「Provider」SSPIの実装に渡されることに注意します。(詳細は、「Provider」SSPIの目的について」を参照してください) AuditorServiceオブジェクトは、監査プロバイダが構成されている場合にのみ返されます。


  2. 「AuditEvent SSPIの実装」で作成した監査イベントをインスタンス化し、AuditService.providerAuditWriteEventメソッドを介して監査サービスに送ります。

例:監査サービスを取得および使用してロール監査イベントの書込み

例12-2に、カスタム・ロール・マッピング・プロバイダのランタイム・クラス(MyRoleMapperProviderImpl.java)が監査サービスを取得し、そのサービスを使用して監査イベントを書き込む例を示します。


注意:

MyRoleMapperProviderImpl.javaクラスは、例12-1のMyAuditRoleEventImpl.javaクラスに依存します。


例12-2 MyRoleMapperProviderImpl.java

package mypackage;
import javax.security.auth.Subject;
import weblogic.management.security.ProviderMBean;
import weblogic.security.SubjectUtils;
import weblogic.security.service.ContextHandler;
import weblogic.security.spi.AuditorService;
import weblogic.security.spi.RoleMapper;
import weblogic.security.spi.RoleProvider;
import weblogic.security.spi.Resource;
import weblogic.security.spi.SecurityServices;
public final class MyRoleMapperProviderImpl implements RoleProvider, RoleMapper 
{
   private AuditorService auditor;
   public void initialize(ProviderMBean mbean, SecurityServices 
      services) 
   {
      auditor = services.getAuditorService();
      ...
   }
   public Map getRoles(Subject subject, Resource resource,
      ContextHandler handler)
   {
      ...
      if (auditor != null) 
      {
         auditor.providerAuditWriteEvent(
            new MyRoleEventImpl(subject, resource, context, 
            "why logging this event", 
            null);                // no exception occurred
      }
      ...
   }
}

プロバイダのMBeanから管理操作の監査

SecurityServicesオブジェクトはinitializeメソッドの一部としてセキュリティ・プロバイダの「Provider」SSPIの実装に渡されます。(詳細については、「Provider」SSPIの目的について」を参照してください)プロバイダは、このオブジェクトの監査プロバイダを使用して、ユーザーが正常にログインした場合などにプロバイダ固有のセキュリティ・イベントを監査できます。

セキュリティ・プロバイダのMBean実装には、SecurityServicesオブジェクトは渡されません。ただし、プロバイダは、作成中のユーザーなど、そのMBean操作を監査しなければならない場合があります。

これに対処するために、プロバイダの実行時実装でSecurityServicesオブジェクトをキャッシュし、プロバイダ固有のメカニズムを使用してそのキャッシュをプロバイダのMBean実装に渡すことができます。これにより、プロバイダでそのMBean操作を監査できます。

このタスクの実行方法の例が、Manageable Sample Authentication Providerに示されています。サンプル・プロバイダには、主に次の3つの実装クラスが含まれています。

  • ManageableSampleAuthenticationProviderImplには、セキュリティ実行時実装が含まれます。

  • ManageableSampleAuthenticatorImplには、MBean実装が含まれます。

  • UserGroupDatabaseは、ManageableSampleAuthenticationProviderImplおよびManageableSampleAuthenticatorImplで使用するヘルパー・クラス。

次に、SecurityServicesオブジェクトをキャッシュおよび取得するコード・フローを示します。

  1. ManageableSampleAuthenticationProviderImplのinitializeメソッドには、SecurityServicesオブジェクトが渡されます。

  2. initializeメソッドは、UserGroupDataBaseオブジェクトを作成し、そのUserGroupDataBaseオブジェクトにSecurityServicesオブジェクトを渡します。

  3. UserGroupDataBaseObjectは、SecurityServicesオブジェクトをキャッシュします。また、initializeメソッドは、レルムの名前をルックアップ・キーとして使用し、UserGroupDatabaseオブジェクトをハッシュ表に挿入します。

  4. ManageableSampleAuhenticatorImplのinitメソッドは、そのMBeanからレルム名を検索します。

  5. initメソッドは、レルム名を使用して、対応するUserGroupDataBaseオブジェクトをハッシュ表から検索します。

  6. initメソッドは、UserGroupDatabaseオブジェクトからSecurityServicesオブジェクトを取得し、その監査プロバイダを使用して「createUser」などの管理操作を監査します。


    注意:

    プロバイダの実行時実装は、サーバーの起動時に、プロバイダがデフォルト・レルムの一部である場合にのみ初期化されます。したがって、サーバーの起動時にプロバイダがデフォルト・レルム内にない場合、その実行時実装は初期化されず、プロバイダのMBean実装は、SecurityServicesオブジェクトへのアクセスを取得できません。つまり、サーバーの起動時にプロバイダがデフォルト・レルム内にない場合、プロバイダは、そのMBean操作を監査できません。


例:プロバイダのMBeanから管理操作の監査

例12-3では、ManageableSampleAuhenticatorImplのinitメソッドが、MBeanからレルム名を検索する方法、レルム名を使用して対応するUserGroupDataBaseオブジェクトを(UserGroupDatabaseヘルパー・クラスを介して)ハッシュ表から検索する方法、およびUserGroupDatabaseオブジェクトからSecurityServicesオブジェクトを取得する方法を示します。

また、例12-3では、ManageableSampleAuhenticatorImplがその監査プロバイダを使用してcreateUserなどの管理操作を監査する方法も示します。

例12-3 ManageableSampleAuthenticatorImpl.java

package examples.security.providers.authentication.manageable;
import java.util.Enumeration;
import javax.management.MBeanException;
import javax.management.modelmbean.ModelMBean;
import weblogic.management.security.authentication.AuthenticatorImpl;
import weblogic.management.utils.AlreadyExistsException;
import weblogic.management.utils.InvalidCursorException;
import weblogic.management.utils.NotFoundException;
import weblogic.security.spi.AuditorService;
import weblogic.security.spi.SecurityServices;

public class ManageableSampleAuthenticatorImpl extends AuthenticatorImpl
{
// Manages the user and group definitions for this provider:
private UserGroupDatabase database;

// Manages active queries (see listUsers, listGroups, listMemberGroups):
private ListManager listManager = new ListManager();

// The name of the realm containing this provider:
private String realm;

// The name of this provider:
private String provider;

// The auditor for auditing user/group management operations.
// This is only available if this provider was configured in
// the default realm when the server was booted.
private AuditorService auditor;

public ManageableSampleAuthenticatorImpl(ModelMBean base) throws MBeanException
{
super(base);
}

private synchronized void init() throws MBeanException
{
if (database == null) {
try {
ManageableSampleAuthenticatorMBean myMBean = (ManageableSampleAuthenticatorMBean)getProxy();
database = UserGroupDatabase.getDatabase(myMBean);
realm    = myMBean.getRealm().getName();
provider = myMBean.getName();
SecurityServices services = database.getSecurityServices();
auditor = (services != null) ? services.getAuditorService() : null;
}
catch(Exception e) {
throw new MBeanException(e, "SampleAuthenticatorImpl.init failed");
}
}
}
...
public void createUser(String user, String password, String description)
throws MBeanException, AlreadyExistsException
{
init();
String details = (auditor != null) ?
"createUser(user = " + user + ", password = " + password + ", 
description = " + description + ")" : null;
try {
// we don't support descriptions so just ignore it
database.checkDoesntExist(user);
database.getUser(user).create(password);
database.updatePersistentState();
auditOperationSucceeded(details);
}
catch (AlreadyExistsException   e) { auditOperationFailed(details, e); throw e; }
catch (IllegalArgumentException e) { auditOperationFailed(details, e); throw e; }
}
...
private void auditOperationSucceeded(String details)
{
if (auditor != null) {
auditor.providerAuditWriteEvent(
new ManageableSampleAuthenticatorManagementEvent(realm, provider, details, null)
);
}
}
...
private void auditOperationFailed(String details, Exception failureException)
{
if (auditor != null) {

auditor.providerAuditWriteEvent(
new ManageableSampleAuthenticatorManagementEvent(realm, provider, details, failureException)
);
}
}
}

ベスト・プラクティス:プロバイダのMBeanからの監査イベントのポスト

プロバイダの管理操作で書込み(ユーザーの作成、ユーザーの削除、データの削除など)を行うものは、操作が成功するかどうかに関係なく、監査イベントをポストする必要があります。

プロバイダがMBean操作を監査する場合は、常に以下のベスト・プラクティス・ガイドラインに留意してください。

  • 書込み操作が成功した場合は、INFORMATION監査イベントをポストします。

  • パラメータが不正(ユーザーがすでに存在する、インポート・フォーマット名が不正、ファイル名が存在しない、ファイル・フォーマットが不正など)という理由で書込み操作が失敗した場合は、監査イベントをポストしないようにします。

  • エラー(LDAPException、RuntimeExceptionなど)のために書込み操作が失敗した場合は、FAILURE監査イベントをポストします。

  • インポート操作は部分的に成功できます。たとえば、一部のユーザーがインポートされたものの、プロバイダ内にすでに名前を持つその他のユーザーがスキップされる場合などです。

  • スキップしたデータがプロバイダ内のデータと同じであることが簡単に検出できる場合(たとえば、ユーザー名、説明、パスワードなどが同じ場合など)、WARNINGイベントをポストすることを考慮します。

  • 一部に衝突があったためにデータをスキップする場合(たとえば、ユーザー名は同じだが、パスワードが異なっている場合など)、FAILUREイベントをポストする必要があります。

  • プロバイダに格納されているデータとインポート・データを区別できない場合は、FAILUREイベントをポストします。

PKÑ\.¹$¹PKÛ°-AOEBPS/intro.htm'Pد WebLogic Serverで使用するセキュリティ・プロバイダの開発について

2 WebLogic Serverで使用するセキュリティ・プロバイダの開発について

以下の節では、セキュリティ・プロバイダの開発についての概要を示します。

前提条件

このガイドを読む前に、『Oracle WebLogic Serverのセキュリティの理解』の次の項に目を通しておいてください。

WebLogic Serverのセキュリティには、この他に理解しておく必要のある固有の用語や概念が多数あります。WebLogic Serverのセキュリティ関連ドキュメントに登場するこうした用語と概念については、『Oracle WebLogic Serverのセキュリティの理解』のセキュリティの基礎概念に関する項で定義されています。

開発プロセスの概要

この節では、新しいセキュリティ・プロバイダを開発するプロセスの概要を説明します。各手順の詳細は、このガイドの中で後述します。

カスタム・セキュリティ・プロバイダの主な開発手順は以下のとおりです。

カスタム・セキュリティ・プロバイダの設計

設計プロセスには、次の手順があります。

  1. WebLogicセキュリティ・プロバイダの説明を検討して、カスタム・セキュリティ・プロバイダを作成する必要があるかどうか判断します。

    WebLogicセキュリティ・プロバイダの説明は、『Oracle WebLogic Serverのセキュリティの理解』のWebLogicセキュリティ・プロバイダに関する項と、このガイドの「カスタム<Provider_Typeプロバイダを開発する必要があるか」という項にあります。

  2. 作成するカスタム・セキュリティ・プロバイダのタイプを決めます。

    タイプには認証、IDアサーション、プリンシパル検証、認可、裁決、ロール・マッピング、監査、資格証明マッピング、バージョン管理可能なアプリケーション、証明書パスがあります。これらについては、『Oracle WebLogic Serverセキュリティの理解』のセキュリティ・プロバイダのタイプに関する項で説明します。カスタム・セキュリティ・プロバイダは、WebLogic Serverにあらかじめ用意されているWebLogicセキュリティ・プロバイダの補強または代わりとして使用できます。

  3. カスタム・セキュリティ・プロバイダ用のランタイム・クラスを作成するために実装するセキュリティ・サービス・プロバイダ・インタフェース(SSPI)を、作成するセキュリティ・プロバイダのタイプに基づいて特定します。

    様々なタイプのセキュリティ・プロバイダのSSPIについては、「セキュリティ・サービス・プロバイダ・インタフェース(SSPI)」を参照してください。また、「SSPIクイック・リファレンス」でも要約を参照できます。

  4. SSPIを1つのランタイム・クラスで実装するか、2つのランタイム・クラスで実装するかを決めます。

    こうしたオプションについては、「SSPI階層を理解し、ランタイム・クラスを1つ作成するか2つ作成するかを決定する」を参照してください。

  5. カスタム・セキュリティ・プロバイダを管理するMBeanタイプを生成するために拡張する必要のある必須SSPI MBeanを特定します。ユーザー、グループ、セキュリティ・ロール、およびセキュリティ・ポリシーの処理など、カスタム・セキュリティ・プロバイダを管理する追加機能を提供するには、実装するオプショナルSSPI MBeanを特定することも必要です。

    SSPI MBeanについては、「セキュリティ・サービス・プロバイダ・インタフェース(SSPI) MBean」を参照してください。また、「SSPI MBeanクイック・リファレンス」でも要約を参照できます。

  6. カスタム・セキュリティ・プロバイダで必要なデータベースを初期化する方法を決めます。カスタム・セキュリティ・プロバイダで単純なデータベースを作成することも、情報の格納された既存のデータベースを使用するように構成することもできます。

    この2つのデータベース初期化オプションについては、「セキュリティ・プロバイダ・データベースの初期化」を参照してください。

  7. カスタム・セキュリティ・プロバイダがWebLogicリソースのセキュリティ・ポリシーとの対話の一部として実行する必要がある、データベースの「準備」について特定します。この準備には、デフォルト・グループ、セキュリティ・ロール、またはセキュリティ・ポリシーの作成などがあります。

    詳細については、「セキュリティ・プロバイダとWebLogicリソース」を参照してください。

SSPIの実装によるカスタム・セキュリティ・プロバイダ用のランタイム・クラスの作成

1つまたは2つのランタイム・クラスにおいて、各メソッドの実装を提供することによって特定されたSSPIを実装します。それらのメソッドには、カスタム・セキュリティ・プロバイダから提供されるセキュリティ・サービスの具体的なアルゴリズムが組み込まれていなければなりません。それらのメソッドには、サービスがどのように動作すべきであるかが記述されています。

このタスクの手順は、作成するセキュリティ・プロバイダのタイプによって異なります。この手順については、各セキュリティ・プロバイダの詳細に関する節の「適切なSSPIによるランタイム・クラスの作成」を参照してください。

カスタム・セキュリティ・プロバイダを構成および管理するMBeanタイプの生成

MBeanタイプを生成するには、次の手順に従います。

  1. 必須SSPI MBeanを拡張し、オプショナルSSPI MBeanを実装し、プロバイダの構成と管理に必要なカスタム属性および操作を追加するカスタム・セキュリティ・プロバイダのMBean定義ファイル(MDF)を作成します。

    MDFの詳細は、「MBean定義ファイル(MDF)の基本的な要素について」を参照してください。このタスクの手順については、各セキュリティ・プロバイダの詳細に関する節の「MBean定義ファイル(MDF)の作成」を参照してください。

  2. WebLogic MBeanMakerを通じてMDFを実行し、カスタム・セキュリティ・プロバイダのMBeanタイプの中間ファイル(MBeanインタフェース、MBean実装、およびMBean情報ファイルを含む)を生成します。

    WebLogic MBeanMakerについて、およびWebLogic MBeanMakerがどのようにMDFを使用してJavaファイルを生成するかについては、「WebLogic MBeanMakerによって提供されるものについて」を参照してください。このタスクの手順については、各セキュリティ・プロバイダの詳細に関する節の「WebLogic MBeanMakerを使用してMBeanタイプを生成する」を参照してください。

  3. MBeanの実装ファイルを編集して、オプショナルSSPI MBeanの実装から継承されるすべてのメソッドの内容のほか、MDFに追加されたカスタム属性および操作の結果として生成されるメソッド・スタブの内容も入力します。

  4. 修正された中間ファイル(MBeanタイプ用)とランタイム・クラスをWebLogic MBeanMakerを通じて実行し、MBean JARファイル(MJF)というJARファイルを生成します。

    このタスクの手順については、各セキュリティ・プロバイダの詳細に関する節の「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」を参照してください。

  5. MBean JARファイル(MJF)をWebLogic Server環境にインストールします。

    このタスクの手順については、各セキュリティ・プロバイダの詳細に関する節の「WebLogic Server環境にMBeanタイプをインストールする」を参照してください。

コンソール拡張機能の記述

コンソール拡張を使用すると、JavaServer Pages (JSP)をWebLogic Server管理コンソールに追加して、カスタム・セキュリティ・プロバイダの管理と構成をサポートできます。コンソール拡張を使用すると、存在しない管理コンソール・サポートを追加したり、管理目的の対話をカスタマイズしたりできます。

WebLogic Server管理コンソールでカスタム・セキュリティ・プロバイダ用の完全な構成および管理サポートを利用するには、以下の場合にコンソール拡張を記述する必要があります。

  • カスタム・セキュリティ・プロバイダ用のMBeanタイプを生成するときにオプショナルSSPI MBeanを実装しないことを決定したが、管理コンソールでカスタム・セキュリティ・プロバイダを構成および管理する場合(つまり、WebLogic Serverコマンドライン・インタフェースを代わりに使用しない場合)

    Oracleでは、MBeanタイプの生成(「カスタム・セキュリティ・プロバイダを構成および管理するMBeanタイプの生成」を参照)によってカスタム・セキュリティ・プロバイダを構成および管理することをお薦めします。しかし、ユーザーが記述したコンソール拡張を介してカスタム・セキュリティ・プロバイダを完全に構成および管理することもできます。

  • カスタム認証プロバイダでないカスタム・セキュリティ・プロバイダ用にオプショナルSSPI MBeanを実装する場合

    オプショナルSSPI MBeanを実装してカスタム認証プロバイダを開発する場合は、管理コンソールでMBeanタイプの属性が自動的にサポートされることになります(オプショナルSSPI MBeanから継承されます)。カスタム認可プロバイダなどの他のタイプのカスタム・セキュリティ・プロバイダでは、このサポートは受けられません。

  • シンプルなデータ型としては表せないカスタム属性を、MBean定義ファイル(MDF)に追加する場合(MDFはカスタム・セキュリティ・プロバイダのMBeanタイプの生成に使用されます)

    カスタム・セキュリティ・プロバイダの「詳細」タブにカスタム属性が自動的に表示されるのは、それらがシンプルなデータ型(文字列、MBean、ブール、整数値)として表される場合のみです。非定型のデータ型(フィンガ・プリントのイメージなど)として表されるカスタム属性がある場合、管理コンソールではカスタマイズを行わない限りその属性を表示できません。

  • カスタム操作をMBean定義ファイル(MDF) (カスタム・セキュリティ・プロバイダのMBeanタイプを作成するために使用される)に追加します。

    カスタム操作は様々なので、管理コンソールではそれらを自動的に表示または処理する方法が分かりません。カスタム操作の例としては、声紋用のマイクや、インポート/エクスポート・ボタンなどがあります。管理コンソールでは、カスタマイズしない限りこれらの操作を表示および処理できません。

管理コンソールは、以下の場合にも拡張します。

  • 企業ブランディング - たとえば、カスタム・セキュリティ・プロバイダの構成および管理に使用するページにロゴを表示する場合など

  • 連結 - たとえば、カスタム・セキュリティ・プロバイダの構成および管理に使用するすべてのフィールドを、個別のタブや場所ではなく1ページに表示する場合など

コンソールの拡張の詳細は、『Oracle WebLogic Server管理コンソールの拡張』を参照してください。

カスタム・セキュリティ・プロバイダの構成


注意:

構成プロセスは、カスタム・セキュリティ・プロバイダを開発した本人、または指定された管理者が遂行できます。


構成プロセスでは、WebLogic Server管理コンソールを使用してカスタム・セキュリティ・プロバイダに構成情報を提供します。カスタム・セキュリティ・プロバイダを管理するためのMBeanタイプを生成している場合、管理コンソールでカスタム・セキュリティ・プロバイダを「構成」することは、MBeanタイプの特定のインスタンスを作成することも意味します。

管理コンソールによるセキュリティ・プロバイダの構成の詳細は、『Oracle WebLogic Serverの保護』を参照してください。

セキュリティ・ポリシー、セキュリティ・ロール、および資格証明マップを管理するメカニズムの提供

特定のタイプのセキュリティ・プロバイダでは、それらに関連付けられているセキュリティ・データを管理する方法を管理者に提供する必要があります。たとえば認可プロバイダでは、セキュリティ・ポリシーを管理する方法を管理者に提供しなければなりません。同じように、ロール・マッピング・プロバイダではセキュリティ・ロールを、資格証明マッピング・プロバイダでは資格証明マップを管理する方法が管理者に必要になります。

WebLogic認可、ロール・マッピング、および資格証明マッピングの各プロバイダの場合、管理者用の管理メカニズムがWebLogic Server管理コンソールにすでに用意されています。ただし、これらのセキュリティ・プロバイダのカスタム版を開発する場合はこれらのメカニズムを継承しないで、セキュリティ・ポリシー、セキュリティ・ロール、および資格証明マップを管理するための独自の方法を提供する必要があります。これらのメカニズムにはカスタム・セキュリティ・プロバイダのデータベースから適切なセキュリティ・データを読み書きすることが必須となりますが、管理コンソールとは統合しても統合しなくてもかまいません。

詳細については、以下のいずれかの節を参照してください。

PK׃y,P'PPKÛ°-AOEBPS/intro_roadmap.htmÞ*!Õ æ¦‚è¦ã¨ãƒ­ãƒ¼ãƒ‰ãƒžãƒƒãƒ—

1 概要とロードマップ

以下の節では、このドキュメントの内容と構成について説明します。

ドキュメントのスコープ

このドキュメントでは、セキュリティ・ベンダーやアプリケーション開発者向けに、WebLogic Serverで使用するセキュリティ・プロバイダの新規開発に必要な情報を提供します。

対象読者

このドキュメントは、WebLogic Server用に独自のセキュリティ・プロバイダを記述する独立系ソフトウェア・ベンダー(ISV)向けです。ここでは、このドキュメントをお読みになるISVの大半はセキュリティの概念をしっかりと理解している高機能アプリケーションの開発者であり、セキュリティの基礎概念については説明を要しないものと想定しています。また、セキュリティ・ベンダーおよびアプリケーション開発者はWebLogic ServerとJava (JMX (Java Management eXtensions)を含む)に精通しているものと想定しています。

このドキュメントの手引き

このドキュメントでは、セキュリティ・ベンダーやアプリケーション開発者向けに、WebLogic Serverで使用するセキュリティ・プロバイダの新規開発に必要な情報を提供します。

このドキュメントの構成は次のとおりです。

関連ドキュメント

OracleのWebサイトでは、WebLogic Serverの全ドキュメントが公開されています。セキュリティ・プロバイダに関わるセキュリティ・ベンダーおよびアプリケーション開発者にとって重要と思われるWebLogic Serverドキュメントを以下に示します。

以下の情報も利用できます。

このリリースでの新機能と変更点

WebLogic Serverのこのリリースに追加された新機能の一覧については、『Oracle WebLogic Serverの新機能』を参照してください。

PKÏäã*Þ*PKÛ°-AOEBPS/mdf_ref.htm€ÿ MBean定義ファイル(MDF)要素の構文

A MBean定義ファイル(MDF)要素の構文

MBean定義ファイル(MDF) はWebLogic MBeanMakerユーティリティへの入力ファイルです。WebLogic MBeanMakerユーティリティは、このファイルを使用してカスタム・セキュリティ・プロバイダを管理するためのMBeanタイプを作成します。MDFは、単一のMBeanタイプを記述する有効な整形式XMLファイルとしてフォーマットされる必要があります。以下の節では、有効なMDFで使用可能なすべての要素と属性について説明します。

MBeanType (ルート)要素

すべてのMDFにはMBeanTypeというルート要素が1つ含まれていなければなりません。この要素の構文は次のとおりです。

<MBeanType Name= string   optional_attributes>
     subelements 
</MBeanType> 

MBeanType要素は、MBeanタイプのプログラム上の内部的な名前を指定するName属性を含む必要があります。(ユーザー・インタフェース内に表示される名前を指定するには、DisplayName属性を使用します)。他の属性は省略可能です。

以下の例は、MBeanType (ルート)要素を簡略化して示したものです。

<MBeanType Name="MyMBean" Package="com.mycompany"> 
   <MBeanAttribute Name="MyAttr" Type="java.lang.String" Default="Hello World"/> 
</MBeanType> 

MBeanType (ルート)要素内に指定されている属性は、そのMBeanタイプからインスタンス化されるすべてのMBeanに適用されます。特定のMBeanインスタンスの属性をオーバーライドするには、MBeanAttributeサブ要素で属性を指定する必要があります。詳細については、「MBeanAttributeサブ要素」を参照してください。

表A-1では、MBeanType(ルート)要素で使用可能な属性について説明します。「JMX仕様/Oracle拡張機能」列は、当該属性がJMX仕様に対するOracle拡張機能なのか、それともJMXの標準属性なのかを示します。なお、Oracle拡張機能は他のJava EE Webサーバー上では動作しない場合があることに注意してください。

表A-1 MBeanType(ルート)要素の属性

属性JMX仕様/Oracle拡張機能指定可能な値説明

Abstract

Oracle拡張機能

trueまたはfalse

値がtrueの場合には、当該MBeanタイプは(Java抽象クラスと同様に)インスタンス化できないことを意味します。ただし、他のMBeanタイプは当該MBeanタイプの属性と操作を継承できます。trueを指定した場合には、管理タスクを実行するための非抽象MBeanタイプを別途作成する必要があります。この属性の値を指定しない場合は、falseと見なされます。

Deprecated

Oracle拡張機能

trueまたはfalse

当該MBeanタイプが非推奨扱いになっていることを示します。この情報は生成されたJavaソースに表示されると共に、管理アプリケーションでの使用を想定してModelMBeanInfoオブジェクトにも格納されます。この属性を指定しない場合、値はfalseと見なされます。

Description

JMX仕様

String型

当該MBeanタイプに関連付けられる任意の文字列で、生成されたクラスのJavadocなど、様々な場所に現れます。デフォルト値または仮定される値はありません。

注意: ユーザー・インタフェースに表示される説明を指定するには、DisplayName属性を使用します。

DisplayName

JMX仕様

String型

ユーザー・インタフェースに表示されるMBeanタイプのインスタンス識別用の名前。タイプXのインスタンスの場合、デフォルトDisplayNameは「タイプXのインスタンス」となります。通常、この値はインスタンス作成時にオーバーライドされます。

Extends

Oracle拡張機能

パス名

このMBeanタイプが拡張する完全修飾MBeanタイプ名。

Implements

Oracle拡張機能

カンマ区切り

リスト

このMBeanタイプを実装する完全修飾MBeanタイプ名からなるカンマ区切りリスト。

「Extends」も参照してください。

Name

JMX仕様

String型

当該MBeanタイプのプログラム上の内部的な名前を指定する必須属性。

Package

Oracle拡張機能

String型

当該MBeanタイプのパッケージ名を指定し、WebLogic MBeanMakerによって作成されるクラス・ファイルの場所を決定します。この属性を指定しない場合には、MBeanタイプはJavaデフォルト・パッケージに格納されます。

注意: パッケージ名が異なっている限り、MBeanタイプ名は同じ名前でもかまいません。

PersistPolicy

JMX仕様

/OnUpdate

永続化がどのように行われるかを、以下のいずれかで指定します。

OnUpdate :属性は更新のたびに格納されます。

注意: MBeanType要素内で指定された場合、この属性値は、個々のMBeanAttributeサブ要素内のあらゆる設定をオーバーライドします。


MBeanAttributeサブ要素

MBeanタイプ内の属性ごとに、MBeanAttributeサブ要素のインスタンスを1つ記述する必要があります。MBeanAttributeサブ要素の形式は次のとおりとします。

<MBeanAttribute Name=string   optional_attributes /> 

MBeanAttributeサブ要素は、MBeanタイプのJava属性のプログラム上の内部的な名前を指定するName属性を含む必要があります。(ユーザー・インタフェース内に表示される名前を指定するには、DisplayName属性を使用します)。他の属性は省略可能です。

以下の例は、MBeanType要素内のMBeanAttributeサブ要素を簡略化して示したものです。

<MBeanType Name="MyMBean" Package="com.mycompany"> 
    <MBeanAttribute Name= "WhenToCache" 
     Type="java.lang.String"
     LegalValues="'cache-on-reference','cache-at-initialization','cache-never'" 
     Default= "cache-on-reference"
    />
</MBeanType> 

MBeanAttributeサブ要素内に指定されている属性は、特定のMBeanインスタンスに適用されます。あるMBeanタイプからインスタンス化されるすべてのMBeanの属性を設定するには、MBeanType (ルート)要素内に属性を指定する必要があります。詳細については、「MBeanType (ルート)要素」を参照してください。

表A-2では、MBeanAttributeサブ要素で使用可能な属性について説明します。「JMX仕様/Oracle拡張機能」列は、当該属性がJMX仕様に対するOracle拡張機能なのかどうかを示します。なお、Oracle拡張機能は他のJava EE Webサーバー上では動作しない場合があることに注意してください。

表A-2 MBeanAttributeサブ要素の属性

属性JMX仕様/Oracle拡張機能指定可能な値説明

Default

JMX仕様

String型

MBeanAttributeサブ要素からゲッター・メソッドまたはキャッシュ済みの値が提供されない場合に返すべき値。文字列は、この属性に指定されたデータ型と互換性を持つ型のオブジェクトに評価しなければならないJava式を表します。

この属性を指定しない場合、値はnullと見なされます。この想定値を使用し、かつLegalNull属性をfalseに設定してある場合には、WebLogic MBeanMakerとWebLogic Serverから例外がスローされます。

Deprecated

Oracle拡張機能

trueまたはfalse

当該MBean属性が非推奨扱いになっていることを示します。この情報は生成されたJavaソースに表示されると共に、管理アプリケーションでの使用を想定してModelMBeanInfoオブジェクトにも格納されます。この属性を指定しない場合、値はfalseと見なされます。

Description

JMX仕様

String型

当該MBean属性に関連付けられる任意の文字列で、生成されたクラスのJavadocなど、様々な場所に現れます。デフォルト値または仮定される値はありません。

注意: ユーザー・インタフェース内に表示される説明を指定するには、DisplayName属性を使用します。

Dynamic

Oracle拡張機能

trueまたはfalse

動的MBeanに対する変更が、サーバーを再起動しなくても有効になります。デフォルトでは、すべてのカスタム・セキュリティ・プロバイダMBean属性は動的ではありません。

8.1および7.0では、すべてのカスタム・セキュリティ・プロバイダMBean属性は動的です。

Encrypted

Oracle拡張機能

trueまたはfalse

値がtrueの場合、このMBean属性は設定されると暗号化されることを示します。この属性を指定しない場合、値はfalseと見なされます。

InterfaceType

Oracle拡張機能

String型

WebLogic MBeanMakerで生成されるMBeanインタフェースのかわりに使用すべきインタフェースのクラス名。InterfaceTypeに指定できる値は以下のとおりです。

  • int

  • long

  • float

  • double

  • char

  • byte

「Type」がjava.lang.String、java.lang.String[]、またはjava.lang.Propertiesの場合は指定しません。

IsIs

JMX仕様

trueまたはfalse

生成されるJavaインタフェースでMBean属性のブール値にアクセスするのに(get<AttributeName>メソッドではなく) JMX is<AttributeName>メソッドを使用するかどうかを指定します。この属性を指定しない場合、値はfalseと見なされます。

LegalNull

Oracle拡張機能

trueまたはfalse

現在のMBeanAttributeサブ要素がnullを値として取り得るかどうかを指定します。この属性を指定しない場合、値はtrueと見なされます。

LegalValues

Oracle拡張機能

カンマ区切りリスト

現在のMBeanAttributeサブ要素の取り得る値の固定集合を指定します。この属性を指定しない場合、MBean属性では、Type属性で指定されているタイプの任意の値を指定できます。

注意: このリスト内の要素は、サブ要素のType属性で指定されるデータ型に変換可能なものでなければなりません。

Max

Oracle拡張機能

Integer型

数値型のMBean属性タイプに限り、属性の最大値(その値を含む)を表す数値を指定します。この属性を指定しない場合には、値はデータ型の許容最大値まで可能です。

Min

Oracle拡張機能

Integer型

数値型のMBean属性タイプに限り、属性の最小値(その値を含む)を表す数値を指定します。この属性を指定しない場合には、値はデータ型の許容最小値まで可能です。

Name

JMX仕様

String型

当該MBean属性のプログラム上の内部的な名前を指定する必須属性。

Type

JMX仕様

Javaクラス名

この属性のデータ型の完全修飾クラス名。これに対応するクラスがクラスパスに存在していなければなりません。この属性を指定しない場合、値はjava.lang.Stringと見なされます。指定できる値は以下のとおりです。

  • java.lang.Integer

  • java.lang.Integer[]

  • java.lang.Long

  • java.lang.Long[]

  • java.lang.Float

  • java.lang.Float[]

  • java.lang.Double

  • java.lang.Double[]

  • java.lang.Char

  • java.lang.Char[]

  • java.lang.Byte

  • java.lang.Byte[]

  • java.lang.String

  • java.lang.String[]

  • java.util.Properties

Writeable

JMX仕様

trueまたはfalse

値がtrueの場合には、MBean APIを通じてMBeanAttributeの値を設定できるようになります。MBeanTypeまたはMBeanAttributeでこの属性を指定しない場合、値はtrueと見なされます。

MBeanType要素に指定すると、この値は個々のMBeanAttributeサブ要素のデフォルトと見なされます。


MBeanConstructorサブ要素

MBeanConstructorサブ要素は現在のところ、WebLogic MBeanMakerでは使用されておらず、Java Management eXtensions 1.0仕様(http://jcp.org/aboutJava/communityprocess/final/jsr003/index.html)に準拠し、上位互換性を保つためにサポートされているだけです。したがって、ここでは、MBeanConstructorサブ要素(およびそれに関連するMBeanConstructorArgサブ要素)の属性の詳細については説明を省略します。

MBeanOperationサブ要素

MBeanタイプでサポートされている操作(メソッド)ごとに、MBeanOperationサブ要素のインスタンスを1つ記述する必要があります。MBeanOperationの形式は次のとおりとします。

<MBeanOperation Name=string    optional_attributes >
     <MBeanOperationArg Name=string   optional_attributes />
</MBeanOperation> 

MBeanOperationサブ要素は、その操作のプログラム上の内部的な名前を指定するName属性を含む必要があります。(ユーザー・インタフェース内に表示される名前を指定するには、DisplayName属性を使用します)。他の属性は省略可能です。

MBeanOperation要素内には、その操作(メソッド)で使用される引数ごとにMBeanOperationArgサブ要素のインスタンスを1つ記述する必要があります。MBeanOperationArgの形式は次のとおりとします。

<MBeanOperationArg Name=string optional_attributes />

Name属性には操作の名前を指定する必要があります。MBeanOperationArgのオプション属性はTypeだけで、これは、特定タイプのJava属性の動作を指定するJavaクラス名を与えるものです。この属性を指定しない場合、値はjava.lang.Stringと見なされます。

次の例は、MBeanType要素内のMBeanOperationサブ要素とMBeanOperationArgサブ要素を簡略化して示したものです。

<MBeanType Name="MyMBean" Package="com.mycompany"> 
   <MBeanOperation 
    Name= "findParserSelectMBeanByKey"
    ReturnType="XMLParserSelectRegistryEntryMBean"
    Description="Given a public ID, system ID, or root element tag, returns the
 object name of the corresponding XMLParserSelectRegistryEntryMBean."
   >
      <MBeanOperationArg Name="publicID" Type="java.lang.String"/>
      <MBeanOperationArg Name="systemID" Type="java.lang.String"/>
      <MBeanOperationArg Name="rootTag" Type="java.lang.String"/>
   </MBeanOperation>
</MBeanType> 

表A-3では、MBeanOperationサブ要素で使用可能な属性について説明します。「JMX仕様/Oracle拡張機能」列は、当該属性がJMX仕様に対するOracle拡張機能なのかどうかを示します。なお、Oracle拡張機能は他のJava EE Webサーバー上では動作しない場合があることに注意してください。

表A-3 MBeanOperationサブ要素の属性

属性JMX仕様/Oracle拡張機能指定可能な値説明

Deprecated

Oracle拡張機能

trueまたはfalse

当該MBean操作が非推奨扱いになっていることを示します。この情報は生成されたJavaソースに表示されると共に、管理アプリケーションでの使用を想定してModelMBeanInfoオブジェクトにも格納されます。この属性を指定しない場合、値はfalseと見なされます。

Description

JMX仕様

String型

当該MBean操作に関連付けられる任意の文字列で、生成されたクラスのJavadocなど、様々な場所に現れます。デフォルト値または仮定される値はありません。

注意: ユーザー・インタフェース内に表示されるèª8)Ç֬明を指定するには、DisplayName属性を使用します。

Name

JMX仕様

String型

当該MBean操作のプログラム上の内部的な名前を指定する必須属性。

ReturnType

JMX仕様

String型

当該操作から返されるJavaオブジェクトの完全修飾クラス名を表す文字列。ReturnTypeはvoidまたは以下のいずれかになります。

  • int

  • int[]

  • long

  • long[]

  • float

  • float[]

  • double

  • double[]

  • char

  • char[]

  • byte

  • byte[]

  • java.lang.String

  • java.lang.String[]

  • java.util.Properties


表A-4では、MBeanOperationArgサブ要素で使用可能な属性について説明します。「JMX仕様/Oracle拡張機能」列は、当該属性がJMX仕様に対するOracle拡張機能なのかどうかを示します。なお、Oracle拡張機能は他のJava EE Webサーバー上では動作しない場合があることに注意してください。

表A-4 MBeanOperationArgサブ要素の属性

属性JMX仕様/Oracle拡張機能指定可能な値説明

Description

JMX仕様

String型

当該MBean操作の引数に関連付けられる任意の文字列で、生成されたクラスのJavadocなど、様々な場所に現れます。デフォルト値または仮定される値はありません。

Name

JMX仕様

String型

当該引数の名前を指定する必須属性。

Type

JMX仕様

String型

当該MBean操作の引数のデータ型。この属性を指定しない場合、値はjava.lang.Stringと見なされます。Typeに指定できる値は以下のとおりです。

  • int

  • int[]

  • long

  • long[]

  • float

  • float[]

  • double

  • double[]

  • char

  • char[]

  • byte

  • byte[]

  • java.lang.String

  • java.lang.String[]

  • java.util.Properties


MBean操作の例外

MBean定義ファイル(MDF)は、JDK例外の型またはweblogic.management.utils例外の型のみを使用する必要があります。例A-1で示したコードの一部を次に示します。MBeanOperationサブ要素内でMBeanExceptionが使用されています。

<MBeanOperation
Name = "registerPredicate"   
ReturnType = "void"    
Description = "Registers a new predicate with the specified class name."   
>
<MBeanOperationArg
Name = "predicateClassName" 
Type = "java.lang.String" 
Description = "The name of the Java class that implements the predicate." 
/>
<MBeanException>weblogic.management.utils.InvalidPredicateException</MBeanException>
<MBeanException>weblogic.management.utils.AlreadyExistsException</MBeanException>
</MBeanOperation>

例:有効な整形式MBean定義ファイル(MDF)

例A-1と例A-2に、この付録で説明した属性の多くを使用したMBean定義ファイル(MDF)の例を示します。例A-1には、述語を管理し、述語とそれらの引数に関するデータを読み取るMBeanタイプを生成するためのMDFを示します。例A-2には、WebLogic (デフォルト)認可プロバイダのMBeanタイプを生成するためのMDFを示します。

例A-1 PredicateEditor.xml

<?xml version="1.0" ?>
<!DOCTYPE MBeanType SYSTEM "commo.dtd">
<MBeanType 
Name = "PredicateEditor" 
Package = "weblogic.security.providers.authorization" 
Implements = "weblogic.security.providers.authorization.PredicateReader" 
PersistPolicy = "OnUpdate" 
Abstract = "false" 
Description = "This MBean manages predicates and reads data about predicates and their arguments.&lt;p&gt;"
>
<MBeanOperation
Name = "registerPredicate"   
ReturnType = "void"    
Description = "Registers a new predicate with the specified class name."   
>
<MBeanOperationArg
Name = "predicateClassName" 
Type = "java.lang.String" 
Description = "The name of the Java class that implements the predicate." 
/>
     <MBeanException>weblogic.management.utils.InvalidPredicateException</MBeanException>
<MBeanException>weblogic.management.utils.AlreadyExistsException</MBeanException>
</MBeanOperation>

<MBeanOperation 
Name = "unregisterPredicate" 
ReturnType = "void" 
Description = "Unregisters the currently registered predicate."   >

<MBeanOperationArg 
Name = "predicateClassName" 
Type = "java.lang.String" 
Description = "The name of the Java class that implements predicate to be unregistered." 
/>
<MBeanException>weblogic.management.utils.NotFoundException</MBeanException>
</MBeanOperation>
</MBeanType>

例A-2 DefaultAuthorizer.xml

<?xml version="1.0" ?>
<!DOCTYPE MBeanType SYSTEM "commo.dtd">
<MBeanType 
Name = "DefaultAuthorizer" 
DisplayName = "DefaultAuthorizer" 
Package = "weblogic.security.providers.authorization" 
Extends ="weblogic.management.security.authorization.DeployableAuthorizer"
Implements = "weblogic.management.security.authorization.PolicyEditor,
weblogic.security.providers.authorization.PredicateEditor" 
PersistPolicy = "OnUpdate" 
Description = "This MBean represents configuration attributes 
for the WebLogic Authorization provider. &lt;p&gt;"
>
<MBeanAttribute 
Name = "ProviderClassName" 
Type = "java.lang.String"
Writeable = "false"
Default"&quot;weblogic.security.providers.authorization.DefaultAuthorizationProviderImpl&quot;"
Description = "The name of the Java class used to load the WebLogic 
Authorization provider."
/>
<MBeanAttribute 
Name = "Description"
Type = "java.lang.String"
Writeable = "false"
Default = "&quot;Weblogic Default Authorization Provider&quot;"    Description =
"A short description of the WebLogic Authorization provider."  />
<MBeanAttribute 
Name = "Version" 
Type = "java.lang.String" 
Writeable = "false" 
Default = "&quot;1.0&quot;" 
Description = "The version of the WebLogic Authorization provider." 
/>
</MBeanType>
PKOҕ'B©8©PKÛ°-A OEBPS/adj.htm€ÿ 裁決プロバイダ

8 裁決プロバイダ

この章では、裁決プロバイダの概念と機能、およびカスタム裁決プロバイダの開発手順について説明します。

裁決とは、複数の認可プロバイダが構成されている場合に発生するおそれのある認可上の競合を、それぞれの認可プロバイダのアクセス決定の結果を比較検討することで解消する手続きです。WebLogic Serverでは、裁決プロバイダを使用して、複数のアクセス決定から返される結果を調停し、PERMITかDENYの最終判定を下します。また、裁決プロバイダでは、単一の認可プロバイダのアクセス決定からABSTAINの回答が返されたときにどうすべきかを指定することもできます。

以下の節では、裁決プロバイダの概念と機能、およびカスタム裁決プロバイダの開発手順について説明します。

裁決プロセス

裁決プロバイダは認可プロセスの一部として使用されるので、使用方法は「認可プロセス」で説明されています。

カスタム裁決プロバイダを開発する必要があるか

WebLogic Serverのデフォルト(つまりアクティブな)セキュリティ・レルムにはWebLogic裁決プロバイダが含まれています。WebLogic裁決プロバイダは、複数の認可プロバイダのアクセス決定から異なる結果が返された場合に裁決を行い、WebLogicリソースへのアクセスを許可するかどうかを最終的に判定します。

WebLogic裁決プロバイダには、動作を制御する「完全一致の許可が必要」という属性があります。「完全一致の許可が必要」属性は、デフォルトではTRUEに設定されており、WebLogic裁決プロバイダはその設定に従って次のように動作します。

「完全一致の許可が必要」属性をFALSEに変更した場合、WebLogic裁決プロバイダは次のように動作します。

上記の説明と異なる動作の裁決プロバイダが必要な場合、カスタム裁決プロバイダを開発する必要があります(裁決プロバイダでは、1つの認可プロバイダのアクセス決定がABSTAINを返した場合に、指定したセキュリティ要件に基づいてどのように対処するかを指定することもできます)。

カスタム裁決プロバイダの開発方法

WebLogic裁決プロバイダが開発者のニーズを満たさない場合、次の手順でカスタム裁決プロバイダを開発することができます。

  1. 適切なSSPIによるランタイム・クラスの作成、または必要に応じてバルク認可プロバイダを使用

  2. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  3. 管理コンソールによるカスタム裁決プロバイダの構成

適切なSSPIによるランタイム・クラスの作成

ランタイム・クラスを作成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム裁決プロバイダのランタイム・クラスを作成します。

AdjudicationProviderV2 SSPIの実装

AdjudicationProviderV2 SSPIを実装するには、「「Provider」SSPIの目的について」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • getAdjudicator

    public AdjudicatorV2 getAdjudicator()
    

    getAdjudicatorメソッドは、AdjudicatorV2 SSPIの実装を取得します。MyAdjudicationProviderImpl.javaという1つのランタイム・クラスの場合、getAdjudicatorメソッドの実装は次のようになります。

    return this;
    

    ランタイム・クラスが2つの場合、getAdjudicatorメソッドの実装は次のようになります。

    return new MyAdjudicatorImpl;
    

    これは、AdjudicationProviderV2 SSPIを実装するランタイム・クラスが、AdjudicatorV2 SSPIを実装するクラスを取得する場合のファクトリとして使用されるためです。

AdjudicationProviderV2 SSPIとgetAdjudicatorメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

AdjudicatorV2 SSPIの実装

AdjudicatorV2 SSPIを実装するには、以下のメソッドの実装を提供する必要があります。

  • initialize

    public void initialize(AuthorizerMBean[] accessDecisionClassNames)
    

    initializeメソッドは、「アクセスは許されるか」という質問への回答を得るために呼び出されるすべての構成済み認可プロバイダのアクセス決定の名前を初期化します。accessDecisionClassNamesパラメータは、裁決プロバイダのadjudicateメソッドで特定のアクセス決定による判定結果を支持するために使用することもできます。認可プロバイダとアクセス決定の詳細は、第7章「認可プロバイダ」を参照してください。

  • adjudicate

    public boolean adjudicate(Result[] results, Resource resource,
                                ContextHandler handler)
    

    adjudicateメソッドは、構成済み認可プロバイダのアクセス決定から返された判定結果をすべて受け取り、「アクセスは許されるか」という質問への回答を決定します。

Adjudicator SSPIとinitializeおよびadjudicateメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

バルク裁決プロバイダ

WebLogic Serverのこのリリースには、以下に示すバルク・アクセス・バージョンの裁決プロバイダSSPIインタフェースがあります。

  • BulkAdjudicationProvider

  • BulkAdjudicator

バルク・アクセスSSPIインタフェースを使用すると、裁決プロバイダにおいて1回の呼出しで複数の判定リクエストを取得できます。これまでのように、たとえば「for」ループで複数の呼出しを実行する必要はありません。バルクSSPIバリアントの目的は、プロバイダ実装において内部的なパフォーマンスの最適化を利用できるようにすることです。たとえば、渡されたResourceオブジェクトの多くが同じポリシーで保護されていることを検出することで、それらの判定結果が同じになると推測できるようになります。

バルク・バージョンでないSSPIインタフェースとバルク・バージョンのSSPIインタフェースの使用方法には若干の違いがあります。

BulkAdjudicator.adjudicate()メソッドはWebLogic Serverの認可マネージャによって渡されたMap (Resource, Result)インスタンス群のListを取り、これにはバルク・アクセス決定の結果が含まれます。結果の順序はBulkAdjudicator.initialize()メソッドに渡されたアクセス決定クラス名の順序と同じです。

BulkAdjudicator.adjudicate()メソッドはResourceオブジェクトのSetを返すことにも注意が必要です。このセットにResourceオブジェクトがある場合、そのオブジェクトへのアクセスが付与されていますが、そうでない場合にはアクセスは拒否されています。

WebLogic MBeanMakerを使用してMBeanタイプを生成する

カスタム・セキュリティ・プロバイダのMBeanタイプを生成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム裁決プロバイダのMBeanタイプを作成します。

  1. MBean定義ファイル(MDF)の作成

  2. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  3. WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

  4. WebLogic Server環境にMBeanタイプをインストールする


    注意:

    複数のセキュリティ・プロバイダのサンプルで、これらの手順の実行方法を示します。

    この節で説明する手順はすべて、Windows環境での作業を想定しています。


MBean定義ファイル(MDF)の作成

MBean定義ファイル(MDF)を作成するには、次の手順に従います。

  1. サンプル認証プロバイダのMDFをテキスト・ファイルにコピーします。


    注意:

    サンプル認証プロバイダのMDFは、SampleAuthenticator.xmlです(現在、サンプル裁決プロバイダはありません)。


  2. MDFで<MBeanType>要素と<MBeanAttribute>要素の内容をカスタム裁決プロバイダに合わせて修正します。

  3. カスタム属性および操作(つまり、<MBeanAttribute>および<MBeanOperation>要素)をMDFに追加します。

  4. ファイルを保存します。


    注意:

    MDF要素の構文についての詳細なリファレンスは、付録A「MBean定義ファイル(MDF)要素の構文」に収められています。


WebLogic MBeanMakerを使用してMBeanタイプを生成する

MDFを作成したら、WebLogic MBeanMakerを使用してそれを実行できます。WebLogic MBeanMakerは現在のところコマンドライン・ユーティリティで、入力としてMDFを受け取り、MBeanインタフェース、MBean実装、関連するMBean情報ファイルなどの中間Javaファイルをいくつか出力します。これらの中間ファイルが合わさって、カスタム・セキュリティ・プロバイダのMBeanタイプになります。

MBeanタイプの生成手順は、カスタム裁決プロバイダの設計に応じて異なります。必要な設計に合わせて適切な手順を実行してください。

カスタム操作を追加しない場合

カスタム裁決プロバイダのMDFにカスタム操作を含めない場合、次の手順に従います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true
    weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    WebLogic MBeanMakerではMDFを一度に1つ処理します。そのため、MDFが複数ある(つまり裁決プロバイダが複数ある)場合には、このプロセスを繰り返す必要があります。


  3. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

カスタム操作を追加する場合

カスタム裁決プロバイダのMDFにカスタム操作を含める場合、質問に答えながら手順を進めてください。

MBeanタイプを作成するのは初めてですか。その場合は、次の手順に従ってください:

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true
    weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり裁決プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. MDFのすべてのカスタム操作に対して、メソッド・スタブを使用してメソッドを実装します。

  4. ファイルを保存します。

  5. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

既存のMBeanタイプの更新ですか。その場合は、次の手順に従ってください:

  1. WebLogic MBeanMakerによって現在のメソッドの実装が上書きされないように、既存のMBean実装ファイルを一時ディレクトリにコピーします。

  2. 新しいDOSシェルを作成します。

  3. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true
    weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり裁決プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  4. MDFを変更して元のMDFにはないカスタム操作を含めた場合、メソッド・スタブを使用してメソッドを実装します。

  5. 完成した、つまりすべてのメソッドを実装したMBean実装ファイルを保存します。

  6. このMBean実装ファイルを、WebLogic MBeanMakerがMBeanタイプの実装ファイルを配置したディレクトリにコピーします。このディレクトリは、手順3でfilesdirとして指定したものです。(ステップ3の結果としてWebLogic MBeanMakerで生成されたMBean実装ファイルがオーバーライドされます)。

  7. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

生成されるMBeanインタフェース・ファイルについて

MBeanインタフェース・ファイルとは、ランタイム・クラスまたはMBean実装が構成データを取得するために使用するMBeanのクライアント側APIです。「「Provider」SSPIの目的について」で説明されているように、これはinitializeメソッドで使用するのが一般的です。

WebLogic MBeanMakerでは、作成済のMDFからMBeanタイプを生成するので、生成されるMBeanインタフェース・ファイルの名前は、そのMDF名の後に「MBean」というテキストが付いたものになります。たとえば、WebLogic MBeanMakerでMyAdjudicator MDFを実行すると、MyAdjudicatorMBean.javaというMBeanインタフェース・ファイルが生成されます。

WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

WebLogic MBeanMakerでMDFを実行して中間ファイルを作成し、MBean実装ファイルを編集して適切なメソッドの実装を提供したら、カスタム裁決プロバイダのMBeanファイルとランタイム・クラスをMBean JARファイル(MJF)にパッケージ化する必要があります。このプロセスも、WebLogic MBeanMakerによって自動化されます。

カスタム裁決プロバイダのMJFを作成するには、次の手順に従います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMJF=jarfile -Dfiles=filesdir weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMJFフラグはWebLogic MBeanMakerが新しいMBeanタイプを含むJARファイルを構築すべきであることを示し、jarfileはMJFの名前、filesdirはWebLogic MBeanMakerでMJFにJAR化する対象ファイルが存在する場所を示します。

    この時点でコンパイルが行われるので、エラーが発生するおそれがあります。jarfileが指定されていて、エラーが発生しなかった場合には、指定された名前のMJFが作成されます。


    注意:

    カスタム・セキュリティ・プロバイダのJARファイルを作成する際には、一連のXMLバインディング・クラスと1つのスキーマも生成されます。そのスキーマに関連付けるネームスペースを選択できます。それにより、使用しているカスタム・クラスとOracleのカスタム・クラスとの競合を防ぐことができます。ネームスペースのデフォルトはvendorです。-targetNameSpace引数をWebLogicMBeanMakerまたは関連するWLMBeanMaker antタスクに渡すことで、このデフォルトを変更できます。

    既存のMJFを更新する場合は、単純にMJFを削除して再生成します。WebLogic MBeanMakerにも -DIncludeSourceオプションがあり、それを指定すると、生成されるMJFにソース・ファイルを含めるかどうかを制御できます。ソース・ファイルには、生成されたソースとMDFそのものがあります。デフォルトはfalseです。このオプションは、-DMJFを使用しない場合には無視されます。


生成されたMJFは、自らのWebLogic Server環境にインストールすることも、顧客に配布してそれぞれのWebLogic Server環境にインストールしてもらうこともできます。

WebLogic Server環境にMBeanタイプをインストールする

MBeanタイプをWebLogic Server環境にインストールするには、MJFをWL_HOME\server\lib\mbeantypesディレクトリにコピーします。ここで、WL_HOMEはWebLogic Serverの最上位のインストール・ディレクトリです。このインストール・コマンドによって、カスタム裁決プロバイダが「デプロイ」されます。つまり、カスタム裁決プロバイダをWebLogic Server管理コンソールから管理できるようになります。


注意:

MBeanタイプをインストールするデフォルトのディレクトリは、WL_HOME\server\lib\mbeantypesです。初めて使用するバージョンが9.0の場合、セキュリティ・プロバイダは...\domaindir\lib\mbeantypesからもロードできます。ただし、サーバーを起動するときに-Dweblogic.alternateTypesDirectory=<dir>コマンドライン・フラグを使用すれば、WebLogic Serverが追加ディレクトリでMBeanタイプを検索します。<dir>は、ディレクトリ名のカンマ区切りのリストです。このフラグを使用する場合、WebLogic Serverは常に最初にWL_HOME\server\lib\mbeantypesからMBeanタイプをロードします。その後で、追加ディレクトリにあるすべての有効なアーカイブを検索して、ロードします。このとき拡張子は考慮されません。

たとえば、-Dweblogic.alternateTypesDirectory = dirX,dirYの場合、WebLogic ServerはまずWL_HOME\server\lib\mbeantypesからMBeanタイプをロードし、次にdirXおよびdirYにある有効なアーカイブをロードします。WebLogic Serverに追加ディレクトリでMBeanタイプを検索するよう指示する際に、Javaセキュリティ・マネージャを使用している場合は、weblogic.policyファイルを更新して、MBeanタイプ(その結果として、カスタム・セキュリティ・プロバイダ)に適した許可を付与することも必要になります。詳細は、『Oracle WebLogic Serverセキュリティのプログラミング』のJavaセキュリティを使用したWebLogicリソースの保護に関する項を参照してください。


カスタム裁決プロバイダを構成することによって(「管理コンソールによるカスタム裁æ±Ý"ùºãƒ—ロバイダの構成」を参照) MBeanタイプのインスタンスを作成して、GUI、他のJavaコード、またはAPIからそれらのMBeanインスタンスを使用できます。たとえば、WebLogic Server管理コンソールを使用して、属性を取得/設定したり操作を呼び出したりすることもできますし、他のJavaオブジェクトを開発して、そのオブジェクトでMBeanをインスタンス化し、それらのMBeanから提供される情報に自動的に応答させることもできます。なお、これらのMBeanインスタンスをバックアップしておくことをお薦めします。

管理コンソールによるカスタム裁決プロバイダの構成

カスタム裁決プロバイダを構成するということは、裁決サービスを必要とするアプリケーションがアクセス可能なセキュリティ・レルムにカスタム裁決プロバイダを追加するということです。

カスタム・セキュリティ・プロバイダの構成は管理タスクですが、カスタム・セキュリティ・プロバイダの開発者が行うこともできます。WebLogic Server管理コンソールを使用してカスタム裁決プロバイダを構成する手順は、『Oracle WebLogic Serverの保護』のWebLogicセキュリティ・プロバイダの構成に関する項で説明されています。

PK°Â®ç†Ý†PKÛ°-AOEBPS/cert.htm€ÿ 証明書パス・プロバイダ

15 証明書パス・プロバイダ

この章では、カスタム・セキュリティ・プロバイダに証明書の検索および検証機能を追加する前に理解しておく必要がある基本情報と、カスタム・セキュリティ・プロバイダに証明書の検索および検証機能を追加する手順について説明します。

WebLogicセキュリティ・サービスは、着信双方向SSL、発信SSL、アプリケーション・コード、およびWebLogic Webサービスについて、X509証明書チェーンを検索および検証するフレームワークを提供します。証明書の検索と検証(CLV)フレームワークは、証明書チェーンを検索および検証する新しいセキュリティ・プラグイン・フレームワークです。このフレームワークは、JDK証明書パス機能を拡張および完了し、カスタム証明書パス・プロバイダを作成できるようにします。

以下の節では、カスタム・セキュリティ・プロバイダに証明書の検索および検証機能を追加する前に理解しておく必要がある基本情報と、カスタム・セキュリティ・プロバイダに証明書の検索および検証機能を追加する手順について説明します。

証明書の検索と検証の概念

証明書パスは、メモリー内に証明書チェーンを格納するJDKクラスです。「証明書パス」という用語は、証明書チェーンを検索および検証するためのJDKアーキテクチャおよびフレームワークを指す場合にも使われます。

証明書パス・プロバイダには、証明書パス検証プロバイダと証明書パス・ビルダーの2種類があります。

WebLogic証明書パス・プロバイダは、JDKとWebLogic証明書パスSPIの両方を使用して作成します。

証明書の検索と検証のプロセス

証明書の検索と検証のプロセスを図15-1に示します。

図15-1 証明書の検索と検証のプロセス

図15-1の説明が続きます
「図15-1 証明書の検索と検証のプロセス」の説明

証明書パス検証プロバイダと証明書パス・ビルダーを実装する必要があるか

証明書パス・プロバイダはいくつかの方法で実装できます。

  • 作成と検証を行う証明書パス・ビルダーを実装できます。この場合は、以下の操作を行います。

    1. 検証プロバイダSPIを実装します。

    2. ビルダーSPIを実装します。

    3. ビルダーSPIの一部として作成する証明書チェーンを検証する必要があります。プロバイダは一度だけ呼び出されます。検証用に改めて呼び出す必要はありません。

    4. 検証アルゴリズムとして何を使用するか、どのセレクタをサポートするか、および信頼性のあるCAを使用するかどうかを指定します。

  • 検証のみを行う証明書パス検証プロバイダを実装できます。この場合は、以下の操作を行います。

    1. 検証プロバイダSPIを実装します。

    2. 検証アルゴリズムとして何を使用するか、および信頼性のあるCAを使用するかどうかを指定します。

  • 作成のみを行う証明書パス・ビルダーを実装できます。この場合は、以下の操作を行います。

    1. ビルダーSPIを実装します。

    2. 作成した証明書チェーンを検証するかどうかを指定します。

    3. どのセレクタをサポートするか、および信頼性のあるCAを使用するかどうかを指定します。

証明書パス・プロバイダSPI MBean

WebLogic Serverには、以下の2種類の証明書パス・プロバイダSPI MBeanがあります。いずれもCertPathProviderMBeanの拡張です。

  • CertPathBuilderMBeanは、プロバイダが証明書チェーンを検索できることを示します。追加の属性またはメソッドはありません。CertPathBuilderプロバイダは、このMBeanを拡張するカスタムMBeanを実装する必要があります。

  • CertPathValidatorMBeanは、プロバイダが証明書チェーンを検証できることを示します。追加の属性またはメソッドはありません。CertPathValidatorプロバイダは、このMBeanを拡張するカスタムMBeanを実装する必要があります。

証明書パス・プロバイダは、その種類によって、MBeanのいずれか1つまたは両方を拡張する必要があります。作成と検証の両方をサポートするセキュリティ・プロバイダは、例15-1で示すように、両方のMBeanを拡張するMBeanを作成する必要があります。

例15-1 サンプル証明書パスMBean MDF

<?xml version="1.0" ?>
<!DOCTYPE MBeanType SYSTEM "commo.dtd">

<MBeanType
Name          = "MyCertPathProvider"
DisplayName   = "MyCertPathProvider"
Package       = "com.acme"
Extends       = "weblogic.management.security.pk.CertPathBuilder"
Implements    = "weblogic.management.security.pk.CertPathValidator"
PersistPolicy = "OnUpdate"
>
<MBeanAttribute
Name          = "ProviderClassName"
Type          = "java.lang.String"
Writeable     = "false"
Default       = "&quot;com.acme.MyCertPathProviderRuntimeImpl&quot;"
/>

<MBeanAttribute
Name          = "Description"
Type          = "java.lang.String"
Writeable     = "false"
Default       = "&quot;My CertPath Provider&quot;"
/>

<MBeanAttribute
Name          = "Version"
Type          = "java.lang.String"
Writeable     = "false"
Default       = "&quot;1.0&quot;"
/>

 <!-- add custom attributes for the configuration data needed by this provider -->
<MBeanAttribute
Name          = "CustomConfigData"
Type          = "java.lang.String"
/>

WebLogic証明書パス検証プロバイダSSPI

WebLogic証明書パス検証プロバイダSSPIは、以下の4つの部分で構成されています。

WebLogic証明書パス・ビルダーSSPI

WebLogic証明書パス・ビルダーSSPIは、以下の4つの部分で構成されています。

WebLogic Server証明書パスSSPIとJDK SPIとの関係

WebLogicセキュリティ・フレームワーク・プロバイダとは異なり、証明書パス・プロバイダの現在の実装は、WebLogicインタフェースおよびJDKインタフェースの緊密な統合に依存します。この統合は、証明書パス・プロバイダを作成する際に最も明らかになります。

証明書パス検証プロバイダを作成する場合は、次のタスクを実行する必要があります。

  1. 「WebLogic MBeanMakerを使用してMBeanタイプを生成する」の説明に従って、CertPathProviderMBeanを拡張するCertPathValidatorMBeanを作成します。

  2. 「JDK CertPathBuilderSpiインタフェース、CertPathValidatorSpiインタフェースのいずれか、または両方の実装」の説明に従って、JDK java.security.cert.CertPathValidatorSpiを実装します。

    JDK実装には、WebLogic CertPathValidatorParametersSpiにキャストできるJDK CertPathParametersオブジェクトが渡されます。これにより、信頼性のあるCAおよびContextHandlerを取得するWebLogicメソッドにアクセスできるようになります。また、このオブジェクトを使用すると、WebLogic証明書パス・プロバイダ・オブジェクトにもアクセスできます。

    信頼性のあるCA、ContextHandler、MBeanで提供されるカスタム構成データへのアクセスを許可する証明書パス・プロバイダSSPI実装など、証明書チェーンの検証に必要なデータを指定するには、「CertPathValidatorSpi実装でCertPathValidatorParametersSpi SSPIの使用」で説明されているようにCertPathValidatorParametersSpiを使用します。

    CertPathValidatorSpi実装からMBeanのカスタム構成データを直接取得する方法はないので、WebLogic証明書パス・プロバイダは重要な役割を果たします。WebLogic証明書パス・プロバイダは、カスタムMBeanデータをJDK実装で使用可能にするための固有のメカニズムを提供できます。

  3. 「証明書パス・プロバイダSSPIの実装」の説明に従って、WebLogic証明書パス・プロバイダSSPIを実装します。特に、MBeanへのフックを実行し、そのカスタム構成データをCertPathValidatorSpi実装で利用できるようにするには、例15-2で示すように、証明書パス・プロバイダSSPIのinitializeメソッドを使用します。

  4. 「JDKセキュリティ・プロバイダSPIの実装」の説明に従って、CertPathValidatorSpi実装を登録するJDKセキュリティproviderを実装します。このコーディングは直感的にはわかりにくいこともあるため、例15-5に実例を示しています。

証明書パス・ビルダーを作成する場合は、次のタスクを実行する必要があります。

  1. 「WebLogic MBeanMakerを使用してMBeanタイプを生成する」の説明に従って、CertPathProviderMBeanを拡張するCertPathBuilderMBeanを作成します。

  2. 「JDK CertPathBuilderSpiインタフェース、CertPathValidatorSpiインタフェースのいずれか、または両方の実装」の説明に従って、JDK java.security.cert.CertPathBuilderSpiを実装します。

    JDK実装には、WebLogic CertPathBuilderParametersSpiにキャストできるJDK CertPathParametersオブジェクトが渡されます。これにより、信頼性のあるCA、セレクタ、およびContextHandlerを取得するWebLogicメソッドにアクセスできるようになります。また、このオブジェクトを使用すると、WebLogic証明書パス・プロバイダ・オブジェクトにもアクセスできます。

    信頼性のあるCA、ContextHandler、MBeanで提供されるカスタム構成データへのアクセスを許可する証明書パス・プロバイダSSPI実装など、証明書チェーンの検証に必要なデータを指定するには、「CertPathBuilderSpi実装でCertPathBuilderParametersSpi SSPIの使用」で説明されているようにCertPathBuilderParametersSpiを使用します。

    CertPathBuilderSpi実装からMBeanのカスタム構成データを直接取得する方法はないので、WebLogic証明書パス・プロバイダは重要な役割を果たします。WebLogic証明書パス・プロバイダは、カスタムMBeanデータをJDK実装で使用可能にするための固有のメカニズムを提供できます。

  3. 「証明書パス・プロバイダSSPIの実装」の説明に従って、WebLogic証明書パス・プロバイダSSPIを実装します。特に、MBeanへのフックを実行し、そのカスタム構成データをCertPathBuilderSpi実装で利用できるようにするには、例15-2で示すように、証明書パス・プロバイダSSPIのinitializeメソッドを使用します。

  4. 「JDKセキュリティ・プロバイダSPIの実装」の説明に従って、CertPathBuilderSpi実装を登録するJDKセキュリティproviderを実装します。このコーディングは直感的にはわかりにくいこともあるため、例15-5に実例を示しています。

カスタム証明書パス・プロバイダを開発する必要があるか

WebLogic Serverには、証明書パス・プロバイダと証明書レジストリがあります。

WebLogic Server証明書パス・プロバイダは、証明書パス・ビルダーと証明書パス検証プロバイダの両方です。証明書パス・プロバイダは、証明書のパスを完了させ、特定のWebLogic Serverインスタンスのために構成された、信頼性のあるCAを使用して、証明書を検証します。証明書パス・プロバイダは、自己署名型のチェーンまたは自己署名型の認証局によって発行されたチェーンのみを作成できます。認証局は、サーバーの信頼性のあるCAにリストされている必要があります。未完成の証明書チェーンの場合は、無効です。プロバイダは、EndCertificateSelectorセレクタのみを使用します。

また、WebLogic Server証明書パス・プロバイダは、チェーン内の署名をチェックして、チェーンが期限切れでないことを確認し、チェーン内のいずれかの証明書が、サーバー用に構成された信頼性のあるCAによって発行されたものであることを確認します。いずれかのチェックが失敗した場合、そのチェーンは有効ではありません。最後に、プロバイダは、各証明書の基本的な制約(証明書が他の証明書を発行できるかどうか)をチェックし、証明書がチェーン内の適切な場所にあることを確認します。

WebLogic Server証明書パス・プロバイダは、セキュリティ・レルム内の証明書パス・ビルダーおよび証明書パス検証プロバイダとして使用できます。

WebLogic Server証明書レジストリは、初期状態の証明書パス・プロバイダです。管理者は、信頼性のある目的の証明書のリストを管理コンソールから構成できます。証明書レジストリはビルダー/検証プロバイダです。選択条件は、EndCertificateSelector、SubjectDNSelector、IssuerDNSerialNumberSelector、SubjectKeyIdentifierのいずれかです。返される証明書チェーンには、目的の証明書のみがあります。プロバイダでは、チェーンを検証する際に目的の証明書が登録されていることのみを確認し、それ以上のチェックは行いません。

証明書パス・プロバイダと証明書レジストリの両方を構成できます。これは、信頼性のあるCAによって署名された場合にのみ証明書チェーンが有効であり、目的の証明書がレジストリにあることを確認するために行うことができます。

WebLogic Server証明書パス・プロバイダが開発者のニーズを満たさない場合、カスタム証明書パス・プロバイダを開発することができます。

カスタム証明書パス・プロバイダの開発方法

WebLogic証明書パス・プロバイダまたは証明書レジストリが開発者のニーズを満たさない場合、次の手順でカスタム証明書パス・プロバイダを開発することができます。

適切なSSPIによるランタイム・クラスの作成

ランタイム・クラスを作成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム証明書パス・プロバイダのランタイム・クラスを作成します。

JDK CertPathBuilderSpiインタフェース、CertPathValidatorSpiインタフェースのいずれか、または両方の実装

java.security.cert.CertPathBuilderSpiインタフェースは、CertPathBuilderクラスのサービス・プロバイダ・インタフェース(SPI)です。すべてのCertPathBuilder実装は、このインタフェース(CertPathBuilderSpi)を実装するクラスを含む必要があります。

java.security.cert.CertPathValidatorSpiインタフェースは、CertPathValidatorクラスのサービス・プロバイダ・インタフェース(SPI)です。すべてのCertPathValidator実装は、このインタフェース(CertPathValidatorSpi)を実装するクラスを含む必要があります。

例15-6では、CertPathBuilderSpiインタフェースとCertPathValidatorSpiインタフェースの実装例を示します。

証明書パス・プロバイダSSPIの実装

CertPathProvider SSPIインタフェースは、JDK CertPathValidator SPIおよびCertPathBuilder SPIによって提供されるサービスを公開し、プロバイダの操作(初期化、開始、停止など)を可能にします。

特に、MBeanへのフックを実行し、そのカスタム構成データをCertPathBuilderSpi実装またはCertPathValidatorSpi実装で利用できるようにするには、例15-2で示すように、証明書パス・プロバイダSSPIのinitializeメソッドを使用します。

より詳細な例については、例15-6に示します。

例15-2 コード(抜粋) : MBeanからのカスタム構成データの取得

public class MyCertPathProviderRuntimeImpl implements CertPathProvider
{
:
:
   public void initialize(ProviderMBean mBean, SecurityServices securityServices)
   {
     MyCertPathProviderMBean myMBean = (MyCertPathProviderMBean)mBean;
     description = myMBean.getDescription();
     customConfigData = myMBean.getCustomConfigData();
:
}
:
   // make my config data available to my JDK CertPathBuilderSpi and    
   // CertPathValidatorSpi impls
   private String getCustomConfigData() { return customConfigData; }
}
:
static public class MyJDKCertPathBuilder extends CertPathBuilderSpi
{
:
//get my runtime implementation instance which holds the configuration
//data needed to build and validate the cert path
MyCertPathProviderRuntimeImpl runtime =
(MyCertPathProviderRuntimeImpl)params.getCertPathProvider();
String myCustomConfigData = runtime.getCustomConfigData();

例15-5では、使用するJDK実装をJDKに登録する方法を示します。

CertPathProvider SSPIを実装するには、「「Provider」SSPIの目的について」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • getCertPathBuilder

    public CertPathBuilder getCertPathBuilder()
    

    例15-3で示すように、JDK CertPathBuilderSpi実装を呼び出す証明書パス・プロバイダのJDK CertPathBuilderを取得します。CertPathBuilderは、証明書チェーンを検索し、必要に応じて検証します。

例15-3 コード(抜粋) : getCertPathBuilder

public void initialize(ProviderMBean mBean, SecurityServices securityServices)   
{
:
     // get my JDK cert path impls
     try {
       certPathBuilder = CertPathBuilder.getInstance(BUILDER_ALGORITHM);
     } catch (NoSuchAlgorithmException e) { throw new AssertionError("..."); }
  • getCertPathValidator

    public CertPathValidator getCertPathValidator()
    

    例15-4で示すように、JDK CertPathValidatorSpi実装を呼び出す証明書パス・プロバイダのJDK CertPathValidatorを取得します。CertPathValidatorは、証明書チェーンを検証します。

例15-4 コード(抜粋) : getCertPathValidator

public void initialize(ProviderMBean mBean, SecurityServices securityServices)   
{
:
     // get my JDK cert path impls
     try {
       certPathValidator = CertPathValidator.getInstance(VALIDATOR_ALGORITHM);
     } catch (NoSuchAlgorithmException e) { throw new AssertionError("..."); }
   }

JDKセキュリティ・プロバイダSPIの実装

JDKセキュリティprovider SPIを実装し、そのSPIを使用してCertPathBuilderSpi実装またはCertPathValidatorSpi実装をJDKに登録します。その実装を使用して、JDK実装をプロバイダのinitializeメソッドに登録します。

例15-6に、サンプル証明書パス・プロバイダのランタイム・クラスの作成例を示します。例15-5では、JDKセキュリティproviderを実装するサンプル・コードの一部を示します。

例15-5 JDKセキュリティ・プロバイダの実装

public class MyCertPathProviderRuntimeImpl implements CertPathProvider
{
private static final String MY_JDK_SECURITY_PROVIDER_NAME = "MyCertPathProvider";
private static final String BUILDER_ALGORITHM = MY_JDK_SECURITY_PROVIDER_NAME + "CertPathBuilder";
private static final String VALIDATOR_ALGORITHM = MY_JDK_SECURITY_PROVIDER_NAME + "CertPathValidator";
:
:
   public void initialize(ProviderMBean mBean, SecurityServices securityServices)
   {
     MyCertPathProviderMBean myMBean = (MyCertPathProviderMBean)mBean;

     description = myMBean.getDescription();

     customConfigData = myMBean.getCustomConfigData();

// register my cert path impls with the JDK
// so that the CLV framework may invoke them via
// the JDK cert path apis.
if (Security.getProvider(MY_JDK_SECURITY_PROVIDER_NAME) == null) {
   AccessController.doPrivileged(
     new PrivilegedAction() {
       public Object run() {
         Security.addProvider(new MyJDKSecurityProvider());
         return null;
       }
     }
   );
}
:
// This class implements the JDK security provider that registers 
// this provider's cert path builder and cert path validator implementations 
// with the JDK.
private class MyJDKSecurityProvider extends Provider
 {
   private MyJDKSecurityProvider()
    {
      super(MY_JDK_SECURITY_PROVIDER_NAME, 1.0, "MyCertPathProvider JDK CertPath provider");
      put("CertPathBuilder." + BUILDER_ALGORITHM,
 "com.acme.MyPathProviderRuntimeImpl$MyJDKCertPathBuilder");
      put("CertPathValidator." + VALIDATOR_ALGORITHM,
 "com.acme.MyCertPathProviderRuntimeImpl$MyJDKCertPathValidator");
    }
 }
}

CertPathBuilderSpi実装でCertPathBuilderParametersSpi SSPIの使用

JDK実装には、WebLogic CertPathBuilderParametersSpiにキャストできるJDK CertPathParametersオブジェクトが渡されます。これにより、信頼性のあるCA、セレクタ、およびContextHandlerを取得するWebLogicメソッドにアクセスできるようになります。また、このオブジェクトを使用すると、WebLogic証明書パス・プロバイダ・オブジェクトにもアクセスできます。以下のメソッドを利用できます。

  • getCertPathProvider

    CertPathProvider getCertPathProvider() 
    

    証明書パス・プロバイダで提供されているサービスをWebLogicセキュリティ・フレームワークに公開する証明書パス・プロバイダSSPIインタフェースを取得します。特に、MBeanへのフックを実行し、そのカスタム構成データをCertPathBuilderSpi実装で利用できるようにするには、例15-2で示すように、証明書パス・プロバイダSSPIのinitializeメソッドを使用します。

  • getCertPathSelector

    CertPathSelector getCertPathSelector() 
    

    証明書パスを検索する際の選択条件を保持するCertPathSelectorインタフむÿ§ãƒ¼ã‚¹ã‚’取得します。

    WebLogic Serverでは、サポートされている証明書チェーン検索の種類ごとに1つずつのCertPathSelectorインタフェースを実装するweblogic.security.pk内の一連のクラスを使用できます。そのため、getCertPathSelectorメソッドは、以下の派生クラスのいずれか1つを返します。

  • EndCertificateSelector: 目的の証明書がある証明書チェーンを検索および検証する場合に使用します。

  • IssuerDNSerialNumberSelector: 目的の証明書の発行者DNとシリアル番号から証明書チェーンを検索および検証する場合に使用します。

  • SubjectDNSelector: 目的の証明書のサブジェクトDNから証明書チェーンを検索および検証する場合に使用します。

  • SubjectKeyIdentifierSelector: 目的の証明書のサブジェクト・キー識別子(X509証明書のオプション・フィールド)から証明書チェーンを検索および検証する場合に使用します。

    各セレクタ・クラスには、選択データおよびコンストラクタを取得するためのメソッドが1つまたは複数あります。

    CertPathBuilderSpi実装は、どのセレクタをサポートするかを決めます。CertPathBuilderSpi実装は、CertPathBuilderParametersSpi SSPIのgetCertPathSelectorメソッドを使用して、証明書パスを検索する際の選択条件を保持するCertPathSelectorを取得する必要があります。その種類のセレクタをサポートしている場合、CertPathBuilderSpi実装は、そのセレクタを使用して証明書チェーンを作成および検証します。その種類のセレクタをサポートしていない場合は、呼出し側に伝播されるInvalidAlgorithmParameterExceptionをスローします。

  • getContext()

    ContextHandler getContext() 
    

    証明書パスの作成および検証に使用可能な追加パラメータを渡すことができるContextHandlerを取得します。

  • getTrustedCAs()

    X509Certificate[] getTrustedCAs() 
    

    証明書チェーンの作成に使用できる、信頼性のある認証局のリストを取得します。信頼性のあるCAでチェーンを作成する必要がある場合、CertPathBuilderSpi実装は、このリスト内のCAを使用する必要があります。

  • clone

    Object clone()
    

    このインタフェースのクローンは作成できません。

CertPathValidatorSpi実装でCertPathValidatorParametersSpi SSPIの使用

JDK実装には、WebLogic CertPathValidatorParametersSpiにキャストできるJDK CertPathParametersオブジェクトが渡されます。これにより、信頼性のあるCAおよびContextHandlerを取得するWebLogicメソッドにアクセスできるようになります。また、このオブジェクトを使用すると、WebLogic証明書パス・プロバイダ・オブジェクトにもアクセスできます。CLVフレームワークは、検証プロバイダSPIに渡された証明書チェーンが適切な順序になっている(目的の証明書から開始される)こと、および各証明書が次の証明書に署名していることを確認します。以下のメソッドを利用できます。

  • getCertPathProvider

    CertPathProvider getCertPathProvider() 
    

    証明書パス・プロバイダで提供されているサービスをWebLogicセキュリティ・フレームワークに公開する証明書パス・プロバイダSSPIインタフェースを取得します。特に、MBeanへのフックを実行し、そのカスタム構成データをCertPathValidatorSpi実装で利用できるようにするには、例15-2で示すように、証明書パス・プロバイダSSPIのinitializeメソッドを使用します。

  • getContext()

    ContextHandler getContext() 
    

    証明書パスの作成および検証に使用可能な追加パラメータを渡すことができるContextHandlerを取得します。

    SSLは、1つまたは複数のCertPathValidatorオブジェクトを呼び出して追加検証を実行する前に、一部の組込み検証を実行します。検証プロバイダは、実行済みの検証を検出することで、必要な検証の規模を縮小できます。

    たとえば、WebLogic証明書パス・プロバイダは、SSLが実行するものと同じ検証を実行します。SSLによって呼び出された場合でも、その検証を繰り返す必要はありません。そのため、SSLは、検証プロバイダに渡すコンテキストに一部の情報を保存し、どの検証がすでに実行済みかを示します。weblogic.security.SSL.SSLValidationConstants CHAIN_PREVALIDATED_BY_SSLフィールドは、SSLが証明書チェーンを検証済みかどうかを示すブール値です。アプリケーション・コードは、このフィールドをテストできます。フィールドは、SSLが証明書チェーンを検証済みの場合はtrue、まだ検証していない場合はfalseに設定されます。

  • getTrustedCAs()

    X509Certificate[] getTrustedCAs() 
    

    証明書チェーンの検証に使用できる、信頼性のある認証局のリストを取得します。信頼性のあるCAでチェーンを検証する必要がある場合、CertPathBuilderSpi実装は、このリスト内のCAを使用する必要があります。

  • clone

    Object clone() 
    

    このインタフェースのクローンは作成できません。

ビルダーまたは検証プロバイダの結果の返し

JDK CertPathBuilder実装またはCertPathValidator実装は、java.security.cert.CertPathValidatorResultインタフェースまたはjava.security.cert.CertPathValidatorResultインタフェースを実装するオブジェクトを返す必要があります。

ユーザー独自の結果の実装を作成することも、WebLogic Serverコンビニエンス・ルーチンを使用することもできます。

WebLogic Serverには、WLSCertPathBuilderResultとWLSCertPathValidatorResultという2つの便利な結果実装クラスがあります。どちらのクラスもweblogic.security.pkにあり、java.security.cert.CertPathValidatorResultまたはjava.security.cert.CertPathValidatorResultのインスタンスを返す場合に使用できます。


注意:

返される結果は、WebLogicセキュリティ・フレームワーク内を通りません。


例:サンプル証明書パス・プロバイダの作成

例15-6では、証明書パス・ビルダー/検証プロバイダの例を示します。例には、コード・フローを説明する拡張コメントが記載されています。

例15-6で使用する証明書パスMBeanは、例15-1に示されています。

例15-6 サンプル証明書パス・プロバイダの作成

package com.acme;

import weblogic.management.security.ProviderMBean;
import weblogic.security.pk.CertPathSelector;
import weblogic.security.pk.SubjectDNSelector;
import weblogic.security.pk.WLSCertPathBuilderResult;
import weblogic.security.pk.WLSCertPathValidatorResult;
import weblogic.security.service.ContextHandler;
import weblogic.security.spi.CertPathBuilderParametersSpi;
import weblogic.security.spi.CertPathProvider;
import weblogic.security.spi.CertPathValidatorParametersSpi;
import weblogic.security.spi.SecurityServices;
import weblogic.security.SSL.SSLValidationConstants;

import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.Provider;
import java.security.Security;
import java.security.cert.CertPath;
import java.security.cert.CertPathBuilder;
import java.security.cert.CertPathBuilderResult;
import java.security.cert.CertPathBuilderSpi;
import java.security.cert.CertPathBuilderException;
import java.security.cert.CertPathParameters;
import java.security.cert.CertPathValidator;
import java.security.cert.CertPathValidatorResult;
import java.security.cert.CertPathValidatorSpi;
import java.security.cert.CertPathValidatorException;
import java.security.cert.X509Certificate;

public class MyCertPathProviderRuntimeImpl implements CertPathProvider
{
   private static final String MY_JDK_SECURITY_PROVIDER_NAME = "MyCertPathProvider";
   private static final String BUILDER_ALGORITHM = MY_JDK_SECURITY_PROVIDER_NAME + "CertPathBuilder";
   private static final String VALIDATOR_ALGORITHM = MY_JDK_SECURITY_PROVIDER_NAME + "CertPathValidator";

   // Used to invoke my JDK cert path builder / validator implementations
   private CertPathBuilder   certPathBuilder;
   private CertPathValidator certPathValidator;

   // remember my custom configuration data from my mbean
   private String customConfigData;

   private String description;

   public void initialize(ProviderMBean mBean, SecurityServices securityServices)
   {
     MyCertPathProviderMBean myMBean = (MyCertPathProviderMBean)mBean;

     description = myMBean.getDescription();

     customConfigData = myMBean.getCustomConfigData();

     // register my cert path impls with the JDK
     // so that the CLV framework may invoke them via
     // the JDK cert path apis.
     if (Security.getProvider(MY_JDK_SECURITY_PROVIDER_NAME) == null) {
       AccessController.doPrivileged(
         new PrivilegedAction() {
           public Object run() {
            Security.addProvider(new MyJDKSecurityProvider());
             return null;
           }
         }
       );
     }

     // get my JDK cert path impls
     try {
       certPathBuilder = CertPathBuilder.getInstance(BUILDER_ALGORITHM);
     } catch (NoSuchAlgorithmException e) { throw new AssertionError("..."); }

     try {
       certPathValidator = CertPathValidator.getInstance(VALIDATOR_ALGORITHM);
     } catch (NoSuchAlgorithmException e) { throw new AssertionError("..."); }
   }

   public void             shutdown          () {                     }
   public String           getDescription       () { return description;    }
   public CertPathBuilder  getCertPathBuilder   () { return certPathBuilder;}
   public CertPathValidator getCertPathValidator () { return certPathValidator;}

   // make my config data available to my JDK CertPathBuilderSpi and    
   // CertPathValidatorSpi impls
   private String getCustomConfigData() { return customConfigData; }

   /**
   * This class contains JDK cert path builder implementation for this provider.
   */

   static public class MyJDKCertPathBuilder extends CertPathBuilderSpi
    {
     public CertPathBuilderResult
      engineBuild(CertPathParameters genericParams)
       throws CertPathBuilderException, InvalidAlgorithmParameterException
     {

   // narrow the CertPathParameters to the WLS ones so we can get the
   // data needed to build and validate the cert path
   if (!(genericParams instanceof CertPathBuilderParametersSpi)) {
     throw new InvalidAlgorithmParameterException("The CertPathParameters must be a
 weblogic.security.pk.CertPathBuilderParametersSpi instance.");
   }

   CertPathBuilderParametersSpi params = (CertPathBuilderParametersSpi)genericParams;

   // get my runtime implementation instance which holds the configuration
   // data needed to build and validate the cert path
   MyCertPathProviderRuntimeImpl runtime = (MyCertPathProviderRuntimeImpl)params.getCertPathProvider();
   String myCustomConfigData = runtime.getCustomConfigData();

   // get the selector which indicates which cert path the caller wants built.
   // it can be an EndCertificateSelector, SubjectDNSelector,    
   // IssuerDNSerialNumberSelector
   // or a SubjectKeyIdentifier.
   CertPathSelector genericSelector = params.getCertPathSelector();

   // decide which kinds of selectors this builder wants to support.

   if (genericSelector instanceof SubjectDNSelector) {

    // get the subject dn of the end certificate of the cert path the caller     
   // wants built
    SubjectDNSelector selector = (SubjectDNSelector)genericSelector;
    String subjectDN = selector.getSubjectDN();

   // if your implementation requires trusted CAs, get them.
   // otherwise, ignore them.  that is, it's a quality of service
   // issue whether or not you require trusted CAs.
   X509Certificate[] trustedCAs = params.getTrustedCAs();

   // if your implementation requires looks for extra data in
   // the context handler, get it.  otherwise ignore it.
   ContextHandler context = params.getContext();
   if (context != null) {
   // ...
   }

   // use my custom configuration data (ie. myCustomConfigData),
   // the trusted CAs (if applicable to my implementation),
   // the context (if applicable to my implementation),
   // and the subject DN to build and validate the cert path
   CertPath certpath = ...
   // or X509Certificate[] chain = ...

   // if not found, throw an exception:
   if (...) {
    throw new CertPathBuilderException("Could not build a cert path for " + subjectDN);
   }

   // if not valid, throw an exception:
   if (...) { 
    throw new CertPathBuilderException("Could not validate the cert path for " + subjectDN);
   }

   // if found and valid, return the cert path.
   // for convenience, use the WLSCertPathBuilderResult class
   return new WLSCertPathBuilderResult(certpath);
   // or return new WLSCertPathBuilderResult(chain);

   } else {

   // the caller passed in a selector that my implementation does not support
   throw new InvalidAlgorithmParameterException("MyCertPathProvider only
   supports weblogoic.security.pk.SubjectDNSelector");
   }
  }
}

   /**
   * This class contains JDK cert path validator implementation for this provider.
   */

   static public class MyJDKCertPathValidator extends CertPathValidatorSpi
   {
     public CertPathValidatorResult
      engineValidate(CertPath certPath, CertPathParameters genericParams)
       throws CertPathValidatorException, InvalidAlgorithmParameterException
     {

   // narrow the CertPathParameters to the WLS ones so we can get the
   // data needed to build and validate the cert path
   if (!(genericParams instanceof CertPathValidatorParametersSpi)) {
     throw new InvalidAlgorithmParameterException("The CertPathParameters must be a
 weblogic.security.pk.CertPathValidatorParametersSpi instance.");
   }

     CertPathValidatorParametersSpi params = (CertPathValidatorParametersSpi)genericParams;


     // get my runtime implementation instance which holds the configuration
     // data needed to build and validate the cert path
     MyCertPathProviderRuntimeImpl runtime = (MyCertPathProviderRuntimeImpl)params.getCertPathProvider();
     String myCustomConfigData = runtime.getCustomConfigData();

     // if your implementation requires trusted CAs, get them.
     // otherwise, ignore them.  that is, it's a quality of service
     // issue whether or not you require trusted CAs.
     X509Certificate[] trustedCAs = params.getTrustedCAs();

     // if your implementation requires looks for extra data in
     // the context handler, get it.  otherwise ignore it.
     ContextHandler context = params.getContext();
     if (context != null) {
       // ...
     }

     // The CLV framework has already done some minimal validation
     // on the cert path before sending it to your provider:
     //   1) the cert path is not empty
     //   2) the cert path starts with the end cert
     //   3) each certificate in the cert path was issued and
     //      signed by the next certificate in the chain
     //      So, your validator can rely on these checks having
     //      already been performed (vs your validator needing to
     //      do these checks too).

   // Use my custom configuration data (ie. myCustomConfigData),
   // the trusted CAs (if applicable to my implementation),
   // and the context (if applicable to my implementation)
   // to validate the cert path

   // if not valid, throw an exception:
   if (...) {
     throw new CertPathValidatorException("Could not validate the cerpath " + certPath);
   }
   // if valid, return success

   // For convenience, use the WLSCertPathValidatorResult class

   return new WLSCertPathValidatorResult();
  }
}

   // This class implements the JDK security provider that registers this    // provider's
   // cert path builder and cert path validator implementations with the JDK.
   private class MyJDKSecurityProvider extends Provider
   {
   private MyJDKSecurityProvider()
   {
     super(MY_JDK_SECURITY_PROVIDER_NAME, 1.0, "MyCertPathProvider JDK CertPath provider");
     put("CertPathBuilder." + BUILDER_ALGORITHM, "com.acme.MyPathProviderRuntimeImpl$MyJDKCertPathBuilder");
     put("CertPathValidator." + VALIDATOR_ALGORITHM, "com.acme.MyCertPathProviderRuntimeImpl$MyJDKCertPathValidator");
   }
  }
}

WebLogic MBeanMakerを使用してMBeanタイプを生成する

カスタム・セキュリティ・プロバイダのMBeanタイプを生成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム証明書パス・プロバイダのMBeanタイプを作成します。

MBean定義ファイル(MDF)の作成

WebLogic MBeanMakerを使用してMBeanタイプを生成する

WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

WebLogic Server環境にMBeanタイプをインストールする


注意:

複数のセキュリティ・プロバイダのサンプルで、これらの手順の実行方法を示します。

この節で説明する手順はすべて、Windows環境での作業を想定しています。


MBean定義ファイル(MDF)の作成

MBean定義ファイル(MDF)を作成するには、次の手順に従います。

  1. サンプル認証プロバイダのMDFをテキスト・ファイルにコピーします。


    注意:

    サンプル認証プロバイダのMDFは、SimpleSampleAuthenticator.xmlです。サンプル証明書パス・プロバイダはありません。


  2. MDFで<MBeanType>要素と<MBeanAttribute>要素の内容をカスタム証明書パス・プロバイダに合わせて修正します。CertPathBuilderMBeanまたはCertPathValidatorMBeanを拡張または実装する必要があります。

  3. カスタム属性および操作(つまり、<MBeanAttribute>および<MBeanOperation>要素)をMDFに追加します。

  4. ファイルを保存します。


    注意:

    MDF要素の構文についての詳細なリファレンスは、付録A「MBean定義ファイル(MDF)要素の構文」に収められています。


WebLogic MBeanMakerを使用してMBeanタイプを生成する

MDFを作成したら、WebLogic MBeanMakerを使用してそれを実行できます。WebLogic MBeanMakerは現在のところコマンドライン・ユーティリティで、入力としてMDFを受け取り、MBeanインタフェース、MBean実装、関連するMBean情報ファイルなどの中間Javaファイルをいくつか出力します。これらの中間ファイルが合わさって、カスタム・セキュリティ・プロバイダのMBeanタイプになります。

MBeanタイプの生成手順は、カスタム証明書パス・プロバイダの設計に応じて異なります。必要な設計に合わせて適切な手順を実行してください。

オプショナルSSPI MBeanとカスタム操作を追加しない場合

カスタム証明書パス・プロバイダのMDFにオプショナルSSPI MBeanもカスタム操作も実装しない場合、次の手順に従います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり証明書パス・プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

オプショナルSSPI MBeanまたはカスタム操作を追加する場合

カスタム証明書パス・プロバイダのMDFにオプショナルSSPI MBeanまたはカスタム操作を実装する場合、以下の質問に答えながら手順を進めてください。

MBeanタイプを作成するのは初めてですか。その場合は、次の手順に従ってください:

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり証明書パス・プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. オプショナルSSPI MBeanをMDFに実装した場合は、次の手順に従います。

    1. MBean実装ファイルを見つけます。

      WebLogic MBeanMakerによって生成されるMBean実装ファイルには、MBeanNameImpl.javaという名前が付けられます。たとえば、SampleIdentityAsserterという名前のMDFの場合、編集されるMBean実装ファイルはSampleIdentityAsserterImpl.javaという名前になります。

    2. MDFで実装したオプショナルSSPI MBeanごとに、各メソッドを実装します。オプショナルSSPI MBeanが継承するメソッドもすべて実装してください。

  4. MDFにカスタム操作を含めた場合、メソッド・スタブを使用してメソッドを実装します。

  5. ファイルを保存します。

  6. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

既存のMBeanタイプの更新ですか。その場合は、次の手順に従ってください:

  1. WebLogic MBeanMakerによって現在のメソッドの実装が上書きされないように、既存のMBean実装ファイルを一時ディレクトリにコピーします。

  2. 新しいDOSシェルを作成します。

  3. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり証明書パス・プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  4. オプショナルSSPI MBeanをMDFに実装した場合は、次の手順に従います。

    1. MBean実装ファイルを見つけて開きます。

      WebLogic MBeanMakerによって生成されるMBean実装ファイルには、MBeanNameImpl.javaという名前が付けられます。たとえば、SampleIdentityAsserterという名前のMDFの場合、編集されるMBean実装ファイルはSampleIdentityAsserterImpl.javaという名前になります。

    2. ステップ1で一時ディレクトリに保存した既存のMBean実装ファイルを開きます。

    3. 既存のMBean実装ファイルを、WebLogic MBeanMakerによって生成されたMBean実装ファイルと同期させます。

      これには、メソッドの実装を既存のMBean実装ファイルから新しく生成されたMBean実装ファイルにコピー(または、新しく生成されたMBean実装ファイルから既存のMBean実装ファイルに新しいメソッドを追加)し、いずれのMBean実装ファイルにも入っているメソッドのメソッド・シグネチャへの変更が、使用するMBean実装ファイルに反映されていることを確認するといった作業が必要です。

    4. MDFを修正して元のMDFにはないオプショナルSSPI MBeanを実装した場合は、各メソッドを実装します。オプショナルSSPI MBeanが継承するメソッドもすべて実装してください。

  5. MDFを変更して元のMDFにはないカスタム操作を含めた場合、メソッド・スタブを使用してメソッドを実装します。

  6. 完成した、つまりすべてのメソッドを実装したMBeanÓ',Ø実装ファイルを保存します。

  7. このMBean実装ファイルを、WebLogic MBeanMakerがMBeanタイプの実装ファイルを配置したディレクトリにコピーします。このディレクトリは、手順3でfilesdirとして指定したものです。(ステップ3の結果としてWebLogic MBeanMakerで生成されたMBean実装ファイルがオーバーライドされます)。

  8. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

生成されるMBeanインタフェース・ファイルについて

MBeanインタフェース・ファイルとは、ランタイム・クラスまたはMBean実装が構成データを取得するために使用するMBeanのクライアント側APIです。「「Provider」SSPIの目的について」で説明されているように、これはinitializeメソッドで使用するのが一般的です。

WebLogic MBeanMakerでは、作成済のMDFからMBeanタイプを生成するので、生成されるMBeanインタフェース・ファイルの名前は、そのMDF名の後に「MBean」というテキストが付いたものになります。たとえば、WebLogic MBeanMakerを使用してSampleIdentityAsserter MDFを実行すると、SampleIdentityAsserterMBean.javaという名前のMBeanインタフェース・ファイルが生成されます。

WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

WebLogic MBeanMakerでMDFを実行して中間ファイルを作成し、MBean実装ファイルを編集して適切なメソッドの実装を提供したら、カスタムCertPathプロバイダのMBeanファイルとランタイム・クラスをMBean JARファイル(MJF)にパッケージ化する必要があります。このプロセスも、WebLogic MBeanMakerによって自動化されます。

カスタム証明書パス・プロバイダのMJFを作成するには、次の手順に従います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMJF=jarfile -Dfiles=filesdir weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMJFフラグはWebLogic MBeanMakerが新しいMBeanタイプを含むJARファイルを構築すべきであることを示し、jarfileはMJFの名前、filesdirはWebLogic MBeanMakerでMJFにJAR化する対象ファイルが存在する場所を示します。

    この時点でコンパイルが行われるので、エラーが発生するおそれがあります。jarfileが指定されていて、エラーが発生しなかった場合には、指定された名前のMJFが作成されます。


    注意:

    カスタム・セキュリティ・プロバイダのJARファイルを作成する際には、一連のXMLバインディング・クラスと1つのスキーマも生成されます。そのスキーマに関連付けるネームスペースを選択できます。それにより、使用しているカスタム・クラスとOracleのカスタム・クラスとの競合を防ぐことができます。ネームスペースのデフォルトはvendorです。-targetNameSpace引数をWebLogicMBeanMakerまたは関連するWLMBeanMaker antタスクに渡すことで、このデフォルトを変更できます。

    既存のMJFを更新する場合は、単純にMJFを削除して再生成します。WebLogic MBeanMakerにも -DIncludeSourceオプションがあり、それを指定すると、生成されるMJFにソース・ファイルを含めるかどうかを制御できます。ソース・ファイルには、生成されたソースとMDFそのものがあります。デフォルトはfalseです。このオプションは、-DMJFを使用しない場合には無視されます。


生成されたMJFは、自らのWebLogic Server環境にインストールすることも、顧客に配布してそれぞれのWebLogic Server環境にインストールしてもらうこともできます。

WebLogic Server環境にMBeanタイプをインストールする

MBeanタイプをWebLogic Server環境にインストールするには、MJFをWL_HOME\server\lib\mbeantypesディレクトリにコピーします。ここで、WL_HOMEはWebLogic Serverの最上位のインストール・ディレクトリです。このインストール・コマンドによって、カスタム証明書パス・プロバイダが「デプロイ」されます。つまり、カスタム証明書パス・プロバイダをWebLogic Server管理コンソールから管理できるようになります。


注意:

MBeanタイプをインストールするデフォルトのディレクトリは、WL_HOME\server\lib\mbeantypesです。初めて使用するバージョンが9.0の場合、セキュリティ・プロバイダは...\domaindir\lib\mbeantypesからもロードできます。ただし、サーバーを起動するときに-Dweblogic.alternateTypesDirectory=<dir>コマンドライン・フラグを使用すれば、WebLogic Serverが追加ディレクトリでMBeanタイプを検索します。<dir>は、ディレクトリ名のカンマ区切りのリストです。このフラグを使用する場合、WebLogic Serverは常に最初にWL_HOME\server\lib\mbeantypesからMBeanタイプをロードします。その後で、追加ディレクトリにあるすべての有効なアーカイブを検索して、ロードします。このとき拡張子は考慮されません。

たとえば、-Dweblogic.alternateTypesDirectory = dirX,dirYの場合、WebLogic ServerはまずWL_HOME\server\lib\mbeantypesからMBeanタイプをロードし、次にdirXおよびdirYにある有効なアーカイブをロードします。WebLogic Serverに追加ディレクトリでMBeanタイプを検索するよう指示する際に、Javaセキュリティ・マネージャを使用している場合は、weblogic.policyファイルを更新して、MBeanタイプ(その結果として、カスタム・セキュリティ・プロバイダ)に適した許可を付与することも必要になります。詳細は、『Oracle WebLogic Serverセキュリティのプログラミング』のJavaセキュリティを使用したWebLogicリソースの保護に関する項を参照してください。


カスタム証明書パス・プロバイダを構成することによって(「管理コンソールによるカスタム証明書パス・プロバイダの構成」を参照)、MBeanタイプのインスタンスを作成して、GUI、他のJavaコード、またはAPIからそれらのMBeanインスタンスを使用することができます。たとえば、WebLogic Server管理コンソールを使用して、属性を取得/設定したり操作を呼び出したりすることもできますし、他のJavaオブジェクトを開発して、そのオブジェクトでMBeanをインスタンス化し、それらのMBeanから提供される情報に自動的に応答させることもできます。なお、これらのMBeanインスタンスをバックアップしておくことをお薦めします。

管理コンソールによるカスタム証明書パス・プロバイダの構成

カスタム証明書パス・プロバイダを構成するということは、証明書サービスを必要とするアプリケーションがアクセス可能なセキュリティ・レルムにカスタム証明書パス・プロバイダを追加するということです。

カスタム・セキュリティ・プロバイダの構成は管理タスクですが、カスタム・セキュリティ・プロバイダの開発者が行うこともできます。


注意:

WebLogic Server管理コンソールを使用してカスタム証明書パス・プロバイダを構成する手順は、『Oracle WebLogic Serverの保護』のWebLogicセキュリティ・プロバイダの構成に関する項で説明されています。


PKÆ†Ë â'Ó'PKÛ°-AOEBPS/preface.htmúî はじめに

はじめに

ここでは、このガイド『Oracle WebLogic Serverセキュリティ・プロバイダの開発』のドキュメントのアクセシビリティ機能と使用されている表記規則について説明します。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細情報はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoか、聴覚に障害があるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。

表記規則

このドキュメントでは次の表記規則を使用します。

規則意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

斜体

イタリックは、ユーザーが特定の値を指定するプレースホルダー変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。


PKÅBಠPKÛ°-AOEBPS/servlet.htmIm¶’ サーブレット認証フィルタ

13 サーブレット認証フィルタ

この章では、サーブレット認証フィルタ・インタフェースの概念と機能、およびサーブレット認証フィルタの開発手順について説明します。

サーブレット認証フィルタは、IDアサーションなどの認証機能のための前処理および後処理を実行するプロバイダです。サーブレット検証フィルタは、主に認証プロバイダの「ヘルパー」として機能する特殊なセキュリティ・プロバイダです。

ServletAuthenticationFilterインタフェースは、WebLogic Serverにプラグインできる認証フィルタに対してセキュリティ・サービス・プロバイダ・インタフェース(SSPI)を定義します。認証プロセスでサーブレット・コンテナに呼び出させる認証フィルタが認証プロバイダにあることを通知するために、ServletAuthenticationFilterインタフェースを認証プロバイダの一部として実装します。通常、このインタフェースは認証プロバイダのIDアサーション形式の一部として実装されます。

以下の節では、サーブレット認証フィルタ・インタフェースの概念と機能、およびサーブレット認証フィルタの開発手順について説明します。

認証フィルタの概念

JavaサーブレットAPI 2.3仕様で定義されているように、フィルタは、リクエストがサーブレットに届く前のプリプロセッサ、またはサーブレットから離れたレスポンスのポストプロセッサです。フィルタを使用すると、再利用可能なユニットで反復タスクをカプセル化し、サーブレットまたはJSPページからのレスポンスを変換できます。

サーブレット認証フィルタは、コンテナ・ベースの認証をフィルタが置換または拡張できるようにするフィルタ・オブジェクトの拡張機能です。

フィルタが必要な理由

WebLogicセキュリティ・フレームワークを使用すると、カスタム認証プロバイダを利用できます。ただし、JavaサーブレットAPI 2.3の仕様により、認証プロセス時は、認証プロバイダとクライアントまたは他のサーバーとの間の対話は制限されます。これにより、認証メカニズムは、サーブレット・コンテナが提供する認証メカニズムと互換性のある基本、フォーム、証明書の形式に制限されます。

フィルタには、アーキテクチャ依存の制限はほとんどありません。つまり、サーブレット認証フィルタは、サーブレット・コンテナが提供する認証メカニズムに依存していません。認証プロセスを開始するコンテナの前にフィルタを呼び出せるようにすれば、セキュリティ・レルムは、より柔軟な認証メカニズムを実装できます。たとえば、サーブレット認証フィルタを使用すると、認証用のSAMLプロバイダ・サイトにユーザーをリダイレクトできます。

WebLogic認証プロバイダ内のJAAS LoginModuleは、ログイン・プロセスのカスタマイズに使用できます。ユーザー・データベースの場所のカスタマイズ、ログインの実行に必要な証明データの種類、サブジェクトへのグループの指定は、LoginModuleを介して実装されます。

一方、ログインを実行するためのリモート・サイトへのリダイレクト、問合せ文字列からのログイン情報の抽出、ブラウザとのログイン機能のネゴシエーションは、サーブレット認証フィルタを介して実装されます。

サーブレット認証フィルタ設計上の考慮事項

サーブレット認証フィルタを設計する際には、以下の事項を考慮する必要があります。

  • 複数のフィルタを指定可能にする必要がありますか?複数のフィルタを指定可能にすると、構成時に管理上の決定を行うことができるようになります。

  • 特定の実行順序に依存していますか?サーブレット認証フィルタは、フィルタの実行順序に依存しないようにしてください。

  • 各フィルタが認証の前後にリクエストを処理できるようにすることを検討しましたか?その場合、フィルタで呼出しのタイミングを予測しないようにしてください。

  • フィルタのdoFilterメソッドを呼び出さないことで、残りのフィルタの実行およびサーブレットの認証プロセスを停止できるようにする選択肢を各フィルタに与えることを検討します。

  • フィルタでブラウザをリダイレクトできるようにする必要がありますか?

  • フィルタが一方向SSL、双方向SSL、IDアサーション、フォーム認証、および基本認証で機能するようにすることを検討します。たとえば、フォーム認証は双方向のリクエスト・プロセスで、フィルタはフォーム認証用に2回呼び出されます。

フィルタが呼び出されるしくみ

サーブレット認証フィルタ・インタフェースを使用すると、認証プロバイダは0個以上のサーブレット認証フィルタ・クラスを実装できます。フィルタは以下の手順で呼び出されます。

  1. 認証が発生する前に、サーブレット・コンテナがサーブレット認証フィルタを呼び出します。

    サーブレット・コンテナが、サーブレット認証フィルタの構成済みチェーンをWebLogicセキュリティ・フレームワークから取得します。

    セキュリティ・フレームワークは、認証プロバイダの順序に従ってサーブレット認証フィルタを返します。1つのプロバイダに複数のサーブレット認証フィルタがある場合、セキュリティ・フレームワークは、ServletAuthenticationFilterのgetAuthenticationFiltersメソッドで返されたjavax.servlet.Filterの順序付けされたリストを使用します。

    場合によっては、リクエストを適切に処理するために複数回実行する必要もあるので、フィルタが重複していてもかまいません。

  2. サーブレット・コンテナは、フィルタのinitメソッドをフィルタごとに呼び出し、フィルタがサービス内に適切に配置されるようにします。

  3. チェーンの最後にあるリソースに対するクライアント・リクエストがあるため、リクエスト/レスポンスのペアがチェーン内を通るたびに、サーブレット・コンテナは、最初のフィルタに対してフィルタのdoFilterメソッドを呼び出します。

    このメソッドに渡されるFilterChainオブジェクトを使用すると、フィルタは、リクエストとレスポンスをチェーン内の次のエンティティに渡すことができます。フィルタは、FilterChainオブジェクトを使用して、チェーン内の次のフィルタを呼び出します。または、フィルタの呼出しがチェーン内の最後のフィルタの場合、チェーンの最後のリソースを呼び出します。

  4. すべてのサーブレット認証フィルタがフィルタのdoFilterメソッドを呼び出す場合、最後のサーブレット認証フィルタがdoFilterメソッドを呼び出すと、サーブレット・コンテナは、フィルタが存在しない場合と同じように認証を実行します。

    ただし、サーブレット認証フィルタがdoFilterメソッドを呼び出さない場合、残りのフィルタ、サーブレット、およびサーブレット・コンテナの認証手順は呼び出されません。これにより、フィルタは、サーブレットの認証プロセスを置き換えることができます。通常、これには認証の失敗か、別の認証用URLへのリダイレクトが伴います。

認証プロバイダからサーブレット認証フィルタを呼び出さない

サーブレット認証フィルタ・インタフェースを認証プロバイダの一部として実装しても、認証プロバイダは、サーブレット認証フィルタを直接呼び出すわけではありません。サーブレット認証フィルタの実装は、フィルタを配置して呼び出す方法を認識するWebLogicセキュリティ・フレームワークの特定の機能に依存します。

カスタム・サーブレット認証フィルタを開発する場合は、カスタム認証プロバイダがWLS固有のクラス(weblogic.servlet.*など)およびJava EE固有のクラス(javax.servlet.*など)を呼び出さないようにしてください。このルールに従うと、WebLogicセキュリティのポータビリティが最大限に高まります。

図13-1にこの要件を示します。

図13-1 認証プロバイダがサーブレット認証フィルタを呼び出さない

図13-1の説明が続きます
「図13-1 認証プロバイダがサーブレット認証フィルタを呼び出さない」の説明

フィルタを実装するプロバイダの例

WebLogic Serverには、SPNEGO (Simple and Protected Negotiate)に必要なヘッダー操作を処理するサーブレット認証フィルタが含まれます。「ネゴシエーション・サーブレット認証フィルタ」と呼ばれるこのサーブレット認証フィルタは、WWW-AuthenticateヘッダーおよびAuthorization HTTPヘッダーをサポートするように構成されています。

ネゴシエーション・サーブレット認証フィルタは、ネゴシエート・プロトコルの認可されていないレスポンスに対して適切なWWW-Authenticateヘッダーを生成し、以降のリクエストに対してAuthorizationヘッダーを処理します。このフィルタは、ネゴシエーションIDアサーション・プロバイダを介して使用できます。

デフォルトでは、ネゴシエーションIDアサーション・プロバイダは使用可能ですが、WebLogicデフォルト・セキュリティ・レルムには構成されていません。ネゴシエーションIDアサーション・プロバイダは、WebLogic IDアサーション・プロバイダのかわりとして使用したり、WebLogic IDアサーション・プロバイダと併用したりできます。

カスタム・サーブレット認証フィルタの開発方法

カスタム・サーブレット認証フィルタを開発するには、以下の手順に従います。

  1. 適切なSSPIによるランタイム・クラスの作成

  2. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  3. 管理コンソールによる認証プロバイダの構成

適切なSSPIによるランタイム・クラスの作成

ランタイム・クラスを作成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でサーブレット認証フィルタのランタイム・クラスを作成します。

カスタム・サーブレット認証フィルタ・プロバイダのランタイム・クラスの作成例については、「WebLogic MBeanMakerを使用してMBeanタイプを生成する」を参照してください。

サーブレット認証フィルタSSPIの実装

認証プロセスでサーブレット・コンテナに呼び出させる認証フィルタが認証プロバイダにあることを通知するために、ServletAuthenticationFilterインタフェースを認証プロバイダの一部として実装します。

サーブレット認証フィルタSSPIを実装する際には、以下のメソッドの実装を提供する必要があります。

  • サーブレット認証フィルタの取得

    public Filter[] getServletAuthenticationFilters
    

    getServletAuthenticationFiltersメソッドは、サーブレット・コンテナの認証プロセスで実行されるjavax.servlet.Filterの順序付けられたリストを返します。コンテナは、サーブレット認証フィルタの複数のインスタンスを取得するために、このメソッドを複数回呼び出すことがあります。このメソッドは、呼出しごとに、フィルタの新しいインスタンスのリストを返す必要があります。

フィルタ・インタフェース・メソッドの実装

フィルタ・インタフェース・メソッドを実装するには、以下のメソッドの実装を提供する必要があります。通常は、init()を1回呼び出し、doFilter()を必要に応じた回数呼び出してから、destroy()を1回呼び出します。

  • destroy

    public void destroy()
    

    destroyメソッドは、フィルタをサービスから取り除くよう指示するためにWebコンテナによって呼び出されます。このメソッドは、フィルタのdoFilterメソッド内のすべてのスレッドが終了した場合、またはタイムアウト期間が過ぎた場合にのみ呼び出されます。Webコンテナは、このメソッドを呼び出した後に、フィルタのこのインスタンスに対して再びdoFilterメソッドを呼び出しません。

    このメソッドを使用すると、フィルタで保持されているリソース(メモリー、ファイル・ハンドル、スレッドなど)をクリーンアップし、永続的な状態をメモリー内のフィルタの現在の状態と同期させることができます。

  • doFilter

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
    

    チェーンの最後にあるリソースに対するクライアント・リクエストがあるため、リクエスト/レスポンスのペアがチェーン内を通るたびに、フィルタのdoFilterメソッドがコンテナによって呼び出されます。このメソッドに渡されるFilterChainを使用すると、フィルタは、リクエストとレスポンスをチェーン内の次のエンティティに渡すことができます。

    通常、このメソッドの実装は以下のパターンに従います。

    1.リクエストを調べます。

    2.必要に応じてカスタム実装でリクエスト・オブジェクトをラップし、入力フィルタ用に内容とヘッダーをフィルタ処理します。

    3.必要に応じてカスタム実装でレスポンス・オブジェクトをラップし、出力フィルタ用に内容とヘッダーをフィルタ処理します。

    4. FilterChainオブジェクトを使用してチェーン内の次のエンティティを呼び出すか(chain.doFilter())、フィルタ・チェーン内の次のエンティティにリクエスト/レスポンスのペアを渡さずにリクエストの処理をブロックします。

    5.フィルタ・チェーン内の次のエンティティの呼出し後に、レスポンスのヘッダーを直接設定します。

  • init

    public void init(FilterConfig filterConfig) 
    

    initメソッドは、フィルタをサービス内に配置するよう指示するためにWebコンテナによって呼び出されます。サーブレット・コンテナは、フィルタのインスタンス化の後でinitメソッドを一度のみ呼び出します。initメソッドは、フィルタ処理をフィルタに指示する前に正常に完了している必要があります。

フィルタからのチャレンジIDアサーションの実装

第5章「IDアサーション・プロバイダ」で説明したとおり、チャレンジIDアサーション・インタフェースは、複数のチャレンジ、レスポンス・メッセージ、および状態を必要とするチャレンジ・レスポンス・スキームをサポートします。チャレンジIDアサーション・プロバイダ・インタフェースを使用すると、IDアサーション・プロバイダは、MicrosoftのWindows NTチャレンジ/レスポンス(NTLM)やSPNEGO (Simple and Protected GSS-API Negotiation)などのチャレンジ/レスポンス認証メカニズムを採用した認証プロトコルをサポートできます。

サーブレット認証フィルタを使用すると、サーブレット・コンテナと互換性のある認証メカニズムに制限されることなくチャレンジ/レスポンス・プロトコルを実装できます。ただし、サーブレット認証フィルタは、セキュリティ・フレームワークで提供されている認証環境の外側で機能するので、セキュリティ・フレームワークを利用してプロバイダのコンテキストを判別することはできません。また、サーブレット認証フィルタでは、APIでチャレンジ回数が複数のIDアサーション・プロセスを駆動させる必要があります。

weblogic.security.services.Authenticationクラスが拡張され、サーブレット認証フィルタからの複数のチャレンジ/レスポンスIDアサーションが可能になりました。メソッドおよびインタフェースでは、ChallengeIdentityAsserterV2 SSPIインタフェースとProviderChallengeContext SSPIインタフェースのラッパーが提供されるので、サーブレット認証フィルタから呼び出すことができます。

これ以外に、セキュリティ・フレームワークのコンテキスト内でサーブレット認証フィルタから複数のチャレンジ/レスポンス・ダイアログを実行する方法はドキュメント化されていません。サーブレット認証フィルタは、ChallengeIdentityAsserterV2インタフェースおよびProviderChallengeContextインタフェースを直接呼び出すことはできません。

したがって、複数のチャレンジ/レスポンスIDアサーションをフィルタから実装する場合、ChallengeIdentityAsserterV2インタフェースとProviderChallengeContextインタフェースを実装してから、weblogic.security.services.AuthenticationメソッドとAppChallengeContectインタフェースを使用して、サーブレット認証フィルタから目的のフィルタを呼び出す必要があります。

このプロセスを行う手順については、第5章「IDアサーション・プロバイダ」で説明されています。ここでは、概要を示します。

WebLogic MBeanMakerを使用してMBeanタイプを生成する

第4章「認証プロバイダ」の説明に従ってカスタム認証プロバイダのMBeanタイプを生成する際には、使用しているサーブレット認証フィルタのMBeanも実装する必要があります。

ServletAuthenticationFilter MBeanはAuthenticationProvider MBeanを拡張します。ServletAuthenticationFilter MBeanはマーカー・インタフェースなので、メソッドはありません。

<?xml version="1.0" ?>
<!DOCTYPE MBeanType SYSTEM "commo.dtd">
<MBeanType

Name          = "ServletAuthenticationFilter"
Package       = "weblogic.management.security.authentication"
Extends       = "weblogic.management.security.authentication.AuthenticationProvider"
PersistPolicy = "OnUpdate"
Abstract      = "true"
Description   = "The SSPI MBean that all Servlet Authentication   Filter providers must extend. 
This MBean is just a marker interface.  It has no methods on it."
>
</MBeanType>

WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

WebLogic MBeanMakerを使用してMDFを実行して中間ファイルを生成し、MBean実装ファイルを編集して適切なメソッドの実装を提供したら、サーブレット認証フィルタを含むカスタム認証プロバイダのMBeanファイルとランタイム・クラスをMBean JARファイル(MJF)にパッケージ化する必要があります。

カスタム認証プロバイダの場合、この手順は、「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」で説明します。

管理コンソールによる認証プロバイダの構成

サーブレット認証フィルタを実装するカスタム認証プロバイダを構成するということは、そのカスタム認証プロバイダをセキュリティ・レルムに追加するということです。追加されたカスタム認証プロバイダには、認証サービスを必要とするアプリケーションからアクセスできます。

カスタム・セキュリティ・プロバイダの構成は管理タスクですが、カスタム・セキュリティ・プロバイダの開発者が行うこともできます。

WebLogic Server管理コンソールを使用してカスタム認可プロバイダを構成する手順は、『Oracle WebLogic Serverの保護』のWebLogicセキュリティ・プロバイダの構成に関する項で説明されています。

PK¡bŽáNmImPKÛ°-A OEBPS/pv.htmLÿ³ プリンシパル検証プロバイダ

6 プリンシパル検証プロバイダ

この章では、プリンシパル検証プロバイダの概念と機能、およびカスタム・プリンシパル検証プロバイダの開発手順について説明します。

認証プロバイダは、プリンシパル検証プロバイダを利用して、サブジェクトに格納されるプリンシパル(ユーザーとグループ)に署名し、信頼性を検証します。こうした検証によって、信頼度は向上し、悪意のあるプリンシパルによる改ざんの可能性を低くすることができます。サブジェクトのプリンシパルの検証は、WebLogic Serverで各呼出しのRMIクライアント・リクエストがデマーシャリングされる際に行われます。サブジェクトのプリンシパルの信頼性も、認可判定の際に検証されます。

以下の節では、プリンシパル検証プロバイダの概念と機能、およびカスタム・プリンシパル検証プロバイダの開発手順について説明します。

プリンシパル検証の概念

プリンシパル検証プロバイダを開発する前に、以下の概念を理解しておく必要があります。

プリンシパル検証とプリンシパル・タイプ

IDアサーション・プロバイダが特定のタイプのトークンをサポートするように、プリンシパル検証プロバイダも特定のタイプのプリンシパルをサポートします。たとえば、WebLogicプリンシパル検証プロバイダ(「カスタム・プリンシパル検証プロバイダを開発する必要があるか」を参照)はWebLogic Serverプリンシパルの署名と信頼性の検証を行います。

構成済みの認証プロバイダに関連付けられているプリンシパル検証プロバイダ(「プリンシパル検証プロバイダと他のタイプのセキュリティ・プロバイダの違い」を参照)は、サブジェクトに格納されていてそのプリンシパル検証プロバイダがサポートするタイプの全プリンシパルに対して署名と検証を行います。

プリンシパル検証プロバイダと他のタイプのセキュリティ・プロバイダの違い

プリンシパル検証プロバイダは、主に認証プロバイダの「ヘルパー」として機能する特殊なセキュリティ・プロバイダです。プリンシパル検証プロバイダの主要な機能は、サブジェクトに格納されたプリンシパルが悪意のある個人によって改ざんされるのを防止することです。

AuthenticationProvider SSPI (「AuthenticationProviderV2 SSPIの実装」を参照)には、getPrincipalValidatorというメソッドが含まれています。このメソッドでは、認証プロバイダと共に使用するプリンシパル検証プロバイダのランタイム・クラスを指定します。プリンシパル検証プロバイダのランタイム・クラスとしては、Oracle提供のもの(WebLogicプリンシパル検証プロバイダ)か、独自に開発したもの(カスタム・プリンシパル検証プロバイダ)を使用できます。認証プロバイダのgetPrincipalValidatorメソッドでWebLogicプリンシパル検証プロバイダを使用する例については、「例4-0 、「ユーザー、グループ、プリンシパル、およびサブジェクト間の関係」」を参照してください。

WebLogic Server管理コンソールを使用して認証プロバイダのMBeanタイプを生成し、認証プロバイダを構成するので、プリンシパル検証プロバイダでそれらの手順を行う必要はありません。

無効なプリンシパルが原因のセキュリティ例外

認証(または認可)処理を行うときに、WebLogicセキュリティ・フレームワークはサブジェクトのプリンシパルを調べてそれが有効かどうかを確認します。プリンシパルが無効の場合、WebLogicセキュリティ・フレームワークはサブジェクトが無効であることを示すテキストを付けてセキュリティ例外をスローします。サブジェクトが無効になる原因には以下のものがあります。

  • サブジェクトのプリンシパルに対応するプリンシパル検証プロバイダが構成されていません(つまりWebLogicセキュリティ・フレームワークでそのサブジェクトを検証する手段がありません)


    注意:

    サブジェクトには複数のプリンシパルを格納できるため(それぞれ異なる認証プロバイダのLoginModuleによって格納される)、プリンシパルは複数の異なるプリンシパル検証プロバイダを持つことができます。


  • このセキュリティ・ドメインとは異なる資格証明を使用する別のWebLogic Serverセキュリティ・ドメインで署名されたプリンシパルがあり、呼出し側がそれを現在のドメインで使用しようとしている

  • セキュリティを低下させる目的で作成された無効な署名を持つプリンシパルがある

  • プリンシパルが署名されていないサブジェクトがある

プリンシパル検証プロセス

図6-1に示すとおり、ユーザーはユーザー名とパスワードの組み合わせを使ってシステムにログインしようとします。WebLogic Serverは、構成済みの認証プロバイダのLoginModuleを呼び出すことによって信頼を確立します。LoginModuleは、ユーザーのユーザー名とパスワードを検証し、JAAS (Java Authentication and Authorization Service)の要件に従って、プリンシパルが格納されたサブジェクトを返します。

図6-1 プリンシパル検証プロセス

図6-1の説明が続きます
「図6-1 プリンシパル検証プロセス」の説明

WebLogic Serverは、指定されたプリンシパル検証プロバイダにサブジェクトを渡します。プリンシパル検証プロバイダは、そのプリンシパルに署名して、それらをWebLogic Serverを通じてクライアント・アプリケーションに返します。他のセキュリティ操作のためにサブジェクト内のプリンシパルが必要になった場合、同じプリンシパル検証プロバイダが、そのプリンシパルが署名時から変更されていないかどうかを検証します。

カスタム・プリンシパル検証プロバイダを開発する必要があるか

WebLogic Serverのデフォルト(アクティブ)セキュリティ・レルムには、WebLogicプリンシパル検証プロバイダが含まれます。IDアサーション・プロバイダが特定のタイプのトークンをサポートするのと同じように、プリンシパル検証プロバイダは特定のタイプのプリンシパルに対する署名と信頼性の確認を行います。WebLogicプリンシパル検証プロバイダは、WebLogic Serverプリンシパルの署名と検証を行います。言い換えると、WebLogic ServerユーザーまたはWebLogic Serverグループを表すプリンシパルに対して署名と検証を行います。


注意:

WLSPrincipalsクラス(weblogic.securityパッケージ内)を使用すると、プリンシパル(ユーザーまたはグループ)がWebLogic Serverにとって特別な意味を持つものかどうかを判断できます(つまり、あらかじめ定義されたWebLogic ServerユーザーやWebLogic Serverグループかどうかを判断できます)。さらに、WebLogic Serverユーザーまたはグループを表すプリンシパルは、weblogic.security.spiパッケージのWLSUserインタフェースとWLSGroupインタフェースを実装する必要があります。

WLSPrincipalsは、セキュリティ・フレームワークではなくPrincipalValidatorImplでのみ使用されます。認証プロバイダは、独自のプリンシパル検証プロバイダを実装することも、PrincipalValidatorImplを使用することもできます。認証プロバイダでカスタム・プリンシパル検証プロバイダを構成する場合、WLSPrincipalsインタフェースは使用されません。

認証プロバイダは、PrincipalValidatorImplを使用する場合、WLSPrincipalsインタフェースを実装する必要があります。


WebLogicプリンシパル検証プロバイダには、WLSUserImplおよびWLSGroupImplという名前のWLSUserインタフェースおよびWLSGroupインタフェースの実装が含まれています。これらは、weblogic.security.principalパッケージに定義されています。また、PrincipalValidatorImplという名前のPrincipalValidator SSPIの実装も含まれています。これはweblogic.security.providerパッケージに定義されています。PrincipalValidatorImplクラスのsign()メソッドは、ランダム・シードを生成し、そのランダム・シードに基づいてダイジェストを計算します。(PrincipalValidator SSPIの詳細については、「PrincipalValidator SSPIの実装」を参照してください。)

WebLogicプリンシパル検証プロバイダの使い方

名前が付いているだけの単純なユーザーおよびグループ・プリンシパルがある状態で、WebLogicプリンシパル検証プロバイダを使用する場合には、以下の方法があります。

  • weblogic.security.principal.WLSUserImplクラスとweblogic.security.principal.WLSGroupImplクラスを使用します。

  • weblogic.security.provider.PrincipalValidatorImplクラスを使用します。

名前の他に追加のデータ・メンバーがあるユーザーおよびグループ・プリンシパルがある状態で、WebLogicプリンシパル検証プロバイダを使用する場合には、以下の方法があります。

  • 独自のUserImplクラスとGroupImplクラスを記述します。

  • weblogic.security.principal.WLSAbstractPrincipalクラスを拡張します。

  • weblogic.security.spi.WLSUserインタフェースとweblogic.security.spi.WLSGroupインタフェースを実装します。

  • equals()メソッドを実装して、追加のデータ・メンバーを含めます。実装では、WLSAbstractPrincipalが残りのデータを検証できるように、完了時にsuper.equals()メソッドを呼び出す必要があります。


    注意:

    デフォルトでは、ユーザー名とグループ名だけが検証されます。追加のデータ・メンバーも検証する場合は、続いてgetSignedData()メソッドを実装します。


  • weblogic.security.provider.PrincipalValidatorImplクラスを使用します。

独自の検証スキームがあり、WebLogicプリンシパル検証プロバイダを使用しない場合や、WebLogic Serverプリンシパル以外のプリンシパルを検証する場合は、カスタム・プリンシパル検証プロバイダを開発する必要があります。

カスタム・プリンシパル検証プロバイダの開発方法

カスタム・プリンシパル検証プロバイダを開発するには、以下の方法があります。

PrincipalValidator SSPIの実装

PrincipalValidator SSPIを実装するには、以下のメソッドの実装を提供する必要があります。

  • validate

    public boolean validate(Principal principal) throws SecurityException;
    

    validateメソッドは1つのプリンシパルを1つの引数として取り、その有効性を検証しようとします。すなわち、このメソッドは、そのプリンシパルが署名されてから変更されていないかどうかを確認します。

  • sign

    public boolean sign(Principal principal);
    

    signメソッドは1つのプリンシパルを1つの引数として取り、それに署名して信頼を保証します。これにより、validateメソッドを使って、後でそのプリンシパルを検証できるようになります。

    signメソッドの実装は、悪意のある個人が容易に再現することのできない機密アルゴリズムでなければなりません。そのアルゴリズムをsignメソッド自体に組み込むか、signメソッドがプリンシパルの署名に使用するトークンをサーバーに要求するようにするか、またはプリンシパルに署名する他の手段を実装できます。

  • getPrincipalBaseClass

    public Class getPrincipalBaseClass();
    

    getPrincipalBaseClassメソッドは、このプリンシパル検証プロバイダが検証と署名の方法を認識しているプリンシパルのベース・クラスを返します。

PrincipalValidator SSPIと前述のメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

PK)~cLLPKÛ°-AOEBPS/img/clv.gif¾AáGIF89aÈ´³€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ,È´þðÉI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,È¤rÉl:ŸÐ¨tJ­Z¯ØìÀíz¿à°xL.{µè´ÉÌn»ßð¸¼Ó¥ÖÕø¼ä^ù{€X~z……‚>„UˆŠhŽ†‘ƒ}ŒR•—Z™’œO›8–Ÿ“¦¢@¡Q™¤¥§¯L­5ªP—²°¹J·3´ž¼VÁºÄ³”¸ugw•Ë"ãÅÕ}~ÙÌ؂ÎÜ`Í_ÏÓEЈèÝä)íÖðî˜ÍØõóÝôÉùô€Œ¾Næ”=¨NŸ=ïâ)$/ÛÁpã ÎÛǧ¢º„× fhxPQEvþë}‰Î£,Œ Szhhq_G~úXBC¹¥à9‘öúq{èñ¾ouº¤¦²(Œ’=a m™óÞC‰‹l ÔɎÐO‚güå»êó¦Ñ¯,´öËZêØeÚ" “ºg+EƒLÝNtú– °x奢™ˆmÛ¹rYÅ w°Ü¿yà{â_“€^Ÿ:º32¢·­&Õ TÌã5Ÿw@Žº3¼Ò‹Qƒò{È´ë €ÑuygjdvI¿~@l¬P Âq,ÖzTï6ԛËïÃÃ'íV´•ÛmHùr=Í»ÄÓ-eªCéœÄ´¾®M㬽‘ÿ}•œ¥áðsTZ=òS¢\Ùþ5 w.˜}õý¢Ax\ @ÑYùåW8žµò‰Uü8Ô„n‡Ü ðib‚ñ¿!xŽ…u•“3øÙf݇#÷‚Š$.a"(æփq›dÜEÃH”î`¸á=•µ€cŽIóäF, ˜yM¹7£ˆ(Ĩd“qÕ%1RY:å‰zFÊÆec…IøjSŽYÎb.Žóэօ¢MU~¢amn" §•Cí礝dâ™eL|â˜^EfÉQhu2*D™@³§U!R)é]Bx^§Ù©©¦©8jžRµ„R¨H˜«°púj¬¼byÛZoæ±*®?:º ‚6jz·þkŠ®‰ «*jHë쁮F»uGÚ"椭]Ë ´?ƒf !M,֊k¹<Ðz®và–`ëQì…C»îÒ- É’ôç¯+a5–{L˜‡ëª;dÁkô«›4ìÇæ««çMY/%¬æ€Ôêe¨ÙJÌ®«L¡×!Æý1ÜqšW‘D*ÉÌb§p†2Ãqt Rlr³6%´—J¶ ñË)Ï&¼í¨ ¦ŒféÌ-þ,,ʏ–ëÈ+z†è±AQF5½5û§³Ò<ý'¶œ^[}²Ï ž×³Ü+ÃíNd¤0¡›qÝw¢h»„¥— ¹ývÐ[ðqÃÉ:'t„›çë߆g¯hþŠÛ2º2ÎMÝ©ùîÜѕ[^r¼™Îø#¥³îsâ˦.ƒì­kþº¶ÀúíµŸ~×^±wÂ{ ;m|ÿ®ûØH_ ñË*{·ªZ¸åò¯ß[¯ÈÐOq9Bnïûæj;¤·½tÕíå"¦ò ëuÒÒ3?>©ô9¯>夷OeÜh f^4™þ• yð œÇðV´€Î€û{Ìý@>ü„~¼Žø¸²é¼èƒK Û:ÁZLðÿÍë²ÂI]oƒ-âX D¿·´‰l%ÔQjîÃÃ1í\\YŠ†–fÀ2Eî0úQ` ]†Â:ñ‰PŒ"ŸÇ>ÔýOOXTÚþÜ*#øh¯o1 Ìùó8û‘oQÉEi¾w ýÕï€Ú‘Ω50T5‰‰ïÚT£ÐX<ÿ­{¦ÃVsEÅ>Z1w0tÝjùŠ5¢,~wK–²iÆ@.²Uºpäíb&™JrÔBô˜ÉBOK¬^ðÆ5JFžB“} ã+´JIÔIqnœ)ñ¸5#фVG˜¥"_ð@úËÀ\]ë×ËíÍ*—üƒ&÷\ЛbÂ…Þ 呾…G„í癵œ Âó\¢B›gCF%]ˆ¨ÖŽŽ¸°oík\qQfqcù’Zlq嚕9¸`ÍqSsðѥ̬ðñRÕìäô¦GÝœLÕËj9¶öã4±8þføÉP„ô}i–“»Ã #å–MÞ.Šïj›è¼ì¶»ÅL¯J;gÌϋïé§êè,éµíE”ÂËÏÃ÷ÛÏÕûݽ-ånË慧%µ­ÊJÈcœ¹k":â#þúzg›ÞJ>Z“¯"ûn½TD¶ëz!­L®þÅ­÷政†f0âi){¼-üx—Cü͹.š¬Öö{{ígF.RÁA'|Æþ²3oD½½©,D:­RìW^‹æX³sj˕Jíg,’Ó25·UèuX—”6!ÿ6Xå×uï‡~·t„†c€lg}B74í6|Î¥yS)Xnæf||GycÔ {V}'“JÒVîÕuEdqš¶+/Ø_³—€;W 5˜h!ô8‘å€,¶`Ô§‚GåY:uD7Ïgƒ‰8À—„fWiÄ{ºv3bF†1˜]xgK&(4¨zՁp¨†¨·Pn¸;‹&a–…Ý'g„g^çô…Øz8u¸×gàVx’×yæׄȇ}j7‡³à…§ ‹¨` ¨…o‰þ"‰s—dûƈþG¨o£‡«7xüv<†WH³´jŠ“8k€H[¢Èhðµ‡d牯Èk·–‹EXt,p]’>èboE„¹x‰i·_o’?Y7!WbÂø‹ë×aÜ&†X|úÇg§ƒ·GuÈr~§Dáç@G~¢F|Ûh3õ1 ´„Z’u¦(eÈ{֘ú$SœHBë%}Id¡ãfQxˆ›D_²!cD ÅÈp²÷qØÆ ù8&„ȆJÆ؍³˜ŽoÔBat©(xY‘vúÁ7Ȩ‘Fä€C¸0œt‘˜8hI3 „;¨(„ØP6’4邵—ˆÙ³“Èu6h؇WpoþS·5rdŽÄXUsä)g%(iõ}©˜-Tè{>‘V~ž'™'y‡‹ø®×qvcTªàx!i~~HQJh–[hpRáKõ–J ]Ú°[fº°nɬŽsDÀ:¤­º£|Ù£ô•&•ªÉ3ËƱd™±EJ–䚢Šz¤ ¥!ªTˆJ© ™†1j¤3:©0ʲ4K‡/‹®¸‡í:Jř—±þ’@'™«) ´9{³^7vMx™‘•³M ³ÉµUÖ­+d¨6‹µzù±ãgh«¹ªúJ &9·:6^‹²®J¬Ê¹¬@°AË Öt1“3nh)T;³ûº™'³Š±3œGs,óy| ·U¸Ii’k¶¸iѹn$š‡#œû)a”»±g`~ˆö¹gÚ<= ¯28ºŠ7m…;ž?öði&2 ¶aºpÔv~±–¨åŸü’´?ú¸Ðڔ„64“A ±åzg-e»_ë³8kµN “窱«°F ²&{·¬ú^’e’ò·Þ[Š-‹»Ö« fV‚j•tþ§Ü[¬q» #ÙÚ!l÷N†¥™Ÿ{‘´Ê˜Õì©•µ¥1‡U‹/©˜:K½?Kpš¾n‚HtlZ àû;mb†.梫â¿É8»jï¦}ûtôÒœo½k‡òË´°ö„Ój·ÖFtôv'š¤\„¼©–3ãz½š¨Ý nâ×¾L­z6|âæ¶ÌŠ™((¼Óó‘éJŒù|IÌ®<;{BR‚ɍ›#ÅØ{µÓ“û¢®ù®'+š »ù¬U÷°ÅUk2{s\XIY|†øT1§¬UÂh % -œk¢ù ªÁÛ'HÇY2´Ú*ÄÝEÇ ,—Ǖš "þœ`’\½ô«ÁÖæ !ÆdL"ƒÌº”LÂI'²Ö(†Ö3Ă¼ÉèÛɍµ766ƒžª‹ ‹+¥œ‰æ;Ë«ûØ'®œ#»¼;[ séAÉ܈§ ¦¨&Çö¤\¾iÌV+Öv8\•ü̏üºÚ›_‚'ÊzL¬Ä‹Q ¢ïµÍÓ:+ê¼c+ëÀ‰ƒ)D É[\zj,¤iL™ÃRÌAõy «›è}ßÇN )¡·¼¾EÅulZ´Æ¡ç¼Ç+)´Œ™ x4\¹ðªžK5|ʦ+‹mAf4fu;…€ÛiËωiÈDÙÒ@$ud;¡·xy¡6C:y~J&Δ›õ4°æ¼½¿XþÍß»MòVÐ*¹Ã7ʒ4¦ ûCóû›âñ©? ÔtÙÒ¼@»KoÜÎWš¹>̆êÔZ<ÁV¥&p¹°ÏH9§C](#̀Ÿ‡ÔŽ;ÎÙøÑDÍimÊS ¾;Š¥;Ó<Ä$D×Mµû¡z=ÂÒØIcçhäÑÊÚt˺7ê× ÇÓ RˆÍËÏ)suúãvr=™ÊWŽ돿<ÑÖx<gÚ{ÕÒ»×j\³s–ÝZÂøŌIb0<͓,ÛЫë#-™Õ+·ÛiÖÓéۜÜÖ̋º6‹Ö#k¼­AǸµüË/xȝј³3 ÜÏ=Iö Ý=MGWŽ–þæŒ,š¤õzGôÜÙ̍Š—øϽÄé,ÞËsu89<ñÛÛÓSßó<Ûõ\—,i¼¬¶Þ«Ãßå߮цm¡½2ñÍÖvmÞȳlCù%BĶ2 à½ÓU¼Ð­²ÌDˆöÍÝøÓÜgÓ¶J> ~º½üÎ5aâ¾|òͧЬÀ}.N¨öãá#žºIÝËýÚ÷§‘{ܬlË)äÎ<àE®Ö`Ҙ)Dåã͜´Ö`†¼ ¨uUâÓ„äIÞÝóۊMæ½ô $§GâižØ²¬âõéæÖgæ¬å£ÌÙgžÈQ*€3g®ßÞíÂ3®ÜèŒç®9µÓæ܉®Ð¿½æþR }ÃÝè}«ªŽ„;Þéžî|nݪ™¼ZõØæŒÜÌ\ç*±¼ªÞPZK²:íz¬ˆ4Ô¾c] ¬é(mkdê˜Lœ–ÁÒ­¾¹ÞDMÑîké·«æ QìBÍa&Î汞»O}!ÀJÔ¯ÊÎèjZξ韬iÚÜæµ=éÍ~íJ|çåÞÜÖÎØ>ÅëË%‚î·¾èñÎìóîîé~Ü.O`ñíˆ ½÷Nçù®™ÒY´ï¸œ½$ë—ÿNï ›w ªÉNÚål €Ï#Ÿ¶)‘ ˆëkÿˆ,Xìëø^ ґ ÿB&­4†©ãjò_ ]¦ò©ëÙ#µáK¾ì3Oþ Àã‰qØ,ÓµÄ!_>̹p"õ¼HÙ©}zd€½±KûïÓ ÎËæmUõ‰:õ_qg¬ÒëÛvô2Î.\ ñðnñ'LÈÛ:Ž‡Öè—Þí&–òµàöÕî²<ïçóa÷E÷ˆ®éuÙ42¯÷ñ ð>L¶¾ªÈΣ.Ó~ñ›x´xÁ÷ûٍ¯ž€_×"ƒêët÷O¦õÏÒ¹òXªï¦·(ŒŽM½‘ž_*†¯¥Ç¡ÞB¨ÌxÊ9¼Èº¶Œ0â)GÍ î6™¿E-á«M3ˆÓqý§¢»à[%|ú“ïüg‚åZÄ©gQ3ŒA·ý0HÇ䫏À%$ú…Ž~èG‹ç¯‚þ¹ûæ¾-­_÷ñÎz}ÿ¼:ŠãâJ9¤£+iñci DÃx„Œâ˜¤ÄÌt1‹dTD<\\ÌÓº4-tԌAEY}…Ý ",D¬õM™Óý¹t-Êh~&FŽýµŒ¬MtNÌ]æd…*NvéËæî^Þü¼íª å9Æ6buS44 }OFêÊ×ßçï÷þÿX©ÛÀdß$í¡æé»^¶r¥r(–‚K*^\eð›„öڋ§¥Ù8]mÝÈCcJ–U"<s!HOzŒ63XK8<}"ì±ò;QåÂ1$×NŽÑtJõíü™#ÉTí̈́äšs°´¦üZFdÕ­v¢–£ŠJ×Wa/²Íj"¬ÛSAƒÑÅVï@¸˜Æ,…G/$¹ÀNтýj)Ÿ½SsëKIqy8oB+ ñldfÀ£ùœå,)‚“uʄUójŸ‡ºâÌ*tµÑ»ze9öcNºu¶¾mmdðYEA{¡iÕqmÛ©!cYGTúºÌôòñ¤öú8ñâeÇRnþƝs´Èߛ1¼ö6ÙiR6ŸþðùÎéÇ»/©¦]<î¯&y 300äóJ­ütGµžú»ì?Þ>Ùﴏ"‡Áƒ6ÔpÁùk/‰¨:°(™Ê‰¥×spÅÚÈH &œJFan‹OÅ]<#6 êDåfÊÄé’¹z’„n;%Yü±̊­Á 2(}¡Jm¶ìR¥G®\H:qBÚbL0Aìò—)à ãI"AR3\TG<&ނSO|Ö쳘oȄ” ó4. @_‚S(9}bÈæÉPÌõsO½úLìMHwðtG³Ž2²T~ìC‚ÏF¿xêSRþZõP®e¯Íµu5©ôdU#Ôþ8 ×0%åƒÍYU6DX=ܧ=c{¥õÁd%;±f%{6XdmE¦Ÿ*¯%†Ð¦Œúb[*£- u×e,!O›tÓZ5×sß.ӫ̍ÒÞ{é\r·r7­×ßy%W_ÒžÖàÉ8^ÙøåÑჅ\ª¼|u¶`‹=Ì6ÎyGmøãüxՖanM>9d+8æØ㺲º#Y.`ŽF–Êã3L5àqžÅå*`æJæ;³¤”y^¹ÖcUþwf„fèL)¼:µÅˆÁè[)¾6,óÍÚl›”P!°ÃÖyêҔ>{0üV»lkþI¢Ná·%–B²Þé¦Ý"Æûé¶û›i©¡\C%ʸÙÅÌa2ÍÊk|NJwŽœA¨;UlÇF¼dҁ‹rªû]=*”EäØê”]Ýwç½wßw§ûv–P~ªâ±;^x®ëÍé+ˆõüS47·äo_黍æZ.Ç»nð@ˆ¿Þiaô’^¿9¼QSç´O°|Ò³·®ˆ LP­áSÇ@¾ñWˆòĵ€QîWòë\öØv!Þ hš³ %´»\j#qM¯˜Àó%n‚|ûS…òe§ ‚°{9Y[4¢ƒ8±l°q l`¥&$>öýF{ÒÀ‘—–´Ñ6þ.ÛòHä­q4E.iXa€ÌdÄ»!©@CDç4Ä R2V$ù°XŸ-L‹]L?õE1®¯Œe;c\Òh/2Š±kLÚfˆ’¹&&qsdž°ZGŸ±.‚ ¹ZŠJ÷3Aº„z£Y! @®EqŒÍ!!•Èé=Š‘j³Qƒü÷ÄÊ<ÒnfTŸ$û¨Æ‰ 3(”Ð#d)2•9å(ý‚œc¸ÆpÎá<úV¨]z5‘Šeð4A‘öeÒ7ìJàgš?þ¬hÁT]Fæ`BR=ñ:Öl““¨í„Mz4«f>š,‘âü!_†HtŽ³/{gÅâ§y®žGþ»§èòéÈ}ÞGˆÜ¬‡óXå#êgrN„^]úI‡˜aLÝò2tÉ÷ç\h({æP.‚’C% )èQ|f”<Ž*Inȕ1oâ¢zKs)åìh émˆ´<:Ó(Õ«X³jÝÊfÔ®`Z K¶¬Ù³hW~M‹v,Û·pãÊͺvnW·vóêÝËbݾTñL¸ðÛ¿†— N̸±ã¦ˆË\,¹²åË#cfIy³çϞ5ƒ>Ùy´éӅE£†Xzµë×pUÃ^Øz¶íÛ[e›œ` wï×ÆM¼8SÝ', 蠁pãУ?E.Q9AVh0A„vî ZÿpaƒÀ æIˆ¨ ~BÁ7@pá{÷ªÒóëŸI=¢õÍ ´€ðæ]ò& l`õ-0@,Ç À—la‚xÓpû•hâBýA4¾à d·à„°#  ,'!…ê( 9#€Žxâ’L>”âCÊqP ÄÛX°Üƒ8`vù# ’)# Tte–Ë)Ùä›pô¤Cÿ‘A›QJÉApEB@`R˜Ý˜9Pš§”|ÂDbœ7gCu’!Œ! ԑ ìø£éMàyÝiæ@ÜYÙ@Œ"n:Y¤°.ÿ9)C•f€y ŠÚæ8 äƒó܆Íayª@t °$äÚ@›nÆ*m~³.$B£òézm›^¢ÜBÁñY%A9·G=:í»¦U ›»ðÖ»™¼¯Ñkメá뚾üœ˜¿«,ðÁ€ŒšÁ7œ—§1ìðıIÕ¤Äg|Ħa¬ñÇ`q<šÇ —L—ÅL’lòÊÓ¡¼¤Ê,Ǭ”È Á,óÍ2Ñü™Í8÷ÜÒ Œ$ôÐ-@ôÑH[$€ÏLwõQPG THmõÕtÐôÖÐa\‡-6 @Àc§Ý³×|­öÛ1—ÝöÙp×ý1Ûm»m÷ÞËÿ7Ý|Ž0ς.á†'NâŠ7>¯ãKËxä”ï\ùåc®¹‰“oî¹a.z_¡nº]¥Ÿ®ú[©¯îºY­¿.{WßÎn{Y7=´Þí¼ÇU •Ùҋ½ï’މ¹{ t-ómzÀÁŽÁMOæ¹×¤¼õ·<¶Æ‡ïß’7 o”¿ìòË9à@”hr×¥rfsêëXA…ö øTùÚĬ ÐJL–@2°œL-€=ª@Iìt@4 JÎé²ÈAZUPFäÀÿÈ´€ ]¨EhP•*Äß\OԔ–êÓÁ$„D ^T˜ZU’Q ÿI8‚€}VŠ!Ÿ6dÃ&ªéƒ:äP¡¤ç£ p€TB\a§(. |hʀ.È@'šñ&»#A’nÁ ˜'ETW’*<öx ˆo´Ñ¼c õq;2£ "¼A’*˜à!ÉÈFþˑDJì"iÈIRR–¼¤3©Ir²“ü$((ÊQŠ¯”¦4*SÙ»U²òv®|åìb)Ë×Ѳ–«»%.O§Ë]Ž®—¾ü0ƒ¹¹asÆ<&¤*’´fŽ$Ό&H©ÌÕkØ$J²ÉÍ $³šhљg¾ N³ˆs3ä,'YΉ™tª3d.;‘;ßÉÄ´Ð7ÀÙÊ=µ„ÿ=¬Ì“žZ±'´šE<¬Ô‰A[ù'@±"Ðëœi;÷9xì³£píNÈÓ(ˆŠ¨N" ®–G<u‰BJ•†èEšÒ@$ …gLeºP†ýIT±¡ u,õlVOÁ©Ô§|¤uJ>¤g+kYâÿ¸T@ÿc•¦8å)7fʂì!ª©B *M¡ç·®)¨ˆ;!’–ª¡¢fJ Zۙav ¶Â•„žõÜ^ ÉYm"Ö³H»Õù´ ¼„¬F8?,9gCXV}€å«~N·º¶çµ ÒYv­+\È£¸ÈEsd\µó¯zf‹. „‡O HW #ì`•â7ì¼ u/̟xrŽÃ¶É°e6 b¯x¸D$.±KD\™«˜%,–Œ‹_¬’?fÆ4F‰Ÿ“ãÓì¸18îqfN¼Ÿ 9"?fŒ‘ì$"ëgÉLnH’å(£ÈÉù©²•2eÐmù^X>ܗ1ÓåÂhyÌr stΌfš¨ÿ:ln3 ÊL˜8·™Îƒ±3šñ¼ïµEÎýz3BZ» E2|ñ’¥þ hÇÈë}²‘±R"A!ú.vô‰%h4Êç¤"íRp¨ôXj~:=¹;Op º£µ xdÑó˜#S•D9ØS+ì`‡š¸ÖµHÛt¤ùLiA#TcZcéÆ fŒ‡ª@ŽvTÄcíOK축þ'¼°ççik£ xY1à•ö§Þ ¾ÈW†Ðy Yu“ Œ$\€º iØ5›1è>WŽÔH =(Iò«• .% «AèZ/Œ qÿÛ0ˆiÀšTA…QÌЄ:n&OȂ#ÿ4U^î‹c<žÉÊÒ´,u¹Hzgº·ɓðR…¾¼©O¡B+Ý°˜{˚©’¾â  Wi¿×QәCM ,ËÑ­ü—UéA/ñÀ†D”AÖZwyj®Ëϗ4@Þ ñRŠÎlµ†Ï¤³ûÝ]œ­Gï|ñ;““Œ<3ë=a|7¡‡£q± ÁèžÁùÑI"ÕUEz+ټ·ï‹f8íéø¦gÎÒ+… /äyý^hM [6×Å]Ö}˜5&…[ê[CŒå…üì×K;¬ÕT Š;S)p Á½ìÏt£‰ìΒ»®m藵 ˆ’þÿôçðDe§Wœ=¸¦þv¦ ɵÉyàÇO}Èo|9$ÇÎÇϕ{âÅHÒiõVyFv1‡W3Çs6×£vS…ÕÀ»z(Ig)%5u‰Â<Â`DW$%~È]—&í·ei†7‚3Ux}+±PRȂ‡‘x¸1|=x{¡ƒ9ƃzáƒ4„ágþdƒ7x„6X´l_*ÑG‹v„H˜˜§n´y±t(‘‚–riL!„/6z$Uz †z£|6ò΅…j$"á2€4sj¿g\TX…ãaµ6 ·'lºçc"€Êqà&,w}tAû³@JÿU\¨ly¨‡eQ|ÑÖ}Éw&ÿÁ…s¨V7tö‰×WÛ\¡å„N!†*†nÀ³nôæ"jäçG—’B —Übȅ0Rax`à³-Õ£b_".Y>Õ(aՏóHaQ‚_'\±*v‚vSѐ&PmGs—P$¹N8ÿx.yaDˆ:7Y’9i;‰_ÕÒY1Qxl1”Õ¥Év˂Wpg'QHy“—”? O‰#;Ò~\é<`˜mˆ’u—•¹Oð,õ±X%Erš"yl¹<Å.t4FÀÃS0.ޑ¯7–\¡”µõlë5VP!Fä"µ,â"4Dܱ!U²!éÒ7|öu–hy2!$\ø|8â+*醚Årp7D׈ i)™it›™–ü•ñ( à(\8tXRoZ‡Òš`!˜–…WH`WiÞŽÈwk/Ðihoi!œq…R?²?""5Ò,Žu&KçmíÿX`™‚Ò€!˜v¯É™Á–‹¨ŠÄ‹x5Al¹‡2jç’*Íò€¥’V®2ëɞQG!Ö-`ØÂÈCv¸A¦åpU}Š WÑeî£câ…ù„•ÚRA© ðv}vBƒŒö¡R•9*º¢)Ó¢.ú20ê=9ÔU@#M:ºF³£>zK3£Lñ4ÝT¤FâYF~Øq®rhË!„Ê©°¡ŽEtŽ DÄ |Î!#µš#ŠÆª¸áªä†&±Š&³Ú¶ª„#Û!’¼êµZ$%ª·!OçÅ:D $*´¬¶Ñ#XÂøÆEûs˜“E$¤)$„ Îñ,䨭·!¨ á®ì¯ò:¯[!ôj/xz¯‘¯ú*ýú.üú¯ °«[°q°k »°Ñ°+±ë°»°‹°[°»$7 ²";²$[²&{²(›²*»²,Û².û²0³2;³4[³6ÿ{³8›³:Û² ÀÚ±%òà³@Ë$BK´E{"Gû³I+KÛ´&ò´P»R;µùQµVX›µÆ±µ\K^ûµ·¶ñ±;{¶h›¶([!   ¶p·j‹ A¦r{·x+³«Jd+HK1²Q£ãD#´ Ñ·$ð·¸!)­Ñ±a¸ ¸Šë0Œ«1[¸p¸CË´Q¹ s¹“¹#¹A¹ž+0¢K1¤K1¦{¨«1«;˓u–c°šË¹ K»;“6•{› ±OZ˜q1»--ÒX¥E¢°(CU%c„;Ë[¢,±x„T½(¯k±«…ÿÂ|ü•ž„4¼ur¢‡e⡂Rh/%râÒ{J6½~‰Õ•"¼Úa–oѽñ½)ñ>óAsçF©J>䉴—íÑ"j•REQ(u†éqQ󱩬êÛ¸ Á¾ÇÒ{<¿Í×&‹<)L¬f%Rg>ÕC1…#¢Â’/Ѻ~–’$+ìÀ ¼ÀDÃot‹3œR¥¥nçBÃIßBÄEtÉòŠ²,ë}uX\Vï(/˜%¨H[ kÂ…’lGWä#XT]Z`BÌ¢^f"%GE!Y%YD¢Òç-çx.ò+Y`=Ñ»|ºÝÉ2¬Å…(},!# -šµ(F)BÖ= ‚-=ŠRB¨åÇ\6ÓQÓþL¨iÒ{~h)9Ýp‰2:â›B(ð÷!%ˆ•­ õœƒ(9"i¡ÝkU ÒgrÕAÂYßL‡Ìâk[‚=Ëô<ØÈBÛzb=lèKP˸Êx]Õ!­ª•[ÈÅ[ðË| %\䥟¢¢[´½C&ÓÜÈB¤H¸ÿ™VÉ"Ë/"Àá…×gÝâyšD}(éám¾IÞXL™ á÷S±è<À¡|« ÝD@ѕÄ…&ÿ݆¦Âß<^g-QE’ÐMy ñÛÜÔ[;^™,îc,úݾÉ͚BM‡‡^«ì]áA_Ì"^~&¾,Áâ1½ØÜüÕXRúý€ê"¿Ë"ˆÜ1ÙÍ]s¬+>w'?R'ôÕ&=Ù¯bÏõÛO¡, 9.ã«($d\^õ•Ä‰Låi_ò…åÞã" ’àLÎDBâÀùàm »oqÍ™)Úó8¯³Ááÿ¹ ßí¼ÎºÎ¾îâ^ÑÑþóçô#ïCïpôï®ôÃôüâôjõÒïûBõûbõɎõ±¢õø:ôó^ôÀÝó¾,»R¯҃NdïéeÞµfÏóGϾ²ï´²}Á^qoÎËÌ$¸ö(‘*Ê[Ψ½tø‚%Zø¾ÝAøöÁ%½áø+Q½M©^¿í¹ì˜Õ‘ªñýÑ}¿…†,¿õ¨Ý-ñ#!U(4&µ:AêrÈI¬Ê5HÚ)‘#¨{/a¿â‹ùsŸëhÏÅ 1F›çSxZ"´«ÖáS}BÚá>ù̼Å0RÜ[OˆÂVœ(ÛÿoÃâéÂEÿ3B%.Ýoú…Î؁ú9畺ÝáìH‡N^ˆ"Îßü8ê‚QÚ!TïQÅÑ  ‚ 8È@PáB† ’ðPaD‰r0°†‚’1!z°@Ђ’+Œh€ÃÂ&ID¨gJ‚ &$Ra$^Bh´Í›->%ø¡@E© 8J´jqAJ<'pÀÁÁ‚ºZ0pÙµ$2t}›°AX´)!0)“ÄØ hÕ@8–`M… ƒÀ+¶AÙ ŠIxH,˜„^L~uà€Ä‚°‚7v°ØbICE½Ù$F†]7Cà{ÁÿGÊ YÍè¶ë-ð6Y—7·7Ï4‹ô3‡Äßþ&œÚ"E‰Ô¥·n`ÄÂçÀ‹hÙA ô5ÀqÄkoH¯ºIßÞ!ƒ&k|ÁÌõí7w&«»è®cH*ª È ««‚Œ D› ·Éãɶ.܌§¾*S‚Õr“ ±íH°°2 s[ϬäÔ¬, ›I„™2S(>Ê,3± 'á g2­4‰N#P"Œ̤UoB‡8@EöŒ'Č2 (Æs„+õ£Åž”´RÂ"²Î¡4‹á.³lÚª§Œ0ÑÇɶ3`Ä9«QÊ.ãô2£ ²|l<ÿËÚÌÿtTˆG@¯©‚Z'kÒcoÿ‘r@.-8átÏ5·\˜%ké؎–·”0ʚ?¦(Cl[¬™&ȧÉjYµmšy²·Ç.Wa‡VP"´<¢Dè/1I%k)™0NñÛôŠ¯²Å€E‘)ÈÔM„¶ Y¦ƒ z²s²Ãƒþ)¨ÏGËÙ¡# E׌ó\´fsC HÏ5CR2Ço"k%‚X‹¾@W§Ú%єÞèt âz¢r{Wˆ%¢ÏÏÌ ²­ñªÚy}Ö¥N¹'±EÖF)hĘ'_õö=@¿ï©(EÐ҆f¨âêJ„šÓœ²†SÛaÜcs.9`- ͔`D"öpj<˜™ƒÁÿµ”l)¨ÌRøt+öÔê2!KC¨BØëXˆÖñÀS+ˆf3´2 OHHCÑ é3 d‰kã@b$ˆ<©•y(‡0º2Gœõ¦“.NÑðSO¼Ëٔ… å z¹—Ö Ä,Šˆÿãà“¸µe¯&|Âb—Žå·†î!ü[ˆÖâV’€ Q“Ɇ‚2DÍ:$‘vӓ™ ̏ *äEâv³ã¥ŒÉ#&uòÇ…È "8\Ô3Q^R:‹]Cf©uY*k#Š[Ö².NJ²“Û@- ¢ËDÂò&)i’séË\ŠrkSL-…©K=s]Š|ÌÍô(£MŠÿ²˜ ¹¦N€9ÉN’›¼LØý–¿†é*+_Õ¹Nvd• yg;å9OzV¤zR¬g>õ©O:ˆœ»NZ´sŸ­g<¢P„6Ô¡¨¹'D:QŠB¥Ÿ ±ã¥ÌYQŽV”¡$øhGEºÏˆFt¤'çE%õÏ;n¥/çGC SšӞ5Å©”tZYB£¦“|>Ê©’⥟ šGáÈQ’ò=¦zÐAêB#.0×pÐKgμÅ(;E%,YÐN‚¢Tf$ q´N<ÝÎ5/9­pVȆQƒ¤… j¦;sÒ)å@&‚¾V ~ʇ£þ‡3b!Ërö¼N/?¹{%ºÉRl‚*^¢972‰ÓÐÃáqj6VNbˆmy¶ú¯v®¬¡Bk°5d‰qZ‰®m,%žØiB¤æ¡&Ñ)©EʓYÿjªt5ûÅÝCÜv`¹$EꋒŠ¨”!9mïßEéҗ¾Ý%;ù„â*72ÙÜæ&ûtz얐Ÿ%“ïm/QZƚ¾f5,ÅáJW:$L¿É‡NaÑphŸ4Hƒ~¬Jo/&•ù9ñæ­i¬V×òÀz²SXFkãUû9­žNâr™»Â螬º¡Âå[ià]D”-©m°ÊZÊÖuÀºåH0#XÈh+”1;èUMÜR~4 m@38ÊÀ@fœ¤•eo»${nÝ­`5|‹×».rušJ/F¦7y~úgìåTçX,ù§bÄ&zi€ÿ†œéNµ$Ÿ‹úØ‡ÿ8.NI6‘ïmï9ƒËà‘º &׎à1:Ìsð>…¾…;ˆn6QÞûÚgù–y{ØWy½^.Ï7Ò{™³ÍùMïf¦[ÎÒñWŠCëŏ¼M5Æ͈Ѓ?ù”4j‘»0R#ÿc§ã‹a)äˍ†C š3? ¡r·h:3¢2ڌZ¢`Y 'Â@$?΋¢ò#›¹¼ãá´Ok \•Øˆ]j™95B ´ô‰Av:=‹"¹¦Nª€!,[Z¤#\j:MjB­É¦¸©€OÒJ*‰RrBHs¯(ê Xò&%lÊÂfÂ%]z&_:$bÚ&ÿ%Ü$b'u¿cQAkË \ˆ43m3Šó@ Žà ¿ˆ™W·)7âÈÃ>Ä°’K°‘º-¼°8Œ”9Œ8³˜¸pù)™8n)‘¹(•ÀAä¸ñ8M ¿tùA'cDl0H<“9d:9²D´‘–.¡š{ ©Ó¢‹™)Ÿp¹EJDüq?FlD9W,²û< i¼\ÁÆ£E¸)‰ù˜@™P±šiì0uJE“9VT0e$N4;t£:\Á1C™ÑŒê»•°ŸÅ€¶·(ŸîSžÊd?Œ‚5‚;ýG#Çë0 â Rœž#… Ž Ò ¼‹„ð"ÿ ”¹Xtj¢”¨H‚›žo\Äpü»¡#HT§KÚ_"ÃÇH›ãaˆë‰4, ™ì‰ ПßPÂe‚¥3Ô©~Ä®°{?È+ÈþɵR±¤TJÁê«¿Zʧ„ʺJ,³¹£4Æ« 9F´J¬äÊÔJŸä©€ìʱ„ŠÓ¯­$Ë´¼³¼/´TË·$0ctKíŠÊº´K/¸ °»ä˧Œ,bJc<½$ÌIÂḐ0L6ÌÄTËÅ\²ÆtL²„Ì “ÌÉìÊʼŽ’ð&z’´)¾¨ú(èËÒT1°$ˆ3ÍÕ/Lԋ”lÉ .’Ž °¡Š˜œz9E¨J+Êÿ³DMÍD Éh¬[ƒ–tBãLªÞì¯ßlËàüGËÂ(¤’ ºñ Ÿ¹¹@.òÂÐÎÊ¿´£ ›Ï‘¨ôl’‚r‰`‰1¢Ÿ)ÉN©ó¥"qNý‚ÎùrËêDdžx‹D›°øóà’ý؀Ų›Ù^Ë3øP8ÍpÐ4Ó¹õȀ„0€ ÝÍÔØÏûêOøúÏ ô0eá3Û Eq•Ê‘½*™‹&ўÁ@„H™¥¸ ýh;ÂÝ °#]²m¯=ZK™Ù–Æø¶­šódÇY‘’Ë0 ø„R—bÕ[’71¾‘”'ÿ ْ%´$YÊ£XrSÌò:­á€›ñJê$<ËÍY“Ž‹SšbÒWD¤=Ñ¶Ë DÅÒ׀•ÂŠÇà”Ë«Êp òÉ3•pԞ(—E 0³†Ó:³¸ŠÛ`H³Èϳ2·O ²Ú†°Ä½À!Å»4’Q³—Ô"‰«¨H´( :IÔ{VQÉÁ%`%‘cŹ {tša픊Aœß“ó[g½Î3ñÔ±ãj”×C˜AÙSsL2“Ü7¹‹IUu”Ÿö1ÒLWZ=©]åU‰«±» ʈÚð×] ‚Œ‚%ª·)é’ ä “ÿ Z†­ØNEÓv£»H Q՚%›p1¸ñ—«pO’’€O£B•¢ @©Ïó`5vÍQ™(€›YŸ ÚĈ›É€”IÏ OÛs âX٘剡­Ã‘}Œ’%ˆ“}ڔ%&Ñ4£cUZ”¥Ù¿‘Îb,ˆ×>… ²•ˆS2¨´µˆSÒ<éøÖ§#‘¨=r]ˆ=3U¾Äe 2. Ö@±3 Óˀ"´8Qá·¿5[£bW£¹ÿÐ[½!?ÔÀB—|éÚ8=àIÌ}“É[•Üøȳ·ã5û ÂåDŒ8ܽõZEÔ°z¯·µˆ¸Ý‹Ë¡Ûv3UÿýR!m¶¥L-»^9¡Š›$àÕ1¯t°‡ÁÚf-Rèu×M…”›àqÝ å7_] H x"¥Ù%P^ነñÕý”ê½SåÝ×ÂÈÌXvÂ]Ä©%(Ï™Ai’¯’ÅO(+•À DZ`¹Íé¿ý˜ºÉ@™™Dq #†0 Í(SÅa›Q±wU?ÁV,ùß `« v6áø'°=LdL—•Å]ݸԃ]ΐe ɖÙ?Â?`iK=^Ò >‚Tv¿ –Lýá Ê}‹âԃ͎ʑ‰)ˆ¨Ó±9ÀO‰b/ñ’_UâÿÇ •KM ـ3&cöZfÌú­aâ¸2Ê`ŽOAW…¸Ö@‰‘ ¾ Á·8±VÅ¡€Ñ½ðœGs`võ2Ädf9ÖÖـÁ퉊±jå„A‹\Û EîdQ?VJ¾½?"Þ+ä”8ä#å*QåF†ã7“cúuÄHŒ=T~=)i½Ü˜X¦XÚô× uXe®5¶¡=¶â ¤ÍuŠCÉsACrØA•ai’P^ ºØƒŒµi¤aù…ý¾;,iÀeV w¦Øˆµœ‹0çw^|å)ٍ3Á¤ãéI\u2(¶m³UÛ¬lÞ3)>ƒâkۊè?õ°ÿˆ~I‹(譒_Uœa cD%M/·lÖéîjJNRH~0·LÌ˄/Ž¾.”FL•n/–¶.—&L˜N/™®.šÖK›¾.œ¦.†Kž¶.Ÿ–®¹ é£v¬¼”ÕDê¦&¬©§–êÁúËÌU$IÌ|ÌéÐöj­v5®¦]øúj°þ:±æg³ÆLá|°²Vëck^N›i ¦@M›xí²¬ÖK¦žê¾¶+×´jØ\'†ä¿v› šã㢡å½,·NF¹üÚ«줫5EmŸMæ\Ý1½†K¶ôÏÈluŠÕÊÖHÌ 0M"7ö$Ù쏢u ©+–'Çf3ÏFQОßÿ驙Ø0¦õæãh‰ Р1 »8n»Ý8åµ=[‹ )Î~KÜ^RÝÆhÑÖº2ìîþ¼ ®¿˜à±ˆ‘v¤:E©"EòfÑ(²í’þJ}Žµ±Ö Êþn„):/ñn?ы뵝ÓVo¬k ?ihoµnµ´:šHz ®ãÌ>ÉWTíGÑN:üƒUãØô‰<£ÚšÈ±¼‰ Hªî·Æ'Çë“Ágw;%Ùä”—۔ FùÓU I èóùʈº¥«5B9gžÑ1ÇLmFË+åQõQ–Úf½ˆ:n^ØZ¹»)AËÛ¡‰›óGp—¨.úÇ 4nam¬}YûkOìV·@íêNXÍØYh•Õ4³¨Z»‘ÔN9ïNtúqíí1“HÏÙfl’»è ß'3‡huÉOHUXOÂNJ¨OË4”X é1…»œÁåŠZ¬@‡öÜý8ÐÒQÐÈ-· ²ðâF¶”£n EîxöüèŽénnZEsËÔu²L“óh+\.Ë̹‹Ï¤rxOÖ)-õýŸ±à–#ïqo âQÏõ¾ ö6Òñ'úHûN/ÿ+¯°4ñ æ¸ 3‘ Ì1‹pRA¤¼Š™îR9qюÉ`7W‘™€1øÄxypɺ5g²Vÿq]fñ4፮õQ. 7N iwñìY 1|ÇFXêÙ&ù™¸¡³vÔ÷€I%zwú÷G†§N‡¿.ˆ—°51 hsòh‘<Üi‘^u fmò˜©åŠ‘vWñ¶#‡Ù²”h͈¶´ •('‹)_xšŸÝ´¾ù†¡y´m¦£e䦇1ª½s*1Ž€íåcÖ Ä8âȉsm¦! ™sž`ü<‡ oA˜óóÐüÀÞí óúÃmZ'±%[h°€Î}YŸ%ŠÞý֏cɞcAÇîŽöq† K¿V~ºé·.þ–>~AWpÈÖzéçÊçŸéè·þ±ÄþœÖþí¿~ê'|ðïÊîÿéï'Á\þõ—+Àþô‡C®ø§èšÿúÇÿäºÿüçàÚÿþ,hð „ 2lèð!Ĉ'R¬hñbÁèèñ#Ȑ"G’,iò$ʔ*W²léò%̘2gÒ¬ió&Μ);PK'ËXÂÐ-Ë-PKÛ°-AOEBPS/img/cm_all2.gifLW³¨GIF89aA p,A ‡     $ ( $$$0$$(((0((,,,4,,8,,000800444844@44888<88<<<@<<@@@DDDP@@PDDHHHÿLLLYHHPPPYPPUUUaPPYYYiUU]]]ÿqYYaaaeeeiiiyeeÿ00}iiqqquuuyuu…qqyyyÿ@@uu}}}…}}ÿPP………‰‰‰ÿ]]‘‘‘‘¥‰‰•••®ÿmm¡™™¶••º••ÿyy¡¡¡¥¥¥¾ÿ……Æ¡¡®®®²²²ÿ‘‘Ϊª¶¶¶¾¶¶Ö®®ºººÿ¾¾¾ÿ¥¥Þ¶¶ÆÆÆÿ²²æ¾¾ÊÊÊÎÎÎîÂÂÿ¾¾ÒÒÒæÊÊÖÖÖÿÆÆöÊÊÚÚÚÞÞÞÿÒÒîÚÚÿÖÖÿÚÚæææÿÞÞîææêêêÿââîîîÿêêòòòÿòòÿÿÿÿ‰|H° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠ|˜ãC)(Sª\ɲ¥Ë—0cʜI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£2‘0ø0ŽÓ§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶-Ö0K›ºK·®Ý»xóêÝË·¯ß¿Qá2L¸°áÈ+^Ì°`¹#KžL¹²å˘³>Î̹³çÏ C‹®ºy´éÓ¨S«^m¶4ë×°c˞mÙ5íÛ¸sëÞ}Ö6ïßÀƒ ¿í{¸ñãȓW.®¼¹óçÐë2N½ºõëW§cßν{ríÞËÿ/<ùóèÓw6¯¾½û÷‡Ù7n³bƒýûøóëßÏ¿¿ÿÿ(à€hàê߂tÉÇX|!á„Vhá…f¨á†vèᇠ†(âˆJÁƒ(²åàbpõáâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã8¾qbŠDö—g-©ä’L6éä“Pæ(d‘T’µ¢bIF©å–\véeSV)æWW&–å—h¦©æš?†9æ›Z•‰Ø™lÖiçiº 瞤¹x*è MêÉç¡PÉ „6êè£3Š(¢ŠF'¤˜fj§¤“òYia—ºH‡thjê©OrÚ)œŸ* ÄÿŠB”f@àbnÐk¬±F¤³Æh+ªšªºê˜­:Æ(Œ1Äðb Á>i†‹L;£B¼˜¥ú¸G®Â[ìÇšì_—bû¢8h‹‚{¼ø1\á"¼.JØGWàÄÙn‹ÀÝö‘­º/Vkp¿öÒl.Fñ…¶{|qìâP«»øîÛïÅâ®il¹Tžë×¥B@ qŒÄ`FÊñ^A2Û«°Á«¬±­ïB»}DáA÷A¹Æê¯aF C',ÓÍ´_x0lË/C¯Ö8²š#“L¤É}…Å®(äúÅ°}Äp°¯}|áëÍBìl÷ÿ¡ðÛ.¢à«ÖÁÞ3»ØlÂsÛ½UÇ 4à€+®÷Øu–m6Šhóê‹Oۚrá„ûmmÂÖæMt¶|{3_í¢ïæ}úÍнz(@ŒtäE‹éÃÈänŽ¬ŸœÑIG´Ô¾ìԛ‘ôé¥ÞŒÃÁ¬÷­} Iì]4Œ¸ƒ¬nÖYß;tðUWo½ñÇ發òUv¾Wº{·^·×ûúî½³‚€½v‡0ïYëh˜üÈg-k¿ó[ïÔg°`ÉlñâÝàX?4iŽ~ﱟ^.U«áinPÖÐ0v8ü΅8(÷\Ô7­]Lk/êrø®–½È…Ý ÿiÃa¥Cä`½ôA¶G„yùÜËb#7$A/Š‚î0–:ì!^nÈ ß@—Á°­KŒ0:]¾p#põá[òòÕ鬈Å0.уósbŠ ˆ—ϱi2+Ø)¥<ê‘A|¼‹×´­-ò‘5jâ!ϓH»,’˜t”$'9žJJgY™ %¦6ÉÉðx²A ¥* EÊRvç”s¹ä*g)?WrŽy™‘%-wÉ¥VÚ;°t‹.yIÌTò—è f[†YÌf*ɗȬŽ2U”JgZÓ˜Ñ !.1ÃÌkz3HÇ̦x¦¹–n~óœ‘ §8½CNµ˜ðt4×éœv¦åñDç<é©ÿ{¢Ÿùüæ>ù‰) ½Ñ@ jƒ¶¦š hÊPá8´,•h1)ZQà\ÔJÕh@9ÚQÞ|t,é.IZRݜT,)Ué,YÚRܼ4,1ýR®)S<Öô•Û¼L¨„¿™a…@#*ÒwÔÅ`b+ìi-º›‚%Tvœ…梬ÊH©pÜQøfçF©2QTmŽUÉQ| ¼âh/|ì]ÝÊݾ&–·¾f0| ;Z'hÖ/Ñ4­±Y«W.Eµ£ n[ы‚ʾ@5:-eÔºÀòYíÁƒ–âĦºÂž±×QlW.ÅÕ·uËV²ó[©Z{1ÿ²Ðhp‹Û G­Ì¾¨´¦í%ZQ{ÕråRfTªþ˜:,3Ò!†H´Uk£đÎpCß,Ü.–¸«1îVÒ5¸‹Ë`ÎJÂï&„\7¹{“ìíÜ7­ôå‹ÝÒwÁ›ñÆ©šŽ‹àÿô*7j nêÒ«^åK¾Æ ]B|Qló«¥ýò÷4þÕL*©Fµèù-WtípˀÕ4Ù~Øo&ô@®$ ¬`Ù½ޒ…/<š ¿¥šàr£µNg0fqbvÜ1 Ý·®$ðnŽ‹±~‡KãßØ8;!TsA¦dl6Y­A­M”õÔ+µÊNšñ•?ód«ä̘ó˜ÿ4˜?¡Ùÿ™j^s.³¼œ-¿9”q–³PéL™3?Ò«*ͳžëÜææÙùFv›¯J ¥¦.UŽQÝÑS¿ðe‰ zГ)sŸ–ô:k½M‰L ëŒ&jÕo=½4¦#£iª„ `“V`äD•ía»û‚`a$5!lÖ¾~#®p@Ç}Yñ©÷²õ#öàní¡‹ô—`}h&¯:±|Ît5†µòf€ìbPâƒÎVŸ m°èÕ5Ź jAël¶6¼+lˋäž÷´Pà²{Ç”ޭئ'SU_›Eٖ̥ Œ±ìruv|ÝÛÏ`8Þ¢šhûWåx·‡êâ· ôĔ*»‡óbÿ·o‰¦FK[ûà¬iõT.AÙÁŠx9µ¶XÝc7WGÕ«äXF·ô½8ÁKŸÎ¹+t¥âúf"58Ìç”pV8‹ë‹‘M‡[7Bðnô…‘dۅ°=d/ˆÎ27צT‚ïüį[¤s«Q©OÝRUo Íí•nÞM½ߟ„}è7·kâÚÿx×^n…€­‚/&ÙÛzXí&úËK…µ&„ é¥â†§=ô*ËbÓP`A•¥Ì^os`Ô¢õ»Î>Xan€³~{rO ð–±àR½yΛÆóIe¼FÁnÑAbUœ–v«'#+ªñùQ(–ýF1JßV‰^×ÿ´°}™}]4֋«müÜ ?Q©Z¼Dë¨Ì;ikeÕ|ûmš÷U“ܝ)IjMòT8àHú·´ñ~Oágw†*v§€žÓ÷€Ä8Bˆ%‡f„„ØGh&¨)_ä U|!hh…6g:’d7ÂF’K‚Si(ø" ¸‚ŸÔ‚Üԁv#¶.t·$1@7E˜ƒò¤‚<¸g>¸g3Â.Gx+ ô`¿õW±ãB¬3kWðpó‚lÆv+ ¤qb….r´GƒJ¸ƒM(L#Hu2r4£.Pã2ê2aՒ5ÄoO£.Bô57Ùò0ˆCS‡GÅ: ”C-§„ÿńmØgo¸(2R+¥bEƳ=r—0³ã+&;GÓ-Rƒ3ߖ-ÃZ.¢‰AÈrŽ#l‰å4‰x7#.¯•W¾¢\ÞbÄ-ç1C#Dt;OµBI¦W¿èa­¨ƒ‹V÷„ZF#t@n–0¹²tdynG5Àµ8Gu„G5|ÛõBJ”„k،ÎèÐXgmÄ?¦3Š–§0µ’-‡0¢õ‹µ21Ge+µyS³5d­øŠéh$ë(‰2‚DD¥x¬|¬'{¿Wb2ã@%öY·§;%f@7‹|šØ?Ë#Y%‹ Q/c-^÷kú:9ÖEee7‚Äcèg~h—/‘ÿ’#I’(e’®R‚ŽâC¤†Ž¸“<‰S>©,ñ34’®ˆŽG‰w©mN‰IF•‹•”è”Uy*W‰•Ç¥•'Õ]9.`‰$b™6dY–£•g9–S©pkɖò•oycqiutyGvy—f––¸—Kԗ~éj€y?s)˜ƒB˜…ùy‡©Š?ŒÙ˜ð——A0š°™žÉð”IhÁY€¨YOP©ÙšB£)‰–©G=J›œÄ€ÉÑ€›“¤›ÈQ›`›À©GÂi¼Yœ¾yœN”œÃAœÌy›Î©<ÐËɜÍY›sÃ À ÿ䝞âi¹'àyžè9›ÏižìI2äëŸò™ž¬Ÿö¹*óéQú¹Ÿ“ÒŸNöŸj.øysP º  Ú  ª)à Ê rP  " ¦Ái¢ :j#´#Àå"Ú¡îñ¡¢¢5=9R¢}p¢(ª*|€†Ã—íâ3’5+nð–ÃzùÂz-m#£3šLJ[àñWD3Wþãaf”8V-Ÿ%:Z71€¤IJ5 ?P;üÖ:×:yãB÷N³BQ 9-^ú¥ã´¤ã1¦}1Ls¦óØW—’+ô2#D0§tÊNv*L°7Bÿ08RÊqØ/»GC¾†Ty3@`¨‡Êaú|5Bê\0*&4…3-Ã"¨BÃo•ŠD8 ©› L‰,š#h´#°«ÖÑ©žQ«]’«ºJ¼Ú¾Ê%À¬Ð1¬œzЬÎú¬ÐÚ¬q`ÑZ­ÏZȊ¨î9žš­Ú´­ôSŸÞŠH³Z$â:®Z®gÓ­èšʚXìÚ®”¤®{¯òÚIôÊ9öz¯¦”¯ˆ´¯ü Tàj°Uå¯Z°›Zë¡ »°ÒÔ°!ô°ï çZ±ý:°ÝI±[O›¢û±ý²eÑ"€ *»²,+ @-³2+³40õÿ1³8›³:»³<³-‹k)B"D[´Fë!]p´J»´Jk"“LµR;µT[µMë–3g² ™Ç3™Àµi†µŽ´' ¶cãµf2ß%œ˜¶Þ%¶sñµn p[™¥ùƒsK·O›·^Y· ¨µ=É·¦‚¶‚›)k ¸0•˜…{Z’!·‹[—~ëlہÔó¸SŽk¹¬¹p0¹7’2¼‚€8b.*„@u1r^%Ä+¥«#¸8(#À÷,Îtȗœ«™«¹‚r¸dû“6’2ž&z<âh:bn±KAÛ5Œ8˜#èv6r4eõ;Kgq’™»i±»4R¹¼û¶@{·PÿX##þâ1å»/ï"F^Öm¢ò0¿åDå+>#÷WÍB7†kÆ/çÛk¥0ë|/õâv_8@³¥ˆ4+-jw½{¼‹&º7Bº=4‹÷U³ÒÇh^R¦0¢W.ämä»àÛkŽ`Cv.3ñ¦E…ƒ[NCÓ’%À°â;ûæ279¸&Z+L4-`àÒ;5ôn #3s˜-B {βqÃ# ÜA„K#›/Ä»#Æë¼Ãh0’¿ƒ)„&•'/Òå¤ûÃSƒÉ¹ž›Â4Bxw¥aãa‰ó8LlŒÓÂAšÆ×E½ñ7VXÇܲ1Ÿ8-B';˜ÿÅ8Ç,îHÅ؋ÚÛ`ä›tI°¥èÛ1}°¾/ÖkÔ^ñ›Š%Æ}Qà@æ54µBX~ó‘lŠW÷bô¢@³6TæÉ·ò1~ƒEVho;ôH&Œ–5òº9Ä:£c8Cs3ME8†£o÷’Çæ0ÑåÌ}Ú¨yEÌùaT³6ú£vçs =ä›v_5É«¶‘|“œ~VìÄBÜ5ñræ:;C/5ÜÃZ¸;˜5i‡Ê3³Bs¥:o£uð†bZ4¾MünC4ÏD£3“?0ˆÅj Éß Ìâ‹_ƒ0Bä>×CCë£1ÕCÏ©ãÌk§1Ï%ÍIˆÑ{Ó7PSDßw‘‘#vô».p]Í+.U|Ɣ¶Ö¹Óc®³c-C8=Ú½@k3„=œI¿ìf7bEÙwFUÄ}?†1 ã4 ó"'ˆ1ã—E÷+a»€¿-WVs“'ƒ¥FCFeÝkÁ4òÕ闋þìŽÃ·xÕuפÙÜ š o½-A|5CñF-f}zñÒ| ~Š Ö4ùÃ4#ªÕMßÝÛ»]ƒ8¡—TQåÚ]u8±­8À­ÇÍL-*¦. ]á­8â:)³µgäŽ3:14D¾@q³rª]8DÙµ¦}Âì¸ã*“Ato.ÖV®àüm:áW5ÛWVo~ç1ÿrkÑ·u¥ã††æiŽÓބºÉÍ~îÄÕW¥¸Î$ÑíLm#§fé÷„élµéxÒé¦N6eNÑ©Î&¨Þꆵê:ë—Û?NëKæè.ˆëµÎ·Îëa&ë”!Ô)¹š셤æÈ.cÂ> à›ÔÙ¶Ëþ”Ê>íP2ߔñìÅJ íÖ¾„Õþí…Òìda÷Appçžîë®îöîî¾ð¾î ð îÖãdñëúÎ#Ø^§‰mUðoðÏð ¯ðSPð½Éœ"àÇþï"ÉïcáïŸì—~Úy¡í"{ñÿˆá~ò`Bîc$ß 0òÿ«òœ®ñbÁñ4O#O`歑|9ÿL68ôÔþñ>ÿ=/‚Fß&CEßôàŽôh±ôŠdòÿêRo#;?YpL¿õ;¢õbŸNºŽ·eïñ˜›öjÿO‡éòaÏö\ÿô_õRßõbaõ–„õqH*…•+cÞ(d/÷S?ê zÿIO"ƒÏ3<·Û#ɘ#Ïe`4bF’µh¤]¼6½r7ò¦DњD÷^a÷M÷a‘ø¨ä$±u4ù3Å;¢Ê9Âpå,ÂÑR+_#¾Š6"”©Hem™òM2* ÿ(.U¦_÷4’1Ûg¿ó\%ö×ãYöb´&aaAÖ²kùÿR†w8n~ý2…”?>XZýAÓl÷"FðBÊõòpCþÓqŽz+­úÀß#ŒsÏ#‘#AGŸ>(¢DˆÇ@‚(ö|‰‘PâDŠ-^ĘQãFŠoÀRäH’%C†aðaŠI–-]¾„YåÅ+¢DÎ8ÌÄ@Ñç‹Iú@øB' !Q˜Ià›Q1X¿Ý[öÿìٕ1ÃD©òvKYvÿ†3Ó¢Z‚Q[‹~»5l‰8<tL¸ò>Ώ#LÎGS·£Õ[½i’çnÈ Ik³úsºì 5ÝgÎÎя&¥™jxÒ!Ӑ²€#3Í.rc!:’Ø:Óôˆ¬Ö‚BÈ ËÂá (DH æëkC!Â[ "†¢ŠÁ=NsCˆþŽÒë r#@o¼Ñ¶IÊm¥CÚÀÇqcÀ¢î {–ô€!¨ñȉ¨CAÉ% 3!!"²rI'a”î ½ƒ3 km¼ó„ˆ"<ê<0Š«¦¶lm ¡ : F7`ò*´«IqÔqHCÿG:°¢šnÊI/3¡’j(Ґâl1!,|ʸÂnòÓ)H¹ò ±êÈڃ¼M êHâ¤KmPW_ͨPC{<4ÈC_Ž¢ÿÒ„Ë _ãÊr9‰às¯(~k×I‘M6(ñ–¼¤hÜ+©DKH'V±;¬`é䋠,ÁB¶FêŽJh!X”õVCUmZã웮[æÚ¯=„ê%È:zñӎ»·â‹bÚ+ž35Øm×e¸a‚Úý‘VCmu—¥\'2¯A·’‚à ®¢W´®úP…Ÿ;Ò­'=®³$( ö;:Ïrù-m‰•Haœç"y1֔#lžÜËcm…ÅnZ‡'ƒ¸âá•HJÇÿªdÍg¥”ˆÎ‚ºÄ¶™¹6êhåƬV¨®ª *>²½kui·mlº@‰‡Ìâ §Mºx¢¬| ')Œê4·®ô Æ—+„‡®% ‡*¡#Ë̆N3õ(,4ª¦-?ò;‰Ÿ*ñ½SS»kr\ÂÖÂê©çlºómÉâ¾{7¨Ú5¾Õué}zóØ_Qs´Ý‡—òYšu2¯Í½€Oj»×e§žÝo»ö»óN¨A7Ü ªÂÃpt*!RۃhÏ –ˆýòÝ_\„ö`ŏR¾@Û&(ý„è`îԗøÑ¡|¨IÂû²Å–UO#´Ó^f,’±å$ÅdÅyNÈ2²ÿb]Ðe({‹Ê r2—ÁÌfÍB {Ü—›åÉ>„ad ø›ìí¨7 ÷6žä)†?t ’rl±#×Ã!pn—½]I\¢+\ÍÇ·(*Ì<Š‹â^Lö¸ža±F4«ÜbàÅ,¤J¾z‹ôÂ#¶ñˆ«a(–Dz¦J‰scÐaFzLÈ “è’%ödàƒ •†š~á| 9 "ۗ”òIR~ý«_\üׇ%KÑZì©GAÞ&Žš#ë8JV¶rP¥¤I yºR2n`Om DX^æ”ÀIeW¹KbóHŒ¥,âǜ0ĘyN†žÃ^Zÿ旿©[,‡9Mn>³šÉ É,»9Nb~“Hº笊DNvNӜàg;å™Çwºäš»¹á ·9O~þ°ž±Œg?Z½Z,%BúQ0µ·Ï6tiMb@cc¿ð´r“Í2‡tÏÛ(´v ÅhH]QJT# ´£’³™µiD k¬ˆºò"Š46$åÑAk…Ð’ÁjP…:T¢Õ¨GEjR•ºT¤v€©O…jT¥:Õh`鼍I1ÒNB@4w™Ì‹4Ô ‡5®!“MiƒÓ‘p3ٌ%¦0WºÖÕ®wÅk^õºW¾öÕ¯zUÂþ:XÂÖ°‡+°ªL)ˆAÿ'ÇҔ­TèB{¦ˆ*ê!A–Dk‰Á‰¼ª"¹(N`’‘éÔZFL§‹…mlï(A¶·Å­eĹ(œhëQƑTØÙ!KaêS›²Ê[~;°Pf²¥zUŽµU)-\«½ikwäÖËä3·ßí©ð–×¼â\Õ¼ÜÃ/¬áK[ÿ2V¿2¸^€õK`r¢‹ÁVæ\»LÓ®Ü^;$š×À²lÛ7x±³”Ús¨v¥°Eé^Z̈́¯’@¯EDÃVs“˜(Dˆe¥jû£çþ;»ˆ»–)°ƒe “6 @ÁãqŽ#j$÷èNx¾ê]{‰<Þ) x?Fÿ¡w¾xæÙD/CŽž/¼âcÂqÀ 婎µl’ÜxÁ[ó­fIÁƒú’ŽÈØs4š*eÊ#!èb†Â´øç;-”‹{¨Ì¶æðÊ;‚k˜ ’{ǃFôoÄÙÄN]qqR´3ájdE(2n‹oqtÁ¸æË®Œ©C£}b=³ØÊèLtªg¥U·Z‚ñ";@ÿ4ò‘ú­¡CÉY+­|ôóŒ&‰Öɲî!P¡Ôs©«ì®ÇÄ»®ÖrX mj³d–×’OÐæ‰KéPÙ±j1pš “WÛ¼Ò6wºE2KfâQ Ñd㷗½?Ë1Ëê>÷´ñmn­ÊÛß}>I½ÿQyï}ݯv¿ýým€ƒdÜ/ 4ÂË{p‰»Zá /uÃ#ðŠW›âOõÅ7BÑiêÅÛ ×øÃ]òlßöã-´È)‚RNRm¥“iiF^Zx§Ë™1CP¤‰ñ‡…›†ÿM¹ažÌ—/Ì2—W?3êšfD¬!+ÿöÕó„x@/_ø#ʍ¾•·DéN§£¾ÑþtŒ$¨¥ ‡"DÙ?Z”˜Õ‡<³ÎÆ=²B­hS´"q™;&WÕ¨0Œ§é»9ûÚªvÉëx·Ui”§€KáVŠ1Ë §”›)æ~Ź¤2•tQ%,ÅŒ0\M+яêE¼òšCt¿ÿ{Þ÷^÷jHï…Ï{9Ü>¶è•—T૜öÂî½ôïzÐ\¶Ö‰iÓï—cr£€.ö»)oüÅòÁaz ÿƒ›©ZÍe†Á¦°¯U-l!ö‹t’Rb´ñjT1p“Ó‚=ð;5‚û –K¿Û0?š ôôK@xâ± jŠã²`²# “"+ž#+2gY2ï0 '{ž²ñŒ½y²Ô%d¶ñÌȋ@“X@‹»ŒpÀ„€À¤1ƒ¡”6›¯}Q3lz³/Š3ba©³å`¡$š;KÐ"º¢+ÀÒÁÝà!µ$³X ’1†0 É 3‰ ¸œÿÌÂZ4¾y"/‚´å´Þé¢GӢԉÃGÛ4ïè42JP; ò¯£‘½ð̲c lÐØhðµ 5 ùuQøŒòB³aÃG¼›YŠµðYŸE2[k•HÒµü"™^Ã5L 6ù¶ñѤò1ƒ[‹>!ø9¤7Ú4»Řø¦p‘ˆp‹ [ô tŠóa(ԉ‹PFw¹6Ò6‡úD:H6_<F¼Æ)Fô£0et slŠ‚FÿhŠYkÇwY¦;êņòƂкSD_rÁîòzl & 6©–K¤ö€gÌÅ}iôz$Èÿº*T«Ù3@ÈÛH‚䃳ºðF:X«X‚Çö¸‹!Šž ÈŠ$‹ÄH‘ÒH,„É’˜APŸÈxɛ´™Ê>¨É‰éÈzÌIXéIŸd¬ ¬Â¡¤aTʐ8ÊWIʨŒ ™dʁrJ«t<Ѓ¯Ë°˯Œ#˳ Ë:àʧÉʦüGk HË@ÀµÄ Ê£ËÚÁʶ䧭ÜG¼K‡³Ë¿¬˜¼ÔKyâK{Lk ÌÄ<Â,Lv:́c̺œÌ»ù)ªÂÌÌÔL¦rªÍôÌÏÜL x€+4Û«LYÌӔÄbÍÖtÍ¿z‚x‚פÍÚ¤Í0 MÕT¥ÔÔM«ì²ÿ8Mq,‰¹ìͦëM®,4hƒÊN’ðË¿4ÎãŒÊ.S0àœÌæ‰ç¼Ëè”Λ,4SÎëŒË˜ÐNºäÎî¬Hê¼1ëLLì Ó<ÎóDÏqüÎ ÏöÏù\DÞÔO‚Õtϐ NݔÏþÇÿ Îü|‰ò\Ë5ÐaDPæTP—`P®tÐ}ÄO`DLý¼P ÍB eÌ ø,NþÑ Ð MQ™@ÑÕAÅO%­˜3`CÓÑåÑõÑÒ Ò!%Ò"5Ò#EҽʥQ`*Êp\§Çd¸·QL…ƒ %»)¥ÒŒ³R ÅRèdÑFŒRuúÒÿ*eR˜Óí,S“0Q§©4m(;Í65Ï7u9/¥Óÿ²ÓÊÄÓÕS’°ÑìÓ=ûÓÉ T Ôì<ӍâÓCÍÈ0}ÐEµJ-åRñ“ÔKTÆ´Ô¨ÄÔGu­MõSJ5ÐOUJ-S+#UìêÔÄDUŸÔRpšÓV…LSíÏX½I--TzÃ(’³ÕWL]…ÉPÕ¦H͖œÈ ¨¨P1–ªÁgÍ›«AxŠÈø{±ˆï¸#e庍È9g̨5} b­HcÕ'dŎ¾pâimÀo„Wì™jÅÿ҈ éG¸Ø‹<ɋÍ0¶‰˜2Ö"WBrRQ]P„°‹xVõ Åa™1‘ÿððœ Áiù;´€lj“´‘ÓªØÐ:6=ó£™Fð:0< ;˜¾øˆíŸóYˆý[Œ/ X”¡à>q$mùŽ®È֎13}I‹µð ´€¯à LT œÀJVHÅ8ŸÊ •ÑÁZ›ÐZԃ  !êœóù[½ømSŒ'I«[„QÂ:3!ŠäøŠ¿m«©Ö¿„ÚzœU¦«Z~Ւ砎Îp‹ðàD3PŒðp SìÂ@9´pzBAÙÆla ÅYWû8\ÿÖ0]±‰ ÂèŽRÙÚÝ ® ‡Å6ïà½ÐÝ:£Â^ü:[SsZY:ØCéU)eØVي.i’P¥$_¤A ØK‚®(&ì×^ᓪi_Šðœ«¨ôX/ê(ßpÞ·p¤+1^¢0GÒé‹s!ŒI©‘:Ó6©øÛª!]¸mÚë]·ì%ÊcíÞl $ó1 )9ÅIßÐø7ˆ]ö%–îàáq‰x–ùõ‰_Y‘û= –þ½/ªŸp9\]œiß¡ˆÎæ‹_1ƈͽËÎGt¥£ÐU±½™œ©@˜å¸3Œ¥ÅXÏËí*Ãe!ŒˆÖÛ ÿ5ë ²á DjÎ¢™;©á཯&TŒæaÏYaùxËéØç ›š( ¢!µÛ`  &¾F'¦Z†u`võª±èHB\BœPœ=>ÞQ Bd`%q†øKÆ[º ¢¾P1®Þ®pŽïHGHöp‹¯ˆ”@Ü0~%dÑÕ¢´±&lœNé É%$¾%¦KDF©µ`#1≠ÚýéAZK®Ì ”ºÅÁÅYs|ÑŲo. F¢9p~ÅZgjæ$—| ‰x朙ŸòÉVs†_sçB6ddÅÏ]f?‹ØƒšhV[}c^K~~D^È'¶»ãˆÿ¨øVƒ&\ÕO…nCE¦Ð¥hôèùÄè,Ôè…â莾UC&‰ÖÁ‘þ¨’6éqBh®TéTæt¦|ž¦“+§FϙŽ@¶ic¢­QÖU¡žËå*èFiD¡à!Ù^4-&"’ŽÓPYL~öÅÿµWWŠi«ôédéíqé6êø ÏXY´0ř¢ýÄJÚ©€Ù⸖ƒ0 4‰;xŸ…HöjžîΰN¿±–Ó²"ØÛFã ÛÕ; Ìó!Hۈ0^”šðÁÀ‰(Èk£pŽ°¥$²˜\…ÈG[úê¨$lò3lV%&zñ¡îÐÝ%tXÇøÛСÀè«ç<‘žÿ&<Lj^SÔ>oléLmã«i‡&&ö¡¹ ß+iǾèŽ&l`ÂÁeµæä9©â>‘Š~Œo4íá>Îâ¾= Fî]Rn& Šž@–ñœèf´(\6\ŸìvBÞánÿðîÀnê NÐ'=À†^db%m‹+οl{’Óx^†ìA˜¢Iû¾øKp@_wïÞïÊ[mC-&Øhîœ`#TN^¯BÁ:ca~¢ÐjaÓX’ ø‚¾%åK.`“é”÷Ððþ§§Æ²Þ%R#މ]Œzçö‰·›09qé êæ©è–ÃÛq‡ƒ—¼÷Õbâ¶É˜Wâ#n:mÿ¥Ôòµ;î/¦Ÿ•ŒËq£ýþn,Ïr³Z}ic*sŸꊐ®äÊ6­ ½IÌÕk…A à–ˆ®P÷¬pì²M‹è2 Q±œiìĽyî‚ø œHàT! † *T½ÊR’+øWçø,Q ƒÐ”Ïþ[©@†·9‡øŽËôQ5+ùºŽ´R11êˆ ×ê®#CäcéˆüX3– :錛݋À¾`ƒPŽŠ]Ÿâ°91iÝ£AúwŠšXqxÿœvɜxŒé°£Èß'Ý4‘®â‹ÕUqù¥ØïcÙíö›1ŠØ!3ù’¯í#åû‹῕*ðvL|uњèžÝ@¥_«hÔìåƒÙ§ýÚ·ýÛ¿}ÿ3°ÜçýÞç<ˆ‰U2²^AØ8 µØž) ²ÒêÄMfA‹!†ô"ö•š·³%œ™¯˜^›9ˆíþ‚îhž'Kx÷@áQ«ÀƒÀ™1¹A[VA8oxØWÔì] Ž÷u©J‡«Ú#< –¡B0>]3úô „  ҁ…à1ú$™H‚1pô‚‚`’n ì)˜Eú4,ø‚+^¤ÓGâÄ$+…¬ì#0¦‡ž:;’ô ÁæÑ>ÜDqp(Ņ0 öÙHõ*Ö¬Z·öyÃØ°bǒ-kö,Ú´jײmëö-ZpçÒ­k÷.Ú0 >L“$%W¬fzÿ.Œõ#V=lõö€Š…Q xDŒ…A‡F›:•Hõ À'…`%ÕɕšŽT&OŽJcöqÚÇ €‰Kûà0ˆyçDšµ“>f ä©Plœz9óÑ·Î.ôõMÚJmî¾Õ+ÞðâǓ//V®ùôêדÕËΞ’LÍØ4C{ڃšazÛg}ÚåÇÝ|óyÀýõ¡ØZŒÅÿäFÚÁD!wøQeFþFUtDÑ!UNXáUtt¸w>‘H€%ƤÝQС¡%iØǎ92„bLÒÕHՅI´èŸ‡ÚˆƒE<ԑlÞIyxìYy%–t¡—%ÿ—].¶W_B´œ¦ñ$Ä`Í%¸R¾½ä”™UO1‘‰QHI|aÐF ªåà”Xµ$åƒE(¢‰*ªU›‚Rç) thÑ⢅Ué%§Z¹¥§¡zé^˜c–©Oìך+í¶Ç@E¡:˜t}\ájIIôQBú™ Šºa‘weF™)²É¦+Vú'N†¸ J*«Õ¦¢j»í\ rû­y¤Â!¦Rͨªlƒí»ì §jªfÐn¬0îÚT´Wüš×úû/À ,p¶à|pXÞ"¼ð\Ⓕ¼ê"V麖›]¼„Ùiom^Á¾g;0É%›|òÿ¿3¼r¨ ³ü2¿ï=ln¼í™ßJLrè*ÍûEj†U ™1æQT{kÈfŒ2ÓM;ý4A*Ã<õ•.S}5â~áAéXa¤BD¸`•Öu_#„Ó]ïaÅ-I—µ4Ԋڗ7ß#؝ÔX >žÕƒ¿,na«6mw{ýŒš”ê]HÑj†ènR’¨xVcY²(<™i búÝW†«NøêX#˜³N3>ÞÈfî]RÞáÁ¡·è]­Þ ºcV±{iÉZ›hE™ˆzëÑÛU¸ô¿Þ·V³‹U;D]wTÒS(dDÐ1I]E¢uXÑ¡ÂÑáѓ[SÕaÿC“WõPÚ̾Ãè}DCÑz²¿Ñ…/#tØÝSÆæº!$8ÑÒNPds&ð€8àÎÖþ÷¤=„lŒ‡*²Ä)ÜiHIj#®®z.4 õ^¸-q' gè÷ü'À4Dt!Aˆäx²’ˆàhˆÉWHlâ‘>|Á!ƒáTšÈÄtî1Wh"غÆ É ‹ƒ9HG4=¡&°BS™ ’!*!’ëˆäö”’rQ#HÂÇ22”É  |=‘'¢³4V%JäÒTêd¨H.ra4T]‘C¾•4‘;<̝8b]òP¨²´¦“ª¦¤DNZÁˆK`Ä&Âðî&OÿÚO%/’Ê–|0°ºHLœB.X D‰ÜÁÜŠ¢¦P!¡oz²'ÿQñŽ7)[InwÈÀ´°‘/Œ¡59õÈðÀ 8tÜVBÙ«^m*®TÊu<7,³ c²u5[¹S+ÂÁM:b›šàó:!§ñ˜²Ì:Æ—¼HŽ‰&É\&2)‘$./Ǜ˜®mAUDJáhÄ{,Ld6‰Íri›xÙ@_J ÎSúU]â4wûì'Dژâ&s7¼ñ&ÇÒ)@UES¦ÀK”êê3)ʎèFLYâ@2˜–ØT'‡Ú)¥ÃQÛ$%s.¥Í Fs&‚¨§Ô)ÿIe8Ò´^ɤwAé7¹R«(ÀNþ±Í£r‘ñY;C¡ GM)*NF?š݄„遌˜2I ;̦ÈíQìAz%E¥ Ö6ûü¡Rd³I¢”¤—4 žsDK-Ùôf¢¬ZÙZ½µÊv=nµ \U˜Ö(d©ÕiÈ&±£šË\„9»‹ 9/ÃbíÎD )M×nçšØäcÉéÚt3éÛ©„dLD¥Sd"­¼F ¡¶¢ŒcE²&õä9eÂßG R«‘”†#Ö-SFÚÉTØÖV­ý ÕmëbørEELA’Å~”£#¡H”CšP ]ä\b•( 6Jð†^t":˜ˆCJ҆æÿ“šùˆ6>ºM ´9Š°irEʐŽŽt $—¬tÍ¢pwxòÀÀ”î h®r–½$=йÎv¾3žñ „<ó¹Ït–Cœÿ&òä6KA&3¢Í·jÚp«;ÿ\<]Ž8×3¯yè}=aïÉBÄ4éR þ\UèÅ-ƒV«'h7SRw+i:·wàmi  ~Ù5x:áÇRo}Ó| Æ.Xêýøދìê'M©¡­½ùégÞ띟ËçeɪÑûN­¢©}@1Ñ>8CHÜ?ãØÙ³'é—&ü°‹],¡þ¢®·ï|±°›Øë6⩛à-»-›¹Qô…µYIÖQŸ*šõ]ß[dßňq\¹ÀK´žö‰Éž”„ù¬ÊëM„øØ °ßzМ²…âéß¹Õ€A [½Á 4›¦‚Ü ¯ñœ¯aÝò!ÿ fš†Å–ÁŲG> bOJ`[ÔÁ_ÄÎĀrQ„¤`ÆDh!H¤„ÑÈIì¬s¸ACÅ— ðý¿Qº½€¹Õ ºUݹ ›Šš¢›¾a XðE]Óâ¼1¡óÝŀaÞ6"¬U¡®…·ç  ®‡Š" \ ÂÁ@ρÅîàÁuâ'–b±AŸ+0\Ã%ààD¡#æ"Ê@b$¦Å$r…PÓ\â ùZ,AºE¾Ååe D£4N#5V£5^#6f£6n#7v£7~#8†£8rãôbyü¢¢£ É ¦Õ¶Å2ºÿÅš#yÐ#>ÖEì#?ö£?þã?‚@$Aî£9Æc[Ìc>â €,$Dz –Eäö$"nÙ"EÚÅ3@d¤G®ÇDz$B²Å"~¤]4d4>¤I®dx„dzlb§d"YÀäxŒ$KZÉFFcGÞ$Ov‹¶Øž°½À;^ ¨%´e â!¨ÍᲙªU7ySOºJJ£JN%V¦…KŽG½Þb–xÁÏ}bÑ Ý±}å¯ÕÛ1Aѹ[ÔET>_V®ENJãNÎ%^ŽÅVŠ‡¯ Ε"¼É¦É[<´=Û»ÅÛ¼éݦXԛÿa;ÂA_2] ðœò½Û FÿÞÑ+"b\¾FæåÝ(ižæyˆ Í¥)†…ϝYjÃٜº½¦¦Åfà……Íýœ`j&k²bfÛfžšXÖÐ}fÖXd]($jÂÁôÀs¢æ^ŠGQ"²ùžºÕ›ºõ`à՛h'w ÞwŽ…dêáûÑ[Ñagòýœ¯¢žd¢A," y”ätî'ÂAuŽ%èr’þ……©Þí힁® YŒâï![Xh[ rÎà¼å\oj´æhö'yD'ˆÎåÞ¬gñýÙóif°‰šŠÚßý9¨XØ^)ޝΡè §XDP©Å_E†æIJÿåˆfiéT–h©›þž»YZ Î`‹îÛ ”¢”Ê ÒhX°[ è Ï!›âÁ“¶Û’E΁Ãa—.'‘6ç‡Ng$©’ò$“ÖêáàõaV©y†ŸÒ¡Ÿº¦ž¾_žê¡„òhXh(ÐišrÚ¤Z8'jÎiöäÚE€œXx"(òàXx*o~bXÄ`*’Å(ߧ.¦‚E(šêÛÐ"~ªZœ>§ˆVêM^j/BjZè'®þªGêj$ò*°šÅ­k°>§^@À86«³>+´F«´N+µV«µ^+¶f«¶n+·v«·Bëx€Ð¹–«¹ž+º¦+Œkº¶«»¾ÿ+¼Æ«¼Î+½Ö«½ºk,À½î+¿ö«¿þ+À¬À,ÁÆ+,Â&¬ÂÂk¾Š+Á®ëÂF¬ÄN¬¹æ+Å^,Æf¬Æn,Á,Ç~,È6,» ,ìɞl¹º ,˶¬Ë¾,½z,ÌÎ,ÀŠ,ÁvЬÎî,Ïö¬Ïþl¹Ê,Ðí¹Ú,Ñíƪ,Ò.-Ó­Ð6­Ï­ÀÊ@@­ÕҁÅ^­Ön-È>-׬ÔlÉ~-Ñf-ٞ-ڬצíɆ-ÀŽ-Ûò¬ÙÆ-ÝÖ­¼®­Ýj¬Ûþ+ÜæíË*­ß®àâ­àNìÞú+ήâ..ãr,á’kTmãìáN.Ô®åfÿ.Ôî8@4:À l€.¹È«¤nê’À鬐@ÄV.¿R­æ~ìÜÖ.î-ÞZdÀçŽ¬ÀºÁŒë€äÂkêîÀ@ï¬d@ì.€Ãlßæ®áê+önoÏâíñҍˆd€$È°ø–. Ì»ZÁä,ñŽ«ì@°@¼¯8¯úÆo¹ê¯¹Fo¹²€¯”/ø2ïþ†.XÁ ÌÀøҁÿ’/ ì}$ðˆÀ˜«DpÎÒÁ° ´.¹Êî¾^/÷*ìힰ ³,ޚçf@—«¤nìҁóf€çÚÈñVm@èÖpê ÿÁ˯ç‚î À¸º0 œëÓÁÃî G¯ ÓA/ñëÒÁ#°ÿN±;Àéoè0̹Öp“«êŠqÅR¯ð¾m¯0Âb.ßq׺kÔp4J/°€TíñŠÁ7ñýÒMC1ÓA #p{0ò&ˆ4±(±û±"K/ 2ˆ ÃîñŽkê’+ 8Ko)W-ï‚24±›òÓ ïÒMð¢+ ßkââ±.ï2×>.Xp 7±—1/—k"?r Kî#'2#›²£ëÿ°ôs#ã°¸Á(¿r{nÕúï6¿2$#0w³ô†óW//ïÿ¬·3<+,Þò»p5ƒ.óo%;2¹&ó"/3ä.²3o1ð¢ñ%ïï?ã3óŽë'±+tû:p:›2›²1“r'ï ä3-StÑÂ1ÁÒnr»Âú,¤Ë8{†vŸ6ª;ù Gò[A'p°÷³l§¯S{ôGôûHð{r³—ëDpëï^Û0ø^ð Lv“"Ÿo²lñFAO0û’€ƒ5;ÿ,‡Ozaä:ɜú®ã®ª£k"«®S±TÓ0Ӈ««ñ6 q¾ ±f÷nêŽ+5›q1ìæ°çÒ2Ãî<LvôR±ôòn77õG¯»Ã󭻚¼Ï»æÖû¹Þ{6¿2}lsêVí>?³0aÓM ÛH Ã4ò21‡eq!ï¼ôÂúØÈ'6eW2Ýh3E¼E°ÜvÇ[7¿¶9÷ÞA|T½Õ_=Öc=AÖw½×ÇÇȓ¼åš¼¹Þ»+}gKò=Cr«1Ì3²¯#ïGïúÿº̀ÿü"S¶Op9S6Ì»0“îÓ?,ԓü;‹½Œ“=2Gò£ýWÓ4ìFÿ³FsôÛtGq>‡®Ýó}èÚóØ3Ñû¯ó¶îé ¾«»Á”²Ì¯sâãrq3>í3¾ã÷3äŸ=E»úÃë4Íoµ^çwÿ{Üs¸Ad@¾"Ï@VŸqÌó½óSö7ñMŸ½[¾Œ+]óSwí+ìâ‡jß>$Úó~á_¶«o6ûï~ñkqûpßGþó¾0 ³ñýû±ûò)§1@8 c&ƒƒÌÐQ¨°ÌVF”8‘âB]*fÔ¸‘cGA† ÙPdI“'Q¦T¹’eK—¤tƒ‘N1 »ÐCÓ ›#î\(FP:BÒœ¹Ð̑#»¸ÁysÿàšN“*4cµ&Õ£E¡REZs‡Ñˆ ºä`öe[·oA’„;—n]»wñÂÄk0oߍhÙ¦\ë—páŽr 'V¼˜±Ë˜wIhì°ÚÀ“1Ãu$sgϟ?=:®ÃË'£’V½šuk×yE¿~]Yví»›mçÖ=:öîÑ´Y^ô­ñpãÇa# |å`宋?—>]eoꊙ«t~ý÷îßÁw´¾ovÁ§É+Ɲž}ø7ãÛ×52u|û÷ñÛµr!ÿÝùýs[Àk³‚çúÏ$á,Ï»!TÍÀÛR°¤í(¤+º 9\lÂW²P$ A¬ðÁQ$ìÃM1$Y\ÿIÀiœkÅ?r¤úpìÑGÏnüQ#…ÄkÆ"‘ )È$%"Ò#™,-Ê);Z’J';‚‘ÊŒ6ÜÒK:¬œKŽ´ü²ÉÍü2Ì(ÇܨÌ4:Î)×d²MxœSÏ=ëLòÎ=C’Ð"ûDòϊ ”Ž.õ±Ð"¥èM8mÇG…Œt¢IÓ¬ÔR1ýQS‰85SÐOk ÕÇQ¡’ ÕW…TµGVa“³Z{”GZJtPOqíP×y¥£Ô/ 6Ãai,öX/“U6Bfct=•€@Ûm¹íÖÛoÁ WÜqÉ-×ÜsÑMWÝuÙw€+<ëâ†yé­×Þ{ñÍWß}ùíÿ×_|UXà߁ .Ø`ƒo}«Ø<_b¡‰> ŽXâ‰)®Øâ‹1ÎXã9îØãAYäŠ] Â3bðAå•YnÙå—aŽYæ™i®Ùæ›qÎYç_.  ¸Š¥Ëᑉ.Ú裑NZé‘K>ù‹¥¡ŽZê©©¶xŸ6Í%_]ºê¯Á[쨛§ÇN[íµ¡¾h­[z¶$¯Ù®Û.;³³ñîÛo¿ÝÎ:­¸¯M‰î¿O\q‰õƌïÅ!\éÀݲ®Ã%Ï\ó¯ŸìñÍAýbÊMœ%†»~XôÕYgÚd³Ñn]vÍI)è¹0Ÿ]÷Ý!î¼±Ïy¾ïÚ]*–ë–rÿ^yÐ}g øå¡›ø–,+yˆ“𠉳wãb:b€®…ÝØ£¶¯Øóû@þˆQˆák<ÈßFfb7ì·1xdïËXóó<‰¹Á ÿk ÆÜ !°€"KŸÅö@@3PbfP_Õ.²Šmz,©ž[®×!ÀóF81:@ ދÊ÷1谁IˆÝÄÌ°Ã>@±ûÂø¾(˜Á _ðÀü>æC ¶pc0¡/†@Å(0b@$&>Œ¡€†á  ÇÌ@EŽíŠ(‚Å„ÐB3‹}ˆÞX5ädV$!Ö*7–ÈM$)Œ#ÿè1:䯁1ô^ ΨÂóeÐ h£C~؇/|aXtCF˜>7DAƒJìCéð…$”b¨_Äb€5šAŠeه Òa•»dì(ù4?ö!ˆ¤C5…\Æ°¨\b#FK z^ClfqyÊlž›Ë¬#É^··LºÐ•sà /5vŒhTãƊ™±8“Ž”§¶G‘ l% ‘ W‚:ä©®bqDAû’ ËB€€8°Æ©Bñµð†õ@.Ÿ(K!ªSòƒ˜þp7ƀ…ç|ã €ƒ¾1žJÄ"D©øĎ ñ…()…0>Y°¢êLdN‘8ÿÌ#Òs|_b,MévF¡…ú<ª:cêÆýµR§ÖìCþê'Ò¬&²¦7%æ7)¦ÅÄpñ£á‹rڇ+œÊd¨Ä®ÐÃà/ƒdô@ìdyP*¾¯¨CS=@/žÏë«©÷æyTþµ­;$ùüG}ö! t%ùzWˆÅò‰W}ceCŠ:„6‘• ß[ïùS%·»A)G¦~ôœ Œe+…©ZÇBàƒuìù ±ž’·~Ý^gíHE+ê39œmKƒø´/ šLíUá7Ԝª¯“Þó­$%Ú[´J0¥ôDÛd‡øÔ³WmŸ:) ¿î‘Ë…rõ‰Ü¡ÿÆ3‹át\D?*ۏΰ3Ì%Cù;±&ŒØÞ½'K…䯕~ëø¤¢=;.w¤œ« åˆC!F!Lni…8¾ ¿qÁ”M±…½÷Â+”OŸ-ßö ©Bl/ )Ö-ÕX›ãÑ…°Up ¹È«6p¨Cµjl©D !¤ím¥D§ìÑÉBÓª“¥d¿šÚàÆ`‰³Bø8Ù!FPÚ“²«<ÏVꏽan%­ˆÈ!øÉД)y·7Ló¹½jF0X'&VÐճI8ß9÷¿7:ÑÎP®UúäÙÎb™þ®‰ã©O Î6±;|+ ¾`â=x·£´œ¯úN÷!ÿÓS峜qÝBXk–Ÿ«dé ÷¢`ŸÄ-î ÈÛ,A‹—SÍ5¦b®AÜÅ7ÎÈ¿¶@µ3l“;¹]²c×KX¯ï|r60Ä®€ã’{ÃÂÓ¶¬Üu?Y–v^np¡)ï4/]ä/•J½“óëñ¥í$°&ówÞd·3{ëÿc«ú=õ€'›ë•¶˜¢ Ãèürú¥Nⳉ.vXø¯V#áËҍ»÷Ò1/æ£À?C2‘g÷£vÛ…Áº½0ù®üã©%'l χÓ¢Û…{œ)b1}ׂq†O'cYÛýÖ¨·2N¤{îw]Ê‘˜Åát“*Rßë8fø0­eoJ­SŒ¿³wâb‡ˆE}¢4 €-°H/õË}²ùU¾SÍ8ÿzÀí½!ü°˜W§7 Ä7ºÙ¨ô͞ÿθâÕGŸpȯ>ÎêÞÊÄl­Ê†ÈÃX̊Ši†(ÿªÍåëåtÍMîÞÆtÊUŠìbT {Ð& ÿ>èªÏŽæª}4IQ°¹"f´š ¨–ö }RM•žf´jÞÈ‹»òè…˦¾à  îÛþªՋIÌWÐéJ0b€0b¾’oÆ"¦–®ۇ:Š„ ǐ²Fð ¯J Û© ûËà,ƍœíÊl‰øæo¢r¨£"æ†^èŒðgàGihìFî…ÌC*âì|â©êTè¤Æ'°ò¬á'§òǔ6l#‹~Xl9Q¢*±hnôl®xpn4RHc.zÔ¬£Ç…ð‰cðŽ0McÎîréb8H‘ÜǂDFµ¬èç)O©h‚ÑnHï$†ìµD†ŒN0zÿàPbð°3ñcbÑ/fcâ裧׆NiºqmŽ±EJ%)$Ncè@¥q•¦ûâ/ƦØ1'&£Æq©gO¢Aâç1 ÅÆóò 9&KÂôÆÈò!Á† ñ !²"'F!Eba<ðôÒ"=²×ïwÚï#I²0r$øÑ3²$YC2"¦0iVÍMF²%+ò$KƒUâxXb%mò' .#VÍ£2&&1f&5‚"rq2GRòBtnn:r)©2(+Âi0cÚ­c2#”²*[±)=‚!S,Íòî^r!´@~žÙdðéh Õ4I‚Ôg‰„@™ÿ.!"Âd "â+ÏRyÄò0žrD¢²¦20©R¬î@¥öà ÌÎÇÍdö Üh©©Ü(¡>ª+é@ úR!S1yg09baʀ^8à X3_Ó5ç¥5c“^(€M,M ö¥ @íÒ¸lö`+•m³˜ªlº<4µE4Ó 4ssvPó/ S$dóhs6aS;¯3;±s;o€† :Ï2xS_|“ÅžH¸¬ƒfÎéâèP­÷²E\@j’<…g:‡¤:'Ã'õ³"ÅÊgN}œÒÔêݒ-‡P­85 ¾–“[H   3@E‡?¹Ä?@-!Ñêöÿ )ŽÈÁŽè̚j„Ê+B`BI3?;T:õф4”184Fr@…³ƒ‰GsÉ ¼g ˆƒ<À{–ÓE¢Bq4s0´"\ËzsI!r@‘æ $b51B5X9æ­°ŠFæÐþÇZ¿d0Ö6fÖ¶µñ<†\©FWçb3 dj1öçC†ÀޕְbÒc4+Û6æ̌¦†ŠïcRQc:u!Ü´!‘•˜N©d֜͜„è“të}²’˜¶Ia¿ G)v˜ß¨V ¬—’ËŽ~h”(H8Iaƒ™6éÀ¨±$¦™ð.i„nȶ„€—8ˆ–äu”h-$6oÒr‹ìÔc(-c4«h(íhá)_5&'F©Š†éT(’úÕj7¦`bZ ã}«ŒžÈ¦ðkà‹²(jðgbP€…p)°r Õ ™ ïÌô¬íÿžñߒЦ Âð'¤ÞkPD ‘jJ“R*¤rI~$3iÿ ’ÂVþ° ¾P*KoƒÔm-Qqñçi˜ª£Þ $Ýð  ®€Ã-s mÚÕ®ä6~Xèi$‹¨kh|r(Óڕ~F·ËK’$ ³ðµÖ§è|ÖÖÔ'v󐑰•~JW‰N·:µjw2év~”×Õ𧠋ï²6ZKk Ãk¿ªPªø®}¤¶Ù +~8è장ÌK†Tõ£pöÉþ­•ò¨8«Ó6Ki*»t þT÷7L^ƒÈ|­h¶Žèƒø·}Ì~% éDîõ¬}…wiÔ.­˜Üÿb€—±í>Ø~†ËãÇÂäõfÝN—4¬„É·œLj¥6šv¨„Bˆ¶w}8nùÕÀ°èŠ’„Sj³g¾ ‡{Ì~H؇[è1³Ò•8ɊrLÉíiÐlˆÚòs+FkE| #…Š)ý•Ö쇿ò‹siH^]­…¨öÊ¢ñà ÒL˜ÈŽÞ¼‹€ü¯ÄÈk¡È_áð†² ãІàÈ8€ÆÌõ®Íªø‹¡ÞxϾ+žn(„…6t)¦íN¸íbN“­êÔ(9ñÐï6 ¬Šµ¥ò˜{ŒO‘R¬šM[I!°Õù‡Üî¡Ð¦3Ùãû.xë †DÙض-Ŷí{7ð0A51ÿñ°Î4 …åM˜r |NèÖÕv¨Î$F–Þí„ɐÏG“™îó Ûz¸‹­Â°ß"md%†™ÕŒöÛ`{ö*øÔh¨°hÖ¤¹‘fƒß‚Ñš­]›m‚zÍÞ،Z•ÅΨír7bNn8¢'& ëhµO˜$N|RI– §2š†ø‹Ê&F ó?ZÏôŒiEn¡‘LƒöŠŒ´±‹ÁÁØ/Rˆ½ü[OŠök‡ ‹͹Òr¬yǏÇX[Ùk 7Š,ïùG½þÍ»~ K]µÞîvìt:Æpð|ŽV©Åm³*qGª}€Zƒ‡v¬ÚO³’ö».½ÜX}I[­häÿvY\'滂k©£êÚÉ_9‘Š«ÀЙ—ïL…°¯‘2o¯[­“?h 쬌ÇXvù'þÎؚ½Ub¼ø`ËÒb`è쨖jÇÜL ßz,®VqÍ,ü¾µUc‰ð ›¯ËnË«;MÙr*‘šÀ‚ˆöLÔÖäÇùøɳ#VˆPê n¨|rÊßÖg±öHµã‡º²¸´Ó(¦ÆŸÝ‚ÑRìÀòwù,Ór,.… ¥)†–¿êp÷^#­Þ4 ²ij{$0i«kÄF̍õì†Øø—·[Ã$P“k5¿ÿî«L}/;b2»¦ût©}ˆ°Á¿Ñ&\Õ ‰•|°Îœb ÿ·'\Ëk ½Gdp Ý胶éÁ‘Í–:<›cX|Æ:–(ˆ_e€2œj+‘ÎÂsõ¬ À )ž¸¬Èi?êiÎI8ˆi¡ª8ÛSb—£Ä•q¶‘½§Î¢1ˆ^(êÍ_gˆŠ¢œ€Â︚||DŠ‚Š€ê,ÊHÃÇ{P «²v¦ÅqR?£R­‹7r¬»-Ùؗ½bb=i–eˆhý{½¼;&Áù\%ûTž°6ÐgÐ_BP¯ÚÓ}í˜[ÃÏI=t@]-Šö’=՗ӑ™Z7ÖggÕã¦Õmõ|!â%~â)þáï=SS†g4~ã9¾ã=þãAf|&Ü¥¥äë &åU~åY¾å]þå&A–Ýäi¾æÙC³m>çu>7p~ç}þçI£ç~艞1„¾è‘>éñâ蕾éþæþé¥~ê~æ©þê±^O/>ë¹¾ëÃ7ê½>ìŞ¦Á~ìÍþ쩳ìÑ~íÙþ‹Õ¾íá^ì1™>îé¾äç¾îñ¾Vî>ïùÞRÂ*>ðð ¿ð ÿð?ññ¿ñßð= ;PKK•8QWLWPKÛ°-AOEBPS/img/sp_gen.gifb#ÜGIF89a¯÷æææÿÐÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèMÿUÿl"ÿ‚Dÿ™fÿ°ˆÿƪÿÝÌ3"J1`@wOŽ^¤n»}Ҍè›ÿªÿµ"ÿÁDÿÌfÿ׈ÿãªÿîÌ33GG\\pp……™™­­ÂÂÖÖëëÿÿÿÿ)ÿÿRÿÿzÿÿ£ÿÿÌ"31J@`Ow^Žn¤}»ŒÒ›èªÿµÿ"ÁÿDÌÿf×ÿˆãÿªîÿÌ3M"f+€3™<³DÌMæUÿhÿ|ÿ:ÿW£ÿu¶ÿ’Êÿ¯ÝÿÌ3PmŠ¨Åâÿÿ3ÿ3MÿMfÿf€ÿ€™ÿ™³ÿ³ÌÿÌ3Mf"€+™3³<ÌDæMÿUÿh:ÿ|Wÿuÿ£’ÿ¶¯ÿÊÌÿÝ3"J1`@wOŽ^¤n»}Ҍè›ÿª"ÿµDÿÁfÿ̈ÿתÿãÌÿî33MMff€€™™³³ÌÌææÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿÿ3(P7mEŠT¨bÅqâ€ÿŒÿ3™ÿM¦ÿf³ÿ€¿ÿ™Ìÿ³ÙÿÌæÿ3Uw™»Ýÿÿ--ÿDDÿ[[ÿqqÿˆˆÿŸŸÿµµÿÌÌÿ3&M3f@€M™Y³fÌsæ€ÿŽÿ:ÿ«WÿºuÿȒÿׯÿæÌÿ33MMff€€™™³³ÌÌææÿÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿ3M&f3€@™M³YÌfæsÿ€ÿŽÿ:ÿW«ÿuºÿ’Èÿ¯×ÿÌæ!ù,¯þ H° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cʜ)3€Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X  «×¯`ÊK¶¬Ù³hÓª]˶­Û·pãʝKW,׺xóêÝË·¯ß¿€ÛÝ*¸°áÈ+^<ö.ãǐ#KžLÙl•3kÞ̹óWǞC‹Múñe K«^ͺµ×Ô®c˞ÍútØ´sëÞÝ7ïßÀƒ÷Æ,¼¸ñ㟑+_Î|0êæУ¯ö-½ºõéįkß¾˜:÷ïàMþgG®S®Í¼9»žÇ›z=zœê½ƒ•¯›~øøŽoâׯ—ç^ûg¹÷|hYt¶X_~ &W`ƒ–1ø {íAà]ëX–†ÀY¸b(!_ÒU"[f(¢Z' —`sîµØ˜‡ÚE£]‚¥Øà¥ñX|Æè#Y2Â5d|aé¸Ö‘ª½ÈœHN8¡Šç©¢”ûÙ¨e–\8`’ Z¥—¯é'fˆa®h“0šÉ”\ÆY%upNɕ€d– æ˜wΩç€~béelŽæärpŠé&Ÿø]©(lf¨'•jþùe“J8⥏"ie‘³Šè˜Rš(†.º¥ }öÉè|þªé¦«X¦*늟Šڡʕ÷j§R{¦¥—f "ˆ°îYf®€Æú+®xꚙ´ÇUYj¥ÀvYi²™>e±ÍÚú*§·z-ŒãU‹m¹Á²ûhžµZ(¡Jrk§¹Ýrûî›üV{ZÖÒzê o î¼·Â[â¹í~+n»ô\mºkŽ(¬»oˆ[¶W6 ®·÷6¬/»`ÒZµ;º®Ã / Âã®nËΊì²É½R|²Å­Òìs¼ßÂ2¡#ƒÜ±ÈäzËìšÿ^¨rÐÛì›Ç ]ïÅF?Üé҈êìâËЎkõº'¦Ç*¿”*{¦ÙG£YóÚUÊ;«Ç'™x 4‰ËU× ¯Ô?_Mvš,Oü\Ós+;-yˆ·Öw[t×¹f¼6¾ ½”ªåӁí–æÝM>­×œ»æf¢G–zéæ! ú|ž­ž9é¬×Þ´ì¶çÞõáº÷~»ïÀ_ íÂϸñÈs^yòÌ3Ýüóà-ýô¹áNýõ³óŽýö¦sï=yÄ/~æã—ÏÛeþ(@@Aƒ&T¸aC‡!F”8‘bE‹1fÔ¸‘£B‚A†9’dI“'Q¦ô(p J—/aƔ9“æ5qæÔ¹“gO‡XÞô9”hQ£G Eº”iS§5 Tú”jU«W“bÕº•+ר-»†;VåT²gѦ5ùÕ¬Z·o߶…;—n]ƒlíæՋUî^¿¯â<˜ðξ…'Ö)XqcÇ#?–aù W’ZJhq•Æ´h}¦6g†N6y^B#þvV)M³žjë¨_Š:£Yö¹Ö•j±j¢—橪®:½•à…GBÊß°µîª&a¸,§½Úø©d‚šW²dÞæeu‡Êùµ„¹Ôæ_ÐzËj±Ì. _£èæ÷ª¯€kc ºÛï±Ä¦kb¢ãŠ+㯑vk,­®RîšÅ:ª§Îª0¢ÆÊjç‚ž¹ñ¿«‹wí.LܤGü±Æ3†/dË/˳œq´³Zp¸¸9{dɤڌh©«Ìi§VÌ-ȹ½Ä+K[´·)¦;1¬Ã]œ£¬«rèµ¼R ÙòÁ/ˬ/Zžj`Èߘã¹&~%–Šže)±ptRYaÃþ…zSßx3˜-ÚÛáÚ×9ª%þî´˜ó½IfM"âÛ%¥¦k;y‰¦MvÙh×XúѨ§®ºÈ±­îúë©ÞWá°Vû픭‹û°»÷~6é­#½¯ïÄo”ÏÆ'¿»ìAÑ®¼½Ï+ Ú݂G_;ó/Ç<¼õܯnw÷àÇÞ'ö•[O}øǏýùè/ üö̳ß>úßÏoÝã;ÿþ”‡Æÿÿ|y¤âÀ²NwL éœ£?pzŒ ð¨¾ß!L‚DùG¾‘5pƒ÷ƒ  ØÁñ-ð‚#Ü_ýRÈÁü)…*D ÛWB,0x3œß sHCŒ‡öþ!éGA„pˆDD!ÍçÃõ,1|B|"‹¸®#JqŠ8¼¢òjè–jÑwQü¢ñ¸è§n‡$hL£×ÈÆ6ºñpŒ£Eҗ9ÚñŽxÌ£ïØÄÙìñ€ ¤ ÝxÆAòˆä#+8ÁE:r=Œ¤$'éAJZr6—Ìd%5ÉÉNÂ̓ ,CéœQ’ò”4%*“¶ÊEF¤•°Ì¤*cYDíѲl¹¥.™Ë]Rq–¾tË+ƒIL|õ²˜œ´%2avÌe:“™Àtf4wy‘gZ3Xüæ$•©Í 4³›àf6ÃùIrÚ¨šæÔ&:әJ3’“$ìTç:ãI8zŽŒŽöDL&>ó‰Kw†žüÔç>ڜ€¢‘ ¾(BmhAzNs¡’|¨>!ŠS¢öä¦C-JLŒv”¢å¨HA©Ñx†t¤¤;)5AŠÒ–þ³þ)P €€‚"L¨p!Æ.$q"Ŋ/bÌxQ¢ÆŽ? àr$I…"K¢L©’äɕ._& p ̚[ÚÌ©S%Ν>öü™3¨Ð¢F")S Ѥ%›:êªÔ”T«z¼ŠuëS®\—ÒôŠR«Ø²ɚݘ¶ëÚ¶ Ѻµ:n܃të⠙Wéތwû,—©à‰ ‹=Xq]ƈ¥:~Ül䴕%'½Ü³C͜?#¦ :æhÀžÝžN\:oj΢Wl û¥l³µ±ÞžÍVwÇ×°sófhpàÏ õ½Ú8ò³Íõòfþ¼¢ô¾ÊKWŸ~óyv£Ýµƒ;þW÷÷ð Ë#E?Õ<{Ôãg«oo0~QúCågÆñýoýù›ÛgS€þùwÝhš‡ N ºÄ wÅßrz÷`tb蝄Øeø“ƒ5}hU‡#.¸á$.h!y(‚Ø¡ … Šð±X#O&Âh#L16XœŽ+ñèԋŸ9\‘"^ø£’½áHä’<ÍØߓ}!€€AUZYP• m‰P—}9Y“®M9V”–ù–O_bye– …©å›Źa4¦É—ŒIæYW—m PçAu :XXq͔¨¢‹2Ú(£}’¶'^ŽRZ)¥Î÷Ӗ›ZÉ& vú¦ XÎÉ©œnÖ9dY–²ÚjR¹Ø«¬—övf[³â:ST¹ò*k­k† ª°Ãþi갃fY,¨É2{ª]cŠÕ묰J[-­ÎIZ—µ®îº­·‰ú¬±ÊÛ¬—æ’K®IÐzÅ*X®¾«k·ß~›•­kµ¯»‹ÎKﶿîd긤¢k.²Î¦kpLìrµ¯¬ú¾Ú¯¿Õڛ-¢Ǫ¯Ä÷Š×§ω°Â"“\îy oÅTKQ¶2Ë+« ³ÊÅ,¬7Š3®:ˋ-rG4—Ì-]´ÌÉô²LÝò¬hÓW pÀžŠZp°ÇºI2  GþP4xaB… 6t8P DˆR”81"E‹4f,àdH‘"–4iÒâI•+K¦d9r!A˜3iÖ´YPæM;+zÄ(1eǞ…ÜyÔ K–.•6í©TgN¤#T5XÁA¬Y ZµÚu+W[µfýúu,քA§¶ 9#GŸ@ãµ[1¥[žë݈÷o_À€5ʅËôcT½‹”Ú¸1á >ëޝ W ä™Cþ{دaНGÇ5©uj†hE²UíöbKÊ(=^~úúma ˜1N–¸vð‹Lw>Æ}œ¡qä7ŸÒ~ÊÔ÷\ˆËúÝm˜om¡–…ÛNlS9uþÕbY‡t-Þæpλ×ÿüíñheùóég¿¼2û¦£ãUYÀÊÐ'™SϽæ¸Ãì¼øàèÁ ’iÂ!\8Îòûl¿÷Ú-¢)”PÄ E49²fjÅ·JÓn0=4í»›Â£)ÁŸzs.ùŠj.Ä…éÆ!Ê;_|n;¹*R$ ?Ôñ¹öŒ K#µœŠÅ-r Ì0koªuÛQJônL/½„ÒM1å| Å4Ï´ÏLõúóÎÍ>iêÒO’æ´$‘ÊóÎ9TTI ôMH$”Ò휈Ã$õÓÓƒ”Ôµ2 µ J+-®L¥3•PR‡„ÓþKV}ò(§V•ULÃJQE°Ôòõ×´@ÔO\å4´VU5ÕU!aÝrÙ0-mêÖh¡B­ò4˖+nÁºª[±’µÙ?©{$kÕm³ÜsÛ­ ]½â­nÝhÔö5|õ%/ÜaÉ}·5w­wY€œ`„¹L–`\ïݗÛ^Ï ¶W_ ܌…MK[b ^KàE~udóJ>ù¦Š'þvcaWn¡Š9×[—û=Èã“F垑۹\ QõE‰oööå—’Ùh£9Žé_¢ \Nh©­øjDzÞúâ‰UD:ܯÅ]ZÛ_÷VԊ¶®šL®Ý¦•k¶Û~{9¥5¶™å²@:þ滟Æ9j©å6—îÂáu{p ߖ_–í¦øè±óVÚîŒ+ϹäÄaÒ|qŸ9÷óóÎ[Üܚ-.½q²1&½oÇ1Æ)p¢CVôÚš=Ґmß}ÅØ=ם÷ÝqßrøàÒ÷ž‹éxޗ'øæ¥w,y”Ÿyzѯoq{„ºÏ¾Ý ŸüòÍ?ýôÕ_ŸýöÝþø域þúí¿ÿüõߟý3€à X@ T °@> „à)XA ^ƒÔ %¸A~ „`EXBž…)Ì`PTØÂ’Ð…„a iXCÆp†7¬auØCþˆ da]ÈC‘ˆIT⠑¸D6щQ”âM8D*~ŠU¼â¹¨Á,vс_,¡ÁXF3&Њg¤ ±¨F7¾‘o `åXG;ž0wD ½¨G?F‘pìa ÿXHæѐ$ä™HG2ò‘!Œä$)¹@D>²‘Ìd%9YÀM‚ñ“%/éÈP¾p”©ì£(O‰JU¾…þH4xaB… 6tøp!Aˆ)J¤xcF9vôøñ E#I*YeJ•+Y¶tRàÀ—3!ž¤i“fN;gâä™ÓçË ?‰5Z2@Ì¡GQ.]é”iT©<¡NýX5%V«[¹îL*Pk׊?Ê5{¶&Ú¦jÙ¶u;ñ«Ì·˂¬;ïÔ»yìõè—o`±q»-¬ñ°`Å.·m¼rd¸J%;|<¶r棗Ñr†«ôY¡z~hštêÒª¢¶Ì¶ÑÑ°]3¬;ôm«ºq÷f:›5ïÖ¾‰wõxÈâ˟R¦M–yôϸ“K·ŽÔypè×¹§N´z÷þÈÀU‡?3fzõëÙ·wÿ~ü÷B{Ÿ?/^1ùÔæCË÷ÿÀçc¬>ü 4K?ÛXÁ|Â%œÂ -¼à !ÜJÀ=ü=ú.ҐÄM<Å<¶ì,ÆeœÄûú0.“Êñ=Á ‘Ài’È"‡´‘Å›\lÈG#|ÊõLG"›ì‘½&E¬(Ê.½„rÊ$[Ò¶/Íõ´Óͤ¶,ͦ+Ñ<ÑöÔ³9°&KÒH¥ä0NÂÚdÏ9TŠSK-ÝsÏ3½TÓ³RpA˜$]5ÒE͊þ̈XQW 5Ï@5 UJõ<åÔO7 ÕO:o êÁ‚ ¥•Ù"m}•$SMj–Ú(U¼ÖAR}íØa½ÕöS<µív×RïÄÝjÕ5òYhíŠuÚuåÑÖq1•“WaÁåvSqG¶Ø€å´5•aÛu÷/xKKâë5N7óÕÓ׊ ·ß]ñuG ‰AU#>Y¾…¦ËáÖükÒДYÀ:SöpÙ9œ7gùF6(U—­ÌÒ=š_&Z׊™UyeÄZ6>¥-V´Êôz¾9¾«‘®ygjs…ñg&í3fÉþVë3™n#iNùlªqÞ6Æ«Ó¦›k«Pöþ0ì2­Œ{ëšãîÓk¶Ç{è£÷J@1¾´_b‡-—ò_ýýS}gîzoû–uèÅ9ÎRiÇËÕê;­Öxj'×6üQ¹NSœßp¿u€ÅýQt|ß½RàÇvÑÚvvßßM˜yѳú©ïðõ‚KÎ*,ƒG ºQÙ_ÄÚ\Þ»M=òŽo'WüÜwW?zö!ß¼øÁŽúÞäߏ~ô𠷗ùo|‹{܋–E 4Ç5nZÖÒ·¸û1®½Âêl·±ân}ԋŸü„D¿ðÕÜðÈ÷<]µÏYÎ#BÀð;ŽªÉÑêç@˜]ÐíóWùr‡>{­/=ƒð{Hçˆ8$.y}š›`ùôG7›ñpzBdËõ¬'’õE",Yª’¥¬“ЅZZ©F0b‘df´bþR @ <@àB†  |8aD‰ +VŒøâą;~¼¨¤Ç#E^´˜r"B–U¾„SæLš5mÞę³@Kžu:‰’¢Ï’EIbjâI”?UäUêTªUÀ µ Ö­P¹^%øU¬Ö±` ~=KÖëZ³]ۖ}»6,Û¸,3Z%šòèPŽz±Nü ñ)`¾‚—ˆ˜ä^ÁŠujêTòdʕ-Û´zõ²á¢œ›vDœ˜±á¬Y Fêy3äÌ­]ã͚Öm[Ùug—E[Û6nºp}÷n·#^Ëy7Ïi'먫?ëENSùäéNf®Ž<{tî_?5þ6ØÒ³kÃÝ=×®Ú®å͎uÿû¶Üñ¹·¯º}¦þîýU[·J;™ø;ŽÀ› ¬é:âü³A\)< 'œo=„ä«ð=æÐBO¶3ÄÐ>ÚΏ*:Â⊠P4Ð2 Ì#…f4í(g<¬1ÓrìL£%bÊ(ņ*ÆÐxÄÑÅM#O<{2J›˜£°Ê¨8 ®.®êc¶ñ.¤Ë¶&AÌ2¶7,ÑI)×dó%ÖD $?’Q$¦6ò‘3‘šÈÆè´3)?ÿ$T(=ûòN9!:Kªۄ”E+'Ͻö ³tË0±l¯¥ÒÞürÌKuËT½´8½0MG#e•Mú¨\þêÅ¿ð¤³ÖBG",I;KûSW[¡4ÏÌlðРôäU4]-õ´UgŸ¤’Ri§m-Tj«vÁ´}¶Ûî>7YÒ=´ÏAûbì¤$9ÂQQs:t¥Uµ>ÃÅ÷Qo÷…)Ûkÿؼ€a“ð®üøEx5ò¬-hÑB—uø¿Ô0òõÜÑ"^—´u7îlâÂ,¶uVF·Z5a“©8候UÙQMTõʓgþI-8yT2g‘ë<WÐU74w\ EŠaDÚèœ_ôlG(÷µ'š§>°e«¯ÆÚJƒa¦ºëÁlÉ?}½ö;²ÏÖ+kµ×f»ämF;êol¹‘3ûn´_þn»o¿ÿÝZM½Éæ»áÁŸ)oÄ©.üoìï ò–á /p—óÅåß`H-÷¡¯€üýÒC&.pDñٟ–(÷?VЂt¯¤Áè)ðL$ń?~°|oã` UXÁž¯…+4^˜Ò°ÌR§3öЇÌ{¥aØ;’‡7,"+ô! щOl[«EÜUÝk Gø*Kð9¡©8F2ºFŒÎ;cW–F òPo„£íœÈÆ8Jëxlbõ¸Ç Αë££ðòøGBò1‚,d"6HE6’Œ‡D¤#%©57NҒO„dð2yI82’“ŸÄ#7 Ê1z’”§à({‡JV Ç|­„%U¹»YÆr… þH4xaB… 6tøbD‰)V´xcF9vôødH‘#I–4IQ`J•+Y¶tùfL™3iÖ´ygN;yöôùhP¡B 5ziR¥K™6uújT©S©Vµ*³èU­[¹võúlX±cɆÍZmZµkÙ¶uû.׳qéÖµ{o^½{Îåûp`Áƒ 6ê×pbŋ7v\ñcɓ)W¶|Ùed&1wöüt蠚5‹6}ujÕ8I¯vývìӑK˶}wn¼´W¶ÎܒwÌÚH‡cýY´¸ðͺ™7wþñ\äÀš&öì}Ÿw÷î<ºÊþé) 4op9zóË<¿¹}yöYÇ/·ïþYüùù÷–?@ñþÃO=÷è›N¿÷4°?õ¾{BÌÂ#o½õâ³PÁ÷<Ð>7ôkC CìCGÌ°ÃúT¼ÏÂåÑE #œ‘FÇ@”±DÓ«p¼MdÇ qä0¿'LP@òлQ<e¤/Èçë1Jk¼ËÀ˜œÊ1Œñɝ¬²7+»d‰I$Ë’Í-WürÌ a$“Í,í¼³.éHôJ œó¾>Q ”Î7Y41ÎúÄ<±Ë ’=8½¬ÏJ-MKÏ6áÓÑO/ T´½H¤ÍQýüoÓ4•H%Y³ôÄP#ÁRa½×\ÇRS×&{ýØ¿xÍÕÁ`=6®a‘]–ÙfÅ:ÓÙh¥V*h©½Ûl¹›pMåö¼n¦Ú¬ýÍL4»¥i¸bµ]—ÝA)-NYp{—ºI¹ý–§LÛÝ7ÛS[DÎH7ž´Á'_œ2½FQm²XOM3փöÏT>·\uG$ ¤”ߎœXVN…ÌôÃn¡<à/O†´L^‰4TRWö•O9ý£9åBEõ˜çQ.’ÇýF^M¥rf Õµ××…Žñ :‰ÎX¸ôtɞµŽðg@‡“`|Õìjå\žÚÜÝԔiE¡cÛÓs•þ¨€À <ˆ0¡Â… :|1¢Ä‰+Z¼ˆ1£Æ;* d E’2¤È”M¶DYp¥K—#K²,9¦N‚6YÞ|)3¦P8S®ôÙódϝG—.E Ô£Ô©T«Z½Š5«Ö­\»>”™ÔæɚLy¶{ô,M˜JÙ%ËvlÙ g‰ªL»“(Z¸$ûÞ­o_°k}Ö,ì5±âŌ;~ 9²YxµV>xYòG͜;{þ :´èÑ/7f¶zz2黩W»~ ;¶ìً[Ó¾;·îݼ{÷¶í;¸ðáċ?Þ8òå̛;½kÚ˙+[gˆ8¹Ü‹×£{ÿ>üþó¦y Wl­|hù‰ÔÅ»?>lòMÅžé7.Nû‡û›D›_i1(W€ùýGž| .È`ƒ[ÑWšRI¡”SqA•Ó[† •†FE×zŽHb‰&&âZ~X¡JòäW†nhP‹7¥Há`žÈc>.HØ^ædãOv iWˆå™`‹Ýýe”R:‡XXn±b‡tµ5c—Óuèe’YB5e™fž¹[•.®Èߌ>Õ—îøW[(d€"¢ÉgŸ~J–xþIh¡†v4ht‰Êh£Žb÷h¤’NÚ碔^Ši¦ãiÊi§ž~7X¨¢ŽJj¨ŸžŠjªª®Êj«®¾zU@;PK#­ƒg#b#PKÛ°-AOEBPS/img/db_init.gifb òGIF89a ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ::ÿWWÿuuÿ’’ÿ¯¯ÿÌÌ3J` w(Ž/¤7»>ÒFèMÿUÿl"ÿ‚Dÿ™fÿ°ˆÿƪÿÝÌ3"J1`@wOŽ^¤n»}Ҍè›ÿªÿµ"ÿÁDÿÌfÿ׈ÿãªÿîÌ33GG\\pp……™™­­ÂÂÖÖëëÿÿÿÿ)ÿÿRÿÿzÿÿ£ÿÿÌ"31J@`Ow^Žn¤}»ŒÒ›èªÿµÿ"ÁÿDÌÿf×ÿˆãÿªîÿÌ3M"f+€3™<³DÌMæUÿhÿ|ÿ:ÿW£ÿu¶ÿ’Êÿ¯ÝÿÌ3PmŠ¨Åâÿÿ3ÿ3MÿMfÿf€ÿ€™ÿ™³ÿ³ÌÿÌ3Mf"€+™3³<ÌDæMÿUÿh:ÿ|Wÿuÿ£’ÿ¶¯ÿÊÌÿÝ3"J1`@wOŽ^¤n»}Ҍè›ÿª"ÿµDÿÁfÿ̈ÿתÿãÌÿî33MMff€€™™³³ÌÌææÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿÿ3(P7mEŠT¨bÅqâ€ÿŒÿ3™ÿM¦ÿf³ÿ€¿ÿ™Ìÿ³ÙÿÌæÿ3Uw™»Ýÿÿ--ÿDDÿ[[ÿqqÿˆˆÿŸŸÿµµÿÌÌÿ3&M3f@€M™Y³fÌsæ€ÿŽÿ:ÿ«WÿºuÿȒÿׯÿæÌÿ33MMff€€™™³³ÌÌææÿÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿ3M&f3€@™M³YÌfæsÿ€ÿŽÿ:ÿW«ÿuºÿ’Èÿ¯×ÿÌæ!ù, þH° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç ) 0R@I’'IªTi’åɖ%SÊDérå̑,Ƭ¹ç͗7uÚ¤ÙS¨Ï¡0‰*ÍÉséO¦E“&…ªtjPªR¯î ɵ«×¯`ÊK¶¬Ù³h+âL˶­Û·םK·®]„rïêÝËlÞ¾€ Žøw°áÈñ&^ÌpáƐ#Ó},¹²å°”/kޜ13çÏ /zMºtÁѦS§^‹z¯É×~YC|M»c˃·M·¾K¶×Û¹öö÷qpλ]Ë%þõøÂàÌC:|r^èÎkë\î³gÌÞ§¯þ‹ßNs;öÀ¹o5Ofu¸ïíj7}ýó(a»¯o?|ûô¾ ×yåå7üŸ| æ ø—Þ€Ú' {ÈZwNátˆ-8‚N!w˜Ý…)Vèàz~xŸˆoѨ—†3↢‹ög"eø¥èހ'æ(™iã:2Éc‹CÒäŽBÂØã‡MªÆۋÝõ¨a•W–‡]t-úg!†hŠù`~X2†d,¨ŽFʸ¡qS†7_š\ègeo&¹gšæÍ©¦“lJ¡”R®H%›c"šX Z:b¥lQŠ©žšnê閝~:Q¨¢–*Ÿ©¨FFjª¬&Ùê«þ‹­ 묶Ñj«‚·æ:™®¼ÞØë¯nÉ ì°ŠkìYÂ{l²Ê6Ël³Ð®í´¢Qkm­×f;›¶ÜÖí·Þ‚+n{㖛Ђå«îºì¶ëî»ðÆÉU¼ôÖkï½î–õ¬¯Í‰Z’ûò旿jåé¾ ¼mµü©ˆè>ìpÃK”p]¼°Eïگć»iÆ ?pÉ]uì±Éè…\)ɏ²¼‹G0{Z¡—ZLóFÿb´ÜÎ,ãܲP@OŒ×xÒ"tÊË|ôÔÂMnÓB+%‘D?=¯ÈQ;´l5%zԒdb=5slƒ˜3nÒÎtu¢h®GßÜg«g©ìÈS=ÔØGÅÝfàjç4áˆÃýñ¹‚w)áÑd§³àb^µËEóLöߜ'>¶ßj‹ýyד­ÐÙ£Cºçw“»9맃=3Ց«žz䃆·„‘*þÛsF¥8îwJ”'È8æ{Ó¾¶åÉ?¯»èo¾ºïPÇNքKoýÜÁCtͳKß¹øރNùßşßúïÚGuí•oüŽ°/ŸyØÜ[èyñ¯;Ó҆Fž;ýÇp‹ÓîöÔ6÷½Ïy½cĘ·­õ…€“ÔFfA¾`lèÁëd|ÄÔÛ^Âꦃª‰@þ ° Áƒ "\È°¡Ã‡#J,¨p¢Åƒ/jÜÈQcƈ7†ìH²$ɑ&¢LɲeÕa:”é²&Kš7mêÜ)§AŸ3y m ´dÑ¡H=ª2©S‘N™>ÚQêÀ©XARÍÊõåE«?»ŠÅ¸u¬Y°VÁšÍ™Tíڔn¡¾íWbݹ—šÀ·¯ß¿€ L¸°áã"^̸±cÆUñ~•LÙåݧ—éf®ŒwóTÏmùrW4é §UöMÍ:¦éÖWa«~-»öÀÕ¶cËœ{·ßݽ{&Κw늠‘&'¾syÛÞΙ׌®“úPëÒá2Ç>=ûñÜܛ{þ/^zøñrƒŸg‹~ôú½o_­`}ùöíãï;ÿ|ýôñwŸ ~ó x` ø_ƒ*øà€N¸_‚:Ha€x!‚jøaƒn×iïè‘Šœ¥ÈâD.¾¨”Œ(Òؙ-âøVŒ:6ÕãX<þ–t¹£‘\i¤’82)¤“4BÙ£”/RÙ$’YYi£–'r)£—èÉ¢˜Þ‘Ù%–X™Ùžš&¢©ÙcpÆ)çœtþæævá©ç˜{ö¦Ÿ€šè Ðj(p‡&z›ŠúÉh£{> )ž’Nêf¥–b‰i¦KrêégÆ}*jsÍjêtvžª*\¸­êªQ´†½*ëW›Îº¦­;֩뮼öê«®_â [­¨ ›±^{l°Ê.Êl³î= meÈÎ8mŽU^‹-ŸÚRV­Ýޘm¸âr{]ªéY†.¸ã}›Ðsñ%kmwñΛ—·ÒòôÑJ0¶¯¼÷Jæ.YÊ|[}¯µêE´µz0»º)ÌpF>lñÅ%Âë@þ$XÐàA„$dØðàB‚!8p¢ÄŠ- ¼Èq£B=ŠìH2#ɏ&®d9²åK˜1WN”Ù’¦Èˆ.s⼉2$Δ#Kž$j°¨ÐšI*eÚaO§F  z’bU—±r¤j±jϛ·ŠíÊÓkْ>£²„ºÖ­Ì¶oÃf¥‹ÔîRµC‚ÕYwhJ«oÆ\¸!áµ4‡Eû£ß :Ófü{UèѼ†¥jæ<³3×­^Ur5Y–´VŦ#~Uhõjž ƒŽü¯m܈qïÎ͛©nßn'Þ4mñ—Ñ+U¾Ü¹MÕÏ6—ž¼úu충g?ÌÝûw§ÛÁþo_Þ|÷ópÓ¯g»ýà÷ñÁ‹OO_þ}ÍöÍëÇß?±ø08þÆ+p@mJp§,ìÀï tpÂÚüêB 3ÔpC;ôðCCqDKԐB§KqE““°Eï -F[d­FW¼1GÄ°G ü1H"|±H$‘;2I&y[²I(;{2J*›²J,ÃËrËì®äòKëÀ³8/Ç4S¯3Óü¬L5Ód³M3߄SL9çü²N;·Ä3ÏMܐO=Odk¦ å±ÐߒBÔÐ gümHã¢cÔ?IûP®J'e/Ó¨.}PSùØÜÑJPã{ÓQ¹JÝ47QU­o·S´]ÝOÈ=e©Öüܳµ:Nۓm×ù,“10`¯{mSŊõ,\aBµYejkÔç¨e0Z^§[”³mÄ6[¸uV\g¿5ÓS5W:h kwÝ ñ{^]C¥×¹yÕ½—Ìó]×ßÿöåWH¶°`âîa³6Ì5ö ±d½E3b‰aE/ÞzåT[Š§BË5ׄ¥í¬Õ†û8ڐwªÌ,asŒãk3–rã¾2»‹/¼Ž³8G€þH° Áƒ*\È°¡A !”@€E‰+^H±ãFŽ^ É0£Ã“(Sª\ɲ¥Ë—M>ŒÉQd͛qb´I3'J™0ƒ J´hQ “Þ$٤Υ;—òŒh´ªÕ«X±"92&DŒ}våêScƏ%³ª]˶m­n‰ÂK·®]‡sï¶Ì«·¯ß¸|ÿž ,¸°á¡„¿U̸ñQÇ,CžL¹l冒/k6œyrçÍ õ~v<:´i·¥§>ÍZk냫_ËF<[iíÛucsÆÍ0nݽƒc® \¸q…$O'?Îü*Ú˲Kw^ÜêóéØ©Gï;6»w¶Ýé^ÿN¾íÈð0Ï£/Ï^´ú÷ðÕ·ŸO¿¾ýûøóë§;PK©lèg b PKÛ°-AOEBPS/img/cmmbhier.gifýJµGIF89aYáp,Yᇠ    $ ( $$$($$,$$0$$(((0((0,,800<00444844@44888<88<<<@<rùð âˁ6°UÔh_¼Ê0peV‘±50P…YùÈßUï_ HÄY>8ØUhø odˆB /H UBE k0Øá‡*÷`ŠPÕð"Q¼ðÂRù+¶XƒPeXä~kÔ°"}t1¢QEÂŽ7ÂÈ U.@8Öà…ÒáÄ]¶Ø% Déƒ:Ræ$šPq衕É6ãUä‰å…DxÁþà‚4þ•¡ÊG–‚>¥¥€ÎI'mÿ±U|pÁÐfº`Ÿjzh|2Àž›nI‡œ“Nÿaw‚ “˜Òaß« Õ tzˆ¸Æ!úº\þ· UÆZ[®Qj£¯ÁK£„2 $D:KÇ ,EšÅJjå¬Ü (e¯— Èi6ˆ%¡œª/‡ùò*/¦4Â*­mÔþz_½PÝl¿Ürˆmˆù*j‘œÞ'ðÀìnG㧸êG!‹}ø)¾úk±©¼†ðñ~¹^<ðlŸ¦‰£©ë ”Û–ë…«tìÜì°Üš¼fº/ӑ±v4†ÀSή—¯‘_¹ÙJk±ý.,õ¾~z!–ê­ZÖPòȪz¹ ¸*Õÿ=µ§É5Rbˆ'‡ýáÑÙÑÿ(¦©ùÉ&¹òQý©|ÃbÚò-è€Ìê'6mhÛÊ@˜6"fªO-bÉA®¨Ë±òm]PF•g”>X ՗dü¹ Žz1»íq¦D„¹øSU˜9ùlôX/ì=>%µTçêŽ;Ë«ØzôÁmú¤²ß^ÍÚÃu=(\ {÷âùpÌä·õ}úì·OþúîÇ/é2ÎoÿýÝÏÿþük§ÿ sþ'ÀÐ7< ›2ð$#HÁ bf‚Ì ƒÁ zðƒ~é GHBïÕ¯„(L!bD¨Âº0'²’–d &ãÈ3˜Ò”„<ãàÉVºRŽ  ¥Gù@žÈåÀÊ@>@•jì0_IÌbÆR–¤¥_lù5º€f1§ùÊc"S€Êì 3Õ„  Ïì â@‚tÀ ƒÐ4Ñh ‚¬ošÎfA¡=CV/ªJšÒԔLuªZßÕ¨Úoªy9èÇ:V{®“O hPŪSiê)]êZ‹È=º• Œ,\¹iÓ8Ec^ӺѢ.U•$E#”šVÂz¶­‡\ñ²Ø4aƒÈk°U¨ªTm.I]ÿªR°žÍ-hCÛ¾ÑÞE“tæ{¹Fâæö¸y4,o¥šXÒ¹Ð5¦r—ûÖæŽæ¹ÑÍ®'wKÝüYW4ØÕ®x%ÉÝîÏ·v ïx×kÈòšWl荋zÙKß@º÷½/‹/\æ[ßþ>uºøeŸ~ßÂ_ÿ˜­ðû¾šøÁj¼¯‚'5`·8–ð„×Å`Ð\ÃÖð†÷ÖáÎ|ÄþñˆùSᶜÅõUñŠÑÓb¶¼Æì•ñŒÍSãµÜÇãÕñŽÅÓcµüÈÚòÁSä´ÉÑUò’ÉSbÎ<Êȕò”ýWåÍ\˺Mð–éÔd´|̄Õò˜«S泜ÿÍkUóš§Óf³hò”4. RG=œ¸Æ¥£qb9Ïù9u.K)ÍفÚÚñ ­BDáHOz‚µ³t|Àk/Jh úÐÍI4Y „­º`ҁ¬§yŠÐ'ÄA§‚Î%Q¡üiP/GÔcq$^ÓØτv ôì€BIpÕèá×òL¨Rýk{Òs³jÜóJOܵ¶î 64ŸÐŒÊ3µÌf%>Ëi…Ú¾6Ø`²˜mMã.kƑx¦íÍxÛ¬'u*‘àÎfJ3«Òì4ñùÍt§ÑHèB>…ùm@@ó)u°‘ðjg;«¯}: ~¼‚žÙ­5»ƒk±À(ÿ÷¶Mq”›òì8»pRM£¼Þgc³K]N‘Ö6£;íÀ¦¥Ig §÷·_.қ»å$îqE>râ”<,€ì¬¿¹é´2Ü’¶'Ê7ð¯šÒ Æ)jêo$è!©ƒP¥Ö)žÎgjT².à%OŤ•¬¿4%ÐÕ]u],€t¹3ýùr>Á›µiÑw^¾Ǟ÷Ví}lW×;¥ô ëNOQ+³¯þFg^GêO™ßE-t©^øßþ+€<éÓMNa#”ñ.© H0|¬Z O#9@tZáµÜöø ʝP}Zží4mI­Í푊ô ½8ÿ9«ŸäuמÉîÎ̛áìTڟŸ7·÷ÊúÙ¿R÷¿7ñïÊüéPûßß6ùÇûÇÔäÿG¸Ž(×R‡GNôF€0x8Hx€ ”~˜áHu[wG6@hÇ6}¨Ve~Èfx¤¶iït¨”F1¨Og R{€ J7ØKÜ6N28LñtU&ˆ`)Hd+hŽdQ9‡O¡÷r_M$ Ãç¦7R$ÐM@àp'elòôU %p.`˜6„ktEÈ ¨ð&„c·iú¶T)”7}Q4×xéäMÒćŒgl¬vwfèFh˜†ª±†YH@ÅkÕhµÿR PŠ÷w;QL5‚Í$pÇiÒ4‚ƒXX†Øˆˆ€ôxidŠ§Yö„FOGKÇp65m‡rKÇvx÷‰ ŠÛ1ŠWHÇrüÄJ$ucørH`Œ ¥ocèww·YV`z~&N~…vµ‰6@ºˆF…È‹t„•HH—rj„t@§ä˜Z@Q]`ƒUtHwUt8ièhþG…|¶iԍÞ(¾hÈkBȏ„äÿY‰F²gˆ‚ y I ‘Ÿ$‘Y9‰‘í¥‘9)ºF\êTGÀ’‘„#™%ºÆx#å‚r,ÿ™‘/)1 -ˆFžˆtù(VvߔRO`”]IÙi9Iˆ"¹“½Ñ“tPJ’—QŒÕhV0mƨPÍTŒÇøLV0TO9G.)••A•š”‰Þ4mì•R9ÅJqpl›xwzµtgGi©–Á–gTêäOµu} —n·m­”8Çu} KQ ˜·!˜¼V|#t.À€`%LÇoX¥o’G“‘ •”ykàš$…WՁÕ×lvÆ&LÇVjÞ¤xxšg8™©‰€« šäƒiäg½d\18LX2țpô—¿ÉAÁùéœhé›Ñù–iý‡ÙÙÛɝÿèß¹á)žÒUž$9ŽQè‰šêi{ìÙîùžlñyóɐ$ñŸÁ: a®“Ÿ»A•d  ڐ ¡Q°Š@ûI'X-P¡D•§ñ)p º@Z *:¢T¢¤ñ) ¢**Jú!'j+)£Ä¢¢á¢¶£8šL3j% @ž?š>:JCZ¤³¤0’¤J ¤v@Nú¤ØĤ2¥TŠXQZ4v°^ú¥`¦_jj ¦fú¥y¥Þµ¥/ó®jª=GºnG¦)G®—Fp§“3§ŠQ§o$Vvėh´§|j=V*0~îÿäzúVNõLëäÜ։ÖzÔ†z¨“¨ÏñEeîԊ%õZ°7}|ØSÞ´kü¤Q—œŠ¨l:0_`sdTL%¨6çšõôpŽùrx¥›«æ©ÎQ«oˆ«h¤«oY´%ˆï„w0ÄÚ©³*-p`SyHªqçNÒtq½úrªdz·Sh %„Àßwwúü¸N“¿Ï몤üÂÿ/ìÍïýHÅëÈîÆg°ìÍ©F'ÿìBxÃÛ_œgì3çì¨ê¯¿ï³OûYÆñTáñúßTñàÌ ‚ D˜PáB† ÎY@GâDŠ-Ò ³ÀC”‹=~RC‡%MžD™RåJ–-]ž\&ä̏^ÞęSçNž%IÄé%Dš3n,šT©Ç‘B>…UhÌ¥JmJŚUëV®Q‰V•x”#X²E›vE›VíKªeC^]Wî\º:¿‚ëVïdzuýþÝÚvoG¸€ FœönÕ¼ƒOì›Xò䕂S,LYófÎC#’m|ypäÎ¥9[M'³iÖ­)/^:µÿÛ<ÜƝ[÷nÞ½}ÿ\¸oÍGž\ùmdfO\íZúôº°•Ê~–Lîݽ^üxòå͟'¯! zöíÝ¿‡eKv‰Ñ©ßÇÏÕzRìôýÿð",h!@´*?Ôj¿¢úC0B Ý œ›0C X®C?1Äۊ±DO 1ʂPC_´h@„±Fúˆ/Gwä±Ç(š`  ‡$²HeM£±ldÆ g¼°I)§¤FСJ-lqK/“qF¿$³L3“zxãL7÷êòM9?zRÌ(çÄ3Ï)¯œ1K=ÿü(N@ÿLÉAÿE4À4Åd3QDuôÍB#¥´ÒÁøÓOKñ„tÓ/'õ4TQ=ZTÌ5ÛõÌNSTV_MXÝ\uÖ]µ5×HeÕõËZ{ÍW`‡Í“Wb©üõØ…U¶Y2uÖÆd£õYj¯mZl5œvÛÔ¬õ6Ü µ—K%Ë쏨A·]ÇÈu÷¿nãH݆A)b—Þmó$`&¸à‚»08a…ÎÃߙæõ×ޅÎ¥3:à×al÷è‚$“:†jA‚˜^u‘ŠAâ@‚ $Ⰱ’ž¢åAžÐˆŠ]⠌sᑩÝ ›KÒY§8v6H䡍:÷išÿþè‰3Hxb¬°ã'lÄÎ[kÎp„A\»Œ·¾8 ©›Ý|Ñc AÎj@âÐ;é•ÏЃ  ß[ïÄ Âñ¯ñ¼p§ç¦¨äx¿èàŒ3|^ù §xºÐü­ÒcÓWVˆÂû¥|Ø=t¾Ø:pˆÑk·áó¤Ù"sÑIÐ=÷*îÀ†˜÷ƽw=bî㭘áQ{uôWvÁm¹³ïuv .&è h_gãX½kÑñ­󐰯AØ`~á;[èh·êÅÎrî2Cøôвº e¡{¾<ÿ½¥r„ÍlÀøÅõ#íl@‹Ñžóœè"¼Âðg˟æ*v±Æ¡”{`»þ¼<v³ß€ŸIo_çS[I€1/ %ԕüè'à Îï{H0à 2ÕÑðx+„ò–ÃÐé øá܂ˆ.uÁ …ÃAô9 ÄÁ }ëÛÊ 7¾iN°Ã"¬´¾ÕÑîOèB–†<«ÙŽ‹fL.¦I6JÒvg`¥6ÇrIÌ)ˆL$«8օ¦ »ÊH² Ú ktÙÝZ¶4¤•ƒ`å Œ&̚ B”O#¥¸L)T¦rT{hȳrÌ¡%ÿ3\}X˜ÁðÀ†lìÎTdCôµjŽÌš± B À¹-hú¥œ;'åÒ¹Ng‹žÃÞ=i2O}–ОýôH<çÆO€Zˆ@¥FP„Îí  ˆBŸÆPˆí¡•èÐ(ZQ]¢ÙF9ê/6¤éHãUR„žÔa)Ui»XZP—ú ¦1-×LZSzݧáÒi?y/Ÿþt[AÕçPÝUT£^ ©÷Tj»˜ÚÔh=•žñœ´ºU®vÕ«_kXÅ:V²–Õ¬gõj€V¶¶Õ­o…ëYC€ªŽ  ®wÅk^õÊÖìÕ¯ì]UÀ¢|:FCèXb»XÆ6Ö±ÿ…ld%;YÊV¶±Z°lf5»YÎv¶²0ÔEàYҖִ§Í,fQ»ZÖ¶¶³Pø ^ ;1ȶ·Uj*bÜöÖ·&qMâIšß÷>ºÅŒq•»Ü„ŸH q™;ÝÍ :ÔÅnq’áÖ6»ßMŒuë^ò.h»$›í^¤[^ö®E¼ªio|]sÞ@¥W/M„þjV¸”Aƒ,éÂÑ’߆t¡}.ðîIð_“à+À ñ/1Œ2ù:ä½¼­p† C߀Ú×-MQ¢þ:0º”Ä%Á;ˆâ‚̯w·DÉùL’;a0!&îC ç6´Áp…,C º—ÿ±ú6¨ä4"$¢S¢Æ‚ 8*.ȓ»`b‚IzÍ삘øÍÞñµÍli/hD  êá²$ù hf›Ë0¦;FGÚÄK´õ¾H`³"ŠÎcæ¦÷ ÿóf:H[ÓÓ rç[ޝH0®Õ&Þò +†b$|/ãk>Þ¾ëˆÕ‘}7±óÖðƒg-ÞÂÄÃœdEكn —×Ö洜ï6N›Jd\4ïm!8þ¹˜y|’¢/DxqÀŠ[Æ°›,î>óøž 9•K]kYˆ²UÌ9H$]x›‹¨â7r=ÞM_¸úÉuß©oaߜé¼^ƍó”%§xÏ0†v.í}/ÈÚÕ'=Ñm½t¿mÍ{rsewÜu±¼‘`´LçXŽñø›3‘¿RlYcÙ+m‡[>Áv 0S肮 Äëi$ÝRfÿ tAlƞ}í»l»¾Ø ¹+ܖeF``Aô‹Ö‹1ß;̳í–~Bé®é  ¬|³Í,ÏßÍwÞ)ꮈ oîoÑuïÐ^GsØیeû•­€ÜÞÕ>?½SwèC7—Á¹úq?I‚?Í÷S›½Ó8ýc·Ñè‹?=¸5.êÜ¡1øã¿*Sn;®Û-§ ¼Õ©"Š)£±Ñ’µÒ9\Û²­kŸú™Ÿ ãH:þ±µÕ± Ó¶bÛ x»±a±ÀK³ä=+x¤HÚÜA»$‰â9¾Á»!Ò1DF <“Ë/˚V#Âð»Ä#Bó¯ÿð‹>³Ê ‚H»nÃB˜+ˆ`ò²ÿÚ2È«ŸM»p9 ÐAÙ[Òã4lÀ3ËÓ1Çy³1Kž@¿Ê¡Ãªh óA5ï žJ!Üé!Bìƒ;|«KÜq½c±ŸX™ï‰jƒ1ýãž[*Lƒ˜Kk+LYs¼t4 `{%Ü©ÌÇÄÁÌDŸëË[ۗà Ìa»JàkÌi‹¼T¼.¡˜ÄS&+®ã›¥Ô9Ü:\Ô#דFÿ–q: X¡£Ë, k«Ÿì6ÇӜ±Ì%²MÛ»H4S±àÙMmŒ¿H*œ’³ÂGøk±DN4C1çãÀ¥ü39¼Ž¶\ŠõbˆÛ+ ’ë3ö’Ïõ›®—ä ¾\›ï©4Û2P̚¦ËÍIÖé¶Í! úƾ19ô”ºõƒ4›Ae37`²Â»¹7a<¬JÓ):täDçóDek±%ãÐ1S¸?äP#D1 EŸñlўXˈrO¥€Oã9‡`±¬°ûlIãÒϝPBL³Ÿ<[I5Ð5;ݑž ïqRH34’>ôQd±J,ˆö¹.Û´£!õáÿÛQ´Ӏ„LÑÞ›þ›Ò$åDH³™’3ïY²äIžò?RÓ3B‰S›öqRõ Š ‹MŠUˆ¿A +˜¹ “Ô¯"å‰è6–ñ.OͲÿ‚¶,›Ab¡RMD°¾¹T=ú>Æy2–у9ãԅ;ˆ‹U$˜U1{œYÕ1£Ã1œR-$ÃÑ ÅQœ^-œJœ @œéÌ2]$ œaU¨ƒ F½w4¬ó³oÅ MW‘OÓÐVA×te Ö/u½­Ê”ŽsuT³ðVwµW cWøº×}} yåVÚ °4ýš3­¨Ïƒh%@°1~qe؇e ]’ÿw¬×µ00œ|µ劂tˆ-*¦‡uXˆٓØԀԮ 5(&ˆU„8XÃqY'cLž+XйH† ّÕY†(ÙèªØ´˜ÄÜ,º B_14ú5¯!¶i4Y$ZµQ"˜´¯œ¡Él3¬Ù| ²åZ„èY$ûY´`<è+ˆÛAF|Q9™ó›~s¼)¸µU™Š+¢#šPêL#;8Q# )ª2å¼×œíÚÀ„¯¥X¿ P5ÃıÑÅ«²'ڙ¶Ó¶yͅó2»…\´Ù.‹¤DìQ{\ÁåZÂíVÃe¡UGÿ³šÅ{›¹4TÃOj»»m]·É\½‘&iÚ×Ï]]ÿ€­‹ UY%"‰L,•Eu|Ü6c¥²K!J-GŽS^|19hœFœÍW0•ìÕÞíåÞîõÞïßðßñ%ßò5ßóEßôUßõÍ^ hljݺè¸æÔ¡¤&ãŕCÉH#ЖAȉ´DÙ$ ^$#ÿÂzL6³?~}/gz  +£BWº`^ôé¬-^3­·Ó´µ£yÌ~ÛA„[î!ΖP›†1UûË [p}àTºM¡ày¥‰“å ¶˜!Ý óØÆ¢Ei”¦ª` öےÀÏ´@° ÎWΪ:bº°3‰QE‹_Êڂ*•S1bž Þ] bøÁ”ÿ>ùâU¯ã+cëéâ)bœ:âè¹¼aã;„Ãħ MýBšƒ¨TƒÐbÍxc¢ªFUãûª­´y‚7*X…°%‡8¾A Ôe|ž£Ë” @¢3 ÞIdäœøÏäadqò»Î5ˆ‹='®§JÞVøõݱ½¨5º¼ ¤¼Ñ  f˜­Ö°©˜¾Iæ.ÕeÚk5f¿ùVEÛ½¹²=’^ÎÕ£Û´f_œ!Ûµ]`e4ÐAÖkÝбS™Eқ¯gh^œ1ʙG/]N%«Z't•Æ3Kž&B8)2Ž[ªš-›Jk"K’™F+œÿæ›3òšä º´ žŠ©@ÜÑÀ ¹‡6ed •Áèøc'ҚW",Õ„6¢%]!´SÓªÜu³™6âĘÛÉèÏÔåÁ˜œ~3,ÎgˆâgpR¿ÎÝ\­Á=PšF¨vê5Kš2&z› b›¸5Óù#G­I’èÆJ[êÌñ9­6mê§&ëJ{ë™¥†Âì“ëIhæEzž½þj F~kÁ™¹ÛҘdø9jgJj³Ë¯–ñ2Va\þšÉ¦ì-B0ú!¼˜™"u\šù¾ŸðΔU=JmÁ‘$µ[›£‰$ÌVa.ëÈT»¥éÕÑÜ%ÿ3äÊQÔy®ž9áéÆì34Ú~›ö3í-êÆÎXììiìT4HÓ úÙåI²µMF£?bí bµš! [»Ñçc™ÈÄ¿ìJ´>ú!n÷f•Ýìþ£-r½šaî‚vHáyaû‘ •YöçƒpõÆ×ÃïÃþ—YpÅÖçDŠîDB×؍mÚ.6Ÿ™ÕÌÉ_H³ Gì”&ÎÓ ¿£˜ñ¹Û}± €ì­\¢MâE®©´ª~¥'b¢m1ùS×ðïšÔ!#NÚ¶YO†ïïÛ . °##ýÒÊð±%?ž7’q Y"tA®YÓ\6j^®`×ë¥.KDá/ÿÚ¤ÍW"ó›°]ò/ñ šÙ_z\|¡MH 0 Íá °ËûjWô%Á;ƒüҟ@²ã‘”±4="NáÍ«&ÈQ ñ%c[0?týY0J§óžI¬º<_%&Ŭ™'°bÊxnƒòr0‰<¦‹ LÖÙS Ç¢)N ³$Vˆ´L“v„ ^ÁÅuÊÑõâõ6ö³dw¨T¿äcug/h—še‡Ÿf·v!Ãö§Ñöìáön'ãÇ¢p·žq'÷ ûv‹’v_ދ:aßy§÷z·÷{Ç÷|Ï÷;A(tw U§$(^F"€w& àw‚÷ƒ—#ÿ„O¤$˜‘gø†w—1ƒ‰ªr‘(ÁŠÇ‡ .`!!`0`èˆ`Œ§–ρ²€ù™¸hùÙøp‘x1¡x§‘ ‰:P‚‚ŽXz™Ÿ0¤' 'P‚™Hy'à‚¥ßzyøêx;ùx¢w£ Py4@úp:€y4)ø%hz:Xú+‚à‚•¿ú‹!‚¨Ÿ'È)à‚°×úÃÏ% û™š§4“¯|%ø¸—%p‚+ø1P‚¿§Ñ'}'¸{7èüÏ}¶œv„ zSz´Wµÿˆÿ0‚ÈùšOy‰À}¶g¿_z¤×ù+ «ÇzŠÀý”—×û«Oy•×{•wƒ”þȟˆâÒ/}ìŸ|‰˜~¤þhú¥~ñŸþ¼·dx©©¢}[±}Ø}ÍWy¶w{—ß:¸þš#œÐÃBFÁé0¤3fĆ9FŒá‘!  ehT2B .9¸4d8&‹#X€¡óƒ%cè¤$é’"M„R†äY³$Ã0 tÊQ´4)ÜmˆÝ"ÓQX’øØ©L`@S|âd(E•ärh`bAÚ5>-ê‚ðûáfzÆ1%ˆddŠÏ1ªñŒfl#RÒǦ°qŽ?|£½ø¨<^¥Ž|ä ÿ(G0¢†<$"©ÈEbä#³2È2ҐV¨¤"IpD:2’ô $…²”¦<%*S©ÊU²²•®ÿ|%,c)ËSbr$¨%";°ÉC‚`–¾ü%0ƒ)Ìa³˜Æ<&2“©Ìe2™èô ÍiR³šÖ¼&6³©Ímr³›Þü&8©9 @“ƒpÁ%»à‚'<à–V(ç ¸€6($Ê©Ës–3~'@*Ё´ =(B N(´¡}(DµY@3¢½(F¥IÏAè¡zˆÃâЁ8Ør]è li…3<à €héIÁÒ3 ážêügFsªÓò´§e¨Oƒ*ԄN´¢C=êP;à áñDPÈ[’“©$pÁ:PHœ©…ĪÀÕAà©f=+ÿZÓjM ªµ­h-j4Ý*W…vÀLBU©–´ªLEBV „®A°›œg:PÖ¹2¶±Ž([+Y‹Âu²–í¦ øê‚8ˆ´³¶Ä\ Ø'vœgm!u „K⋽,lc+×Èʶ¶­¬mk;ˆ ®»½¤´ê‚‘·œƒ8Ã-M{NÞj²£½µÁks+Ýéf”¶Ô½®5q‹]Éâ²»•ŒîvÃ+^€Z7¡gÐÂÆTíªW®Þ}o"ÁÛÞùÒWšå5¨0Ð4bp¨ Í3ࠛ8h‚\`ƒX 9eo}Ñ ß R¾¾ðvï[PZHDÿàP ,¸¿î0`°_ 0Î(„1|TAиÆ6¾qïÐóØÆ|1Å«a‚"8ҁˆ¥i„àà¿ƁX,MH™ÄSÂR +AÁqÀA\ÅfjâÀÅFð4—ÜäRyš80‚F™ld=”ùÅTÀA ¤Lg P!0H¯4©ý3»½ì¦ì¶’¡të™ÒÄö·ƒ‹Î_׋š¿ûU7ç,û¿KTøÇGjñï¯ÿ³&?œw6¬éœ\Ú4Q8Y Á™¼XËMÓNŸÝ5M^ËÝ4ÁVÓäUӖAÜàž]ÄÚ`IÓä56ÞþaTþµ úTÿ5ž±ßYyœA±` BÔ î bÔ 2–~‰RùBéÿà*T&!6T6¡@!!ÔN¡þÔ^”f!@U!~á6=!nÓŽa7y¡¦¡}ÙV^Xªa6¡!Ž¡Ձ‘RŸA}›f’™üI“ŠåaBø%"þáΡ5É¡#ra ¿ÅÞóußA™Ø—• ªÛ»Ù ~ý]ÚáÀ§åœ~©'6b$N$®¢NbP•™”=ڝÙ&êÁm™\Ú.A/Š]¨å¢®1ž ¤@§yb¬Á‡˜Ë­‘\ý•+†S+^c¢Oq¨­°õáߕН9†"  ž8˜­mšÎ½ßûUÿS™eÞ½‰"ýÉU "ýiã7e£?þ 7ú-–’º™]4ú[ΡÙV`HZ£IjSIåþ¡äN±Û™…BŽ#ýq˜˜M%h^MÜ(b]¼uÝE֙ªáP‡9˜N:œQ*å5%¥ZSêTÁa@ˁ½É"Õ-¨Cæ%ç©cBö×äUž½íÚWºXÁU=z˜´ºeQrb[R[Nfâ½¥N˜AÿÚ~ ^Bßü¦_þÝóݬ¹Íñ¤ÔÚÙ#󉀓Af5©¢+V¦efêԖ‰%5uÕñÞïmèœpNÓjJp & ˆ¢ :Yrêc>`ð¥åmêmf§Òå¦Z ¥Êý¡cÑæ*n'wRœw¦ìé™Fa{>yF¢yžgµ¥'Ƨ#Î'}F›}f!~Ρ~îç£õçþ'¨€FZ‚ꁁª!‚.(†¨6h>(„F˜„N!…š¡…^(}e(n(Љ–¨‰ž(Š¦¨Š®(‹¶¨‹¾(ŒÆ芊ÀȨÞ(Žæ¨ŽÞè%ˆ6á†n€ ì‘ÿ©‘)’&©’.)“6©“>)”F©’ÚÀ H©•^)–f©–^i”Iþ(i^Q™–©™ž)š¦©š®)›ž©xéH‚iŠi›Ö©Þ)žæ©žêé›~é‚Ò鞪 *¡êšöiœþ©HÔŒ©¡>*¤Fª¤*¢¤œþ  Nª¦n*§vj-Uª?^ªfª§–ª©žª¡‚ª6ŠêÒ©H%o±#Ù@;y  8jÀ´IÁWˆÖ{±Vf-ˆ–H k!‰_¡ª³Ö©ª^#«Æ ÎÔœ­6«"µTJuWKÙRa ‚hÔè|•Vw±>9*"ÿV<À!Ñj¸>+¾ªi´ºâ´Â`µÒ«!±Ó!uA¡;í’tüêqÒ¯rk]¥Th+  p֘Æ`’–ºjì.5ìi¡ë ¬@ÄSj-•!uUÈnÁÒÅêÁÂÈ:l®2l¾Nê¾®b¿¶à¿"ÒäH¹­ZHÀH…• ØëqìnmRKAUT±«"5•Ë.9%K¹ÀpiØWkñ– $ínÀ-u@aÙÜ®m^ÁkՒӲÂmaéÁ,oR¯’mH“ËÊ­°Wئ–Ë&WÐ -œZª¢b'A5jÕæRaUl!uÿ½r-:lËÒ>}+ÜVn×>@JT·’€TMìWiêN•T=@¸Ê,׎. ¬ÌÚ-KñíV!W=Á=qÀÊ®`Q•éÂKqÖñÚÒê2nã:®Ÿ&èÑÒèŠÕ]…×ÊÓÀëç¦ÖnÒèfﻚmSݕq}ëqiUùZÕ-¡¯WÕn¸ÒÕê.½¾ìn f¸&,9 ï.±«Ý¦–ïÊ.ûîÖ½>¯¤m$íþM¯!}«õޕL,­Úé^mkïޞë!ù.Ë –ÿUR`­¯»oaÁïnÁ-ðýêÕ­RUa…ÕRq-úú¯Ù° Áê°C*;¢ëÿ/WjÁ¬ܓ ï’ÜʓÕ:°O•²ð—¬ÕâÕnÁ,h•À V^¡0éÂmöŽî óí:Sa®I ¯o§ìç•ÿp¤ññýý+SÉ-ú†Õœ”hÕ.Vy-à¢ÓÚ~ïrIHU,÷ V+UW ®?AbÅl$“ó­ Üò-`­­h½°-¬W ×iu÷ªÊ²mÁaU=YrS‘ÔÓñ£Ú1âññÑ) Ü–!R؀êÒ.R«î0s” ¸€Â¦¤Ô`6k>qæjk>Ùê“5C³=ýj3gî˜n/ A^©Ó:i¬IIÕ1+¬7ãSÅêÿlJ=€$ó˜Âë³!Uó¯Š3-×ñã†jäJæäºë>w*úÒÿ4ªÚ²â²ñ‘*BojAïC't?¯ê?+åN´Foô *t2ôð94G4IëkEKëE'TF—4K·4™z´‚t≴K×´M+LÓaJ#ÔJß´Oÿô ä4Ê4âÑ4P5I õuá5R?õD+µ$îôAõ4T_uTŸ4¿R5£ 4V5-Ku2µÓ95XŸ5¾Šõ’uә5Z¿µ©ªõ+ruAY5\ßõ©Êõ²µÒ¹5^ÿ5?G¯€ú5`6¡ê5òuŶa76Ÿj5ÑÒu@;6e1d'ÿ°d”]W6gç)bocf Ôfw6i·ég3¡bSc—6kOØi'ajG ¾j]É*.ÅAð⓶*’ÔÓ­~U·z—Wévkïókør/7s7·s;7<·tO·rÿXj=_kVy5#u»*s%eU<…ºZ­wUòTqwqçëq˘Bp×|멅Mè¢Öõ˜Ú•!eVÐTà/IÁ¬^…sJm¯H¡ëöòU‹s8*–þŽi0ºF8àÚÌz”^õ²^͓Tùn>¯ÖzCïúÁpã҉£iÇƗê>Umo“Àˆ”WGmRGµÖ $3rÑ+Ël=ýÿq4‹uÀJ…ԍoño‘wVå8ïNìkßf XA>í`5øˆv‰ÃWŠŸiW±øuß÷d§moyk啌 –ïÆ ü·G™íIå8ò¶oÝú°-u  kVH]Ö*²^ÝӛŸ”ÈÚïþVÉb¸°Zžo¹ ¶7†™ø`ՓRó¹FybÉpÉò–Ù2×Äòê%É­R—¥k¯>Apõ–?µ8™k¶Òyjî~«,^ÝRh/>ñp;•“h‘on'wúR쮎G­m<ñ®2•7Õ¨­ŸS=3—=Cz¡Jú…Qº ú`lfQøñÖóûVp‘û9ÀêÿR˜£¹w×·†¾ºhçÕ±"rMûKé\o¡+×Tz£Ö8õwriî=¿mk¥”¡'—]m–¸jÕà®ðI]ÒK“"z°Â¬ Ä7¶Gúe·›-)W: 32KÁ*½®û&eUS%V;•Ö`…9;3¼‡¨¼åë!ñðVù-̊•÷ò-= o2«o³"îp™ÔÛÚUoْß:úÜޓÕBՎ/ÕÚb°®ë¸æ’Óo<ÇûàÇO»³ kh9;»_«Žc°ÊsյƁË_뽪 Ì<Ö<@Q.Ð 3ÏZÉ6, szÕì.i|Ï"o·ú¹<‘pz-«áþÌ"~Ãþê|3¾ÎÝ=×ÿê4æg¾,Ùƒý·£k•{Õ>]9ʧoL¥{ÛG¹J‰kÜ»ºäÂzåÇ~%i{„ù,¬°&×íS9æÞþqõVîIkÉöVa‡ÂUÅA9ݪ܇)݇ÓhË~ìÓ~}ù&©« >ÿœF?8M?õs½õÓö‡·ó*÷cª÷ø‡?¶ÿ|•¿§¦ÿ¨®¿7e4K¹,š—)†wí¬»?@ 8`Aƒ&T¸!BeôD”8‘bE‹1fÔ¸‘cǍ|…9’dI“'Q¢äã‘eK—/aÆ´XFA*2+nè"‰ ]èiˆ0ÎÁ3º”iS§O¡F•:•ÿªÁ‡8±fÕº•kW¯_Á~¥i“«N. ´d$žòÖÊ 8om B‚. ½|IĉÓáÁ$qç’8cÈܼU!G–<™re‡ÃfÖ¼™sgϟ9Ž½¹Õì ‹åéÒ!d=ƒy`z±â·zŽšÎËw‹º§mø̍ä4 Ù–‘'W¾<ùUÐÏ¡G—>=ºè²;?Ëə3.Îèy`C(’ǃêe«}¶ëì‹žy}û÷ñ+tNÿÿœ©¦Ñ´2+7Œ¯1 lD®¬".ô@jº¨P ÜfìÀ÷Üû0¿I,Q²ýLQÅYäÊ:Òvÿ§A*d«ƒ8tp- ÒZ­‹]ê¬'r{ õòë¸ÆLlÒÉ'—B±Å)©¬Òʈ^,p'貃´Úz€„Ó±¡ƒ1ã¨pÌ3$¤/¸1óŠ£0Ò2ó­Øüº5(ùìJ)¯ TÐA¡Ë2«Ò&#ÓÏEmô @ TÒIµ2+D%ÓÎÑM9ý3JA UԎ,Å ÓȔêTÕUóƒtÔWa¥´T™NeÕÖ[Wu5Ö]y­r֘JÛsC¦RÅÕØc'Óµ×e™ýïW˜JSt'òlè‰óÍV[¨”mÖÛoA{ö¥Ò訃b·MWÝȺ×ÝwÅð:ŒäI¸3ϽЅsτÿд8ŽZsá\×`mۅWá…c×¥Ò`ËN(2»P±¼~|ïÅrë /™Õ„.Ùdn Ñ٘jÁÓ, ÃØ:¨—¾ã2Yç\?=ÙçŸ7J™%D;°bIðΰâ $زkÚâX°éÕ".wç«7%è­Ú#D÷s0@*ün'9”¯‹Š¤h›óÅZîEµæÚnw½îQÞJ¬®~‹­#>³.$êºpîÅû¬ûîǙ͛£Z¯ƒX …6øBÒfC¨ÙÇb#”öP…AŒ ÔjXÄð dˆ×Úáÿ†¸!=ðh[ dàûãÀœ`'=™ŸúNX´iKc‚÷÷% 4È5O8¡ ò‚¡£¸§B§ ƒâÆ7õ†g\\:à @í(‰é‚ˆÿfãÆ3þ­'|O!]à UL<‚ÏŸpG8ڐpœ™ºC¿ŸtÒ:¡™ÊF¶ÌÌc¨¼#—„µ:Ûa‘–VÒ"E $ʟXˆ54òK/ÝhéAI‹!a|ôb@×ô<½yÂl¬ ”O6Í57¢‘üôpCÚ(*(=!H{†ù˝THCÖ4MÙ.´6 m¬LÔÂR‚C&!¡KõÔC<ßMúX³œSlxf&žÐͲ–eÑ-'’K‚ÄT|æ[ޒ³k=¢rÁ!‘Â6¼Åc¦q&*jI~JAÊq4Ä2j)hÈj(z'”ÞÈ,ÚêEňKLoiÏbʹÿ—„LéüàSÎìœiMBÂjP©¡1‹xÔ¶ É<‰æÿ\`˜Ç|•šzèjc¼éÌ3( `s‰COÐ6-ŸÌô@FêPaF¯bšë}c˜…ŒÄ£ ô gœØbl5§Öå8õ:Ž´è#׸Ú°ÍNVCI¯üy/ªSõ,uªr¦I…_szFä´®™™GD›ž,mcǬdo §¤PN¡|„¬àšcÚP’‡yÀz^–ñXµô´BpÑ ¡£ÄE6M;Žúhf$¬&šÂ.;+µªercÁåQѠˤH~'/À-Ì@?_gÉ F„#vŠ×; ÿü.Bú‰ï¦… ´D{vðè¬Å™Ï…n˜Ÿ/hA/:τ6ô£YRgE3šÒNÒ3¤-éJoÚҎÆô§1Rgì€Ô¥6õ©QjU¯šÕ­võ«akYϚâÖµ¶õ­qêxÔ½žÈ—™@a›ØÅ6ö±‘le/›ÙÍvö³¡miO›ÚÕ¶ö±{àkm“ ÑÛöö·{ýep›Ü¸w¹Ñî»[Ýívw׺ýnyÏ{tì¦÷½ñ-*{ç›ßýÔ¾ýp70Þ7øÁeUp„/œá¾RxÃ!ñù’Eâ·¸~qoü"çøÇ9îq¼â"'ùÉnr”¯|à*gùËùM“€æ5·ùÍqžsïœç=÷ùρt¡èE7úёžt¥/éMwúÓ¡u©Oê6ï@@;PKôåZðKýJPKÛ°-AOEBPS/img/mbmkr.gifM(²×GIF89a À÷ÿÿÿ€ÿÿÿ€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€ÿ€€€ÿÿÿÿÿÿÿÿÿÿ`@wOŽ^¤n»}Ҍè›ÿªÿµ"ÿÁDÿÌfÿ׈ÿãªÿîÌ33GG\\pp……™™­­ÂÂÖÖëëÿÿÿÿ)ÿÿRÿÿzÿÿ£ÿÿÌ"31J@`Ow^Žn¤}»ŒÒ›èªÿµÿ"ÁÿDÌÿf×ÿˆãÿªîÿÌ3M"f+€3™<³DÌMæUÿhÿ|ÿ:ÿW£ÿu¶ÿ’Êÿ¯ÝÿÌ3PmŠ¨Åâÿÿ3ÿ3MÿMfÿf€ÿ€™ÿ™³ÿ³ÌÿÌ3Mf"€+™3³<ÌDæMÿUÿh:ÿ|Wÿuÿ£’ÿ¶¯ÿÊÌÿÝ3"J1`@wOŽ^¤n»}Ҍè›ÿª"ÿµDÿÁfÿ̈ÿתÿãÌÿî33MMff€€™™³³ÌÌææÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿÿ3(P7mEŠT¨bÅqâ€ÿŒÿ3™ÿM¦ÿf³ÿ€¿ÿ™Ìÿ³ÙÿÌæÿ3Uw™»Ýÿÿ--ÿDDÿ[[ÿqqÿˆˆÿŸŸÿµµÿÌÌÿ3&M3f@€M™Y³fÌsæ€ÿŽÿ:ÿ«WÿºuÿȒÿׯÿæÌÿ33MMff€€™™³³ÌÌææÿÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿ3M&f3€@™M³YÌfæsÿ€ÿŽÿ:ÿW«ÿuºÿ’Èÿ¯×ÿÌæ!ù, ÀþH° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ%È0cʜI³¦Í›8sêÜɳ§Ï›. þJ´¨Ñ£He.LÊ´©Ó§=5J•êÔªW«jM™a×­`I~­86¬YeW¦=ËöâZoÛʕ÷aݹxÞ-¹7¯ß‚qûþ @°BÄó"~™¸qÂÀŽ#\|²ä°–;f¾Œu)粆þìrtFÓ¤UBNÝØ4jÖ(_[” [¬çڃ]‹ž‰ÑpYÞ»cwre¸Àwn×me¥Ã³Òm¼útۇo¸ù7täÛ¯þ®üv‘º‹ åJ^ý׫ïÕ }¿¼r«Ôó{Ý86þøõÿå×}òxß~úxœTíýç߃“¨à„¥7!m·( }jçá…!a8Q}ö-xZƒ$nà€ú‡^†ý=ÆŠ¦è^„-–"ƒ57Ÿƒ*NL?Æh¢Ž@–']’ú^aw‰H—@ eŠOZ ^‚Tv "…BRgc€Nj)¤`«Yœ•ÄIg&”ó-‰$—\Ž9ޒcºÙU–hòø¥œCÊG"›Az7 ‹7*)¦yo&ꠝ ¶dg Lb‰œ£ž·¥†Ž.º&£rVz)…2fG%¥–’9jª†Fˆ(“þžÞ j“‚®Ú܉³Öªê®©Šú˜wхºá ÒÙk©ø©É«Š¾®x°¹*&¬Í2ÛWšFj­®Îþú\°Æ~Jí±˜ÞÚ­Ñéª-™Ð ‹ uïÛé£áµIg¤,Mªî¶»^ éœó†+브2ׯ^0Â[ڛa±GÞHìŠßµ{o¼³%è.ÃInì1ÄÌÎYßÄ!ïë%§¥j²¯ëRû'È"‹›§Ê s—0ȬòÛr=’*mÇ0¯|­Ÿ{¢‹jF \ò¿Fr¼ðÑ'_¬šÆ»=­³­HÎìsÓ;³ŒµÏ·W4Ö-ç §²K{ÉuÚ 5À#ò¼é¥z’|eœ†jéïþÆ4óšÜÝU“v¾x¯g&–²ëòÞxó6 —YíÃw§› ‡Šy¦–'—ÖÚîE®7‘‚#ë\Ƹ$eDu­žº¹ÇþúÔ¸’5;_Zµ~{ʦR¾{l~RäúîÃ;¤ûïjù>8ò؝ËüYÅÛüáË­Ÿ|ïîÓî|üòƒOúÞߏ»úúïO~ÿÍ;+¾î¨}<`þˆ–2P3Ý{`á'Aò¯‚3B ˆ² ^Px´àÿBxº’„È£‚ *d˜Q8Ryڙä“.镜 ÑYٗù¨¢‹^fI\—`úIьd"X¦Ao¦É`¤4’'£Fýi'†&™§i|²¦§¦ú™~ªÞ—e«ªÚþ몲š*£fª i® RÊ«5>JkYôšyÆîÙ`©¡çd©Á6:¢n»ñ6ܕ²byV«ÃÙ'í´Ï [!„Ù݈cvå^Ç«¹—^6î·srên¼áº'ŒòJèè÷šŠjHûþU´ Ù plù.”iÁ”õ‹Â÷2\R½Gy0œ qÀ›ñ°?[ñnjvܱȲ lòÈB¦,'É,kZò/ûòÌ!ºls˜1Ÿš3Å+÷Œ²Ì@Ǹ³˜CýîÑø«4½H7½ðÏP'†óÔ?mõX5g É| vØbMvÙfŸvÚj¯ÍvÛeèvÜrÏMwÝvƒ]ÑÝzï¸Íwßks]4×î.¸G„.Û׈­øâøî8MxGžóä”{fùå4‡­9˜wNuæ ýùè‹mz×¥§7ê¬+<öë´¹.;Öµï ùí ë¾4ïçî;ð¾×:ü¿Âë~|ñc*/oòµ;Ïú駺¾ÏíOø~ ñ÷>Fõïu¿íùoºÿöý_ý¿¤09›MÉÌWšN&þ 4xaB… 64ÀaD‰)"„XñàEŒ9.ÔØdH‘#G~$yeJ•M®t f™cÒ¤9@Lœ9qʜéófK—(…5z©Í¤K™6Íèôd͋5sVÕ(ÕæÕªY•n…Ú±èW±c†%{­C³D}¶uûn[®[a¬ë–nV¹Z¯¶Œûp`Áƒ¦5œvíaņ“lL±n^¾^•N¥ì5²Ýś9w~ÜtÒÏ!GGŒl¹§U͖UÏm­5tlÙLK϶-²6ÇÜ OsM͓uðßV§î¼}9éäËWîÆèü9séÓC§~ýòP됱w÷Žtû÷þäáM‹7~ýTñÏþt,< UÉÐCùLTQÇ}ô(F«„QRH'µÑ¥*ÅôÈM;ՔÓPYuTðH=u#Oy¤ÕVGtupJÑ`õ?ZÝÕV‹Êà Ã\u4ÕWÝJ…PÕY vKPnٝâêÙbiCvW`©ÕK2Ԇìm²¹` PZuŒ°rÍ=ÝtՍË[×îÚ«2ÓÄ̯uí½ß¯ÕUÖý rÞÌâm-J‚»Ü7!€þH° Áƒ*\È°¡Á#.„(±!Ŋ3jÜÈQ!DŠ ùq`I‘O¢¼x’eǗ0cʜI³¦Í—oÌ“§ÎŸ@9¶L¹2¤È‘DQ*i´hJ¤A£JJµjPŸ?±vÔjµ«×¤_ÊK¶ìF®6ÑjTk¶-L¶nãʝK÷,U¸ñÖÝË·¯ß¿€ê}[spàÈ+^,ÓðÖŒ#KžL¹²à»-kÞ̹s[ÇB3{Mº´éž˜i‚>ͺµkʫ׊~M»¶mØ©gƾͻ·ïª»1¿ü»¸ñã_‡KT¾¹óçÐg_•½ºõë ™;Ôn»÷ïÞ¹3ö¯¼ùóÆÉ{¤Ž¾½{Öê³³O¿¾æøÉã·Ï¿×ýÍç߀î`sª¨à‚uH~ F(aFLUhá…f¨á†vèᇠ†Øá„$>ç t'–¨â_):×âŠ0Òõâq3Æh£Y5—ã<&×]€OUøà…ØíØ㑹Ae’Kþhž‘HF K<)éSSàA)喢©ä%Z*&—dâԝKL6y”E–馘?Vœèùæ1)gytžg'ž€®—S`U‰åwª(‚å¥Y¥“Y.*©[Ž:I$¤ˆNª)Y‰ºÖé¦x~ ¨¤þw£¨¥–þ 4xaB… `øbD‰)V¬èÐbF9vôødH‘#I–$ˆÑdJ•*Q®tùfL™3i֙æŒkþøã‚<&¹æ™U¶hŸK^Þ×^¶þ ,hð`€ƒ 2$˜Pà‚…!Bœ8p¢E/r$˜±£Åˆ7$©ñ$Ȏ)6l)ð¡Ë˜2gÒ¬ió&Μ:wòìéó'B  a~DÒã‘*ªüXôäHI§²”J5jT”Z«>µ S(Ø°bǒ-köìϯc‰4iêR¥\KÒÝ*wå\­oïnµJu§Z´‚.løðÙÀa¿†$™´*ܼG!ǽè8¥dÌL)ãå©1èТG“FûY¨Ú¿–õþ}\q²^…S±Žtm·µ[Û°ëz.íû7ðàžZœt×á2+oîü9tœÌ{N<ºÂêØ·sï.\»Nðþ‡¯{Yþ<úô¤ÅKWûøò组ï•~tûø÷óW¯Ÿæý%& òàr‡ ‚ :ˆƒõ=XZ„Zxáb‰°!‡zø!ˆ!Š8"‰%šx"Š)†ˆ!‹-ŠV¡|ÇÁè"5Î7£{2Ú¸#-âè_C?ö8$‘ßõ¨c‘I*yã‘A.ù$”å ‰’Q‚¥"–Yj¹%—]zù%˜&×$qVfhæ’3Ny^•hú´¦›9ŽÉc›qfg‘j’9ÔMU§r€â)åœ;֙ ^(è ÝéI§“ I:¤:´a¢‰ú™©¦›š§i¦•>èiA~z˜VŸ/öy*§Œšõ¨þ¡‘’:駟b꬜†ú’¨ºhj©¤Özç}b‡à±r¢ i™09«ëW¹>kÞ³ÕRê °—ëkx©[f·|¹l¬Í^Kí¹¶^;í®èºË-›ZË­³·òZ­bòf‹kº–R»o§ëšZïÀµú˯Aùlïv°Ú¨ã´˜²Ûêºý¶J«Äéþú.ƬBk0¯Û^òÈ *ʹ¦ ²º-—˜ÇžNœ_¡Gª-­¾fünÀ!›³«ë©+s©,;dô¹ìª¼´Å'G”ÓIk,²É3Cçp‡ô‚C»lk‡”úkµÊ&Wöɏ-µØ·>í2ÌPÌ0ÍäÚ îÖ/ꓵÙ_³L¶ÑLë´ÈoG 7ÒTÍfÍY;Ùh¸„Óû7ɀ§íâf.øËlkž°Ü‰_Ý8ZC>SÙs3¬÷ΖKÞ+´öJÞ³Óõv~oÓGƒ;×v÷Ƭ¸§{¨ð¦‘î¢éÅ·Ô{±Ê“…ué;ºsÌ =òÒO“õÛSxü¨)¾÷ٕ¿·ï‹ÂG÷ùS·¿1@þ$XÐàÁ.dØÐáCˆH‘¢DŒ5näؑaE!EŽ$YÒäI‡ GªDÙÒåÀ‹Y¾¤Y“æL›9uîä)gǟ=…¦\tèQ¤0“.eÚ´¥QP SêT¬(¯fåÚuéֈ`½Ö¼XuìٓbÑ®eKR-QžåÎ¥[×î]¼yõîåÛ×ï_³m1¾\ØðCÂsÎ=Üxb`Ç#O¦ŒØdb‰+ÖLófÐ]?K~9:4ÓÎkqš>Ý:)k‚°Êv}”öNÈ·kï&{Ù¥nÞqç^üìmà7N~ËæË¥oDþtúpà ¡_çþÚwÚîÙ9þ+WÞ<îï%£Ÿ×*¸¢ÊõìåWO/­vÀùõã-ÿÜþÿöÔ«¯ íb›Í Ä®Zí1ÆûÓ º÷tÆ¢.‹/@•R,IÅ +vşivùBskýÐGœÃÆÕɗÍ>»e˜Åž9לñè#ß¾—Ãþ•á[ãó,Úk‹«Uz≛ÆÖbˆ¿žúaÇ¿6PkÊ©æzkGE9h»ãÆûß¹C²C~Ûh´ùíÙ^’aî»uÎëÆ[ö¿£ Ü'۟q>“}ºðƒזéá%'~i†·=sę/p°1áŽ÷fÚ©9vÒϝ^uÖ­/[畭g½e±A¿»{î£:X¸¬$d«¤V´y͂ïøêØ G^Òæã—XOÀ=L€ØÒ_Ã"º±©U}#›¼T5»UÅ*|ð*’ùè:ºÍ.WÌ[(ª¢h·Ã]VÂ4µ¼OP+„Ô£BöGÙl-vFh£’)«!²ÀSšÂþî,7졈†5–"FsìY¢ú€h@ò…ˆE”á½’D*ŠHü_½À+~+øÙOËØ;1¦Œ`ÓbÕø÷èîsĒ³æF:ö‹!KðG¼$äBùG‚ Ò!ƒŒ#¢H¶8ґl,ÊÇä÷¾°ryÔÉùˆ(•H²$“$ä@H FB’¥DNYW"%–™ä,‹v'„ýÎräá-9iO~òy¤´¥+C’JVš•¦Œe+!RÌebŖµ!B¢–0ÆŽY)üåbP¨´S•’Te4 9NqÒ²œ«<1•)ÎT*òœ\å9ÕMt²þRžæ\ç!_iÏ|ҒŸþŒ'2ËÉ>Fnr»\¨òº ì( Ÿ‰¼§9•9Nf™øôgFõÙÎw 4­èHÓ¹O^£-éHUjҒ^t£üÔh5ç4äNPA\ãCWÌN.œ¥'E'*Ӑ"5¥É4ªH-Úʙ5©m¦RkJԏª´©FuéK—zÇÙX’Q rœ ó>Ÿ¨‚»ÒPE Èy2³oåªV™ªÕ¢Â®RÅ*]ñÊN–N¦_U'_›º×ÀÂÒª”ŒèZ»ƒÖÓTĝ‚=jbë×¥:«Ë”êd‹Y—Rs³N-^+ÕҎš mlZSÒÄÉ€Ä ™(Ý(j?kUÏæ6¦·Ýlmw›Y¯^5±¦õmoƒ[Ü`þ€À <ˆ0¡Â…8|1¢Ä‰+Z¼ˆ1£Æzü2¤È˜DP€É’+¢xòe˗*[ª„yðdNœ.{º´9“gMš5oþ´)”¨NŸF›² ô©LšK›ÊY$Ö­\»zýªPkB±`˚=‹Ö#ٝiÛ:u 7nZ¢Xׂµ+7oZ¼ùêý ø¬_¦·Ò-Œ8ñá‘{;Þ:@äǔ+G^\9!æ̜¿n9™qçÑ}†&ºíéÔ¬[^ý¶k¸‘eϾ·îݖóF\û·pÈËGkÛôq½Á—;7¸vô”§S{½kö‚×¥ôÎp»þGñ[É4¯Ö÷s·Íׯ ^ z„óEn¯ÈøßÆçÏ]û…·~zî!§Ü‚ÏÁ HxÞYRH^vÔi8ß}˜‚”\X*xÐi*žX˜VúçxÓŨáÝexPw6~÷߁òÉ(#08dŽEúÈá:ò7cŒ>ž¤ŽòMÙä5օ"‹^µ× C%j‰å“FN)¦”eþˆ¦˜dFä™;ºyeœfög^K®if›q¦)à“Wú¹'™# ôeC`–ÕÞC„’¨(I-J¨¢’=z¨o/ *ޜyÂا€vz:槜þ9j…EÞY*žjnØ)Ÿª êþi¦Ä1Xé– Šå(‰’Eº(®»þ l­w­™êªÞ‘º)±jI¥uyZ·j´nrºl´¬"鬴HÒÙªÂJ­s‚–¥°äšl®½Bº«¯¸jnVÊ&ë!²ÓâÈ&·ÂYì¶áŠ[嫬Ž{/±×V[/µãì笂Åë°¡éN¬•»º®/ÄÀrˆ©Á¼o™RÊ/¸ +Û-œ#KòÈøR9êý2RÆòj\ó­óZqÅ¿>ê3»8‡i%wCû¦¸ ÿKc½÷õØtšI.Mߘ%+-µÂLÒl¥Ìh.¹u›D›e3˜‰R:i»¹¢ tړ–m.ÜØí6¨pu‹èÐçŽø%šÞÌév7bޕÜxû-1ß9#ž—án ^ä® n¸ã rÉxg–gÎy‚´vî¹â g¶ùèWnúÍ¢§îXé¬#Žú뇫.{‹µßÞ7ÙµcŽ{ã½ÿÞ¥î²ó<{ÅO{ÞϼjÍ7ûëÄ?(GÖ_}öÚoÏ}÷Þo_®ß™&õ柯yêhÇæ:ú¸éëÕ>üöß_ÿqó÷•ÿýþ»ß?ýa,€ÿ+ õ(@·p ,Ü_¾ÁJp‚ãk /÷À ¦GƒÔ_;¸:Š7ùCàîFˆB~0…ºb¡ QS M†4lÝ ]h¾ þ$XÐàÁ.d80aCˆ%N¤XÑâŅ1näØÑãG!EŽ$YR¤F“5¢t¨2À˗'?Æô¦Jœ%Y¦äÙÓçO A…Ý©Ó!KšHCÍ ‘éŧ¢rœ:ÔêU¬Yµn­XuæтIÃ.Í(Ñ«Y†g-ªåÚÖí[¸q×þ\)µåC¥.QÞÄIs¬Ý¤~ùæ;XªßÃE75LUîcȑ%Cf»±îe½ƒëÚÍ)ö¯ç͜A·ä,š4A››ñžv<ÙõkرIVƨÚtéάs7%m›ñïÏCëÞ=ܲläɕ/N·÷í¼©zƽûvbê+ ·ÙÜ;Þî5™þ'_^.m¨ÏWW_ú9oëíwú¾NÜýwøâÍïçßß¹ÏÐ苯3ùðð@ð€3®ºâì›Ë?#”ð8OSMºéPK¨Àà̸ÃJ3¬±ü®#±¶ STqEïzBÅ¡^„qF“‘¢kä)G{ôQ(# òG²ˆ4òH·†lHI$)lòI(ÿs1J¬˜¤òÊ+­THK,—ìòK0œ2Ì É4óÌ¿ÆDÓ¨5Û “ËÝ,RN:£„3Í:õËsO#/ÏÖ´F?TÈCe±ÐõÒQH!d”ÁH˪ôÒò&ôML;eNSOÓ uÔØ@%5ÎSSËTUmõÕ«¶XmuSXkµTÍYmÕ5V)sÝõW dU•V`uV ,J€eGjVBb‹­õØdŸmöك°UH[†¸õ/Zi_¥–Y‚®íV"o `ÝÁ wØ^ɕ—Yv×]¶Zy«eفô½vßrùUÑÝwOöހ¦W`€f¸_ˆ³m·`Š¿*Sak#ž×á‡;ÎXâ+ÙÉ˵w_s5æ8_ˆÿ=yۉG–G)±å8e–Nç…Òíà™¯þ€À <à Â… &8 `D)¬8qFˆ3^üx°bÑ$Kš< à!ʕ,[º| 3¦Ì™4kÚ¼YP%N‡%vüi±gD"55ÚQ¤ÏLYêl 5ªÔ©T«ZÝùëÕ­\Ofí 6¬Ø±d»~½y¶¬Ú¦i׺} 7®Ú¶4éʽ‹Ò.Þ½|ûú-©7f࿄>Œ8qYÃ.+–ëø±äɔkF^y¹2Ù̚;{þœSjV¢J­–é±&Q¶ [»~͐³IH{–<Ýr(Á q/E §lØċC½û7Iß+ugÎ<ùòàh[¿.y8I•¾ySDº:éþGð¸S Þ¢ÇðAÕ×f¯0úKíØë۟J¿!÷…¼û?šžA浇QjïÙfžw²v_ƒ®•_lÔý–‘R&8!Òi(”tþµâ†Z=Hb‰\€bŠ*®Èb‹.¦˜!†¥ Œ!ž^ … ¤&Ÿ`&I$eûy¸cr:zWš…=>éä‡7*ÇT„E^‰%rÏx!‡GýG¥ý} —Ž˜ešjºõ|ßùHތLNØ$€2¢W”sïÕ¶i ® h f ú'¡†Š&¢u)Êh£0Y©(¤ŽNš¥¤‡ZJi¦&bJ(§š~zŸ§Š j©Æee@ª4µ*KªvFúª©²ºöT«Ù*®-Ùªëc±Î ,¬õÚ«KŢīf¿ËlvÛꪩ;í­D[í«×>[í¶Ý*t,bË6Kîa*A{k´Ö®›í³ën /¼í‚+l¹öyîAêZ‹ë¾ù+í°ïnbãދðqï ÜﵪÎëð« 7/ºžœpƺûïÂwÕóèã˹w÷t»ìþïYÏ7=ÇòÙÓ·lÿ~|„ëåÿ,_~Ü÷õçäßÀûO@”,Á»:PA‘lÂYZl àÊ qÒ0$é’Ä…ÚªB‚<”èÄMD)Å[éAeœq" z!7JQGŽzÔèÂ5Š‘Æ"¤m 9\²D,L²I'Ô0Ê$¢rJ£ R '§Ä²Ë-³¼Rʓˆ<MwRÒÊ2Ë\²Í&弑Ì1Á|óÎ<»ŒóÎ…2Í@¯Í:ñ¤ÓÍ7 =±E==ì3N+ݓÒýpÐL]Ó =¡ä²RE+e”ÌI3œ3Ì'MµNK/éÇLMeíSV#•´P)[}•ÇPAuµÕ`ýt5U/KŠuÖdå³1LJQÝsWO_M”IgouÓSaCEÔLe½±.c›eRNrÍUË*ƒ|TÌO©Ì³Ýi·ÅôÛzDÖ§?KÃ×Þ~—ã—'}IØ߂÷kL`í ^8?‚‹t˜áˆ#“IŠ-6â3¾˜ã¹6·ã•û8D’E>yċMF™åžVŽðå–e.*€šm¾çœuޙçž}þ蠅ºç™>餕^šéî;PKØû&R(M(PKÛ°-AOEBPS/img/atn_sub.gifS¬ãGIF89ašI÷€€€€€€€€€€€€ÿ××ÒÒÿ€€€€€€€€€€€€ÿ×׀€€€€€€€€€€€ÿ×׀€€€€€€€€€€€ÿÿÎÿ’’ÿ¯¯ÿÌÌ3J` w(Ž/¤7»>ÒFèMÿUÿl"ÿ‚Dÿ™fÿ°ˆÿƪÿÝÌ3"J1`@wOŽ^¤n»}Ҍè›ÿªÿµ"ÿÁDÿÌfÿ׈ÿãªÿîÌ33GG\\pp……™™­­ÂÂÖÖëëÿÿÿÿ)ÿÿRÿÿzÿÿ£ÿÿÌ"31J@`Ow^Žn¤}»ŒÒ›èªÿµÿ"ÁÿDÌÿf×ÿˆãÿªîÿÌ3M"f+€3™<³DÌMæUÿhÿ|ÿ:ÿW£ÿu¶ÿ’Êÿ¯ÝÿÌ3PmŠ¨Åâÿÿ3ÿ3MÿMfÿf€ÿ€™ÿ™³ÿ³ÌÿÌ3Mf"€+™3³<ÌDæMÿUÿh:ÿ|Wÿuÿ£’ÿ¶¯ÿÊÌÿÝ3"J1`@wOŽ^¤n»}Ҍè›ÿª"ÿµDÿÁfÿ̈ÿתÿãÌÿî33MMff€€™™³³ÌÌææÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿÿ3(P7mEŠT¨bÅqâ€ÿŒÿ3™ÿM¦ÿf³ÿ€¿ÿ™Ìÿ³ÙÿÌæÿ3Uw™»Ýÿÿ--ÿDDÿ[[ÿqqÿˆˆÿŸŸÿµµÿÌÌÿ3&M3f@€M™Y³fÌsæ€ÿŽÿ:ÿ«WÿºuÿȒÿׯÿæÌÿ33MMff€€™™³³ÌÌææÿÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿ3M&f3€@™M³YÌfæsÿ€ÿŽÿ:ÿW«ÿuºÿ’Èÿ¯×ÿÿÿ!ù,šIþÿ H° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cʜI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“R,À´i…L+F]úT©Õ«XU:ušpêD¯ÁfK¶ìE°MmŠ5˶­[ƒb§F[•nÜ´å>Å;pkߪÿü¾LØ*Z½i ,X1ß­zóB.L¹²PÈ^×ͼy³dɝ?‹Ž,Ú²éÓ71<\šqë¿­ï’抺¶m™kaëfí®g݌isæ{»¸ñ’¹cÿ xõòÞxIÿM~¼ºu‹ÔykŸ:xiîÀ¯þ‹¶yÁíΧGïL;¸pöÄÉ˟0{sé½AŽŸ+]õæÑ'à€+QGàTa¦ ‚T1è vŠd`„¦Wá…¢`†v¸Ñ††(bD Žhâ‰õ¡¨âŠp±èâŠ%¾(#†1Îhãƒ5Þ¨#9îHŸ‚@)äDiäb¶tä’L6éä“PF)å” TÀXf©å–\véå—`†)æ˜Zö’™@Àšl¶éæ›pÆ)çœtÖiçxæ©çž|öIˆW’)蠄J&ši*é碌6ê裐FŠ' †Vjé¥c"ꑦ©)駠†*ê¨~RŠé©¨^Êi§Š’êê«þ°ÆêhÔ Àj©æªë¡.­ª‘§²+ì°ÃÒj+®»&«l™½¶Jì³ÐF ©±µ"»ìµºúú«³Òvëí·sR{k_ؖ›ª¶¡{¸ì¶ ®¸Öš+¯¡êžÅ­»øæ+¼äÎë/¡õBÈ°úl0¨üæõï¼*yïÁGÜg1l1˜Kõ°Äw®­ã*|ñÈ[f¼ÔÆ3åfS+«©²œµùrË3Jq $çlòW(C<óš.Óü3ÍlÎ<4Ð×¼çÍ97½sX=û ¬ÊF{z4Òo¾|õÕJßÉtÓ$?MbÔWýçÔV']´Ú2³]5ËmÿL5Ûù~ öÅbC”·tCt§ŒöÙkc'׀gvà‚¿Ý±Ýw3¼7ßdl¶Ù…¾µÛ‡Þ¶à3Þø¿7úB}û]ù܈ÓéTê›WÞzâ¥× r¼Ÿû;:é‘Kîòߔ{9ÑH¿½ç{^»¼·C•{Á¨cÝ»Zcgô–{Ì/@þÿþ8PÐàA„ .dØÐáCˆ ¤XÑâEŒ5 œ¸ÑãGŒ$YÒäI”)U®dy²€È—$cÆIÓ¥H“4m–Ü)çN8[%Z”eIT$ÑéS¨Q#vYÕ*Ç«Y? 5ÚÕëח\ „å)¶ìYŸ9…Údûs­Ù¯qåŽUº”bS©yõîuHUëߋ~†;×°\²e¹†e¼¸ñMƐ{FN{ØrW¤J™òåܙ¯àÁ€A‡ÎZøòiÔ©U¯f9éfϱeCMújmÛ M³æÝÛ÷ïÖuaÏ&^Ü îÜ[“ÿÝ ÜùsèÑ] ¿kÜ:qäË5f×Xúwðáþ»¶ËñúyÏÜ»[T¿ž£xøñå#¦ný}½íÝܯ{þÌ©¾ð30*ýÜK°»ætðAßÈî@ ûêO· C‚pCÇ#¯ CThA3ܨÁQúI±žZ‚ëŚR¤O³êD´!µË19eä)F eŠk-ƒôÑ( k¼qÉy4q»#‹Zq¬"½"Ò%#£*Iû–¼±ÉÜÀ$­Ç(§Ü ¦ ®Œ M5µDòC/™|r»91"ÓÍSjKH*ƒd Ï!áŒÓF1ǬÓ;@1kq±<¯ì3ËD·tÐ ÍRÑ"ëO>t”QM¥œ”R 1íPöBÒHP?ÍSUþG%Õ@S™C•)X­dµÑNAÍu%. œµÔ[™*ö½_«ÌiW>]í4Ye½Zµªö6h•õóÕ>…4ۚ¤öºko;v p%óõÑn}‚‰ÛtÃ¥±Ëq©=—¿cïŒw_Ԃ±^rï-·*}ù5Ø0¾o`‚Ï-ø`ˆ­WáÙÆ0߈3n^a)¶Îbå0ÖxäÓöøc&yåÃL>¹8CR™ešÁšøeÎb>qæš{&ÊeœeәN‘}6؛ƒÎ/墏vz@ŽÿU:g¦‹}ø鈁žšj‡yÆk­·ÞkèŒÈFôk°“û)³óí£Ã^[ª¶Ù{nŸåžªÞºÍ·1À|p 7üpÄW|qÆwÜpµ÷~¨ï»î¥¨.Ì3×|sÎ;÷üsÐC}tÒK7ýtÎ'”ÁªïEýuØc—}vÚk']õÕÙný\Û{÷ýwàƒ÷ܧÚýXá“W~yæk'¾øɏ·|zê«·Þ*©¡¾ëë»÷þ{ë³×¾!ʱÿ|ôÓÏPüñ*_õã—~kÛwêý÷é×ÿ0í7ž{þP€êcŸÿ$"½&P3àöòå°ÇEP‚¤`-xAୁà­®†·xÕ¦€ÄßÝ@H3Ðþäß¿ <ˆ0¡Â… :|ñ`+Z¼ˆ1£F7zü豁‘$Kš<‰2¥Ê•,[º| 3¦Ì™4kèx‘`ĝ<{úŒˆ¤Ð¡‰ý(Ò¦Ò¥L›:} õeTTÔù3«Ö­ƒýjÑ+X°I£š=‹6­ÚšS«^å 7.W±c¿Ò­K´ìÚ½|ûú]ږê[¹„ C¼‹w(âÄHÿ:~ 9òͪV)b5Œ9sÁŌCv¶+9´èÑMWæ¨95fΟ3²n–´ìÙ´Uš¬:7Ü×°¯öV\;¸pÒ·-ë>¾•÷ï¢ËÝoqÔÈ«÷Tþ;l½Ñ»{:} þõñ@›ƒÔޚ{wõìo®,>Êø꿯 ™¼þ„èӛißH܉4 {)X’^õx~û=ÈßžIèƒ x¡ ÖWV{ªå „"Ðßg%2¶ t f˜Ô†ï±D`‡ò‘´¢{ñ}˜ e¸¸ß‰(RX!ƒÒHd†&¥˜¢€5^XãŒF ©£q<>ècbU֕äpCbÈe’7 c‚`²Èe‘†8¥~Wb $FYjYf‹f¾ç¤‚ô•i¤œE"xf”Ô¥Iޚc š…‚¹¥TxŠI&£MŽÙ§[R:¡vµ™Ó™y2“ž'yºi£|ê§x”VŠiN©^¥i‰BÊþ蓯"øh¬¤Júç©ÈYz¯yáÈ¡­°†Š'Ÿ‰ÎX'Ž–šŸ®¹ùš×ª–;_‚ô9yӝŸ~9§’Ê''·À2ëluÐ*&-Gʺî‘ä–{ܹBÉë\»ß½išðªF/Rédo¾/‹«©ûòû/sÒâ;pÃĽ{pjýN¸°Ã«qęM¼ÇA^ 2mújl˜Ç®ýËpÈ*ï52Ʉ™ì&ÊëuymÊ0Ùì¨Ïµìr\0«š.ΐéé!xé¬eÆ=ËõsX2GGtµF;†´p˜Âl|ŸcáÏg<ê-#´!‰\'$î0„+d¡ s8Ä$º¤ˆ$,!)$Ä(°8þù÷¯À‚"L¨p!ÆB ±#È¢F9MúQ¤Í¦NŸB*uêKœ:y ͪu+D¢J¿^ô v,SªfÏ¢M«¶¦ÕœX¹Â»UìX°të&-»v/ß¾~¶ÝI±§Ü†ÞÅ{4±bCŽ,y2åʖ/cάy3çΞ?ƒ Y§`Ž‡O£FȸñRÖxIÎ-{6íÚ¶oãέ{7ïÞ¾Ó~›z¸áÕ®3?î8óæΟC.·pâÖ¹&WÎS;ØéÞ¿ƒ/þÞyu ’‡VÞ¼ÖìÜÝs¿8~>ýúö¥—÷I¹ëzƒ³þ`|! X "˜ ‚y `A!Ö\Ÿk.˜¡†rÈ¡„ª÷`zþ¡#R("‰‘5¸àc£Œ3ø¡C,&DáŠç‰x¢‰*BÈ£y ¾H£‘G"™äR y€Ž=™%”„íØ£“6"V#†JrÙ¥—ñaáOZiåŽ8¦Xf…Jö¥›o f\RJ4efN¦æ‰í)Xdœè’®·âWjhŽ¦©_†[‚)š¤“RZ©¥—bÚr :H§ŠŸ^ig¨xŠÚèPBª^±Úª«¬&þ&Cû‰fže6y+ŽC¢*㪯¬°OÅÚÞ®@"ŠèÉ‚Z瓲*”ªbÒ²öë°×b›-JÅ^Ç_·9vHí´Ú’[®¶å÷­³Ðž&n]î¾k®¼óºŠî`êÎjêuð’.½ÿ¬–½¦á[pW0òû•µ3ÜðLd°Ä %¬°¿cœ1L³;q·+òb“\ò¶¤¥ë±Ä"/v±É/“̱Ê3?ˆ°Ë0ãÜ°Ì4«Ì²Q>;–³Ð ïÌóÄ@;vóÐK—[´Ñ#ݚ‡ÿZõM+I¶-dLCåôÓøFMàÔ¯*RÙW§tvIz-ÌõÆ(ßû5Ô6MöÚhÄÔÂÖþ–eµÛlÁM°Ü`Ó½aÛó²7Ú{c͒Ù}?v7Izß¹É^¾oá¨fÜ÷äŸ+nRۇW.9މ—ž÷åGœ¹ºao;rƒ~ºê*m-ºã¦ßŽºÚcîúp²#§4Ñ·/^;֖+žuóº?:éô/Ž{Ôcà¯×>ý­iB«^ 'tÃ>娐\2ü {Xœ)ˆçÚa(—&‚Jœ¢ÀšèDöo„TÜb;(¸+Î ‰"ËH‚qMY4œÛh4¦ñ'PDŠ_E¹óáN~yÔáü€Ç8žjœÖ?G:2F&ˆL ƒõG@fIî#$ ¸G¾ r‘%Ô$Z IŠ‰±F×*¤êø9Êå.w¶S%ÛR¹µÇ™Ðr)laâdÉÊFúnþù÷¯À‚"L¨p!ÆB»ù¦f¹»¾îsïhÓƏC\ͺ«òå ] g¼y6綏mû†<}îPèУç%Þþ9ùò›;›¾ðwðd·'­N÷:m̗©ß﮲½û±¡Ÿgž€Ç¡·žFxXŸ-vo’ÕGY~Þ¦“„Ö¶`cÿñÅрš†`‚‰8"Gnø–O5ɧ߅jå”H¿Í(£NÊ#ŠŠç!ˆ?V¢‰ ù܎G"™¤’Áq OR%¤‰R&ÈߒWb™¥†MŽ¥—Éù\˜!iY¦™g‚Ç¥_²¹•UŽ¹‘•hÒY§jÔ¦ž ½i`ŸéÍi§ ƒ^‰§_{îù' qH¨£ši(¢“*ê\¥¬ ©¦›ò(Z—“êy)¦Œf”)§§¢ª”¤ †Jj©®*þ˜ª¬³–µ*«lŠšZ®ªÑÚ«¯Žõ˜ç­¸ÂzX±Rýš¬²2{è°OîªÚ±}-[-­¶> í´}m;µß¢Šm¶?FË^·¦‚›n¡ÍŽ e¹`½Ëœºó*n»ÆËܹôò[§½÷š—/W?›Á#œ°Â 3Ü°ÃC±ÄS\qÂì "ÁbvKÑ^ƒ²È#“\²É'£œ²Ê+³Ü²Ë#;™qÀoÌÕË7㜳Î;óÜóÊ1ËL^Í!uì±ÏG#´ÒKã tÐÒ\´@LS]µÕW÷ìôÓ!F-5Ö_ƒ¶Øž®¹5rCË)µÚk³Ý6sf—‡önÓ]·ÝR; wirþ¿z·ß>¥Þgw¸á‡#¾UރÆ7FŽ'¹ä~2nä$žk±æ›s޹矃q©•s}î¹ žºê«³Þºë¯Ã»ì³Ó^»í·ãž»î(·8éW].Õé»_¼ñÇ#Ÿ¼ò´÷þ;iÁs»mËS_½õ×cO|óÎ7^ø±Óg¾øã“üöÜÿ½Wҗ߾ûïÃÏ;Æèc¥>‘ìǟ¿þûÿ/ý`šü  Ø:ÿýo0Þ+ø èÀê dˆýÔ×@b0ƒâ“àRÁái0„"\;xžÂê‚#\! qWBäƒl! k»Âð2œ– mèCâF†;üÞ‹øà špˆ laS×DÔ!ìuOŒÝeWE "±ƒJL!›8)²îŠäã³8Á-ºŠŒüb§èEþ©Ñ€\þÈ¿4xaB… 6tøâÁ)V´xcF'nôøÑc #I–4yeJ•+WŠYÒ¥†—$cž|鲦L™fŽä9èΞ>ÒdyiR¥>4P‘`D©S©VØdV­·vý8tiX±*súÔ9´¬Ñjךu«nÛ¸soŽµ{e§O)Fµúp`‡X½¾HØpb°x'­ë¶ìc˜lãö”<ù-d“—wv¼ª`Ñ£#NlØô鮋=·ÞüöqP¡?-c¦›™-Z›È÷Ó$å½ÐÞåÀÝ_Ç(s¾†“MxYx)˜àƒ7´¸/ˆj³ŽÕÅVãw_Œ—b .cC&7« ÈvW9KPK69e®RþwWŽ[þùegfJb›oÞïä¯ræyVŸƒ~úÁ¡Y øhœ—^Zê\}toÝÌbΚ¬m«..鐰{asaBW¨sy“lªÇ¯lRwFoAåžþ»¿œm¼;ïÀÅܛoâêðlÁϑðÂI;ÜÔÄŸü¾Æ òa%§œóž<°ÌÛ¼óÒ;³tÀD¿pÓ]¿óóÔ­Z*Ò_¿=â‘'–]u¿iW÷às¯Y`Þg÷Ývá•Ï+vã™D¾õå¥g¾è❟êw1fzúÉQ¿Þ¸«£ïžüïÁ(û¿·'Ÿ}¢u7úüçÅ_¿ýò›Ÿ¡ô³ç¾~¼ÍÇ!ú[mX@ TàØ@>‚”àx?&D€~È^8ØA~„!áIXBž…)Tá A˜§ zdá iXCÞ‡9D¡ _˜¿úMI‡Aâ‰XÄò°‡ É  ØD'>Š8DbÅóC ^‹YÔâj¨ÃùmŒa#­×E>YqŒiTãdF~‘q”㳐ÿ ,hð „ 2lèð!B'R¬hñ"F2rìèñ#Ȑ"G’,iò$ʔ*W²lé²äƗ2gÒ¬ió&Μ:w¢ŒÉó'РB‡-jT¢Ï£J—2mêôéͤP§R­jõjQ©X·ríêõkG‚`ǒ-kÖiÁ³jײmûR¬Û¸rçҝø°.Þ¼z÷òíû3 ;PK©ñXSPKÛ°-AOEBPS/img/r_mig.gif—%hÚGIF89a‹7÷­1ZJc{cccŒ­Æ”­ÎœµÎœµÖ¥½Ö­ÆÞµÆÞµÎç½ÎçÆÖçÆÖïÎÎÎÎÞïÖÞïÖÞ÷Öç÷Þç÷Þïÿçïÿ÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,‹7þ3H° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cʜI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]{u€Û·pãʝK—.Û»xóêÍ9 €ß¿€ LXð€½ˆ+^ ²/ʇKžL¹²Á¾2kÞ̹³çϛ![Mºô]Ì*PPÍzµëÖ°_ˎ]a‚hÓ¸sëæÚw‚ *ü>\8pãď_®øíÝУK_ÚW‚ßÃ%DÀ¾Ýúuëݵþcÿ.<öçÓÓ«_¯³o„÷ðã˟O¿~|ôìóëߟ²ïƒÁ`  H`‚.蠂àÇ߄VˆQ_d¨a†lèᇠ†è€„–hâ‰õÕ@°èb‡+¾h`‹0Èâ.¶¨ãŠ$¢è㏪ãCâ8d ¹âI&¹¢“D.Écd@Vie~}- å–\j €—zÉ$˜av¹eW¦©&iY*°€›p¾ù& Ð9§›_Úi§qö¹šk*hb}%€‡&Š(¢tÒy¨£u& )ŠV 蠘fšV¡†vj联~z`§¡ŠZª§^ªéª¬~Õ×þ À*k¬´Îjk­¸Þ:«ª­öêkU¯ ì°Äkì±ÈËë¯Ì6K]í´ÒVKíµÖf‹-µË:ëí·AõeÀ¸ä–kî¹è¦[n·à¶ëîMâúeÀ_óÊK/`õÖ í½öÚKå»Ü^`úŒoaû"ü¯À 7 S_G,1a ;lñÅ&Õ¥ñÆ»…ñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍ8ç¬óÎ<çÁÏý AÐ@ $4ÑC]tG+4ÓK7 õÓRWõÕTcôÖNs=µ×Vg-6ØZwmö×g‡MöØi—öÛj·Í6ÜnÇM÷Üvç]÷þÞxó½ößr~·àz÷m8á~®øà‹.xϐG.ùä”Wnùå˜g®ùæœwîù砇.ú褗núé`‘ê±>•ëƒÂ¾•ì$ѾºG¶ï”;H¬ïÞí¾3´ûð3ùôä~à@ â?ìª÷Ÿ<¨Øc_ý t½^ï~õÃ_ˆÀü%€ìs ÷×@ê‚<  2Aú¯wÄ`ÿ2H  5hÂzpƒà˟ÿ4½¢…Èá ÷·Â>Ёþ ì¡E¸@ Òð‚ ÙáG¨@~ˆB¦UèAwÉ?ŽbT§í,¥]Z“–J2˜ =$MMJϕ©m'7›*˚vó’6}gJ“*ÉzšÓ~è éSyªM¨ÆSœLUª;ZÏ£Zõ¬ùDêDցž“¬mgVwÑ¢¥p=àLwÉÕeª²¤v%½ÈÈ{ v©¯L+V±WQb Ô®ëDì9éMÊÚ³±W j%;Ú^Ö0|]kh;‹Ù“КTÕþ¨4ÊÚÇR†=,iƒºØŠâ’w%!jZý}’‹¯Äá&;ԑ µ·¼)ŸEþS¶'d®M=ZÂ뾔‰WLn?§ÛÑ!þŠÇ ¯y˜Ùh"7Œ-'zÑ©Þ,F×µŒýëpÃøFÞ¨G<¥y½ËYðj—¨g d̂—>ù¹DÁ'ù­ûj‡2°.XxN⃻á DÂͲpÎ2DÄU11êVÌâ»øÅ0Žq~úšBEÅ)Á1…tü½*ÑØÃ&áñe)ÜÖu¸È%q/î¸gT¿&Ãûôf”Ç)d§ü¸%UFrH²\×ÓÈ?á2FÄ|<%K9~³Sêþ)*À ~²¾N¤,jÃ5³ð»ÞE"5kH/Ò¹Í~&ðd;ø?êZ×¾B,ôzÝ@ßÑ1ís¡oøÝj•ž/jMÊEÇ·‰ L#¦•;ÒI»U¢2´ó¼ÞF3׊ÜÊaCÛQÚ¢1›xô3a YËÊt«cUçDQÚFPËÓ´¦e^e+XK®6ؑ…6ªÕJìÑS—•}6‡ álO±Ùʾ딩Ì~Ê·µPìµ>Ÿ:^¢v§¿þªI«kPŠv·ó6k8÷ ؚÖÛ©›k:©ªÒÙÜ«’=öåUbævÜ¥õ7«ºÆ¸ª5¶a-²'‹ÏaSœÚ?®¬þÕLÒg•Žùå-¨IÜïk?4ßÎE¨k«ŠÖ¨ÎÝ>àEñ o€Ï³Éw`q[sÿÊܙêú£7]Xëö·¥Ø>9Ðñlrbû§|.úB-ÞZ¤ØÑ6x¹A®n*ß{ÊG;؛®õd_ÝV]¶V îs‰gü­ü.û4Á™tVvYáL‡£Ç{íí¿WêÔÖëàg^ôªų„íÄéÛõ¨kÜÞp»h¹ÎNÈ™ò]Ï'mwÛîÓÚóƒ4yäÛ;ض¶\µD¿í›ý½Ï›KÞòo·ö­Ußfãž]¥}wæE.ëWËYÎåÝ ýìLïê»±pöè~+½g1=×¥._F—þkà”#8»snnu¹ÿ\”ßÒìݽÈÕ+×V›wöx&~s­/úó¦›Ô•æ=É¡OrÓ¿Öý %h®§bæwÄWöx)–H2 ¸mHdq§=TJa ƒ“wÛ¦€¯£(c"8‚$X‚&x‚(Ø!˜K±F+øaZñ‚,!ƒ'ւÅcPud^FXÑn64h€^eçc=>dødÑHÞs€höƒîö<¦bë„geæ„c†V؃[¶dP˜K_”kn&U„æl–4\‘ÆI0…|´Qà§h‚¤jeDŽf_«æi¢ÖT†f‡†Æiyø^N7‡e(in˜^þ°Væ†\ì‡}PçjÝgj€&‡ó_‚†[d¸D¸Vg{6vˆ‡ŽjVj¥¨‡öW;n´ˆÈ6U(x©õtÕfl7GÏç}*g‹¨lÀG{«uy‹äŒÁèz‹•x¿ÈsXµYã¥I¬˜J÷Š…µ‰…4k€Æq´nµµŒ»xnqÌ#p¾åv(6U¹×t½§§{dŽ§&mµÕŽ¡§at!÷qvyW‹7o ‡øXŽè¸i)vzR§•Yr·z<8|ÿ…„õH‰`•s•ÇKxGWÇoVW‰÷Ȉÿ،ñֆ|FTÙsŽw¨sYgv{uþõ÷^‰p™HXÇV=µ†'çt˜‘Œˆ'TgŽ ƒ7ép{wŽ¾˜Žj·Žþ{œ—‹g”@¹‡bV©yÿFzZ&4™x#I’‹wtG‘‰U{»¦Z\Ö”ÖV–U)“o)â6‹Ð•ŸåyÂLJ³˜ZpÉyù啊µ•¸È—ùøŒÆ¥[ê痈ékÁô’dåY¿·o¬÷zw¹’\õ’L9z··—Ë֑Rùzƒ)IZ¸È;â‡hÛEŠjÉi÷›¦¥iW¹šB©YÆçäEgTD™ä%\…ˆ’%E~À3œ.¹›jˆqég“Õ[ܧ}4‰›®Ip¶‰U~ëwœ,þD4G›€ Š¨Çÿžo6œÉ‰|¾ù…#§2 &O 恬҅îɞa؁c!Ÿg¦)ø e%ÃrÕÃû©a)8 Z z š = _y º:6¨>5–cڄ¨…ÿùšªÙ’ø|¾W˜ƒ¹ƒº…šŸOHd¸ô€ããŸü)eLx¡ãˆe©…¸õ %&…êÉ= Z¡Kè£óy¢5xDŠ…ÌǓN$ˆHw¤Ÿ†Kg~í_¬‰“‹–ˆ“tEKJ‰e(_ŸØiq¦‰=نzÖ{Ÿè‡ix~Yt‰Òg¥¨øD:giizFFi4}əS’(ˆpŠŒ™x|jz]y†£)Šoþº•µ˜ò†ã–v¶YeNj­(Œn‘ä•kJŒÖ(‹¥Ž¿×S…JWšÄ–·˜hXN^µˆ!G=¼8¤?¦©Ó،„$¨JŒù¨¤š¨{—Ÿ&6 ^o˜‘fIŽT ‘H˜]©v¢II•õ¬D¹v¦JsSÉl•ÅV~’ÌøkD¹xŸ—x’…«@™¨)<$¦›“fcER,išÄª”+g‘Í”’¹“®6vìH­¢7”‰Y”t‰ˆ%Çx­—•wS? °U©§ q9¹WågfGÁp¶Úv½h°tex¥ªQØÚ|û¯§ç«ù˜r‹® ­Rå‘ÂX“\¹þ•›•ÌɯäʱOið³Üj«[—àj¬yvMÉq*¤¨‘ɨNɐ©÷®Œ²3™—» š¶Õ—5´b9šUšÃµÐv˜>»˜Ÿ×mGkuT†š—É´·„¬ž)Ž@}8u}©É›éæiwŠŒâjGtÊrežáZyâZÊ·øV½¹ç‰ŠÍ›ã)~ÅYgl+yczž„{™ h§óe~ÿu’Š ˆÚ)›…È—u‚EŠ” š„¼ ŸÎ’e´ê#Z©„>!¢A*¤.ø-ª{3­[°‹>Ž¶ºCº*¼« À¼Â;¼Ä[¼Åû»Õ¡âsƒZŸi!ƒ1š*7ú£3þhº¤Û£ö酲+„FÆ£µ½9d¯:!±àÛ»#J’%*;ڞêKK¼(ʽçû½ô;¿Ø x½01«`xb&º¼Kå‡yê¸l–hgZš[¥KZ}™Ú§c*§bj¦„ˆ~uȦÚˆŒ;¥`$¦[Še*¥ÓËmh œkZÂHŠtºr \K  «Ál{£!Ԝž8Á°v¦œ›§xh.Ja¸ ©$©ÍFn¶ö¯—ZR‹C»q…J†ðçÊʲ/ ¿.n›êk†Ç²ú7²OŒªÉµØh©ÆXĖº–œšŒÙh¨¤ôBQŒs ‰¾,JT+¬s¯É(“Ǫ´ ³`̬þYLÅ¢:–U HüŽµ=Žé‘37­C7³w‰–Ñj³{”…W®*ǓL–+Ñ®[׋YÛs’lš[¯),²2‡’1™É–8•‡wÊß³J÷°Þ:”#l­©®ë° ׏Éź‡}Û~³l¯þËhúÊÆnۜX»°º©ƒ‚Ü“Ïz–Ál°6ÛË×꽈Êʇ ²˜ú®ú…Æ°çËk£}ü´(Û²°•–Ô,¯ãÎìL{_«yÛlµµ –Ï<¢W‹¶KûÍîx¶v‡Ëˆ©kLŒ²̯¤ÙxsçµÃǵ{|š;û™wÍ[»ÐÒ€ó´Øu[„I°9g4»©ËŠÐûìÊm™Ï® þ¸ÑIiÄé’ÚgÏå¤Zy§Ü9›ïçǘœ·é´ä™Rz{¤Òyœ†žmÊС+\Ë̑{‡3<¹êG_~뗞ë}»ÛpJ¯ø—°Ýl›º§S<ܖ¯uËËÛ Ú,¿òË3 ˆ:¹û¢jëdÆ[¤g0kmŠdÍOo½½m}×z½×|Ý×~ý×&âہEXº[¦¼Xغ#‘·ë`÷«e8fb-»@¸¾/×Ç ¤ƒ’› ¬1-]Mâ¿é_â ~¤ü›õåÌ:íÛ¬ä¦ckCVµ<ˆÉ÷Á=MäE^攍¿µjæjŽæ¢kþæÚÌæl çt^çv~çxžçz¾çþ|Þç~þç€è‚>è„^è†~舞芾èŒÞèŽþèé’>é”^é–~阞难éœÞéžþé(h…+þØ9 Ú†Øm^†ê¦ÞêQA«b]ÙqnÙìëMÐÛ½¢Më©ed6£ÓƒëõÙëÀŽ¢ŽÖJ¨c«;…¡¿r®¾—M£¹ÙéK¢Óþë) \².ŸÈf´8§èÖ4ìÁ©ÆÚy8îü-Ã'|Õ>‡J:‰-ܯLÁ`~†¬î% ˆìÚÔ¿½ÔköHs:ÝåÁb»ÒrˆïÞ§"y¥Š·¼=ˆw›îÕ×Mÿ®˜ i:<»ÜèlÚ]²òxXÌlߦ’TLÝìhþŔjYdLÑÎݶ¦ã…,ãʐïÖÆäóœZ©æX¹Ý­Ð¡êÌ7ïP"+óŒŒÛlò>žñy-¸×µ†ß0¯ÌꝙÞËÎáՌo9ëôâ}}»vuœõSßp‹Çô ßaOŜ™jozØzölW­ŸuYeüÙõwÆâüÂ~jÐñ}ÌûM} .öpßÎy\‘¥ÜšƒÉ“+qKuîšvF÷÷ødÿ‹žÞr ‘ÞGÌ~O¾ãÏuà.œô¤»ôMÌU[Þ©ßñi–ª-Í)Δ¯«õ¨ïÜ ù˜©ÄAoâx±‡Ìñ_ÏúNO<ú&•¥£/êîþh÷%Ô¼UüÍ÷RÏôãÉɱÏYmö }í™ÇíqLÌõBoµ¼ÙñºZX¯Îï8Ðɚž[ÒÌI¨ß¿÷*]*§õУÀS2 @ A &<¸aÁ BDÈp¢E‰!2”X1¢Æ…Av¬Xð¡Ã 3¦´hò G—*eRlÒ#L”#KNDirçő5o •‰3¤N¢‡nùóäś;_Šô9•$ƙ9c½ÚÔêǒ5Áö4ú“åK¥"ƒN}ª–iL¯H£®äõ­V«aϪåÛ×ï_À{&\Øðaĉ±ÂTÜØñcȑ%?®;Ù2d®—5oóçËþžA&M™¯èÒ©U¯vœ5k˯aÏîLÛ6aÙ·usv½Û÷ïÕ½cf:|xnãɕ/gÞÜùsèÑ¥O§^ÝúuìÙµoçÞÝûwðáŏ'_ÞüyôéÕ¯gßÞý{øñåϧ_ßþ}üùõïçßßÿp@ 4ð@TpAtðA#”pB +´ðB 3ÔpC;ôðCCqDK4ñDSTqE[tñEc”qFk´ñFsÔqG{ôñG ƒrH"‹4òH$“TrI&›tòI(£”rJ*«´òJ,³ÔrK.»ôòK0ÃsL2Ë4óL4ÓTsM6ÛtóM8ã”sN:ëþ´óN<óÔsO>ûô“MM(PT B 5´PDÍ@ÑF}ÔQH'•´RL)ÕôÒMõ4ÒO- 5ÑNA5UÔS3åtÕQKEõUU[e5UWc¥uÕYa­u×\mÕµW^eöÖa-ÖWdƒ%vYc™MXhUV ªµöZl³Õv[n»õö[pÃw\rË5÷\tÓUw]vÛu÷]xã•w^z뵗\†îÕw_~ûõ÷_€x`‚ 6øàjóExa†vøaˆ#–xbŠãU¸bŒ3ÖxcŽ;öøc„/yd’K6ùd”S.Xd•[vùe˜c–Ùc–g¶ùfœsÖygskæùg þƒzèŽ}&úh¤“Vziyfúi¨£–zi§§¶új¬³N¹j­»öúk°æ:l²Ë6ûìvÇ™ ‘pûm¸ã–{nºë¶ûn¼óÖ{o¾û.—€t/Xp{ _×p‡ Pü^Ä»mœÛÇýU\“ìe;[Ÿ°ört9X€ B}tÒK7ýtÔSW}uÖ[wýu×p\qڏ<\Áo÷Vwqyß÷ëõ}àáÛ}üøÞ!ßwrÊ5·Üyl9÷\Ýéÿvì³×~{î»O]öo /~ÛñÉg·ül‹G_ÛÜ#^ÝñãW^_濽Ü' ª–mý÷¯<Íñ (@ÿõ€þ÷ûþ@èU\×ó^-xA f|¿³–í'<Ú±¯vÂÀAøÁ†p„#,a [HBlå.„'”áW8ÃⰃ3ô`ãj×âðZ8d¡ WÃö 1‡‹³!]øÄ!vPŠ@„á s(Bf‘‰:tWý¼Å@ÿ…±c HÀk!҃àæÂøÆꏍê¢`2xG<求t܏øBJQ& d }XHBòâ$ûªEFFqŠŒ!§(IA’”Ôä$ÍÅH6±Šôä#‡ÂSbrŽ„—»F>sœž=§ÆÒòŒ±ä%á(ÁqQPÃþ$f1¿®H’0™ˆT¦*m—>f¦yŒÔ]ûùÌLFS•¼d6yÍob“šó[¦5IYÉgšó…ØÌf*½¹NV¾Ë•Ü‚%u9Ë3Ú2—m¼eæx‰Æ_¶1M—0íhL„&|œ_4XÉUŠï¡‡§49Α†LÜ&FG ÏI²ÐHä($7ÊNh‚s•\d'CΎJò¡Šiâ®z:ϗ;%(úS_þÓ§Ågôzz.a*T©KõC?©Í†Âs™U'J;‰N“:“›ZÕêTAÚLd~¦êüèJ™yN±¦ó«R…è(= R¯®kžÛÊi‹jןb.‚:íþé-{IT¼t—æª#S {Ø؅µ*ͤ {U³B¶¬µê­éQ%¾•¢šm+J­ŠVÉʔ«œDKEëN·î¦[U"»æªW2ÚӁ „¥`:À Òv¯ýäëw©À‚"V¸Ã=føFËŲu¤–EeÉ*Ö*Q‹«© ÓÇÃm&wÈ½" ©ºÜÉ®u‰}'Z_:^¯Z÷Š–]¯Ånê/`¦,¾ÁÝA‰{ßÃ:õdïCÛÔ^Û¹ÁÊ7ÀåJ*~ ÌTý–Œ¿ý•ÚÏ5_“AX\…=p…š`’-˜ÁPsð†³U` ‡x˜öp‰iö^¯Ë "fñBSüâ‘uøÅ nqþ÷c Å9&°èìkc oÄ)5EË+1 Whü­¦Øv °Ù&ÆA¦òë†ÜÖ¿9¼Q}—ú´Œå>B÷_ϝ—‘ÉÕä§òKÆNãÒV\e8·îÊÙM˜“ÜeàÕYÉwÆsÀ˜æxªùÉér ›Ëʶ—½U´P%6å8GÚtCÆ®t»Ò™†4ˆ¥%¤c-DçŽw£Ð¤â [;Ñ涶»¢F¯I=]]t¾Ú»ç$é¬;Êëj‰¬ž×šuÉW£êŸrÜë¢u;ÔG÷MÙËfv³ýl¼:‘žU)µýØÍï>QÖ`Uæy¹VPnÜážêßZÑórҒÝ^,%þ©MMÒ¦y³v/µØuOdºØý¼«,y4ÔR¶Ú­hvÍiî¬~{­ÖN8\ ÕÔv˕5­™®\s–ƒÙ.m¯ýà}›ž\c>š¹£þ{gØŶÀ]ÞîL›á-§øKúÝt?Ý5Õîk®ðƒûÛ/y·­8Ҩ֚¦Üµ©½×…o¡îÓѵ<ù¡UN´w7<‰1m9+ãÍYwZœÔ¢%øÂÅì ?õÀË^U‚ þç7wÇ_ZvRžá‘c/{×Îgn­ùØƾ-}þ [ÁÖـwË£›j¸RÞæ›ö:y3­ÑŒ²Z½‡·$σ(Sî~šöíEí¥3êúYŸU½¸ÿ=äJºû-~Vžg}õ‘úëÓûj¢·~÷Q†}¬§kÜ÷~ùGþ¡qÞkä7ûÝÿþs±þó§ý­%ûç_ÿÝÇÿþý?.õSô[03;»áô;˜Èé¿ÿ{±4Ÿ“¾ò¹÷!À/{Àó œ£/Ól@ÃÀ´;2ä²<+² T̘̖A³Ñ5Q»5ØÛÀÛ®ã)"ô½î¢¢œ;žóAæÛµX5[Ã4ä«!l“¦Tc.PËAãK§&d7Ss¤þ>4?ws(¹Û2‹ÛBu{¼²*>r㽋 7¬ºÜc7ˆÛº·CoÂ5° C¢[·Œó¶Ë»–ÌB°™··ë:,'…ã*²Á.TÃü'*¸Mk¢œ8 »Ù[ºS3¾ItĈ{=O;)Q”(’¼jõЂ·*Ô¼ãëDO:WÌD,ÜD-¬¼²£³wD˜’8L#ÆTt¹3Ô8q´<䶬£ÄH´Äl[Ŭ;ˆ"EüE`d½-ÜÅ]$3nĸâ˼Ë"<ÛS<ÂCÇWTGu ¸‹‹ÇqÌ<ÓÒ²iDÄÅr)v,Ä»B§þûÆöÓ¡è#«ê¢ÅÜG%̵uº¹èK+T$Âöjȟ£HÌC®™:%‚>Ø[HÐúÄáûÁbt=çrBª µäH»H–À\DÁÑĖ´¿˜8„¹É,›Io¬IŸ4ÁÌI†ÑIìɟýSAÍ¿@TC…¿?© ¸)F¥–Fµ»G]TGTH¥TI­TL½TMTNµÔNÍÔOÝTêUPõTS-UT%UU UV=ÕUuÕDUYUZ­U[½U\ÍÕ# ;PKž°Û•œ%—%PKÛ°-AOEBPS/img/cm_fwk.gif<-ÃÒGIF89aYÊ÷æææÿ×׀€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"31J@`Ow^Žn¤}»ŒÒ›èªÿµÿ"ÁÿDÌÿf×ÿˆãÿªîÿÌ3M"f+€3™<³DÌMæUÿhÿ|ÿ:ÿW£ÿu¶ÿ’Êÿ¯ÝÿÌ3PmŠ¨Åâÿÿ3ÿ3MÿMfÿf€ÿ€™ÿ™³ÿ³ÌÿÌ3Mf"€+™3³<ÌDæMÿUÿh:ÿ|Wÿuÿ£’ÿ¶¯ÿÊÌÿÝ3"J1`@wOŽ^¤n»}Ҍè›ÿª"ÿµDÿÁfÿ̈ÿתÿãÌÿî33MMff€€™™³³ÌÌææÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿÿ3(P7mEŠT¨bÅqâ€ÿŒÿ3™ÿM¦ÿf³ÿ€¿ÿ™Ìÿ³ÙÿÌæÿ3Uw™»Ýÿÿ--ÿDDÿ[[ÿqqÿˆˆÿŸŸÿµµÿÌÌÿ3&M3f@€M™Y³fÌsæ€ÿŽÿ:ÿ«WÿºuÿȒÿׯÿæÌÿ33MMff€€™™³³ÌÌææÿÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿ3M&f3€@™M³YÌfæsÿ€ÿŽÿ:ÿW«ÿuºÿ’Èÿ¯×ÿÌæ!ù,YÊþH° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—09˜I³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Êôf̧P£> ¡ªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û«¤Ê;—êÛ»xóêÝË·¯ß¿€ËÆ¥K¸pK»+^̸±ãljžLy$bȘ3kÞ̹ó]ɕC‹ÎxÙ³éÓ¨S« z´ë×SW˞M»¶m­­aëÞ]°ôíßÀƒ ÿ››·qؾ‡+_μ¹×âÇ£‡Nõ붡Kß^˜:öïàÃþcÖν¼TïâÓ«_Ÿ—¼ù÷0ѳŸO¿~X÷ðó¯”o¿¿ûøé' IÉݤšMxÍô߂à8àƒ!ˆ˜‚§Q…b¡‡!ƒ2ç „ ʄۄü5¶¡`%v¨âr†èâEZeaM2ÒTãŒvQHã…6Vµ#V'úØ#Dò¨ãG)$ŽA®è¤b-¾(¥D1 i%‘I&Y¤–[RÅe#^i£–$Š© ™9¦øäšzE9å› Iøc–¢i&˜p¥™Uvv™gŸ€ªÉæ n¹ ç¡UÉd;z¥’K‰'zú©ä™•¢Ù¨ „vš–¡ˆ†:P•–î‰é¥nØä£y¢ê¨¥_²êé¬ Šj+•aºê¥žv2Z&–•R æ«Äfj,­ÈÖzë²qæjæ¢7^v*¤sJJ)’Ø>z¤¯¨ùk²à®*³orî¹è’5.¹Rš›î»ðâÆî¼¹ï½ð®K/ˆöâëo¸úîû`¿ÿ ñ{S¬ñ_\^ƇL_Ço²È(§GrÉÆþ„A D˜PáB† >„QâDŠ-^ĘQãFŽ= PäH’%MžD™RåJ–-]¾„Sæ̓?ÞęSçNž=}þZ1$M¢EEšTéL›A>…UêTªN‡.ŚUëV®H›VVìX²eo^íšVíZ¶K¿š…Wî\ºAѶśWï^‘oëþXðà‚wùFœØ+aƍ?†jXñdʕQú…œYófÎ%[:1æÎ¥MŸüYôjÖkI£†[6XÕ­mßVúzönÞ½sÖÆ\xLݾGøpæÍk&‡]úÂåέ;/>]ûvÔÕ¯žþûxò½ƒGÏZ|yöíëžO?À|úõíߟu½{þýŏO8üò#j@GÚ!d°Aür0B '¤°>+Ä0Cú.Ô°C?ÑÀß >¼L„)AóëÀÖÞr±-IdqD¯C‘¯úZRÑ “j‘ÄÕSðFm4R@+Ëñ9‹~\¬È¥\mÈ$ODòJõ–¬Rµ «‘Êô¬L-Õúò!(ÏìŠËÛÜ(Í5 rʉ¼“M4³Ôs²9u,IÎ0óSÌÐÌìS«4=K”²?»KPH!ÒPÐmÔ->3ÝëQ@¼ÈS¦(µÓÇ-åÈMS=ñ»HC]þé*ûúšõ¥:yܑ¸´05 ?’†ºNKƒ=ô²#q•U]­sSҔ€ý5Îh]º5Öim5ö(^U Z‹B4ÒKª [U‘UVG8ßlÖn¥ý–Üxy$•%qSÌVXBŸ}WÞ¾ÀöZGýØÚsÏJ·Ó8“åŠÀWŸ4ø³{Z·¯z îuɐ4öÅ›¤Õ^ûäXž·I•9†wã…Ñ2ùßH]~Yf`5æøæÚmˆá„íEÐçÜ`þÕ]~kž·åÜ·Ûf—ÎOVy¥îxi[E”X¨k­:ä¦ï¥:l¨·†wj«S&»k‡ËÛ[‚‹F÷çV­X]à cZiþÍõm¦M%Žj³¥õVì²eÚ¶`nßv;Åa¹6mµÏf{äÊW:óÉ1ÿÛ#¡åÎ7k®wÕzq‹!îwq/ëèb|)öXæ–s…™õË°V|ڒme‚!gypáïî›oÚ­>^óZkßyUз‚¯x c½uÔMo\øêAŽàì«.Üô¤émº\ì1¿ûê¯%7?r·Ó¯þýËÝŸrî~Þ5¦B”žZ¸ó¶œöˆ¼Ûuo|òûÝؔg¿“•/€’ ¸¤ ôëÚðrG³Á9,|ó#`ç:ò¹üåN@ÿ£Èê˜<Ñ=ËuN[™à2ø1Yñ®W|ípV<êMLÞã[И'ÄÆÅ°~³Ã™Ù’ˆ´ß±Žg !a %‘þ‚ <ˆa :|1¢D†N¼ˆ1£Æ+\È1¤Hˆ ‚‰2¥Ê†'WJ,™0¦Ì„-]Ú¼‰3§Ãš:{’Ü93(ž>'ÂZ4)F˜D•Šdê4jȦ8 ½jRªSª©rµùU«ÊšV±†ÝJS¬V¨jŸZl —%Z¬t?ÆÕy–bƼ)ùÞ] ´îA¿>þ»‘-â®o;®*¸îáÇ;9žl™rßÀ‘‘"6¬ù¦âÐ,“>­±lgӛ;R ÐvSÙzAÒ~=ðõɅ°;öÎí{·n¼¨3—^2ë▗“Í<:çÕ3“Ëu ¸ðÊØo·m[ïþÀðÙÉkǞ¬tÀÇ;[›v}óÁҡˏnU5Ý÷è͋OÞ߉7`wÿ`N~ÉÆ cd U+v_j΅f_…¨åG].m7Þn rw]ˆÞ8båÝ&¢„%WUkA(“‹}ŧ!côáwaŽšqØ¡ghàK(`‚åõÇ$€NŽ5’J&6]L.F¡/õHY†ZvieBBYäyJªˆf“ijG’F¹Óo¹·"x˜=T„ îÉgŸ~þù'M€Jh¡†*›Bˆ.Êh ƒ5 i¤’N i˜Aº8bˆ,É'’·×b’ãõÇ©R>ɞšmšçßTUÒ$þf¬²ÎJk­¶ÞŠk®ºî:˜˜§~ ×d³5if±O½ª¯Ê.Ël³Î> -³ú™lµÂvÊ*Š,Ê؍Ñ~ n¸âŽK®¯¾âVmqŸ¢ÚU‰Ù–I$ŒÝæYn½öދo¾¸N{o릋ážìu݉ݽ›žÕéËpÃ?¬/¿yR 0J”^»©±½…ê›ÅÈö qÈ"Lò­OœiÅ? ü«‘=)\cÉ2ÏLsÍ°^œÊÏ}Ú²»…}ü‘ÍBMtÄçÆû³Î{‘Õ¿1¶sÑROMu³'W¬Ò[ ´IU vر^]c[$Å+S@1Õ\“Í6¥œ‰%3¿ËÒ@7í¼Ï/¥NNèÈt©Ï<”Pà”ú³È!jF( }ÒHM ô©œÈ´È¶&U‰RI=ý4ÉNk£N¿DMSG9•ÕVϜmþ  cíPF°@Me‘×]}¥ÖMÇóqÏI…ÓÕd••mÂZ-¥ÉY(£%ÏÒ`¡•[êjØD{,vXa——\ÆnÍ5[Zkœ•Ôê]WVvc­0^d»u—Xd½Õ·Ü~ý¥j[U¯ÕvXL n7XR æv_qyLµÝ{ÿ˜âšWF­ÝMZ5žÖãƒV¸a~w„ØÖp+^™eøfòÖŒç ­Ù¥½5æ_i>7ÑöNEÕá8[šh›NýYh„“Î7èU‹~j§¡BÚeU«Vߥ£Þšk&›~9Tj᣺ë²ÍFëR ·ä4í³Ý~{º2×]{ì¹á¾»\”¥fï¾ýf þ ,hð „ Xˆ°¡ÃˆBœhñ"ƌ7rìèñ#Ȑ"G’,iò$ʏV ¬Øð%Ę,[²\Y‘àKš.g"°Ùr`N™;s¦,jô(Ò¤J—2mêôéH—=öŒ9U*ևVfåJufתPÇ⌸µàMƒiɲmëö-ܸy† j“(U†@ïÒÌ{õ«_>å.]«7¡áÀ„3nìø1dzxƒ¢­|xêẘ7ÿTœæÞ¡¡GëT ó`±BW%:x5éԐgÓ®mûiךV'oÆk¹7ðܼ½öEzZ3òÀX%£æ;8ð¼RoS¯nýzÇÔ5¯nÕö,gïþ¢ûúϹèt¾b÷†þ®ö÷]ç|Ÿ·v½–9öüú÷óŸ˜1Tÿ•¤™bà•u _i…ÕÙ_ :x~ýI8!…Õ øP€IG`Ä9x nç¡kÍ}xàtª¸"‹-~¦ázª•6ck¤átš#¾ö•}"òTœl. 9$‘Ehœ‘I*¹$“C^U“QJ9%… šÅ ol=I%—]z9å–Vʵå—ešy&25'LvÙ·[SdV‰&uÙcr¨‘caKÊi' Ö&ŸOôí6n~ º(£×9ŸžzŠ§¢Zzécxv(bg:õ§„ b:*©F© Ûr‘¢ŠàQ¢¦Y*Ǭ±ºèjd•Êz+®ûѺѮùõš+°Á:i«°Å+寎»,³I&kݳÍJ{l˜ ²íeFb;-·¹V{¤µP*¹m·å–¹#l2ÖX_«––]?RD¬¹õš*tꞧ‡‘r·ç•ãÚ;ð½ð!ÊÕÁœ² b‡Ë ®¶KŒé¤CØp¾Xú›eÀÎNü1£!jº'¿#Z»ÀsÑ 2Ëhî˜ã›ëH{2×qÄ-ë¼ó{áfDî < ½3ÃÙ­<4ÒIûw´ÒMþ 4xaB… 6tøPa‰%B´xcF4vôødH‘#I–4yeJ•+Y"¤8±ėeÖ´ygN;yöôiðåO›4…5ziR¥K‘ez’èS©S©VµzU(L¬ £nõúlX±^µŽµØÕlZµkÙ¶‰ÖíA¸qéÖµ+òe^½{ùöõûp`Áƒ 6|qbŋ7v<ønä¡(W¶|sf͛9wöüthÑ£I—6}ujÕ«Y·¶"yõëÙ·wŸÙÙúsÑVAmuþSX•”ÖXe­Ñÿ^u×A1å4ÎL­µÒ[¥µÖ^¿ÌóTU…UC•5V-M6ÏQ§%ÖTj= RÓ'ÃÅÛNKõ–Q9›m/Õgӊ¶ÔIǽvKtéµSÞHƒ¥ÖÞY…µ¶ÜOõÔÞjG]wÀvÝ‹DB®÷Uk ŽI\%æÖ`rϽøЀù×\»ýa4ž¯aN}½õ\Õ÷ãŒï}Ùܑ-vôR›gö8ևgvUݒÇSød°RfôQ_U~R~YWGµmye–½ÜW`‘3nº[R;¶Xèüˆ.š,ð˜-3è°ÕVml²±JĜ„{íºs»;ºs{:<¾íþÛµ¶ñ®JoÀ ?\4Á þ  (hð „ 2lèð!Ĉ'R¬hñ"ƌ7rìèñ`"G’,iò$ʔ*W²léò%̘2gž$øñ&Μ:wòìéó'Њ!i-jô(Ò¤JgÚ êô)Ô¨R§Ru:t)Ö¬Z·rEÚ´*Ø°bǒ-{ój×´jײ]úÕ,ܸrçÒ Š¶-Þ¼z÷Š|[÷/àÀ‚¼Ë÷0âÄ^ 3nìø1TÊ'S®ŒÒ/ä̚7sv(Ù2èЉ1w.múôàÏ¢W³^K5ìزÁªnmû¶Ò׳wó6îàÂcêömü8òˆÀ‡3o^39ôèÒ.wnÝy€ìÚ·sïîý;øðþâǓ/oþ<úôê׳oïþ=üøò»_¯oÿ>þ£ÕócÝÏÿ?€ øŸ• *¸ ƒ¶Ø`KÚA8!…ZØ߅Fm—!‡zèჴ¡ˆ%šx"!~HŠ-ºøbk*Š(#Œ5ÚxcR4‚ˆ#=ú˜•Žù#‘EÞ8d†H¹$“3©d“QJ9!”V9%–Yx%•ZzùåŽEr &™e²6fƒhš¹&›ˆ©¹à›mÊ9gZq&h'sη'Ÿ}úù'  :(¡ìåI ‰*º(£:ú(¤‘J:)¥•Zz)¦•)§zúi¦›‚:*©Ÿây([¢–º*«­ºJª5ª¯Ê:+§±Òz«©¨æg+®½úú뤼;ì«Â{¬¢§êZ'²Í:+«±ÏJki´Óöªì²Zþ„A D˜PáB† >„QâDŠ VĘQãFŠ9~©1€@’%MžD™RåJ–-]¾„SæLš5Sz ™SçNžqö´âO¡EEÚDšTéR¦MÚ$jTêTª£VÅÊójV®G>VìX²M·vE›–ãYµm!²u[ôkYºuíÞ 7î^¾^ûþµ ¸ê\¼… F\R¯`ÆX7NûòÑĕ-_λ0ÀæÍ=;OäÌy-Ñϓ J6í8uP˜]¿†Í2jéÒ9i¿õX{(iÔm{¯–úøÃÖ±w=[8Fݚs/gØ2ôឫï,Ž\ûv¼Ê½ã íõþâçðCÓþ‰^è ¾† ‚'þFbƒeèa‹ªGaŒ!Føb‡0Ò¸Ž9*†Àˆ+>d"ŠCš¦"ÙèayÆÆߒ7¶÷d’3JYcˆ=þx$CBÙåeFjùДþ½¨ã•fîˆ&“cš)ÚHY†™—^Ò)\œUµ8!l²©gškÖe™Ây'|u"*˜†*„!ˆ.jx¦’û1ù¡ŽzNø¨›>â·hgs&*Yž2z™ šY(£ ŠÚêS¤–ºZ’¬bv£ª†ÒꪮIÁk—·Þ™ë®ÃÎÔk©¿v«WÄ2;ª²Èk`´Œ Û¬µ>«]¶MëÙµß2Õí¶Z›‘¸U ®ºç–»Ó½»Wºê~o»ÜÞÛѳóÒk­½ùbôoo«Åo¿Ì ð [´ïÁ¿”0ÃANL±²C¬«ÄoÉ1lg2J{,gÉɁ,²ÊžìÙF+·Ì+“ܲ_Îü›Ì9‡\³ÍÊñœÛÎA÷ þ4xaB… 6tøbD‰)F$XÑ @9vôødH‘#I–4y%JŒ¤tùfL™3iÖtyqeN;yöôÉR§M¡0[r,:TäQ”JŠÜÉiT©S©V]úkV­[uâÄXªÕa5’»Ñ¬Ç´ev=ûn\¹W¹Öµ{—«×Š`çª ¹ö,`´$×>í{qâªzñ6vüø!ã‰l‹°,Ðre¶9·¼\ösÓÏ¡Ž™òQͤ/‡E™si¥­A«.ytíͲ9Vüxð”’!7ޘxDа™Ûn^YsléËoÇvîÜztèÍqw¼ÝzwþéÛÃs7oáëÙ·x~ü»É!î¾nŸùøü~óCï³ÿúóŽÀõ;ð¾ýÎûH=÷|p.ú䛐‰$tȾÌ4ï@Þ ìPC[C›ÂíµïR 0ÃÜPìÍ-eœÑª +¼G„ld¿ìqÄ ,o:7DOÁ{4‘È#?L/F¥œ²¦s¼’B+rÃ&YL;íºtòÇê„‘L/Ët½©|N“´Ä’NãæDh7Í DÝ> Ó3ñôLÐ"_Üï5U;-Àÿ4(s,ÎJá¼³ÎLñÂ4#K«ôÔMOE­”SMMÕªTF} É7C]þVS=•VžRu¸Há|×^ۛµÖ`1ºÕ×bAâÕØdVØf-*ŽYg¥µHÙj‹vÚl‚ [m½eÉÚp—ý–Ü® -]dÅ]wªnÓ ÖÝÈޝ—"JÙ½w¦xéÕT߆úÝ÷T{ñø&€ Þö±®S`‚káƒVhâˆsløáŒAªØâø8F¸cƒ1֘d´B¦÷cƒR>¾‘K.ye–‘;Wæ}]~¹/ uޙç›7®ݘcÚ1Ÿq–ªg£“&Šhr…nú]£¶)ÑÀtih¨³zZër¥ž:¦ª#ûç®+ìÙ!®Íöök°—º:1²Z[>¸-cHmº§myÛm¬áîï¬õŒ¸¼õv–ï¾ÇJ\¬«_›RÉ ?\XÆYMóÌ5ßY.Ëßòrnr<¡ÉC§ÕóáâŽ+õÏç>}SAבfØáý­u¾àʽñ×m¯Ë¬ÙAžù÷Zy×ý°ã}Œ“©Ç»Þ»Òk/ÞTå±^}wë£ þ (hð „ 2lèð!Ĉ'* ðâE‹3"$HñcG"G’,iòäGW²léò¥@•0gÒl)³&N›sòì™ÓâM(‡-jÀ͘.…dz4¡Ó§R§R•šÔ'VŒIpíêõ+Ø°be^ÍJScW³jrUªµ*ܸO·.…*·éݼz÷B]ëwëØÀ‚Ájõûsc[Ê 3æÈ÷1䊈½®Œ•êåȚ7,»ølåÁ¢7þ¼”åWÓ< #FÌùµ^ϨíÞÍ û6{훵ÛݨgR>9ñË ¹—[Åi9¯mæÒ5Ë6Þúøïìd­Wf «ØÃþo§“7YÝqÈÚå×o>Ï}'ví¾K¿wS~q³ÊÙó§ˆufÑ%`eŸu½á7}Ü!øžOû8aCÿŁEeH!‡"=(œ‚ Ö`‚‚èZ‡)vôÕC墊1Vhbr¡‰(‰Æ}HcMÊø#D0ž$$Eî¨Zˆ7Ž•ã‰<~æc‘Q6–\DJ㑦%©dXL“§wå•TÆe%™‚¹Ø–\¦–k†ÙݘiFÉâ™vêiœ†µéfZpÒØ眂¢·ç^©‡¨„®õ' Û Z¨Ÿ(2š(W‹^Z&¥†fixžÖ×飖nªb¦šžj$©ðijþ—¢:ت~¦®ª&t·ÞÙ*¤€z‰$­YA©+Ÿ°{,²‘{ ¯6&û«–Á‚gë²HI{-©hV»£jõê&´Ob»µËv;.ºÎAÖU¢ÍÆwl¸l¦Ûc¹Äž;/¾6ñ…»)Þ;í»ÆÆ«Ø¿qÖ«kÁù*ûD§W•øĹ_ÏûïWܾüÅÑoÿAïNƒßÌõ«;ßý­Õ§_Ǚí7÷~¾¶U)ýýÆ~ÿKYþ¸!þ…)B·3`¢¨š>°RŒ`{xµ¡aŠ‚œ» d&ØÁeYðƒõ›Ó1…-'dºKŽ­ô0 §„ á ÑV²*ð„1zš»d¼”;ÇE«M°»!ávȕ#âPH:L"{H¥ BÊi–9’¤t§Ÿ%êxO”¿‡:/^/ŠFâ[§¨åPU‘[²" Áø 1~)ŽÑãÍWFhé F,*ZӖö)8ÖQnxd!SuGCPðâÛ¯¨H‘ˆŸB¤×ِ-^òA$ÌdVø÷*:ùq,*l¡ØFØ))‹œôÉ'5éJ¢)–;"ÜÝÀ%K Ւ!›Ô%ɦÆK[ Β[Âå/þ(hð „ 2lèð!D‡&R¬hñ"ƌ7rìèñ#Ȑ"'(Y2"ʔ*W²l €À˜2gÒ¬ióæÀ‰8kêÜI³§Ï B‡-jô¨L‚.—2mŠÒ$Ô¨R§R­jõ*Ö¬Z·rí*Õ)Ø°b#ÂDjö,Ú´jײm«t,ܸ½Ò­k÷.Þ¼Uåòíë²lÛÀ‚.Lø­ßÄrõ2nìø±]Œ''lø2æ̚ #¦ìÙ%äТGCþlÚ¯åͪW³nm³óéØIÓ®m[«ìÜaS»îíû·`غ‡/nü8r–¼3oî<¨ðäÒ§S¯nîòçÚ·;~ý;øðÔâ«gçnþüjïã׳oïžoyôòçVÿþ>þüúƧïÿ¿Yöí7 ^×€ *¸“€:ø „§!¸ …!†jHلzø_ƒŠ8"‰}xâ‡!–¸"‹"vˆ"ŒÛ©Ø"5øbŒ927£=úØŽ: é?y$yC*i^‘H:ùäpA.9åeMBy%–“II%—Áeù%˜Qv9&‘ašy&‡dª©š•hºù¦‰kÊYåHuÚy'žyê¹'Ÿ}úù'  šÑœ…z(¢‰*ºès;PKf-ãA-<-PKÛ°-AOEBPS/img/con_ia.gifm’íGIF89aŒ‹³ 9^IZshehVcŒ—«É·ËêÑÚîàâäÜèøïððï÷ÿ÷÷ï÷÷÷ûûûÿÿÿ,Œ‹þðÉI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ Ðe(NŠ†£Q‚d.MgRªœBŸÑ«5ËÅz·ßª˜J֎µàô¹«.³×awÜ,oÓïï:ܞÇÏû€‚|ƒ{†zˆ~„i‹‡Š‘…‰’ ˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ H° Áƒ*\È°¡Ã‡#JœH±¢Å‹A±£Ç…þd…d·‘c¨™Pª*Yò£Ë—³Ȕj$­‘6KåÜ´3UOg-Oš„¥¦Ñ£ªrþÌ´ÔNTM›êœ†²h–˜Xr¬:T¥VOEÃnÛkÖ W‡nS«‰mV¤£ÜÂõ¤”éLL3i2m’f_½|Û½{oaMy뵉³ðߞyóU<˜±àZ\Sv=«9mg±@sšyôfÏÇäž|ºõܶ¤_‹ª;yoíº€s×Þm[7mÄx?åý×6ðÝŃã6NK´UΦ?— ==ºuÏh™©Ž Öµlµ[e×L¼wyåÇÑ®þ¼ù½}™Çg~~þrø»´zuë|ìÙ¯œXþUhú™d–2á±vÕ§Z>÷‘\di&VY^¥µ]Bì)æ˜{óhØO>vØ{Ê)qœHV¢‡‹]6KV7à†ÐYGàvÙ¥¶ ‚ü±dXog…›™d[¨ýødî¡8Ùo¼Uy›p5‰"dég–ëÙò\i?Š¦ag)Q· „Ó èä~Ɯ¶ …Bèd™wâXi*¹&“FBDÛ õ…È"”ÇÝå•ø1ڞ•¿):%}±Œ!xdf`k^Èæ§Õ#g‚fX&V’Õ£G|É䙥Võê“<¨"e†*㈉žˆ˜‰õÙ*b‹ì­(,¯î˜¹Ö þ¦êjŸ¯’ŠT«sÎú¬µzŠ7¢ü˜-4lŠ¦oJKn 0ù íºÕ²{§¶éP¹·Ý„›¦…xžÞ¦—ÂeVªŸZHî½ðª#oÁ'¬ð 7ìðÃG,ñÄWl1¥>Á"ÕÅw O‡ ¸èx\NUÞƧ¬²3 ‡ÙâÈY¾lr—+×ló2+Fy¶>VY'–9ö¡Ð~ÁˆñÍH'Kc”¶|›‹4;:)|PV¬ÒXgmˋµZ)u®2K 6rÁ¢¬u+¤­öÚl·íöÛpÇ-÷Üt×m÷Ýxç‚÷Þ|÷í÷߀Óò°ÆŠ|¨±‰ —sâ'7z¶- !9è=ùåþUaH‡ZT¥Ne© zÐÆt–ùdESy*Ñv’¢Q}§&ËYQ”–Õ¨](ñT´ŸM Xô{Š¯Þ*׸^-®v}kØvu¶­.óŽÿ «T;úH`…Eˆ¥L³ÊÏ[úS¬+í*N½JϝN6²˜­§fk8Ê-9l÷{Trªäny–t¨m­Bú¸Ú¨°õ©@‹A—Â1¡Œeªc-ÊL`┙™µ,p}ªL ZóžÇ”íqWþJXšvMj¤“—–GΙjŽCíj¥IMÚzWW€¤,Åé܃š÷¼è%(ºûÝö’ˆÒYŒ³ìŠö¹©Mœ}éJ˜ÍñUkìu¯€¥çJYŽw¦š@ pÃQ(` <à[8‰jå Ϫ ©ç‚–fÖmÜ~ Àúî°Âön ŒÛ…Æò)Œ±ŒalõvÅ)Îqø2Ìaû~¸ԍRˆÉöÙ¯õhYñŽª@;0‚sž„àdY@Án蒷,J Y”9–ýöǵʀlú²Ï‡èæ*™ËT€8ðDNÙ`qžñœç+ۘo†sŠs‹þŒ’.ôËÇ繕ÏÎ8ÀÛð6?gقŠV4¡aèC3ÓÕ-QYÔ¯vo¶›,>Ç÷ò¹8ғ¦tÛ,}c-gΛ6F§=M‹“þ6ÕQEu}ËÜ©>à‘Œc'èbÆZÖk3ì¥oé\óú[öYÿ:Ã?ŽõˆnŒ±xåhg*¯-èN7ºÙ&íZƒšÚK¶öµë‘írš:غŒ'rG Øfbt¬ÉM#±‘¹>Û2±ÅR.¹խîh×xÚðƵ—ç z/×Þø&;!êUËv\³ç$¶dÓgðÛÁ™Pl£Îð´!áϛHtÄi+ï›Üb®±ØuÊ,Nêþb÷–ß`5ë¯Aì ý{%§r8QŽ‰+獊äo¼txÆ$hw€ÐŠãx¶ôƒçØJü¨ŽöÀŽ¡Ö7Og{¸tõè}¥j;Æ{Î&ŽÀˆhæøH”Žën¼FÄeïX~gt§”{³×SH'„ˆµti|þˆ‘-Í€n›@“®Ÿ€“óæ‘ejîx‹ÂÅx¥Œ™ø¨’&þyÎE “œ%“Ì`“™ •¶ “צ÷“BWlBI’lǐ!™’9„'ג1הN‰OfÉÁ3x˜pùQ8i•s‰ êf— `“wÉ uɑyɑ{IJ®‡‹Ü¸•FU’`éT«${ɋ×s‚û¸”²ÐŠi¹Aè"¦]ŸEd¤P—x陟I—š`•Sù—¥™—xyš„´}gdDG÷“e”™¥˜³i‹®i‹ðƒ”+Y‘À—^¾yP녖•™V’¹…Ùõ^3 :陠‰š¤ùœ|‰š§¹œ£É]ÂyaߘAoǒ ¥` ¶Š¢ð`6‡.9œYœCFbfìٙŸùž¥ùœ þÐ)õ¹š×iaÙù‰c¹›‘ |c36c ”G‡æ“虃’’œ6螩éœÕyŸžÐœÔ)*F”9XÜÇHÉ› pgUö@´Vž ª .s_Ç©(§e6¢ Ÿ0Š¡2£ZŸ/:£­—Ÿ'ú˜ºé{Óxg.‡gzöJX† ;ú”èù‡«'f„8}—¡Ó闤ù—TŸÕ‰¡y£Sš£/y¤à՟IéˆMkïWiEj¢^úŠl&©£iJ`º w¯&im³nnS¢gÙ¥oj™ ʦôV‹ÜWjÜ&p?p¸‰›T„\§F@M6¢PVntºpðm/E‰{zAUè§ò0˜þ\ ’=X&¹¨µÉY‘ãuÖl‘ uQ•j¤—ªP©©ï€•é©ÛˆKˆ'P„ ‘˜ªvóh.öJ’Êrñw húª°Zœ²Jì{O婀Փ~4j×ô}ûÖN*HåÃÜÊ­˜àà®àêj ÷ttg§r÷€˜°¡ÈêE±º¬ì@‡ú}·H›èԎö¤{?¤µÇ«¹­ÝÊß*®áJ®í÷tp®S瀖ڮŒú®ðªf{¶×ÀšûpÚÖ[¢~Ǹ÷Jp8K~þj=Ö³x+®zët+8¶KrK¸ä€´ *>äÃAÆ7*ȹ›’K ºë¦oª@þ©lÄA „Oø†nH ä¹²«û°­ëºë»inKtp.ÄAk؆º«»qø»Vg¼ÁK=ƒK¼Ò ºæéF½IPÀAÈ7“¸Õë¹Ã‹½å ½ÃɽIiQþ¶ ¤˜Šò{ŠàI¾å˺èê[™Û)Š5u¿Ž÷¹ùÛ †{\@'jPE¯íÃIx«ÞSr&¦ÔÀ'À¼ i[«†é˜>—A ,O“ëHyX ¨rJŒl¾ì´ JZÉÁ0dpW¢ÿkÅøûÆé0±°§Ç@WǍ‰¸—v`µvyTr&ìÇkÜÀìHX,ÈþÚÐÂS;ÇU‹Ç' ~t<”ž\`d)ÉLIɕ|CŒÉӐÁ.ÜŌËdœQ²<Æ9·—´b#*ÁœÊîzɬ\¸€ÚšŠ [‹ITüŠNŽì¸‘u­¬q’¥ËUÆ˓ìËàÌÁ\ ûKCû™‘Ç6¢ú½«< ۜ´nœÍÂPÎ\ÃÃ8gpªØ̉¨\ÉçŒÎÀ Îœ­*&gu¬ñl øÜ®õlϾ9vНР½Ð ÝÐýÐÑ=Ñ=΢`НѽÑÝѽÐMÐÊPª˜SÒ6ðÏ´hÒ*=(-ÒÌ80Ó2=Ӏ£74}Ó8Ó7íÒ<ÝÓ>ýÓ@4ÔB=ÔD]ÔF}ÔHÔJ½ÔLÝÔNýÔPÕR=ÕT]ÕV}ÕXÕZ½Õ\ÝÕ^ýÕ`¾;PKˆ „}rmPKÛ°-AOEBPS/img/atn_lms.gifJ'µØGIF89aë^÷ÿÐÐæææïïïÿÙìæææïï€’’’¤¤¤¶¶¶ÈÈÈÛÛÛíííÿÿÿ3Mf€™³Ìæÿÿÿ::ÿWWÿuuÿ’’ÿ¯¯ÿÌÌ3J` w(Ž/¤7»>ÒFèMÿUÿl"ÿ‚Dÿ™fÿ°ˆÿƪÿÝÌ3"J1`@wOŽ^¤n»}Ҍè›ÿªÿµ"ÿÁDÿÌfÿ׈ÿãªÿîÌ33GG\\pp……™™­­ÂÂÖÖëëÿÿÿÿ)ÿÿRÿÿzÿÿ£ÿÿÌ"31J@`Ow^Žn¤}»ŒÒ›èªÿµÿ"ÁÿDÌÿf×ÿˆãÿªîÿÌ3M"f+€3™<³DÌMæUÿhÿ|ÿ:ÿW£ÿu¶ÿ’Êÿ¯ÝÿÌ3PmŠ¨Åâÿÿ3ÿ3MÿMfÿf€ÿ€™ÿ™³ÿ³ÌÿÌ3Mf"€+™3³<ÌDæMÿUÿh:ÿ|Wÿuÿ£’ÿ¶¯ÿÊÌÿÝ3"J1`@wOŽ^¤n»}Ҍè›ÿª"ÿµDÿÁfÿ̈ÿתÿãÌÿî33MMff€€™™³³ÌÌææÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿÿ3(P7mEŠT¨bÅqâ€ÿŒÿ3™ÿM¦ÿf³ÿ€¿ÿ™Ìÿ³ÙÿÌæÿ3Uw™»Ýÿÿ--ÿDDÿ[[ÿqqÿˆˆÿŸŸÿµµÿÌÌÿ3&M3f@€M™Y³fÌsæ€ÿŽÿ:ÿ«WÿºuÿȒÿׯÿæÌÿ33MMff€€™™³³ÌÌææÿÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿ3M&f3€@™M³YÌfæsÿ€ÿŽÿ:ÿW«ÿuºÿ’Èÿ¯×ÿÿÿ!ù,ë^þH° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cʜI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãʝK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãǐ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cË6 vÁÚ®âÞ­Ð6E߁ÜcñˆÂÇ­üøìçr™”^uyòéΑg‡xÝ£õíڃòoÿÞºù¸Ô›ƒ‡*<½ÌîÛÃw8¿÷øõõÏëëž:qƒÿ©÷@~0%ç›m— þ)˜[¼•'ÒuÙEX^„ÿ%8…އpn¨á~$VÇ ƒË‰`Š:ɇâˆä©'݁,v¸âzåW#yb"…ø½Ø`ˆ%ù„( h£Š6âHSŒKJØ ’4RY¥”NfTߌ4we”Qr àŽŠhe–F¦9’2VÈ#ïÕØ!vbyЗsb‡çG[:‡ç—òљ§žžX¦™j&š›mzù&šq&è yv÷§£>ç䤜:*¨·©¢˜ˆ6þЁ 4xaB… 6tøbD‰)V´x£Ã n `ÐãÇ’ÌxR!G„*ªd9Räˁ.E¶ŒIÓ&ʕ5gÎä‰ÓgN¡Ca5æM¢2u6uújT©S©VµzkJ“IovµIóãÖ¬™"úìY¯I‡•Š6-Û¢HYÂ]Ë´ìܺwóê ÉSëΊ€Ç6|qbŋÿ†ôÙø±c¹‹ö…»´&d½š¹šì‹²±Ý­—¹Î¼$aµOκa^× gS¶}wn݅aw”|úñîÔ´*5[Zíä¯a™[eí›t[ŽxÅR¼Ü4Éڃ‹«öít»pþñãɗ7=ÃðéÅG*ÓífåvSƒ]Ï~ýûù÷'î?½Ð¼;é7‚Hë-»!{À|»O±8‹êÂãrkCã*üÄE‘Ä#bPCë­, M|Æeœ‘Fª<+³Õ$kqÀ}üÈ …Œ>å£ËÈã”’É&|JòFã°Ãºñ¨(µŒR,õ–´(³+#«;1O,ð52UtÑ94i3ðËüp¹)k »-õ„²ËÀ²¤µ‰(ÜËMAÄhÐ0 UìÐëtAìpª®»ú*ÝÓ!§3S:Ð8UïS¿Š"ú^ É0q3õ¿?5E5þÓXùlî¸Mµc®HwtL´5íS´¾#]Ո0U …î×à Ö4ʊ\³5^•BóV•[=75(Öè¬3Z\·­³+io¤4Re¹Óê\BÍM6ڒØÄ°Op;ó¶Üß…°ÞlýåRÕ 8P;•‹ÊNWuً>3X؄VŽáU#-8àÍŽëߎ=ö/Ðf%ÖK$M&ŽÊçÜ£ÐEër×xE¬_gõÕ,äøt†õãž}fŒ³fǃeSYј•œ÷»VÉM:e¥b«vK6ºè•ޚkÛ4rdfkõ0>eûiD‹E;؈U[™jz›æѬîï¼{›v`…'¶k+OF˜/žK½ÔT‰Õ¸b)/9g° כòÊۜ›èq¥ƒXcZï}:ϋ/lÖá9i¾ixAçV·CQ¼uÜèöµœöÚÁ|»Ü¾Ý£”õj#ó•ñÆGåÛSÞþã>}'hås^rh㶝úê­¿þ!­±ßžûî½ßiôïÅŸüÚÃ/ýôÕ_ŸýöÝþø域þúþèÀ <ˆ0¡Â… :|1¢Ä‰+Z¼ˆ1£Æ;zü2¤È‘$Kš<‰2¥Ê•,[º| 3¦Ì™4kÚ¼‰3§Î<{úü 4¨Ð¡D‹=Š4©Ò¥L›:} 5ªÔ©T«Z½Š5«Ö­\»zý 6¬Ø±d˚=‹6­ÚµlÛº} 7®Ü¹tëÚ½‹7¯Þ½|ûúý 8°àÁ„ >Œ8±âŌ;~ 9²äɔ+ƒ €9³æ͜;{þ :´èѤK›>:µêÕ¬I[~ {c´kÛ¾;·îݼ{ûþ <¸ðáċ?ŽÜw€Ø̛Kœ<ºôéÔ«[¿ŽýørçÜ»#„ž=¼…øñä˛'¾Ý»zïàÏ»?¾üßé×ÛgÞ~¾þýüûO¯_€•åç_ˆ €.>a„å)È`…‹9(a†nh…~h†ŽHb‰µybŠ‰hb‹.>ˆ¢Š2òÅâ‹6Þ8_Œ3îxW8þäx:òH¤\>‰d’Ò Yd“kþôàA D˜PáB† >„QâDŠ-^Ęña=~RäH’%MžD™RåJ–-]¾„SæLš5mÞÄ©’ Fž=}þTèPŒsEšTéR¦M>…êN†T Z-ˆ¡Ö¬>¹n¬øõ¢X‰d#@›ÖìÙªDJ…Wî\ºuíÞÅÛÑ,V‚|~]K@_ˆT;<ü¨ÖÄO|›Wòdʕ-_ÆLPDþò?Wìp¿[ 8a$ñEëÑ1 wä±GÓ LEg2Æíl42H LQÁ"…,ñ9(‰D0R´³Öcýë•NYßlµYfeeÕÅOLöV‰7\q33vOñ²ƒNNïP#ÎÉãE°³ë8%Dë’ó³yóœÁEÉbì]{¥´×ß°ÆE8a…åjM°²†8b‰'ta‹/Æø¦†)®’c?y1º((L’I^ å»ÜTù¥–OzY½˜eÛØã+CÆ9g «ë¼™1ôY*´.£ðg§Œžmèbwfºi§Ÿ®x® Åœú)Ž:$¬•Úúµ«/¬j±Ç&Û4»ÞòYi½Ò*V¯ØöH­”®V[ £º¶Zë¸ëþ¶{è»ã¶ÛmµáÞûëÚèžïÊÂ.»qÇGmå’¼rËÙ3ÜmË#ûyp½-;YóÉ7ÿ[s´9}t¾có$Å)crÙg‡úuGÇ}rÛAÇ=ñ–ªN}²¢ƒ/ÝtÊѦÜøä“~Ûu°i‡>zé¯Â xÝy´¾xšç~q7—¿þxñ/÷|Ö»~½Ø§g¿ý¡v·)í3×^]ý·¿ï»~‘¬Ï]2Ô —[î´W<ÎᏰáüªç>6i ¤É×6ó}Î$ $úPV¾Ê!/}—ëÑBõ9Є'ä53ÂÐQx, y·<vp|½ãžÉ5 …?}âûª7AÕUHDô ÷—D#JNƒ©;é6×½ÿ D…Saâ}D.v±(CtßèÂÂݯn-CÜþ2HD+Íoô _ÿÇ+æmŽM<œõ¸Gžel†j$UÛ#H¢9e‡Dd"¹HF6ґØôéÇ’d’4×%%þ(hð „ 2lè0a€&R¬hñ"ƌ7rìèñcLjG’,i²`*W²léò%̘2gÒ¬ió&Μ6SêìéóçN B‡mɳ(Ò¤+ žlê´dDR§R­jUªÈ§Z·BTêõ+Ø°bǒ-kö,Ú´3™rmûTâÕ¸rçÒÕÈÖ-^¨j÷òíë÷/àÀ‚³¼›÷ð¨u3nŒÕ0âȏ®lù2æ̚7…,1\Ç¢G“¦èùs^ʜW³níú5l¤§Q· ]ú6nº³ioUû7ðà‡ÞÍÛ©íÜʗO5~ü¤oâÒ§S¯n}çs¼É™sïn7»Ûèþ×Ǔ/ožµsð·{oß>½ú†âÏÓ¯oÿ>Yøñ²w~û!4~x ‚2(àdsõGՃ=!FR¨ƒM˜ ‡zhނ ^èшº±§H梀~ø"Œ1ÂÆâ~%rd£\(V¤#‰áxñ¹(#‘EXêý˜‘…<‘Dp…%ŠQZd¥iNBù¤„;v™å’!ehҐGšy&š`%™]˜Úeš—J™%œ\&‡%—_꩘msîéؚϕ™&¡…zS ÇµyQwêùå”qú™ç¤^ù¨ŸŽ2–(oƒú)¨ rJÛ¢—º)©©‘Ö9i¦©ººêþ£y.6*jž†z+®GÒúY©q2ú*¬˜þ©ª¦Å¢ú$”[n:&I¶æú,´î*Y¯uþzl°²R '±ÀZlµ72;’³Ñš{n}ÓF®¶¾~›mŸÃfû.½­º‹á¸•‹.¿ýR§.huMh­¬|\i¼Zk°œ ·‹o¾ íë/Åϱ¾&&Û§–Q±Š­¶o·å”c꤃Ëg1Ë-WpÀÿ=,óŠ*Kì2Î9ÿóaì6w/ÍÊñœšÎE½ÙЩy—lÐÝ%­ÝÑQK-ØÓá5}5nU×65×]§¥umX‹ ¨Í+{}6Ú_Í•Ïc½voiË=·Pp÷æ6ÞqÙ­ÕÄtûí5@þPÐàA„ .dØ°a€%N¤XÑâEŒ5näØÑ#G‚EŽ$I2€@”)U®dÙÒåK˜1eΤYÓæMœ9uîäÙÓçO A…­²äQ¤G!~dÚÔéS¨N&¥Z5áI¢YµnåÚÕëW°aŎ;ÕêÙª–FeÛÖí[ŠjÑÎMKÖî]¼yõîåÛׯJ³t\ ×ðaÄf¼ë_ȑ%O¦\ÙòÏō5T›Øóg·r7¾zÙôiÔ©U¯Îš™ôæΠeÏÖ(úõmYïæÝÛ÷oÈ®q7V[Üøqäɕ/gÞÜùsèχ× ÜúuìÙµÛ>ÝûwðáÅþ‹¬¾ÝüyôéSwßÞý{øsË«§_ßþ}°ìãïçߟÿ|üp@eÒÏ?Tð5 tðAé;pA +´©#ÔpCw‹îCCqDK4ñDS$±C[tñEc”qFk´ñFsÔqG{ôñG ƒrH"‹4òH$“TrI&›tòI(£”rJ*«´òJ,³ÔrK.»ôòK0ÃsL2Ë4óL4ÓTó>ÛtóM8ã”sÎ×´ËÐsO>ûôóO@tPB 5ôPDUtQFu4Ð ï”TÉ<µôRL3ÕtSN;U4ÒIC-²ROK5õTTSUõPPEuHRW•uVZkµUÐV_Õ5G€þ<0  Áƒ*\È°¡Ã‡#JœH±¢Å‹32 °£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cʜI³¦Í›8[Ôȳ§ÏŸ@ƒ Z‘cΣH“*]Ê´©Ó§P£JH´ªÕ«X³j¥htª×¯`ÊK¶¬Ø[Óª]˶­Ã®fãʝK·®Ý»6ѺÝË·¯_žpñ L¸°áÃ9õþ]̸1ãÀˆ#KžL¹²\Ŏ3kÞ|²åÏ C‹Í3çÓ¨S%ͺµëוM«žM»öÏ°sëÞͪlÛÀƒ7ÆÝ»¸ñãÈSþ. ysÇËFç °sç=OoˆóöƒÄ“‹þO~÷rÅߦ§¾½{uëz·_½Aôñ×ßÏ¿ÿdí ÕW_Dµwß{ ¸Q€U)È܁æç߄VX˜lÑéÕv·qØ¡†2÷܂è÷a!‚7âƒ^w›z+Š8¢‹øè¡‰ íTà†î™Xã‹÷ŸcŽ>¤DúY¨ä’L6…á[8‚xä‘Y¤}Ff d•YöØ!„^Ry¥Žc¹â|D~i¦–/J©¦˜"æx‹8"Ùäxæ‰Ô“ÜEÉ ›d–ùç”R†(˜~v9¨‘^–HhšuºÉ(¢€V:%–—²)ŸžœvêéJ|.H)¦ŽJª©ŠŽ:é¨a8㚉þj:§u®ºå•·Æ ©i~êë¯À†*]¤¶zè£rÎ)¨¡2ÒY(¬ÉÚj¬–h‹«{b9뱤. Q’À†+nÂ.ÊkªªJzí²ìš‹î¹±N‹l­^Š-´¶bªâ¶ú~;î¿S`šêJ«m­ðâ{賺.Œ«¥Ù6\o½Ž¶‰o®ªFj­wìqrçu'²n2û0¼\š 'ɂb¬¦Ê*?L¯¼ÔZùîÆånúñÎ<ç–!A¢ØlÐD·œiÂØéøœ©´‚¹4Œ&-£½MËÚ'ÔcuÁèö«sÏ`‡ šƒÂ•möPàŠ­öÚs‘}öÛpc”vTͅT7¹žÝýÚuÊ¥Ý4·YîÑßx¹÷ሿնÞ1^žs 9N\à®’åc1.¸@aN—ቇ.úm‹;.ùx|î9a%¹ºI¯¥ùà´Çøè¸ç>‘íGÕ­9å#ç;𪟎nFu®7߁Ï|ãÏó.UçÓ^½ô™ë®ýö.>ñœ'ýaë}ø–!>çÕ³ßþ@ç»ûã?E½üóç_¿ìÜ÷Ïýþ4¹ÛòÄg>ã°+,àD’¼4P~›£þæ@¦¦óÿþü˘Xé[Æîw,–µ¬LàqþòàA€ D˜PáB†  QâDŠ-^ĘQãFŽ=~ŒHÐáH’%˜RåJ–-]¾„SæLš5mÞęSçNž=}þTèP¢9EšDšÔ!DM>…õéQ¥U­@YTëV®]½~VìX²e^E[•©T¶mݾÅH5íÜ¥fíÞśWï^¾}ùÊ¥ø!\… 7,X1V¿?†Yò䢉 °öðf΅3_]0+eÒ¥MŸFz«åÐt5w†qëУUßƝ[÷nȬi§}-[øðŠ¾_µÍ[ùræ͝ë4~ÜjpâÕcG—®4ùsîݽW=þ{ÒÌÖÍwþ<^ñvðíÝ¿‡OV¼z¤åÏßo›y>ý’ìãÿ0@mڏ¿þôC0Ad°A„0B %4ð2ÿÄ0C á+°B?1D“.Ü°DOÔ­CWd±EþHD1FgtLEoÄ1G×hä±Gõ²QG!‡$r!D2I%y ²H'ŸÄñÈ%§¤²Ê•š„2K-=”ÒJ/¿ôË-Ç$ó·.ÁD3ÍÅ,³M7wT3N9cdóM;ïqN=÷Ä°N<ÿ¡3ù$´Ð'D4QEe´QG…4RI5´RK/Å4SM7å´SO?5TQG%µTSOE5UUWeµUW_… 5VYg¥µV[oŵ=€þH° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cʜI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Êh€§P£JJµªÕ«X³jÝʵ«×¯`Ê‹µ©Ù³hÓª5`€Û·pãʝK·®Ý»xóêÝË·¯ß¿€ ®`­áÈël;¸±ãǐ#KžLÙoaŘ3kÞ ’qåÏ C‹MzïeΨS«^Ͷ´ë×°cËÎ{šµíÛ¸ÕzžÍ»·ïߍkçN¼xÐÝÀ“+_®\¸ñçУÃDμºõ록KßνûGêØËþoÙ»ùóè+‚'Ͼ½ûÚÓ˟/ýûûø—ǧϿtûù(`lûùgà¶8à‚ ~V ‚Fˆ™‚ Vhá`J¨á†gQxᇠÒÆáˆ$¦¥ TÌy—Šz±HXpS9fŸ‹ry¶[T|eXâŽ<ò r4ºd‹ðÑö֐+uH˜GFiZTVùӌsÙä]my%†JBޖ\ ö%SZ©æš5­w"\6B%¤œsÞßSuÚÕe’QâØ%žp*䝌ù¹¢ u*'ˆþ9f–ƒ Jg‘pRz$ž76zgRBÚ"› †Ú’›eJi§¥–Æyi§|¢zªªƒòƚꙬ~骬§Îʪ¬•nÚi¡Iæ*é¯LV婈¢&«ìH¤êÙ룼Rš+ª½Þjj­Ñ{-®ÇÆj+šÖVû«¸ÒnK­¶ærí®\.ëî»5ûbºã>+®¼Ó¢û*Ÿûr«' ßòK.¡8bk¯·»¢‹0]¶¶Š,¼G ‘¼ W[pª|(Š¼êûlŒÖœ%ÀþžÛ±º'Üg½¦‚ŒåºÔ⥣Ä4CLq·Ð6\®Æä6ì1½‹ìðμî=¯\òÂ(JÕÀ2×,õÔ½œ1Ì?§;­Ê'Íô×YCk®Î 3é,×E ý5Ñ­š]ÕpC þЃ4x Bƒ HÈ°aAˆ )*\xP"ƌ%>¼ø‘cȉCŠ$ÙÐãɊ*5Bl‰q%ȒcƄ)³¤F öôùhP¡C‰5ziR¥K™6uújT©S©VµzkS—-:„镦׎a-²¼ùr,Ç®3Š5»ÖåڅpÓÆuËöìέrËæ¤;w¤N›] ïœqbŋ7vürdɓn5|sf͛9wöüthÑ£Iw@ujÕ«Y·výÚµåÒ³i׶}wnÝ<[Ÿê¶bà>‡7&œ8a‡X‹3mŽ\kWèNeï¶~{víÛ%¾.þ|zÕþƒïý¶ùðF˯_Z{|ùóéÏW/y¼{æ?ï_͏ü¹þ P?âø+ð(øê[ÁôŒÀÇÚKî;éd¯§ 5Œð4 …Š¿ †ó0Ãå|±² *o9þL¼ð@уq(¼ÇëѱLÈ iq ‹’À$ºUD²D(—TrJ+ãÑ» ™ò7½üLî°dÌÇ'Ÿ³À2…ÿu÷Xlë}bÑÌõOÄSÓ÷U/WEUîÛ+~QäK7•QÖW©õWpS՘ež™æšm¾çœù vbŒnÕgꂞªç4³uˆ€¤•^šé¦~ꨥžšêª©¾+Ô¢‡æR=­¹Þ:*¯×{9G¤­>í´Õ^ûl¬=l—ãN nNën2ëØÞí›ï¾ý–Úm@ð ?Ü9Põþ›ñÆW›lGœòÊ-'0h Üͧf?ú)­+XÜæô–Á¤ui Äà?ˆ´ "Pƒ #¡ß$¨›B†1@þ<0  Áƒ*\È°áÁ"JœH±"Eˆ `Ô8qcŒ=F„¸q$G“(S~LyR$ˌ03tH³¦Í…êÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÒ™7³jeX2¦×“»‚¼¨²#J—c͂=«6­Ä®_½bÝJ—nN«xóêÝË·¯ß¿€ <°®á­pãZL¼¶%Y°%Ó¢}é–í[˗ǝ{¸sû„C‹Mº´éÓ¨KsöÌ!c͙Ã>[6³ÈÉmgçÖø±÷kØo[ O:µñãȓ+_Î|êêá¬ÃfL»±ÛÈeqÛÖ½½1ð¯Ï¡wþ.Þ¼¼ùóèÓ«·^¼a隩sï¾ö:dÊøëc~ùý¢ûáä­'à€hàqíý‡X‹Áä’Jöѧ_mVx §`tvèᇠ†øT‚ÞŸb¾õÖÑJ­á~ؽÅâŠ$ÉXc}3fV‰ž(â@)¤z$òHӉ:Ɨä’LöW¤‘Ÿ )å”TVIړPâÔäw1néå—;fi—•d–iæ™Na)&q`¢¨b›pz©æš¡içxÞ9'!矀.¹'Ÿ>æi衈8(¡6ê薋ÒYh¢”Vjir‘®é磜vª!ŸYMz騤– X¦šzªêª‹Š˜©°ÓÆ*k^¨Š¹)«¸~Yk–¢Îêë¯Àú´+¯·æj,ƒ¹új°Ì6ëì°¶+m›ÐòêìµØÊZ-¯ÓvËä¶Pöší¸äž n¸Åzëm²ÊÖ%n¹ðÆ+ä¹Ä¦«îª¾µ{Ø»òö믢úöøæ½ë²ð¾ÿ&¬0ˆôºšâÃG,ñÄWlñÅÜ¿ wì1‚‡,òÈ!süñÉ(‡Ö0É,·ìr)Ç,³i+¿lóÍ›<ó΄QâDŠ-^ÄØPàFŽ=~RäH’%MžD™RåJ–-]¾„SæLš5mÞęSçNž=}þTèP¢EEš”c@;PKfé÷ÛO'J'PKÛ°-AOEBPS/img/atz_fwk.gifÙ4&ËGIF89aÁJ÷æææÿ×׀€€€€€€€€€€€ÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿOw^Žn¤}»ŒÒ›èªÿµÿ"ÁÿDÌÿf×ÿˆãÿªîÿÌ3M"f+€3™<³DÌMæUÿhÿ|ÿ:ÿW£ÿu¶ÿ’Êÿ¯ÝÿÌ3PmŠ¨Åâÿÿ3ÿ3MÿMfÿf€ÿ€™ÿ™³ÿ³ÌÿÌ3Mf"€+™3³<ÌDæMÿUÿh:ÿ|Wÿuÿ£’ÿ¶¯ÿÊÌÿÝ3"J1`@wOŽ^¤n»}Ҍè›ÿª"ÿµDÿÁfÿ̈ÿתÿãÌÿî33MMff€€™™³³ÌÌææÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿÿ3(P7mEŠT¨bÅqâ€ÿŒÿ3™ÿM¦ÿf³ÿ€¿ÿ™Ìÿ³ÙÿÌæÿ3Uw™»Ýÿÿ--ÿDDÿ[[ÿqqÿˆˆÿŸŸÿµµÿÌÌÿ3&M3f@€M™Y³fÌsæ€ÿŽÿ:ÿ«WÿºuÿȒÿׯÿæÌÿ33MMff€€™™³³ÌÌææÿÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿ3M&f3€@™M³YÌfæsÿ€ÿŽÿ:ÿW«ÿuºÿ’Èÿ¯×ÿÌæ!ù,ÁJþH° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cʜI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×œŠK¶¬Ù³hÓª]˶­Û·pãʝK·®]»_oÀÀ·¯ß¿€ L¸°áÈ+^̸±ãǐ#?×æ^ɘ3kÞ̹³çÏ  S®LórèÓ¨S«^ÍõhÒ2M·žM»¶íÛ _Æ)·ïßÀƒûÖ½Ûeoáȓ+_™xq–Ç™KŸN¹óç*£Wßν;ëëØQþj÷N~µÙò¶Á‡79½ûÎa†}ÿ}}Ëöôó7_ˆ_?fõöÔŸà@Ø؁‚” ‚úEœXòE¸ƒ z”àYú‘õŸaóy6!‚=h!ˆ¦´!‡î±8Y!—Ðu&ž8†)n´â_bµ([/Þ¦6J†cŽíÈã1ò塄@:ɤ”Ä8֒Ú5é$–S^Y¥—O~I¥—}E)¦–U"^Ev$’)Y¦•dž'eS~ dYsš9§har衝!º(™eÊ7c›ûÁIҊvŠI¥¤’îYhžQZ:)¥Þxée™‚j“†ºé§‚9 ›Œ&ꨀþˆEz'˜~6y)”›rÚ'¢¹º‰é¯¾ÞÊ駴ÞXY¶ºà«°8ª­|Îú,®ÃŠJ-—~êº$µÐæ­°¥~;ޛ¬*›&³!É©g§©jÚi·Õ†æ¶<²[)°w†ë­µ¾vd¹Ê¾‰nDêRê.©ë&L'¿ùÞËðµ £¯ÁÓÞË­°óJØÀì`¬½…*2ž$?©e´zfìbʇ;¡/ܲ±3rܱÇ‚lŸØré3¸»b h¶ˆÂñË{ mž€–h³¹ã¼±¹Të‰@ÆU'µÔüe]õÓYoÍõ¢^—möbbìÙl·-¯Úíöܦ 7ArÓ­÷1{vß-PÞ{î]ß~.øáÔ~·áˆ7®œâp3îøäÀA®¶ä”gžžßqjîy~–oþ 4x` 6tøbD‰)V´xcF9vôø¤ÇI–4yeJ•+Y¶<¨0dL™3iÖ´ygNŠ#]öôùhО0u5ziR¥Fy uújT”D—Vµzk֜M¥võúÕ'U­cɖ5;–+XµkÙ&<ûn\¹3Ó¶µ{ªØ¹{ùöÝ[o`Á-õú5|ñRÀƒ7FX8qdɓC.v|Ù1dʛ9w†hsèÀš=—6´hÕlIŸvýZnêÕ³½¶†}wVÙ´y?µxp¦½‰«ý-yr™»‹7'¬zt›ÌWŸ*aíÛ¹w÷þ|øþïŗ7ýø‰éÙ·çþÙz| ÇoS7N^~kû` ï—ÿ_ ú`ó¯6üâÓ/´þ\P%_#°«ã d AÌdÒtm¨$Ìo§áːDƒ6<­Ã¼ ´®ÂË.,FNÜJ1-Jq´-1ÆgÄI;¥ptêÃut‘Ç3üñ¦‘˜ÔhH¡ŠdñÈ̒T’Á'kâIË­¼Äõlt(J,뒮Ð¬òL/kñK2Í\ò,®Ö”¨ÌùÜlÎ6ÊsÎÍJëÎ+)ܳ¸>ý3Ð,1pÒôLÔ Ð°%NÑÁ^lÄD·“M>CÕÔPN)üî1 DmT1tþIFMÍl1í&}“ÕÁ|ÏVªt֕d#TU\·ô5"`ùU°Mƒ½‹9;‹õŽ¶B£¥6¡»kð҂¶%Ì7fS“;rËåVÖgñª«V5§õ–5–îŒÖ$.á½nW ï–¤ý2í7À{ EWNu¡5±ÝßÍv-ÿÖ¤W_÷­·[5'NÉ2Å})`†ƸTƒ¿8c…;¶X[;<¹©í²UF˜…]ãzO¾YÊq~¹å˜-nf— N–_‰9f߂EŽ×D€e\垍:êª;†°Ëk¿z듦ÔPf–µ5Zb{¯–wã¦S¾˜:g—ùè£JYh²ÍžÚj¼/žþ$ˆþØk½•Zï²Ï>|èÇÜܺ“nHÙ·÷&[í¹íæ™jĹ<7fÂ]zÒïŧ8ßé¾{å©ÏÕÖ©D·4]ÉáV[n¨/ßõ=†ý£ÐQ.\÷—ÿ˜ÝŸÿäÖžy¾•–½¶¸+·p³3/ñ_¡ç¯è§qZe»ëvü~‡iž Ûü9\|ùßýF?rmOq<ÜçÐ÷¼÷I¥mîúIäú•&]U„‚J›]Üö@ßtÏdaYM2Ø>¢ñꄱr óš°ÉO„<Ö7¸š j…,l!„WB= Y ¬V Y#D þ$XP`€<ˆáCˆ%NˆÃEŒ5näˆq!E! è¸ñ£H”)%’,‰á¤J˜ Yj|ÓæMœ9Q"\éPçς [Z¨È™E.©”iʤŸN¥ZéE„YµnåÚÕë×®#%ÛѨU™eÏ¢…Õ$ۉn]Â¥[w©Ü²yõ¾ª×ïÚºxßÚµ)+ᴃ/fLÑ°_ÈOö¬¶qE˗¯¶LWngÍ¡=W&íåÒ¦?–*Ú±jƟ]Ï^Ì:õ߃coÍÖö\Ú÷F+;øqß»•ÏE½\rèßÄE‡þùuª¿sn¾fu²ÒÁþ—ŸÝ:vôGµ{ΞüxØè©k6žÞ~Îõîõ‡‡Ïù~Cÿè;ï?¡ÚïÀÝʛ*:绬¾#)?+ÌHÁ§üÏÁÕ”ðCˆ(´ÐB ™Òð>cóD qDK¼+3ãC Âs< FÃëG ƒÜJ-!‹4òH­ŠBrI!WÔÄ{”rJ*«´2À'sŒòJ.»ôòKådÌr¶-Á4óL4ÓsÌéÒtóM8ã<ŒM˔óN<ó¬lM:ÔóO@]ŽÏ>UôPDŲÐíTôQH¯$”QôRLI¤4BK3õôSç&Ýt4PK5uJQGMîTV[=0UU¡­êÔUZk…5VójÕu×=qµoV^ƒÍôV_MöXd+9`“u6Pb—ªÙWŸµ6Ti¯cr[n»õö[pÃw\r½Íö\õÐE7ZuÛÍÐÝey‚w^féÅ5+{óNßMµâ÷ßÚ.t+ öÍà1¹Bxáw~’]‡†8bÏ(¶¿‹ëÌxc•&æxÁCvLäI6Y¦“MyåÓXÆÎc‘þB p Á‚"L¨p!Æ8Œ(q"Ŋ/bÌH¢ÆŽ?‚ )r$ɒ&O¢Li‘£Ê–._Œ)s&͚YÚÌ©s'Ϟ>–Ä t(QžB…"DZt)S‡J›B:òéBªR¯.µŠu+W¾zq,Dz`½‚ýªt,Z–jŞu‹€íܳuµvåŠ7/߬bçþ X.á¤e#Kø°â¿}CŽŒÕnáÆjÓ|êö2ZǃÞÈY2éÒ¦{2þl93뇞[WVúõéÚ¶oŸ¬œö0]Ù½[Ïî-<4氍ã¶y™ìÛكG'>•2[²Æ›ßíì'öîÔegoKþ[úK¹ Á“O/sïƜìՇ4|>üú*ߏ‰ß¾ÆÍ͹ßeX`Jæɇž 2Ø`Fò¥¦ ƒŠÆž…È9×ÐoêçY„rHa‚ ]¸ÝD †ØR‚fÅ]Š ®Õân,"Ç€áA‡¾Ø£*]×Ö[BW]`ûýؤ“7 ڐ9:v£R>wä“[r)RHFè!†Ã™!“]¢™f{ó‘Yãq&\œmªiҙuÖæ]jÖḤ‰uùÖٔaâ ҝ…"š(jŠ2Zv©¡€¦©ç¡”FdUŽ“bÚ¤¦E¢B—‚jšVx‘Zªk«ŽªªŸÂþõ¥«†²*ޚ³ò«œÀáŠÑZ·Õ«}Ti¥°¾+æ­Ç’GlÅ2ëh²nò-nÐ֚ŸµUMkd·Û晔¨ß‚ÛjµËbXîiØR{®ºâV;b†ï’æl…ðÒk.ºá¹›ïcö:対Úâ+p_Ëqú^ª½Ê°Á‘!œí¸“["Å»¸¯ÄÏÛ1¹o•±h£.Ì°a$ƒü/§Ï²œr¿Úì²ÊN-'óÇ>js^%Û̳δÐC]´ÑG#´ÒK3Ý´ÓOCµÔSS½²d µÖ[sݵ×_ƒ¶Øc“]¶Ùg£¶Úk³Ý¶ÛoÃ÷Ø>…µÜw㝷Þ{ óÝ·ß6Ýþ„@à@‚ $`ÀB† >„QâDŠ-^ĘQãFŽ=~RäȊžD™RåJ–’„SæLš5mÞęs¢É–=}þôùRçP¢EEš4&O M>ªTêTªU­^ÕÈôéV®*£bVìX²#µvE›Vàײmݾ…‹õ¬ZºPãÞśWo͹uýÝXð`ÂûþEìµðbƍÝNÙ¥cʕ-'…,YóÚ˝=^ºYôdÐ¥MŸ.9Zõ@¶¨]¿öœyõßÖ°mß.,{vÝÚDý ¼÷€ß†‡o,ž1xrœÌû^|/sÜ uïVûœ¸sêÔzgþþ£x‰ÑÉ/}y¢yõeÛW¿x;ZíÛÃs§Hþ=_áõÍú·/7á3l¾ÍêK®¸ûkHÁî†[î;zP<ï*”¿û(ThBö q½ӋÃíHüJ:9Š»íӐ@å Ô At1G±DKԑ-¡ÛñD_4rÄ$/L±¶è–D‘=W9āy]Ùå;‹ôæuMØ%›oÖ I¦–Ù´ª úzµ­’rk¨»®.lš¯fmºž;mÜÔfí¶åÆ;ïР°²›3½ÿ¼#º%î{ìÀÏ{ðeû^qÇŸÙ)Åk„¼òÇŸÜKË7sÆ ç¬æã}>z뫚ÞYf·ç¾{ï¿?|ñÇ'¿|óÏG?}õ×g}Þ‡?~ùùÞ v”²§/öù÷ç¿«gû—^g¿ÿ!†€þA p Á‚"L¨p!ÆBŒ(q"Ŋ X´`cF†+nüØ¡È‘KšL©r%˖._®D “`H™15†|iSåΙ> *ÔgO˜5‹vDz±¦Î™J‡B*u*Ô§1‰µ¥UT¿‚ +ö¦Ô®^5:M;v-Û¶nš%›íܦoïâÍ 4.O¢ùF Q°Þ†ÝJøáb=ªE,y2傏ÏÖ¥xùbä”G?ƒ-z4éÒ¦O£N­z5ëÖ®_Î-{6mÚY {7ïÞ¾.|8ñâƏ#O®|9óæ¿s;w=úðéÌ­S^ývÌìÞ¿ƒ/þ~Öø]í­HžŽšø£’K’8dvNåz¶¸£IR2™¥–×¥H%Ž,š7![’Y¦‘]æX$Šaºx¥™oÂù$š`vèepv§ž{F9ç™_þy§˜nòY¨¡¾aY§\¦É¦•#%z¨¤~ Ÿk*J'pxŽ8©§%rd—Š'e¤wV‰džQÖtßFñÑþXé{î½ú©nEñwªrºnªf©©N4\±e_­µÚ¬›ò£Rð5Ûç¢ËEËۑÁ&¹Ÿu!凬¶Öz bµ ž$j¯ Ž + ˜n:(¤¬öæ-·ñλ޶нšon ÑÛ/¸·î;]«ñ Œï½ƒ{¯½×;£L¡ZöáéÞêkx×J$¬@ŒhÇö,¯ÁÜê[ì¿'3Ìð±&/ °Ë*×Ër±ü:,ªc'I¬ÅS®û«£ªvªíÇÈ®lðË/ÇlôÑá‚,3ÑE/­ô¼SœrÔ=>|3Îñ’z±Å6þŒíª¬&m2Ó-#­0ÚO{Ì2Úo³Í6Ü#‡|ðÎÿY¶1Iˆþv v¦¶Ûæ»×]÷sj‹|ôÂgŸ­xâ.Ëý8Íáºí¬eL™Ë5º7þÍîsî&ïɌ³'9⠓~§ÚWG~úá‡7Þ$I{kŽàΦN‹(è‘MðÈiK]°Òi'œ:³ [|ËTÿ¾üê±c¸“ô|ož;‘ *xèdÝ}ݲšþ4­Ðb'«ï(ÓÜtÕ¾ c\çÝ}.öŒjú¹ö¼ËtÃ*ï<úâ/€ý£×ê@6·ªïG])]߄ô5†-cÙ"ôlU!«0®ÿyà#˜ f©}$×B ¥A9õÌk ™´¿šWæ9!up7?û=j{0Üa·6ªêÝcpWÖ³Öî4ÂÃ#öP„9ëçè8mLHœ"¨hÈÁý 1>E »Ø$+¦FY¼Õ5ãÅ3î¦2QW¯W?ÝÝψh<£%ÂÆ7ºñ‰pÌ!þæØÅ:FäŽzÌ£çöŎþ‚ <ˆ0¡Â… :|1¢Ä‰+Z<(0£F6vÜr`ȑ$KšiàE‰*W¶\éð¥Â'IÒ¬‰S&̝<{úü 4b͛8E=ŠTcÊ 3wê úô ѤS“‚ŒÊ4«Ö­\} ökƎd?š û5,تdÓÒ\;í[‘gߢE°´+ֈ{{ö­z°Õ±] >Œ˜¡Qºcše,v.`¹%W®ü8rc¼ûúuª7æàÍ£CzNŒ:µê‰iI·Õ¼V­Ç‘vá:v½øõb·hór=ݸKÑ¥¾:¹òÕÅj†=»¹iÒÑ-?ߍ3ä¹'ôNñoþéìã.?>}n£jë~O~ýuøgåC6ê{+x©¡ƒ7>Ø~é HàJnÅÅeŽÕÖÚn7Ù¶`\vÝá_uV˜€þFÜqå]U`ˆ"je€W}XžJò‡þ‡"G«ÅFc6ވcŽ:îÈc>þ$„E™xbŒÇmèâpI.DdIM6£‘RNIe•V^iU~Z­¸âCâÁ(e—ÝaIf™fž‰¦IZfÅe =I۔bZgšvމgž­‰Ðáµ¨_‡Ê¥ž†Ø]&5™™sCÆGŸM&\›KÎô¡ªÕ‰h§iÎu£ŽBg’šœ¥¾èa˜…z þ«§lÉ—m¶J¨{´Þ%[]×)…¤TC±Ӝo Z¢¦©qk³TNed ¾VW­—=×+f(›’GBšç% ["K•²¨1ëlº(B{­´±áæ oëYF#¤k²kDªŽËê ®nªnÀŸyµÓ9÷à¼í¶E”`÷FG[¸ÅºÉd¦ÿ.+pÆfFKŸ£î!Ü\}ÖeûëžÜnç­¢„Å$.›ä"…®“¯jLs•Þ™¯óæ*²|$ã’–ƱÅòė~g±‘ƆWsÓNã)´“ù×2S_¶ªôÌOoÍ5•QC ­ÄJ®úfÒ1.=QÃõÚ4ÔÁXü6Ìw}çÃ)OMµÑdWþ fÖKGÄNªgÃÆLwyv+vwcÚ÷ÙZg¨„ßI¹ÙëÀ9ç&÷£úV Õˁ™›Xæó*át³û´·!ˆïfÔ*Xð{°[¸hçž?ž:ä‹;6¿eG¾îäÕÙîñ‰#۞™‚õ±× à7Ú±®ÍϪ“¾ðùŒ|Ë<ºÞƏï¯ßs·ìö1ß(ó Ïï~v5ÂK}ôòS?j¨ß‡¿©ãEŒxŽ;ZŸ4w8åÊ}qƒßêp‡½ùñÏ~•óÿ¦õ.©Œ6ßCÛw@h!g_.ëW².v.ÁuOl“ÖöêÇ Öl”aÿȃªÎ­xˆñL*BþB«™îQ(L áAÒozL”`ôf¸î/‰Rìxx~Ð|%`ú$÷·À1èn[¡Áb7EÚÍÍzB2#¯X×:ËiŽ±AHâNÄE!š°\Eìa¬ HÄ­€WLÌg“ÇÒíQn}Ìâ׸¨À5mœÛ¡!٘Dåj_L^;ÈEmp’D &3Y¼.¢ï„êKá)OIÉÎ¥¦d7t[²ˆ¤:‘hò'œd%×÷ÊCÆòw— ªØB1j‡NXìòøÉ`Òm˜à3¥»Ê¢6Å±,9ÃÖÝóÄ°ìÒ'½äc+(Í;Rs– j× iH™xlgÐË8?³ÈÈÓ5Ò0ˆK'(ÿgÍÛ)S‚¸RtD(ؼëž<)'#ÏéGN ÅŒvê×<Žµ3Š › CI'¬g¦HkuÚ::ÏÌÅO{ñüXöÚSO]¦R^ô¥'YÒ§´¢:SÙÍ®Â0î U›Ù’\>zÏ~öo®Ì©N)Š˜2åRiËb3;ƒÌÿô8tìªW¿ª£ÍùŽXšêÙªú'†ôm7mjq–ŠÉoQª‡ fG:ÓŠT«Ñ´©SsRºÆ®hMÛUQ¶×Áþ‚ <ˆ0¡Â… |1¢Ä‡'Z¼ˆ1£Æ;F¬è‘"‘#š<‰2¤JŠ+W:Di’ ̙ e2ÙgK‰6iúŒ¹s`СD‹nÔÙ1ɒ?›&4ª)ԏœìiõ$քR=v º5ëϯQ§š=»“,F¥KÅZê°b€¹åÒ­{·èˬaÝ"ì{u¨Z—~­¾xxàÜÅkNLŒ6#dˆlIþ W.˸›Yê­Ê÷òM­‚ÏÝ0gRªçÅ™(ې•™¢N ¤n¡‹ï¾– Úðm®¤Áš>s²gŽ:¿ºn®<6O’^—@~îrÎ]£#îôtþañÞ)Ç^œ¶W֊wã•Ê¹®Ð÷›w¿f,ß®÷ÊI­£g¨|ùÍÇÛr¥‰%ž_ä•fV‚Øí·žyj6!OR8Ÿo°e虆V7Rmý§P€ôe˜~Ÿ!Hâ‚Æ5HâM.y՛{VÈZ|HaÈã‡=¦µsþňtF¶^S²ԋpYӌ«}ˆ£~¿qÈ#~îmÙ•*‚âQ5ŽIf™fžyå‘Fî%Ü.¦u”A8¥Ria7îù㎏©TG )'j*“轩Œ…h„v ø£„Unèa¦wN f˜’*'¢‡²^‹é5úä£ÑÉ{*ê–þ¦°biN¯R–fTÖ :¢ª¾>è֒¡5 §£ª²*j±–¨ ºöúk´¢ ې©Ä¢šÛ¯å•—,ž2k³ŸB+m¹Š¶¹è©R¦z¬²ÝªÇޚኻ¨æÞ«d°ÖÊèd¶¾rûí»wJݳ–á‹ðXúº©n¤Æ> pÀOŒØ¼ôVLnv.rŒ®ëo» RLòtó ™ñÆ*Ϲpº×‚lµ¨EìmÉ7[°Á¶­ÌóU-û²ÃìB3Í6 †³§:_×sÓÈLÃAÃ;t¡F DšZoÍu×^{mqÎK;Ý4Ôí›Z¿1k UØn¿ wÜrÏM·Å“ݳÙ,Kþͯ»kÿ;U݂NxáoÓf/Þ ëí3ßiû­ÛfNyå–Û hâŠãËøªhG©vä€Gvyé¦Ï –æ››Ûùӟs5rÈDKwzí¶+“ê«KÛzë(},´ìVM<Ɂî®qï¯ÿûß"}·Ç#°òŽƒ¹l’GÏý¨ºSìÏ7Lµðr^Ý}úõ¦ þ¿â|ùÎÏ®~ý¦}ßþùïß¿¤æC‰>û p øË‘¬ç²¾ak~VûšÁJp‚Z+ —çßi…|þc ¯nŠpäÝþfÆÁ:ýïQ#l¡ _Ⱦð„ÓJa«ö+êp‡¶“¡¶hx–™þ©Ðƒªâ¡h8º¯cð³¡cpøA$JqŠpSbø˜È?'–ŠV좭ˆ@ )f¢û¢ÏxÁ0Žoj,#ßGÅ©±‰l¢ãˆÇ<&ˆãÑ¢dâ¤Ç@ 2ZsÌboXµA*r‘×ËW#™:í1r’x GÐõ¸ޑ’œô¢%;‚IìiR’,e?ɑPÂ.’;þ4xaB… 6tøbD‰)V´xcF vôødH>’éÑäI•/l˜råI˜1iÜxgN;yöôɳfP”B;Î$Ú±¥C£D—-ùjT©S©VêT`­Y‹hìÖ¬[µ6šô%Ö®jEº´ún\¹soªMIòîW®x»æ5{֢ۅiv*˜nbŋSe+ÖëÞ¾_ËF^ËZ††WrfÚthÑ£)bŽìwòLÕ¦3VŠÙ³PĤi׶½³lîÙíNÖ+–/jɦ5†Íúémå˙K„\r7€ÇÉz>ö.p°j‹+ŒÝ9Êþæãɓ7¼;|ÌvO¸~dú¬‰u×·~ýûù÷÷ÿ@û˜ã =ùÀcŠ;×ÒzÌÀ誂ÏÀ%œP¼åT{n>„(ÜP%÷‚p(ù¤ DM<ñ3åVãªBÞPDÑÃJd1½§šñÅu,Ê’TBlGc4GC²Q*#ƒ\rC$»à brÂ! *²Aú¨Ü’K”øòKÚVdÇ)»LÏJ°QË3Ý 20Ã$mÌ¥C0¬ìô¤18슊²¦4׬±Í7 E1N9Åô‘Æ2Í êºá¬óͺí$…PÐãؤKÉC=UON…ÎN eû³2½ø´Œ¯F)4þ¦LÜt®N?½õÈPG-Œ£S]]K¸I]ÅQÖÞh•ËV\•ÍJ×];ëÒËZVØêVÍ«=7ӔPN—ý–µDÁ¬@…D]?Ç¢–²tÉ\©X¬’•Ypíµ«YgÛ2wÙïâ=,KoïX¶|õMZ\ýÕÖ¸Y»­U&_£ø0Ý(1ðÜEÞt¾eÞÝ´i¯Ý\£z÷Xo¸=>5ÞC~bÐãÒ>ìæ“W|yõK'\öî«}hŒgûì¡_iØç_2,CŠÍ>4¡é lësûVä7ñ~£“ßúäg=üåÏTÛ;à¤ç›²mîK!ÒV¼j-qz£Îô¼BV­pu2[È8´Ýoc|T ¯E9ðÉÍþwÓ bá’™¾íXç£Ù-˜CJ‡‰!:¢Ų̂E‘IC{⣰h’).-‰VÄââ8 ’‘%”‘a£34L‹[„â¿ø£†î4‹ãóغ½¦e9Ã[ïµÇ'žèŠMS#‘Øø7ò[†Ô!"_TLj…ñ-‰„d“̘¿Qp[›—%eH<¹š+k¡•9¶Î»"gÛ"Ç֝;'ÙÝGAgå=ü¦qâǍôM\$Ž‰M§žN=áì…×ç¾ÖYûsuìjogþI7HåæÇ«',½ûõçáWÞùs¤¥¿ë§žÝ:êÉݱwÙ~x…'`zâ_‚ ÷^{ɇ`WIɖ2Ö^ÿm‡Ó^:d`qd-x`oÈ5÷[„–hbyË=h[}+V~J…¨£d[m¨š‡¢bm¾AÈàz ²xâŒJÂXž‰P69ЍŸ]¸ã•SõØ¡M° ™!‘N’'c”†‰‚LÒ'!™cr¦T•9b)çL>ÚµeU]8äˆÁܟ½ÊY‰ƒ2G#rJãGoze圐²¦åiæU’Ú¦œ6Xš£qF**v“Òäfz~‰j§¬rÝ}gþ=:ꬕÚX¥Üy‰aw¶ê+ŽÆ*­´bJٝàåšê®«þê,Q¯ÂɱÄk¬O§jZÔµ=ùì·8•F’´ŠQ;«µÈ*Ô+’ÛêØëºàúú*¬Egn±¶j˜-bº¸nsñ,–¸ã’;Ö½£¢Ké¾W-ëïP ïXS j‰‹ª°©\*{©»DàâÈ$—lòÉ(§¬òÊW\ðg,Ç,óÌ4×\s¾‹áú¡ÃûÁ+Ë@-4ÁómôÑ@[èbÆL§Ä­M C×oÏE!mõÑE_­õÐЕDVÓ`W•®u–Bõt\Pm­¶¸Y¯í¶ÅÀ’tvØîŽ] ÇfƒÕÛþj·Í÷ÖjÉJ7Ýs«µlSëç3E[íwãG‹&øà`î_Ç;¼§ÄÐrñä”3m9‡˜{«¹ªž—zàÆ^¹ÝšáÝî櫛^;b »~ïè4žϊßn»ð¶®{ƼÛYz³³£N|ÃÏ?íñÔq™ïŸ%þÝâœs/°½ÔOErCÖ«¤óðкkóúì·ïþû%ç~UV¬PùNc¯ðBî¿ÑûŸÅ5?Õx'!("Q`u¦Š,°F¹Þò´•>, ð‚làV@ó!å~òÎxR„¦ŒHO²«à•6¨Á²ÐtpFuæD ÌM 1rÂde.oþ|á](ĿŐa_A` å¢:p‡4Ÿþœ•<žQ€D¼¢ÛŽ8Ave¥%$bW”:sÃF1]ü«SÅ5BªO cE2BÑ"=T×íÚèÆZõqpŒ£AÂDG5=ыx”bÆÇ>6òz[gBH&²gAe,R"шÂ1‘Ejâ_ ¹0RÆð+g‘c§º’G²ÕËIe<$wLy+Zv•FQ¥«Îˆ­E*J–À-s6Ìù¦†kåÝ£@$=0b²)¦c¤>Á S`ʌ3Ót¦X “šny$8§“—»à¯—´L™Ä±q¶EœîüXìFÆH7¡<%RG²i—ý­Ó‰°‰§k꺈ÑS‰2š!͸OE¦3IÎ ã=kþ(hð „ 2lèð!Ĉ œhñ"ƌ7rÌà#H‡9°¤I’'W²D9òcJ”+2Téò&Μ:wâ¤Ùñ'Р} -jô(Ò¤ M–$ ¦S¦'mÞ´é”*‚™±òìêÕ+Q¥bÇ>|jö,Ú´jײmëö-ܸrçÒe+uªK•Q›î´ÚR Ö†\¿.ܔ,âĊ3nLöî^¾x%çôË5pMÚ7‡uìù3èТ‘J՛·)ÕÁ”#—ļP5a؛GŽ®mû6îÜ_Âä eêÓÀ{_ŽØù l°³ûênîü9ô Ëûv­0yW욏Gïîýûóéþ:µË4¾U<ùÂÜÁ³oøø€Í F/?ïûüú÷‹½/ÞzBéUæßaüx ‚7H¨÷Ԃ|×}™M'àWë%¸!‡üIHÙd¥f™_B¤!†UH[‡-ºèaLýbˆQ™fbYç]¸â@/úø#xúö Š Z¶U"”¢pj$”Qz&bK©MHå^¬)‰œ}+>)%˜aö7„UYe™Y¶´¥ALF褘qʉØ_¬Ù¹Úˆ,õ6߉:.ç&sŸÕ5(¡…zè sbT'™ úö&V6¾™U…¯u § qÛøµvɀ+–ZXê.º­i²>ù™M*¾ºá¾Çû:ì%7{´J¸ç¿óÞ:ñîN}ð֋^}ã4ª‡¼Ì©H+í0s¾Ñ*†:è¦Ó==ð;k6ü×ã >Ùyí)»æé?ûßl樻ym€kKå(¾ÑAfÊ+S£¼üAo~Ë#_óv>¡Le cg"¼žP¤|ѓìœäA0„'¡±0h!ç¡°s¦JÙ [åÂÄDjìŸ@¯lÇÃÑu;‹ÕJ˜Á¨ukjE|bvŽHÜ1o†üß¡¨Å@IQ,ä¡ ©³Áüm±Œ1ì"ª¦D+2Q<þA€ €‚"L¨p!ÂBŒ(q"Ŋ/b̨q#ǎl(r$ɒ&O¢L©²d€‡[ ÉÐåGˆ4kV”¹r§Á›8 *t(G<"Mªt©È–a"4šÐçGªB¥2%i•(×®^¿RĚu,Ù²f¶L»PlÏ [²=,ݺv¯ÆŒ+w/ß¾'õ¾Ý§Þ½ƒï"N|7dÚÂ~C~ ØíWÇgwl¬y3çΞ?ƒ-š³ÝѦO£N­z5ëÖ©›RöjÙ,æŒiã.ê´2͑Þ°öKÞ‰‡Ý{¹nÙ=¡ .2ò°ÆƒW˜9÷í/£N/þþr쮳Ëz÷Ν¹ú§ãßÃ'Û~àuàÛç¯ÏdüþþyηŸDçÉWÕPo¹„Y‚ùåtàB¨Uy\8Vvø=´r÷%†a„‚8\õýváUôYWTMbäaˆ/B ‰‘U·_†ވ"M;æÈãM· ¤ôÙèŒGú'£sÇy„¡MO ’”S&¸ Š:B¹c–ˆ¤—ï)i^t5ž8å•Vjy&•Y©æ•eþTá—s8â’Ø5éÖff¢™¥ŸoÚdšXÕ%‡Ú7a¡cæi矄¦©™Pê&‹†"š©_aRÈhfŽjg)Ÿ£VŠf›’j¤¦«¦¨ƒL~þgŠñ9$­g*e• 'a®¬°Ã[¬±Cv «ŠŠ±˜¦¬Bk!ƒ9y+bÍv‡W´Û2…í«x6Zš·ìiË­¹G«*¸ÖNÛn‹ßžoJéÂU-»îâ*¼òò+a¾ü)î¿ø^Ú¯Áþþ+g·qÒ;psɱB fïŠ;œ“· KÌ*ÆUYüë±#LÇkúq“!gÜr‡(ÃܛÃ''¥²Ë73Ê6Å2Î?‹©³Ä< æ3ÐG«+´ÁDkD3RL#í®ÓJ u‹FGufTl5›XköÕ\÷ëõw‹vÓd—=3Øjà 0ÛñšM-Úqã­ÝÜòAÖÖÛy‹=õÞ1º}ɇ#ž8jƒŸÛ·{ŒC9’Ž(¹å—>°à˜sÞyͅ{ºè’>ºé§K«9ꫳþô¿È!@@Aƒ&T¸aC‡!F”8‘bE‹1fÔ¸‘cG9’dI“'Q¦$ø‘eK—/aƔ9“fM–!SæÔ¹ÓäJ›?:”hQ£qòTº´çQ§O¡F•:ufR¦W—ú¤º•kW¯_‰ZÅ:6§V°gѦU»v¡X²oKše;—n]»BÝÂÕ;ðn_¿kÌ»÷mÇ'V¼˜qcǏ!G–<™re˗1gÖ¼™sgϟ+=štiÓ§Q§V½šukׯK;PKn 6«Þ4Ù4PKÛ°-AOEBPS/img/p_mig.gifb)ÖGIF89a‰°÷­1ZJc„ccc{œµ{œ½­½Æ­Æ÷­Î÷­ÎÿµÆ÷µÎ÷µÎÿµÖÿ½Î÷½Îÿ½ÖÿÆÖ÷ÆÖÿÎÎÎÎÖÿÎÞïÎÞÿÎçÿÖÞÿÖçÿÞç÷Þçÿçïÿ÷÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,‰°þAH° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cʜI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P3Ø9DÕ¨O¯ Ԛ€×“^¯rÕ8–cX‡e+¦ÅŠpmA·=Ãʵz.ʪvSæ¥ûq¯K®~[–:oý†!ʅ;8q]†Ž%Š}8™åXÄJµV9æ掟õ -ú®Á¼˜ùR­°ñքv;+žHzdj¤š­~}­ûrïÂg·Îí]v8_¼Á+ß͚÷ðÜ£Ïo>u·õ߯=8ñ×֙þG×Î|1õäºOÏ­ŽüzaºÞ½—Þ~røºò³Wwžÿûtýì‰Õ`úøuß½¥ZnæŇ^rÒ˜àzxvìUøÞr’Ç_m/iVÙ~¼·!k 6זsªÁw"‰-.Ø"Œ1§â†÷ÁgŠÐÝ#–èV.žX$xÅñh$ég$K 'e7 éä“6b‰Ü{=–x%‹vç%ŠQ.Ç¥’`ù˜Œ *7¥ŽQŽ8ãœâY9T—†­Õå—jÉ¢˜ûÉF&Uf9¦¡;ž©¨–ƒÆYèŠ)¾è%>ιhŸTâX©Œ‡*瞆Ö“U’š¤˜TÊ©)¡—:F©‚þl6c¤“~É$­…ç‡âH!—æ½u ¦.þX畸úf)‚V&;k¯¼·°Åýʧª|Vº«³ØÁº+§¢þÇi€Öê-ÿ¸˜«Öf™dšî¢áªjج¬¶Š`¢H¶;^Qßæ먾~®jj±Ð*Ê-³‡ºJ°¬¢–ñš_kg¶³j±§æ¦é沒ÖÛ+¨£f:æ«¡œê°`âj.¿/?üäÂ6Âü*cD n­.Hꋉý¬ÜÇylÉçÞ+3£RÚ¼¬ÀÓ.êžÆ°¦·­‰´*«sÑ>C›'Ç ÃûsÌcmb¨'w2ÕCÝ6¾U[´±T‡,ÔÖ7ïþÞýý´„s;©ƒ(o×·Ãý–‡ž°Ôr8_g‡OÛ]Ô"N­^ Ô ¨Þ‚CŸÝóMìnßV“._}—‹§wèí!ºg뚟gyϨûmö„¥² ¸¥|[þ/[­Ifˆ¯“ñ¡üò3)ϼmÂÓäqþúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþüÓÿ™úý  HÀâÁæ€L È@è  Œ 'HA{Mˆ>äÑ\ìvWÁzðƒQ!Y§ˆä§ð„(LáÀv*Ž Ìd*Œ¡ g¸’É-NZ¼{NxÄEÃúð‡þáVÉh&2 ñˆHÄ^ÓÎÆ.EXL¢§¸ÀÞu-BÁ²]·VGÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØ̦6·ÉÍnzó›à ç)@΁“æ,'ΙNt „ïTç:å ÏyºÓžíþÌg<ïYÏ~ÒóŸü¨>ñ¹Ïvô õ'B ÊP‚:T¡ hC!:Q‰>Ô¢½èB5эfô£ ©GEÚђVt¤(í(HSzR“r´¥0}©LWêR xà¦8Í©NwÊӞúô§@ ªP‡JÔ¢õ¨HMªR—ÊÔ¦:õ©PªT§JÕªZõªXͪV·ÊÕ®zõ«` «XÇJÖ²šõ¬hM«Z×ÊÖ¶ºõ­p«\çJ׺Úõ®xÍ«^÷Ê×¾úõ¯€ ¬`KØÂö°ˆM¬bËØÆ:ö±¬d'KÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚҚö´¨M­jWËÚÖºöµ°þ­lóZ€ÚÚö¶¸Í­nwËÛÞúö·¾­p‡Kܳày(®rJ¤à¹\}ns+¬z…§ëºêu¿zÜx÷»à ¯xÇKÞòš÷¼éÀ$ ¸×½ `Àæ»lÉ]®r¥Ë_L·¨ÿj€q:`ê «ÛÕi‚­{`î‚༎°„'܁\`È@.ÀáõV@@°üê÷Ä.pPUüT³x±Û]ŒÂrÓëÒ¸Æ՝ñmœcœ.XÇ7æ1yÜ`Ç8Ç?®jw)Ìä&KX à€:,‡xÀ²{M|âå¦Ø¿Ð½iuÚß177Ìgžnþ˜ÁŒféæ´Ìnö/˜ {dÛ9È;.2‘ë¼Ó'xÏy¶³Žkìãû¹ÈW]²w7àäF;ºÂ À†×[e?—n¦Àå.7Åÿ=ó›wªæQ¯yΨ.p©I-fS¿ø¯|®óŸ}gDºÏ՝õ­Íçœöº«ŠîÀb ì  ¼Çf2”/` |x½X†¦piNç×ÓÄý2å¼m2·zÛu·GÍmo—[ί†µ¡×]ëBïZȾ¶µ ç o^³{È¿æj°“í]~×ßÄîwxío€W à° miM3 €:máj»Õü=õ·¿îq«ÙÌ<]5Æþkvëúä¶Nò®ßMk{·Ûå/À þ]š#[à2vÎÑ ‚„[y–8°j3ÀÚÏ6¹GþS‘£ÛÜåu·]üm¦¶ä/4Ê,ï•oÝÝ·®÷¯U>Õ}¼æÅvÚÃRó¶ëœímç7Ü p„{xx¯µñ>jS›âIíş>êâµÓ nÄæúހÖ3’å}c°Ïñ†yv<ïD?Øín—;ÎE¯óÑãüô¤Wûé!̀JW€ïà»Ä©]âk^ðKçö˜çŽWýãRGµÇ{Y²ƒÖì;'½Á“­üÕ§þùàÈ@ÌÞ ðï `@öþPûÛ{ÿûF5þg‘z¹ ~î¡?ÿ°KÏ~KŸúW†½Äµ/_Àƒÿþø·|iÉoú³·õýÇ~˜z6}W0bÙÇõg{ù÷€¸Ÿç| Ç|£gý‡g}ß%!֐  'Ø}¸‚,8~¨vp‡vÏGp2ˆÅFst€eY!(ð } €*؂J¸„•löhŒFaxiA„ P„  „Lø…`¸XŠ…OX†6…˜m ˜…ô§€ö†rxnUg+6‡Gå„f¸‡æåñµi÷Ûw„o‡ˆ‡þ—•nJ%nÎUu¹r»×SŠhn“ˆˆÁF†|˜‰;¸ô5_$F_HX_ `qˆˆÃU‰MçˆD5x¬`ªhŠ&¾ìÛÀ¬¾îûHÁ›»»+üµ¿ý5à[½ùë»ÔkÁ¬œœ¿ùÁ$\Â<Âó%M2ÀMC;:d¾/œ¼u¢8E ÁÀ¼Ãþã@ä²+ÁB¬ÎüâE^ʼnŒÅGŒÎìÌËü=ÄRüÈ\ÌËVmΌ,Ž‡ ÅYÈÃ8NÃ$D$æýA/.Ò*½Î¿œähÒWÈÀÌѵìÎO®Õ%=ç+M/}ãþƼ.d^æ4ÒM.¿œÁg¿ÁÒÜK҄îæ'-çhNÁ¶LÈÊ =ö<Ó4}d èísæR®ä~|ä íÑT>Õð<å[LÎï<Èïl罜ҥ®çÉÜ&—ƒé~᜾?‚ÞæË)üê/¾Ò#-é½^ì3žÈjnåVŒå.ßÔÃ9Rë6mÆ8ëäékèV^‘Y^äb}ÂEŒ”W-ļh²šË¦¾ë¾,ã_míÃäß>ñîîô^ïö~ïøžïú¾ïüÞïƒäìA¤þKú 𠁢ð?𭍽ó~ ? ïð­”qW½ñ#î ñ ðñA¨#þòOò!òoòò?J¢.ÏQ]ȯÞ"_ò7ó ò!Ÿò&Oñ%ßó@ÿò¢”çîè qòBŸó=ÏóNïóO¿ôÁóDïIà\éî ¡ô\?õB?ò„JõMïõR?ôUÿIqžä´\å6oöLÿö ÷eôgoõ¿>ì½<ì&-ñnÿõcoö~ód¯ôC¿ó€_÷O]îY]å2ÎÅíîóòTïò^õ;¿ò_oøˆ¿I¿ùžÿù ú¢?ú¤_ú¦ú¨Ÿúª¿ú¬ßú®ÿú°û²/G45S$Sµoû,¥û5P»ŸûÀû¼ûÂü¿_üÈüÊßûËOüÍþ?üпRÆÏüÔïüÕýɟP'»ýÜßýÞÿýàþâ?þä_þæþèŸþê¿þìßþîÿþðÿò?ÿ FÿŒ••ú¡™%c]%~¸ PÀ@„ .dHð`C†>„XÑâEŒ5näØÑãG!EŽ$Yò"”) xX¹±eK…0+Ê4É2#M„8ê,)q ŚZô9qhPE3*=ŠÔéS¨Q¥N¥Z5¨Lž³ ܚóiWŒ`m>eš”¢D´>Ӟ5ø0­Yƒãʝk”îÁ¹k¶uh®R¢IÒ%w/`«‰/fÜØñH¬,QT¹“+×ɒ3SN‰y³ç—þmŠÖ zeæʗO£îLšóäÔ#Õë7/^¶ÝæîKû¨Úݽû~›#ÞÁ@q'ŸøØùsèÑ¥Í ó´×„/ǎÅy;åì^7_¿Ì§öñå­Ç,ß^dÛàÂ÷·°ïùø'þVþÿù6r«0åcn°éTpAôN5ì°#/Bð*ì.<ð"»ð; 'äÎ=ö¾ë¸åô¯¾ü†ò >úf‹o8übT±©ŠÎ¬@YlpG{ô±¦GSiÃÐÖÃP½+„ÐÂô8rI$=³LD’”+E¯<±/.íê2@þNóÊ/1²¹ üqM6ÛtS+ =œ’&íŽþüÐN*ƒ¼3Hô$LÒB A²²¿1[ԒLC›î·ƒ“1Åýh„hPmîML3Õ4:>©ìp»:ãÑIñJòAÔ< •È@åK®ú^…-ã"Ý­®¸î˵QÝhåÏ(Iô¯Â|uSd“U6ªN5Ó©N×>sVÉêXK•I¬¤m JPW;ÏÛkrÑGĖ5÷\tÓUw]Æí±\vã•w^zëUÐ]áµw_~ûõ÷_€x`‚ 6ø`„Vxa†vøaˆ#–ø½`'¶øâsÃ-)\ëՑbƒÕc’Kn°cÈnJ)#©* d“F6yfšCY$ŽOfìek#V7,þ~ë6¢y«ùh¤¡òöµ Տ´'#\oiÐT“IÖ¬¶N´Õ¦½êØB·61»ìÒZõ3Pæ¤Ûv[£ôôÔ0CSAl¹knñæÐ<̬¦;CT%û{TÆ>Ô0/éShhÞV|ûqÈWÎÛN9ç¦Bò,ŸüÓö<ôœÔÉõüÈðD.ý°]Kgª®È[w}&ñ¢¦¶HÓ>ïk÷À…­ÕU­îÎólµð!ý²VÅÕÏŊ_wþqͧ´{oÑqõwÊC¼[xßAåžðŽÊz´70N´ÐË~ýÖ£§“3ï5¿ÚûÜ¿§>øЁ¿îù‰ÇUÖƱ.uÀJÚŠ ö%°mþ² Ûk̳µ§É ªâï&¨;¦jwÞٖ=øAVåfaMxBï*)da ]ȐZ¤/¤a mxCæP‡;äa}øC ‘G1dPŒ(D$&qGY!¢Žˆ'†$ ™¢­xEé0Q$Q‘RE,†QŒT‰Zj*3ÊLŒj좫¨Æ7ºq!l”£åèF0ŽQ{ôHõ§16vщƒ E…R„ÌcùøHH6ď{£$ùFB^‘‡LH ‰INFR”£¬Ÿ³V…FK“Ì¤ñ˜ÈV‚’•¤¤%$Ý%ð1d‡då,-9KP.²–ÃþãÖº…Ëk¥1”žTå&…ÉËM“‘Ë$f5ØÁ ›qä'ëèÈW˜…¬c&wiMt¦Sëdg;ÝùNxÆSžó¤g=íyO|æSŸûäg?ýùO€T %hA zP„&T¡ ehCzD”õ€D)jQ Tt¢ÅhEA°Q‚´£#ýèEKÊѓ†Ô¤"M)IYúҕÆ¥0©LkzS•âÔ¥2ÍiOwªÓ–•¦>*OJÔ¡U©EjR™ŠT£>u©N¥jT«ÚT«fõ¦W…*V½ÚU°NU«a•jY)Q´¦U­kek[ÝúV¸ÆU®s¥k]åêQ»æU¯{åþk_ýúWÀV°ƒ%laýŠ×º"Še¬ZkXÈ¢µ±i¬d#{YÌfV³›ålg=ûYІV´£%miM{ZÔ¦Vµ«emk]ûZØÆV¶³¥mmm{[ÜæV·»åmo}û[àW¸Ã%nq{\ä&W¹Ëensû\èFWºÓ¥nu­{]ìfW»Ûånw½û]ð†W¼ã%oyÍ{^ô¦W½ëeo{Ýû^øÆW¾ó¥o}íëڂ@Vûåoýû_XÀ&p |`'XÁ fpƒü`GX Î+®káÕ¶³ùe+|Ëaº‚¸ÃØ«:pb§XÅ+fq‹]übÇXÆ3¦qþm|cçXÇ;æqw| YÈCrðÖ!¡þ,“ãêdµB¹­RfëJX+bÈb9¢"&ñ_µì×/ËÕÄ>&s™Í|f4§YÍkf3™ЁÀYÎq¦óœ/`d¹Z9¢zö,•ÛúX´ú9ʀŽrk9ìaƒl™Ä‰V4£óûh §•Ë>ô¢AiD[­˜Ö´£9洎¹Í£&u©M}jT§:Æð€\ýjXÇÚx~rZ-œ’@ãz­*Ù³®o­ä^cøIÀæõž—¼db·ضÆu±ml&;û³•Vtµ= ‚K[úÚkÕr¶±MíKW›Ò]îò·Í½moo®¢Vu»þÝýnxÇûݬ–u½]}ç#×:×½µGY2èˆV”Ï¿æ÷’ ndS6ÐƞŒ±Žá|àQÖs¿.è “[ãÖ.7¤7­iI—;äÜî8Èύåtøä÷·EþVvË[æ3§yÍmîâ7ÛÛÞ´†«“'îóB?{á?·ì± >å=#ÜØFǸ°mX¢/´Ô6÷Ê9Îr”¿¼å,¿º¸#]u°»Ó%ßú×Ýó›§]íkg»šé­óXã;ÏBgø“è¾ô¤]3R‡²Ýo-ôh/ûéFÇ{á]™©o¼êïºÕ¹®ÖI{;å.o9—ÉÎøÅkÑgo{ç=ÿyЯºÕp5ϑþxÑ¥ìô@Cýéz&´f©îËòZ»É1ÿh®O^òÆW<¶ßV´‡^úÓ§¾Ìs.k Ô[îú6<á½ÿ} Ó>ÚI÷~àk/{Üÿè@¿ûߥîY ÿ^ۛ÷pØMrús:ù›§|ÖãÏüÓ8PC«è«><@\³·ƒµ ° ¨7Ós+Ú[¸iÙ5\«@öÓµ`ƒ:Øh=©Ó¦†³À d¶Î6>34â ¯L@lA¬±t5 x@ È>ŒÀÈê½µB,,º·êÁ½4 <­ô®|A$LÂ$¼¾W£A”5¼/Õ*Âî:B%¼þB,¬¾œAäÂ|µí“B1ô,+ÌB3ôÃÂÂ<Ñ¢B’c-@DHŒD4+D¸ Cȸ s/ª-FlDÕzDI EQ̱<4Ä|‹,LD½¾JŽ?ØÚÄELA¸êÄÎÅQ¼E\|±xÂìE ðÅ^ĀC,V,¼Õ:Á×J·J۶̛•Ê+9àÛ?þË<Ó²Å\¼Fl,mÜFnìFn<Å*¼es¶!ÉÄñó–\#6h ÇÙ6§ÓÀbû5hû»ÃKGÁƒ?á»ã“ÅÇ;4¬@åþk¾Ñ²Fl,ÈQìp\½Ü³°óó7‹[¬¾+¸¼ƒ¸‡ü·¼=³²†#¸Ô»8d‹½‚»È£ƒÈX @²k<*œ¼«[¾ç£ÅÍ"HƒŒIHˆ  I›ô€šÄIô€„ÌÄÙóI÷3ÆÙ³ÈÚºg“=À“È¡4Ê¡Ó½¼‹½ò+Éû3ÉkË6gDÉLÓÇùã?—Ô,˜”I°´C„ÈɁ ˱ìÉöËHw<£»k=÷ ¿akËõ{¿Ó8J¨ì;¦ìH¡ä,«<Éá³?·b<–dɶêÊÌúÊ°LL,¬I³4˝$K´|?ÂkȀ3<Åê7‹?Õ+¿ËÄ»ŠãÌðsJƒ?¹äË|œ´©œ«þüûÇf,¾‘LÐBLŜM$,˱Lˆœ¬ÉÈô̺ô@ß¼Gò#¼ð;J¹„=όJÒ¤» üÉ^BÃRF´<~Ä¿û¿û[ƬÛ:ђMÚìÎÄÍÛÜɁØÍ \ˋ+Ah‹8sÌ=¾+Á <º4%~sOÇR²Þ$¿ÖàÄé Ìý4ÍÕâNï Pê{̛Tˆœ$Oø€?ƒ+çBçt«ËÂÀ*ÊÐ2LؔÊÔPÝPÏsÌÛÌͲDPâ*F¿"Ñ,ëÏ¿$B%CmÑ,¼I].µ+iCÄÃtQMÂðQÆÜÉ%/ÅQÝQ#M@ň R"mÒu;R(=@ð$þPñäI'½R¾ÒÐ(ÝÒTÓI²ŒQ ¥«-7ÂÒÚÒR.MÓQsÌ/-PšdRAÓµ2"µ¢Ó¿ ·ÂS3µ-4US?U37]ˆµÒ¹ŠÓm+;E«D…,=ÝSÚêÓ?Ô2ûP›ŒQõ;_k6 œ+²a´cîÂãRJ~À8+=`ÎæÜræmV;J¦æˆ»eçå"çr¾9Z¶€ÑgvÞ.w~çšmceY³Äz¶®{Æç™Óg( ç~~T€vÑxne‚.hÙú烎7¦g†öç‡æÐ]üÂ/ìå`\ç‰&.‡®hwóF‘öƅîhך0”Ni•^i–ni—~i˜Žéý2iš®i›¾iœÎiÞižîiŸFր;PKùÛTÏg)b)PKÛ°-AOEBPS/img/atz_dra.gife"šÝGIF89a®÷æææÿÿÿÿÿÎÿÿÿÿÿÿÿÿÿÿ××ÿÿÿÿÿÿ€€€€€€€€€€€€ÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤n»}Ҍè›ÿªÿµ"ÿÁDÿÌfÿ׈ÿãªÿîÌ33GG\\pp……™™­­ÂÂÖÖëëÿÿÿÿ)ÿÿRÿÿzÿÿ£ÿÿÌ"31J@`Ow^Žn¤}»ŒÒ›èªÿµÿ"ÁÿDÌÿf×ÿˆãÿªîÿÌ3M"f+€3™<³DÌMæUÿhÿ|ÿ:ÿW£ÿu¶ÿ’Êÿ¯ÝÿÌ3PmŠ¨Åâÿÿ3ÿ3MÿMfÿf€ÿ€™ÿ™³ÿ³ÌÿÌ3Mf"€+™3³<ÌDæMÿUÿh:ÿ|Wÿuÿ£’ÿ¶¯ÿÊÌÿÝ3"J1`@wOŽ^¤n»}Ҍè›ÿª"ÿµDÿÁfÿ̈ÿתÿãÌÿî33MMff€€™™³³ÌÌææÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿÿ3(P7mEŠT¨bÅqâ€ÿŒÿ3™ÿM¦ÿf³ÿ€¿ÿ™Ìÿ³ÙÿÌæÿ3Uw™»Ýÿÿ--ÿDDÿ[[ÿqqÿˆˆÿŸŸÿµµÿÌÌÿ3&M3f@€M™Y³fÌsæ€ÿŽÿ:ÿ«WÿºuÿȒÿׯÿæÌÿ33MMff€€™™³³ÌÌææÿÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿ3M&f3€@™M³YÌfæsÿ€ÿŽÿ:ÿW«ÿuºÿ’Èÿ¯×ÿÌæ!ù,®þH° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cʜI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×ŠK¶¬Ù³hÓª]˶­Û·pãʝK·®Ý»_o(À·¯ß¿€ L¸°áÈ+^̸±ãǐ#C×æ^ɘ3kÞ̹³çÏ  S®LórèÓ¨S«^Í:õhÒ2M·žM»¶íÛ¡_Æ)·ïßÀƒÿÖ½Ûeoáȓ+_™xq–Ç™KŸN]ºóç*£Wßν{ëëØQþj÷N¾¼yÉàÛ¾½û÷Ó«'ɾýûäåÏY¿ÿÅfý÷™~ûÔŸ€ ÖAa%¨zt`gÁGfý5èÚB:X„r4!ZíU8Y†NÖPŠÆ¢xˆiؗXçÉH¡Œáhqb1Øâc ¾˜ÑˆÇÙH£_"y$_F^Ö Œcýµ¤”ERÙä&™äL²=99Çâ3 ¹^Œ½-¹e€]~ÉåŒN~YSÒùá›^g–pb ¥œ€¥wݙh©¦ED:h—zb'¤‘º (¥s*Iؑœ>š©§€šv)¥yšÐ¡hæ¸(}ln§þy^™éœ²ZI(¦ñ…Y§¦³¾Jª®¯v*Bà!ú£¢«ND$ž`ÊÉ'¯²ÖÚl©:òú+´ºÂŠk¨Ú~Èà©©˜,l‚©‚ÂV ì¬ÕVkíŒçҺʋm®Ã$Ÿ±-";.DËZ›.¨¡bšî¤òÖK¥¹’6­¨_«n½î"©ïX>†›˜¿ÿ:0³Áâé,ŸwöZ² Ú™lÄ{Yò¨œ¯Ç+ÆqÇ } rÃ"·+0‹låžÔNYk§bÚ¯ÑÉo¿8KXsª> uÔ"NMµ¡V_µF]kÝ݂U,¶‹_ƒ}v¸ š½¶©iù6ÛsÛ·Üuç­÷/Íw—­÷ßsóÝ·@an¸y‚^øáŒs—xߋ7.¹uƒ3:ùå >~wä˜w>ÜÝþ 8`AƒP¸aC‡!F”8‘bE‹1fÔ¸‘cG=88’dI“'Q¦T¹’e˄ aƔ9“fM›7qRْgOŸ?ø2gQ£G‘&Uzt§P§O¡FEItiU«W±fÍÙTjW¯_}RÕ:–lY³d¹‚U»–-A±gáƕ;÷cÚ¶wñB}K—o_¿|íæ<Øå_Ǐ L˜qã‘{G–<æbǗC¦¼™sgˆ–1‡¬ÙsiӒA‹V͖ôiׯé¦^=ÛkkØ·qk•M›÷SÛ¹gڛ¸Úß‘'—¹»xóÂÊ¡G¯ÉÜyõ©Òо{wïßÁ‡ÿþnQ|yóçя—˜ž}{Çzü6uãäå·¶ò~ùÿ‡ÂN!ÿjÃ/>ýBëÀU¢6»:BÆÄLA1,ÉÁ×&ŒJÂü&êP/ø2,Ñ  ‹B±® ´®ÂË.4QÆTÄI;¥Dô­Åê^̌ÄM¬ñ&‘„Ô(G§><0D:H ÏÚ©HŒœ *I—„²É'ƒŒ¡á´Ô Äõ˜t¨J.)ôòËËÌK2ÃlèL4›’¦´ìtÓNJæ\«ÇÆb¤@÷mïĭڄó͈úì)PAA,.Ï÷SIE+•ÒjnR3etLQãd¨ÑMy¤N=µéÔç,þ]”R@gEu´Å´;ˆÕVï µVIõ¤uK[ “Í®]y]Î×aee6SS‰­3%< ª;Þ>-€¹ï ’òÚiwԐ»T‘ Ö¤¦¾¥1Ý뜍¶­cs«Z»e V¶=w¨zٍUC~W²Ì¾?õ¥×­}·]w;WyFÈÞ{Cš¶`<öwU€ܸAsÿ5Xb‘#>éQ†ù«÷á/Ky;·ˆŒÝ\¢ùeŠ9Ê7dŒûùÄUi¦7蘭õ–:‚wŽ7ឡEybŽ—¦q^žÑEØ摫v¹å€ñÖ;~¿ÎØg‡y68ת¥ÄškLM®¹ì­WýÕi©˜euǕYo­þù†7¬§ºê¸ùdihµ÷M»ïµIµ¸Û™ó»é¹SþYi©÷.új«±Žüf’ ï:ð¤£Ö0\Ç¿EÛê¼[W¥'<™r_¯=À’³^Zq³IÇy#Þn]O·óày]yÓÙ¶]øäS•{v$šU®rW|sèw^òŽ€×½åm‹·qè?þ{M Fß}Æٟ>€!r˜]þüs¼k=¦mæ¿u«|d ÿp72ªëcÍÓÕÓ;éÉÏJ»›£ò’­WùOcɚ ^dGA¡„saa¯JÕ8¹î„ !’@sÀۙð]ÓY¨.¥Baáð…:®æ,¦ðƒ³AZŠØÔþd€ÀÜV¯b½Aý.Öø6®ã§ˆQú ·på͛'?^ÜÒógʕ=cæ<ðr瘨[=únÒØeO£5íæÞÒ¬sû ›6XÁGÛ^ûw_Áˆ5+Ž´¸ð¢Ò?§Š:AÕ¼7^×>ñþtáÕ­¯û½{ÑóÃ»§Y~¼|Åé£fϽyï÷üUÎÿà_ú¡÷^~‡9×_‚âÈàxõ1ux† ‚:_ƒvÄszHá~Ž˜Ú†&š§ˆÐM8X…$Ž˜á‰ vEc6fUۍ:îÈãUJõä"¾xaŒ2‰d’J.I‘DÉd”RNIå‰:™”UnÉe—^‡%‰Z~If™f2ye˜¨yf›n¾)_šjvgvÞ¹¡œsˆgŸ~þiܞ ² h¡†v©§ -Êh£†&ª(_„:Ji¥ B©d–nÊ闘fÊÖ¤ŽJªl âWjªªšøé©Ø­ …k¬qºú¡¬¶ÞJ­Ú‰Šk¯Œ¶ª+„¾K¬€Áúd²Ê.Ël³Î> m´Ò6{lµZ‹m¶Úöì¶Þ~ î\áŽKn¹Suknºên‹îºî¾ëj»ðÎKo˜ò֋o¾ Þ«o¿þ*Çï¿ÜÁübÀ/Ì°P 7 qÄCILqÅZŒq¦þ 8`Aƒ&T¸aà !F”8‘bE‹1fÔ¸‘cGA† ùPdI“'Q¦T¹’eK—-I¾”9“fM›7qæÔSgOŸ?:T O¢G‘&Uº”)A£M¡F•:•jU«W±fÕº•kW¯_Á†;–lY³gѦåhôéÁ¶ߖŒëÔ¡Z»waVœ‹q¯Ð¾xN€pс“T\¸haˆ Æ\,™1ä‹/gžlØpâȗkÍxtgЇ+7þ+˜µ]ə;‡¶,Ú´Ûðik~9umݜÇö=rêݸW·Vn–ôqӏ¶Í¹9tܹ‰ßv~}{v¶ÈU[&þ½œ<ëÐÃsWOWýùÛÚá÷þ^>øíèï'/¿¿«sDzí‹Ï Þ̶èêãͽӰ ð9O3¿ ™«N´ÞCÀÈÄ«Î=ÊÒË0¸â¾ë­ÁÒ.±Cý(l‘¹œX|‹E„ftÑFÁjüȺ‰d„ëƁ RÈ!‰,ÒÈ#oüŽ¡¯CÒÉ'kúKI(©t :!ZQÃ-ÜL5éѺ Ó2½*ѼªÇ,™ìξ6é£ Áσð·4ñ´j®Õ(ó5üâm<ïƌ¯NAgËSQ¨ú’2Ð÷ÜüóQ@ٓ“º&s\TSšØ¯I雯¶9Ý4TTKtpÓU‰âIÒõ¦ÔûRV#äÎC0ÍÜM<êLü”Õ_9LºÀ2Ö؎ÚòVµŠ=ÖY¾„öÙiW+Yj±ÕtʧšÍÖ[ ¹UÖW‡Äu¡c÷ÛuYÒ¯ÆW£]²=Õe×^”øÔË­ÊÈä÷C2ÙóÓÂ\ë½×à‹ò¥ˆÛS½´Î+UíÎn®XZPõVTˆëã.¼ˆuØâ‘×R(Ӆ)½öR†#Ŕä—w 7£–G…´aWܸ8aîY/Žcî3A/uõ¸Ö?£#Ú祙nÚ駡ŽZê©©®úiŠ­6þ ,hð „ 2l !Ĉ'R¬hñ"ƌ7rìèñ#Ȑ!Š,iò$ʔ*W²lé²%ɗ2gÒ¬ió&Μcêìéó'РB‡ äIô(Ò¤J—2%h´)Ô¨R§Ríø´*Ö¬Z·B½Êõ+Ø°b]zkö,Ú´˪mëö­X¶pçÒ­»T®Ý¼z÷ÚÄË÷/àÀ#.l8c€ÄŠýnìXðâď'Sn¹2æÌ|kîìy®âÏ¢G›•Lú4j­ŒS³Æù5ìزgÓ®mû6îܺwóîíû7ðà‡Í5ƒäʗ3oîü9ôèÒ§S¯ný:öìÚ·sïîý;øðþÙW+E.þ<úôê׳oïþ=üë䓚oÿ>þüú÷ów?i}ý 8 x wÿ ‚ :ø „®§ Q Jx!†j(!…CY¸!ˆ!Š8"{ õ!‰)ª¸"‹Î™Š-Ê8#~c9ê¸c~/…#A 9$x>þ$‘I*¹äsFú„$“QJ)¤“=A9%–Y¶X¥NWjù%˜r™“—ašyfƒcâebË)æ&ŽmºXætrZY|v–‰v¢™àÔ½™Ü „Ɖ¢Ÿß%*lðɹht|ŽéŸã*h}…Rª¥›¾çg¡ŽîIg„žVZš7]ù(r¬Â`þ›¡zºXsoºÊi¨¸2ꢴ 篱¶úÚ® v:¬¡šk^®Êâš)´¼2 ¬®§b—j_¨2‹ì´ÑêIì¯Mâù¬¯ßúú*¢çv[.¬ÛÚº¬ºÝ+î»ãÖFî¶ÏV îºÔÊkíµ—b*¯¿ÿþ;(Â麛,ÃßZ¬ºß6ü°ÃІkp¯ü:nÂùbìq³j±©»(pÈܨÁ‹ lË·–œ¬¹ìÎ ³´W‹îÆ{¬s¿!SK1Ññš\'ʌªÌmÐE_<ï¾írLgÇ6×*uÌ?üá±>?,qÓù­uѹÍhÒJ{»3ÌS¿5ÎZß÷ÜP» ·®v­5¯ËSœ÷ÒO—Ýòّ¦©¹¯N½0á|w,2ä;.3å“ӍoÝv vÅ~'.2ÙrÞäOþ 8`Aƒ0P¸aC .„˜áĈ -N”˜ñâÌ9b¤èÑ¢C’%7jL©’ãŎEvTéð%HaŠÜ¸r$ɔ7g¾”ÙÓdQ£G‘&Uº”iӊ¡F•:•jÕ¨D‘­ésç̓(cbÕè²'Xšfcž:–âڟiMnÕ æНoñz=iónN§<ø©UÇÆJ˜1S·!–™re˗1c˜sgÏg¦Ü2´èËhM§V½š5ä͟aǾںrHښ'ßÖ½›·éײ/ݛxqãǑ'wú;xsÏÕG—>zu×αw†n{wïߕ3þ->{y‚ÛÁ§W¿ž}äßÍÇ/ˆ¾}}û÷ñ?OšÿDùÏó PÀ×#Í0òþ³Š>lÐAÕ6ãèÀ9[ðÁ 1Ì0°÷üSÂÄ,ÔPÄI”h>¡BñÃÙJlÑÅ1úLÅ Æq,PFÌÑÇœ‘*!yDÈ#‘TH©–,ÒÆ$¡Œ’µ&S,²ª'¥ÌRËÚv´r*,· SLÀ¨¬ÑË/ûKSÍ5ÙlÓÍ7áŒSÎ9é¬ÓÎ;ñÌSOþº<ÓÏ? T 2-ÔÐò=TÑE=¢F!T8I)­”Ñ-ÍTSƒÝÔÓOµƒÔQ#í”ÔSQuÓTYýÓÔVaþÕ´¥XiåñÕZq-5×]¼•×_õØa9%ÖØL…=–Ød•m6>fÝÚh©´Úk«ÄV[+§Ý6Õn½ —Iqµ—ÜsB·ZsÕ%—Ýv+}ÞyéÍUÞzñÍ÷Ô{õí×ßxÿ]v¾+K}”àƒ™#4Blù ¸ÐNîsÉ&_K±…¯Øa ;|´ñÔàýH.¶â‘1í8]ŒSy`N †¯ã˜òÏâ’E™eš5´çŸ]yåŠ?öØè‰ùh¥‡™i§_>Oè§=.Úi —¶Z珕þP¯F´j­­ÎˆëtÍyf´ÉÆølµ]f›m·wNí›ežºì¼g;lD¡¦›l¨ —ºð»õÜð«Š}Zk«¶8kÁÝ>œW¿ÿnéGy>›òl=}sÅÛýsªOZr‘Egýt3µå½¯F9æ¤ o™C×]nµkÆ=“…ßúî…#Gø·eþ ,hð „ 2lèð!ĈˆXq"Ƅ3rìèñ#Ȏ5(i2$ʔ*W²´(qdK†0cÒ¬isâL‚%î¼éó'РB‡-jT`N¤2mêô)Ô¨R&MZÐêÔ¬Z·‚ÄÊõkʜ0MÎô ö,Z´fÓ²uyÕ ÕµmçÒ5*·.Þ·zz½›÷/ఁk„{õ$OŠ f¼¸laÃ*ÉR®lù2æ̚7sîìù3èТG“.mú4êÔ©9BF(ve²gÓ®mû6îܺwóîíû7ðà‡/»8òäʗg-™/ôç(3¯ný:öìڙSßîý»v¿þҕ® <úôê׳ïÎþ=üÛâ÷Fw8ß~üüú÷óà¾?€ÛÝWŸNT±ô_€ *¸ào2øàp’7žk-9!†öw¡†ÊçœkXI؇šxbx(ªhۈ}•5"‰+Ê8cu%Òø`‹$V„M6Þø#³ù$€9Ú÷ӐD*©b’KægdTM:9%†RR¹”PYy%—E gY—×eùԖaš _’<êT晴é›mÊùݐfÅy¦cw駘½É¥g—yò9(>¾¡½ š(£íñ&–XêFâ‡. ’jº›Uµ©m”Vx)¦ šŠ]§†}zªl”^t’þš•öëMMR–^IB¦u¹Ê—©’©X©k¬¶*±í¸×«C¥Yz¾úêÛe½:8í¦ÂòEOÆà*RÊ2;!Puvg–¶ž‹­€À©-}:y ntcÕë,µîa‹nmd ¹®l¹ ¯ÿö«ïqÿ»/uÒ®KðÃnB°¿NÂ;,¢Æ‚+®½äÁ˜‘¹ì.ÌpÅ SŒîÀ·J|°Ä —¬² »<2¿1×|kÁï> ‘»NҋXOۊ+Ô³Sl°ÍGǼrÒJOûô՞¼ðÔK;í2ÖJ[}³ÌïæÜ/UÞ~˘”0ó*²ÕW3 5Ò-6Ül³7Ö/»=å×nâ'þö¢_:¬2Ú&Ó­õҁ_(¸Ö «ôÙ×$´ºÍSÏSöÍ)„·Íô❎ ڄ#®øÖýùÈKÂ,ù‹bÓv9ë2g]úÌió+8ɆçFrÕ½Ó^õíµ'^ù~o?ºSè“Ý`ä'çþ7à¦ý8ç,:NýãP›=ýÃÆI=µ®ß†±Èb\“ºà«Ÿ=ÊÂÛ®=nɋì=û-Óm:Íx¯¼[¢Ø#’'>4 9ájÖ¬d¥”W h ,­¦##ïñI5¼ 3(µø”/YD`² Ã1í<+ß >昢ìÏ7\ÖEÂòÀ0„”±P3¤Ââ+?¬!Lm8.Žu0&-ÌárvÈÃRùÜ A(Æ°„“A"„”¸D$Q ‹]dO¸løÁÊJYˢⵘ1,.H[´I¼øÅõ$æ|>þȁ 480… 6tøbD‰)V´xcFŒvôødH‘#I–4yr@ +WjtÉð G‚2QÖ´Y0áK;yöôùó!͛C‰5z4%˖@+"uJ4'S©S©VÍ(ôiV­[mªTj"W±!£‚5{mO¬cÙ¶ë•eڅPݚ,+o^½ ×Öõû÷&Ü¥ré&»qb´} 7vìQ0…¼#9Ê pY e̙7¾«thžŒ—.y²ÈÍ4+§Dè:³áÏ¢i×®¸örnÒ°AöÝ­º¦îÎ%q;E—òëؕusv<[¢péÓ©W·~{víÐCŸ Y5ÖþáuÅý}ò8a౗óÆ٘;Äó¦·ÆWì]yÌð8çg-_ø¨ôÒJŽ=×Zk¯@¿ìs¨?úžZ1ü Ì-? :Ð@„:cîµ — 3 a;ÐBÖx QC5;O@´äÌ2S„ï*=³!cdoG÷ÌðDçFÜQ3…üÉÕ:\rÈ …4ñ£ϲѸ©$G¾.®B#4²Gå ÓÉ ùk®ÌÕ4“Ì/£TJ2ä®4 Âçt«N½ðQLÇS³G4Û\sP»ÓË!KœéÏ áLíΡòT¨ÁHË’Ò ‘dÓÍ$ í3Q"Aõ‘Ô4c5Ñü6íHJ³,•ÔþJIѤó-LÊOÝ̕È"›Ô•PCM=´Ðaßü*¯J5sÒ[ìTR­š•KÇ'l”W U±Xç„uÏBS×QM6°;›UV¿UiõÏVvÇú–¬W!;/yUµqÝgÏ,—Ø …–¸x¯¤·ÝRíM Ù|Óe6ÖÀÆëvLTͼS}¹B8¦Ff8.t»R7b¨²%•âï4žÉà]6_j>¸dóü ³ÌA„5ã—},æ´V^yãšÑ{åe×\zgŒ³$úç[5kh’7ò7МGÅêÌZŽlʂ^lf*û59ܔ†K[P1ù4ïë°å¾·a™G†øꟻNþ)î¹ýži쳪Æû¢½¤³ï¿ÿž¬ÁiÎÛeQºë2=+×RñÌAÌîà¬.\sô(ÕÍòÜ2 }ñÀ©.›_£Q‡l»Øe¯îÁÙm¿wíÊ÷ÞÓnòד®tÓ W[øðºfܪã<[ÖYÛ%Íù(ù2=YìE;y»ˆf¾ªêMƒžuꁿÞò† ßoÉÉR½ñ×É¿{_w›Vèh»g8ø›—ßuvAšÚ å!Y *‰#ÎþüEðQ…}÷ à=奬-í‚<{ýzÃ%ðÔKif›œÿÂÀàuќbZ¨¾¨7 !ìø)•Ø…„4!訵*jþCî+XÏ<·žúqK5T×(пºåuó+¢ÒPåÝ,ï… 4âµx…­ ±ÆCaQx´&Ší‰d‹âÈ*P]ŽH´KcC ²ð=*ÊY¯ð¨¤Ò́9œJŸÃF;,T$ "HD:0…mÊUŸpvGZ²+,AcȶÆ2'tüà‹Þ¬ßŠ‹qäQۈÕl’sP A‰Qº±‡Öô€¥Êúf„š|_·C‹Ò^øSãÑ`x² ꒏Èû•/'HaöFRA¦l Ù=esr¹¬"Oy10n«Ccœd9U£”vsužäa-/tK\.Œc-rç09Ù9ÍђžßŒg8ñ9÷Àéý”å?»™<ÆoŠ¯ÊçîÊÏX.ÓFþ p Á‚ p!Æ Œ(q"Ŋ/NLèp#ǎ?2„ˆ± È‘&O¢Li2…–.-²tI$͚ KªÌ©3£Í‡;E©±'Ñ¢7sâ ªt©P™/+ÆtitêQ¦VW  u+×®^¿‚ +v,Ù²]©¢¥™ôäÚ«nßF•y1îÌ´E۾͋Ð.ß¾~ÿöˆw¤V½†—juÚr®ÓÀ ¾:Ô1åʖ/€Œ‘BáȞW&V¼fcÌ 5:Ù4ëÖ®?¢¾ØÒ,íÚ¶oÛ-—±ÌיS^í{8ñ˱eëN®|9óæΟ?'\ÚõqàH‹cÏEèÞ¿ƒþ}åôÖÜ­ Õ®~=ÚóÝÅÏ/yÓޯݣ'Ì~?µVç |)Ñå~ùÍ՟‚ †”—€BèÔNއ d bØ߁rWy¬mØaDÂeX"q!Š˜"PR§âŠ&ˆŠ.ÒXŸTÖx]Œ;☣Ú×âéñX¤i3™¤A,š§$VFBY’N:É$ˆTbDb”[¦…›—_‚¦˜b~x$– r™&`²Ù¦›òx&LjÒÙכw♧nqÊI‘–uZ“žƒê&Ÿ}Jôg ‹vT¨£Îw(¢)ʨ¥—bjæ¤#fÚ©§Ÿn·)§ ’Zª©5M©b¥§²Ú*¦©¦ª¸ª«³Òš&¬"ÊZ«®»Âxk‡¹ò¬°ûùÊ!°Ã"›¬¤¢î¥¬³ÏfW¬…ÇB[­µ]2»äµÛr˜´RÛ­¸ã6˜-Aᒛ.·ß懮ºïBË.zîÂ[/²òZG¯½ûîŠ/púò°«þ¦°À—Jðg#Üp§ {Æ°Ã3 qdSœ1†±ÆGÉqpc’\²É'£œ²Ê+³Ü²Ë\™³Ì3Ó\³g;PKáªÿ˜j"e"PKÛ°-AOEBPS/img/aud_fwk2.gifë3ÌGIF89aïj÷ÿ××ÿÿÿææ怀€€€€€€€€€€ÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÒÿÿÿÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ33GG\\pp……™™­­ÂÂÖÖëëÿÿÿÿ)ÿÿRÿÿzÿÿ£ÿÿÌ"31J@`Ow^Žn¤}»ŒÒ›èªÿµÿ"ÁÿDÌÿf×ÿˆãÿªîÿÌ3M"f+€3™<³DÌMæUÿhÿ|ÿ:ÿW£ÿu¶ÿ’Êÿ¯ÝÿÌ3PmŠ¨Åâÿÿ3ÿ3MÿMfÿf€ÿ€™ÿ™³ÿ³ÌÿÌ3Mf"€+™3³<ÌDæMÿUÿh:ÿ|Wÿuÿ£’ÿ¶¯ÿÊÌÿÝ3"J1`@wOŽ^¤n»}Ҍè›ÿª"ÿµDÿÁfÿ̈ÿתÿãÌÿî33MMff€€™™³³ÌÌææÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿÿ3(P7mEŠT¨bÅqâ€ÿŒÿ3™ÿM¦ÿf³ÿ€¿ÿ™Ìÿ³ÙÿÌæÿ3Uw™»Ýÿÿ--ÿDDÿ[[ÿqqÿˆˆÿŸŸÿµµÿÌÌÿ3&M3f@€M™Y³fÌsæ€ÿŽÿ:ÿ«WÿºuÿȒÿׯÿæÌÿ33MMff€€™™³³ÌÌææÿÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿ3M&f3€@™M³YÌfæsÿ€ÿŽÿ:ÿW«ÿuºÿ’Èÿ¯×ÿÌæ!ù,ïjþH° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Æ0cʜI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“ÂtÉÔbP£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓhÊVâÓ´pãʝK·®Ý»xóž]Û¶o÷z L¸°áÆùú]Œ0âǐ#KžL™®bƘ:®Ì¹³çÏ _ΌysèÓ¨S«^-u4éŦY˞M»v^ׯûƶͻ·ïßYqçf»¸ñãÈW δxòçУ?^μ¥séسk—K½úÊØ4CþÏä~}»yéݽ§æg÷Pá{u.ÿ¼ýíé՟dµ>eÿ`x߀æ§_IüÅ×^Lý1¨ |ðEè L ( *ˆá[f¸¡†õyè!$¾w qUAÈáŠ~(¡†-ª"‹SYH#ƒ/bØ Œ8ÞHc‰@zfà‰"±'"‹òè#Œ-îؤ“5.£cJ™ã…Af‰ØD‚” ŠU^iå‚QŽÈdkc2鞘JV©å›’qÙ¥G NiUJæyæ“TÙ¨'›v –pz֥ۜH¦/²9á¢kþˆæŽ€Vš¦ åª)wˆ²Tç”`.âS9>(jqã™ê¤Œ>ªg«¬‹n*+^rvúÒ¬¸æÊY­¶b”©®ÀkY¯ë kì±´‹Ò¯È6ëìV¼*K³ÏVkmҚDíµÜ6m¶mÛí¸Á~ îC⒫î¬æžû׺ðZÛ®» ¥ï½YÎKoBöâë/úî{P¿ÿl^ÀD°Á £—0 G ' ´°ÄÿFqÅgìqm?ÜñÇ$+W1G#—¬²x'o”òÊ0ïÚò­qÆló^,þ4@à@‚ D˜Pá‚H<„QâDŠ-N àðâFŽ=~RäH’%MžD™R¥È ]¾„SæL…WšlióæNž=}þTèϖ4Eš4¡Î¡‹2mUêTªU­ö,ªTëV® ¡^ÍúUhF²e͞E›VmƊkݾ…W¬\ºj¯ÞM™µë^¾ZÅVÕû—h_—s s5|˜ `¼7êUY²AÆR!WÞ y²ÀěivŽŒÙñ舚=Ÿæ[WµjʖQýºpÛÍ¢I“6-[÷ÑÜ»[7횶o†±Û¾í88qæ5›{®ÛøsØÃ%#OŽw9uî¶7ÇNòþ{ßéÜ˧ΞâøîÌÙÏRºõöœé+Ž¯~êûúÒûÌï#þ»¯½óö P¿èþû侀^Û.AŽ–C«!ÎÌ*®À†Êú,©ÃâðÂ’PÁ dг§6Dí»-¢Ð+Î,¬ICØhŒ©7mœÑ;/[ÊDýPLq²qÑ»Œ|d²G%—„ Ê$Iô)Fçšt’Êõ®¼Q&gÛr©,™RK!³#²ÈÐÆ$s1'¥tË#Û|éEŒd¼²Ì Ã$q)(}ü3§(ŒG:)Ãñ·3“KSÍã؜óPI#”Í3óêÁ85½ôΚþ|óÂ&ÕRE% D=MõnQ4íþŽÐ5 ,KY¥$«K˜ì„ÈJ1±öÔÒê «Ëb,6X Õ,P ÷t7XÍ 5ÎD)e5We¡]É×>¥ÐPDŸ„sFdCܑO¿e×hóš–:luµvRK“mwž¼ÕµÒpÕ×؀I­tۆ Ä÷Ç]ߕ6^ðÆL¶Gߜ7áÂôÝO$!†àDdVCXàMfX9‡VÕÀ–TuTmETÆ*3}vfN¹öәŸ¤7b õèAE9eíVvϯÚ0Æj¾¢Í—@¥—fÚ·Fé}¨­y«¾°ýºë¬ýSêëâ ¾Y¶Á;í²ïRûl£ê^s,©=÷m0nçËn´li(¼½ôÛíÄÁ0ÁÝN±pÃ÷F5òÅïnÜñÇ[\­s¸êð/?ím«3wmóÒ¾1uIWvÄQw]u#Y÷q?Ê{î{jôhÝöØG+–*ѓ®œpÙG~Aá¯kXrÝ÷ý9Ó·r·y§ž¿øÜó<|¶Ö¿|¸Ú2?.í'ç^8â¥_?~ù›?¾ýƒ½Ÿ?ý¯ßþêö`Ø-ÿg€D`'T@ÂdO„`´úW@FЂ|‡AvÜ E8BWMÐéCa U¸B¶Ð…/„a e*ÖІ*ºaëþ,hð „ 2lèð!Ĉ'R¬hñ`€‹7rìèñ#Ȑ"G’,iò$JƒS²léò%̘2gÒ¬™p¥Íœ:wòìéó'P•A‡-jô(R…–2]êgÒ¨R§R­êÑ)F¨&µZíêõ+ؤ\…¢ö,Ú´jË64ÒíÚ¸rçÒ]¨Õ,ܺz÷òí{ñ.^¿‚.ŒjF·y 3nìØ*WÅdíÂ\üø2fÁ‘oNîi93èÐq7&Ët ÓÄšT½ëëÕ²®]x›D¬q”a‡%šH„'ª¸"a²ø"Œ1Ê8#^‘øV9ê8э õ¸#uaw m×iÜk.§$jL¢Ç^‘³õ$•Žý‡_mï½'ܓ‰eyez݉Ù]–±Uy¦aCÇvRne’Hª™b“ç]Ç^‚m¢¹g_z–¹Ÿ–c~ \  ¶¦%—c>É'£zåW¨~6¨¨pƒ"H) xêçb£ªåàšª))”H*·¦›¡¶·àŸ—zúê;‰?Â:뫲Òz+®¹êº+¯½òi«¯Á¾¬°ÅšH¬±ÉRˆ¬²ÍȬ³Ñ>ç§ÒZ»¬w×jÛa¶ÛÒþЁ 4xaB… 6tøbD‰)V´x0@Æ9vôødH‘#I–4yeJ•5®tùfL™3iÖ´yaKœ;yöôùhP¡75ziR¥K‡eújT“©VµzkV­[¹võúlX±cɖ5{mZµkuJ@\¹séÖµ{o^½{ùöõûp`Áƒ 6|qbÄNÝƄ«rdɓ)W¶|sfÌ¿|¬thÑ£I—6=šs畟O·vývlْS«NÉzvnÝ»y÷]ÛöIܾ‰7~y\àÁKOþzt闗3é|zvíÛ¹ã­n=$öþîãɗ7þüÇáåjl/ž=Ýøƒçë­:¹>_«¾ó›÷ß½ô:Zï3÷”ƒÀÂú³k¾7+P?ñrsð¿ %çâ3BúëP1!ÑC g#Ñ ÄÐ" ábÆ ,‘Æœ‘Æ eüpAªæò±Fc,Èß« È"c|‘µ$!´‘È™„2Å*Ûcqªsœ2ÈÇÜÓI/Å$J0åÃÑL0ӔÑÆqã±½#ÉürÌ-sÍ#Q´²»±œÈE;óì’J95Ó»5´NBí<ÓIHë<Ï!usO>¹óóψRH'MðÒQ#3ÒM-³Ò0]ÕsþÕPÕô°T*‹Ô´JN;};EÝ|QFY6ÂB]4O8϶V#ß[2V63Åu:]wm¨WL™¥ÓØZE%VÎfÕd²QDq 7\J‰ÕÖWp-¥ÖBk¯](ÛUýS_ë³4ßÑüßrÙ$óUUïU÷Î&N8ÝFáõOÞy2Ñ´iO;÷áŒÏ“X=Ù&ÎbE¾˜c(íÖÞR™eÝ".¹ “[ž™æç^†™¥šuÞ¹Zœ/’™ç …nífŸé¤3+磕~ê}n1ꪭ¶Œi˜¾šë®ïʺ䭽Ûk°9›lÙZ›í¶ÙºpjÆJ›f³ã®HûÐ=mºÍ³[o‰ò¾›o¿[5ígÆbÛ[NÕzkÕµÛNª­¸ýú-º?…[.Rв‹ì¹éÊ;Òºï²G®½Zšdæ¼ýnTo¾Òâ›ï´þœ[ek*¼0à ;ü0ÄK<ñš‚ loÁüX!xü1È!‹<2É%›|2Ê)«lraîÌ­ÅˌÇ+Û|3Î9ëÌr̝¾LÙ©3 ½§`;}4ÒI·|ñ»nÍIK=5Õ$/MôÏ*ýôÓQWý5ØG_ísÖ0ïË5×^‡½6Û)pÙIƋ¶Æj·}7Þ¿M€XÜZ#K÷Ðvç=øÚ{sÖ·Ü[^7²„;ζá̧Ӌ++øã™#ùäcVn9°˜k>zΜ#n®â ÷+:é­«lúé ¦®º¼¬»~{É°Çî^·´ûk»Þ‘Ù,|Ä㼦ØK­ûî>žíûꍣ,Ùðʯ¼ÛØ_:ö›÷ ÷[þ 8`Aƒ&T@áÁ F”8‘bE‹1fÔ¸‘cGA†©‘aÁB¤T¹2e”.YÆ\ “%M™1mÞÔ¹“gO•%>¤ÔdQ£G‘&MH´¨Ð‘O¡F•:•jÕ¨Lö„i“&ח(Clu v,Ø°cϚ‰¶eY³b²M«V'V‡í*Õ»—¯Ñ¼K­<˜paÂyǤ+n[ÇgÓ>îJ–òڜ“%¿ýšrçãí;št邠ïV½šukÕˆË \\S3çΘoWöÜÖ«mȸsæÖÚT´iãǓ¢6èÔusçÏ©º•>zuê<{ ×\wpÞ¼ÙöæþN»ìp“Ì#*G¾þ¸úÐÐáǗ¿½Hرg[.¿½{ß´[+.þô©%â†bOÁOJn¾!|°¾î*¿«²ðüÓγñv“k<Ü>Cp"÷L)e‹ÐÅ]›$ØNûŒ.ÌÄÓ-·ìÀSk¿yüñÇÏ+NÅ#IcqalÒI¨˜ôÅ ¬ÒÊ+±Ì’1%RÉ/OsðÉ1É)ʎ¦ÔRÍ5Ùl³&.ÓSN¥”<³Ì;ñ„ÈNúŽ¢ÒÍ?T½ ½œóË:óLTÑ.¥J3ÐG!N= ­ô<1ÍôÎ=Iê3ÒOAÍrP#--5Ì5M•LN3r4ÔWaþ½iÔM­µATUÍFV1r5Ö_cõD[‰ET×c!äõ"_möSa»$ÖVc‘­>e-bÖÙm%-’ViK¥ÖÚqclÔSnÑí6(RÁ5T\rá5 [v³J×^6¡³]Kߍ×ßÀæýö¼{ Ö2_J÷­´ßnÔ\¿ ŽØʃ(4áÒnXcûnJâÍ[Wà‹Åtã“9¾ê\YÆiҊIž3c”inµã?ö3bŠ-Ž™¯™kz¨›ƒ²Î裑NZ饙¦îåž}Ö h¡©®˜è¨ÃÚ/zµfoꪃxØ®O%°‘ÍFîk°i;Ú´eƒ!BåöÚd¶Ùv[_¸·¡n—îºÕ¾ïªõF˜oÀOãñŸ\èÂa–»opÿ^ãƯòÉùµ¼E´=—óÌQÞ¼n΋U<ôG'}cÓ%½òÕ÷ZÛu7oZ÷ÝyïÝwßU§½©ÖogrUuËm/žÜä5…¾ÉåoÞyk¥_4û©GÜúë‘Ý>Qñ#ìðïÁו|<חPxÆqMÿu°ÛŸÏüӉ—{ú¿öüõ>þýë~±‹_ 8@ÜU þ$XÐàA„ Px0ˆ%N¤XÑâEŒ5näØÑãG!)>YÒäI‹$Q®d9²áK˜1eΤ9€áÌ9uîäÙÓçO A…%ZÔèQ¤I•.eÚÔéS¨Q¥Ö¤Zժ՛WµnåÚÕëW°³†%KvlY´iÕ®Mx–í[¸qåÆt;×.Áºwõîåªf^¾~ ˜°ZÇÞ9ÐoÛő% N<Ùke˙ÑŒYógÐ5=‡MÚôæ†yGŸf}zuëÔ°e_û¯ÃÙ¹g¿Ö]wïÖµtûøñ»Æ+Gþ¹3qèÍ¥Kf®»útꐣÇÞ}ðõÝޏþ«ë[üy½àe«GÏ·îóÛíå¿e|þúí¸ãßço¶?÷ÿH;‹'ý ð@Ú¬AÄhAmûKÁ%´lµâ ¬0'Ç,,°¿A³ÍÃÅFËPCþ8‹­Âûà»pÂüPD¯2Y”/±ÃâŒ<Û«Có´û/ÇÉNܯÈâjìñ¼¬šŒñÈ}$î=ç\qIïx„rËùˆ,:*±óEß´ rÈÁ,oL6s‘K›(d2H3Û´3=!áôRD©úŒêL¬t.Ìö\èÎïÎ óID3{ðC8é#³Q÷ʬÓ@JSNãºiD†BµÉBQGmRT'Mí0T Í4ÏÂþÖ|UÓHeµ«Ô8?EÕ@ Ô5Î@Íu8Wg…õP[ìQº*õ•Xa… ´±gƒµHa••Ë³7µUÌÈX÷ÂuÜaƒYry,ÖÛM!m—]ÆܕwÛhmµÞs¡ÕÞtõ….lRòßDnkÝA6Us§=•_~Oýáž6\‚ k@ŠµR¯ãŒ±ôʐ+M­1ÍPî«äé@fùe˜c–yfšk¶ùfœµå¶Ü‘eºt^ãÍxçR{nèZÄY{=N;—ß5vi!?ué;É5÷^juØaV©ÖõaTIdzìU­5UbkA}[·ÓÆ7bµ÷ê¹'^;[v|£öÞø.Ûb¥ó†¸è®ë.wqóªåºÓªëõÕjÅYm:UËï·î¢%§œp ×{lÀ5—¼<Çwm¸ð­ýU=CÒ7W³rÓ}æîÄûöëóµ­ÆÜïo{ÝuÈgŜøÎ[våiךÁk‘oºytù–^m† þh€À 4xP „ .4ˆ0bA‚ NlÈ0#ĉ+j¤2¤È‘$Kš<‰2%Ê,Ybäèðâ˜?Î$¸Ñ£G‹*{úü 4ä͜.#nìH‘'L s.-ZófI£Q«*%J”)VPµ~|é”jбd˚šTæÖ¬MmÒlk‘jسtëöªp-Gˆ-•tiÕ)ƖVUٕp^¤<¡v4úøoaµƒÅ xfW»œ;wÆ+YîÞ¿Šk’¾¼y°eLJ=»~ Û³ÔØ®gÓ¾;·nܶwûþ »/ðÏË?^\8òå̛;=ºôéÔ«[¿Ž=»öíÜSöî^ö;þøñל?Ô -©ÆFKmµ¬.«g§ÖnËm©Ý~K-¯Ìç,¸æ‚;í¹ê®*n¶`® ¯µéÆK/¨íŽ¨m½ú;ï¾þ>Š-¾ïþK0­ýŒp¡÷6XîŸaŽÊ£bR1 '¼,ÆK0ÃùZœéş^Ü/É/۪Ȼºrˆ.¬`ìž\©Ê(»Js¢6¯œ³Ëܠ̽îܗÃ-͌ôÐ/ýpÒ8?­4¤Eý´ÉTÏl2Ó;£ës×wóÇ ‹\qÙRói¶Ói[m4Ôl3]õÙJ'öÕ[wÛ³×úM ÐX‡,÷Õnn·Ü6O¬vàpN·âgçý,äzÇË÷ŠbköÔ*×ý¶á)ßÚ9Ҝ;®9àwã=¹×•èwۂC=x⍿î´ëŒS=úì Myê]¯~àå²ß¾6Úuß>·¦ ž8ó¸çN¼äÃJﻹÀïçwÓmõñ/9÷ž-{ÖÎGM/õÕ{}]þ 8`Aƒ&T@aCD”8‘bE‹1^ °1cGA†9’¤Æ’'Q¦T¹’eJˆ:”9“fM›cÞø²%KŽ=z’çP£G‘&5 SgS§OælZTiǍ?«fÕZ’êV¯_ÁRìQ*T³gm–½96l[·o °…;—.J¶jÑæÕkoM¹uö)˜pa«÷&V¼ê_Ï!Wt™rØ»‹1ëíKsreρ;ôrfӍVm8ôj׃™ž–­sóÌÖ¯q“ν{héÙ¿m§æ=|ëmâÇa"¾<ªpäÏ{C—Ò7së8O×îr{÷䱯‡þ˜Ý{ùÆÍã®.Þzm™èÓk‡_õzöËÝ;œOÿù~þží»ï·ü¢úÏ@‰ü;²”À…40Á c°AÓLhB WېCÀ,¼³ 2îªQLQÅYlÑÅaŒQÆiôÏC²jÌQÇyìÑÅó”q@ò<"QÈ#Ѳ(#‘l' ÁsrD"­’ÒÊŔì‰É+‘ì,D.ŸÚ’ Á,Ó¬,[ÓL½ rͳÔ|h¤8ßäMŸê|3€øäs)Éò„“ÊŒè ÔÉ;W*ÔÐûôó;@uŠN2#­t'î´´ÔÊ=ýS,M×#EA½Q•H-51Nûôt¢TõþÕMUë<Õ%ZdÕQÉfŵDY£®¬aŎ¶.1MÓWu-ÀU—m.Ì9¯“Š!k‹T[튶ÁfŸ%Ë[ …´=ÆrÚL-XMMÏqÙ÷ÑOáå«\zÏ/ݝ6Bw_¾úåw€˜Ò 8^w­Wô ³«[¯jÙÒ%Z÷n]¨R P]9/`À7ƕÖ.R¢F3v4ª¸§Óœ#G^úÓ©É£a_ŠØqX…+Â]5ð]¦¨W£ÝË×ïiÖ²FXZnÍϚ=ÛU]Y7pß»‘þ.j²xèÍ<Cvx{ôsÓ_g³uLýºH×}Ic¶Jèþ¹U÷ë“øðò(ƒ§‰´ùç…£w.ýëý–à½óç¯Wêví×ßueš{ï!ǜfï1ȞPœÕ§bce&Ü| JhV~uè!Šˆ‘v°8"Šj… Pǵ—^|7áyºg[ŒÊɨ¢mF—Ÿ) ù]‰¤Å6dˆA¶%ތ%Ñ'cQ>Ø”6yaŒ6Néяnu)’HŠé\‘9¦wa~ÉݕRI|ÄE‰™M›Í g‹¹Õ٘y a6ךo}È&š…âõßT&j(vj²È(¤Ýªß Fz)Yeâw"¦²9*Ómav:êG>V:©©’¸W€¨ª*þ]?¾çꫵreê©ÙZ+¢¯Éé®ÕŪŸ‚º{¬h@æj,²öÚªaÍf¥ µÕZ{­µÒj»'¶ÝN—¨ÛR÷¬¢–Š{Ò§~ëÒ¹Í~[n¥á¶»¹¿.:¯XÕ{­ø¾ú®½§Êëv&ÁyNKì½  °™Ëìpu{,Åm’õhÆãšëÄgÊ*¼ÑŠ¬ñSŸ)ě‚¼²ˆõFÜpÇé‚K›·9ë¼3Ï=c;l‡-ëG–ÏE}tÑOYìÂ5]ØÀ!KgÊA/Ë.WRïZ›Ì.› ³Í^¦¦õ± }ñËkÁ¼Ñ_]Œ±ÈaãëÚέhµÄj×½þžYKGGöÃOß,ìÞfmŒwچžïB~7±Ü1) ø¶àÍtފ/θmŽÃí´¾LjEÖw|£¬0êt£û±Àš»nw…¶ÑIù€P5NrÀýÆ-¸Ø¥?EoZ€šž×ꈷÎ9Jƒ¥…£•¬™]ÀFžÓ 9ïs“~=Î Ïü¡Å+›9÷†+ŸY›5:O$ô«X2³+Gþ–ï¿G8™zŒu&ŸežIùÕØÛg|¼—¼&å¤<ÖIŒ“&Ô?Õ©)pê_ôÒ×@›Hïkäâ‡.…ͧƒèYà–&HòŒ-¬ à𸇧Þd(u¼Ùßob8ގ[© î@·0Ñɯ‡9š!þ[¨%ÑЇà ¶Ò¶,ÁRcêÆHòñE;rbì¢ÇF·epm[|ì¼8B1ZI‘c,â ù½Ä驔ø¤™8COþñB‘Ê) ?Kbp–þËZ,g§£'=P’¹“êÎhÈ  ‘rú“„ ¸'êOŠ’é“òö"Â¥qlµ¬¦Ïç.ïÝçrӃäæ:皢P“»$¹ä)WªŠkhuVB*Q’@™Z´¨Tԗ¨–ê¨<›Ã*V;2U.S¥jUǪֵį̂Y}%N±I€þ 8`Aƒ&T@aCD”8‘bD†1fÔ¸‘cG B¬8’¤H’'O^ÔX€eK—/aƔ9Óeš7qæĉЦK”#U‚:”hP&J4J”iS§O3"MZQêT”KêÔºµeO®_ÁH蕥U¥PѦˆuc՟lÕƕ;÷ [³vÍR„Û0lߗdý†Ùp^{é&^8oIŏ!«mœt²aÄ ÷œY°ÃÂy/G†z¡eѧQ¬|ÕðÛÔ I¿6øù®ì×±yš¶½›÷€Õ)[_í­7oÚV‹/ÊX·r磃+îøùâêc_6¿7yÁßg·‡Oþûèt âg£÷ž´úñÌA?Ÿ~}û÷ñç׿ŸÿÿôÏ<ò( ÐÀLPÁÙ«Í=¨º ɼ )¬Ð 1¼+C‰8됦Í< q&íd*µ6LQÅYܐ@³DŒ‘%e¬‘ă¯ÅyìÑGéR¬QD…ñFaÓñÇ%™lrº­*ÒC"¥ìðH$RÒÉ-¹ìr"(½ÄÌ0£;ː´,pÁ5ÙlÓÍ5$sË1å¼ò̶ÒtíÎ=늳N&éü9>“Š@3 uŽÎ@m­±ûµ3Që`“tҍÔG»ä«‹Q.½ÑC/%4SMyt ±O õÌQ-þ-½SQm±ªÐXTVâòn×Wý¬•E©Œ¢o6aÏûÕ³^SRKZ‘M‘XïƊV/g c–:l1 ÖÚ ‘*–°o-âv,m“n>sû|’\¿ônÝv¿uõYt©RN¥âì• Úw+ ÷ÜcÉíGXÛëM\^ùüà æ‰^k .a“ø¡µ:õ­c÷õø¡Š›røawÁ[Ke‚ëe·.|¯UXcß6®9d›/ê˜ä¢¼=ÙÛ¥æe™b—Ó34ÖÑfιhšm^™iu{ö¹Ìx‰xgõ.Tæ—kÙé›o~Zᨥv4fŒrýñêYa¦:c4Ÿºk°¿V”ì²AË׳‡þ×/ë©úÎrî•éùÄw>wë7¾í”§‡zyìKÿlí%Çxi´—¼#ûÔGü¨à±OÙݟ‹>]jWuŸáõÓ׿ý÷¿'>½{ÐÛ^¹^–¿®q$B¡ZXŽÊù‰Ž€¤ý²‡¦ „l^ ©æD浸}Pg:ã±²0ZnpûZ! 7¶*øYo‚µ¢Ÿ¢x®®i#ë!ÓLÈÑp„SZäŒØB•1ˆ@¼ŒÉ*XCTí þ$XÐàA„ PØP`%N¤‘¡Á‹2n|8£FE~Ìxð"ɐ E ÐÒeJ•*ž\Is¤Cuî$‘çO A…%úÓgQ¤I•"-‰ÓéS¨Q6•zt(U—Ykn©5¦M™&_~åú‘%B³4m’ôJÕäR‹påÎ¥KÑj]¼yuº•Ú×ï_´€sÅZìᔅo.>Ë1YÁˆ…¬¸á]¦z5oމ™óç¥|&SôT¦‘1V†ù¥ã®“a«^͕õìÓåzÝ.oßÁ–&^Üaîã©«nûXcËÖC÷8SzMꐗÓ~^2íØî0þî^>´yôͯg¿Ò/ðÎíåϧÿ~Ðûéõ÷Üßßb}ß ¸–*B.@|<ÿ”(?7;PA'Lˆ@—&²B;4ŒÁýƒ0ļ6ô°½¬RTqE[ôÉÄc ÐE³"QÄ˃QFâ©Åƒ”qÄs$²È߄T2¹ÎRüoI(+DrÊ©mÇ()Äð.,³ô5+ÌKLͺüÀ#{:sÍâÒ$3=7ßTM%Ó4“N<ã”S8=÷4Ï:•tP¨úôóÊC麓Pâìl³FH#•tRJ]0Q#1ݍQ%-;NK/*C5Õ«ÔD õRÂFuÕ6þûBÕÔºfõSUXl0\s5©*Z#´uÏ^}-TPY•ÏÄaƒ=ÏÙ]••2Úª¤E‘ThqÌö*k§%ªK±Í­Ǎվm÷köÍb»ZR«5îÕW%ûµÑcӅS_üÜEÙB“·©zï5XTtù5o]2Ûõ÷-xíØ0P¡[빐8Ú¨bën ×„æSä¦ÏSyã¥m-–oÒX6ê^3kb&Iöa16™%€%N9ºÛd¦ì5ʆïçËlç0uÞÙLj§¢Y6£ëصIJî®`ŸMSúæ¯ízŞ¥FÚ㋭®ºh¬c0ä°%ŒûÁ±ÙCYe¼>)m׶µî;è£óNzn¹ wúé»®*Eé¼»šêïÏ®­êé¸1§òðW|>Î+̗ðSIýaÏ»ž7pB7Ôüëב<ÝßÔͶ›k@™%½LÓë^¯vÛ}¼æÝkí]øFËþyӀ-¯Ø‹œÝ]àí›>Ï£'Yû¯·¶úBq÷]üÁŸWôxæ]Uþ/òio¿|óAÌ<ýO×çµRüó×RQã?ßpú©/j’ÿæÂ=yOZà# ‡ȯ «ì³ßµd@ù…MÊb ½…Á¤DÐAÓþȁ 4xaB… @bD‰!hxcF9vÔøbH‘#I–4yeJ“ U¶tù²¥E3iÖ´é0æM;yöLÈfP¡C‰NZiҐ2}6uÊñèʧS©V=UiV­E±nõú’©U±U»Ž ;mڙe¿¶u»ôm\•gÕÖµÉvi½{ùöõûp`Áƒ 6|±a¹‹ÀÛ8.]»“;>†|sf͛árf,™rhŒ–=—6}µKÒ©ƒ‚ýZájÖ³i×Î,Û6J×°yĝxpáCÙþ.rwo忏7wþ¼"rÉz¡;V~!óêÛ¹§Æš\»çþäØ_‡ï~ýå¨ãq:gOž²ùôóé=zvïU÷ðù˯ÿ@â$Âo ºüS?ø ÁWз…ü,Aò&tà ƒ ¾²kî½ ÓºPÊ@¦QÄëH4ÆôPŒPEýŽ ±E±^Œ‘Çífì°@‡Ã1G²z<É #2P¯o,’·“œ2·/’Ò-"¡| K*½ôΨÑöÛR´.¿2ËDÎú¾ÛÍ6݌/Î<Ñ+«Ißê´óN»þԓPûJjr/î´ t§A }T)Ë͒QA!½T¸I9[´Ò»ûÔPE•ÔRM=ÕTU]•ÕÄ:}‹ÖXe­‰ÓYm½×\ݬU×^}ýXµx –Øb=ö#d•]–Ùf¯tÚh¥5vØi­½Ûު͖Ûn½¥•ÔoÅ—\†3WÂsË]—]g=¬Ì£w۝—Þ[åÝ°µú¬—ß~¡ÌÏÓ¾ö—à‚µÝ÷&¿xØà†&kÛìîmá‡-¾8ވbØ)[þh€À <ˆ0¡Â… :|1¢Ä‰+Z¼ˆ1ã€øØQ!ǐ$Kš<‰2¥Ê•,[ºôØd̗4kÚ¼‰3§ÎGÎüÉ3¨Ð¡D‹ÕéóhŤJ›:} 5êP™R2­Š5«Ö­\~¼Úu#Ø°d˚=Ks$Õ® Ç¢} 7®Ü‡I×b¥êv®Þ½|Í^µëôkÁ¼} >¬tìWÂ9dŒ8²äÉ./æyY$å͜;«„}É神‚uïuâyõôëӆI^ Ï¶úÅþïŸ~x6ž}øÙBû…Æ xbõç €.!…ñ!ˆa†f!…B(a„ ¾§ †&žØÓu¢h݄ Ÿ€2Õ5Ûc(ވ#ByÅø¡‹"68b,–˜c‘9ºEb¶(¡‡LªÅ¡‘R¢ˆ¤þíç”ãa÷ –þXà”bb8ŸQeŽ‰æjgµfšnnÖ¦Pq¾IçasbVgžÐݹŸzþù–ŸJ¨o‚âth¡Šj•hM. )TVi¥žMº¦–nZYyÊi¨}Úœ¦¢ž*§©K‘Šj«{q9«®Î:êkiÙJk®¶Á毺þº§lÂÊÚ@3$XÐàA„ .dØÐáCˆ%N¤XÑâEŒ5näØÑãG!EŽ$YÒäI”)U®d;PK‹ ³ˆð3ë3PKÛ°-AOEBPS/img/cm_all.gifnP‘¯GIF89a p, ‡     ( $$$($$0$$,,,0,,4,,8,,800444@44888<88<<<@<öäaB*)å”TVi¥L6â“ä-på—`†)&‘YjI —¯y9æšl¶9f™f¢‡&aQºiçx gœæÍ9Xy*è )îɧx~ (¡Œ6ʦ¡‡‚—h`‹ž˜Fi8ªé¦HB)w“§¦Š#8`êJváÀ‰AÑb©¦šÿšDŽ; ªâªœ:êé§Ú…Ê×¢,°€" ¶"ÙʼnË¢; „™Þ‡«·æª+¼†çë^‹2‹"38;Âp XÅ ,8q"¹'.(GNÌÍ>;½ÑÊѬ·(&«o¼ê¦Qk'&Q…³pTA°àΠª¸ì¾ïÂ֊¹k¶Õm«×¢;8ఊ°ÐEÇå:á@&«ë¯¾ûzìðªöÂ1B¸r$¡üʑ†®š*/ìÐ 7a+ÐúÞ ôUh€kÈ#;P®Ó3Ð\q˜cÆyUš¬#¸Z®r°°ï¬rT1ëÊ;ì+¬ËáïØ'Ž0«ÓäíÀÛ'Ÿÿl¿C+ºI—M3ÝtûíöÕkf­õs\ãU)ŠC¯ÚqÞxË­l¿Ê¶s³p㺲Uì|¢㶽ùÊ ý¹#Ìsá9[î淿θÅØ>Þ«[ލji±ÈŽ¬AÈwÑó普<þ Çí< A¼sŠ¬SìmÓM¯{síI'¯¼î»ƒé¸ïÒ¿Y·o‡ž¶ÔuÏ:: îëüJ¯ìÎL>öʚ­à0;¹ÅÎ{ú²•ÉÞW.ØÝ tåûÒùЇœÈÝeQªºÓÐF´Z݌a{›ÁìD8ƒ¼AïDqsÚœ†¢ëq®…ã ŠD­|u%ÄUGpCFÐJ¤ qÿ,h—ɍ¬t)"Cü‡¢$¸ŽaAHÊE†r ¬Ú·¬˜¢Íµ«U*¢–¦e®YmN‰L¬â%Ø;!nM}žž›à`²|­ñŽKj£!ÇÌLnLÏz"é¢ î8D¬Ë ÉÈAò¼I$]ÙÈJÞ鑐ԍ$çBIKz²qzÌdûˆ™N~ò”l%ÿ²>9¢ò•¼S¥s6©WÂò–@ ¥,…C˸˜—À$“.w‰HR^æ—ÁL&–†IÌH“2ÈT¦4uÄÌfjò™“‰æ4·É"LZ³5½„‹6¹IÎvUó›µ çZÆYNnzªQ§blÙÎz®èð4<ÓÂÿN{*Ÿù$Í>ÑÒO Í@ûBOƒÚ¡ ÍBÍRP‡Þ¢ +ãhю¦íœ]ÍDËRQž£!õ#6%SÒ+¹ÊŽ&MeJm3R²TjíSQ>H3œ¶¨{;µ öÁ˜š¤3-MMÇR)5²ˆŒ6;‘SWäS2Ò¨z§£Qs™Ôt®427-W½Fp¿%V‡êb½Æ­Ö½ë`m‹k«G±5ð€[½J»ÊÒ¯BfQHۙݞU¼$x¬ H# Ð:†¬åÑ«m@4à0bùÍjžË+Wù*›¥ŠeQQ[´Ve:¹e*´ # uF¶²}ðoÈj,Š2«Y*ÿ핳•ñknW¤EŸº¨¸ÒbJÈÃU…¶¨%ìæ42ÄMqµ­Òmq‹ Ý:¦[w[X­ô%¬ Üpm;pÕv{û6îN|Çê^ ™]%M—ºA²nuW$¸ÎÏ­fCÖ¥Èæ-·ºÕ¼Ø» ÂeC•¶½Rz/|»´Q•†qUH+žÜ\…Ö‡¬VA3í„å¦A ¸Ê°µ²•z¹‹à))xÁt’o‰\I-1*ks] b¦Æ£P|ß ŒÉ&¸»©(ViƒKÙÐ;—b>|LÇ×QCuBN“|¤3YTCn2•“iå+sËÉP*ò–-Ùe/w Ì]30Ëlæ ¢9ÿMõœªGÙÜfE¾9ÅdB›ÓbåC#õ§f,*†Z…);”Îuæäÿ$fNYcë3‘¬Ê"QzFX•[Lh_.ZQ¶¤¡ý—³ÕÐcpxî»ÈF×mù*5¬Çت ñ]JêºP½Ä‚ 8Zpˆ"º¨eWÙÎyɝ^q–¡éʝ1mƒ°A d¸À”[Õd+k+tEÍo"#ZÍ"Û,ÝΠϒ¢µË}¬ˆ,ÝãA¡_kµã™”Óɞ粳éÊü2¬¹Q=\ß6³B­ ¶šÆÙÂæ•8ØÁ!¹¬e­ÿ4@0Ÿš.à°#ÄÕ[@œyñÐÈÎ7ƒãà[{U¥ÿÂÁ(Ž¬'&·ÃÌuÕNÝj8¡­{#î/ÁºÇrèÒܧª^YGñ-r†î»¯ômâ÷’€cͱVŒ\zSdØpñ Í«¡°°ítùÔÞ-ß°ÂÓ&èÖZ”èE'é§)åJû‘²°£™w#þ>ËPnWÁw³ùÁ.¼ü½Ûç^Zÿ.Ì°«•0×1>ô§ÔG«+ «7{Œh®"¶®AŸ51h#P Ç:¦®± °hŚ]dì/Í kv¦·ö±æžøÛmӎ<–INd•ëRŒV –Äc97y+R¢‡Ÿ„|¥¡×c´¢ñW¥¶â_ÑRÄ?Ö¿…B\øغorÿäÿ*G›•Ë²‚bü‘ž¦ÕƇŸÙãß­Š¬YBAÒEê éþ÷÷5þ×ÕhjFHhç^áYaÑR˜+h€§±v¢²€°Ô€¨ Ø&S$0BˆÈ¨a1F&—$#0†Ææ’{8Iø+a0r`ßbvDÂhƒƒ,hN/X]8_ɇ.hã]…†YsU:":¥æw.º†k¬â? · †"Nzí׃õƒÊÆ{Z¦";c0ÞB4"ã-–,Ms@î64ÞbCU2eÓ,Utx3f¸S Ó?-ôq\è^È1øe+¢*™¢Dºóă=ø‰½è¢Ø€4 ”,“˜xþ¢*ÍpübY¯¨*³S«¢*ƒw4OAê׉ÖxL‘¸"<„S}:´z§7{f2”a“Åz®“a]hãw´§ˆñ³‹…â‚ôht`Èl,22Êu±–Ž”ÓbQ¤UjcG0Æ}Ú§uí"h9ôh[‘aB7´…ò(‘©vA¸båÿs3û‘žH“5ÉTƒ¸1#ȓ è“?™€AyfDI€Fy”"x“O¶”x¤’×Ȓ8”Ry-NùePfYyGTًVyXù•„– 8– X–f)(hˆjy.ٖ±´•g֕iF—»ó–^—V± ‚9˜„Y˜!`—wY‘”Fñ˜Fq™”9[ ˜’“”s˜‰1~icpðŸ™-¡Yœ yšŸ’šÑ1š¬Yš®)° «9›žY›qr›Î!›³I›¼i&¾ XÃy(Å 9șœ½©™ZsœÎùœx)JÒ9Z²œ³ÔœØé#Ú¹×ٝNÿ Éâ¹%䉚æyžg’žæjŸò9ŸôŸ`@õ™Ÿóyì™1î9q&oПÔñ² /r?4B['2 jœÿ)ê"Ä## *ú ³¡áYx{A.2cX¨Bþ¨8¡×.¡—_Ä6ª¡éSqP.d…3g%?¦E}“_É2Y;¢iÃ/ ££$£f‚©ãn¡Cp¡Ó6"”pU 4”; ÇR¤F:D JW4N*Žq•pùA#Ã06¤Zº¥¼Ô¥ÝAo³w“£7‹íòz(k<Õ6÷ãmê¦Å„¤ZD“¢Â¥Áèa6ÿ“7ǂ+ij3îƧ<4*¨ÎD¨M2¡2ÂE4r©˜zMšê#œZ%  [À²ª¬Úª®úª°«üOɘèSªTrªÏ¡Ð!¾ú«À¬Â:¬Äz!5`µ*JmðÌÚ¬Îú¬Ìj>­Ôê¬jJ°z¹;E€¬£8ªBžZ’­ÛÊ8ݚ¬3%®MB®åZ1çú­¶ Oêê#ìÚ®¹ò®Ú§Ä¹žôª­öz¯Þš¯àJAóÚ#õú¯š‚¯8°èS°"r°Û( ےúšüj°þ±Ž2±WÉ°¾ã°!±-2>;&K–û8 [ ";·s;~#Zƒ4#t¤ÿÒ,c5ƒc³TÒ7&8)vƒt²k™²Ñy±›±,ÂCsE/2³O‹¦.ò†ÐZN³J‚~'rŒ°E{C° ¯è´²Ò²í?("m#/:30®F=™%0xE/]P5#3Pqs,z†³NÓbŽZ0”ZLók¬‚n·g)n».³‰¤38Ô¢jwD´rY±MB¶éa¶…³,.ãlCc+D3¥湖•vÓ1RT*²Ón"cX”4W88Þu,pØ4’ýƒº84M.¤k+>³r7‡ƒ\‡G”kš˜‹š[¼)rw„S<ÅöwƒÓ>Ébˆ§C»¶H»3tBpø4³ÿ8{Ôâ7ƒ½sˆ3oc:ÑÛu®C{±ÛDÀ^“ ¶k´åÉ'͋’-´‡4Ïå9x£7BÃ_Ú+arë4Þ{3<“œø.D“;ÿû=­¨Ž¸ÃnؓuT糄t¼U‘¼„´!«´žhvþµ‡“<©F6|ÂȓÂ}¸¹ææ0ÕÀ†³“öænˆE¾îC?äÃ3”%>åb³Ôó5)"BXûCl –{cð²úÄP¬@Q\ÅV,1š‹¾Ÿ—)üòŠ“Õ3‡³äaÏeoØv½›3¨cCåå1ùx:1t»œ6P?j6yƒ*oh‹¶rÃÌR\pSµ§w:‘%B÷3Éwdz¦‚=V¡käÇR‘¼sY²JÖÈ1rDIÄE™"ÏWEÒ'4”C’ s,›ãD‡È0åbUN%F #s¡Ù÷9J$’ÈŒBɧUèuÄÜJ¿+¶òÇËgٔR±Å§$¹ÿcQ¸ŠKLQl‰Îz¥ÎQÁΟd¢+B=1Ï#2ÏjgÏéìË-(ýº\Ïmbø úÜÐ`’ÐØ(Ð6ÅН$]Ñm%Ý -#ÈÓÑmÐ$Ý&] ”0Ò1±Â¿lË/2\ºÿHU¨’A±"Ó"ƒj #^ np£7:]1íÈ'&)ý#+ýYEÖ1ö¸5òg3‚mG\`Ï5‹+(Ò+"´.²3Z5;=‡påSÔGÒ䌲æ€/âv3D0ð¶ï2.V$eϦ¸x¥/d€S³‚·zË*|‹@ªV`o½pl5FDI@/³•.`…÷£0Bºw5óAÅ⼌CÖe½&IÒ#KTcu"C2ãæDyÃZBƒ~·®Ë×N׆®[8ªfYŸ¾QÓ<Ô;)nþb2dˆ³›', —¸)¤?„Ù™-&›½ÔHé"î|:oÓp>z?¶¾æ†6Š˜ÆÜ»µ~›ÊË֕ÿ<,á½Ðò0x,4g:Œ8t—"Ö橗ýÐOÁÑÇ}$É È0Èܞ :—£7 übßÓ¿L‰ØݶŵÝdJ§m¥ßíS`HCÄÃuös`,§ÿ\vo7D“CÓg›ûy£y˕ÕÖbÜp^%rÎQ0¢DÍ·EI}3Æ0”ÓÍ×}RÅÌMôé®bU1+gyýqàœci’&xiÞÜEâ#“DÝæLñæ™n#›^rÁn[¾^À^ì32콧ì%½Éîì0Âìa(í}ìÑní-Bí©í½ íFíí8Âíü&îU†íánî5BîH§î´áJâ\¹òÌ[Åî’çîïîHb5Mó²:K#w½$;Së…B¨²“Feïä‡ïz‚îGpN 3†7Òq2²2G|‹™rVõ~ÖEûáƒñBPÑ Ÿ#˜Î"RVqÎâÏiƒVÿƒUÁ.®ÿÒjæB=Fóï‚Íx•³ ƒ6ñ¢ƒÝ§ÝRå´þ¤ð†‘#¯Ô%#'¯"%$ºÚöÖUu B$J.To+p¸¦oÇmÈ2.&cëF½µËrÛeƒDoOF_HϚJ¿ËÒþô?{W¨‚p¢“)–½µ¯e½¬ÕVá‚÷ÈòÊ´Ë7´-Š8?ß[ ïñ•ë±1—)’_”ÿ“_ù—™ùe0Á €M#tÏÃÐ%á΅+{3;¸\Íåµn¥úÑèÅ ƒ+_zyët=·Þ&ÕöYá˜'1eÀ(AüÆ?üÅü˯üɯÄOš³ùF€Ñø~ú”(a׋|´ÿ÷ãª7ZSG[ªþ¶¢?îc„²õ4›ó}üƒñöà™rïìØO{„…w—u¾¬…6™xø_s±c„9Atà„ ‹rF!Dƒœ4åì`ápGă],:èBPC‘%MžD™RåJ–-]¾,YÄDš5mÞĉeÁ%8}þô¹ P¢Em&ø0”¦N˜M>…UêTªUQV¹`T+P%Vj –`:Ô PY°2<»¶ìˆ³Y°+×,åñ¡'eYŒ8ˆ‘ †¾r¤±Yòd™[}êäiY녞š=c¹ÉtòhÒ¥MŸ~ŠÕ³ç®,»¤™ñöoÿÆrºÀ™&I2"áàI†vÉ4¼á@&(¼qãÞÉC6ŸÝû9p IîhˆZûv9•W/ÝÙù»OÎãNjæž^ýzö&U›7Ú:¥ˆ«´7¤aš‰øýGõî;Ìă¯¦ò Ô ½ÿd°A—ÞCð'ù®ÒÀêŒŒ?‡jðC‘\mÀk‚‹·RÐCWTÂmšEg, ÄÏÂ{1G­R¤±G£rQÇ$²È–lLÇ…Ò‘(„2J9‚ÌqH)¯$IËD<ñÀ&/[À´4^Ã2½Þ [‘Ê­ŒŒ U„ Í2OÓE%GôòËдŠ7‚Ò@¬Â¸š¨)ØÿBî¤"ËGÈî©.ú+É9UJb# UQÍل*Ò**¬0Ò¦ƒ© ëã´$ î³m V“Ιλ3Â<õ¬éɧ*úÓ-‘F &T_ba#ÛTºp†¸<ºÔ%8ä$â–ÈèoˆXôtDPJ¢?'ض"Za²´)zS¤Çƒ¬ŠAk%­ÎsE°D^sâS%2-¸ X(w†²F”Œààm†Þ’H6QØf€c݂© I*È-2T%ȉØh}Weùbø߇Bnà.bVˆ÷OŒhuyV9^hÞ»ðې1>yàmåMkç“/–#e‡/ޖ *ÿ6"Œ#‚# Tw€ ™]‹fP¶Zzm5Ë}õô5d’h4 84˜¡‹Ã¦Ô`0`5‰¬6¢« ƒ¤~;܃æ®ûî‘4`aҍ vùï‹^µ¾#K.ɉ¼ä¾ ]—s¼6ªÂÚL¦È¿É¨™]J;ÍJO¡gx•ëÃé¶{ ²fÐØÚ¾UwwÅw¨],ÄsGèïÂncá`ɉט¾‹ª¡³M³×(µ#drí^ûE‰çŽG’Í¢ =J‰ö±(åùB9Ô¿ËÝŲ#Û¶Ë/B®~‰þ*kâß~_Zçˆ$«iÖ÷¶³UMjJï" HÈ­Ø}é[]È'?ÿVM.}ý‰Ÿõ*‚ºmÐzŽQ c.ò–uí €ÛHå»ëI&{EÙ‚vµ¯¶¡o}Ž ‹Лtùð$î T[xc-ÅX(,Cì §wB­ÑÅt#‰aÿv®Jz وbH2*¿ 0ALLù 3@Øñê[…#Ÿè&‹o>«r"X†¸¿ÅX'B¤£» óE‹T1Y×SWÃzÝJ@ø*ÐyÕCJ$]Àäs,bÄÅ ²‹™ É#xÉLÚÏ]½‘ú$«tñ,„&  bI™m…;ë‹Ù&ÊÞ¸Ï1%Y”Œ€† 7žl]¤ÄdAúcÇܤ ‚È ‰ÿNéPFÿó,>\—*ÅçÌÅ4†ŒŒ¤Œ#CIøH’mà3Iµpc.„Qì“ ^ø7¬ììχÐjçH"ÃäÜO1’_k}1sü­ƒ:„ñ:  'HA7z%%|\>IbÀÔ­jn±¥Fnj&ĝTæ"o ÐÁa³1gdnè$ršG_ÞÏJš×–±Ìå,Q–GÚ¢Þ𳟱!êbFà¬Bú” ,íê‘Â`1¦¤æIŒúÀØX ˆÓ, S•5º†ô—R{]egÑù±§{A‹ZØR¡·l•,pµ ^èÔ¬ú0‚¡ªa®ª\ 2¦6ç2ƒÓ&µ 7ÿdø˜µ”S’. © ;hÌoˆ“¾å>Йlr|ƒœ1ý%8~ ɴ؅Í憳&¹O›4 ´•BÎÔBѵº6² -»^¦?¤µÉNnŒ“¨à2'8Ï9­tþBUa簈M[MÇÓ=œ¶-~s[ÚuÕ3‚û8¡Xiª`“¾%=vÒK?I«x¥2S ä0’Z[Ûå(SÉ7=I˜ z4Ì}kT:ל44‚vù×)ôý‰}ˉ_¢ÓÁŽ á#4 wøÁ‰MÒbñDáIZØÃ'vŠ†ÍÃa·8%“ˆ#tÓîšØÅ7N‰ŠÇÃbãÆü’1cOÔ¶YÇßáÿ1TÜ¥3ùC ޒv¿Ã]ïÙÉ7>òj’ÜQ‘ RP9փðØ*‘ˆ%™Ú™]üã=ù¾B¶ò•[œeÖ°u*­W¹è”t¡«/ ŽâI°Em]™Í6‘°yÌù¥8ËùÄtÖ ‡Í ‘¢] i a¨ÕšÖ°¢^MjT³–ÑD„¬m­k_ hóò®Ì°Újý=7OXÈ[(Àt½k^÷Ú׿v°…=lb[Ø0v²•½lf7{à@EWB»Ë:ªiÂÓ¤z—¿/qgñ&r<Åoyph '=JÄ ¯"Ë}(JYCÙNµ¶©‰„,%ôÛßÿxÀÿ>p‚ÜàG8Á…Ѐ„7Üá‡xÄû½i§ƒOÈ+?f* „åK ¢q„¤0š,Œæ ýBX'ÜçXôö±½ï…o!×Üæ5_„psž÷¼&oŒ‹%ƒ8DvÜ$îûãÙçÇ¡Q;ÛV!érȾ"ƘkŒïše®=)¯†Ê>;Ï· @ ìgÇi1Ýh¦ÔƒÍ$"rÚ.M„±šSÄj6²ÊºŸ­Qfo½‡íoO[›Øþi7Ð9îljS2gý²­sL‹\éÖ?cō"ݒ3íã¾ï 1óCÀ¢°½ñ˽tÀŸC¿N²ŸÖ«!ò"Œóª·×#±ä@FK€ì@#•c$0G#À®óŒ¯ÁĂlAÜ2G»°„=Ïð¾ü¾ÔÁœAô/ÜÀîÂ?4ÂòûA /!|‘LÂÈCÂ(ܽ%dÂÃrÂ9@*,¿)äÂÙ³Â+§,üÂ2Ä!4CÈ Cÿ1¬!2ä¥HÃÝóÂ8<»5dóqC*B: »9äCŸ³Ã;¬•<|³?œ=?4ě DA,B´µD„y!–8Œ xÜÇüÆÆ ÇÿˆbSb¦Šb(¶7> æPm±#8*ŒÊ … ¯‘â?¤bþ´b4%XŠuâ\r ƒ¡%€”Ì$ÉÝi訐a1™ÌL ¡ìXl&['²¾ðª¼!ž·À ÚY—¬”f·@ŸÒY” A$À-æ¾âu ƒi™þÈw>eè}f ï5KF2H&ͯÿjEd÷(.È¾iŒâh½`ú?éšúÃ?Š€›V)Jʂ-"ž-Ë*®£]v‘.Š‚û›–ö¿“໥߀=-¾©é=f>Lf]æÖ¬Ö¦Y–€ƒÂ˜Ø~UÙ ¦Ã¡ÆÒ¢.ƒ@ÍÕ6éًÚ3§. …®O†–Ñ'th;áê˜òêï“ê0¥joä²¾V¨ŽÃ´fM§h·~ëEkZë2À\÷4’—‘’h0¸NC¹NÍ`ÍÍ£ö $YG1³õ8— ä¦æ­Z4ìÏä`˜ýóšeŠàÁF œ¥X©Éja"l3¼lΤkfý Lä§z‹¶=̊ XƒÜžq™Œ¡ÚÿQ» ëÈ+Z †­E1¢>#’³^ϼÖk±næ©žÀœÜEžæ…“ÚޝÁ^Àß- …à²H‚߆ˆÙ] êÝfBãÞAnÁTîeîþ‘ \ôá_’Ü3ü} Æ"#™“©f‚ š‘àPË:õ>í2Lm¼\ˆfíQã¥ÉRi‹®ü³V®qb~îÛ £‰]4zm.pÓÆkåFì榑ÿàÀL ‹A†:äL‚ã?qŒº·Ÿ»Ë47’õ¦½ÌÌ~ÚÁ¾LK¸8ZeÇPþe¨Òæ2ˆâÖqÇØäÖ=‹`¾Ž¯lSò¶\í#’ÿ‚2ç­Vg v”»(™“kæ†p¦ê˛)€l몾èóF©ã>ð/ s´ós"‘ü />éƉ¯™®’ŽÖƒ›’éý[2‘梒àé§+ Ÿ½@/ËAg4ÅƐA{ŠŠ]ƒNïÌöÞ>ªîë¡×!܎möðr/FOŸÊ‡o».Ö?çB]‡J"¯k_?U¿NVõÆuc7r`§Ba_Êe¿j©t6Œí@v mojŸ×fÇ»—àè—8°R³ÈMhZqW*ÚùµÙ›Å@א“•ŒmWMewu'ó—³–ð¥–ȳ`¡÷˜­õ?N-Ð.¯ªˆ”}ŠŸÚÿx)í§.ñ¼æuÍV‰‰qe«‰’ Ùö¨Ç´¥˜)©‘Á QËP³UC\­ñ安i«áZlâ(„é±<ÞXáx—¿Ž´…‹Ý˜ðޖúé<Ó°w´“vœ$ö¿ŠÂÙfr;‹æ¹[“ªç..+úÝ6”À ‚¡ú.ÿá‰ØcÇIµ t;˜Ði²Pb ,‹ì`݆(;.·´0È°úŠH¨ŒâݯW©RzhÂ¦ŸIoÏÜjuø9'Oå”r[ª£Ö-pë#9öݙ†pŸ 2©Â*åÃ9’‰˜ „º×"Œ‰¨LF¤ ײ¦µˆ‹+Š5†¯wÿÃWU|ßWÝk®ó&ʈ¤#"¯ˆd1¢ªa ömM'~>b 3‚á/.ˆø&‰  (*Ý;­qŒÞ˜š¼!È#ïJã/É[2%EJ¤¨©ž®Ö}_åýžˆƒù§ÿú·ÿû¿ÿ.Xüçÿþƒ6ˆ2$ˆeœ„ vÑ pD9ºP¤(§‹ƒ‡;äh¨ÒPa’Œr ²Ø(g‡C…iÁ¨pbÅ.'MJl©!&™“#º”(s‹‘,dVi4‰DŽ3’q$ Lj(_R9r£¤"êä(SÎʄ7VI¹ð,Ú´jV¹Pð-ܸrçÒ­k×.€»z÷òíë÷/àÀÿlPR¦J•µhápUìøñ›»×öĘӁ“„,fœt碨¡{r4 ÔêJ¤ràh$hB̚9ïØ)'SÏb3CLÄaXŽH'jvØ34G®N-SCÊߝ?c-:çՑœå°HI|öãðkÛ .o>pÞóê׳ooþ`á2A?þ(>¼í…‘íN^«aÄ #ˆRm¶0‚;8ZB¢›U@_HÐ9[o x`B+)]q(m÷Ý‘@P,É1C‚2TOB XÌ qŒ°q&¸`Sr›LMY¸ÝX±Au“l¹å”í¥%•UZy|†ÁñYÿN]@eÑj-ñ”R]`×å—_ éeB]v©ANeæ´_]ý­•DbØ „š‘ĒpèÙEzʑ„Y*%Q¨B†î©&X…±äEŒòÔh£2©YÅS‚ ù™§a¶ùY¤š ™§TýIé™ -ôœjY%´ÃvM2Iޕ¹ö5¥®½úúkY–±ÃF:*XR‚ ñX¦CˆÖ6\‰¢´‘r(Éd,f¸QP3ÐI—¶vhUxp4”˜¸éª«.¢g'ÞJ2…¤Pœ¥‘躊á ,¿ñÚ/À—',±}¶ÕE7¥DìG*‘‘n74¤éÄF;Õæ·s…+.†§`­ùš|²ÿZŸr“(9$X)Êhí+0°ÿâ¼3ÏàfXÁ"ÕPÛm±IO$´¦7 4Ĕ a+™Yw4〠ä-3Ò ÉªÌä¤2(d¬%xfE>0Ø«&6ùö3ŠïFlqHQ–”‘•,IœQÎKj„.„•H8mʈ}z£Ê´ÈƝ ;”YhϏ„36bAJXªÀ•‡é*{XuN²¤O75‘ˆivR’¥¤,‡ÊÏ0£"»‡Jó1"Ìf\® ґk›êY‰ÿ/(c'Ýù2èhd°¨XŠU•EËiZzr"šj #íTÒPiš‘—''…㊪H‰pJ¢´ЁoÔ*S1Ÿ¬N„´!a% ÿw¦¹¿>’´."m+6yž FWâcÂȚɂÅæ21ùI>¯uO … æãHÉæÅԛT$'I Ñ«Ñ® icØAN2ùÔÑh ,Sù ºT4OÈZ¥ÈÁkD’ô®CÙ(B‰:¬¾Ø W¹¼u¶€”«yèªÒµ ) ¸vڙÉÛ¥†™ÑmŒO«Ì³5ù ÉW0‚”ú½“TÈÌ0(2ïÓ¯þµ’{Üí‡K×ßú~/!Ý*8wóÓÝstóºÿ™®ºí[÷…@£ ^ÎÕÒù©Ä¡ßú=àúùHßHIAX–Á,À%_hœ@Lßô!œr þšàŸà­ ×!AÃ9B  êžf¾ßzàZ Aö텓ƀI\Ýÿ R^bÓòày(_¤ÁÀþéÅ”M^fáÛ-a55¡ºNùeOîi! ’~a¿Tá_œŸ®l€Î!Ö¡Þ!æ¡î!ö¡þ! ¢ b~€¦¡ úE&â¯l8¢#"bÙ` °Xà[X¢z,b_4¢$êÊ €|âR"Ï௩ÀZÉ¥¥¢²¡"îߥÙ_±uڧ͠`x")V ì"š"Î؛<æ œ¶œÊ›1暽ý`´Ü»åܲÝ^`\!0ZI(Êá(n£¸ £ÀàZ큜ÆÛ¼=Ú¼é@²)[²Á›¼ÑÿÛÓi;„½±ÞHa#ÍÁÉ1¼ _Î=è¥àb#8&N/Êá/&$“‰cÀpœº…à@˜Ê5c¤ÙÀ®5œÇ­›EFFZÝ@xÜÉ¥c@Nd ¤® ¤§%#  œA–.šŸ³9¤{tã~£MÖZ[µ" ÛԕAÕ­›½­[õY½QAPåÕeAäcÿu^½µÜO.ÞÉájŸ§Ýã¸ í­‡.îdy,ä6¤X&ÝlYA+.߽䦙Þ@tZÕå]ß½åðÅž° „ZRãÕ½äòÑ[ȑd¤)ÛA‚%Bž¥``A(&A$À؀T°‰é9^@îZ¦Uÿ&é•Þ]މ ӉÜdŸJDΉÁtÚç ÆLFX:f`xÁ ÈfƑÔ×é€ôÞ»5Zò-fò› ˆ o*ó}æ@´ HŸÉ [nÅÞ[„Ü¥5Ü §L&¦_h£mvgBBf¿`_ÿaF_p6å@”çýgEŽgç‰gÿíåiÄ`¢\¤Å$'z'¿Ð¦~þ\©eÁÄv õDŽ$Dò™à[€ âè¨@x`ƒÖÞ¯ A ~e³õçb6&‡2ᇮaþEl†hx¨‰úx¦¨èŒ(#j'‹ŠŠÆ(­(¦z”èîèÿØèŽæç^p§ÿ)ˆéö¸(’²G.)ë鍄"•V©•^)–f©–n)—v©—~)˜†©˜Ž)™f©h@¤š®)›¶©›¾)¤é›Î)Ö©Þ)žæ©žî)ŸÒ)(@Ÿª *¡ª¡ª¡¢.*£6ª£"꟢)£Æé£Vª¥^êþ)¦n*§vª§Ú©¢~ª¨Žê¨Fªœ"*¥’ªª®*’A°*¬Æª¬ºi¨Îª­Þªš*£NA᪯þ*°«°Òê°+¬êª±&k¬ºª²6«³²i­>«´:*²"ª LÁ´fk›jª¶v«¯F«·†+ŸV롦ª¸>+·ž«º’*¸zê`ÿ뺖ªHꢚk¼kºÞ«¾^j»nj 0€2@ 8꬚þ@à),ì‚@Â*€À¥’«¡Úë¾+³^¬Æ:j¿^j€üÀì©"*Ô@šÖÀ«.l Ô€ì¡2€L켖¬¡òêÆî,ÏîlÇZªÊ"Ï YÀS”I œ€Ðì ¼€œ6A ÑɦéÔÀœ@D-Ä,ÓNíšr-›Ò욞m­Ð¾l×l4Á ¼@ѦØí Ԁ—¬m dÁ€À°éÌm¯ÖÀ$Á <¬šRlÏêkÆ®âòéÏVj¬ÜíšfÁÂZHlÄÿ¬ìS¨,¶N ¬å.ì€.Õ¬À¾¤éãž@›Æm€®ÄR.Í^n¨.ëFlüԮڂ-ín.$¬ÊZÀæÀ ¨©å ¯š2ìð²©áêµ.î­æ+õ^/6n¥&åÊaͦÁ 0¶ªl€®ëf-òxnì†nX®Úšn¨oëÑê¾î÷®o͆ïø@<®Äªlš.¬š‚4oÍ0¶~ìÿ€ëÂmó.ò|,ò¬›Fï Z,öªªõf0«©öZ*ÞZ®ë.¯ñ†®Êªíšª/üZ.¼Â¯ú¶oo®›Â.èÖ, »oæ2°/Àb+Øò°Çÿ/û‚ïÊo ׬CïÍN*Îv°¨n0cï7jøÖíãÚ°À¾,Êî@ë ³/ «© ¯ìÁÀÈ&¯ýv­oñ˦)ïªîïºñÓ­póð 0ÿªì pñãñ¶6q½>ñwjârW1£z±¼«Øº®êîí X@dȒAènбèšñú¬Ê^móï ?òìÀÂzÉ$ƒ¯%ç1Ôíæò*`.؊-òx±ëol¬ëî@Èq2¢ê¬"'³2o*#3ªØÎáýŽ.«©ê¢nÂnrïâð‡òÚö®‹íý~-íšJs1æÆ®óî­+ÿoïÊ,¯³šŠ-äæñ›Zð2k"çóá63£â-Õ¶éHîäî@ÉnNÂêlù²)27Á*ôš²ü4PµPµP‡A 5R'õOót²Êt¶Ž,°³¬ sÒjN÷éN󴀐bø™ß°SWªO+5Y u”5Z»X‡5£^5Ÿf5L»ÁÌÜ_Ì ¡ÅZ³5£ºÑ¹^/ª[ï)2ÿ5_3I]oZÉA^ÿõ¡ºÁa;Æcç µ)„_3¶¡ÿ¶eó©\S„vµŽ‹”XÁ„6ŒtöfÈEU­ HPHT ‚Ábgö ºWLb¯K(%DeÓ¶ bvž²4a3Vq­±Àœ‹çhŸ7C-7w`LPÔæp‘UÁlûvŸºÁ|‡x·ƒÌ„H{ÕÆ$ŶORx·vÓ…ÁEo#꿲lŸ0§6ÁÛ¾)7o:CªJW¬!k5cy‡4î¬` ±hØÌ øL(ˆ…”È)Ù kõFvk÷ž:öUuÁÃDÄ a„LÔOÐȄ7-H…ÍPY| ‰8BÄHdFàÖ÷¡¾p Ê0¦Âïœê8à6*pã)\·ÿ´¸?E¸j4±ÐJcهH$ù$Q„wWxuÛÐd¸†ç)‡3¹4± 1ÌeÑJÔ(EÂlQm EJLŒ³£Ð¸¡ª/à6ÁÜ®mœ«é›/­, rßÖ1ÑmÛöoŸ¯éÌíÞ¬w#-5_®Ðæí °³ê‚@ú&mžŸ*Ê .ݪ©Ó‚@¥2½¢jÇ5‘×M’ï9ˊG·–ÏD©ß_íæÄøz[ù•ßi–C8ÃlGP8F$yÚxŘSøÐ܌8[4Ð °y¡ª/ÎníÚråö®—àøòòðè*ûèÎ3È.lšÖðñº.êJ¬æì÷®ÄÆm´£±×nÍ~¬Çÿ²¦wz ¶^» µtˆ1E„ç¨R½û†¾#ˆ qÅtïˆ|ˆlÇz Îz‘{9s˽Øã4ÍÍJØ-qw|‰;¡"»;°—ððÂb«‹îm7#å>…åRòÊÎïK¬ùªØêø<…ÿrs;{1òì0K»m,t»#<¡öZDößÀºÑÏi–WҖϔÆM ÖHhŠDý«ÛÆÅÿl_Ç*²/ÐÛs™€­ #ñò°;ïï»f3óêxÍq¼ÀñÖ¬Ükq݊-¯ ?nïlÑ/ªpÇ;dçöW7ý†wþ(Ä©ÕLØ ê؛=Žóÿ0&KlÚ#/ ³}ûš±çÊ.lÞssÿ@ë<ØÆìê~;s>ü£<oz¹º;?#½Å1½â·)îUãûMäêäså£<.³=0Ñ0C»ç›1͒ÁX€ëŽ>è¾@/#ïîÊlõ‡|Íò®ën2Ùû½3@šú î€jó3l‰û¿?üÇü§È¿ýßÿ–èþî¯iï§W?@¤8`AƒÓÔ0%  0hAbCœxq¨µs"ùoÞp]ìl>Ý6Qê×±ËFžûõç`™vÖúxóçi£W¯ûû×ðëá;-Ÿþùíõñmïõ}þüÂý ºû,0ªýºJÍÀlÐ5ŒP %¬ -Ì,54Â­¢ë»ùD,‘*MÌïC­úK19]Œÿ)e„oE«Z¬8uì‘ÆÏ»±ªÌ Ã"uüÉJÁ%¡Œ6%¥¤®É*»;K©ÜÒ¸+¥ ÑË×x³Â.Íܱ¨Þ¸"2MýxSC4åÌ Ì¨Ü¬s«2õ4Î>c»ª<¥JËB üÑÖ}êÉE!-RÑHáj”Ò×½”¾I5íÊR¥ÄìôÀ8EŏÓR­ú4)BQŠÔVá;V©TEŠÕYÓàWîdÝU¾5áºuÖL}Í®×b‘ª¡G‘mV½cuõ´h[#–Zã ½6W`Á 5Z]µ.Ûk•=HXXÁ ÷·q©-× s[MW]ÝØý–[÷ØDÖÚy}«ÿ×Yw b–߁û%˜*€ Þ×`í¦õ^¯¼ý÷Ն ¦x·‡»‚Uy-fÍßfHãR9îXµ‘ Y ‘§Ê€—aŽYæ™i®Ùæ›qÎYçyîÙ矁ºæ®èåbUí±ÖN(BŽ§¡ŽZê©©®Ú꫱ÎZë­¹îÚë¯Á›êi3<ÚפakZìµÙnÛí·áŽ[l²-4{פ#†Km¹ùîÛᅦ›î3MV*i–¥Ú;ðÅoÜq¾—Ðn\Ï÷+ÅÏ\óÍ9:ò'Ÿµr×0ïÜôÓQÜòCGc®«ôÔi¯Ýö«?w°õx_ïnöہ>õÜY/<)¼¥[ÿíwá™oÞqâÜ}ãÞY\½«ååBƒ ¢Öž «Ó`Á4pì¼&9Xàžj2Зc„ø¡…ÅGÐ@ f»}©Ép?­à{_ƒÖ · 鑌z8²W°·hÀsèBÕÒà|/ 0Ÿ× ¡ UëBåà”ðiU ß␄.t¡  Ÿ×H(µ.PPkÛ ø@?/Y ’µA 8 OKƒþ.xA¨}|ÚÐ2…iH ¡V…*À…r C¤hF-&¡€'L‚X… ´…°ÔX0Ê¡ 9|šúÎØD9h1 sŒšÿÁ¨E.¦0@äc>(‡*$Aiä#åàÅä#œÐD2M äµXʧ9Òj "’´Ø]ÎiUہ Ý=^ÐœÁýƨí`|ìà/5 Hê…,Ðã·¿8`ì› ž)'8`Ó¬¦#cXÆ`òІXDáG0Í7“à1ÙDb¾Ð‡- a@¾*œ01”ƒÞ(‡$P0›üt&9GpËþ¥|ýó¡þìG͈6êäc«æÊDÁ2–F¼Žú4 `ó‚y|Z0I5b®/…,Ä¢~ù´šÑ,÷l(S>´š,ø`HÁyÿÂVa;4#ý?Êa¥ƒìeK¯ˆ¾¦¦p;°*7ù¸B‘VS’!LBünúÏjnïiÎÌ^üÈø=jB-©"æX•zOŒŽ ‰Z ¨GºZª”‚L|â?/¸Ô¥¦tj·\%5­:M±²•©ˆ…æbù¸Ó fӌI¸%ƒSȐ“;ßd¹šB2V¤ht¬bI›Âý…õ¢lõ¤™˜Â­Ö¨å¼*÷ê™RÊîv¬¡í%+3Z×ݵS£cÚ^ KÁ›a¬R & ¸êÏ)ޏ´'´êu!+[b^w8åªQu[ÍiÎ NÀl»@†b–‚Lh AËÖ.¤ö™Öå.S÷˜[¨ÿ±2¶'-i‚ðVÚ4¡×-any:ÛÅR–‘À¥«Ñ8jã²F‰ÕE¥èÙþ¦–}RåaéîUñ^-ãJHYð&¸žzl­ncjÔÔ>T€êm¬kAü4ãW¾São@3ØBý±0›}šöØgŬÁñ…l‘k,× B8Â¥ñèT• «V¤Rt¯çžiÎï¥V“ôgQ<‚s²`¾OUñNYPñ²yž/öa´jÔ:¨þ\"Š³)A6³ ~eîà:ókÉÃBíÐ5\(C¡–Ím&a í¥fÌJØð*¸ÈԔó‹[)\ÿWS²\…‘+59™…A`é?ÊhB»Oÿ’´h#™†_ÎjžAý÷UÅ9ÔõMáPÍd_q}ˤû¾:ƒ*ðùŸäA@oùU['×-¤õ^ 5g·°Š±Öf$ýX…<žÑ‰X -¸¡o?Î;ÅÖ踃Kå*OèÊÓÁ^Öì<°1øŠ{øÀCË5ÚußÉëqæfsük •ÚK)~¾„omáÃm8¿;þ”,CåßWKƒ'3žr•‡¼¦ëaÿ7×ÚIÞõ´Ï½vn_ÏØ!Uv½Éî}7ÝŸÕv¸/‹ 20|VÈ`x ^ñŒ?üÉyÃGÀÖ~·¼é"PÅožó÷üçAzя^ôx_ÚÿøÔ/^ò¬_½ã]¯xÊ_žö˜×<éqŸ{Ýï>ô<¼zÎ^{áÇ ð9Wԑ>|å3®øÆR֓üåOàƒwþzqêo_nÍ¿¾x²jîÿmÞÿþˆ o铟ýS3ÿù±þ˜·Ÿþ_{?ü­”þ⬿þí¿?þ›Cþ̎ïú¯#ÍúIô8þí€À&ΰ扤KlF`}*0jjF@¸F—I˜¬&ÅF}ÿŽ*}npþ/‹C÷îjØ lžêj0nm€ÈÁ^pj‚Ìk¨M@°jBŠmPè¹F'Up8Xë\p}.ˆ j’¦¨²¦…ÎHюê×VI•VI’P®²À(ÀÎ €Öç{ ©€Bê‹0Ä  é’N(’Ä€Þ¨ªtH %ÉÜ4‰Ñ|ºÊ0júˆ¥ÍþƏÐ9p8þ ¥4șæG¢‰2 É ‹ N~&¨”܉˜JƒÊ'jôHÚÈâ,.jPŠÒ ¾gògšÜǙêii™ºª›úëóцÒ)§˳(h›4èŸmT1“6Qºt‘ÿ-ÌýÆ‘=8ñ¢.h›.èÀ}Œ ºþéƒèP¨·)«@0 .°RJ¿d+…¸J&K€èãÈÈ­„Œ©â¥`ªš0®ƒñ„²Ñ‡BʅXJÿÉ}º±Ë䇫Îñcëå§ Ë§q:’–¬ˆ0γdñ~X©ÈJ¨ƒXóÑÆk10±€—NJ‡¤ì¤Ôª€ÈJƒ® ¶ È#-®ƒ®k~  Ô¢êŠèñ~`ñªªÉ‡øk‹0*„øёHÒ$‰Ï"/òEªñ7"}X‹¬`ÇNêÀ)|&P(#+ŒBˆµ@±¾fªçꥐŒ¦ÜÒ¿àñ¾P2!SÊÝ ìÿ-Lj²Ò߈¸K P¨-m ¼º /…,'Nu¦2@2Ò+°'¬ê)Ÿ*쩵þ¦.‘¬X‰ÄbÐ3Œ‚^J%ågĸê ?¬Žr²¾ÊµÞÑ70…©{L´d’.% }j¨¬Jó¼ð˜b³§ÜÇÅúF3PªÒ7°Ç‚r%Q’|Ê˟À0ŠõX•õøS¼tYµC’õY¥5þšuZ­•A¢õZµ «u[½Y»õ[ŕY[u\͕LÂõ\ՕZËu]ݵL Pu^éµ^íõ^ñ5_õu_ùµ_ýõ_ÿU;PKkô sPnPPKÛ°-AOEBPS/img/spi_arch.gif„C{¼GIF89aæ™p,晇    $$$($$0((0,,8,,800<00@44<88@88<<<@<êÃlÂl^vK„¹-¾º{´º—Ð+À3eç]Ø%týuÌ6§­öÚlϤœž»Çdxb©bv*±{|ÿÞ{#úŠ x1óy§Ø Y“ò}.ˆ÷‰v¸-ӹؒ§ÜöæœwŽ©rMÄè®MGø@èÏRøÀ$¡»›´ŒªÓÔDèRh¼¬‚RÄÇ5Å;M¹+~{åï«î4=l¼çÌ7ï|}Êqõ¨’ ÿüõØgÏyô\i ‚æڇ/þøsOþù觯>毟ý.Å/ÿü„û뷏ÿó\qÆÿ  HÀð€L ÈÀ:ð¤Àö—>ýE…9àYåÓ?zðƒ ¡GHÂJpƒç³ Sس+}¨=ïA‘÷Ä$롐7,¡wÈÃú0'¼¡øÿTÈIÈO”;bª¬¥GÍ:BìMHÅ*ZñŠ b³GÄ¥øŒHF’ؐ°P¤ï@q&ZÕ¶d2Þmq5SÄ¢çHÇjñÏë¢Rè4(Ë Êt49ãÞÔ؟ùˍxò”¨läIÙ9=2%^í±,Ñ´·~•@obDפÀÇÊҘ2•À &WÙ˶¹),™š<”L?ŽË†ÜVXԞ,s4¿¦6·)Bb^SmÇ< ²5ZŽZ£¥ kʥ቗ßìL6¹IÏz.Лñ¬Y8Âÿ8¾®ŸŽ{4*8Ä!2Ÿš™§=ÊÐâ¡2ÛçQ|§Áéàw¬‹‘ì/þ@4 m¨HëùЏL¢&åRHGÊRa–4¥ÔB)L5´Ò–Úô”/i´dªÓ Õô¦@­cN{ú9JU`? ªR¯8Ô£VŠ§N­OR—JU65ª\‚*V9è¿Rá U +¯ºU iµ¬Ñ™jŸ0¸5:|Bþ—*PnÍk< p® ì+7ÉŠÖ µ°ÎQ+'ƒÿm±qý_ÀJÀ Ā9HÀ 8» ° ìì`#‰Ø¢Þ¥´•Rì'‹ÙÆÒU1‘‚ÿá c¸,]e›!¤ ¹=CfSÛÍþﲖ kcàÛÛn¡¯®í0;$¸– )H\1 [Ù ×·®ýŸuÅÛ×lVºÔ=Êk\«’µO5*|»¤Zj€±žàBð„$@¶BH@,„íþo`mkv·;Ü1h®gèÁΐ\Ç&À®o­kbð„L8~=æƒ 8Hhëùë_Ù*Âǝ0Üá‡xÄꥱ‡‡ùÞùfU¾>ÖR}˜ƒ¶& âm»WõöÀÀN0’Ï``ÖÎøØk['Àå#K¶É!˜ò0]͞¡¶g(ñBá+_ùÿK¦°˜¨f$Ü·€53šíü¿1€¶‡„ òt+hß ™)ö«¹¼å1SöPF0…u[eʒy €lcÀa²–ÂMžô4ÐØ §yÂsšÀhV‹Z€jŽp ºŒåR{¶³Vñ]hèº×»9´…0çí–ø È~†½…H'˜Òy¦lms0åT+—²=ðeSœâ¿ZÕÇN¶]­íí?ÙÏâ@·O}î?ó×ÀFίãaÓ¡.rŽ½›åQ붯˜–­ŸŸ éh[XÝÚ&à§Sb?{6¤.wˆ¼o,kY·Ts…{Zˆ»vãî¶cé}Ÿy“|6öÿ. Ç[MY÷uÂ">r LÍåY³¶ÂnëÇAKnÉ>ZÓ%ó̍kMÛΖ½o±|Y5û76õ™Í¼j¨·5¿ïùÉécò­Ã&å\ï£ÿG…L7€=µ“ELvïR€OðnvH·pìê­«ó+ZñîõÑe?»ˆÝ^÷S“½ÓXO<âyìõ u½ñpìêRÇàöj“ᣅ¼}¯yԀý”™U»0ñzgm»ó»á<ê})y±ºÞŠ§_=nT/{¶þõ¸´ÖkoÚó^ž·Ï½ðIûßÇÆ÷ÆOhð‡Ïü?ù®A>ô/óùæ ÿùÓOô³/™ê[÷Øç¾ÿi¶/þÇxÿû®ùmäõëæüè«úÝïòÓ_1ð?UçÿÍØ¿ÿ„‘ú§Tü€˜ñ8€@U€ 8ø€~±€ hS(¸X,uØ‚xс(R H‚Š1‚*(&x‚ •‚-X-í7ƒ¬ƒ8x2hƒÁ‚<Ø/˜ƒô´ƒ?è>X„j±ô³„L¸E€„§q„Px!ð„Sˆ>Rx…öQ`Z˜B5ø…Îca…b¨=Yx†ÒÁ…á…jÈEaø†›C†a†rؚ¢@ú¢AZ£Cª£EÚ£Gú£Bº¤DʤFê¤H ¥JÚ¤Tú¤U¥W:¥Vº¥XÊ¥ZÚ¥4Z…_:¦IZ¦Rj¦YŠ¦^ª¦`J¦gú¦i §k*§mʦn§x:§yZ§tz§zú§|º§*ÊìSz¨xh¨ˆº¨›ÿs¡Œú¨Â©¨:©3㨔z©Ô™œ˜º©•¨©œú©kc© :ªQ(©¤zªZ"ª¨ºªœ¡ª¬úª jª°:«é©´z«?f«¸º«⪼ú«=(«À:¬Î©«Äz¬¾&¬Èº¬à©¬Ìú¬Úç¬Ð:­šb¬Ôz­™jŒØº­¯)­Üú­†;ЄäZ®%áA1`®ìÚ®-ADÁà®ôZ¯ä ¯C!¯öº¯üªðÑc- „9È„ 4ð»° „@?@ ;±:ä°+±›±t°a(°;€ ²&k±C±&»² „²B¡²,³ı›œ ÿ+³Ì7²«°8»°.0Û³B+^›²;´2K³n°‹´¯§³?Q²N ƒ? A;µ1[µ?qµX«±JÛLÛµaµ>!µb;€Zë\{¶›¶=±¶lK°_Ëa·AE¶=a¶vk}nËp»·BØ·;ñ·€ës»u[¸,…·<¡·Š›{‚«„û¸¹91¹”‹~‡«‰›¹ Ÿ;ḞV–‹˜;ºßWº7qº¨+|›k0Û´­KO «¢;»A¥º6Áº¸ ¹Eû²GÛ»ß÷ºhѹ Lµ›·{¼,¥»5Á»ÌKº¿ ´Á½®Û±K»Ö‹¼µ<»½-ÿå¼4½à›»ÓkµÕ[¾bE¼ga¼êKGɋËû¾Ü$¾3A¾ôۼ绵雿Jžfá¾þkEñ{ó;ÀÀd¿X€¿¼P ÌÀ ¼M\Á=TÀ6qÀìHÜ¿¾û«¶üÁ 5ÁdQÁ$LB\œÂsÔÁ. T0Ã#eÂcÂ4üA+L-œÃU4Ã>,R@ÄõdÃ^ÃDÜ@;<=œÄ<4ÄNLOPÅÁdÄ]ÄTŒ@KŒMœÅ#4Å^œÀ!ü¶#ƌdÅ\Å?ÄeuY°u[ax¥”¢Ç@‚uŽ¥Ž"µÅ]|@lL@O@”!G@$yÇ $Çg_Jÿ)`|¥Ç’e_sjÆj cÇÁcì·eü@|@zgÈôɎŒ@ˆÜ@s¬WüW,@°W+WÉe˜|±XTv7Èôi „¹¼V‹<Ê ÄËÇ•È $ËŒ½`«½Œ”bdfǗUxE‡q™ey¡…uÜ@}7R|ü½ä̂ww0‡wD’Û|̀Ux‹EÍ·¬Íجj Äqte˜Vø˳l´%λ V±A¬uÎd`ê¼@©V͜õκ,@ò<[sUÏpÌÈw‡J`ÜCgÌ”\Ȭ@äìǔÌs¹_DÎNÉ@]ÅÊL·Ì\GK†fâ^Ô9@’fÿç` °—‰¼\Í¥^µÕdèµ[ã%b Z V™ßõ[ó] ]‚çë[Ö,GÝ,B-=gĆb\Áµ[t%Ó$ÔÏqÿƒkb=sÝxv´M–[O]ggm:Î]cÝÔÕu]C @=ÀfžÕ[HýÌpW[ fÖ¶Õa™¸…qT°W‡ÎTÑTÕ³ÓÂUɹe—KÖ^{že]W½Y Öt=ÖK’?ivâÕÓ}Æan½t>—f;ÖLM]A]ÚZ›Ý×à5f‚ÇfpL؉lØ}…Ø[-bŒ=܎ B­C=ùfyGg9¦H WmØcÍfh4™fc[œÿÆi²õÔæݛIÍP}\©Ö—Lg2¦ÝVԛU܋ÍÝ]=Óº•Öw–[¾ÅwºÕ؉MwMFmêmEh¼!+MGš…iD'–€åaëõ“–eÓ8=—¦–a'] )\7Fb&¶aμbýõ_Vɖìtê—Nvs5cO¶cŒ4Õ!”àTwá6aÛålk¦nOgx˜Æa^bH€âf-jžbpU”Yæ_›•j˜†a•¬a¶c ¦â†wb~fêÆqÓõbg&fíŒgjWeMifRqâQí@Ëí@2¾àžVÙÄå_¶åâ³æËÏ,çÄöa–­f=ÎVpäBá—UäŽä= äßÿÖäcöä'Vc)sUîáºVçZ>âsçÒcfÍ~æy6æ›Uæ¥æé$´æ$ÔÊcÖdÿ¼â7ݐäfæàw[1aæhÞÝWšÅâŽ>cҝs,FæŒuáTög_™f´Ždû…æcæYfV¾ã†á—U” ™_b®ì >jü%ìUTàZ¡Æ<¤o¯–êÍoÈÕt0·e]6e-ј&Y›…fjæÛ9Vïp†\‘lxzç’0§gHÆgxÖH0þAâ^a pgjvã<Ǐ"îo†çÒÏ%\žõ’Þpî>Wre\’¦îmÅî`æåeïH6ïm–gÆ%arFw€…ò¬ìÈە™úV.ÿ­Y0`'h™<¸›Ì@ÿo þÚþõæ™>ÖôÙ¼\ñÝ8ñ6ži—uñîñ ÆjëþepòC/ïFïo6ã¨&f-Éò¤i±áx F‘©pìÑR&M….}þŠD¢E5úƒP¦M™¦HP0D‚-3&DH²cLO`:üŠqãÂ- Tžé‘dL­aC8Ûó"D˜cô¨jaŒ·{3ÞD«Sá×½„œÀ+W°1g®µ‰Sç–D–tšÙéH=Z´g&Z˜ðl¢…fÖ­oڍ‘‰ÿ^¬„çj«Ñ§ÜŠceN@rU¬V¬½zµH|¥X !Pr5xp¿=žŒaÜZ;SF¥ña»Ë×veS\ø$ãWÛÅ8³ÅæÏ£oÍjØbÂ÷Y*_I® &Êï7êôRŽ#˜ŽóJ7„r*k%õúré+$È῅€;I& 5Ï%¡¾CJ©}*¯ ór£ˆ?ÚZ\ÁcêI>‡èsºõØÒo¬öþÃ,À Ôh:á2Jp+\ BÆ&üÉ»Ê*¸†.̐ÊEŠÄ¤–Ú’µR0/… üѶ°®B¯Àê®ã¿ÊàÊH®‚ðó)·9ýª²Côl»Ó,mkÌÃ,ÿÝëS¥1ŸØ‚Ì0YãÌKI' ­´ÓR[íÑñBÐ !NѺJgÓH«ÜôM· 7’ˆÏ=Eõp „RrÎ6ρÍZÕ­‡ì4m­;Ià óS‡>%!µð+KVì:·ŒrÐiU¹rÅS+âVý±ÖTSÐ »ýv%P¬WGÝë-T£¢P 3£ä(·²¢6&yåÚrDJMÔÔXO[ê!Tb݋Þ*ØE±¨EÈڅ°%Lے¸å QT]<\„ÄMˆWsu‚•"Rùò–Ý•&xק5š¡zù<£e`õ”_`òµIœF³bhGn©àÿÚ%.g¤”5¢‰ì¤ëWÚ.Lš×—ÿ]ŒV«dÃSÂx¯’yjÛ¢º¹©H)%»lKQCJµ°[‹¶aªÊjN¤Ç´ "­ ¥‹o…)¨Î‚*¯S5P+¦\+»J¹d™#É2®ߋ]‘ö[[3a½$v˶=Üâ¦rÝ1+”kB‹nS'Ȭˆ—›¢ ¨h+¿Uïvo|ˆBÈi¨ð¹S˜ŠÉ•¦¢<‡BšhN)S(œHÙÝf^$"O¤YR›ÃÜüÂ-àΕ- .øuÍê{ÔcC‰u_}ö†j2U–rwh÷Á}?xo‰wÈxĒoÉòš·‘¾\(zºYõ¼t½ÊÍ*e ÁË®º§,ÙuËWⳈÐü‡¼ÿØðer« áX‡±;ÊVž!}sÁºÁsË{8bÀ&„B²£I§萱•Í‡^:¦v蔅H(i=˜M·*ŒAVMDl’´ ¹¤x!CÆ@9$¼ïF9 • ©ÅÜ ‰Y å\› 13—#QæNTD°q6±M]è%6ÑY\ÌA^drF²LÑ!Wd÷E•‰èŒiÔ"½È2DF‘Š£ã–ôG<-q6[ãJ<³K†H$bàUfG4¾Ä‰”Sb%Ï°E°Ô‘– ¤C̈G–òAX|ɍ,%Gªq“d+c&KFj1“›œ%c2JP ÿ“`$e»T30¹‘ŽQÜ•ù^Fñša¼%5É '²ñ˜)ç‹XD'Ó'é”gkÉ2&Ö—°”P'±YMs6 ‹ÆÜa¸ÐJ™mGQ›%:ÑGiŒ¢kƒãwä8ѐ]Ô£JGAÚ°mZ¯›#EiJUꑪô”ßIåJe:Ó0µ”¦.Q(Cuz” ¦-S7ª¦4!•5ÍFݛթ¬aêJ_:š˜>ÕªWÍӘh:UÑT«_EiT±šÓ–µ§ý)XÕºÖ¦ U4Jek\庮†Æ«sÅk^ÃTWÐÜU¯,SÈZVžÕ( lbiêÖÐÀU±ÿý*_?ãWÈV6¯’õ e-»Y°–° 5lQËYÒ qliU;R̖褫…mdKºÀ×ÆÖ¶@õìg}Z¢Œö¶¿=ªw0'àw‡­=Šf»\7"÷K̅îGs«[²ñ ¾.sOû™Ôf×»MqnQ”û]òŽ'¼DoyÕ+¶ÎPw§ÖÅîzc»]ÏtW¾ä=/Ò{_þ®$¿ûí¯|§ë^IÁ7­V-}‘b_3÷¿µmp„ý;[TBXÂ0Idà —VÁGap‡oû`—˜Ä%Žp†5<£¸²q]¼ÜϸÁ5¶ñ}U¼â†^ʧ9V,Œ‹b oÇE–ÿüÝóø3-^r^…L"GY±J¶²w±œåå6ÙÉH2—Ù:e,TYÌzÝò™›f5ÛÖË_6J˜ÛŒU2›yÎqeóc›g=“öÍp&ŠœûlÔ:ËxЁåó¡9›hE?öπt£gZhI–Ñ•¾2…ajaLCöÑpŽt§QJiQÏõÒ¥F³¦©ÊiTöÓ_u«/JjY«õԵƳª»Êj\ÏõÕN¶® 0lbÛØÇFv²•½lf7ÛÙφv´¥=mj›’ÚAµµ½mnwÛÛß··/@¶"„ÛÜçFwºÕ½îg›Råfw¼å=oz×{Ø 4¥¬›o~÷ÛßÿxÀÿ>p‚ÜàGxÂîd'4`á_ø¾!>qŠWÜâÇxÆ5¾qŽwüË"À<>rÂJœä'GyÊU¾r–·Üå/_±|ÃÜæE1ùÍu¾sž÷Üç?zÐ?òa‹\è(Ïùѕ¾t¦7ÝéO‡:ÙdNìšGãI·zÖµ¾u®wÝë ':±þu…cìgG{ÚÕ¾öµO½ØUg»ÀÍwº×Ýîwǻʙp€¼|î}|à?xÂkx´C¿xÆ7Þñ' ß!ïÞ¿OÞò—Ç|æ…~xÍ¿Wñ}èE?z–sžôÕýüéU¿zÖ·^î’wýw*{Ú×Þö·Ç9ìqÿæÔïÞ÷¿>ëM|,̞øÇG~òé>üà_ùχ~ô£Î|à;_ú×Ç~öuNýß[_ûßø9Î}ß{_üçGú Nþݛ_ýï‡üWÌ~Ü»_þ÷Çþõ­ûæ÷^ÿÿÀü!ú»=ëú @ÀTÀdÀtÀ„À”À ¤À ´À ÄÀ t@@€c ÁÁ$A<3þ«>ÿë-ç@‚„Á”Á¤Á´ÁÄÁÔÁäÁôÁB\áBA~ûÂ$TÂ%dÂ&ÂÐ5$@ۋµ^›(2+²°>Ë/õ›ÂÚ«B+t#,ÌBÚB=ëÂôûBÿÚ C14-",Ã/;Ã;KCô[ÃØkC7¬2ŒÃšÃ9«Ãó»C×ËC= >ìòùÃ6 DñÄÖ+DCDLÄ}á5LkÄð{DácÁë:0IC8¬D[D5ËDðÛÄՋDP JEÚÃSü¾TT½UdÅqÅWÜ´XŒÂÿ£ÅÓ³Å[\ÔÅ]ãÅ>üEÒ FaÔb,ƾºÄJ“EíKÆÑ[Ff ®gt¯R<³i̾j½kÄÆ7EmÜ)n3oÄ>p =qǶ*Gsd(tä2u¼>v=w|G pFy|.+´GéÃÇÎÓÇ}ô‰~ôGôŠFI ÈèHÍ+È1È3@Èÿ„¤Ç,kHè{ÈÌsÇØH€<‹ÖxҌw¹š<  TI’Ô|)ŒÌ¸ A•ŽX –Êm<}„M`Š¦4²ÌCº£/ #zJš-ð¥]R§ýø&d¥ô-({Š™~¢"ùÕß:’šµ§m!$HÒ¥Þ»}Fnü&M:`€Š¢ôÅKeú§*²ß†™¤e¦t"£«ˆÌ6Ú§(r'„¢ɍ?ñe¼‚̲˜ÅI•ÞUã/‹’*†?^<Ž²Ã0ORàb¼Èʪ՜a'M>žHŠtá¶+á4ð-â'-¿(ýÄ#NY%6ÑcTZ(n?)¦âILb+Î,&æB~?F<ÿ#žÈÖÅŽ2'F>3.<46H5~E6^27>>8&<9ÞG:E;F2<&>=<>~G?®D@.2An>-®?.îâGAäDTd cäêsä„äHNà/ãäc4$c/Ìd*ÜdN&ÔOæ&,.CBx¶êpºo7ÊoŽÜo kob{ïW>ù&6ú†ðI9ð!Jp¦\pŸëobûï '>'6qsåÀ³?—£’.ñØûhq;qÀKñ–[ñW¾ÇqÃÃe6Üp »ñ?>rêšñ¾«q– ò">"gò’ëq<üñŸ[ò'ß='·òŠrBœrŸ«ò,·=,óÜrÿHìòžûò1wqWsÐ*sNüæ¨Kó6g=1§óI9ò¼Kò•›ó;?=;÷ó {so~(9gñ@‡<@GtÑÈs¼Ûs•ëóE=E—ô'twŽs¨‹ôJÏm x‚í슰t¢µg{¡;üŒˆ–í˜v«P|Æw’q¡½oó¾ÿº¿8. •¤ ؕ*]ÉÓf#Ôd#õØ*€üȺ Ü•ÿ„@kàI×è½8ˆËÐWsÑ÷:Òÿ7Ó'•…hŽÂ¿φ_áø}\‘Èج}Û÷¹€~ÐviÚ<íŽð}ԔÏ>Mâsãï:ä÷7.ˆŽä¦ ¯7 !ÐJÞÞmߟQaÑXü¸~ìç¹ùˆ'„ ™p&‡†3r(Ìñ$D gÎÄx²e Ozhx"d,"G’,iò$ʔ*W²léò%̘2gÒ¬ió%“7wòìéóçL&Z˜jô'—3BRÄØBqâÓ1ÎP‰‘ə1 Ï C5F!^s€=óå(Ú´jײmëö-Ü´_¯žéAebŽ1HbxµÚ#ëÖ®_Ãÿz•Ú4dÜĊ3nl2§ãȒ %:¹mR¨š7sîìêÙË¢G“.mútÊϪWwFŒú5ìؔuʮݸrQÛ63³î­:´îà‡¿ìû¸g×ŗ3 ¹9ô¸£³äüºYêÚ·sߎý»òîâÇ×|NþüÈéèiÒà°þ=üøÐ@oÿ~Kóø©«ß¯²½ 8 [ôxà{ú!(\ b ƒJ8aIRxaq bˆZƒ B¸!ˆ!Æg¡ˆ%ž¦¡‰—uˆà‡)ºøbq$Â8ãb(ÒX##"ñØ#?Öä>I$B™ä‘J"9¤“Q69%“UÖGCTB©åÿ’[ZÙ%˜O†)å—bšI¦—iŽÉå™l¢¹f™o¶§›uÒy§šsæ)'Ÿvîé'œâ(¡bþ0 zÚ砊:ʨ ‘.š(¤“6Z飔jÚ#l*i¦—~j)¨˜šZg"U¶Á­ŠÔª«XÀúë°Ö묷Ò*«­¼âÚk®¾î,±Àû««4Tpì°Ìêú¬°Ð‹l³ÔJël´ÙN[-·×Z«-¶ÛzÛ-¸ßŠ[.¹çª.»æ¶›î»ãʋî¼ëºëê ÄK/¿öÂ{ï¿×»¯¿l°Àý¼ðÁÑ2Qà ¬pÃ[1Âצ7Tn¶x#È!_&£È%e£ÿÉm­xàÇ)»ü2Z$Ã<³L(ÓlÔʶ|3Ï=·$³ÏA—d³Ð7å<àÎE+Ý3ÐKûL´Ó5súGUŸþvãk]þzç³?ÿÿNëӝûWϞü÷û“ýþ—!ڜnç韨’*08ù³šɃÀRp$ ¬ lµœý@ü C(Â’°„&ˆ…/ûÞg%Ka0Eˆ›ƒ„à/+†J‹ñÂcÂNTº>¥îv?{Ýì&¹ÉáìîITËÊñFø± Áëºö ¦ˆA¨á‡„ÙÊøÝâ`É<.{YÀîݘCû<>C îêe¬x¹Ë˜í°¬e…$ Q.†§2^Ùn1А5®™Ï gŠØY¹!Ðó—Û÷õÒ{ÉpãȲ ²^ÿ¨h„Ζ5sî«lüR۽Şȱ̓w¼9€íG YRÿyš¦ˆ•á,nm›7ÜøµHˆ»X<›÷ߎ½¯fúŠY¦|ÍNY¸s[ÉÙyV×Y½µÅ3~M^Í×Ø6(…]—ǶÞvý÷°Á¬"wÜ9qží½æÚ×½ö6yE"m[ÓûϏ­¬DJîsƒPY"ífìŽo.oÇ^6=¸/E\isdæ"–ñÍ}žóÎôÕ¿öž Õ÷êuPy™´Ö8S1Žöµ#“ã$‘ò*E>iÙ~õ«w:ɉ._*‡Ûß²íÁÆ`mšç]!©û–-ºí¨w»î(‡l¶ëþ„»ÿÝVoy‘@…x‡Xç#N9èï m«›ë‡ÿê¼=süFd WHA[h‹¼þ•QÅÙnTµë¾÷»t»ÝpjUX » oÀû²/^Û{^1=à*‰a]‘a^õáu¼¡ÿ­¬©†ë­Þ"àg4¢ö†`Ùt=¢_A"gh`¨9Å NÀ%ª¡5M À)Qäql·=Ù0˜á~iFU€lÕ+BE,BE–]â*>/âØtÂÕV0Ø*þÓprá"qÍ"d5rF/BÅ°¢-jseãpdU„/r£##U8£f˜#-& ¬‘ÕÙÅrÿ¢o™áqˆ\ýu†°]„&N"7šYr-g€"kÀÙ©QÞV4Û8 ’’ .¢oØ &!"Dâ㤖^"k4ãCÎF®†fÉßwhdî£fTäDx˜¤™nÆ5nœM)U‚Ü.!âj Täµ­¤¡6amß¹Õ(Xñ×µ1ܵíéÁ½ s-®¾à°^¤¾љ„áW½ÙÛ_$k´Â¥©®ÜûÁ™ÀMÅ¡¢œ®d¥n†ñᕹQ›à9\Ã!ÿ»Ò£(5§›¾iÆé…Ì)k@$A Ò [·‘\Á¹—Ë%Ø^øÜ b–FØ~á}•I~iÿu[ÏÉÓ]–0Ve ¦a™ÕŜž³Zk½@–åáâiè¥ad×é•Ã²Úž ™Ò±*‡U+ñ«¦ùëÉlÉz«²rëË'Â>^Í]ÂÚn5ݪ kýU–ŒI¦æ*f‘àÁÚÛ³’žkVåoÚe¥ªûUášQÁ˲ÖÕ)ZÑÂtù›ÓŽ‘q,Ìùœba&lu˜Û½ŽÔðÙ+â+…èëj@dõÑ]ÝQžÂ¢"ÉÉ¥Fën9„B$,·Uѝ^àU啽àޙ­cIXÿ •©!‰^¶‚ìâ"[*Ú,zBEzF_͞ë1VjæmÞtrR«†’ßæä nãÚ\å:œ¿%î îá©\©IžWhÀb]Öé*-±ÖVÓ.áW™•™¤ï†îòzmûñcךÙqµ®y‰mé)äntYXÕY%MªÜßž•Dµ¦o»Ò-›ÂU½Ut¢Sýê”ÞNßZ¤kNÅn ûíç¡©Àäé:f_y!·fßÿá®p}JVÛÝíß~Q!ýQÙÿ¾íyYYpe°à•ùAØDþWšä&>/·1–˜ hüÅî&Í.(Ù Ó5(+„gž=Ÿ€J_a¦îõ)ç$÷ÿ$6j¸V[Õ>Ö1V±Õ¨¸æ!ÁY§î~Y)ce-FŠÿiß ÃÖxñߢ5ð$ăDÚî•QjÐXËk(Õ­ð×Qɘ ÒÕ^Þ×®†.S寄ìïg]—›¾àc˜€×¥±,T  g¡åŽš[~YçÆ`Ϛïˆb2Ê%á'Ô2#s!è]š$ã"bXø¡ë$ WÅöð^¡l)°BÜv # ‡!rŽ²½U²›‰à6ò#7hÚf2a >1;š¹š®rýÙ)—`B0íT8D$-ôƼòn%ó$;ò5ƒ•'ßÛõÒ¤ˆ3ƒñÿ`Ï>!•I¡º!"]%\ÃîÕÀe_†© laÔí³½ÝïÇojÍ/P]„Tª-/o@֖¼cKùq„²g¤žãmÆ2Bí*"sÝ¢„B&+nW ×Fç$ƒý"*dEcw£9V#FªGocBRElŽIcV¬ã%bn.–£02Ø£4v¤&í²'YôW©¢6¾_Iït#çñštbz….ÂâI‹#UcVèV´Yæò"8¾ô4 —Ußn…4q¡bY§53‚ãO7UoÆP§4r½[eú¢V·5áæÖV3ò—Gãa‹£@47Ù­•U$4¾AÅVÂVXDeÝW¨ÿ%6Âdë%^šW©™Z‚ÄT¼§@”è]„rå€g3w|¨få2Jö‚¤v'Yrœ\®Uç:ÍìÝ6“wg– Ûv(͵åv=íöÇÕËÞãêI温²Jæ—î顺ÖAÀ›}Ž«Fhª2´Li7‚p·zTl/¸ƒwTQ]]¤q_ëcé¬_+É®vҁw—­ dÈ‚ˆ‚?ø>5¸Š·x„oԄ—^Vßå¦"À.·žã Û]¼îª&pøŽÿ8s‘xP8¤x‹Ë‹'¹ƒ¿x‡•Œ÷¯ýQÄ4ß°†°A˜i±µ0©6°_·Qx;vD39B-¹™Û¶“Ó,PÝU{õr¡Av¡}r0#²ê *¿àb­Ú-Ë¡1„<›—)Sí•‘’§y:¡¹¢¿éš—7PíXN¦"]¿4k=5_s…Tµ/~ß^Û4N‡¶¡9ŕy£¯8y/vª§ù£³zP¥÷jÌv/MWïÔ¡ H¢·:81:¯ûÞ«ó¶Qññuœ÷1IE›:î¡ú¯Ã“¯7;Û{|C»iåz€ì:µCÓ³g{ÆI»r»TY»`;¸÷4Éd¹ëž·£ÿ{º¹²/ ³·;6m»¼'Ùº×{X‰û~;¾ï½÷»iÝ;À‡û»÷d¼|3ý;·•À/¼Qé;~ð»Ã¿’ÂO|X5¼ÅãzÁgçÁg¼P­º°{|·´w)vȋ¼io¼œv<ÊãRÅ·üQa<Ìg·Êç+ËÏ<Ńü´ã|“I» ½Ð=ѽÑ=Ò'½Ò/=Ó7½Ó?=ÔG½ÔO=ÕW½ÕS€xÈT\½×=؇½Ø=ÙKý Jü|Ù¯=Û·½Û¿=Üǽ×€è6JXÁ¬ä½Þï=ß÷½ßÿ=à¾à>á¾á>â'¾â/~ß[э8ãG¾äO>åWÿ¾å_>⣽Jà=æw¾ç>臾è~䧊Ýcꧾê[O­¾ë¿>ìoÇÅ>í×¾í˾Éß¾îï>ï»Lë÷>ð¿ðûÇï¿ñ?ò·Ïì'?ó7¿ósGñ?¿ôO?õ3FôW?ög¿öSÆòo¿÷?øãL÷‡?ù—¿ùßÔù§¿ú¯ÉÃ7û¿?ükÿõÇ?ý׿ëÏ¿ýç¿þ'þï¿ÿÿ?@`8`Aƒ&T¸aC‡!F”ø ‚&&fÔ¸‘cGA†9’dI“'Q¦T¹’eK—/aƔ9“¦ÊŠkæÔ¹“gOŸ?:”hQ£G‘¾¼‰1iS§O¡F•:•ijU«W±F]š•kW¯_Á†;–lY¯[ͦU»–m[·oáÆŠVn]»wñæÕ»—oҊ1H<˜paÇ'V¼˜qcǏ!G–<™re˗1gÖ¼™sgϟA‡=štiÓ§Q§V½š5a ;PK©ã&׉C„CPKÛ°-AOEBPS/img/atn_sim.gif´ KßGIF89ar#÷ÒÒÿÿ×׀€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³Ìæÿÿÿ::ÿWWÿuuÿ’’ÿ¯¯ÿÌÌ3J` w(Ž/¤7»>ÒFèMÿUÿl"ÿ‚Dÿ™fÿ°ˆÿƪÿÝÌ3"J1`@wOŽ^¤n»}Ҍè›ÿªÿµ"ÿÁDÿÌfÿ׈ÿãªÿîÌ33GG\\pp……™™­­ÂÂÖÖëëÿÿÿÿ)ÿÿRÿÿzÿÿ£ÿÿÌ"31J@`Ow^Žn¤}»ŒÒ›èªÿµÿ"ÁÿDÌÿf×ÿˆãÿªîÿÌ3M"f+€3™<³DÌMæUÿhÿ|ÿ:ÿW£ÿu¶ÿ’Êÿ¯ÝÿÌ3PmŠ¨Åâÿÿ3ÿ3MÿMfÿf€ÿ€™ÿ™³ÿ³ÌÿÌ3Mf"€+™3³<ÌDæMÿUÿh:ÿ|Wÿuÿ£’ÿ¶¯ÿÊÌÿÝ3"J1`@wOŽ^¤n»}Ҍè›ÿª"ÿµDÿÁfÿ̈ÿתÿãÌÿî33MMff€€™™³³ÌÌææÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿÿ3(P7mEŠT¨bÅqâ€ÿŒÿ3™ÿM¦ÿf³ÿ€¿ÿ™Ìÿ³ÙÿÌæÿ3Uw™»Ýÿÿ--ÿDDÿ[[ÿqqÿˆˆÿŸŸÿµµÿÌÌÿ3&M3f@€M™Y³fÌsæ€ÿŽÿ:ÿ«WÿºuÿȒÿׯÿæÌÿ33MMff€€™™³³ÌÌææÿÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿ3M&f3€@™M³YÌfæsÿ€ÿŽÿ:ÿW«ÿuºÿ’Èÿ¯×ÿÌæ!ù ,r#þH° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cv @³¦Í›8sêÜɳ§ÏŸ8e ڨѣH“"%Ê´©S˜HJµªÕ«X³jÝʵ+ÕOà 0 ¬Ù³hÓª]˶­Û·pςK·®Ý‹Q½êÝË·¯×¹w—$·°áÈã̸±à¼~#Kž¼u±ãË 'Þ̹³[˘C‹†J¹´iÊ G«.ê¹µkÏ©W˞ýòéÛ¸+ÓޝPóëßÀ?óNoîãÈ«Æ.¾ÚwðçÐ,gN½º@ÛɳŸžný²óèà]þsïNž6víè%/ø{ø÷›×³Ÿù|úû{åÓë¾ÿÂúí' ]öág nz÷߂ˆ˜àƒMxà„V9¡Lý1¨aZ^èáKR("~ØR†¦(‰,ò7⋶XŠ*jX¢Œ8†"Œޘã`5)׏D‚Èã‘>©£L&©ä“íxdzNBɍLÂW¥•\*$å”ÚmÙ%^Y)æ˜h^æ‹g¦e™5¶é&—_®‰œœs:„%œÑᙧ’uڙ›ŸzÉgŠ„šc ‚Þ–¨¢íyhpBÊ"£šV©¥×Mj#§ „i¦¨…:’¤ž¾¶©© ŽJªzf¬.™ê«ÆºŸ«¯úU+¤¨Î ›­¡âš+_»*Ú«¯œ ,y«—²‹lbÐ.[]³ÎvUíœÒN{ضÖ‡m¶†›™·ák.o㒛•ºhv‹®bëÚ®»WÁ;¦¼ó¾¥o½£þ„A D˜PáB† >„x0€@Š-^ĘQãFŽ=~RäÇLžD™RåJ–-]¾„åđ5mÞęSçNž=}v$QèP¢E#Òü™TéR¦KʄUêT™H›^ŚUëV®ƒV¬C«]͞Åú”êZ¶m_–EWî\ºJ¿ŽÅ›,ܺ}ýnTëVðàµ|ÿFœ8î]½74¬Xòb•-WœYófŸŒ™ó襁/ŸF=@4iÖ­7{[ïj×µmšN{0mÛ½}£…-[xXÞ¿gÄ­[yáã͝w >\úÐâϛ'_žjuëݽ“œ~þïwò±kGï’{yö壋‡¯p}{ÒçÓßO9Ÿþþëñý?ԏ¿ÌìïÀDе÷þóïÀ#°Àû|°ÂÄ0! -¬+B ÑېC‹ ±DOD1EWd±E_„1ƝʰƂB‘²w< Çú‘©È´Q:ƒäÊC•;RÄ&‘hÈ"3|Ê«”\2·*+Ü2H)§d°K+q2 Ë,QÁ4$ Í6½3Ì1!äËÌ3/[“¿<- ÀÍ7͋ó¿=çi"¸ì¼³²AÛ[4Á>ý„3Ðø%”#šÊB4ÑÝ*‰Ru3RIÅó”SŒ²*SMÝ*Õ»VéþõÏ(G…ïUSÍóʼU'¼µÐ^oŠ•Qi5òW¹0r×ôl}ŽY÷üPb§sÖÔCRDcÚ¶Sh‡V6Ce$·\sÏE7]uOU5Û©ª=^W¿•6\áäí¶]w£Â×·~›¥wV{ïíö/÷e²`§.4à&˜áºTCXK‰/ú×¹`Á…ر:Oe-cÀj¢¸âÓD–lȋr˜ÈŽÇÃäúZ °d“ͷ̕-mùåÐdqfšo²ùfÁPVÌP w>µgŸû8æ(K‘Ä\­Sª£ÈꮵFÈ­½ûëT·N5שÓöúk ‰Ö×èóå:h¦‘súéÆ¢.¶;íºßîÚ=aªÛ»?¾üùôëۗ­xòýüo.÷Útøt߱՚_â!x›qtÙvy#Ñæ j^užzn”~ý}~ Žâ–YD`Š*"´c¥ý¥`vÙ­Å]Iܵ5ãuØÑH^hnÅaBêDb‘Çýhd’‹™H@€+>) pª½%"l‚4ZŽ¤É6••®í›øyçڅ¦!Iܐjjˆ¦’n:Õæ›rÂYY“—A‰çsqÎùԞ|F•áš‚òæçå]øe‹Š U›ŒNG\cF:“Næ‰)Yþ駓:h¨ëiUW‹Åz¨§hnÚhg{êÇþ*S–Þ™i­bÅꩄ¹*'j¯…±Zj§dJˆ+H+««€R*ܬ(Ú -g»N+'¨¾^‹©'™Š*uĉ8Ð]z¹¤¬ß'.–áR¸-Iàži¡˜Têì@ÑÞÛ²Ôîk•µØþû°<ºØmÁ7²öš®Ú2 ©Ž«ùÈ`°ê˜ãûY/AønÌ"¿è/À"©ÜÀ&ÇÆp„†§ðz;ƒñN¼r‚ãÙ¬\—rŒ¯¾ÿì_È#ÿ+0Œ K nª8ˬcdR¾ÌôiÚÑó)Ð\ÅIŸÈÊw>c%‚¹Ê£EÁ¾)ihsàš2˜$Ú)DtÓ u„wAhÐ„Fڎ‰ÆÂyõ'ƒm‹áýP˜ÂZ­Ð†Õz!¶vÈÖÃÛ‘DÌa¦€8ÄúPmIYCˆC#æ ‰O,Ñ}EÅ$f±Š‰¢¡´E.NðŠ½ £ w'Æzñ‹+2c›EFQù¨lt¬£ç)7V±ˆl|’ß(™ÆQ=<œw ©Å5ö‘@ˆä’9¨F~¬ŽÜ™"IV’Wüà&1„¹OI‘˜„Ž&EYAv²7§ÜWuZÉÂK–2J¨4*W¹XN õ«eÎ 8ºYH—¾¼.‡DÌ Æ®˜‘¥0“LfRç˜BŠ&§®'Í%i þPÐàA„ .dØÐáCˆ¤XÑâEŒ5näØÑãG!E~ 0ÀäI”)U®dÙÒåK˜1QNYÓæMœ9iæäÙÓçϊ 4âQ¤I•Ý ÔéS¨Q=–”YÕêU¬2›JåÚuäV¯ałJ”€Ñ¥iÕ®}vì[¸o©f¥[×îK·qõFÍ»×/ײDѲ%\Xmß¿‰‡œ{×ñcºˆO&KÙ2ÐÀE)4ÜÙ3DɗE+n Ùôi—¡G¯ÈÚ5c³g7¦]¡ê×¹£æÝ;%n݋Y¶@ζ•{NܹNßÑy7—zõÄÆ/çÎö:vðKþK'_÷{ø®çÑˍ½½û{¥ê×ÏXÞ¾]ùô1ëg­}6|“ʏ?ìÆ»ï@˜$P§‹kï¿#l«A 52A WR°Â¯8œÌ?ä$±¡ =ì/CS3®W¬ āF”1¡]´ìÂQ¬ÑƌväqªCœqH|üñ/sÄÐÈ#‘k’Å c$rF&ŸdQI,MªòÈ-­Ü,Ê䦱K/½J2KûÈ´QM+a SÌÙ,“/4•”ÓÄ;¹Îóœ³:sô³Â 5ôPDUtQFuôQH#•Ò=ù”pÐ?{:3Ðè0516PCuTRK5õTTSU5T÷,}ÏÓLþqڔÓÞ`åpU\sÕuW^UmÕUîlõEZ3–Â^“UvYfEýX厖±b—œÖ©f³ÕvÛTŸ…¶6i¯ªZÃ÷Ü¿…Ï\t{$÷@vە÷Mum‹WÞ Þ½ï^|Å¥·^ÚøíwV}¸ßaÿ˜9„O,˜¼ƒþSáÕˆ³B×¢x©ˆÛűЙ@>Id–Hþ`­PžIb–õÚX@E ʸȗI¬©ŽÑý˜dCCNíB“ Vy䖋ëæˆf.ÈÐ¥‘vHéÂr>7Iž«Æ è¡}“Úh~šÞäf†ši™ ²˜f² ÛúZª©Yd“{¹$¹µl;èz†»±wCñâúo©¼¶ypšËN{Q´¡ÖpÒ~¶;o·çBtîÉ/¹r»+¯ºï–ÖfœCÁRü6ŒK/»é°MïÌ󄯆üu«-—{v¬#·=sÙ÷VñsÞy }¡Ñ/nõ³ÇVÝ0Öc=ómº›§œó¸#¿Üç×çνªä{§þ (hð „TXáÆ 'BP1"F‡7èñ#Ȑ"G’,iò$ʔ*W²L`̘20¤ù²fM˜'ê|3gΙ6eõÙóèP¡Ji¶lêô)Ô¨R§R­jeÍZ ^äÊU"X…]+vݺµãÕ´jײ-it©M£¾¥KÔgЙy‹ÞEš®Î¶‚.lø°È¬fµŽ%Ö¢ãŒË.ֈ1æ̅ë*åÙó­ç¢xùvýùtÒМ‰jníú5ìÁŠ+;Ü9ñ«ä¸wS¤Í16ðà+Wë ê™îqÛr•#?wnÒçõ ¯nýºðÙ¾Åöæ­øöîÜþ”·?Än¾:ñ»Ë9;ǹ—ys¡V½Zîiׯ{f–=;ëèÎbñr ›«N­CwYZ-cÖǑK作ù@ÚÏ¡§$^wõÜa¯7Ç^#ðŽÞaOþ>~õtíç9GWÿÜ<`ë^­ogÞÞsoá¤ñ‡OMžcúèj½3û§ßÞÓ 4í \ÐA¼nÃÎ+°»¬±n" ·Ÿ¯¿•j0Àk²ŒÀ¯Ñ·Þv+,>9ʾ݂ËNC³Ûn°Ï:ÜÄ—"QȵLDÑȘ`¬ìÂÅ¢ðÅùšâQ> t>s¤2K¡<Òˆ’RÌîŽ,³¶ä.Ê-›¬QÊ) «K+™\3#‚¾Ì“¡4ÇìÓ93m‰O§ZDoÐ7-¬QÝ´QA6êRÏIÔÏ!‹ TSK£äð†-Öè°[þE®I ŒÈúb<-kµýcû҆Ïݞ îZÉøV×îÆ®¿õ‰ï¾ LÜZ5¼ñƜԕÃ±´-Üp·w|8Æì\ç¹éÖpNøZœü=x5ß<©±=gôõDï3pE­rgTëjÝõ£Æ½¹Ågç«ö£‰Ä—IÞ{%ub¤ëfúwÖ$NZxƒ‹îx1o¿3÷ }5Uyë M{úý>¼ì¡ÛSÒ½Ï57j¥~ÏΧþA÷'žýÕ·"È Îyó _óLÕ;óå/D9â_âü÷¿ª<M÷³_•¸?ú‘OUþ4xaB… 6tøâÁ' ¤hcF9vôødH‘#I–Ü`@J•+Y¶tùfL™3i®¬hgN;wÞäùѧƠ õ´èÄ£E1ýÙÑ)ňS©Vµ:U©Ð§[¹võÚ³fX±cɆúmZžgÕ¶u›ó,Á«séÖ}ÈThR½{ùöõûp`Áƒ 6|ØoYŋÓdûrd‹%W¶×nfÍv)[öü¹+ÊÆ£I3î uÏÔ«#cÞüö]Ö³iÃ-}wÍÓµyŸìýû§ëØÉØ ¹gѹ™7WyzÉùõƒVÏ@Ùú›Ì7¨B£ï¾M°<þ¬ì¿%LÈÁË<:ꢤšj /+Ò«·úQ·£«ÐÄ·"œE-äC¢¼ˆÆ6¤ÑŧD$‘G˜rLQG õ[‘Å„°ÃqœÏÆ>êH°zœÒG!‹ÒÊ­ˆ,r=,/ë0F¤–¼J©<“%/³$IÍ5uڒËâÚT®Æ&Å´“¯:•ämG4§œÓM ”ÐB =ô/¨â,ÐýêüIH d2D?-m4ÐLݔkÑ 1=P+'íŒTOI)åÓR??ՔÕ9íTþÂUµ¤ô&¼ÀT²ÖG½2U4emØ!aeTHî<UÃ=“=–¢$·ëõÌ_ƒ6¹W‡5’ÚîíÚ¥ÍÜô®%6ÜI³ä¶[û¾-—ÝϬÀu•“WËt{¤·Ý|U„—\}·µ—G|ýØ«wùeO`‚mxĄ~ø̓û…øAtâŒ4XbìœmѐE™ä‘/VÐaU¾°cOEÕsåôNö6暩ã¸eâL…ÙæÔ,ž¹´”{®çœcËuÏ¡}Z]¥ÞÎèxuZ㟙Æïé¬Í‹aRµöïêð¨þZᢹǪ̈—Én-lçÆ^Û_³Ïæ줷!¶ºí²ì†»]¹ç¦Ë;¾!ÌcÁ ío9_špÜö^V§É9§`{òI%žy6¨ ùùg[‡"z$¡…æÕ¨£æ-šÞ¤”Öi¤caJ©¢–Råi¦)nÊ)q¤šj¨Rš*‡¦fžj”«‚®Êêv¯æêQ¬²E+Ÿ¶ÞÓ¯º Èk¯B g°Â¾U쳉"+œ²k2ÛlKÔB랴²e{çµEj+î@ÜÆæ-˜Ö‚«Ò¹ã>wl¹µk—ºQÊûì»ð.Än–éÒ{Ò¾ööþ4xaB… 6tøâÁ)V´xcF9vôødH‘ 0yeJ•+Y¶tùfL”GÖ´ygN;yöôّ`D¡C‰HógR¥K™j,)jT©Se"mzkV­[¹V jlX±­v5{ëSªkÙ¶}Ym\¹sé*ý:o^°pëöõ»Q­[Áƒ×òý{qâ¸wõ6vÜаbɋ W¶\urf͛}2~ütdΣ—¾|õѤY·Þìtl½«]׶i:uîÁ´m÷ö¶láayÿ6ž·n兏7wÞ5øpéC‹?ož|yv¨Õ­w÷Nrzø¥½ßÉSÄ®½Kîåٗ.¾ÂõíIŸO?å|úû¯Ç÷ÿP?þ2³¿A×ÞûÏ¿DŒÀïsðÁ dÄ(´°®%DoCEôkÁ à qDà>\q¦]´­D¥CñE®ƒ J´hA F“^Dª´©Ó§P2JõàÔªX³j­yukÔ®^Êë,Y£fϪ]ë5-[Ÿnßʝ‹ö&É£#š(ó(ށwqÆ¥K¸°`ÁSóò%éÕnjy6L¹rÇÉw:þ 82g„šÿ.ΉٲéÓK/ýÌysçϐ֌º¶mŒª-†^ì¸$àÀ¯YÏνú¶ñãe·-¼1s¾¾_ïVŽ¼ºuÏ6;¾Ý/öÞ´¯þ‹¯Nœ¢væL»ÏþŽÝîø÷Æ˧VÜ8oßûŠõjÎ/ß<üÿ¨õ`pH—€"hà‚I) ƒ F„ðQ(á…îaø…vø‡âèሙ‘(•‰(6˜"h+¶8¡‹ÞÁ(#W3>W㍉hŽ8ÊÈ#r?öØbñ i$n7y$‰JÚÖä’> ”TB$åiWVÉ`––q©e‚I~)&‹5z9f…až©¦p0š¹æunç›@¦Iç—sx§˜yÎÕçžS– ¨–¾U蠕º–¢ˆÊig£F2z–¤ÊEéX—Vºè£šrêb¦’j[¡ö8êV§–Šª§ªÉj«þ)¦š•¬°REkU·ÖúT®_éÚ櫾zÈ+TÃ[T±N!k¬PÊ*Õì²==[´&J{,µÕ‹í–Únk µDëmHâ2;n”Ýžû_¹/ª{!»p¹ûnºò†Ho½;ދo‚îû­¾þÞo´ƒIìDn\pD15ìðÃG ÓÂ¥g¥Åg,U~s¬ñÇx)¨0Èr82É‚Êc¬“Ë,« sŽÇ<î̗Ù,/Î3¬³iY®üóÐeñLt£y}ôžJg¸t§Mü4Ҋ =õ›QGkõÕg^º5×PÊê3ØhՌêØdKf¶V{¥äÚggíö»p‡U÷ÜLê‰7þÙwï=àÀmû¡Ü¢~-x…}û‰öáEíãh’G8äîöE¹Àë~¹a“w¹øá;¹y¢‰ïúè_•núé¨ïª¡æ­ïûùÓ³ç{[ª/ûíe×þr¼„¬O.Ž¾OžòC%o×ðÌã}µÅG¿áô±bo}ã]oß³ö>zï‘óáV/>Õà‹ŸþÛä‡j¾©çÏ×>®ñ‹´~Øï£>?V»×¯kþ £ÖþÆÀ5 ,\Mu?@õïrt`¯¶@Cù¯^DÑÝA’ujÌX9˜AâmÐW%$ÞÐRxA¶ƒS{ ËF(Àz‹†Øb!lÃòƒþ?üŸàdØB¢,ˆÓ¡¡£Ä’¤‰üÛMȟ)¦Žˆx‹«8ޡ䆖 ^—•åÑXg¼Ý¡…Eȕ1Š‹£ç1Â@èVtÌ£÷(“)ZKd“Ê–…$Q 2[„¬¯9HÎ)rSyk¤#SÃF"r’ «ä!­bÝX‰LLôMûcv©YMº q’Æ&ô¨§h×åzÔCÊRmC–rÚðÖ&¥é´ç•ÉÁå[™˜ÇùG–”L³””„!“F`ápø£—ß°†>×ôeg `B‡7éÑf{’ِe"扛e'¿©Ò´’1Ó6ë3š•Ñ3F²þñŒ8a˜íÀManyV/]#EôÔó îŒ -±É›à¨’=!óX>÷ÙN‚(F·|&$ãÅnJ§Ÿ´éJ3¯‰Ðå ԗÆdÓH*҆–Ô–µi©¶M畽|'5—ãÏm2q8ú”&Fói£ƒZ´VÝ0gš£âTŸF=LK§Ù›½¨ò¦]\çO·JՔþFô„iL1Š)nBSšõYi?Á#ÕKŽµ¨bš%óV$T¶m®#BEíöƼ¾“Š| ¬`KؖlRX…M¬bKÇ¿ªP’¢³ë4«²šRjJulÜȚÉ`S˜*Ó¬Fdª› anœqMê#O´KJB“F~AþißÊYMú' p=Qgi²W 3š£„'?©ƒ%Õê͙lµO'Ѻ͂f3¹ZEjkÊÓÛÑâs©Ýñçn˜IÛ¥úé³ñ¬gO§{žjÎÒ¨á)%ƒTL—5»úánq"PóØS:¯A Ïñ’ô¿™dï8‰šßt†§Kåü®kñ{R;ô¿}©ƒW)Ú]4ÂenÇ7_Ý.q·']®S÷kÒñÊóÁþäÖZUÑlõ›÷ÌNFüá뵸šiUî=¯Êcvj8p,–..!›HϪ¯ÂJ”37šd"÷“LF—“sùYCFÒ­ ^­•ý:å(WÙn”ES‹ƒ)šutþåmþ…ÿ%³œÙh§—p—ÙèfPŠHÎXޖ…à+Þ‹3ÈÖdkÎæLÆ8Ó'¼Ã±¬Kgé_ߍnF4?:Ô kxÐyÎaQ\S¸ªµÀÇ{t°öìÝt6¿N]§ÉÖl°sQÈb=6ï¡Ezc[“âFa˜_W¹];±ÍW¦««}=/`s9Ó$¶ ÝddÓ9Ø~e¶”]hh'Yڼε­-æas›×Øv¢¶k…änßLكëõ·ííc ûÜë.v»›ý[áž×¸aUnpÏ{ÚõÖó½u§nwGûßÙÎ3#5p6_Òñ^vùÝð1öâÏ8K*þ7{üãçxÊþ@Nò’Väëúê…Ôov¿xÔ(\m)ñtçû±Ô†¸Á¯pqçæ5ÇwÏõýs]à7O÷¾[ÕryÃ{çæ¶÷Ñþtz¼ê¿ºÔ¡îo¬'<àšžz«½îs°'[ì+¸ÕyNv¢›ýÙ\wùÖ×u£=eIçÖÒUÕôeço¯vܝ>÷¬³½ð_׺Ýï÷¶^ñag¼Íÿ®ô¢o[òBw|å¯sºwñe‡üÙ1tÊëÝòäŽù{¬h+Տ‡õ½º{ÊóNð½WL&Ï}L*§ûÞ¶ˆÀ¾ð‡OüâÿøÈO¾ò—Ïüæ;ÿùЏ¾ô§Oýê[ÿúØϾö·þÏýî{ÿûà¿øÇOþò›ÿüèOÿö}Ïþö»ÿýðã´Ô_csÑ¿þíº¿—ã¥ÿýc¶ÿ[Ö<xdóGF³¶0s{*‚fjgg§€©u-šFk?µEG’€z¦h5.v×^§&xy+åS‹7‚£—a‹–‚h€9æc ˜zH1X€-˜D¦GSþbT‚€7øƒ«2ƒB8„ˆNÊÄjK±pò±LÑå]xbƒMeìE]ʒ\ƒâƒPH_ZFc:e¶URw…×Å\75\_%d%ö‚æՆÍÕ_0N(QхVi5]ÂE‡ÅÄIkèb·ÆU&¥‡¡t2Ad†þAeb€fboÆP|æ\òĈ8å_6bmèˆà´*ˆjoæi¥\‚èUžÃCˆÈiðOê5…U•]©xff5–øKrø†pvc”è^ ÈI0%iƒÒEiv„¥fi’Ö‰×QœjS˜_ƒhSF‹ix^H&‚F†#ŋ•J@¶öč]¥›„̨]µØ`Í‹”(a@¥RÆMÑØSå%éȎ%æáĉØx%–³Þ8JߎÁˆ‚rk:æ\o³(kUôb¸V˜¹¥c*‡T=ÆbꄐHø5÷EU%‘} çIDHxNgˆmZI’%é$?TŠº³rvÄþƒ#Éa3Y„ôS“6{˜“³"…<©“)ù“@)ŽB™,>Y”Má’Hé,G¹”MéNNy08•AÉT™”Oy•VY•ZI”֕SI\`ɕ_9–^ •fI–hÙ_°f;"á‹Ç#’¬ÕT5øDY‚K6s“E3_ø–Jˆ4GI` ¶ŒÔ–…”—`È@jV“‡kؖ ¹SáÔ^&ÈNx©ø‡Í˜h•†1֑²±céRÔ\s¸C¤8˜±•‡òhŒæ8Ÿæ^&¸]æ؎vH‘}暌¨R˜˜aꉯ 'Àh]Ži,Ei°IL¿yÊx†«ƒïåiύúEßъÚþIiÚt’£õ~á˜dÅgعœ6‰EZàAØéMx™)E˜)6Ÿñy™pI.ðç–;)‹ã›)֛ï‰b2ÕQzŒÊ`÷åŸçˆ  z›¶ÙiªéV•ühÌ%€¸/ÇUf#b‚6Y!³¡}thúőˆ‡·f¢*ê‘÷"!¤”°|³bYÙ32|0*cF(|9š–:ºŸ>Z–â¤Bº•ã—’Ò£ÝW”¢¤ÜǤ7 ¤GjdR)¥S:¡C9¤å§P=‰˜ß— â¤_ڗ®ã¥cj\üS£ágV]j¥æ‡—ij¦à§Qª–[zŸ è¦çǗƩ§oJ+.‰šk)†în³A‡Èš†‰§àµ1{c¨/:˜¢˜¨ÁÈ¥sãMŠTœf¥Ê¡£ù¡žù‰xuÙa¹1!ùeZUÏŠ™X‡„¨‚Ú5Cùw¹hü…›Êٛ֊²Ú~4©©'úŒ$Ɵó¡‘z4є ˜ÀjŠ+8OÖè <¥ˆ£JNhz©<¨p&]…‘AV¤)Õ¥3`š˜q駨J|”Z§gù—Å·®­'§6†|“á5jº~„Z¦èú¤ùj”òJ¤úi§Zÿ:°™*°žFš°¹¯ Û§û°Û® ±[±æÊ,ñ·±Û±›{;PKÿ szüPKÛ°-AOEBPS/img/atn_per.gifË"4ÝGIF89af#÷ÒÒÿÿ×׀€€€€€€€€€€€ÿÿÿ€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯¯ÿÌÌ3J` w(Ž/¤7»>ÒFèMÿUÿl"ÿ‚Dÿ™fÿ°ˆÿƪÿÝÌ3"J1`@wOŽ^¤n»}Ҍè›ÿªÿµ"ÿÁDÿÌfÿ׈ÿãªÿîÌ33GG\\pp……™™­­ÂÂÖÖëëÿÿÿÿ)ÿÿRÿÿzÿÿ£ÿÿÌ"31J@`Ow^Žn¤}»ŒÒ›èªÿµÿ"ÁÿDÌÿf×ÿˆãÿªîÿÌ3M"f+€3™<³DÌMæUÿhÿ|ÿ:ÿW£ÿu¶ÿ’Êÿ¯ÝÿÌ3PmŠ¨Åâÿÿ3ÿ3MÿMfÿf€ÿ€™ÿ™³ÿ³ÌÿÌ3Mf"€+™3³<ÌDæMÿUÿh:ÿ|Wÿuÿ£’ÿ¶¯ÿÊÌÿÝ3"J1`@wOŽ^¤n»}Ҍè›ÿª"ÿµDÿÁfÿ̈ÿתÿãÌÿî33MMff€€™™³³ÌÌææÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿÿ3(P7mEŠT¨bÅqâ€ÿŒÿ3™ÿM¦ÿf³ÿ€¿ÿ™Ìÿ³ÙÿÌæÿ3Uw™»Ýÿÿ--ÿDDÿ[[ÿqqÿˆˆÿŸŸÿµµÿÌÌÿ3&M3f@€M™Y³fÌsæ€ÿŽÿ:ÿ«WÿºuÿȒÿׯÿæÌÿ33MMff€€™™³³ÌÌææÿÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿ3M&f3€@™M³YÌfæsÿ€ÿŽÿ:ÿW«ÿuºÿ’Èÿ¯×ÿÌæ!ù,f#þH° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0c @³¦Í›8sêÜɳ§ÏŸ8e Š¨Ñ£H“"%Ê´©S˜HJµªÕ«X³jÝʵ+ÕOÞ 0 ¬Ù³hÓª]˶­Û·pςK·®Ý‹Q½êÝË·¯×¹wg$·°áÈã̸±à¼~#Kž¼u±ãË 'Þ̹³[˘C‹†J¹´iÊ G«.ê¹µkÏ©W˞ýòéÛ¸+Ӗ­ùµïߟw ®ÑvîãÈÄ&¸7ðçÐ,gN½úÌä؏O·Öyôï®·þs/Üxöó’Å“'ê¼ûÍê×Ëm½ý½ñçC}Ï¿s~ý6w߀}ýàJíõ§`pr¤ÔƒF(á„5%T^e`ƒ(%¸à‡imÈ¡…#Öfa†(j%b‰#yâ‹Ò±ˆÑŠ2"´Ü…)¢Hc¹ã‡;Ö$ݘã‘_“?*8$‹Oi$’HF©¤EL6ɟ•r)c„&A8RyŸ—WJ”¥–î¡ ›#‚)&dšy$œi:´&›ßá9ŸŸÊ)fv¦hž íÉ't‡’ר~‚ŽYd¡†"ʒ¢‹÷(w›Ê)“Rša§–™)Œ¤R×ilA¦ªçœþ  T¦¨É¹j)¦§¾fëp«Ú8Qj»ô)¡´lš¸æÚÚ±´õ*ì¯Ï 5l¨ÅžYªJÉ*ëßµ 9++ME‘ n‘EkS¸åVH&‚°[-zÌ*™­¶ðq»·€‹î¾úΕ/¹ûÊÊîœî¾›]¼RÒ뤽‰v(𺣻˜¿K 1¶íRkðÁ ›4¯Â‡!¼š³–Q ñÄó[±­Óʺ1¼—ô1ȅ‰¬É3}{Sʧü/ÏfìòËÇÜ"ÍïÙ<Î'û ðσµkËE]´Ñ!͌ô[JÓçpÄ&?Ý´ÏëN-tÕV׊µHZoÝV×tM‡o‘PCݳÊäšM°+Æiãwœn÷É­¾y›nԄ£|x¾ýºDõ¬}Göw—G7ùSR;Í«ãþ„A D˜PáB† >„x0€@Š-^ĘQãFŽ=~R¤ÀLžD™RåJ–-]¾„åđ5mÞÄé‘&M‹8”èTªU­*•™UëV®Y¥^V#O©_Ş¥À,Z’H“¦…Wî\ˆkÙÞÅ;µdW¾}ý´›WðMŸCF|Õ¨[¥t?¦{8ñdÊXÿ^ÆìWreÎJ{zîZ¯[!ŸF]WôjÎ{3¿† ˜¤ZÚµmßƝ[÷nÞ½}ÿÎ}‘,kâ„I›N\¹ÁÍŝu[út“ÍŸ·&y];ÇÅH‘/Úþúvò £SGŸy|ùÁ׏|OXt÷·$Ã߇Ÿýþžéý«çï9µÄrÀâè+ .ü”K¿ù;ï? ·rðAÃ*ÏSA›ªÐBò"œ°DÙlª '³* Q>°2TŠ¶œÑ³Ûê‰ÆìdĐCû>R5‡ìˆD\)¾ÂtÂhŚ¾jQ¤(…K ´ìp¬òJ,NË-ÉêR1 ²Ì†¦$’8#‘d³º'©ä®I¡Þ„3/4³Ü2O<­¼rI- óòΞÆ\ÊLC%J3Ñ&ÛdT¥õ$ã‘K°°IÝ£1ŝRäÓ*AÃÔÓË=±ôóËÏòT)Beµ T­þlÍFM|´H<¡¼5L0³ÔUÔW;Í ·-ÕQXTo=µTOWmõÐ_aMLÖY'¬u#@C%5YmyEöX´¦¼¶NМìVϝ€±›-óYhۛvÖjgãñZ\Íõ5Ð?Ëu]:G8Ûq­U`Q©Bð;vì÷ݟš“6^ÿæMöFlÏ×b?{Ý÷®ïݘàrMå×ß ^wávXÅÍ"–=Š–N{çä¶ãñjñ^I‰5ìÒƒVöY”T™á–ÄV¸˜Û|¯¬Q1Þ6g« ƳX^zPu‘NÚC®»–ò`§ŸFRÉN9>õK¶CÖG–Ç&»­¯É {åºYþ+øl´i%,ÒӚÕJ×WR·ûVlo;™Í›Aº3à´þ>ròX¿¥œgÈ#ÇOóÎk¶| ̽_Ñë>oÐC»¶û;ÚÎ ÷4v?xá‡'¾øÝH·¬öÿVo™yÖyï]9çuËoåӛVÜO¶8Øêù†>úÔ²§yÓ¯Ÿ¸üª´ÖKÜõÕ _|ñÔW3yô©Óxý÷çøš_õÙûÀw·BÉ/9¢ÓµG–ûa~ÿYûlÆ%ÂŒ}2"–6µ=èÄπŽ™ÞË(·“Êìð™ÿW*ªí,WüÊڋ<øÁ¹„ð#äc‹{Jˆ¿–mjk˜›²°7ƒõÉd›! ãbCá`B§³r‡åé»ç-«Qíf43Û²¨Äñm.ˆ{z[—„¨¦*JçŠ#2› ¿—/’ŒWËO–D2:…‰?´ãÈµ´6oÜûJç½9⫎ ãZ~Õºö12fd YDò €Š†üÜm@#L‹¤+üB ÛÃ0ÃýœŒ$C|C!ƒÊB—Û°DçVdq:o£LD-sñÅáJqÇÔnı¿qŒ‘Á‹Ì,H$azŠG&óò1Iè Ì±º´R;)³|ë­&»êI-ç3L¿†¬òJ4“ÌçºóòMžÖd³(9çLJÓÔ!LòóO@tPB 5ôPDýsK¥àt§:íTRRÍÌsOL#¥T̏zôSš4ÝÔ©Qã³t LSµÔ ÔOþWeõ#EkµõV\s=OTSÝSÖYsõUX6X‹lSvYf›uöYh£•vZj—%ÒW#E¶ï-Nm·E ZrË5÷\t©½ÛÃ7°ÆˆýÖKw‘M÷^|ó՗ÙuÙ±Þwi}é¼y™xÖ}Vxáiûõ×ÁƒîÖӂ»Œ¸T†3ÖXc‡Æïb‰•¬ØâK• ³5™D‚GFä•c¦ å”Û•Y–]®æ›{¦³æ"yö¹*yzh¤·Úæ¤;,zÇ£›–ºã¥GœZçSŒúj©i®ºÁ­{Î9ëôÂæi¯¿¾Ïl™Ç&[ųãÖPmˆå–Îí·“cÛîX˜Ó¦»½WÆ;ïù6œ6¿ÿ¶úpÙ'ü´À8qÅs‹¼dÇwRrÎM¬Ü¾ËCÎ\ó»Bï|VÊ?·ñt÷H/›uصJ]õ²LŸÜuôlgYWÞ{÷ý÷E/þ‚ <ˆ0¡Â… :|ñ`+Z¼ˆ1£Æ;zü2¤H˜<‰2¥Ê•,[º| 3&ʉ#kÚ¼‰3ç@<{úüI#ÁˆD‹=1èÏ¥L›:(3ªÔ©T£*}Š5kÍ«Z»zýȕâP¤d˚uö«Úµ>KV} 7.Ì´lë:¥k7ï]cÏúýK¯ÞÁ„ÅÊ=ŒX®àŒA.n Ù1É“+öŒ9sÃǑ;cu›8´è¹žKƒ5Z2e–5»~sêÙ7A¾Û¤lڅwó†`5k±°‹»öý;ùFÛ¹›'F®œ-ôèyƒ¯nm<ûßéÔ©3w.þ÷îZǓÿj2víìŸïñ{øùRÍÃgjÿþÓô•‰·ÿoT~úy&}¾$à€:%¨`[­`„h5Ø`^¨ƒnµacü G’„"nÖ¡~bˆâ–è‹„}áˆ2´¢‹k˜â…5Ú¸Õ=èߌBîècy99S‘^©$_@†(äM*‡#’ó19åNY.ùä@QJ¹%mUZ –Sšæ@]^öe„h¦™Ó˜d6÷f‘uf cmJx'œ[͙cŸ6 ªdžPîɧŸ¨É èm„¾‡×£>ê%¢‰*Z£Š&)yÐÕé kZz)¦iºés¦¶˜V¨.RÊþ&©Ù¹ºêE¨¦z­T’$T­KÁ*+€ºúJ®û[P\!K!°Á¶Çl­·+±)uU´ :‹Ù§ÞJ4Ô§fÅZ–¶¦ZøéL鞴.Kí¦ôn®Óš»¨EØZÛ·~yËïXâð/Ro‡oo-yËî»ñÂ[àÂq9LZÁ½Ú+–ÄqŽ ØÀßLn€ l±^'¶‹°n8B ±Ž$õËrË.¿ sÌ2ÏLs͟NLï}úŽË¦¿áöµ1ñ+tÐgåìçÈn¥»®ÂN«øôÁ%«[RÓ¶ñ‹`ȧí& ` ŠiV;—ûñ¿÷kË=®Öv)m2Ôq›$J„¨› ɜ¦?Ñqn%Rܜ‰§¿¿µ°/ì¡é–=íá°bâûÕ'æ½æˆlTcm8F8 ñ:zzË7;´%ñqµ#ÊíÒT%2gotó›ËæEúÐoTŒ)8A ¢Q†?\­‡Ÿk½PŽo¬$õèFN¦Q{Ê#åøèþ(hð „ hØðàC† :„8±`D‰rL@ Ȑ"G’,iò$ʔ*W²léR`€2gҔépæ͚9mÆÜ9À!И8}òì)´!M 5—~|²)LP¥RéðäÔ§V£jX•«S¬bIfmZìT³T¡ªízÖkÕ¶(³ª @àîݧ÷òíë÷/`ˆa.lø°S¡K3nìøñc¤C!G.œöëWºR’-ùö3f͇Eà Úmh´¥år=Ý,lÌ+íâ% 70îܺu“Fìû7ðàV)/nœiPÉǓZÞôiò¹¦=o-ývï杩c߬:n×ïþÖÙÊå¼:sx–´ñÞÞíþ=|ŠÂçÓ¯oXñòüúuݏóåe±(ÛtÕjÝ GZri™ÝGå%¨ L:·g¬]avžÕf›Tñ‰8b`Úw"Šõáç‹-úg¢ç¥÷–uŠæÚuã-¨bŠ=¦´^^!’8$‘ Áè#’Iº´¢‹M: ّ©Õ˜cx4¦gà€æ±uåhÀ ¨$˜@‚S‘e–%˜iª)ՓmºÉš>¨k¡åYtZ•¡xSjçå†k&)f{f_œ‚*Ú#“o:Úd¢‹èc¤’Zúԇ…R”‘{qZâ¦#Vz)©ˆ5º\¾9j©3RÚ*þ¬êe*$BÁçéF€eôi§±úŠâ©Æ5¨ª›¬úz'£¿*ëamšJôì{¼â&-¢ËZë%‹Êý¤-±-{-°à‚K(­¡rú­”.´ç²”º¹ë®F¹Ê'.¾aK·Úú„ÀŠù;ð¶ÙæÛª…ÃJ.™µ®»Qƒ›Â«.ÅñÚ1¼»N\/PF*üq]Ù5ÔNý)w²REq‹*ȒFØò³6jÅÅ{³ÍíNtñÎáJ3Ï=ûl/C0=œÈ)ó4Ù¶;½4Ô#çG^ƒU[}5ÖYk½5×Xo÷íÑ^Ê<Ã4C[1½:×l$Ï@CܳE‡}ô¾Â*=lÁIEþrÊ+ëöÜcU¸ËcçñÚ?»6ÑÃÍxÜgK~/á ׍ªdx÷»·Ê9ù=uåôY xèƒ1L¶ÄÉ%þ8äj{¤¸Æ«ËîQé_ي™7ºyÞ½ë iíÁ}égð)žþvÙ93ìÍ/θг×Z|¾·;V²îGi~žoï"éÅo#õŒ¹Û#îºãýp걛-Xùãz›œÞØsϟþà×ߥŸÂ÷¿¹œomæzòÞźzY]ћòæG¹þÊz¸Ù¿˜„A‚ù‚¦#ž=H–ö…ZÔ:TµDx¬n±ðE*L ƒ^¨"òńCá­d¸°òe:Téà~ø›ãýņ8,R…h™2‘_J¼Ï‡HÃ#RÑ/IŒbbš¨Åëañƒ]¼Ï«(FŽ\ñ‹êÙ"™bÆI­Ñta#é×F%Y0ª*ãñ¨B"ƱÓ›#í(H=֏ä£iH@"Mh\¤ø  7&RŒ”ä@™ÆK֎“åCd%ãèI@ÖQ“meåP„x0€@Š-^ĘQãFŽ=~R¤ÀLžD™RåJ–-]¾„åđ5mÞęs`ž=}þTèP¢EEš´(¦L+ŒUêTªiêĚUëVœ%e~V¬Ì«\͞E[±éZ¶mݾ…Wî\ºuíÞ}ZUï^¾˦XpG¯c Füòï`ƍ7ޅYòdʕóöŜ™ïbǝ=c-œXôhÜ?Ÿ\YõjÖ­é^Ö[öCÓ¨mßΚônÞ.kãžÓõpâÅ%ޝ\yÁßÁÖÝ[úôæÏ­{4ž]ûö¦È—×\ýþúø´Ñ§Ÿ'-žüzöísB³z÷õkšGŸÿ0}ûýýۇO>«âï?1ÂO?Á*ð@D-À'´ B =JpA »°Co“BjðÃú2Ü0E•J4±EC qD%zñCUÄqkä±GŠbœqÆ} îÆS’H%m ²I—<ÐÈ#5LJ+ÒI «¼²3)§TË.Çt/K-“LÁ¾3¿4Մó93ϔïÍ8Ïb³Íóì¼³ÏÓæ¤<>ýÌ*O=¥”PE× TÈE­3ôPÞ}´R®mT9J-)RIÓã4Ôñ0Ít¶MEÅðÓ#OEµÕH-Í56V]ÍMÕg¥5׋`53\uýÑVVW^{í‹X`=v¿bŸ ìXd÷RÖØf‘„6[<§°Ú\™½V,oµµTZn©×UpÃe\wA;7¾t[]—]²ÞýQ)}÷å·_ûÕÈÜx£šÕz텩`î±6ö _<֏a-®Ñaˆ—ø҃)n©ãEnQ㍓#YяA^)e]öÐä“eƒ¹Ï•YN©æ(%Þ5à™MåùRœ©ãYg eþÙ× ·ºyh“Œþê9þ‚ <ˆ0¡Â… :|ñ`+Z¼ˆ1£Æ;zü2¤H˜<‰2¥Ê•,[º| 3&ʉ#kÚ¼‰3ç@<{úüI#ÁˆD‹=1èÏ¥L›:(3ªÔ©T£*}Š5kÍ«Z»zýȕâP¤d˚uö«Úµ>KV} 7.Ì´lë:¥Û3€Þ½tñjô»°Î¾g >+Ø®âÅÝÊ} nbƔCN¶Éõ2VÍ[ÿþ :iåѤ+:ŽŒ:õKÎ¥[“Ì–5Sٖ=‡¾[¢ë݊O«þ |mޔ‡{ŒýZïÎäÊM7_¾socé¯aÛ΍´qâÜ-ÿþ{{þw¶â %4}z±ì¡?W ¿úæëÙë#ÿ©oðü%çÿ_Þ_µ'_|ЙF`uWÑ €e_„H5ø€ý]…Þ_ϸ^{ÈÉG"z jE˜„*¥á†Ýí‡aŒs¹8ZZ-"è`8Žx {͝h݃+)FŽ£ŒJ®t㑠}˜`Sxb‰:îhó Id— 5é$iI.I¦I`†ÉÑD™ù ŽUöx¥ˆYZ9}^ÞYЙh26f™Kê¹çy=ž9¥›T†¨ði©Ÿxz h uõ駌‘Jª¨›æ螦Ôuú©‰jÒ¹TŠây)¦_QZ)†©bzþ¨¤¯çè©CΪ*l­îŠëž ’Jc¯æqi+¤¹Âºk« zÈl³Î> m´ÒNKmµ| (l­™Z,‘Ù[j²•~«*”àöVk·’{.O¬Šû»°¶[\ºêÖ'/½7½ /pùʪ/ºÄÞ«â¿‹Äo¿ª(à ÛKpn|œÂ.桦FÈc›pF9l½Glßħi±’Âþ:¯»‚rê1̕qK2¾'»˜pʐõÚ±¯y͙fG~1LsÍؙ|óƒ:ÇÈsÈ&.§¦¹¥‰Ç²XŸ2:r‹þ(݂FÝdÑFã†tҍ-íªÀ/ûˆÈS4‰@¢‚ ÖýÞ¦Bö]²Ù¢Ý_¶¡Æi·ÛoçT÷ …+Î8Þ@SY*Ä|V¶ßbøÌy—ÈhåÆ%îÜÜQföc¦X÷ȓ‡V¹åPaÞ¿Z² 9qÁNèœ[­{§§‹¸ä«›Õºå9ÃN•ì„C­ñnۍªqï´?nºœ¨¯úð‡ï÷ñÈKÕô€¾[üÌ.W]8?ýõ8‰­}aܛíý÷2­7ÝrsDZøm3¯¨ÎÍÎPwÓ[câw›ù%­~ö›Qo®5:­í7 ŠM×÷4õH0kÐ㝧 ˜%²Îuãa`]¢Àù)°„ÂaQVx2ž%e«Ý‹H(%Œþ‚ <ˆ0¡Â… :|ñ`+Z¼ˆ1£Æ;zü2¤H˜<‰2¥Ê•,[º| 3&ʉ#kÚ$ ç͝7iòü 4¨PŸ F<Š4©ÒˆD…:} 5ªÅ’2«Z½ŠUfS©\»òÜê5¬Ø`I.=‹6-IJcÛº}J5«Ü¹t_²}‹·ëݼ|¥²5ª6°`´{û><µ®âÅu #~Ò1äɑ5Œ9³Cɔ;{Ë8´h»sš>:µêÕ¬[»~ ;vkŒ:=Û¶ùW³îÝ9ßþôèáÄøŽwëÄã5Uý;97ï隙#¿.Rxñ틭c۔¦þ÷ÊSõF·L=ýàñßÛgÔÎ=¾\öî¡õIß#Øü–Ï¿W`ZüÕç|òXՀþ„_E öWIáWÛ@內Ó}Z¸¡_èbR.ˆœžè҈$6'¡ƒàц“‹-†gai¥5Øâ„cIb©¸¢m&¢HdJ@ Òr~¶d9Îh£“4: åŽúˆåBG"]‘^¦È%_>éWj2’)^”8ªY•Lþ—eœ½…I'm_ީҖu¾Çç›}¢iãšS:ç¦ypʉ¨ž{Š‰g£&)º¨~/B¨„‚¶Y¤Q҆h§šFÚ֐Žø)¨ru×}mr¸é ˜†zþe§Y–jêg£âIk­g¢ºÑ”nªÚê¥dÊ©¬qæªkT¢ÞʲÉBšjQc{£’ÕîêgQÆ›,’Ë2[œ³ºŠÛí°¥m;k¹+~ îpäšún·<¢b¼êöÔn‘ö.ºo­óÒ`¿÷f—/‘Óyp¤ÿ¬^ÂëW0Š{ûð[ 3LÝÄ[ñ‰¯»1¬‡bÜpÈß±Û±b“¸2—“¼[Ë&“”2©3+{s¶SÁ  Ì3£\ó\>˜3±ÚòœÞÐ!tVJŸ\4¯##sÔ·1ÝôUOc·u}/S½žÕBf½]×%Šm_¬`W‡vgX“­UÛ_ÉFwÝvߍwÞ¨©D½6ffßû6Ü0ý-÷͗õíwá.8˜Š?îÙሠFx¹Œ7ÎRå?,ùäjiþ,梁¾¹º{NXé}].º‘ª¿ž@þPÐàA„ .dØÐáCˆ¤XÑâEŒ5näØÑãG!E 0ÀäI”)U®dÙÒåK˜1QNYÓæMœ9uîäÙÓgG‚…%Z4"͟I•.MZRæS¨Q¥ÊDÊÔêU¬YµnåÔèW°aVåZÖlO§SÕ®eû’ìY¸qåÎÅêUì]¼_ßÒåÛw`[ÀÛîõ[Øða¾vó.fܐ0bÈWÓ ¦\Ùmd̙5/UÜØóçǛEãœlÙôé¡G¯f½ºógØyU·¦½±4j܁g×æÝ{îëØÁÁîöÝûvnäj‰gޜ)páч.wî:ùu¶Ô«oç^3ÀwðáÅ!'_ÞüyôéՏïî|ý{øñåÇo_ßþ}üùõïçߟi@;PKõ:fÓÐ"Ë"PKÛ°-AOEBPS/img/con_cm2.gif51ÊÎGIF89aŸ#³­cccœœœÎÎÎÞÞÞïïï÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,Ÿ#þðH#g=´f«ïÆ^؍\ ’§ù­¢Ú¦0‹ÊîüÒñ­Û|íç=àGÜ Âd1¸<2‘M%tú¬:¯RkÅ¡`_°iLþ„ÍåËYf£Ñbø›§ÏÝøük­×ûdjwƒ€m…ˆ‰~„{b‚r†|ŠŒ”v’—‡™†‘•˜~cfœ§Ÿ{¦©¡^«­¬¥°³H`¨´¶¸¢I¹º¯£“¼ÀÁŒÄ·²žËA½ÌÇɘѱӕŒÙÚÛÜÝÞßàáâãßçèéêëìíîïíÒ»—Ôϓõŀøóú×¾ôþìTõ¯A¿CPa5e6„haÀ/fĈ@cGŽþC‚¹±äG“"Q’<Ér€90cʜI³¦Í›8ipUP×>†ñ úhÄ£ù"ºt¡¼Ÿò„J µ§RŠF›*À±«×¯`ÊK¶¬X‹væ\˶-Ν©&Ä*÷ªÔ¬S­jµ‹·ªÞ¼í}Jô!à¥} ÿ¥ÆÕ¬ãǐ#‡uYA­Û˘sÂݛô™ßÀtÿƚX°áÏL9“&lz±bУñÆvw«äÛ¸s¥,ÁræßÀ lö,z êÔ³O¿FžvóÎÇiû\Žuuꥏg¯¨»»÷ǼøN¾íðç̍‡vݶõí±á®Ý:úëõñkg½Ÿ¾„Æßþ(`WáWށ7'Ê|ìõ7]~ò!_ü­çvƗ!ƒÄA¸¡„„8àˆÞˆà‰oñ”_]+G‹¦÷¢r-6£~7NˆØ‡ú—£4"zÀ$v‡Vo(&©;ҝ“7ÂxŸŽ«ù¨¡•Žò“U>è`‡_®$C ¡) šdÞf¾ÀLrÂ4'pwçeçY—%ŽWzù#– Ú£ ‚9(¢ރ¡¡M2Zh%A²Ùæc–˜©d&ÆT§LŸ’·ço :Z£s~B9%—w±*¢‰jù¨¤‡ÂÚ¨z±.8«"nŠQ™j¢Yæ¯Ã 쥿¶iæ±dþKì²Ínz¤x ê驵ØÊ©­µŸj{§·ÙnËm¨1õ9£‡ªn i—¶NÚn­²¢Kk¤ïÒo˜ºÊ[/»ô –¥Â²lšÈ*ÛUÀa œ,ÀÍL qbË­kÓ·×î9g¨£–Škª.žjŸºóò›/¾¦¢ü±»÷.ºo«ëÂ\²Ìøûà #+ìÁïœp² óœ3GRD\áhxðe1Œ>ãƒwÇ=¾#FÑHH½ÄI‚â£9␎Ž´# ç¸ÈHŽ-3 $íBTÈNžåˆ<!)ÅÆ ¤Ô£+ùCõ‰q•V¤",ىAzK %yYJVÒR•š”]&)ËÛõ0•Ãœ0Oé"[ޒ…¹Ô%pFÉÈ8ºòŠ~|d5‰Ä^¶rŠÛ¬ã%‘ g>³HäH§:× °óðŒ§<çIÏzÚóžø̧>÷ÉÏ~úóŸ'ÌyÎ¥ä"AèFz…~„¡]¨Dþ:є°Ä¢]IFUÂыjô£ݨGC ґšT¤(-iJIÊғªô¥-]©Kc әÚT¦8­iNiÊӛêô§-¥ A JÔ¢õ¨HMªR—ÊÔ¦:õ©AËP¡JÕªZõªXͪV·ÊÕ£ µ«e¡X‹j€±šõ¬hM«Z—úÕµr¤ní$\ãJ׺Úõ®x­Û@ëJ€¼©¯~ ¬`KX¤¶5®€-lw«ØÆ:ö±ê^éÊØÈ>¦²–ͬf7ë×ú³œ hCKÚҚ«ž]ëh“¥j+2«=­lgKۂ Õ#,Éíà¶Ýv·Àý­p{\Œôµ¸|#îpKþÒZæ*··É5‰o¡‹‘æ ¹Ó- `‹+]îf÷»Þ ïrÁ;^ñ>·»åMïyÉ»^ó¢·½ê}¯|Ù;_÷Ò÷¾öÍo|ñ»_ýÂ÷¿õM¯Ts‹^3u$Sþ 0€+Ýên» n0 L`àZ×Áý/…í›XÜF˜¿ N0ˆ?,âg8Ä'&qŠGÌb£øÅ*†q‹WìâOo²&°8@ÞöøXğ±¢õÜÿ­Mrs½…á c8ºLv²œ¼²a)O¹º¯Åò••<å%gٷǯg,ã“yÌfN3×\f6£ÙÍgŽ³šÛLçúJ•¡ ](‘ºçæ¡i·æ_ Ýþ°‹šÐyþH˜óÜZຏ®nB“ü‘F'yÒÆô”!ÚhæFZÊ¥´C-íèëR4Ñ Æ³ªK²êŠ²z$­I¬aýjÎÚÕ¨vh«O½k]ך׿öu®g`ûÖÆ.¶°•Ml• {Ùήµ¬¥MëfãšÙ϶ö´­ìhsÚ¶~õ›,Be›)¡ç4±Ö½¬!§aV“E·Ëj¾]äv²©;-jIã;Ó*I®©+=ð{üÁ7ø§¹½hmSÛ§_©Äa:q–V|¦ßhÆAºqŽv|¤?(ÅGnq’cÜäG9ÇUŽ’ÛRÔ׆þóCû¬n@Ç»Ð{®¹Ÿ?Ògþ…j$Ì>¸B#}ß×ú„íï ýÓûfúË-MðNÃ\Ñ/vгîô¬sýë];Ø%*ö²½ëgO»ÙѾvµ»=¢mûØßNw³×ýîlÇ»Þá¾wº÷ÝçãÞz×{Ž°˜ãœÐ9G¼ÌuÞs‰.ÚçVw0BóMu¢÷;ÓDŸ¼×ƒÞï¤g¾#M¸å…NöÐ›ï¨wuD7ŸçÕ_]ë¥w}ëUOû¯Ãþö¯Ï=îg¿{Ù ž÷º÷}ìk|âÏ^ø½7þï‘_|Ø7ÿùÀ?¾ò]ír„†Ð öã½ý!żûÚoÖö±ï}îè%zG’Nðõ[þé“´Õ/uõþ{þé¡&½¨~ô—wý×Çu>7€åth}˜€¸€ë'€ ؀ ((8Hxȁh؁ (‚H‚8‚'X‚h‚؂Ȃ+˜‚þ‡‚.Hƒ(ƒ5¸€5ó=(pSAˆ}Dè}ÞW„Úhe„I(~ÖW©…ðhG&'ÖG… ·XH…Þ²Vxöv…XxoÚ2…g˜iI†d¨ƒx\j°~Rø„Vèƒ:(‡u†>(‡{8‡vȇyˆ€è†}¨‡x‡~hˆ„øƒOXˆˆ(ˆ‰ÈˆxˆŽX‰‘8ˆ“¸ˆšH‰œ¨‰™ˆ‡þŠ–¸‰£ø‰Š˜‰hŠ€7P(…v‰ŠØŠ²H‡³ØŠ|tyŠƒhˆ»8€°¨€RH…aø‹ˆ‡Æ¨P肶xŠÌ¨Š˜ÈŒ²¸‹ÇÏsH‡Ò˜ŠÔhÜXÞèŠÛ‰âHŠŒØ—xŽß8Ž¥È‹á(ŠÚ‹³¸Žæ˜ŽîØ/<qXŽñxtЋµ¨‹Wü˜üŠý8Œ¯H‹t°†ÿ¸y=(úX‹Y‘y‘ ‘±héÓH‘’"9’$Y’¹‘&™’*¹’,‰×ȑ-i’q[ًy‘þx’ɇeÅþx“Žˆ‘éˆZ¨‘ž8ŽqØþ“ “ÜؔN‰ŠP‰ 铒ø’Ð8ŒKY•W9Ùè’ûø•Õؔay”i”Qِ`©•bIŒiy•d9f‰’hٕ\©“x™—z¹—|ٗ~ù—€˜‚9˜„Y˜†y˜ˆé4™˜ŒÙ˜Žù˜™’9™”Y™–ɘwy™š¹™œÙ™žù™ š¢9˜‹9š¦yš¨™šª¹š¬Ùšyg®›²9›´Y›¶y›&)T]@\À›[𛻩ÁٛÂé›Ã œÆ™œÅ¹œÄٜÈɜÏéœÇ9Ê)ÕØIÐIhÞùàžâ9žäYžæyžè™žê¹žìٞîùžðŸòþ9ŸôYŸöyŸæ™ZµµŸüٟþéŸúùŸ: Z ƒ š  º  zUÚ ¡:¡Iô z¡š¡:“µ¡ú¡ :¡¢$Z¢&jZ#z¢*º¢,z Ú¢0£2ZW)*H„T7*9ê;ÊBAVU=ŠAzD$2¤qe¤3šU–p@7ƒ£@cHú3·Ñ£7:¥g2:݁¥Zº9ÿ"¥?Š)Y¥Oz0ÿ³¥UzF‘±)\š¤T5nßA7L…¥mú9žT§e§TZ¥_ºBªaê§ð6©—ÚcDV©¬J¦r#7—Ú«¦Š< ¦jÓn²ª0”:¬®ª¨oŠS¥£… 4ÌC¨+Ä<Á*=9s­ c­‘Š<ÀªÇ£?9 oúã6“ªl¥ÚŠ®çú­Ûú®Àj­œ¬oc©ZJ¯8s¯÷š<£ª<:þ*¯ôú9ðZ®#:­ ­Z§B‚°Ñ3ª]:¯´¯Û­eê3W ¨Ú:± °“9ÿê¥Ñs°?ð‹«dº°ÔZ¦-;²'ë®K±®â ®*û?¼Š±ø*³Ûê°VŨƒ*þ±<³<椳Š¬"Û³à*dÐs«Ýº«›²M[®4k¯N˯ dX{°¾’?Ìú¬ak¦^;7>&²I›?檵J»²\Û¥íê³ÞÚ¯g+´*­qj´ù*±;ë§t²^ª±s‹±rê²Ôª±@Ë63Ë6ë·_K@e+¹[±k¸HË©”K²9k±„¹Ë·Ž‹µõŠ·O±h¸%+³Jû¶}û­u °Ÿ::«Ë°­ ² +¶ÜJ»:£¹K»qµlû´:[±¿‹¯Á›®È;®¼;»¼®Z¸k»É ¸¦kTD;t3¶lª«ë¤jú,éúc’*¾%+µÞ{´n‹³Ä;¬œþ«µ½›´1›6D©¢Jd³K¿Š{«ªÊ­Ç*¿Óû½7 ¨GkªÊª©Sû±Ò{¿’ ¾N[º×‹½z›Ttª)6Á–µÀ‚ŠÁ¥…ºGUÁk²¦Y,¦#ÜÁ/jTC¾©kÂ'ÜX%¬½üû–µ¤4|Ã8ŒÃٛÃ<ÜÃ,ºÃ>ÄBì¡@<ÄF|ÄZÄH¼ÄL, JÜÄPŧõÄR\ÅVYT|ÅZ¼Å•Å\üÅ`¼V^Æd\Æ[5ÆfœÆjìTh¼ÆnüÆDÕÆp<Çt\¡)\ÇxœÇ^uÇzÜÇ~\Hrüǂ<È»ÁDŽ|ȈÌ)†œÈŒÜÈZ3Žɒ <ɖLÆþ•|ɚ¼Å™¼Éž,ŝüÉ¢¼Ä¡<ʦ,Ä¥|ʪœÃ©¼Ê®|­üʲ|½±<˶ ­µ|˺,£¹¼Ë¾¼¢½üËÂL¢Á<ÌƼ¡Å|ÌÊL¡É¼ÌÎÜ ÍüÌÒl Ñ<ÍÖüŸÕ|ÍÚ\[Ù¼Íތ¢‹üÍâ¢Ý<ÎæŒÅá|ÎêÌÌ|ŒáÎÆuï,ÏÏõLÏ÷œXö¼ÏøÌÏúÜÏýÏ=ÏϝϝÐMЭнÐýÐíÏMÑmÑÝЭÑ}ÐýÑ ÒÒ$íÑ%]Ñ'½Ñ&½Ò(ÍÒ*ÝÒ0ýÒ2ÝÑ1MÓ3-Ò5ÓM4wœàÓ$þÔ% Ô'ðÓ#`Ô)€ÔJÔCÝÔ°ÔN ÕIÕG]ÕTýÔL=ÕZ]ÔV­ÕRýÕNÍÕX}ÕbíÕ] Ö[MÔj}Öd½Öc]ÖhÔpÖn-×uÕh=×iÝÖl½×fÍ×~×w Øv ØE½ü[‹à   ’` ŒíؒÝ‹½½ ‘ý؎mٓ ŽÐٟ¢Ùž­Ù— Ú¥ ڜ½Ù™­Ú®}Ú°Ú”ÝÚ´]Ù£Ú±Û¶Û«]Û¨DÿñÒ09ƍ ÇÍ Ém ʍÜÎÝÜÐÍÜÒ Ï=Ý¿PÝ?pÝÑMÝÛ­ÝÖm ØíÝÜýÝ}°Üã}ÞbPȐþìßDJräMïßÖäÞóN¾$!µßõ}ßôÝßö­ß¡Þcò'!$ßþÍßÿmà ¾ß¾àd% Žàá®à~ þb“+^á Þá þá"~àãd5Nâ!Žâ#îà#á^AK¾â.ã'Îâ3®â8L_“â6^ã7Þã<܆´ÞŠANãAîãJžäLŽä|”!Kîä9þãT.E.Þï}äSå[Þä].å@^Eäåaþåf^æP¨Dw,BFNæUîæ\Žæo欤LÆçs~æyîàWήårŽç‚ç„Nçnçln腮烇jNä ÑG/ÓèþŒ¾èné{žéÄ4I”~éŠ.å}ŽI蚎é^êŸ^éOá¦Þê©îé{êëÇé1þGÈ·ÞÞ¨~Ixê¶ÐëäÓë®~àðÅ®*cþ°ìÃ~ì„ãì°벞*Mºã…pë¦pëØÎ8nìގÀŽá^žÀÂ㮽ìî¹N„QÂî4¾ìôÎìÐ8÷®LùŽÎ~ïrì°s#õŽ+Ð.ý>þ^Ì~ ¯ì´n8²®Aڞî3“ێ(.ìå¾[ÿ½ñ‚Ññ !ò#PîÛþîÉdà`/J%ðòúNÛ+Óò4O9 ¿þßðôè1ìÓ>#Ø~„C¨„뾄ä§}FèôHîQÏôO¿ôÑ^ëîñ@ȄH¯„[ïçÎõ]¯ôîP/öBöjïõdŸ„a¯õB÷NöOõl_÷wŸôîòpïôžõ~ìïò ?ð~Oø.Ïò øø‰Oóÿ÷ øùPì‰ÿùΚOø”oø”ù£ÿ÷þ^ø=¿ø ¯ù?úŒ¯ø¡Ïú±_ørñ<”ëOŸöð~ö[„UτÀüÏöQM+’õȯ¼÷°ñ ?÷c òÚ®üpoÐ/î»ÿõÕÿõ&/÷Û_÷ȟõà÷ çÄþí Ïò‹?¿òªêð~ïþ†ŸùŒoùëÏ÷ÎÿòïùîÂyì1Âf:§Ô6M¨®oº,­NͽnUOuë¼x|.Z!!¬ƒ9¦JTªù31¥ju€T«ÏeÔ)LáÙB‹7f$ۀV—Õlø¥~Žs»Þ¯´Ï‡ œ+;+´#\C<<ŒCk삜Èk|L±d3TLätütÂÄ}+¤äÌóÜcåúX*™ÙyŠéá0 ¡Å}åp™­åíÁxQò©MšÑ락%Öåñ5ŽÕ1Æƽ–ͦPöÑYuUjU Ô¢˜ÈR„/·«|LKÃ3cû¬ŸßþߧÓïß*V™™“GŽPLöÐ\R4IÓ©…«Rm’c/b=•6ÍÑñÓ Œ3-U±Á„ñÐ}«ABæµh3+È´A¬‰¸m,Âá*ö#‘'¯nÂúuã WCm&gÄÎq/ž‚CµÚL¨>ªýzÁ±åÔ!¸bÀ––羸¹³çMÜI”ÊWïE…cɖE'ª¡—SCb]ºéƧÒ,̊'t1ðž.ā8 5ªApz‡†l"4ŠWLñkp«¯ó¦P'­é¨pF‡ìºìò±«$¸îp¼Íó¬97‘h‹ÒÇy+I±'£)#G®\ɤ{HZ$| ÊÄJÑr3ëÖ,ç5lpb'«à¤€†:*®z˜êΛ”Ë…NÜÂOnv‚ÓB?UœmO˜ð¼óiFyۋÞîèK—>Ìæ'ǼöÔ#Ÿ{ߏïúé¹ }Ï?}ûê%ÿ½ûíYW§}òÅç]~Ǔ2|IøÅ^i?ë½O€ïÊü&E)³©dŸ°Š †Ot׳à÷€ç>ûííy†Û_ùGÀü~ª çžÀ²zτ¹ÓàýðÓmhK%XAêý…‡þ Þ h>ّ0|´£[dØÁ2‘yÈÓD&€””ø$TŒ×ð´ØB†pˆ3 Š7ôd©£Ø`N‰JÔÅ6A²q‡dcÓÁ&¸qŽoŒ#—Ežp„Ü *’H î†|ü¢=S˜ý”‚2™a̪¸ø½Æ2D[M˜’  ¥†I™ȾàF €”ˆã*ˆJ&¤r,%~˜È"bRˆçS$.?X?C–l–ôå ›¥þÇ>þI ñÀ¸ÅIör™~úÓ3n0 ×#J»,µ™RÆқ(è¦)cùC:‘–ÙC$.yÄ& ’ @4g ÓiK/Šéˆþ"Y$¾°‰”d¦ƒ™±p†\Ä© ¸²@ –r›²§,ç¨ÃWF”•]eD‰ˆÎv‘£¿tæv©Äžs}¹¤gÁþÅû(B3<à›éÏg†ti „‰o†³š‚æh•?Õ¨8ɹ­l–Fí¨MSZR!Rfé*Ù;œšÔ’ºª…é|òÉíè‹Êk@7z҉u P;uŸBä¡Oµ±¨=%R£×£Â՛n¥i<—zU2õîԚRýzH¬šÔr+ÅAÍó%)y▅ìLÿ9Ø?,åDTˍœŠ‘(s œE5åƒZ>!œGõ¬h= Zª“²}þëìPÚÀÂS°µ*lsÛ¹kõv¯5¥iX½(Ïê pzÃ&ÀŽÛe%¤¹KR¤a¥;Û¾ 0#ÝÂmuKÜØ~µ©î³u'\±Z·ªþ:àW6¯Šµ÷±…nH§*ÛuóïkÍËW VR²Ào€¼]>z´°Éý²ä»=½žw¸µœ'vq¤Ýü’už†0y#«áÿ ÷ÂÆ­x+Là?êלøeð:ïû^þ6XÀ.ìa×X€'Æq}a<âšø·ÒõïŒ$X9Ä:þqŠ;\^ϘÉ;²ˆw<å“Äü 2 Vü`#[Y¦]Þm–Üä1?yÃ^Fóþn© f%·X 6ې×ìfýª9Ɉ$sžÍ¼d$—øÈUæñœmËæKú9c[¦° ½Ûç?¶Ìg~4Ÿ%åZъô1¬$9'Úӛî.wé;i'CZϐ®t£Cýi:Ôi.¢]ÝjX3Z·Áó©Ii£™Å_¦u¦_}iÙEY5/gík ÛùÕbÞs¯u-íò¦úÖRf5³³½h8;aȃ6± îk×SƼ.õ®Élmnxۘ÷•kmÀ"€÷®Â½ o|SAßþî·½þo€ï»àü6¸ÀNp…#Üá‡xÃ#ÎpŠÜâ ¿øÅ.qŽWã߸ÇþC®ñ‰“¼ã&yÉA®ò‘¯üä.×7Êeó™·Üæ,ÇùËo®óœ§œç?÷yÐkÞó¡½è>·B²Ï²t¦7ÝéO‡zÔ¥>uªWÝêWÇzÖµ¾u®wÝë_{ØÅ>v²—ÝìgG»Ô£“µ´·Ýío‡{Üå>wº×ÝîwÇ{ÞõŽ¥ïÝï|à?xÂÞð‡OûÚ¿xÆ7Þñ‡|ä%¿xÅOÞò—Ç|æ5¿yξò}èE?zҗ~ôŸ7}êU¿zÖ·ÞõfGýëe?{Ú×Þö§ïûíu¿{Þ÷Þ÷wýï…?|âßøOþñ•¿|æ7ŸõÉw~ô¥?}ê3úÕÇ~öµþ¿}·_ßïaà~ø/ÉËDðä;úS¯~²{_ëà¯ü±.Û€éö¿á¥B~ö·½ÿZ×´›‰« @©S¿ÿ«‚¤P@@¬û?;!;ú£¿éKƒ¥³¿øË¿ÃS@ d<L¿¿B °:d:õ3Á¥ë?hA€Á¸+@ô:ô:÷Ë: ì@‡ ðƒ?üC€ B ”¿ Ô¼T%ÂÔ?-à?”AókÀ\@*ŒÂ+<@-D¿(DÀœ‰ÜÂ)t@öã¿)lÀ\@4$à Ã6\C,4¿.¤BLôA0$Ã8”Â3¬C›¨B+ÌB8´Ã5,Dþ›ø+=”B¬ÓÁìÁGŒ?ûóÁ#BITB#„ÄJ =&ôÀNtÂñƒÂä?´A+\@4Á(LÅTFV”Á:yE`„Â\„Å|FCc´Ã[ÜF¼ºFœ¿L,ÅgÜÇi]F¦£P ºú\º íº]äÐw˜ºµK_$@…:m:­:è”ÐuѪóFÛkH ¼<}ÑÅѬÃÁٛѩ{CË»‚¨ÊÑ!%ÒéSQ§;RÃcÑ"eÒ&uRàS—'•Ò)¥RàÃÌ*ÅRכ£,}¾(åÒ/­»ôQ1åºh:3ÓÕ R¶KÓ6=;2­8%;4uÓÒ[Ò:ÅS«3S:ÝS*˜(?E2ýÓþ³èÓ- Ô-Ô<Í<UÔFõº>THT>Õ:ÓC½Ô@ÔLuÔÉ[ÓNÕ2ÔQ½TK5UBÕÔLEÓS ÕÈ»ÓVmÕUMUIÕTS(K%ÕM•UN…ÕÆcÔ^Ö3åTZ%Ö§+ÖY­Ô`õU `SeuVJÍÕZMV^Ö]eUhMUgÕ»WÕV<ÅU]5T\MÔd½Ö85ÔlÅÖn…ÒÂQ×v Qw•½O…×y¥×ÝãÖzÅ×|Ò+Õ×~õ×Í»×؁ý»€%؃Eع3؄e؆…=~u؈•X¸[؉µØ‹ºŠÅ؍åXdҎِýFˆْ5Y-ÐؓUY‚Mþ>¡[9—Ý9˜%:š£Ù˜=ºŒ«Ù™µÙœ5:ž•ÙžÝÙ ÕÙ¡U¸›õY£Z %ڟeZ¤]Z§UÚ¨mÚ£u¹¤ûØ c.¢Z‚åb–àZ¢úÚ¬Û­Å°-[±=®°MÛ³íZ´eÛ·Û¶•[¸U[¸%[¯åƒ¹[³åÛ»u[¼í[½]ÛÀÕZÁÍ[Â\¿\Å¥ÛÃýÛÇÕ[ÆÝ[Èm\Ä­ÛÄ]ÜÈ5\°ý6¿a˜Ša/Ðý\Ñý\‰)]† ]ÓEÝÕ=ݳñ\Öu—âJ]ØuÝÙu]Ù]Õ­ÝÜ¥]w±ÝÞ-.ÜmÝØ%]àm¯âÝÝáá5Þß]^äõ]Þ½]èU.zþ«fm—ižíÕÞî…îý^ï}ð_ñí,óU°ðUßò]ßo9ßöM_ö•ß÷ßø¥ßûµßüÝøÝ_‚µî¶p{·^¶Ö¶`Û/r3àŽ·vàs,×Zµn`&`¦àf«6.Ãà~à á±øßQ›`¶à Faá:Ûà þ`>avŽ~³êŠáNa–á¾áuã`â^á`á³á!b$bVbQ ³&fâ(æá­¡áa³4)Þá,Nb,Þâq{b.^â)ã¶(bQk³.Öâ0Nc(c/Ž.6^ã1–ã] >(“`4Æc5Îc8Þãb{ãþ9Žã6äçðXèA1@ÓãDæcEä‡bڃevf—b)”‰f4ù‹»8Hæ>€P”kÞ°tv¶hç@ès@h³ÚqF°$ɑO¢$šèBòåüˆ¹"8ðèü8dI®g%øh))þ“ùàˆ,"“Æ꟔~ÆJæŠÀÆâS,²g&o°“s‚ =Ù,F9G©ek £Wà¤P²2‘BA#‰”E9£ Ð ¥¾j ê¡vj¡®åp‚¥¦”h”4²jgXéèèè숶5FNHê»& ¾àŽD(Œ‰x$íi©ôxŒg}ZçeÃfµ*‚¦…oΓ:äXh‹¶,1jêIk )ŠŸflc ¦¦‚ªðZ¢°&ÛÈցžHm[ȉQ#à(‘#Èì\›€Î ¸&Œ·‘Ž6XÖªcBæöX¬– –•@&TŒýÀ cZ©¾æk¯þB·ürQçœÒÑÆni íJén­pf`¨œJ(ž(ïœà†2zd0+îÎ, ‘&p”³²ŠrïhÈh2.d"f€°"ÞƋÙé]#¶º0á§(ÊkÅà‡Žðk¯¢û€éõøè—:Œg§¹fò֓mþLÑl… ë— [ Ðèæ£î§@qï0ÚGylß,ͪ&Í>ïê äÈq'0Ü®ž!l§ C0A3Œ»f’—…ÅH!ƒa)ϧšnîý€$è˜Á†/lKú¥úÖîjs¬à2oӆèJy1艹þfÊŽ97®òkM9ïþ¨q4×);÷‰8ÿ¨µN"k ém•ÞgW*ÈPi·v©Ç'·þpr+|®t —nø@ò‘^0çs‘oô¾ñ0 ñǶ a¨>_ÌV‘µZ²õí5ç”V l>ύi‚oȾï ò  ’ìèŸgV`O~­bÎC?iýf/ᒭÒöÁÐëjéißög÷r/àðEá±q Q÷°®q¬ÖƒZêÏ®,΂…yßj?Iá”IAè›0¤öê Ùõò™ì¤VŽuç,&#ô!ò­·™¶Ãæ«þ]ž‡wߊO0‹·_~¦rŸnPwß°Šþ[Ç­¬nù•rð­ç‚øôbyPmۂv/­-›l¶mBFYÌÄ´ð2µß–ç™ñy{Á5Ðq¬UöãŸÇ$ä=±à¡}a/ð:£?«ò)ÝÕÝÏ)³Îè¤W7 y# 'þmŽg’R~±ŽgÜéf"û¯g ƒ‹mþ.µ£Jîd°×{TCûn·ƒvü ¿bjSúO?·ùʜǵ·™†·ãÃ7üÿŠ|x.7¸·üˆÿ{Nü½G|FçŸtû|Y9ömÓüÓïúÑ·fyCý¹öaÕ§4ɗx`{}òúÕ È×`ÙÿøŽýÌwüÉÏ+̟e¢¨º'þâïüO®|ÜþŸœÒçáÖOþ¼çûgóüáþlú¡ÔB§Ïâ¦Þç}gëòê7añ?Ý/`éÏ~η{ó{ð~ɧ¨ã¯¯%˜¥ë}F~ì/û @rŽcƜæp¾»†àוžxŽf*®l“®ú¢2<㷞ó¿MUҊ= pg[•Í#0è4B-Ã•sͺ\,׫ۂÃÝrVZ}ú¢l7µœ®ãpè\¾Ë·™{ûA†ÄÀ†àޟb]ãcߛŸ#Òb"$b%c$ ¤g§_æ™ÖiÈV–Á*ª‰ªÇêFš&'åè$¦Úífï/¯­pp®è“ áa†±å°³o1(®.°5ôþ316vôåõguø÷ô—9H©iGÚG:ª¬:±78õî›hw=ð¼¼67¿d. Åï ¶qôÄ雖𡽆#2¬ˆ ߛs§Z•¢åå ‰ŽïÔÑÂP¡CŠäòY$7ÑeÃ~Bö2›´›)ªä¹âJ”2a¶Üitè­UJ]mDÇã„;YµØö/¦Ð“¡°nÍYõêC˜M0øU§Ö¢`{Eë/ëYµpå¾u‘æ©œ²)<¼lç²]kõ׸^¥~As™MÅD'ã,LØg[ɇSÞv9³IGTÕ}Œ§E̋¨$K[YçºrPΘYbþŒôvڋ $+ÁþìâÎné·,QscÚ°“ÛþŒ‘J‰è=òœ¨a %âⳳז½|øv}#ÿùsí £¯[Ôüúð¡wõ‰b›òüž½3ïÚ]=|¹q"A‡ä`{ì)(ß` .ˆ›zý½GIz›è_l:7á…Á‡Ëx‘yáˆðIøà‰?•¨¡ƒ ºœŠÂ±¨›{(nØ`‡2Ž8 äÁø¡ŽAÆ7dŠF!˜#/y †$*YáD6Wc†8 yÛ! rä•\JÉߔóu f‹_ÎXe’ûqÈ”fZi$™+Êك–D饓i.¦eò™æŸnv–'–7²yæ“TZø&¡'õ(â˜þsú՞qö)©šŒêT)¢™NziŒh '£EâÉGe1‰é©”ÊéƒxšŠ¬‰Êj§Ü‰Z+©ÿÅêg n ,®Åîú*²Çû¢‰É"¹ê•³*ê쯥ú©©þ-¶Ý6j©­ zh³àŽÚ¦¬×.:*¯mzÚ븻eФñ.ûíŽÔ†ë«·ÒF«ïè–鯨ܹ-j‹ÀÄFúð¾ìª[îšz8á…þsØ(¾8ã;þ8ä‘K>9å•[~9æ™k¾9ç{þ9衋>:饛~:ê©«¾:늰ì!Ä>»ìµÓ~»í¹ã¾»î½óþ»ïÁ?¼ðżñÉ#¿¼òÍ3ÿ¼óÑC?½ôÕS½õÙc¿½öÝSïøá‹?>ùå›>úé«¿>ûí»ÿ>üñË??ýõÛ?þùë¿?ÿý»/ªsp€, @@ |Á!Ø@ >0‚œà+ˆÁ j°ƒü A˜Ar„ ! G˜Â®ð„*|! aèÂҁ;PKäœËÆ:151PKÛ°-AOEBPS/img/atn_jaas2.gif"BݽGIF89aˆæ÷€€€€€€€€€€€€ÿÿÎÿÿÿ€€€€€€€€€€€€ÿ××ÿÿÿÒÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëëÿÿÿÿ)ÿÿRÿÿzÿÿ£ÿÿÌ"31J@`Ow^Žn¤}»ŒÒ›èªÿµÿ"ÁÿDÌÿf×ÿˆãÿªîÿÌ3M"f+€3™<³DÌMæUÿhÿ|ÿ:ÿW£ÿu¶ÿ’Êÿ¯ÝÿÌ3PmŠ¨Åâÿÿ3ÿ3MÿMfÿf€ÿ€™ÿ™³ÿ³ÌÿÌ3Mf"€+™3³<ÌDæMÿUÿh:ÿ|Wÿuÿ£’ÿ¶¯ÿÊÌÿÝ3"J1`@wOŽ^¤n»}Ҍè›ÿª"ÿµDÿÁfÿ̈ÿתÿãÌÿî33MMff€€™™³³ÌÌææÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿÿ3(P7mEŠT¨bÅqâ€ÿŒÿ3™ÿM¦ÿf³ÿ€¿ÿ™Ìÿ³ÙÿÌæÿ3Uw™»Ýÿÿ--ÿDDÿ[[ÿqqÿˆˆÿŸŸÿµµÿÌÌÿ3&M3f@€M™Y³fÌsæ€ÿŽÿ:ÿ«WÿºuÿȒÿׯÿæÌÿ33MMff€€™™³³ÌÌææÿÿÿÿÿ:ÿÿWÿÿuÿÿ’ÿÿ¯ÿÿÌÿ3M&f3€@™M³YÌfæsÿ€ÿŽÿ:ÿW«ÿuºÿ’Èÿ¯×ÿÌæ!ù,ˆæþH° Áƒ*\È°¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cʜI³¦Í›8sêÜ鲀ϟ>y J´¨Ñ£H“-€©Ò§P£JJµ*ΠMZÝʵ«×¯`£jU86¬Ù³hÓª];ÑéτeÙʝK·®]£nÆÕ{·¯ß¿€‡Ì[ð-_Áˆ+^ŒØ­a­c÷2žL¹²e¨ùJ–|¹³çÏ [fÈtsèÓ¨S«æ8ú@éäW˞M»6AÈX]çŽm»·ïߔ97N¼¸ñºÂ &?μ¹s¥Ëo?ŸN½:^‡Ñ­kß^“ðCïdyþS4ý±ltóÉws_Ͼ»xì³/$ïQ¾tåYÛëßò±Þ·¥áæXP’–€8`\¨Ûk¼v±áªgàmöñçá‡ßi&¢nŽèډ'f¦b‰,¢(„+º¡‹÷¥¨Y^3æH£r‚øP@)äDiä‘H&©ä’L6éä“P© ŽÞX ‹3þ— -¢P(Ž¦!‡_ʘ"˜æ=åšl¶éæ˜Ïuè£P1rYç‹aî#•°ÝWežï¥‡çŠiÖ¨šœ½!:§NŽ… £‰|riç£uF6b£„m¹ã bõZ¥›ž¦hm£.zŒŸêøà ¨âv¦£MrØ(‰Òª`Ÿ«vú*¬Zn¸Z©³k*¥ 뙱‡«lC£"ۙ³¨A»ì´ÖIšµÔfÛ¶Ÿq«í·Àyû,¸äš*îe疫njÂþt@à@‚ D˜PáB† >„x @DŠ-^ĘQãFŽ=~RäH’% N4™ReI”+]¾„SæLš5mÞlØçΘ:yþTèP¢Ewú4šô"R¥M>…UªJ¦S­J¼šUëV®]‰VõªlX²e͞E{plڟkÙ¾…WnÛ¹CÝÖśWï^ŒwùRýXð`Âýyñbƍ¡*v¬rdʕ-˜|9bf͝=î $gÑ¥MŸÆŠZ²jÖ­]§VX@ölÚµmßƝ[÷nÞ½}ÿ\øp⣛5ž\ùræ͝?‡}ùf†\Ǟ]ûvîݽ^þüxò㭗GŸ^ýzõ¤h_þ|úõíßǟ_ÿ~þýýÿ0@$°@÷ƒÌ­óØc°ADoA'¤B÷Š‚ï@ 7ä°C?1DãK°º OD1Åð$T±E³»ð«g¤±FoÄÑÃbñEL¯G ‡|°ŽÀ« sd²I'Ÿ„RC#‘L’G‰Ä2Kî„Ô²Kó¨T2J1Ç$³Ì&§D²º+½dH.ۄS;4«äjI3ïÄ3O=ý›“΄Œ3PßÎ9ÃÜ3QE½³O5y,4Ò •´ËC»²“QM7åtDG­„´RQ×£tT"/­³SUWeµÀOc[ÆÓTYWœÕP01m5W]w­ïÕ?c­5X9…õÕ­2å5Yeõ!@‰…öºR£EÑX­]6[mËlV-`©uZp)´6+l·E7Ý»5èÙqk÷Ý"oMU]{ﵑݓ¾•·Òxûe°Ü«ÎÅ·`ƒ]¥ÒOgù¸ÐnÞc¦¸bõ5Œaˆã|xãò¶Š`ûj#“dùd»e‹WF0áGc ’6ϓ-àïj›¹»š‹õ8E§™¾ÛÄšÄsUf9é‘]!€þ(@  Áƒ XÈp¡A‡ &œ8bņ-"ÔH±£ÇAŠI²¤É“¨ °¥Ë—0cʜI³¦Í rêܹsaOŸ<ƒ J´(М ‹"Å©´©Ó§P£JJµªUªVª¼y³¤F†9¢ŒHñ«Ø„gǎ•¨¶­Û·'³®´I·®Ý»1™6=ºô§Þ>ëå›T§à |3%|Øp⫐#KžL¹2Q¹skè:R,[ˆfْm–ôFÑdS—&.IÔ®cË~‹™%ÞÛ¸s ük´0↎“|©ïà¼û/®ø¸åçУK·\Û6Í͚_Ã>ú³éˆYþ­wŒäËÏ.»¾½{“µu˟¯jøŸŽçWN\ÿÐûû&à`ÉMgà&˜VÖ̈́ÝuÚyÔ]iä­V¡jæ×Dåe´]{¾'âˆñÑgâ‰I…ròÔXsÅ=ö›o@1¶œs æ¨ãŽUUÇUv…˜Ú†¦™E¡„ßMxaxBÊÖäˆP:©ŠTÊW S®¨˜‹8§%c2¶¸e€òhæ™h å£fœ‰”Ö‘Dv(š’àm'ç‘p†¥B{öù^‰Uzו¿q©œ¡øõW(rc’yè˜2¦)é¤:®y]› y¶$‡vÎÉiz❖'wŸú–©¨Æ¨ ¬Ö‡¥—þþ՘ÜqbFÚ\püɺ˜¬”öêët–:ˆi¦ž–ºá¨›–塱ǂ‡'‰©FëÖª­V ¡32#3rI#¶Lî·­—¶þjî¹*2ø#„Úé‰lÞ‘ºZ§èáÉ$¨Oª*í¾(Qkí¿)Ú§­Œ«¸ÿi f£·¢ëðÃéNÉ&^iXª…ڛV½Ï‚ÕZŸùò+rXl2¶§¬òÊ+ӃŽ,3´3׌VÉ&ÿ‹2Ë<÷ì3VêNÌ®ÍDÃrѦú›3«;ÿìôÓP#ô¥#mu\W׬ôҁ6õ×`Cìr^Ãfm¶„g¼5×TzöÛpO:öµe§m÷Cwï»6Ûþ'º÷߀+8÷K0¿œ÷áx#ŽêÞ|ÓçwàGNÝÔÂV­xÚG_îã[)ùç ·LùËuknuæ¦O‹sçm‡îúë” îRáy¥Ž¹íQrÎ:nÃîûï ®N¶å¸zñq ¿»ãÀ7ïüe£?4òZ»K½”™-bïÏw¸ì-Ñ~íõD[O¾ÑÊk¯÷Þ·6ø»•N,“ÇŸOêxö·¥»úu±ïþÿOƒß@ä'¡éå¯bo: WÒÇ¿Ûø€ä™ÅG¸¸PI ÝÄÀ*‚ „Ü/ˆ–þm°]'TËþ–œšíeӌQ«†=vpå¼JG'ä<µõnޟ3Ü[klâEY 7\\¹ÐÙJmß.ò.rêÕ±þ¾[Ú:È×˽Ç<¾ýþôwò3›Ë}}ºÜèâÝ¿çˆ=¢vø»—ÿ¾Àþý˜ûûWè?†ø /*Š¤ê>ü¼;ϲôԋh®ýp«¯B !Ò,¸ -[pAýꏿ†B\ê?å*p¸ñk°6ö Lh§ Û°Æ÷ä#-.'RpEÅöƒéCÿ‘@"DËH"‹qÉ! ”HI%óò±¼™zÆ»ø³+Å¿ô G Ál¨JØtIÈ#dSF¨L Ä81{rÎ5å—]§¯æš§œi;ØÛ¡#SúÕoǖ­OôþD:Co™\ùé®ÛäZT•­ÆÛߋ§þ¶8b¹íÎ点 »P´ çÃTÛA¶ÛæªlËþ¦ü×¾!~·ß¼A…ó¬{åk­×ù/əZ±Ó=;õ Š~øhÈÝ>MôÐ-?×󮫆8ðÛ£þ÷©½&lÀv}µÄUj=ù›`VöÙ#oÖä’ç¦öiO¯fÙÍ£4·f¬ÁãíÏÐàãÅv¾¬ÕÉl¾}š g GÈß_~òÍ+üÚ5äå7NþB?‚§q.’Þôh$@Ã|¯FýÛÙÿ È:f‚Æ9 –§ÀõTЃ£KáÖg¸ Rðƒ,)!s2˜ª rp3'„á‹ç?ö¥Ð(1ԓ ²Âdµƒøû¡« h: êp~A,•mB¿MˆH„ß #XC%šŠ¨«âYxH/*ð‰WÜÑ»EÂ,ÊdRgDcÕ©2Îo‹ë¢Á8GºH‘ˆTl£­˜Çü¼ÑhyqáéHG1î:|×y,?ƐlÏ çXÈr‘¦Rä%cÃÄ8ÎäŸÇhIMV)“¥$Z#£÷HHê”W¤¤aŠˆJÑҔª¬_+;øJ$ÆZwÓ mYËavˆ“þȁ4xaB… tøbD‰)V´xcF9vô(‘à‚”ðñaÈ*A¢ÄX AL™3iÖ´ygN;yöôùÓ&L C‰5z©L’&OZdI1¤H©S>uykV­[¹rŒÊ©ËVS’آФkÙ¶u«Sí[¹sé]jò¢Ù´TùNՋp`Áƒ¹~Ux·©Ç¿)WŽ[rdÉ O¶|y-âÄPóöõ|˜phÑ£I;õV±À±*ɶvŒv좕e׶]SsÞΟy,ýxp´†"þؐ%ò–ŒÓ¾ý\¶sèÓ/çvº»÷çŹw÷žò4ÞþŽ®‘?µºýªtêëëªgÿþ­õŠè‰g÷û~üõ«¢öÚx,՘°9ø „̽œ©Í&¢Ï>í[-@ý,¼0#þ 2n¼´<Ë!ó^[ÄÌJ<)ù83-¾ÐK«µ1œÑ; Gòo#?ÔñCÀDH܂Ò'Ä®Åû2\LFüÍF8ü¯Ç y1°‰ RË-4r¹ù’äKÆ›|M¢œ2GÕ(<«ÂôñK Çò’¦.ñ,ÌÆXS*35:3ÍB»ZÇA©ìq8ͺ³&C%}hϜúôðO@z F½bôÎE±•SB'Í0¼’ŽStÎFIŒþ¤HO•´Rœ.m$MÕmÀG1%U@åڔ“XEM5ÓÃe•S\ {õ%š5´Ö›n-*]E¢oE?ÈÊPã\-ÄpC%–\pÇUŽµp…-¶ÝäÜUW^Öè-÷ؗRupØë~¥SÁ2¥6ÍjƒjW1µÍß0u-X8íMKvÝ|“âŒÝŸjž çC;s…Ìfì›"ûÐ÷9iqiJß ÒE²L„ã+“ÉXH¯˜q4Hœ£ÕDCêǏ$4š7Ø$Ø=2yN£ýh„2UA i”Ù0™ŸHq‡¬«dŽ<¥ÈBùj‹,Đ'ùW®qltd)½sÊOf2­3•'šêÕ™{^é¶ç-Ó±íB´Î-cµ ˜Us—¼äŽ/kù¯õðn Tœõ,gGÜÝîšï3¿#MPŠíU­”•6ç°ò쑛Ýx#â*Aˆ®Ë™GDzÜ"ðþ%Cjғ—ñ©×MZOgâì]ù¢*9+ ¶ŠzûÞ·j¸†~ô#sYND–Ìyq­Ž÷¬×‘ÖµÒö•”T„fG·(Q`î³¢â  —xÑõ=´¤i!mÃӌÑO{#hY 8Psþ° ×XbSRT˜ý©þL»8‚N†¢S'J‡ZÖÖ&¨õªbí7ÕbŽª½¢Aa*U+~Ȫ©¤dN'%T•}ð­/ì×ûÚä×Òu©œ¬k ÇéD˜’*£H],P—ÙG z±"þ9p ‚"L¨paBŒ(q"Ŋ^̨ÑbÍ?‚|ØcĆ&?Ž$)0eƓ!_¬Ø`&͚6oâÌ©“d—GúÊÓeÇ {®ªÒhÒ¦KŸdéô§Ã¢ubͪu+׬€{QjɅfϚ%s-Û¶nßÂ-y)U“@éFµJµêJº=ñ"%êw/ߦ«¶ 8ñá¾j»BæÚwè]½Pó4 XdTĔ§ z*f•Ž-ÿü[ 2ëÖ®m~ `ìX´¶o««{7ïÞm¥ =™˜opʇ‹'-*œ¸Zä„í:5Zš)Ä×Ögúö:ûÆܯƒŸþ3vXÚo£OË}=ûöìɪ®[8>ËÍóϯڧ\Í K_†_fûI$^kîU´‚yw‘†GžXՖž…5¸ †rXgÉ=÷T}™å¢‰ò}x”‡$zèQ'N!dÒȝŒ7¶&álžw¡Ö¤º!‡t{¸œi‚‰8™t)×ä‰E¾bD8n5¤–naÙåV:š— ?n)$e†ÔXg˹¦c†-éd€H6•œy•RU*'š@^h« Z¨¡âÉ£˜cZx&š¾9ú¨¤“ùС—"Š©¦›j•h‚2Š^¤”Â5*©§¢ª¥œ²Ú¡­Âþº©§P‚ªm¦¦®¹òÚk±‹Ó«Á è¬ ÖjëY»úªj³ÏBû]±Å;­µ«bÊ¢Ål´Š~nwÚ&Ÿi»]lµé²k]¶ý-Êí²âÆå-½½ÂÇÙvö:Øn«ëú°«²íøé¶ò2tï[ü*¬Q›jB\g€VE™o‰0¢+°¬s<°laB‰ð¼ ³Å0ÉQ|ñ“HŠ¨^)¦Ö˜ÉuŒ)À5ã<Ó»eHÈ Ÿ¬kАÞçWhû²<åŠ+Vy®n9z3Ôï 3ƒ?=tšZóæ¢ÕÅ5MÅJ;×ԂJ}¶ÀU/}Ö Í|oÜ\{F§”zúÉÔËLþ_–ÚÆþ 5Ûvºý6Bs‹‹8Ý VYŠG£6Ï2ëk®ÙË¸_O˜snÖ&ÖÙmŸ–+j=[>»F S$5ì¯×dóëÃUùMÜ@l ë2Ÿ“ñËI¶Ï&n3¶m·MÛYQMWOÔSÁ+.üiç³=fÛÍÃ=wÞÿ4|ÐSWÝuÕƚ›øžMÚ l™žãÚ{gÊNéa‹¾zìeþýôÀ…ÇùgÁ×6âåMZ@ÀGú={ég_÷ÝߗŸ¯íÏÏûïÅ÷Y‚‘ŽÝÓçuézó#` x@õԏmÝçøç B'}÷ÒýúÇ%Ú!Pƒä`ë¢@Š¯|à#¸òýo|¡)d<øBÆ°w-„ ðP7B®DЄ',^ +¸@ôþð>”ahD>ņ ÄáJÈÃmùï‡!\!h’øš#fQ‹[ô w–&æð‰Pd¡±eA 1B\dcexEüpO4adރúuåQ{äcýø¯Š©Ðy„ž yHÂ9hœØÎì’dd¡ ƒHHþQ“›äd'=ùIP†R”£Ü—ÅR>áIòaá;¡*)‰Êæ]’…†£e-myK\F(—»äe {ùË%Îё’,]IFX22n˜üe3ùLèASš¿›¦-ƒIA:îo‘l%%­hIÂ1³šã$'/YÎfª C”#6èÍJ¡DŽb2ÎY®ÓSŸû ?שNJ¦`¦Yö¤EÑ›çóPˆFôœ¥e (Ger•©3¡Â¨AýÑӘ M£8/zÒjN¥²èJ¯IÐl4¡ÒrXHª)’FѤ+å)0{ L`¹t žq$:갏‚|"meN—ùПF՜Rí¥JÉùR¢Ô-ûã[MÅÇT:µŒ;¥jYûiV\ZuœXm¤VG·(5k•Èk ÅjE5¢U¯‚Ú«5£ÊVPõ¨ÕRèMOy×I’µ¯‹Íc©ùSÀj þ PÐàA„ ., ÐáCˆ% l8QbE‹5n܈‘ãG!E~$¸°`)Œd Ñcˌ̤YÓæMœ9uîäÙÓçO AqÊZÔèQžD‘.í‰RåJ˜Kš¤Zõà˨AbÍÚõ!W¯aÅ^¬ê4åX’h]2eÛÖíÛ¢JáÎu+—.S³g»NµÚ—¡Z°.Վ <ØpK¾ ó¶Xxï]ȑ%û´;ÙòÎʗ慚5±_Ð';vÌ8­iԈË>M-øpfͱe…=ûrmÛ79{ýÚoiÄ` o=‘xñ⽯²F>1îÜÑ¥7€>}nué»÷úæNà8ËááÃþ7GLÞ[BҔbëÏ؆Ín.._oL^0O7LPy²ÄåÚ$æF•2SKCe»èIBÆ·†™‹Œ'ø¬çMw’Òo¢(¯×ÍKšsy¨ÃO×9P˽‘Ù<è+ŸM¶Ê@¢c£÷ÇðUÏTœc$()ª-ŽÆ ¥Y\ž0?H>uüh6*O„^4•øœ¦l&T'þГÓÑdôØÉQ}ni<)æRº(§f±žCCgR󩙟.>BU(ü S"b+|0*Ã憏ñjv¾º¤£³ƒ7<ëgh›µÂ§­Ñ)ªCþrà@ D˜PáÂ>„QâDŠ-^ĘQãFŽ=J$¸°`%|D90åÅ \¾„SæLš5mÞĉ³eNž=}þT¨ÌCê4Yr¥À">=ØpéTªU­^ű)äY-JõZôèX²=ŖE›V-Ù³k’ìºt+Tº Ázś÷n^¾ç&„«´/ĽWÛºE<ôpbƍ×.vœ3°à•ë^&Pxðf”š9ùt2h•x!GFM4õjœ}u²ö9ù¤\̵ z&›"nݟ-Gë[/lâ1Oìúæqä dOýmÛ)ïÞÕK[×}dpÎÔ+7/Îþ«öÌÜ7Ç÷;öyýi1îuOª×ú#*=èØà ?ùSpAªè ´9âÀ±*´ð¨ÿ<p¹ azŽ6ëšÐÁ°LôM4ûîÃÆ0t1(¦  ¬†n¬qFiˆÇ] q½é*E̼OE“àk1FÄ`tÒ§ëntG¦T²qÊÒ~ü0Ȕèr$$«+r̍ \±¯2ÿ‹òIðh„3N9礳N;g¬2Ï,q„óº+{´“F'½ì,L¨Ö4óËDõR’²îšl3-(%%ÜÓOM;Œ”&Bý2T´E™u¾FÕ{Ô´N՚­VÒþ²F+±ŒUOVõÔ@Ce¨Tá|5ìTRÃÂÕÕ7+´J*g•uGY(¶À4;3LDÕèZl-VBH£UìXØ8Ü\u’W»¶U“Ý»ý•Xsß—5j9š×¥O9T·WwMûwW®–ôVÕ|…z•-dó:x_jû]7àªê”˜ßé¦ÕëۃͪwµòÌu˜Bˆ«xâ9Kùb‚ãoã ¾Ðe™ÏÅø̑Òe@yÔ9[xS•wfž`>Šh¡õ Ùæ›oëY®8›Î͕nùhÉ:¶zÞ¤}^ZL¨¿äùë¯~¾Oã¬UkÎè³Ñ«™ë®sÖ¹O±ÇVÙѲ ^ÛS¬óßÆu먻öznr¯Hj»YěoãöV¼ÝÄחqÒE÷ËÈ× ›p‰[ߍlă>Ý9Ókï2õB/n×åóÎpTï¦ýtµƽÓÇYZݯߡ¦Nøa«&Îð’w\wPyüù¦y“¾àâŸózì£\žî·ïõþkÜÂg«ã—ÓüócL¿ðæÏlnÏ৚ü’'äÌï~’ÒžÅ֗­þ N3$õŒ§ |÷¢Ö@†¦n۝'h@ŽY0wm»@þ(@  Áƒ*\X@ Ã‡FØÐaʼn3jœX ãō CBlø1dIŠ#7ž”ò$Á… ˜ @¤M“7slÀ³§ÏŸ@ƒ J´¨Q£*]ê³Ó§P£JJ•©Lš5uF| ³«×ƒ+1†ýVë͋e͊$©öaG‹iY¦l¹ÕëՙmÍÆÍ봪߿Pû<¸°áțbÍÊ÷«c»k3’¥ø–rE¶ÑV&éîe‹–=‹–‹6´Ä˘·V˜:3e¸¦YŸºlI® ±æÕº·­à¢™ƒ N¼¸ñãȓ+_μùðÄУO½‹w7îÇØ ö–»Õ-éï›iÓþf;eéóâÍ«/ú³ìÛéߒŸÝ:þüÔ(9Ž´«{wÎíz) hàI§à‚H-æßuÙa·mÞÉf™| åçš{œuæڅ¯Á&yèåǞ‰÷±W_Š%Ò÷áHÎÅ(cqº%`8樣o öècOÔ1æ[„D0¡dj8xñ­—á““%Y“(rG%}#bé$‹Vêç4í(æV7Žiæ™cþöãšÐù`‘)–w-¦¸†,qY!ž*Bégiï-I"~å}V"žÚݗ]Q‡fše>*é¤Ö±ii›ZgvrŠÕYlŸ*ŠZ¡†cž«}Zåhdaö¡ª‰þRÉaªƒºÚ¢Y¥5ª9Ԁ¼Ë«¯—[•›šnú€À ë¬JϺ¤«ÏVzT³Õf›#±ÆvX¦)ë³Ú–»–ªÂJÛhæªÅ-Pض+/ÞÖ+²áŠ Ydóö+ïJ"䨿ÿEzn\£ò"]žõâ·Åû®½ …ïúîË/Á; ð´Û4qS§µ¶·šoˆ)»+qÅ0_ .ÆÃìÊ!çì®X 묒Á-qÆrp¬Áê†Ö&Ò òÉN7-ŸÐN×fµX1gýëÌîÖÜè>‡-æX=‹ÍÐ*Q 5Ô¶ÛBÃýÚÛ [8µˆwç-wÛþ¬5Åwí5C:µlöázÙV6â¡Ý·Ú{¿Í4ߔ{¹Ý—[ž0æ|ßÝöäXÿ-:Oë58á 3®:Ø}/®ºß¤‹,çl{Ž÷å·ê=w䭞:tç¸GÜ÷裗ÎÛé ­Œóê:ï0Xì®{ÌjF{žg<ð×ï^÷ÓÖcÎ{÷’/ºñ…#ŸΆ3Ï|ûû­¦ûÓWûќG¿öšÑ­?Ûuk˜þŠ6´£ðlæÓúþ£>YgFŒ 'HÁåˆÌuŒ«Ÿûè—@rÍt Ôέ3³`q,aSœJg& aLT¸3¶ä„‡K¡ Å61“¹SÑþœ —·A"¢‡fÓ¡j†³Ãl½Ëy?D /(C#5QdWT yè¸.=)‹”z¢I¢h˜)®¥ŠVcßÔ(™-†M‰_ôÅ-¥uizdЏWE#¾nŽq£ÏàèE\RAÑÓHò3š~Dá!ë"¿]Ih{Ú$ÍD,÷ŒÇFŒô‹#oØÇMšÈ”dó0¹$C¢A”š'wJªŒR‹¥Üd$_§Êœ)>Hz%Ž|%ªï4®–ÓÙcúr9É]f°—!û%ŒÚçLa&è'ÅT-‘•[¶Ž™€¬æ+I­^+I®<¥5 DÌ?ÍRMÎú‘7ÛN6Šsœ6 X¢9‘‚ÎVös|I$«¸MžÄÓGóäY=ÁxO|æf~ï30½ØPTÆò,?9hÈ>V𣠩HG*#hvLšÓœSÚHÊRqÒb" ´6ӈÈS™6þȁ4xaB… 6tøbD‰ N´xcF ð@`H‘#I–4yeJ•´tùòe‘2U†¤y²À͚;yöô™ÓgP,a¶Ô™’èK¡K†,újT© :~¹tæF­[¹vUXÑkX±c TõˆmZ¤S]mŠå[µsé¥k2iQ¹#óº8¦LÁ€íú·pÎÀC ³uüبիiÁ’µ|Ùke̛934;ùnh¡}£ºÝ¹÷¯hÕsQ«%Ýv%TÀ‡í¦mñ⛃w „ü[êgÐX5w6~ü+rå?¯v~úqÓևñ>·Îôùë¶rsFMwoþÓ½ Û.|xz½’Y/w¼ø{ù[›_·Ï7zÉÖ{§ß÷ÿ]5íbRŒÀ©¾³ ¼Ûf:AnRÂȬjo¾ NJÏ 'ªï?û„‰»·Îã«ÃáZíÃgKEyӍ±}‹P=á(ÔG0̑ǯ&4ѺaÉÀIêÀšD$1.ý(sNHõr£NFÃÀKŒ7Ƥ1=]ë̈v 3LD1¿ºxB©Ýösòɹ”Í&…š8/)#“Ïäúü³ 3Ï-JªîbS:,¯T,ÆFÑÅÔý MR‰¥ìT^<7hetV¼g™%®Ò\¹í6¸oy%7ÇqùuÏÜs‰Kw´ÅNSÕ¼,„qᄫìéXèºew4eMÂ7ßa÷ý×B9V.`G#xV*W"PK›œ]˜ºIY…5°uWª·VŠƒbãÒô%îã_{Wc‘y%ù4Óº:ZíUY°Új“TQË)g¨våùg€³æ1d¤×$ºÍ¤]“Ök“‹Å·ÝUÃ3xU©É›±jwfjkëî7è²þÛfUõFJ´Un7^-_69R§â–;}òÈ%ŸœòÊ-¿óÌ5϶ñ¿•äûÈé"ö|æÀ'f’íÄÓv;m\okî´$›öÚm¿÷Üuߝw„ëøà…žøàI¿ôÁ>^MӗnJÕ–W§×cŠ­âµßž{àïüðÅžyˆ“Ç´ôòéÍNð”W|ÔÁ¨|Ûuë¯Vküüõ÷~ÿþýï_}ÓU\F·¢Në:…ν¬Gìaåüß÷$XA êqLˆÆ–Apo§+U%ôž°u(Tá §ºl†šëÃ@û=p…ayx®Îdԇƒ ¢×h¾î~=ÔÛ•ØÄýЀ” ‹H˜X1O8t"±˜¸E/&0M]<ÙXˆÅ™2Iü"×ØF"FgŠÌC™«hÆ:6Pn’õØǡ銏c$£ ïhÅB"Q‹~ô"9F]ŠE¢#óDÉ &²‘PÊä&ýó¡î@’Š’ìá!ñhIouŽ“šLå*¢¼RˆN$¥ýL9•÷öiÒ³¹Sm×9öþÖÒQ›OøpáëÌkßN¼xpøñéן_ÿ$çäËG³/7ºÔØ£®5þäo5ÖrëŽÁý–“ Àé0À«Ãm½òþkίéð³ïÃ?¼oDýäÓ6Ÿx ÓÇ}}Ïd§ßñŒ†<¥rùވ|·'à팴ңþó«ú¹}+[žð(§=YµnPÆ«Êýö'ۙë"ÄOø 3¾ítèn‚C\Ó§@ÃEÐt˛U®æç«:°|óËýòæŸë}ð_!ˆš·ê †IŒÙ èúÆ1f ÓWÀR-ñaÄRâyÆ ë©ë‰PLYѦHE%YñYTãâÕD6BEhQYÍ(4ñy„q4BÖX äSHGuÇò‘XqãÃH&^ëZ!íXÄßa1‘™œÊ"ÙØÈ¢ ';9•¬ì–´jŒ’ö2¤×f¢IWފ&¯4 ÔàœFÉ€ Ìà SÉO–Å„²æ0ÑõËÈÀ%w¶ÙìÒK_®’˜Ñ”f´Œ °©ÏPÌ4ˆ3;Íi~œ^lÙ-_纆›—©&X‚9€þ8`Aƒ&T¸aC‡!F”8‘bE‹1f,X AGA†9’dɒ ¤X`%K—YHSæK„&qæÔ¹“gOŸ}Z@Ñ¢‘&Uº”iS§O¡FeThU«ib´º•kW«T½†íHÔ(©gѦU»–m[¥`ÅÆýqfV­rñæýª·+Y£n<˜páˆpùzœ˜q㑈ëô{Ôpe˗1gÎ9rÐŝAóåúqY³šQ§V½Úðhҍ]¿–Ý9öì“O³Ö½›woµmËœxÜá¯qûV¾œys˜Å#‡>½ªôÐɝg׾ݲuêA½þ3|tÓÜѧW¶üøœíÝÇ÷Ÿ1öõ÷ñç¯H_¾HþýÅûO/ûô+ÐÀ À±lP²øDP ÓSpA ´ CãΣÐÝÛP>3$D¯"QÅS;q<KŒÂY¬ÑÆîbÜ+Ço›±¬ 20¿#’Ç}üKÈ%™”ÊÈéžéűÝr!þè€À <ˆ0¡Â… :|1¢Ä‰+Z¼ˆ1cÁ :zü2dÈKš<ɐ£È•,[ºüHÒb́3ÖD¨ò¥ÎŽøô‰2¨Ð¡D‹=Š4)Ν:o*}j4'Ó©SF´š2%՗=€ 6¬Ø±dË"•º$V³l¢M wdÊ1g’¼[W ]»tì]ø6.O¯_Û>Œ8±â á®]¬¸±`ǀiúµÜ÷ò]̜OI²èѤK–¼õ±i³¨?WkYïeÙxÿÞTí×5ÌЫ{ûþ \¦îª÷fވ[or¿5'Ø÷9sœÊ…¼Y!‡Í¢Z'Ñ·âpc”RNY’.)˜á{AYâ„ÆqÙ¥…©™'Ÿ^I¦ÅdeYÉU‹TÎIgÐ9Y#r7žÉ¥™cކæŸa†é'¹fj‘(§Ž>ú"œ,)¨§¡–Ih‘ò•é–˜ &M‰RÕæYŒziªª(©ˆyR¸þ§—|F(f¨$nHd–ºÉg¨jŽšà¢,¢ºj±Æ®ÖªH¥^”æyÀ›X²"6zlµÖ¶%­’O5;^¶xF{ªx׎KîXÞz´ì¸çº–nQë¢Km¹òÎ+Ô»íZûîd÷•/qñÒ pÀÖ±+ðwÏra /ÌpÃ÷ûdÁO|Õ·2~9QûfÔïÁ'1Å"|½IõÚÞÆí}ÌrˤþKrÌ›|օgΨ®7«\ŸË>ÿ ±2-1Í[ª" ú(#ÐN;2ÑRltTkÙ©Ÿ_r‹RÇO§ÐSMnÕîzcց‚Éõ’`¿íqÔdÏ]­ÙDiœöÍHƒlÚ4Ü~ƒ 3݂Ûi7¿h×ZfÒWïjêߎ‡+àà’CZ¸È^?·Ü“o>gå_Ž9ؚsNzŒžO zèO^zëž^´ê²;¸ë¶{Á©Ïî3ë·ÿþ[î3óNüN¾|i¼{ñï@þ$XÐàA„ .dØÐáCˆ%N¤XÑâEŒ hÐÑãG!CÐXÒäI†E®dÙÒåK˜1eΤù±œ8QîäÙÓçO A…E¨²¦H’D•5zÔéS¨Q¥‚¼™ÀR¬YµnåÚUhÓ¨I½Ž­vêY´iÏVÍIÖí[¸qåò4ûTì\¼ëªåÛ×ïJ¶:ó&\Ø0×½GøïcÈk­^e\ÙòeÌÓ\œqdС%[õ\ÚôiÛgvF­Tµhر©Nn]Ûöm¬¯c²ÆýS·là¡Sî]Üøñ²h ,gÞÜùsèÑ¥O§^Ýúuì̓oçÞq8rðáÅÕüÝÝüyôéÓ~ßÞ}ñòêåϧ_ß;í÷ùõ›ŽoßÿAco? L-@TP8ü tðÁÆ”pB ¡B 3̪¿ ;ôÀ 5qDŸ8üðDÑ ‘D[ÄÈÄc”¶]´ñF‡²ÓqG{ôñG ƒrH"‹l®A“T’¡ÉštòI(£”rJ*«´òJ,³ÔrK.»ôòKâ–śÀ4óL4ÓTsM6ÛT“L8ÇtsN:ë´óN<ٌsÏ$óôóO@ôM> 5ôPDUtQFÅ* ;PKuÍ^'B"BPKÛ°-AOEBPS/img_text/atn_sim.htmêü Description of the illustration atn_sim.gif

Illustrates the Principal Validation Process. A user attempts to log into a system using a username/password combination. WebLogic Server establishes trust by calling the configured Authentication provider's LoginModule, which validates the user's username and password and returns a subject that is populated with principals per Java Authentication and Authorization Service (JAAS) requirements.

PKb˜2µPKÛ°-AOEBPS/img_text/rsc_hier.htmsŒý Description of the illustration rsc_hier.gif

The architecture of WebLogic resources. The Resource interface, located in the weblogic.security.spi package, provides the definition for an object that represents a WebLogic resource, which can be protected from unauthorized access.

PK'& žxsPKÛ°-AOEBPS/img_text/cm_fwk.htm:Åý Description of the illustration cm_fwk.gif

This graphic illustrates how Credential Mapping providers interact with the WebLogic Security Framework during the credential mapping process. An explanation follows in the text.

PK”B'?:PKÛ°-AOEBPS/img_text/cm_all2.htm9Æý Description of the illustration cm_all2.gif

Shows MyCredentialMapperProviderImpl. The class that implements the SSPI ending in "Provider" acts as a factory for generating the runtime class that implements the other SSPI.

PK?MÆç>9PKÛ°-AOEBPS/img_text/r_mig.htm]¢ý Description of the illustration r_mig.gif

The Migration Tab for a security realm. The Migration tab at the security realm level allows administrators to export or import security data for all the security providers configured in the security realm at once.

PK/ôØ#b]PKÛ°-AOEBPS/img_text/atn_jaas2.htmýþ Description of the illustration atn_jaas2.gif

This graphic shows how JAAS classes work with the WebLogic Security Framework. An explanation follows in the text.

PK*QªÊýPKÛ°-AOEBPS/img_text/atz_dra.htm öý Description of the illustration atz_dra.gif

This graphic shows how Role Mapping providers interact with the WebLogic Security Framework. An explanation follows in the text.

PK‰W PKÛ°-AOEBPS/img_text/db_init.htm%Úý Description of the illustration db_init.gif

Database delegator interacts with runtime class. The database delegator should interact with the runtime class and the MBean type for the security provider.

PKñ`Si*%PKÛ°-AOEBPS/img_text/cm_all.htmP¯ý Description of the illustration cm_all.gif

CredentialProviderV2 and CredentialMapperV2 SSPIs. This figure shows a single runtime class called MyCredentialMapperProviderImpl that implements the CredentialProviderV2 and CredentialMapperV2 SSPIs.

PK-ó UPPKÛ°-AOEBPS/img_text/spi_arch.htmH·ý Description of the illustration spi_arch.gif

This graphic shows the provider SSPIs. The SSPIs exposing security services to the WebLogic Security Framework are provided by WebLogic Server, and all extend the SecurityProvider interface.

PKџ<—MHPKÛ°-AOEBPS/img_text/cmmbhier.htm«Tý Description of the illustration cmmbhier.gif

The SSPI MBean hierarchy. This figure illustrates the SSPI MBean hierarchy for security providers (using the WebLogic Credential Mapping MDF as an example), and indicates what attributes and operations will appear in the Administration Console for the WebLogic Credential Mapping provider.

PK·wL`°«PKÛ°-AOEBPS/img_text/atz_fwk.htmÎ1þ Description of the illustration atz_fwk.gif

Authorization providers interact with the WebLogic Security Framework

PK)ô®ÓÎPKÛ°-AOEBPS/img_text/atn_per.htmøþ Description of the illustration atn_per.gif

This graphic shows how perimeter authentication is performed. An explanation in the text preceeds this graphic.

PK‡lAýøPKÛ°-AOEBPS/img_text/mbmkr.htmùþ Description of the illustration mbmkr.gif

This graphic shows what the WebLogic MBeanMaker provides. The text preceeding the graphic describes what is shown.

PK¸ž/­þùPKÛ°-AOEBPS/img_text/con_ia.htmûþ Description of the illustration con_ia.gif

Configuring the Sample Identity Assertion Provider. You enter one of the supported types in the Active Types field.

PKߕt|ûPKÛ°-A&OEBPS/img_text/servlet_auth_filter.htmúý Description of the illustration servlet_auth_filter.gif

If you develop a custom Servlet Authentication Filter, make sure that your custom Authentication providers do not call the WLS-specific classes (for example, weblogic.servlet.*) and the Java EE-specific classes (for example, javax.servlet.*). Following this rule ensures maximum portability with WebLogic Security. This graphic illustrates this requirement.

PKÀÅ%ÐÿúPKÛ°-AOEBPS/img_text/aud_fwk2.htmt‹ý Description of the illustration aud_fwk2.gif

This graphic shows how Auditing providers interact with the WebLogic Security Framework and other types of security providers (using Authentication providers as an example) to audit selected events. An explanation follows in the text.

PKK†¦ytPKÛ°-AOEBPS/img_text/atn_lms.htmö þ Description of the illustration atn_lms.gif

The graphic illustrates the LoginModule flow. The text that follows the graphic describes the flow in detail.

PKœèûöPKÛ°-AOEBPS/img_text/clv.htmÌ3þ Description of the illustration clv.gif

This graphic illustrates the certificate lookup and validation process.

PK“"ÉÑÌPKÛ°-AOEBPS/img_text/p_mig.htmO°ý Description of the illustration p_mig.gif

The migration tab for WebLogic Authentication provider. The optional SSPI MBeans automatically appear in a WebLogic Server Administration Console page for the associated security provider in this tab.

PKãwGÂTOPKÛ°-AOEBPS/img_text/sp_gen.htmïþ Description of the illustration sp_gen.gif

This graphic shows the general architecture of a security provider. An explanation follows in the text.

PK‘„`²ôïPKÛ°-AOEBPS/img_text/con_cm2.htm)Öý Description of the illustration con_cm2.gif

The DefaultCredentialMapper page. Implementing the hierarchy of SSPI MBeans in the DefaultCredentialMapper MDF produces this page in the Administration Console.

PKrÓå€.)PKÛ°-AOEBPS/img_text/atn_sub.htmøþ Description of the illustration atn_sub.gif

This graphic illustrates the relationships of users, groups, principals, and subjects as described in the text.

PK çËrýøPKÛ°-A OEBPS/rm.htm€ÿ ロール・マッピング・プロバイダ

9 ロール・マッピング・プロバイダ

この章では、ロール・マッピング・プロバイダの概念と機能、およびカスタム・ロール・マッピング・プロバイダの開発手順について説明します。

ロール・マッピングとは、実行時にプリンシパル(ユーザーまたはグループ)をセキュリティ・ロールに動的に割り当てるプロセスのことです。WebLogic Serverでは、ロール・マッピング・プロバイダは、WebLogicリソースを操作しようとしているサブジェクト内のプリンシパルに適用されるセキュリティ・ロールを調べます。通常、この操作ではWebLogicリソースへのアクセスを取得する必要があるので、ロール・マッピング・プロバイダは認可プロバイダと共に使用するのが一般的です。

以下の節では、ロール・マッピング・プロバイダの概念と機能、およびカスタム・ロール・マッピング・プロバイダの開発手順について説明します。

ロール・マッピングの概念

ロール・マッピング・プロバイダを開発する前に、以下の概念を理解しておく必要があります。

セキュリティ・ロール

セキュリティ・ロールは、WebLogicリソースへの同じアクセス権限を持つユーザーまたはグループの集合です。グループと同様、セキュリティ・ロールを使用すると、複数のユーザーによるWebLogicリソースへのアクセスを一度に制御できます。ただし、セキュリティ・ロールはWebLogic Serverドメインの特定のリソースをスコープとしており(WebLogic Serverドメイン全体をスコープとするグループとは異なる)、動的に定義することが可能です。「動的セキュリティ・ロール計算」を参照してください。


注意:

セキュリティ・ロールの詳細は、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』のユーザー、グループおよびセキュリティ・ロールに関する項を参照してください。WebLogicリソースの詳細は、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』のセキュリティ・プロバイダとWebLogicリソースに関する項およびポリシーで保護できるリソースのタイプに関する項を参照してください。


weblogic.security.serviceパッケージのSecurityRoleインタフェースは、セキュリティ・ロールの抽象的な記法を表すために用いられます(詳細は、Oracle WebLogic Server APIリファレンスでSecurityRoleインタフェースを参照)。

プリンシパルをセキュリティ・ロールにマップすると、そのプリンシパルがそのセキュリティ・ロールに割り当てられているかぎり、そのプリンシパルには定義されたアクセス許可が付与されます。たとえば、アプリケーションでAppAdminというセキュリティ・ロールを定義し、これによってそのアプリケーションのリソースのごく一部に対する書込みアクセスが提供されるものとします。この場合、AppAdminセキュリティ・ロールに割り当てられたプリンシパルはすべて、それらのリソースに対して書込みアクセス権を持つことになります。詳細は、「動的セキュリティ・ロール計算」と『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』のユーザー、グループおよびセキュリティ・ロールに関する項を参照してください。

なお、多数のプリンシパルを単一のセキュリティ・ロールにマップすることができます。プリンシパルの詳細は、「ユーザー/グループ、プリンシパル、サブジェクト」を参照してください。

セキュリティ・ロールの指定は、Java EEデプロイメント記述子ファイルかWebLogic Server管理コンソール、あるいはその両方で行われます。詳細については、「ロール・マッピング・プロバイダとデプロイメント記述子の管理」を参照してください。

動的セキュリティ・ロール計算

セキュリティ・ロールは、宣言的なもの(すなわち、Java Enterprise Editionにおけるロール)とすることも、リクエストのコンテキストに基づいて動的に計算することもできます。

動的セキュリティ・ロール計算とは、このようにプリンシパル(ユーザーまたはグループ)を実行時にセキュリティ・ロールにレイト・バインドすることを意味する用語です。こうしたレイト・バインディングは、プリンシパル対セキュリティ・ロールの関連付けが静的に定義されるか動的に計算されるかによらず、保護対象WebLogicリソースについての認可判定の直前に行われます。バインディングが呼出しシーケンス内で行われるため、あらゆるプリンシパル対セキュリティ・ロール計算の結果は、リクエストに対して下される認可判定の一環として、認証用ID情報として解釈することができます。

こうしたセキュリティ・ロールの動的計算には非常に重要な利点があります。つまり、ビジネス・ルールに基づいてユーザーまたはグループをセキュリティ・ロールに関連付けることができるのです。たとえば、本来の管理者が長期の出張で不在の間のみ、ユーザーにManagerセキュリティ・ロールを割り当てることができます。このセキュリティ・ロールを動的に計算することで、そうした一時的な措置のためにアプリケーションを変更したり再デプロイしたりする必要はなくなります。さらに、本来の管理者が戻ってきたときに、その特別に付与した権限を忘れずに取り消す必要もありません。なお、ユーザーを一時的にManagersグループに追加した場合には、その必要があるでしょう。


注意:

通常はWebLogic Server管理コンソールで利用できるロール条件を使用して、ユーザーまたはグループにセキュリティ・ロールを付与します。(このリリースのWebLogic Serverでは、カスタム・ロール条件は記述できません。)詳細は、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』のユーザー、グループおよびセキュリティ・ロールに関する項を参照してください。


計算で得られたセキュリティ・ロールは、ターゲット(利用可能であれば)のID情報やリクエストのパラメータ値など、リクエストのコンテキストを構成する様々な情報にアクセスすることができます。こうしたコンテキスト情報は通常、WebLogicセキュリティ・フレームワークで評価される式に含まれるパラメータの値として使用されます。この機能は、デプロイメント記述子またはWebLogic Server管理コンソールを通じて静的に定義されたセキュリティ・ロールの計算も担当します。


注意:

認証済みユーザーに対するセキュリティ・ロールの計算は、Java EE仕様で定義されているロール・ベース・アクセス制御(RBAC)によるセキュリティ機能を拡張したものです。

動的なセキュリティ・ロール計算を作成するには、WebLogic Server管理コンソールでロール文を定義します。詳細は、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』のユーザー、グループおよびセキュリティ・ロールに関する項を参照してください。


ロール・マッピング・プロセス

WebLogicセキュリティ・フレームワークは、認可判定の一環として、セキュリティ・レルム用に構成されている各ロール・マッピング・プロバイダを呼び出します。関連情報については、「認可プロセス」を参照してください。

ロール・マッピング・プロバイダによる動的セキュリティ・ロール関連計算の結果、一連のセキュリティ・ロールが一度にサブジェクト内のプリンシパルに割り当てられます。その後、これらのセキュリティ・ロールを用いて、保護対象WebLogicリソース、リソース・コンテナ、およびアプリケーション・コードについての認可判定が行われます。たとえば、Enterprise JavaBean (EJB)であれば、アクセスを許可するかどうかを決めるビジネス・ポリシーを知らなくても、Java EEのisCallerInRole()メソッドを用いてデータベース内のレコードからフィールドを取得することができます。

動的セキュリティ・ロール計算を作成する場合のロール・マッピング・プロバイダとWebLogicセキュリティ・フレームワークとの対話を図9-1に示し、続いてそれについて説明します。

図9-1 ロール・マッピング・プロバイダとロール・マッピング・プロセス

図9-1の説明が続きます
「図9-1 ロール・マッピング・プロバイダとロール・マッピング・プロセス」の説明

一般に、ロール・マッピングは以下のように実行されます。

  1. ユーザーまたはシステム・プロセスがWebLogicリソースをリクエストし、特定の操作を実行しようとします。

  2. リクエストされたWebLogicリソースのタイプを処理するリソース・コンテナがリクエストを受け取ります。たとえばEJBコンテナはEJBリソースに対するリクエストを受け取ります。


    注意:

    リソース・コンテナは、「セキュリティ・プロバイダとWebLogicリソース」で説明されているWebLogicリソースのいずれかを処理するコンテナです。


  3. リソース・コンテナは、リクエストのコンテキストに関連付けられている情報を取得するためにロール・マッピング・プロバイダで使用する場合のあるContextHandlerオブジェクトを作成します。


    注意:

    ContextHandlerの詳細は、「ContextHandlerとWebLogicリソース」を参照してください。


    リソース・コンテナは、サブジェクト(ユーザーおよびグループ・プリンシパルを含む)、WebLogicリソースの識別子、そして場合によっては追加入力を提供するContextHandlerオブジェクトを渡してWebLogicセキュリティ・フレームワークを呼び出します。


    注意:

    サブジェクトの詳細は、「ユーザー/グループ、プリンシパル、サブジェクト」を参照してください。リソース識別子の詳細は、「WebLogicリソース識別子」を参照してください。


  4. WebLogicセキュリティ・フレームワークは、適用するセキュリティ・ロールのリストを取得するために、構成済みの各ロール・マッピング・プロバイダを呼び出します。この仕組みは次のとおりです。

    1. ロール・マッピング・プロバイダはContextHandlerを用いて、リクエストに関する様々な情報をリクエストします。また、ロール・マッピング・プロバイダは、リクエストする情報のタイプを表す一連のCallbackオブジェクトを作成します。そのCallbackオブジェクト群は、handleメソッドを通じて、配列としてContextHandlerに渡されます。

      ロール・マッピング・プロバイダは、必要なコンテキスト情報を取得するのに、ContextHandlerを複数回呼び出す場合があります。ロール・マッピング・プロバイダでContextHandlerが呼び出される回数はその実装によって異なります。

    2. コンテキスト情報と、セキュリティ・ポリシー、サブジェクト、およびWebLogicリソースを格納する関連セキュリティ・プロバイダ・データベースを使用することで、ロール・マッピング・プロバイダは、サブジェクト内のユーザー・プリンシパルとグループ・プリンシパルで表されるリクエスト側に特定のセキュリティ・ロールの資格があるかどうかを決定します。

      セキュリティ・ポリシーは、指定されたセキュリティ・ロールを付与すべきかどうかを判定する際に評価される一連の式すなわちルールとして表されます。これらのルールを使用する際に、ロール・マッピング・プロバイダは、取得したコンテキスト情報の値を式のパラメータに代入しなければならない場合があります。さらに、ユーザー・プリンシパルまたはグループ・プリンシパルのID情報が、式のパラメータ値として必要になることもあります。


      注意:

      セキュリティ・ポリシーのルールは、WebLogic Server管理コンソールとJava EEデプロイメント記述子で設定します。詳細は、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』のセキュリティ・ポリシーに関する項を参照してください。


    3. リクエスト側に特定のセキュリティ・ロールの資格があるとセキュリティ・ポリシーに指定されている場合には、そのセキュリティ・ロールがサブジェクトに適用されるセキュリティ・ロールのリストに追加されます。

    4. このプロセスは、WebLogicリソースまたはリソース・コンテナに適用されるセキュリティ・ポリシーがすべて評価されるまで続行されます。

  5. セキュリティ・ロールのリストはWebLogicセキュリティ・フレームワークに返され、アクセス決定などの操作の一環として使用できるようになります。

カスタム・ロール・マッピング・プロバイダはスレッド・セーフか

最高のパフォーマンスを実現するため、デフォルトでは、アプリケーションおよびモジュールのデプロイメント中にセキュリティ・ポリシーおよびロールに対して並列変更を実行できます。この理由から、セキュリティ・レルムに構成されているデプロイ可能な認可プロバイダおよびロール・マッピング・プロバイダでは、並列呼出しがサポートされている必要があります。WebLogicのデプロイ可能なXACML認可プロバイダおよびロール・マッピング・プロバイダは、この要件を満たしています。

ただし、カスタムのデプロイ可能な認可プロバイダまたはロール・マッピング・プロバイダで並列呼出しがサポートされている場合とサポートされていない場合があります。カスタムのデプロイ可能な認可プロバイダまたはロール・マッピング・プロバイダが並列呼出しをサポートしない場合、並列セキュリティ・ポリシーとロール変更を無効にして、かわりに各アプリケーションとモジュールがキューに配置され、連続してデプロイされる同期メカニズムを実行する必要があります。


注意:

同期化メカニズムを有効にした場合、定義済のWebLogic Serverプロバイダも含めて、レルム内に構成されているすべてのデプロイ可能なプロバイダが影響を受けます。同期化メカニズムを有効にすると、これらのプロバイダのパフォーマンスに悪影響を与える可能性があります。


この同期化強制メカニズムを有効にする方法については、『Oracle WebLogic Serverの保護』を参照してください。

カスタム・ロール・マッピング・プロバイダを開発する必要があるか

WebLogic Serverのデフォルト(つまりアクティブな)セキュリティ・レルムにはWebLogicロール・マッピング・プロバイダが含まれています。WebLogicロール・マッピング・プロバイダは、デフォルト・ユーザーとWebLogicリソースのそれぞれについて、保護されている特定のリソースに関する特定のユーザー(サブジェクト)の動的セキュリティ・ロールを計算します。また、WebLogicロール・マッピング・プロバイダは、システム内のセキュリティ・ロールのデプロイメントとアンデプロイメントをサポートしています。WebLogicロール・マッピング・プロバイダは、WebLogic認可プロバイダと同じセキュリティ・ポリシー・エンジンを使用します。自社の既存のロール・マッピング・メカニズムを使用する場合は、カスタム・ロール・マッピング・プロバイダを作成してそれを既存のメカニズムに結合できます。

カスタム・ロール・マッピング・プロバイダでアプリケーションのバージョン管理をサポートする必要があるか

セキュリティ・レルムのすべての認可プロバイダ、ロール・マッピング・プロバイダ、および資格証明マッピング・プロバイダは、アプリケーションのデプロイにバージョンを使用するために、アプリケーションのバージョン管理をサポートする必要があります。認可、ロール・マッピング、または資格証明マッピング用にカスタム・セキュリティ・プロバイダを開発する際に、バージョン管理されたアプリケーションをサポートする必要がある場合は、第14章「バージョン管理可能なアプリケーションのプロバイダ」の説明に従って、バージョン管理可能なアプリケーションのSSPIを実装する必要があります。

カスタム・ロール・マッピング・プロバイダの開発方法

WebLogicロール・マッピング・プロバイダが開発者のニーズを満たさない場合、次の手順でカスタム・ロール・マッピング・プロバイダを開発することができます。

  1. 適切なSSPIを使用してランタイム・クラスの作成または必要に応じてバルク認可プロバイダを実装

  2. 必要に応じてロール・コンシューマSSPIを実装

  3. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  4. 管理コンソールによるカスタム・ロール・マッピング・プロバイダの構成

  5. セキュリティ・ロールを管理するためのメカニズムの提供

適切なSSPIによるランタイム・クラスの作成

ランタイム・クラスを作成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム・ロール・マッピング・プロバイダのランタイム・クラスを作成します。

カスタム・ロール・マッピング・プロバイダのランタイム・クラスの作成例については、「例:サンプル・ロール・マッピング・プロバイダのランタイム・クラスの作成」を参照してください。

RoleProvider SSPIの実装

RoleProvider SSPIを実装するには、「Provider」SSPIの目的についてで説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • getRoleMapper

    public RoleMapper getRoleMapper()
    

    getRoleMapperメソッドは、RoleMapper SSPIの実装を取得します。MyRoleProviderImpl.javaという1つのランタイム・クラスの場合、getRoleMapperメソッドの実装は次のようになります。

    return this;
    

    ランタイム・クラスが2つの場合、getRoleMapperメソッドの実装は次のようになります。

    return new MyRoleMapperImpl;
    

    これは、RoleProvider SSPIを実装するランタイム・クラスが、RoleMapper SSPIを実装するクラスを取得する場合のファクトリとして使用されるためです。

RoleProvider SSPIとgetRoleMapperメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

DeployableRoleProviderV2 SSPIの実装


注意:

DeployableRoleProvider SSPIは、このリリースのWebLogic Serverでは非推奨になっています。DeployableRoleProviderV2 SSPIをかわりに使用してください。


DeployableRoleProviderV2 SSPIを実装するには、「Provider」SSPIの目的についておよび RoleProvider SSPIの実装で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • deleteApplicationRoles

    void deleteApplicationRoles(ApplicationInfo application)
    

    アプリケーションのすべてのロールを削除し、アプリケーションが削除された時点でWebLogic Serverドメイン内の管理サーバーでのみ呼び出されます。

  • deployRole

    void deployRole(DeployRoleHandle handle, Resource resource, String roleName,
    String[] userAndGroupNames)
    

    デプロイされたWebアプリケーションまたはEJBにかわってロールを作成します。ロールがすでに存在する場合は削除され、このロールによって置き換えられます。

  • endDeployRoles

    void endDeployRoles(DeployRoleHandle handle)
    

    アプリケーションのロール・デプロイメントの終了をマークします。

  • startDeployRoles

    DeployRoleHandle startDeployRoles(ApplicationInfo application)
    

    アプリケーションのロール・デプロイメントの開始をマークし、アプリケーションがターゲット指定されているWebLogic Serverドメイン内のすべてのサーバーで呼び出されます。

  • undeployAllRoles

    void undeployAllRoles(DeployRoleHandle handle)
    

    デプロイされていないWebアプリケーションまたはEJBにかわって、ロールのセットを削除しã€ÿ¾ã™ã€‚

DeployableRoleProvider SSPIとdeployRoleおよびundeployRoleメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

ApplicationInfoインタフェース

ApplicationInfoインタフェースは、アプリケーションのデプロイメントに関するデータをセキュリティ・プロバイダに渡します。このデータを使用すると、アプリケーションを一意に識別できます。

セキュリティ・フレームワークは、ユーザーの利便を図るためにApplicationInfoインタフェースを実装します。このインタフェースのメソッドを実装する必要はありません。

DeployableAuthorizationProviderV2インタフェースとDeployableRoleProviderV2インタフェースはApplicationInfoを使用します。たとえば、DeployableRoleProviderV2のメソッドの実装を例にあげます。セキュリティ・フレームワークは、DeployableRoleProviderV2のstartDeployRolesメソッドを呼び出し、このアプリケーションのApplicationInfoインタフェースを渡します。ApplicationInfoデータは、アプリケーションのデプロイ時に管理コンソールで提供される情報を基に決められます。

startDeployRolesメソッドは、DeployableRoleProviderV2の他のメソッドでこの後使用できるDeployRoleHandleを戻します。

ApplicationInfoインタフェースを使用すると、このアプリケーションのアプリケーション識別子、コンポーネント名、およびコンポーネントの種類を取得できます。コンポーネントの種類は、ApplicationInfo.ComponentTypeクラスの定義に従って、APPLICATION、CONTROL_RESOURCE、EJB、またはWEBAPPのいずれかです。

次のコードは、このタスクを実行する方法の一例です。

public DeployRoleHandle startDeployRoles(ApplicationInfo appInfo)
    throws DeployHandleCreationException
     :
// Obtain the application information...
    String appId = appInfo.getApplicationIdentifier();
    ComponentType compType = appInfo.getComponentType();
    String compName = appInfo.getComponentName();

セキュリティ・フレームワークは、DeployableRoleProviderV2のdeleteApplicationRolesメソッドを呼び出し、このアプリケーションのApplicationInfoインタフェースを渡します。deleteApplicationRolesメソッドは、アプリケーションのすべてのロールを削除し、アプリケーションが削除された時点でWebLogic Serverドメイン内の管理サーバーでのみ呼び出されます。

RoleMapper SSPIの実装

RoleMapper SSPIを実装するには、以下のメソッドの実装を提供する必要があります。

  • getRoles

    public Map getRoles(Subject subject, Resource  resource, ContextHandler handler)
    

    getRolesメソッドは、場合によりContextHandlerに指定されたオプショナルな情報を使用して、特定のWebLogicリソースに関して特定のサブジェクトに関連付けられているセキュリティ・ロールを返します。ContextHandlerの詳細は、「ContextHandlerとWebLogicリソース」を参照してください。

RoleMapper SSPIとgetRolesメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

レルム・アダプタ認証プロバイダと互換性のあるカスタム・ロール・マッピング・プロバイダを開発する

認証プロバイダは、サブジェクト内へのユーザーおよびグループの格納を担当するセキュリティ・プロバイダです。ユーザーおよびグループはその後、ロール・マッピング・プロバイダなど、他のタイプのセキュリティ・プロバイダによって、サブジェクトから抽出されます。セキュリティ・レルム内で構成された認証プロバイダがレルム・アダプタ認証プロバイダである場合、ユーザーおよびグループの情報は、他の認証プロバイダとは少し異なる形でサブジェクト内に格納されます。したがって、このユーザーおよびグループの情報もまた、少し異なる方法で抽出する必要があります。

例9-1では、サブジェクトへの格納にレルム・アダプタ認証プロバイダが使用された場合に、サブジェクトがユーザー名またはグループ名に一致するかどうかをチェックするため、カスタム・ロール・マッピング・プロバイダで使用できるコードを示します。このコードは、getRolesメソッドに属しています。

例9-1 サンプル・コード:サブジェクトがユーザー名またはグループ名に一致するかどうかのチェック

/** 
 * Determines if the Subject matches a user/group name. 
 * 
 * @param principalWant A String containing the name of a principal in this role
 * (that is, the role definition). 
 * 
 * @param subject A Subject that contains the Principals that identify the user 
 * who is trying to access the resource as well as the user's groups. 
 * 
 * @return A boolean. true if the current subject matches the name of the 
 * principal in the role, false otherwise. 
 */ 
private boolean subjectMatches(String principalWant, Subject subject) 
{ 
   // first, see if it's a group name match 
   if (SubjectUtils.isUserInGroup(subject, principalWant)) { 
      return true; 
   } 
   // second, see if it's a user name match 
   if (principalWant.equals(SubjectUtils.getUsername(subject))) { 
      return true; 
   } 
   // didn't match 
   return false; 
}

SecurityRoleインタフェースの実装

SecurityRoleインタフェースのメソッドを使用して、セキュリティ・ロールに関する基本的な情報を取得したり、取得した情報を別のセキュリティ・ロールと比較したりできます。これらのメソッドは、セキュリティ・プロバイダの利便性のために設計されています。


注意:

SecurityRole実装は、getRoles()メソッドによってMapとして返されます。(RoleProvider SSPIの実装を参照)。


SecurityRoleインタフェースを実装するには、以下のメソッドの実装を提供する必要があります。

  • equals

    public boolean equals(Object another)
    

    equalsメソッドは、渡されたセキュリティ・ロールが、このインタフェースの実装によって表されるセキュリティ・ロールに一致する場合にTRUEを返し、それ以外の場合はFALSEを返します。

  • toString

    public String toString()
    

    toStringメソッドは、このセキュリティ・ロールをStringとして返します。

  • hashCode

    public int hashCode()
    

    hashCodeメソッドは、このセキュリティ・ロールのハッシュ・コードを整数で返します。

  • getName

    public String getName()
    

    getNameメソッドは、このセキュリティ・ロールの名前をStringとして返します。

  • getDescription

    public String getDescription()
    

    getDescriptionメソッドは、このセキュリティ・ロールの説明をStringとして返します。説明は、このセキュリティ・ロールの目的を記述したものです。

例:サンプル・ロール・マッピング・プロバイダのランタイム・クラスの作成

例9-2は、サンプル・ロール・マッピング・プロバイダのランタイム・クラスであるSimpleSampleRoleMapperProviderImpl.javaクラスを示しています。このランタイム・クラスには次の実装が含まれています。

例9-2 SimpleSampleRoleMapperProviderImpl.java

package examples.security.providers.roles.simple;

import java.security.Principal;
import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.security.auth.Subject;
import weblogic.management.security.ProviderMBean;
import weblogic.security.SubjectUtils;
import weblogic.security.WLSPrincipals;
import weblogic.security.service.ContextHandler;
import weblogic.security.spi.ApplicationInfo;
import weblogic.security.spi.ApplicationInfo.ComponentType;
import weblogic.security.spi.DeployableRoleProviderV2;
import weblogic.security.spi.DeployRoleHandle;
import weblogic.security.spi.Resource;
import weblogic.security.spi.RoleMapper;
import weblogic.security.spi.SecurityServices;
import weblogic.security.spi.VersionableApplicationProvider;

public final class SimpleSampleRoleMapperProviderImpl
implements DeployableRoleProviderV2, RoleMapper, VersionableApplicationProvider
{
   private String              description; 
// a description of this provider
   private SimpleSampleRoleMapperDatabase database;     
// manages the role definitions for this provider
   private static final Map NO_ROLES = Collections.unmodifiableMap(new HashMap(1)); 
// used when no roles are found

  public void initialize(ProviderMBean mbean, SecurityServices services)
  {
     System.out.println("SimpleSampleRoleMapperProviderImpl.initialize");

// Cast the mbean from a generic ProviderMBean to a SimpleSampleRoleMapperMBean.
     SimpleSampleRoleMapperMBean myMBean = (SimpleSampleRoleMapperMBean)mbean;

     // Set the description to the simple sample role mapper's mbean's description and version 
     description = myMBean.getDescription() + "\n" + myMBean.getVersion();

     // Instantiate the helper that manages this provider's role definitions
     database = new SimpleSampleRoleMapperDatabase(myMBean);
  }
  public String getDescription()
{
     return description;
}

  public void shutdown()
{
     System.out.println("SimpleSampleRoleMapperProviderImpl.shutdown");
}

  public RoleMapper getRoleMapper()
  {
     // Since this class implements both the DeployableRoleProvider
     // and RoleMapper interfaces, this object is the
     // role mapper object so just return "this".
     return this;
  }

public Map getRoles(Subject subject, Resource resource, ContextHandler handler)
{
   System.out.println("SimpleSampleRoleMapperProviderImpl.getRoles");
   System.out.println("\tsubject\t= " + subject);
   System.out.println("\tresource\t= " + resource);

   // Make a list for the roles
   Map roles = new HashMap();


   // Make a list for the roles that have already been found and evaluated
   Set rolesEvaluated = new HashSet();

   // since resources scope roles, and resources are hierarchical,
   // loop over the resource and all its parents, adding in any roles
   // that match the current subject.
     for (Resource res = resource; res != null; res = res.getParentResource()) {
       getRoles(res, subject, roles, rolesEvaluated);
     }

   // try global resources too
   getRoles(null, subject, roles, rolesEvaluated);

   // special handling for no matching roles
   if (roles.isEmpty()) {
     return NO_ROLES;
   }

   // return the roles we found.
   System.out.println("\troles\t= " + roles);
   return roles;
   }

public DeployRoleHandle startDeployRoles(ApplicationInfo application)
{
   String appId = application.getApplicationIdentifier();
   String compName = application.getComponentName();
   ComponentType compType = application.getComponentType();
   DeployRoleHandle handle = new SampleDeployRoleHandle(appId,compName,compType);

   // ensure that previous roles have been removed so that
   // the most up to date deployment roles are in effect
   database.removeRolesForComponent(appId, compName, compType);

   // A null handle may be returned if needed
   return handle;

   }

public void deployRole(DeployRoleHandle handle, Resource resource,
String roleName, String[] principalNames)
{
   System.out.println("SimpleSampleRoleMapperProviderImpl.deployRole");
   System.out.println("\thandle\t\t= " + ((SampleDeployRoleHandle)handle).toString());
   System.out.println("\tresource\t\t= " + resource);
   System.out.println("\troleName\t\t= " + roleName);

   for (int i = 0; principalNames != null && i < principalNames.length; i++) {
      System.out.println("\tprincipalNames[" + i + "]\t= " + principalNames[i]);
   }
   database.setRole(resource, roleName, principalNames);
}
public void endDeployRoles(DeployRoleHandle handle)
{
database.saveRoles();
}

public void undeployAllRoles(DeployRoleHandle handle)
{
   System.out.println("SimpleSampleRoleMapperProviderImpl.undeployAllRoles");
   SampleDeployRoleHandle myHandle = (SampleDeployRoleHandle)handle;
   System.out.println("\thandle\t= " + myHandle.toString());

  // remove roles
   database.removeRolesForComponent(myHandle.getApplication(),
                                    myHandle.getComponent(),
                                    myHandle.getComponentType());
}

public void deleteApplicationRoles(ApplicationInfo application)
{
   System.out.println("SimpleSampleRoleMapperProviderImpl.deleteApplicationRoles");
   String appId = application.getApplicationIdentifier();
   System.out.println("\tapplication identifier\t= " + appId);

   // clear out roles for the application
   database.removeRolesForApplication(appId);
}


private void getRoles(Resource resource, Subject subject,
              Map roles, Set rolesEvaluated)
  {
   // loop over all the roles in our "database" for this resource
   for (Enumeration e = database.getRoles(resource); e.hasMoreElements();) {
     String role = (String)e.nextElement();

     // Only check for roles not already evaluated
     if (rolesEvaluated.contains(role)) {
       continue;
     }
     // Add the role to the evaluated list
     rolesEvaluated.add(role);

     // If any of the principals is on that role, add the role to the list.
     if (roleMatches(resource, role, subject)) {

       // Add a simple sample role mapper role instance to the list of roles.
       roles.put(role, new SimpleSampleSecurityRoleImpl(role));
     }
   }
}

private boolean roleMatches(Resource resource, String role, Subject subject)
{
   // loop over the the principals that are in this role.
   for (Enumeration e = database.getPrincipalsForRole(resource, role); e.hasMoreElements();) {

     // get the next principal in this role
     String principalWant = (String)e.nextElement();

     // see if any of the current principals match this principal
     if (subjectMatches(principalWant, subject)) {
       return true;
     }
   }
return false;
}

private boolean subjectMatches(String principalWant, Subject subject)
{
   // first, see if it's a group name match
   if (SubjectUtils.isUserInGroup(subject, principalWant)) {
     return true;
   }
   // second, see if it's a user name match
   if (principalWant.equals(SubjectUtils.getUsername(subject))) {
     return true;
   }
   // didn't match
   return false;
}

public void createApplicationVersion(String appId, String sourceAppId)
{
   System.out.println("SimpleSampleRoleMapperProviderImpl.createApplicationVersion");
   System.out.println("\tapplication identifier\t= " + appId);
   System.out.println("\tsource app identifier\t= " + ((sourceAppId != null) ? sourceAppId : "None"));

   // create new roles when existing application is specified
   if (sourceAppId != null) {
     database.cloneRolesForApplication(sourceAppId,appId);
   }
}


public void deleteApplicationVersion(String appId)
{
   System.out.println("SimpleSampleRoleMapperProviderImpl.deleteApplicationVersion");
   System.out.println("\tapplication identifier\t= " + appId);

   // clear out roles for the application
   database.removeRolesForApplication(appId);
}

public void deleteApplication(String appName)
{
   System.out.println("SimpleSampleRoleMapperProviderImpl.deleteApplication");
   System.out.println("\tapplication name\t= " + appName);

   // clear out roles for the application
   database.removeRolesForApplication(appName);
}

class SampleDeployRoleHandle implements DeployRoleHandle
{
   Date date;
   String application;
   String component;
   ComponentType componentType;

   SampleDeployRoleHandle(String app, String comp, ComponentType type)
   {
     this.application = app;
     this.component = comp;
     this.componentType = type;
     this.date = new Date();
   }

   public String getApplication() { return application; }
   public String getComponent() { return component; }
   public ComponentType getComponentType() { return componentType; }

   public String toString()
{
     String name = component;
     if (componentType == ComponentType.APPLICATION)
       name = application;
     return componentType +" "+ name +" ["+ date.toString() +"]";
   }
  }
}

例9-3は、SimpleSampleRoleMapperProviderImpl.javaランタイム・クラスとともに使用するSecurityRoleの実装例を示しています。

例9-3 SimpleSampleSecurityRoleImpl.java

package examples.security.providers.roles.simple;
import weblogic.security.service.SecurityRole;
/*package*/ class SimpleSampleSecurityRoleImpl implements SecurityRole
{
   private String roleName; // the role's name
   private int    hashCode; // the role's hash code
/*package*/ SimpleSampleSecurityRoleImpl(String roleName)
{
   this.roleName = roleName;
   this.hashCode = roleName.hashCode() + 17;
}
public boolean equals(Object genericRole)
{
   // if the other role is null, we're not the same
   if (genericRole == null) {
   return false;
   }
// if we're the same java object, we're the same
if (this == genericRole) {
   return true;
}

// if the other role is not a simple sample role mapper role,
// we're not the same
if (!(genericRole instanceof SimpleSampleSecurityRoleImpl)) {
return false;
}

// Cast the other role to a simple sample role mapper role.
SimpleSampleSecurityRoleImpl sampleRole =
(SimpleSampleSecurityRoleImpl)genericRole;
// if our names don't match, we're not the same
if (!roleName.equals(sampleRole.getName())) {
   return false;
}
// we're the same
   return true;
}
public String toString()
{
return roleName;
}

public int hashCode()
{
return hashCode;
}

public String getName()
{
   return roleName;
}
public String getDescription()
{
   return "";
}
}

ロール・コンシューマSSPI

WebLogic ServerにはWebサービス・アノテーション用のロール・コンシューマが実装されています。このリリースのWebLogic Serverには、ロール・マッピング・プロバイダがロール・コレクションを取得するために使用できるSSPIがあります。

RoleConsumer SSPIは省略可能です。ロール・コレクションを消費するためには、このSSPIを実装するロール・マッピング・プロバイダのみが呼び出されます。

このSSPIでは、初期状態のロール・コレクションの配信と、更新後のロール・コレクションの配信の両方がサポートされます。

ロール・コレクションの消費においては、RoleConsumer SSPIをサポートするすべてのロール・マッピング・プロバイダが呼び出されます。各ロール・マッピング・プロバイダは、特定のロール・セットのロール・コレクションを取得するかしないかを選択できます。プロバイダでロールが永続化される場合、ロールを取得する必要があるのは一度だけです。一方、プロバイダでロールがメモリーに保持される場合、ロール・コレクションを再び取得することも可能です。

用意されているWebLogic Serverロール・マッピング・プロバイダでは、ロールはLDAP内に永続化されます。

必要なSSPIインタフェース

ロール・マッピング・プロバイダをカスタマイズしてロール・コレクションの配信をサポートするには、以下の3つのインタフェースを実装する必要があります。

  • weblogic.security.spi.RoleConsumerFactory

  • weblogic.security.spi.RoleConsumer

  • weblogic.security.spi.RoleCollectionHandler

これらのインタフェースについては、これ以降の節で説明します。

RoleConsumerFactory SSPIインタフェースの実装

ロール・マッピング・プロバイダには、RoleConsumerのインスタンスをWebLogicセキュリティ・フレームワークで使用できるように、RoleConsumerFactoryインタフェースが実装されています。WebLogicセキュリティ・フレームワークではRoleConsumerFactoryの実装を呼び出して、プロバイダのロール・コンシューマの実装を取得します。

RoleConsumerFactory SSPIにはメソッドが1つあり、このメソッドはRoleConsumer SSPIインタフェースの実装を返します。

public interface RoleConsumerFactory
{
  /**
   * Obtain the implementation of the RoleConsumer
   * security service provider interface (SSPI).<P>
   *
   * @return a RoleConsumer SSPI implementation.<P>
   */
  public RoleConsumer getRoleConsumer();
}

RoleConsumer SSPIインタフェースの実装

RoleConsumer SSPIは、ロール・コレクションを消費するためのロール・コレクション・ハンドラを返します。これにはgetRoleCollectionHandler()というメソッドが1つあり、このメソッドは引数にRoleCollectionInfoの実装を取って、RoleCollectionHandlerインタフェースの実装を返します。

public interface RoleConsumer
{
  /**
   * Obtain a role handler for consumption of a role collection.
   *
   * @param info the RoleCollectionInfo for the role collection.
   *
   * @return a RoleCollectionHandler or NULL which indicates
   *         that the role collection is not needed.
   *
   * @exception ConsumptionException if an error occurs
   *            obtaining the handler and the role collection cannot be consumed.
   */
  public RoleCollectionHandler getRoleCollectionHandler(
                                        RoleCollectionInfo info)
    throws ConsumptionException;
}

WebLogicセキュリティ・フレームワークではgetRoleCollectionHandler()メソッドを呼び出して、ロール・コレクションに関するデータをRoleCollectionInfoインタフェースの実装としてセキュリティ・プロバイダに渡します(このインタフェースはあらかじめ実装されているので、ユーザーが実装する必要はありません。)

RoleCollectionInfoのgetName()、getVersion()、getTimestamp()、およびgetResourceTypes()メソッドを使用して、このロール・コレクションに関する情報を検索します。検索後にはRoleCollectionHandlerを返すか、ロール・コレクションが不要であることを示すNULLを返します。

public interface RoleCollectionInfo
{
  /**
   * Get the name of the collection.
   */
  public String getName();

  /**
   * Get the runtime version of the role.
   */
  public String getVersion();

  /**
   * Get the timestamp of the role.
   */
  public String getTimestamp();

  /**
   * Get the resource types used in the role collection.
   */
  public Resource[] getResouceTypes();
}

RoleCollectionHandler SSPIインタフェースの実装

RoleConsumer.getRoleCollectionHandler()メソッドはRoleCollectionHandlerインタフェースの実装を返します。RoleCollectionHandlerにはsetRole()とdone()という2つのメソッドがあります。setRole()メソッドは、リソース、ロール名、およびその特定のリソース用のロールに割り当てる一連のユーザー名とグループ名の配列を取ります。

done()メソッドはロール・コレクションの完了を示します。

public interface RoleCollectionHandler
{
  /**
   * Set a role for the specified resource.
   */
  public void setRole(Resource resource, String roleName, String[] userAndGroupNames)
     throws ConsumptionException;

  
  /**
   * Signals the completion of the role collection.
   */
  public void done()
     throws ConsumptionException;

}

更新後のロール・コレクションのサポート

更新後のロール・コレクションの配信をサポートするには、RoleConsumer SSPIをサポートするすべてのロール・マッピング・プロバイダで、RoleConsumer.getRoleCollectionHandler()メソッドに渡されたRoleCollectionInfoの内容を調べて、ロール・コレクションが変更されているかどうかを判断する必要があります。各プロバイダでは、初期状態のロール・コレクションとSSPIの外部から受け取ったカスタマイズ後のロールとの競合を解決する方法を(できれば構成によって)決定しておくことが必要です。

WebLogic Serverで提供されているロール・マッピング・プロバイダでは、カスタマイズ後のロールが更新後のロール・コレクションで置き換えられません。初期状態のロール・コレクションのロールはすべて削除され、カスタマイズ後のロールと更新後のロール・コレクションのみが有効になります。ロール・コレクションの情報に異なるタイムスタンプやバージョンがある場合、更新後のロール・コレクションとして扱われます。コレクションの名前は永続キーとして使用されます。

RoleConsumerMBean

ロール・コンシューマSSPIを実装するロール・マッピング・プロバイダには、そのプロバイダでロールの消費をサポートすることを示すためにweblogic.management.security.authorization.RoleConsumerMBeanも実装する必要があります。

PolicyStoreMBean

このリリースのWebLogic Serverでは、weblogic.management.security.authorization.PolicyStoreMBeanという新しいMBeanがサポートされています。このMBeanは、管理者が生成したXACMLポリシーおよびポリシー・セットの標準的な管理操作(追加、削除、取得、リスト表示、変更、読込み)に使用できます。認可プロバイダMBeanやロール・マッピング・プロバイダMBeanには、必要に応じてこのMBeanインタフェースを実装できます。

セキュリティ管理者は、PolicyStoreMBeanのメソッドを使用して、サーバー内のポリシーをXACMLドキュメントとして管理できます。たとえば、デフォルトのXACMLプロバイダを使用するドメインを作成および管理したり、作成済のXACMLドキュメントを管理したりできます。これらのXACMLポリシーは、WebLogic ServerではWLSTを使用して管理できます。

WebLogic ServerにはこのMBeanの実装が含まれており、付属のXACMLプロバイダで使用できます。ã€ÿ¾ãŸã€ã“のMBeanの独自の実装を記述して、カスタムの認可プロバイダやロール・マッピング・プロバイダで使用することも可能です。WebLogic Serverに用意されているXACMLプロバイダでは、XACML 2.0のコア仕様(http://docs.oasis-open.org/xacml/2.0/access_control-xacml-2.0-core-spec-os.pdf)に記載されているXACMLの必須機能がサポートされています。Oracle固有の使用方法については、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』を参照してください。

ポリシーはXACML 2.0のポリシーまたはPolicySetドキュメントで表現されます。カスタム認可プロバイダでは、XACML 2.0のコア仕様に記載されている標準のPolicyまたはPolicySetドキュメントを想定する必要があります。カスタム・ロール・マッピング・プロバイダでは、Core and hierarchical role based access control (RBAC) profile of XACML v2.0 (http://docs.oasis-open.org/xacml/2.0/access_control-xacml-2.0-rbac-profile1-spec-os.pdf)に記載されているロール割当てポリシーと整合性があるPolicyまたはPolicySetドキュメントを想定する必要があります。

具体的には、Targetに以下を含める必要があります。

  • ActionAttributeDesignator (anyURI-equalで一致する、urn:oasis:names:tc:xacml:1.0:action:action-idというIDと、urn:oasis:names:tc:xacml:2.0:actions:enableRoleという値の指定されているもの)。例:

<Action>
<ActionMatch MatchId="urn:oasis:names:tc:xacml:1.0:function:anyURI-equal">

<AttributeValue
DataType="http://www.w3.org/2001/XMLSchema#anyURI">urn:oasis:names:tc:xacml:2.0:actions:enableRole
</AttributeValue>

<ActionAttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"
DataType="http://www.w3.org/2001/XMLSchema#anyURI" MustBePresent="true"/>

</ActionMatch>
</Action>
  • ResourceAttributeDesignator (string-equalで一致する、urn:oasis:names:tc:xacml:2.0:subject:roleというIDと、割り当てられたロールの名前である値の指定されているもの)。例:

<ResourceAttributeDesignator AttributeId="urn:oasis:names:tc:xacml:2.0:resource:resource-ancestor-or-self"
DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/>

XACML Policyファイルの形式の調べ

XACML 2.0のコア仕様(http://docs.oasis-open.org/xacml/2.0/access_control-xacml-2.0-core-spec-os.pdf)および『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』で説明しているOracle拡張が、提供されているXACML認可プロバイダおよびロール・マッピング・プロバイダで使用するXACMLポリシー・ファイルについての最も確実な情報です。

ただしサポートされているXACMLファイルの形式を開発プロセスの一環として確認する場合は、おそらく、管理コンソールを使用して、XACML認可またはロール・マッピング・プロバイダのデータベースからデータをXACMLファイルとしてエクスポートする方法が最も便利です。エクスポートしたXACMLファイルをコピーして別の名前で保存し、任意のツールで確認します。


注意:

エクスポートしたファイルは読取り専用としてください。変更した場合、そのファイルはWebLogic Serverにインポートし直さないでください。エクスポートしたファイルを編集すると、WebLogic Server構成が使用できなくなる可能性があります。エクスポートしたファイルの編集はサポートされていません。


WLSTを使用してPolicyStoreMBeanにポリシーの追加

例9-4に、WLSTを使用してXACMLファイルからPolicyStoreMBeanのインスタンスに1つのポリシーを追加する例を示します。

この例ではこのスクリプトで使用するプロパティを、次のantスクリプトから抜粋した行に似た方法で、あらかじめ別の場所に定義してあるものと想定しています。

<property name="xacml-docs-dir" value="${xacmldir}/xacml-docs"/>
<sysproperty key="file" value="${xacml-docs-dir}/policy-getSubject.xacml"/>

例9-4 WLSTを使用してPolicyStoreMBeanにポリシーの追加

:
try:
      protocol = System.getProperty("protocol")
      host = System.getProperty("host")
      user = System.getProperty("authuser")
      passwd = System.getProperty("authpwd")
      port = System.getProperty("port")
      dom = System.getProperty("domain")
      rlm = System.getProperty("realm")
      fil = System.getProperty("file")
      prov = System.getProperty("provider")
      stat = System.getProperty("status")

def configure():
try:
      url = protocol + "://" + host + ":" + port
      connect(user,passwd, url)
      path = "/SecurityConfiguration/" + dom + "/Realms/" + rlm + "/" + prov
      print("cd'ing to " + path)
      cd(path)
      print("calling open()")
      xacmlFile = open(fil,"r")
      print("calling read()")
      xacmlDoc = xacmlFile.read()
      print("calling cmo.addPolicy")
      if stat == "none":
          cmo.addPolicy(xacmlDoc)
      else:
          cmo.addPolicy(xacmlDoc, stat)
      print("Add error handling")
:
:

『Oracle WebLogic Scripting Tool』のMBeanの移動と照会に関する項で説明しているように、WLSTが初めてWebLogic Serverインスタンスに接続すると、変数cmo(現在の管理オブジェクト)がすべての構成管理オブジェクトのルートDomainMBeanに初期化されます。MBeanタイプに移動すると、このSecurityConfigurationMBeanの場合、cmoの値はSecurityConfigurationMBeanを反映したものになります。MBeanインスタンス、つまりこの場合にはPolicyStoreMBeanを実装する認可プロバイダMBean(例では変数provで指定)に移動するときには、WLSTによってcmoの値が現在のMBeanインスタンスに変更されます。

この例ではPolicyStoreMBeanのaddPolicy()メソッドを使用して、XACMLファイルからポリシー・ストアに読み込まれるポリシーを追加しています。addPolicy()メソッドの2つのバリアント(ステータスを伴うものと伴わないもの)が示されています。

ステータスを指定しないaddPolicy()メソッドを使用する場合、デフォルトでACTIVEに設定されます。これは、ポリシーがそのターゲットで適用されるどのような決定でも評価されることを示します。ステータスは明示的にACTIVE、INACTIVE、またはBYREFERENCEに設定できます。INACTIVEステータスは、ポリシーが評価されずに格納されるだけであることを示します。BYREFERENCEステータスは、評価されるポリシー・セットによって参照された場合にだけ、ポリシーが評価されることを示します。

このタイプのWLSTスクリプトは、次のような方法でコマンドラインから呼び出せます。

java -Dhost="localhost " -Dprotocol="t3" -Dauthuser="weblogic"
-Dauthpwd="weblogic" -Dport="7001" -Ddomain="mydomain" -Drealm="myrealm"
-Dprovider="Authorizers/XACMLAuthorizer"
-Dfile="C:/XACML/xacml-docs/policy12.xml" -Dstatus="none" weblogic.WLST
XACML/scripts/XACMLaddPolicy.py

WLSTを使用してPolicySetをStringとして読み込む

例9-5に、WLSTを使用してPolicySetをStringとして読み込む例を示します。

この例ではこのスクリプトで使用するプロパティを、次のantスクリプトから抜粋した行に似た方法で、あらかじめ別の場所に定義してあるものと想定しています。

<sysproperty key="identifier"
value="urn:sample:xacml:2.0:wlssecqa:resource:type@E@Fejb@G@M@Oapplication@ENoD
DRolesOrPoliciesEar@M@Omodule@Eejb11inEarMiniAppBean.jar@M@Oejb@EMiniAppBean@
M@Omethod@EgetSubject@M@OmethodInterface@ERemote"/>
<sysproperty key="version" value="1.0"/>

例9-5 WLSTを使用してPolicySetをStringとして読み込む

:
:
try:
      print("start XACMLreadPolicySet.py")
      protocol = System.getProperty("protocol")
      host = System.getProperty("host")
      user = System.getProperty("authuser")
      passwd = System.getProperty("authpwd")
      port = System.getProperty("port")
      dom = System.getProperty("domain")
      rlm = System.getProperty("realm")
      prov = System.getProperty("provider")
      id = System.getProperty("identifier")
      vers = System.getProperty("version")
:
:
def configure():
try:
      url = protocol + "://" + host + ":" + port
      connect(user,passwd, url)
      path = "/SecurityConfiguration/" + dom + "/Realms/" + rlm + "/" + prov
      print("cd'ing to " + path)
      cd(path)
      polset = cmo.readPolicySetAsString(id, vers)
      print("readPolicySetAsString() returned the following policy set: " + polset)
      print"Add error handling."
:
:

XACML 2.0のコア仕様(http://docs.oasis-open.org/xacml/2.0/access_control-xacml-2.0-core-spec-os.pdf)で説明されているように、<PolicySet>要素には<Policy>のセットまたは別の<PolicySet>要素、およびそれらの評価結果を結合するための指定された手順が含まれます。詳細については、XACML 2.0のコア仕様を参照してください。

バルク・ロール・マッピング・プロバイダ

WebLogic Serverのこのリリースには、以下に示すバルク・アクセス・バージョンのロール・マッピング・プロバイダSSPIインタフェースがあります。

  • BulkRoleProvider

  • BulkRoleMapper

バルク・アクセスSSPIインタフェースを使用すると、ロール・マッピング・プロバイダにおいて、1回の呼出しで複数の判定リクエストを取得できます。これまでのように、たとえば「for」ループで複数の呼出しを実行する必要はありません。バルクSSPIバリアントの目的は、プロバイダ実装において内部的なパフォーマンスの最適化を利用できるようにすることです。たとえば、渡されたResourceオブジェクトの多くが同じポリシーで保護されていることを検出することで、それらの判定結果が同じになると推測できるようになります。

バルク・バージョンでないSSPIインタフェースとバルク・バージョンのSSPIインタフェースの使用方法には若干の違いがあります。たとえば、BulkRoleMapper.getRoles()メソッドはロールのMapを返します。これは、初めにリソース、続いて名前で索引付けされ(Map<Resource, Map<String, SecurityRole>>)、サブジェクトに許可されている指定のリソースに関連付けられたセキュリティ・ロールを表します。

WebLogic MBeanMakerを使用してMBeanタイプを生成する

カスタム・セキュリティ・プロバイダのMBeanタイプを生成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム・ロール・マッピング・プロバイダのMBeanタイプを作成します。

  1. MBean定義ファイル(MDF)の作成

  2. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  3. WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

  4. WebLogic Server環境にMBeanタイプをインストールする


    注意:

    複数のセキュリティ・プロバイダのサンプルで、これらの手順の実行方法を示します。

    この節で説明する手順はすべて、Windows環境での作業を想定しています。


MBean定義ファイル(MDF)の作成

MBean定義ファイル(MDF)を作成するには、次の手順に従います。

  1. サンプル・ロール・マッピング・プロバイダのMDFをテキスト・ファイルにコピーします。


    注意:

    サンプル・ロール・マッピング・プロバイダのMDFは、SimpleSampleRoleMapper.xmlという名前です。


  2. MDFで<MBeanType>要素と<MBeanAttribute>要素の内容をカスタム・ロール・マッピング・プロバイダに合わせて修正します。

  3. カスタム属性および操作(つまり、<MBeanAttribute>および<MBeanOperation>要素)をMDFに追加します。

  4. ファイルを保存します。


    注意:

    MDF要素の構文についての詳細なリファレンスは、付録A「MBean定義ファイル(MDF)要素の構文」に収められています。


WebLogic MBeanMakerを使用してMBeanタイプを生成する

MDFを作成したら、WebLogic MBeanMakerを使用してそれを実行できます。WebLogic MBeanMakerは現在のところコマンドライン・ユーティリティで、入力としてMDFを受け取り、MBeanインタフェース、MBean実装、関連するMBean情報ファイルなどの中間Javaファイルをいくつか出力します。これらの中間ファイルが合わさって、カスタム・セキュリティ・プロバイダのMBeanタイプになります。

MBeanタイプの生成手順は、カスタム・ロール・マッピング・プロバイダの設計に応じて異なります。必要な設計に合わせて適切な手順を実行してください。

カスタム操作を追加しない場合

カスタム・ロール・マッピング・プロバイダのMDFにカスタム操作を含めない場合、次の手順に従います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまりロール・マッピング・プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

カスタム操作を追加する場合

カスタム・ロール・マッピング・プロバイダのMDFにカスタム操作を含める場合、質問に答えながら手順を進めてください。

MBeanタイプを作成するのは初めてですか。その場合は、次の手順に従ってください:

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまりロール・マッピング・プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. MDFのすべてのカスタム操作に対して、メソッド・スタブを使用してメソッドを実装します。

  4. ファイルを保存します。

  5. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

既存のMBeanタイプの更新ですか。その場合は、次の手順に従ってください:

  1. WebLogic MBeanMakerによって現在のメソッドの実装が上書きされないように、既存のMBean実装ファイルを一時ディレクトリにコピーします。

  2. 新しいDOSシェルを作成します。

  3. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまりロール・マッピング・プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  4. MDFを変更して元のMDFにはないカスタム操作を含めた場合、メソッド・スタブを使用してメソッドを実装します。

  5. 完成した、つまりすべてのメソッドを実装したMBean実装ファイルを保存します。

  6. このMBean実装ファイルを、WebLogic MBeanMakerがMBeanタイプの実装ファイルを配置したディレクトリにコピーします。このディレクトリは、手順3でfilesdirとして指定したものです。(ステップ3の結果としてWebLogic MBeanMakerで生成されたMBean実装ファイルがオーバーライドされます)。

  7. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

生成されるMBeanインタフェース・ファイルについて

MBeanインタフェース・ファイルとは、ランタイム・クラスまたはMBean実装が構成データを取得するために使用するMBeanのクライアント側APIです。「「Provider」SSPIの目的について」で説明されているように、これはinitializeメソッドで使用するのが一般的です。

WebLogic MBeanMakerでは、作成済のMDFからMBeanタイプを生成するので、生成されるMBeanインタフェース・ファイルの名前は、そのMDF名の後に「MBean」というテキストが付いたものになります。たとえば、WebLogic MBeanMakerでSampleRoleMapper MDFを実行すると、SampleRoleMapperMBean.javaというMBeanインタフェース・ファイルが生成されます。

WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

WebLogic MBeanMakerでMDFを実行して中間ファイルを作成し、MBean実装ファイルを編集して適切なメソッドの実装を提供したら、カスタム・ロール・マッピング・プロバイダのMBeanファイルとランタイム・クラスをMBean JARファイル(MJF)にパッケージ化する必要があります。このプロセスも、WebLogic MBeanMakerによって自動化されます。

カスタム・ロール・マッピング・プロバイダのMJFを作成するには、次の手順に従います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMJF=jarfile -Dfiles=filesdir weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMJFフラグはWebLogic MBeanMakerが新しいMBeanタイプを含むJARファイルを構築すべきであることを示し、jarfileはMJFの名前、filesdirはWebLogic MBeanMakerでMJFにJAR化する対象ファイルが存在する場所を示します。

    この時点でコンパイルが行われるので、エラーが発生するおそれがあります。jarfileが指定されていて、エラーが発生しなかった場合には、指定された名前のMJFが作成されます。


    注意:

    カスタム・セキュリティ・プロバイダのJARファイルを作成する際には、一連のXMLバインディング・クラスと1つのスキーマも生成されます。そのスキーマに関連付けるネームスペースを選択できます。それにより、使用しているカスタム・クラスとOracleのカスタム・クラスとの競合を防ぐことができます。ネームスペースのデフォルトはvendorです。-targetNameSpace引数をWebLogicMBeanMakerまたは関連するWLMBeanMaker antタスクに渡すことで、このデフォルトを変更できます。

    既存のMJFを更新する場合は、単純にMJFを削除して再生成します。WebLogic MBeanMakerにも -DIncludeSourceオプションがあり、それを指定すると、生成されるMJFにソース・ファイルを含めるかどうかを制御できます。ソース・ファイルには、生成されたソースとMDFそのものがあります。デフォルトはfalseです。このオプションは、-DMJFを使用しない場合には無視されます。


生成されたMJFは、自らのWebLogic Server環境にインストールすることも、顧客に配布してそれぞれのWebLogic Server環境にインストールしてもらうこともできます。

WebLogic Server環境にMBeanタイプをインストールする

MBeanタイプをWebLogic Server環境にインストールするには、MJFをWL_HOME\server\lib\mbeantypesディレクトリにコピーします。ここで、WL_HOMEはWebLogic Serverの最上位のインストール・ディレクトリです。このインストール・コマンドによって、カスタム・ロール・マッピング・プロバイダが「デプロイ」されます。つまり、カスタム・ロール・マッピング・プロバイダをWebLogic Server管理コンソールから管理できるようになります。


注意:

MBeanタイプをインストールするデフォルトのディレクトリは、WL_HOME\server\lib\mbeantypesです。初めて使用するバージョンが9.0の場合、セキュリティ・プロバイダは...\domaindir\lib\mbeantypesからもロードできます。ただし、サーバーを起動するときに-Dweblogic.alternateTypesDirectory=<dir>コマンドライン・フラグを使用すれば、WebLogic Serverが追加ディレクトリでMBeanタイプを検索します。<dir>は、ディレクトリ名のカンマ区切りのリストです。このフラグを使用する場合、WebLogic Serverは常に最初にWL_HOME\server\lib\mbeantypesからMBeanタイプをロードします。その後で、追加ディレクトリにあるすべての有効なアーカイブを検索して、ロードします。このとき拡張子は考慮されません。

たとえば、-Dweblogic.alternateTypesDirectory = dirX,dirYの場合、WebLogic ServerはまずWL_HOME\server\lib\mbeantypesからMBeanタイプをロードし、次にdirXおよびdirYにある有効なアーカイブをロードします。WebLogic Serverに追加ディレクトリでMBeanタイプを検索するよう指示する際に、Javaセキュリティ・マネージャを使用している場合は、weblogic.policyファイルを更新して、MBeanタイプ(その結果として、カスタム・セキュリティ・プロバイダ)に適した許可を付与することも必要になります。詳細は、『Oracle WebLogic Serverセキュã‰2v̓ªãƒ†ã‚£ã®ãƒ—ログラミング』のJavaセキュリティを使用したWebLogicリソースの保護に関する項を参照してください。


カスタム・ロール・マッピング・プロバイダを構成することによって(「管理コンソールによるカスタム・ロール・マッピング・プロバイダの構成」を参照)、MBeanタイプのインスタンスを作成して、GUI、他のJavaコード、またはAPIからそれらのMBeanインスタンスを使用することができます。たとえば、WebLogic Server管理コンソールを使用して、属性を取得/設定したり操作を呼び出したりすることもできますし、他のJavaオブジェクトを開発して、そのオブジェクトでMBeanをインスタンス化し、それらのMBeanから提供される情報に自動的に応答させることもできます。なお、これらのMBeanインスタンスをバックアップしておくことをお薦めします。

管理コンソールによるカスタム・ロール・マッピング・プロバイダの構成

カスタム・ロール・マッピング・プロバイダを構成するということは、ロール・マッピング・サービスを必要とするアプリケーションがアクセス可能なセキュリティ・レルムにカスタム・ロール・マッピング・プロバイダを追加するということです。

カスタム・セキュリティ・プロバイダの構成は管理タスクですが、カスタム・セキュリティ・プロバイダの開発者が行うこともできます。この節では、カスタム・ロール・マッピング・プロバイダの構成担当者向けの重要な情報を取り上げます。

ロール・マッピング・プロバイダとデプロイメント記述子の管理

Enterprise JavaBeans (EJB)やWebアプリケーションなどのアプリケーションの中には、Java EEの関連デプロイメント情報とWebLogic Serverデプロイメント記述子を格納するものがあります。Webアプリケーションの場合、デプロイメント記述子ファイル(web.xmlとweblogic.xml)には、セキュリティ・ロールを含むJava EEセキュリティ・モデルの実装情報が格納されます。この情報は、WebLogic Server管理コンソールでロール・マッピング・プロバイダを初めて構成するときに格納するのが一般的です。

Java EEプラットフォームはデプロイメント記述子でWebアプリケーションおよびEJBのセキュリティを標準化しているので、WebLogic Serverではこの標準メカニズムがWebLogicセキュリティ・サービスに統合され、WebアプリケーションおよびEJBリソースを保護する方法を選択できるようになっています。デプロイメント記述子のみを使用することも管理コンソールのみを使用することもできます。また、状況によっては、この2つの方法を組み合わせることもできます。

選択した方法によって、セキュリティ・モデルを適用する必要もあります。WebLogicでは、個々のデプロイメントについて複数のセキュリティ・モデルがサポートされ、使用する方法を組み込むレルム全体の構成についてはセキュリティ・モデルがサポートされます。

詳細は、『Oracle WebLogic Serverロールおよびポリシーによるリソースの保護』のEJBおよびWebアプリケーション・リソースの保護のオプションに関する項を参照してください。

デプロイメント記述子を使用するように構成すると、WebLogic Serverによりweb.xmlおよびweblogic.xmlデプロイメント記述子ファイルからセキュリティ・ロール情報が読み込まれます(web.xmlファイルとweblogic.xmlファイルの例については、例9-6と例9-7を参照)。この情報は、ロール・マッピング・プロバイダのセキュリティ・プロバイダ・データベースにコピーされます。

例9-6 web.xmlファイルのサンプル

<web-app> 
   <welcome-file-list> 
      <welcome-file>welcome.jsp</welcome-file> 
   </welcome-file-list> 
   <security-constraint> 
      <web-resource-collection>
         <web-resource-name>Success</web-resource-name>
         <url-pattern>/welcome.jsp</url-pattern>
         <http-method>GET</http-method> 
         <http-method>POST</http-method> 
      </web-resource-collection> 
      <auth-constraint> 
         <role-name>developers</role-name> 
      </auth-constraint> 
   </security-constraint> 
   <login-config> 
       <auth-method>BASIC</auth-method> 
       <realm-name>default</realm-name> 
   </login-config> 
   <security-role> 
      <role-name>developers</role-name> 
   </security-role> 
</web-app>

例9-7 weblogic.xmlファイルのサンプル

<weblogic-web-app> 
   <security-role-assignment> 
      <role-name>developers</role-name>
      <principal-name>myGroup</principal-name> 
   </security-role-assignment> 
</weblogic-web-app>

セキュリティ・ロール・デプロイメントの有効化

カスタム・ロール・マッピング・プロバイダの開発の一環としてDeployableRoleProviderV2 SSPIを実装し、デプロイ可能なセキュリティ・ロールをサポートする場合、カスタム・ロール・マッピング・プロバイダの構成担当者(つまり、開発者または管理者)は、WebLogic Server管理コンソールで「ロール・デプロイメントを有効化」ボックスがチェックされていることを確認する必要があります。チェックがはずれていると、ロール・マッピング・プロバイダに対するデプロイメントは「オフ」と見なされます。このため、複数のロール・マッピング・プロバイダが構成されている場合、「ロール・デプロイメントを有効化」ボックスを使用して、セキュリティ・ロールのデプロイメントに使用するロール・マッピング・プロバイダを指定できます。

セキュリティ・ロールを管理するためのメカニズムの提供

WebLogic Server管理コンソールを使用してカスタム・ロール・マッピング・プロバイダを構成すると、必要なロール・マッピング・サービスにアプリケーションからアクセスできるようにすることはできますが、このセキュリティ・プロバイダに関連付けられたセキュリティ・ロールを管理する方法を管理者にも提供する必要があります。たとえばWebLogicロール・マッピング・プロバイダには、ロール・エディタ・ページが管理者向けに用意されており、様々なWebLogicリソースのセキュリティ・ロールを追加、変更、または削除することができます。

カスタム・ロール・マッピング・プロバイダを開発すると、管理者はロール・エディタ・ページも右クリック・メニューも利用できません。したがって、セキュリティ・ロールを管理するための独自のメカニズムを提供する必要があります。このメカニズムでは、カスタム・ロール・マッピング・プロバイダのデータベースのセキュリティ・ロール・データ(つまり式)を読み書きできなければなりません。

それには、以下の2通りの方法があります。

オプション1 :セキュリティ・ロール管理用のスタンドアロン・ツールの開発

WebLogic Server管理コンソールとまったく別のツールを開発する場合には、この方法を選択します。

この方法では、カスタム・ロール・マッピング・プロバイダ向けにコンソール拡張を作成する必要も、管理MBeanを開発する必要もありません。ただし、ツールでは以下のことを行う必要があります。

  1. WebLogicリソースのIDを特定します。IDがコンソール拡張によって自動的に提供されないためです。詳細については、「WebLogicリソース識別子」を参照してください。

  2. セキュリティ・ロールを構成する式を表す方法を決定します。この表現は完全に任意であり、文字列である必要はありません。

  3. カスタム・ロール・マッピング・プロバイダのデータベースの式を読み書きします。

オプション2 : 管理コンソールに既存のセキュリティ・ロール管理ツールの統合

WebLogic Server管理コンソールとは別のツールを持っており、それを管理コンソールから起動する場合には、この方法を選択します。

この方法の場合、ツールでは以下のことを行う必要があります。

  1. WebLogicリソースのIDを特定します。IDがコンソール拡張によって自動的に提供されないためです。詳細については、「WebLogicリソース識別子」を参照してください。

  2. セキュリティ・ロールを構成する式を表す方法を決定します。この表現は完全に任意であり、文字列である必要はありません。

  3. カスタム・ロール・マッピング・プロバイダのデータベースの式を読み書きします。

  4. 『Oracle WebLogic Server管理コンソールの拡張』で説明されているように、基本的なコンソール拡張手法を使用して管理コンソールにリンクします。

PK•þ{Q²‰²PKÛ°-A OEBPS/ia.htm€ÿ IDアサーション・プロバイダ

5 IDアサーション・プロバイダ

この章では、IDアサーション・プロバイダの概念と機能、およびカスタムIDアサーション・プロバイダの開発手順について説明します。

IDアサーション・プロバイダは、ユーザーまたはシステム・プロセスがトークンを使用してそれぞれのIDを証明する特殊な形態(つまり境界認証)の認証プロバイダです。IDアサーション・プロバイダは境界認証を有効にし、シングル・サインオンをサポートします。IDアサーション・プロバイダ用のLoginModuleを作成すれば、認証プロバイダの代わりにIDアサーション・プロバイダを使用できます。また、認証プロバイダのLoginModuleを使用する場合は、認証プロバイダに加えてIDアサーション・プロバイダも使用できます。

IDアサーション・プロバイダを認証プロバイダとは別に構成できるようにするには、2つのプロバイダを作成します。IDアサーション・プロバイダと認証プロバイダが独立して機能できない場合は、1つのプロバイダを作成します。

以下の節では、IDアサーション・プロバイダの概念と機能、およびカスタムIDアサーション・プロバイダの開発手順について説明します。

IDアサーションの概念

IDアサーション・プロバイダを開発する前に、以下の概念を理解しておく必要があります。

IDアサーション・プロバイダとLoginModule

LoginModuleと一緒に用いると、IDアサーション・プロバイダはシングル・サインオンをサポートします。たとえば、IDアサーション・プロバイダはデジタル証明書からトークンを生成することができ、そのトークンをシステム内で回すことができるため、ユーザーは何度もサインオンを求められることはありません。

IDアサーション・プロバイダが使用するLoginModuleでは、以下のことが可能です。

単純認証の場合と違って(「認証プロセス」を参照)、IDアサーション・プロバイダが使用するLoginModuleは証明情報(ユーザー名やパスワードなど)を検証しません(単にユーザーが存在することを検証するだけです)。

この構成のLoginModuleは以下の処理を行う必要があります。

  • WLSGroup型などの必須のプリンシパルをサブジェクトに格納します。

  • ユーザーがログインのための十分な証明を提供していると見なし、パスワードなどの証明データを要求しません。

「AuthenticationProviderV2 SSPIの実装」の説明に従って、カスタム認証プロバイダにAuthenticationProviderV2.getAssertionModuleConfigurationメソッドを実装する必要があります。このメソッドは、X.509証明書の使用時などに、IDアサーションがデプロイメント記述子のrun-asタグを処理するために呼び出されます。他のシングル・サインオン方式でも、このメソッドを使用します。


注意:

LoginModuleの詳細は、「LoginModule」を参照してください。


IDアサーションとトークン

IDアサーション・プロバイダは、ユーザーまたはシステム・プロセスのIDを断定するために使用する特定のトークン・タイプをサポートするために開発します。IDアサーション・プロバイダは複数のトークン・タイプをサポートするように開発できますが、通常はただ1つの「アクティブ」なトークン・タイプを検証するように構成されます。同じトークン・タイプを検証する機能を備えた複数のIDアサーション・プロバイダを1つのセキュリティ・レルムに組み込むことも可能ですが、実際に検証を行うのは1つのIDアサーション・プロバイダだけです。


注意:

トークン・タイプを「サポート」するということは、IDアサーション・プロバイダのランタイム・クラス(IdentityAsserter SSPI実装)がそのassertIdentityメソッドでトークン・タイプを検証できるということです。詳細は、「IdentityAsserterV2 SSPIの実装」を参照してください。


以下の節では、新しいトークン・タイプを使用するための手順について説明します。

新しいトークン・タイプの作成方法

カスタムIDアサーション・プロバイダを開発する場合には、新しいトークン・タイプも作成できます。トークン・タイプとは、文字列で表される1つのデータに過ぎません。どのようなトークン・タイプを作成して使用するかは、完全にユーザーに任されています。たとえば、現在WebLogic IDアサーション・プロバイダ用に定義されているトークンには、AuthenticatedUser、X.509、CSI.PrincipalName、CSI.ITTAnonymous、CSI.X509CertChain、CSI.DistinguishedName、wsse:PasswordDigestなど、様々なタイプがあります。

新しいトークン・タイプを作成するには、例5-1に示すとおり、新しいJavaファイルを作成し、String型の変数として新しいトークン・タイプを宣言します。PerimeterIdentityAsserterTokenTypes.javaファイルでは、Test 1、Test 2、およびTest 3というトークン・タイプの名前が文字列として定義されています。

例5-1 PerimeterIdentityAsserterTokenTypes.java

package sample.security.providers.authentication.perimeterATN;
public class PerimeterIdentityAsserterTokenTypes
{
   public final static String TEST1_TYPE = 'Test 1";
   public final static String TEST2_TYPE = 'Test 2";
   public final static String TEST3_TYPE = 'Test 3";
}

注意:

新しいトークン・タイプを1つだけ定義する場合は、例5-4で示されているようにIDアサーション・プロバイダのランタイム・クラスで行うこともできます。


新しいトークン・タイプをIDアサーション・プロバイダの構成で利用可能にする方法

カスタムIDアサーション・プロバイダを構成する場合(「管理コンソールによるカスタムIDアサーション・プロバイダの構成」を参照)、IDアサーション・プロバイダのサポートするトークン・タイプのリストが「サポートされている種類」フィールドに表示されます。図5-1に示すとおり、サポートされているタイプの1つを「アクティブな種類」フィールドに入力します。

図5-1 サンプルIDアサーション・プロバイダの構成

図5-1の説明が続きます
「図5-1 サンプルIDアサーション・プロバイダの構成」の説明

「サポートされている種類」フィールドの内容は、カスタムIDアサーション・プロバイダのMBeanタイプを生成するために使用するMBean定義ファイル(MDF)のSupportedTypes属性から取得されます。サンプルIDアサーション・プロバイダの例を例5-2に示します。(MDFおよびMBeanタイプの詳細については、「WebLogic MBeanMakerを使用してMBeanタイプを生成する」を参照)。

例5-2 SampleIdentityAsserter MDF : SupportedTypes属性

<MBeanType>
...
   <MBeanAttribute 
    Name = "SupportedTypes"
    Type = "java.lang.String[]"
    Writeable = "false"
    Default = "new String[] {&quot;SamplePerimeterAtnToken&quot;}"
   />
...
</MBeanType>

同様に、「アクティブな種類」フィールドの内容はMBean定義ファイル(MDF)のActiveTypes属性から取得されます。MDFファイルのActiveTypes属性をデフォルトに設定すると、WebLogic Server管理コンソールで手動設定する必要がなくなります。サンプルIDアサーション・プロバイダの例を例5-3に示します。

例5-3 SampleIdentityAsserter MDF: Defaultを使用したActiveTypes属性

<MBeanAttribute 
 Name= "ActiveTypes"
 Type= "java.lang.String[]"
 Default = "new String[] { &quot;SamplePerimeterAtnToken&quot; }"
/>

ActiveTypes属性のデフォルト化は便利ですが、他のIDアサーション・プロバイダがそのトークン・タイプを検証することがない場合にのみ行うようにします。その場合以外は、無効なセキュリティ・レルムが構成されることになるおそれがあります(複数のIDアサーション・プロバイダが同じトークン・タイプを検証しようとします)。一番良いのは、IDアサーション・プロバイダのすべてのMDFがデフォルトでそのトークン・タイプをオフにすることです。その場合、そのトークン・タイプを検証するIDアサーション・プロバイダを構成して手作業でアクティブにすることができます。


注意:

IDアサーション・プロバイダが目的のトークン・タイプを検証して受け入れるように開発および構成されていない場合、認証プロセスは失敗します。IDアサーション・プロバイダの構成の詳細は、「管理コンソールによるカスタムIDアサーション・プロバイダの構成」を参照してください。


境界認証用のトークンの渡し

IDアサーション・プロバイダは、境界認証のためにJavaクライアントからサーブレットにトークンを渡すことができます。トークンは、HTTPヘッダー、Cookie、SSL証明書などのメカニズムを用いて渡すことができます。たとえば、HTTPヘッダーを使用すれば、Base64でコード化された文字列(バイナリ・データの送信が可能)をサーブレットに送信することができます。この文字列の値は、ユーザー名などのユーザーのIDを表す文字列です。境界認証に使用されるIDアサーション・プロバイダは、その文字列を受け取り、そこからユーザー名を抽出できます。

トークンがHTTPヘッダーまたはCookieを通じて渡される場合には、そのトークンはヘッダーまたはCookieの名前に等しく、リソース・コンテナはWebLogicセキュリティ・フレームワークの認証を処理するパートにトークンを渡します。WebLogicセキュリティ・フレームワークは、そのトークンをそのままIDアサーション・プロバイダに渡します。

WebLogic Serverは、IDアサーションのサポートを介して境界までシングル・サインオン概念を拡張できるよう設計されています。IDアサーションを使用すると、WebLogic Serverは、SAML (Security Assertion Markup Language)、SPNEGO (Simple and Protected GSS-API Negotiation)、またはCommon Secure Interoperability (CSI) v2などのプロトコルに対する拡張といった境界認証方式によって提供される認証メカニズムを使用して、この機能を実現できます。

Common Secure Interoperability Version 2 (CSIv2)

WebLogic Serverでは、IIOP (Internet Inter-ORB) (GIOPバージョン1.2)およびCORBA CSIv2 (Common Secure Interoperability version 2)仕様に基づいたEJB (Enterprise JavaBean)相互運用性プロトコルをサポートしています。WebLogic ServerでCSIv2をサポートすることにより、以下のことが可能になります。

  • Java EE (Java 2 Enterprise Edition)バージョン1.4の参照実装と相互運用できます。

  • WebLogic Server IIOPクライアントでT3クライアントの場合と同じようにユーザー名とパスワードを指定できるようになります。

  • GSSAPI (Generic Security Services Application Programming Interface)初期コンテキスト・トークンをサポートできるようになります。今回のリリースでは、ユーザー名/パスワードとGSSUP (Generic Security Services Username Password)トークンのみがサポートされています。


    注意:

    WebLogic ServerにおけるCSIv2実装は、Java EE CTS (Compatibility Test Suite)適合性テストに合格しています。


CSIv2実装への外部インタフェースは、CORBAオブジェクトのユーザー名とパスワードを取得するJAAS LoginModuleです。JAAS LoginModuleは、WebLogic Javaクライアント、あるいは別のJava EEアプリケーション・サーバーに対するクライアントの役目をするWebLogic Serverインスタンスで使用することができます。CSIv2サポート用のJAAS LoginModuleはUsernamePasswordLoginModuleという名前で、weblogic.security.auth.loginパッケージに格納されています。

CSIv2は以下のように動作します。

  1. IOR (Interoperable Object Reference)へのセキュリティ拡張機能の作成時に、WebLogic Serverは、CORBAオブジェクトでサポートされるセキュリティ・メカニズムを識別するタグ付きコンポーネントを追加します。このタグ付きコンポーネントには、トランスポート情報、クライアント認証情報、およびID証明トークン/認可トークン情報が入っています。

  2. クライアントは、IOR内のセキュリティ・メカニズムを評価し、サーバーが必要とするオプションをサポートするメカニズムを選択します。

  3. クライアントはSASプロトコルを用いて、WebLogic Serverとのセキュリティ・コンテキストを確立します。SASプロトコルはリクエストとレスポンスからなるサービス・コンテキスト内に含まれるメッセージを定義します。コンテキストはステートフルでもステートレスでもかまいません。

CSIv2の利用については、『Oracle WebLogic Serverのセキュリティの理解』のCommon Secure Interoperability Version 2に関する項を参照してください。JAAS LoginModuleの詳細は、「LoginModule」を参照してください。

IDアサーション・プロセス

境界認証では、WebLogic Serverの外部にあるシステムがトークンを通じて信頼を確立します(これは、WebLogic Serverがユーザー名とパスワードを通じて信頼を確立する、「認証プロセス」で説明されているタイプの認証とは対照的です)。IDアサーション・プロバイダは、下記の図のように機能する境界認証プロセスの一部として使用されます(図5-2を参照)。

  1. WebLogic Serverの外部のトークンが、そのタイプのトークンの検証を担当し、「アクティブ」として構成されているIDアサーション・プロバイダに渡されます。

  2. そのトークンの有効性が問題なく検証されれば、IDアサーション・プロバイダはそのトークンをWebLogic Serverユーザー名にマップし、そのユーザー名をWebLogic Serverに送り返します。その後WebLogic Serverでは、「認証プロセス」で説明した方法で認証プロセスを続行します。具体的には、ユーザー名がJAAS (Java Authentication and Authorization Service) CallbackHandlerを介して送信され、構成済の各認証プロバイダのLoginModuleに渡されるので、LoginModuleでは、適切なプリンシパルをサブジェクトに格納できるようになります。

図5-2でも示されているように、境界認証では「認証プロセス」で説明されている認証プロセスと同じ構成要素が必要ですが、そこにIDアサーション・プロバイダも追加されます。

カスタムIDアサーション・プロバイダを開発する必要があるか

WebLogic IDアサーション・プロバイダでは、X509証明書を使用した証明書認証、SPNEGOトークン、SAMLアサーション・トークン、およびCSIv2 (CORBA Common Secure Interoperability Version 2) IDアサーションがサポートされています。

LDAP X509 IDアサーション・プロバイダは、X509証明書を受け取り、その証明書に関連付けられたユーザーのLDAPオブジェクトをルックアップして、LDAPオブジェクトの証明書が提示された証明書と一致することを確認し、LDAPオブジェクトから認証用にユーザーの名前を取得します。

ネゴシエーションIDアサーション・プロバイダは、SPNEGOプロトコルをサポートするMicrosoftクライアントでのSSOに使用します。ネゴシエーションIDアサーション・プロバイダは、SPNEGOトークンをデコードしてKerberosトークンを入手し、このKerberosトークンを検証してWebLogicユーザーにマップします。ネゴシエーションIDアサーション・プロバイダは、Kerberosを介したGSSのセキュリティ・コンテキストの受け入れにJava GSS (Generic Security Service) API (Application Programming Interface)を利用します。ネゴシエーションIDアサーション・プロバイダは、Windows NT統合ログイン用です。

SAML IDアサーション・プロバイダは、WebLogic ServerがSAML宛先サイトとして動作するときにSAMLアサーション・トークンを処理します。SAML IDアサーション・プロバイダは、SAMLアサーション・トークンを消費および検証し、アサーションを信頼するかどうかを決定します(SOAPメッセージの証明データ、クライアント証明書、またはその他の構成インジケータを使用)。

デフォルトのWebLogic IDアサーション・プロバイダはトークン・タイプを検証し、X509デジタル証明書とX501識別名をWebLogicユーザー名にマップします。また、CSIv2 IDアサーションに使用する信頼性のあるクライアント・プリンシパルのリストも指定します。ワイルドカード文字(*)を使用すると、すべてのプリンシパルに信頼性があると指定できます。クライアントが信頼性のあるクライアント・プリンシパルのリストにない場合は、CSIv2 IDアサーションが失敗し、呼出しが拒否されます。


注意:

X.501およびX.509証明書に対してWebLogic IDアサーション・プロバイダを使用するには、WebLogic Server製品に付属しているデフォルトのユーザー名マッパー(weblogic.security.providers.authentication.DefaultUserNameMapperImpl)を使用するか、または独自のweblogic.security.providers.authentication.UserNameMapperインタフェースの実装を用意するかのいずれかの方法があります。

このインタフェースは、必要に応じた方式に従って、X.509証明書をWebLogic Serverのユーザー名にマップします。また、このインタフェースを使用してX.501識別名をユーザー名にマップすることもできます。管理コンソールを使用してIDアサーション・プロバイダを構成するときに、このインタフェースの実装を指定します。


WebLogic IDアサーション・プロバイダでは、以下のトークン・タイプがサポートされています。

  • AU_TYPE - WebLogic AuthenticatedUserがトークンとして使用される場合に使用します。

  • X509_TYPE - X509クライアント証明書がトークンとして使用される場合に使用します。

  • CSI_PRINCIPAL_TYPE - CSIv2プリンシパル名IDがトークンとして使用される場合に使用します。

  • CSI_ANONYMOUS_TYPE - CSIv2匿名IDがトークンとして使用される場合に使用します。

  • CSI_X509_CERTCHAIN_TYPE - CSIv2 X509証明書チェーンIDがトークンとして使用される場合に使用します。

  • CSI_DISTINGUISHED_NAME_TYPE - CSIv2識別名IDがトークンとして使用される場合に使用します。

  • AUTHORIZATION_NEGOTIATE - SPNEGO内部トークンがトークンとして使用される場合に使用します。

  • SAML_ASSERTION_B64_TYPE - Base64エンコードSAML.アサーションがトークンとして使用される場合に使用します。

  • SAML_ASSERTION_DOM_TYPE - SAML DOM要素がトークンとして使用される場合に使用します。

  • SAML_ASSERTION_TYPE - SAML文字列XML形式がトークンとして使用される場合に使用します。

  • SAML2_ASSERTION_DOM_TYPE - SAML2 DOM要素がトークンとして使用される場合に使用します。

  • SAML2_ASSERTION_TYPE - SAML2文字列XML形式がトークンとして使用される場合に使用します。

  • SAML_SSO_CREDENTIAL_TYPE - TARGETパラメータで構成されるSAML文字列がアサーション自体と連結され、トークンとして使用される場合に使用します。

  • WSSE_PASSWORD_DIGEST_TYPE - パスワード・ダイジェストのパスワード・タイプを持つユーザー名トークンがトークンとして使用される場合に使用します。

  • WWW_AUTHENTICATE_NEGOTIATE - SPNEGO内部トークンがトークンとして使用される場合に使用します。

追加的なIDアサーション・タスクを実行したい場合、または新しいトークン・タイプを作成したい場合は、カスタムIDアサーション・プロバイダを開発する必要があります。

カスタムIDアサーション・プロバイダの開発方法

WebLogic IDアサーション・プロバイダが開発者のニーズを満たさない場合、次の手順でカスタムIDアサーション・プロバイダを開発することができます。

  1. 適切なSSPIによるランタイム・クラスの作成

  2. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  3. 管理コンソールによるカスタムIDアサーション・プロバイダの構成

  4. 「チャレンジIDアサーション」の説明に従って、チャレンジIDアサーションを実装する必要があるかどうかを考慮します。

適切なSSPIによるランタイム・クラスの作成

ランタイム・クラスを作成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタムIDアサーション・プロバイダのランタイム・クラスを作成します。

カスタムIDアサーション・プロバイダのランタイム・クラスの作成例については、「例:サンプルIDアサーション・プロバイダのランタイム・クラスの作成」を参照してください。

AuthenticationProviderV2 SSPIの実装


注意:

AuthenticationProvider SSPIは、このリリースのWebLogic Serverでは非推奨になっています。AuthenticationProviderV2 SSPIをかわりに使用してください。


AuthenticationProviderV2 SSPIを実装するには、「「Provider」SSPIの目的について」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • getLoginModuleConfiguration

    public AppConfigurationEntry getLoginModuleConfiguration()
    

    getLoginModuleConfigurationメソッドは、認証プロバイダの関連付けられたLoginModuleに関する情報を取得します。その情報は、AppConfigurationEntryとして返されます。AppConfigurationEntryは、LoginModuleのクラス名、認証プロバイダの関連するMBeanを通じて渡されたLoginModuleの制御フラグ、および他の構成情報をLoginModuleに渡すことを可能にするLoginModuleの構成オプション・マップの格納されたJAAS (Java Authentication and Authorization Service)クラスです。

    (javax.security.auth.loginパッケージ内にある)AppConfigurationEntryクラスとLoginModuleの制御フラグ・オプションの詳細は、Java SE 6.0 API仕様のAppConfigurationEntryクラス(http://download.oracle.com/javase/6/docs/api/javax/security/auth/login/AppConfigurationEntry.html)およびConfigurationクラス(http://download.oracle.com/javase/6/docs/api/javax/security/auth/login/Configuration.html)を参照してください。LoginModuleの詳細は、「LoginModule」を参照してください。セキュリティ・プロバイダとMBeanの詳細は、「MBeanタイプが必要な理由について」を参照してください。

  • getAssertionModuleConfiguration

    public AppConfigurationEntry
    getAssertionModuleConfiguration()
    

    getAssertionModuleConfigurationメソッドは、IDアサーション・プロバイダの関連付けられたLoginModuleに関する情報を取得します。その情報は、AppConfigurationEntryとして返されます。AppConfigurationEntryは、LoginModuleのクラス名、IDアサーション・プロバイダの関連するMBeanを通じて渡されたLoginModuleの制御フラグ、および他の構成情報をLoginModuleに渡すことを可能にするLoginModuleの構成オプション・マップの格納されたJAASクラスです。

    この構成のLoginModuleは、WLSGroup型などの必須のプリンシパルをサブジェクトに格納する必要があります。また、ユーザーがログインのための十分な証明を提供していると見なし、パスワードなどの証明データを要求しません。


    注意:

    IDアサーション・プロバイダのassertIdentity()メソッドは、IDアサーションが発生するたびに呼び出されますが、サブジェクトがキャッシュされている場合、LoginModuleは呼び出されないことがあります。-Dweblogic.security.identityAssertionTTLフラグを使うと、この動作を変更する(たとえば、5分というデフォルトTTLを変更する、またはフラグを -1に設定してキャッシュを無効にする)ことができます。

    トークンが有効なだけでなく、ユーザーも引続き有効であること(ユーザーが削除されていないことなど)を確認するのは、IDアサーション・プロバイダの役割です。


  • getPrincipalValidator

    public PrincipalValidator getPrincipalValidator()
    

    getPrincipalValidatorメソッドは、プリンシパル検証プロバイダのランタイム・クラス(PrincipalValidator SSPI実装)の参照を取得します。詳細については、第6章「プリンシパル検証プロバイダ」を参照してください。

  • getIdentityAsserter

    public IdentityAsserterV2 getIdentityAsserter()
    

    getIdentityAsserterメソッドは、IDアサーション・プロバイダのランタイム・クラス(IdentityAsserterV2 SSPI実装)の参照を取得します。詳細は、「IdentityAsserterV2 SSPIの実装」を参照してください。


    注意:

    IDアサーション・プロバイダ用のLoginModuleが既存の認証プロバイダ用のLoginModuleと同じである場合、IDアサーション・プロバイダ用のAuthenticationProviderV2 SSPI内のメソッドの実装(getIdentityAsserterメソッドを除く)はnullを戻す場合があります。この場合の例については、例5-4に示します。


AuthenticationProvider SSPIと前述のメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

IdentityAsserterV2 SSPIの実装


注意:

IdentityAsserterV2 SSPIには、追加のトークン・タイプと、IDアサーション時に必要に応じて追加情報の取得に使用できるassertIdentityメソッドに対するhandlerパラメータが含まれます。IdentityAsserter SSPIもサポートされていますが、かわりにIdentityAsserterV2 SSPIの使用を検討してください。


IdentityAsserterV2 SSPIを実装するには、次のメソッドの実装を提供する必要があります。

  • assertIdentity

    public CallbackHandler assertIdentity(String type, Object token, ContextHandler handler) throws IdentityAssertionException;
    

    assertIdentityメソッドは、提供されたトークンのID情報に基づいてIDを断定します。言い換えれば、このメソッドの目的は、現時点で「信頼性のない」トークンがあれば、それを信頼性のあるクライアント・プリンシパルに照らし合わせて検証することです。typeパラメータは、IDアサーション(IDの断定)に使用するトークン・タイプを表します。IDアサーション・タイプでは、大文字/小文字は区別されません。また、tokenパラメータには実際のID情報が格納されています。handlerパラメータは、IDアサーションで使用可能な追加情報を取得する際に必要に応じて使用できるContextHandlerオブジェクトです。assertIdentityメソッドから返されるCallbackHandlerは、断定されたユーザー名を格納している必要があり、プリンシパル・マッピングを行うために構成されているすべての認証プロバイダのLoginModuleに渡されます。CallbackHandlerがnullの場合、匿名ユーザーを使用することを意味します。

    CallbackHandlerは、可変個の引数を複合オブジェクトとしてメソッドに渡すことができるようにする高度に柔軟なJAAS規格です。CallbackHandlerの詳細は、Java SE 6.0 API仕様のCallbackHandlerインタフェース(http://download.oracle.com/javase/6/docs/api/javax/security/auth/callback/CallbackHandler.html)を参照してください。


    注意:

    IDアサーション・プロバイダのassertIdentity()メソッドは、IDアサーションが発生するたびに呼び出されますが、サブジェクトがキャッシュされている場合、LoginModuleは呼び出されないことがあります。-Dweblogic.security.identityAssertionTTLフラグを使うと、この動作を変更する(たとえば、5分というデフォルトTTLを変更する、またはフラグを -1に設定してキャッシュを無効にする)ことができます。

    トークンが有効なだけでなく、ユーザーも引続き有効であること(ユーザーが削除されていないことなど)を確認するのは、IDアサーション・プロバイダの役割です。


IdentityAsserterV2 SSPIと前述のメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

例:サンプルIDアサーション・プロバイダのランタイム・クラスの作成

例5-4は、サンプルIDアサーション・プロバイダのランタイム・クラスであるSampleIdentityAsserterProviderImpl.javaクラスを示しています。このランタイム・クラスには次の実装が含まれています。

  • initialize、getDescription、およびshutdownというSecurityProviderインタフェースから継承した3つのメソッド(「「Provider」SSPIの目的について」を参照)。

  • getLoginModuleConfiguration、getAssertionModuleConfiguration、getPrincipalValidator、およびgetIdentityAsserterというAuthenticationProviderV2 SSPIの4つのメソッド(「AuthenticationProviderV2 SSPIの実装」を参照)。

  • assertIdentityというIdentityAsserterV2 SSPIのメソッド(「IdentityAsserterV2 SSPIの実装」を参照)。


    注意:

    例5-4の太字のコードは、クラス宣言とメソッド・シグネチャを示しています。


例5-4 SampleIdentityAsserterProviderImpl.java

package examples.security.providers.identityassertion.simple;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.AppConfigurationEntry;
import weblogic.management.security.ProviderMBean;
import weblogic.security.service.ContextHandler;
import weblogic.security.spi.AuthenticationProviderV2;
import weblogic.security.spi.IdentityAsserterV2;
import weblogic.security.spi.IdentityAssertionException;
import weblogic.security.spi.PrincipalValidator;
import weblogic.security.spi.SecurityServices;
public final class SimpleSampleIdentityAsserterProviderImpl implements AuthenticationProviderV2,
IdentityAsserterV2
{
   final static private String TOKEN_TYPE   = "SamplePerimeterAtnToken";
   final static private String TOKEN_PREFIX = "username=";
   private String description; 
   public void initialize(ProviderMBean mbean, SecurityServices services)
   {
      System.out.println("SimpleSampleIdentityAsserterProviderImpl.initialize");
      SimpleSampleIdentityAsserterMBean myMBean = (SimpleSampleIdentityAsserterMBean)mbean;
      description = myMBean.getDescription() + "\n" + myMBean.getVersion();
   }
   public String getDescription()
   {
      return description;
   }
   public void shutdown()
   {
      System.out.println("SimpleSampleIdentityAsserterProviderImpl.shutdown");
   }
   public IdentityAsserterV2 getIdentityAsserter()
   {
      return this;
   }
   public CallbackHandler assertIdentity(String type, Object token, ContextHandler context) throws 
   IdentityAssertionException
   {
      System.out.println("SimpleSampleIdentityAsserterProviderImpl.assertIdentity");
      System.out.println("\tType\t\t= "  + type);
      System.out.println("\tToken\t\t= " + token);
      if (!(TOKEN_TYPE.equals(type))) {
         String error = "SimpleSampleIdentityAsserter received unknown token type \"" 
            + type + "\"." + " Expected " + TOKEN_TYPE;
         System.out.println("\tError: " + error);
         throw new IdentityAssertionException(error);
      }
      if (!(token instanceof byte[])) {
         String error = "SimpleSampleIdentityAsserter received unknown token class \"" 
            + token.getClass() + "\"." + " Expected a byte[].";
         System.out.println("\tError: " + error);
         throw new IdentityAssertionException(error);
      }
      byte[] tokenBytes = (byte[])token;
      if (tokenBytes == null || tokenBytes.length < 1) {
         String error = "SimpleSampleIdentityAsserter received empty token byte array";
         System.out.println("\tError: " + error);
         throw new IdentityAssertionException(error);
      }
      String tokenStr = new String(tokenBytes);
      if (!(tokenStr.startsWith(TOKEN_PREFIX))) {
         String error = "SimpleSampleIdentityAsserter received unknown token string \"" 
            + type + "\"." + " Expected " + TOKEN_PREFIX + "username";
         System.out.println("\tError: " + error);
         throw new IdentityAssertionException(error);
      }
      String userName = tokenStr.substring(TOKEN_PREFIX.length());
      System.out.println("\tuserName\t= " + userName);
      return new SimpleSampleCallbackHandlerImpl(userName);
   }
   public AppConfigurationEntry getLoginModuleConfiguration()
   {
      return null;
   }
   public AppConfigurationEntry getAssertionModuleConfiguration()
   {
      return null;
   }
   public PrincipalValidator getPrincipalValidator()
   {
      return null;
   }
}

例5-5は、SampleIdentityAsserterProviderImpl.javaランタイム・クラスとともに使用するCallbackHandlerのサンプル実装を示しています。このCallbackHandlerの実装は、認証プロバイダのLoginModuleにユーザー名を送り返すために使用します。

例5-5 SampleCallbackHandlerImpl.java

package examples.security.providers.identityassertion.simple;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
/*package*/ class SimpleSimpleSampleCallbackHandler implements CallbackHandler
{
   private String userName;
   /*package*/ SimpleSampleCallbackHandlerImpl(String user)
   {
      userName = user;
   }
   public void handle(Callback[] callbacks) throws UnsupportedCallbackException
   {
      for (int i = 0; i < callbacks.length; i++) {
            Callback callback = callbacks[i];
            if (!(callback instanceof NameCallback)) {
               throw new UnsupportedCallbackException(callback, "Unrecognized 
                  Callback");
            }
            NameCallback nameCallback = (NameCallback)callback;
            nameCallback.setName(userName);
      }
   }
}

WebLogic MBeanMakerを使用してMBeanタイプを生成する

カスタム・セキュリティ・プロバイダのMBeanタイプを生成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタムIDアサーション・プロバイダのMBeanタイプを作成します。

  1. MBean定義ファイル(MDF)の作成

  2. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  3. WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

  4. WebLogic Server環境にMBeanタイプをインストールする


    注意:

    複数のセキュリティ・プロバイダのサンプルで、これらの手順の実行方法を示します。

    この節で説明する手順はすべて、Windows環境での作業を想定しています。


MBean定義ファイル(MDF)の作成

MBean定義ファイル(MDF)を作成するには、次の手順に従います。

  1. サンプルIDアサーション・プロバイダのMDFをテキスト・ファイルにコピーします。


    注意:

    サンプルのIDアサーション・プロバイダのMDFは、SampleIdentityAsserter.xmlです。


  2. MDFで<MBeanType>要素と<MBeanAttribute>要素の内容をカスタムIDアサーション・プロバイダに合わせて修正します。次に、Base64DecodingRequired属性をfalseに設定する例を示します。

    <MBeanAttribute
      Name         = "Base64DecodingRequired"
      Type         = "boolean"
      Writeable    = "false"
      Default      = "false"
      Description  = "See MyIdentityAsserter-doc.xml."
    />
    
  3. カスタム属性および操作(つまり、<MBeanAttribute>および<MBeanOperation>要素)をMDFに追加します。

  4. ファイルを保存します。


    注意:

    MDF要素の構文についての詳細なリファレンスは、付録A「MBean定義ファイル(MDF)要素の構文」に収められています。


WebLogic MBeanMakerを使用してMBeanタイプを生成する

MDFを作成したら、WebLogic MBeanMakerを使用してそれを実行できます。WebLogic MBeanMakerは現在のところコマンドライン・ユーティリティで、入力としてMDFを受け取り、MBeanインタフェース、MBean実装、関連するMBean情報ファイルなどの中間Javaファイルをいくつか出力します。これらの中間ファイルが合わさって、カスタム・セキュリティ・プロバイダのMBeanタイプになります。

MBeanタイプの生成手順は、カスタムIDアサーション・プロバイダの設計に応じて異なります。必要な設計に合わせて適切な手順を実行してください。

オプショナルSSPI MBeanとカスタム操作を追加しない場合

カスタムIDアサーション・プロバイダのMDFがオプショナルSSPI MBeanを実装せず、かつ、いかなるカスタム操作も含まない場合、次の手順に従います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまりIDアサーション・プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

オプショナルSSPI MBeanまたはカスタム操作を追加する場合

カスタムIDアサーション・プロバイダのMDFがオプショナルSSPI MBeanまたはカスタム操作を実装する場合、以下の質問に答えながら手順を進めてください。

MBeanタイプを作成するのは初めてですか。その場合は、次の手順に従ってください:

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまりIDアサーション・プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. オプショナルSSPI MBeanをMDFに実装した場合は、次の手順に従います。

    1. MBean実装ファイルを見つけます。

      WebLogic MBeanMakerによって生成されるMBean実装ファイルには、MBeanNameImpl.javaという名前が付けられます。たとえば、SampleIdentityAsserterという名前のMDFの場合、編集されるMBean実装ファイルはSampleIdentityAsserterImpl.javaという名前になります。

    2. MDFで実装したオプショナルSSPI MBeanごとに、各メソッドを実装します。オプショナルSSPI MBeanが継承するメソッドもすべて実装してください。

  4. MDFにカスタム操作を含めた場合、メソッド・スタブを使用してメソッドを実装します。

  5. ファイルを保存します。

  6. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

既存のMBeanタイプの更新ですか。その場合は、次の手順に従ってください:

  1. WebLogic MBeanMakerによって現在のメソッドの実装が上書きされないように、既存のMBean実装ファイルを一時ディレクトリにコピーします。

  2. 新しいDOSシェルを作成します。

  3. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまりIDアサーション・プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  4. オプショナルSSPI MBeanをMDFに実装した場合は、次の手順に従います。

    1. MBean実装ファイルを見つけて開きます。

      WebLogic MBeanMakerによって生成されるMBean実装ファイルには、MBeanNameImpl.javaという名前が付けられます。たとえば、SampleIdentityAsserterという名前のMDFの場合、編集されるMBean実装ファイルはSampleIdentityAsserterImpl.javaという名前になります。

    2. ステップ1で一時ディレクトリに保存した既存のMBean実装ファイルを開きます。

    3. 既存のMBean実装ファイルを、WebLogic MBeanMakerによって生成されたMBean実装ファイルと同期させます。

      これには、メソッドの実èo…を既存のMBean実装ファイルから新しく生成されたMBean実装ファイルにコピー(または、新しく生成されたMBean実装ファイルから既存のMBean実装ファイルに新しいメソッドを追加)し、いずれのMBean実装ファイルにも入っているメソッドのメソッド・シグネチャへの変更が、使用するMBean実装ファイルに反映されていることを確認するといった作業が必要です。

    4. MDFを修正して元のMDFにはないオプショナルSSPI MBeanを実装した場合は、各メソッドを実装します。オプショナルSSPI MBeanが継承するメソッドもすべて実装してください。

  5. MDFを変更して元のMDFにはないカスタム操作を含めた場合、メソッド・スタブを使用してメソッドを実装します。

  6. 完成した、つまりすべてのメソッドを実装したMBean実装ファイルを保存します。

  7. このMBean実装ファイルを、WebLogic MBeanMakerがMBeanタイプの実装ファイルを配置したディレクトリにコピーします。このディレクトリは、手順3でfilesdirとして指定したものです。(ステップ3の結果としてWebLogic MBeanMakerで生成されたMBean実装ファイルがオーバーライドされます)。

  8. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

生成されるMBeanインタフェース・ファイルについて

MBeanインタフェース・ファイルとは、ランタイム・クラスまたはMBean実装が構成データを取得するために使用するMBeanのクライアント側APIです。「「Provider」SSPIの目的について」で説明されているように、これはinitializeメソッドで使用するのが一般的です。

WebLogic MBeanMakerでは、作成済のMDFからMBeanタイプを生成するので、生成されるMBeanインタフェース・ファイルの名前は、そのMDF名の後に「MBean」というテキストが付いたものになります。たとえば、WebLogic MBeanMakerを使用してSampleIdentityAsserter MDFを実行すると、SampleIdentityAsserterMBean.javaという名前のMBeanインタフェース・ファイルが生成されます。

WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

WebLogic MBeanMakerでMDFを実行して中間ファイルを作成し、MBean実装ファイルを編集して適切なメソッドの実装を提供したら、カスタムIDアサーション・プロバイダのMBeanファイルとランタイム・クラスをMBean JARファイル(MJF)にパッケージ化する必要があります。このプロセスも、WebLogic MBeanMakerによって自動化されます。

カスタムIDアサーション・プロバイダのMJFを作成するには、次の手順を行います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMJF=jarfile -Dfiles=filesdir weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMJFフラグはWebLogic MBeanMakerが新しいMBeanタイプを含むJARファイルを構築すべきであることを示し、jarfileはMJFの名前、filesdirはWebLogic MBeanMakerでMJFにJAR化する対象ファイルが存在する場所を示します。

    この時点でコンパイルが行われるので、エラーが発生するおそれがあります。jarfileが指定されていて、エラーが発生しなかった場合には、指定された名前のMJFが作成されます。


    注意:

    カスタム・セキュリティ・プロバイダのJARファイルを作成する際には、一連のXMLバインディング・クラスと1つのスキーマも生成されます。そのスキーマに関連付けるネームスペースを選択できます。それにより、使用しているカスタム・クラスとOracleのカスタム・クラスとの競合を防ぐことができます。ネームスペースのデフォルトはvendorです。-targetNameSpace引数をWebLogicMBeanMakerまたは関連するWLMBeanMaker antタスクに渡すことで、このデフォルトを変更できます。

    既存のMJFを更新する場合は、単純にMJFを削除して再生成します。WebLogic MBeanMakerにも -DIncludeSourceオプションがあり、それを指定すると、生成されるMJFにソース・ファイルを含めるかどうかを制御できます。ソース・ファイルには、生成されたソースとMDFそのものがあります。デフォルトはfalseです。このオプションは、-DMJFを使用しない場合には無視されます。


生成されたMJFは、自らのWebLogic Server環境にインストールすることも、顧客に配布してそれぞれのWebLogic Server環境にインストールしてもらうこともできます。

WebLogic Server環境にMBeanタイプをインストールする

MBeanタイプをWebLogic Server環境にインストールするには、MJFをWL_HOME\server\lib\mbeantypesディレクトリにコピーします。ここで、WL_HOMEはWebLogic Serverの最上位のインストール・ディレクトリです。これで、カスタムIDアサーション・プロバイダが「デプロイ」されます。つまり、カスタムIDアサーション・プロバイダがWebLogic Server管理コンソールから管理できるようになります。


注意:

MBeanタイプをインストールするデフォルトのディレクトリは、WL_HOME\server\lib\mbeantypesです。初めて使用するバージョンが9.0の場合、セキュリティ・プロバイダは...\domaindir\lib\mbeantypesからもロードできます。ただし、サーバーを起動するときに-Dweblogic.alternateTypesDirectory=<dirコマンドライン・フラグを使用すれば、WebLogic Serverが追加ディレクトリでMBeanタイプを検索します。<dirは、ディレクトリ名のカンマ区切りのリストです。このフラグを使用する場合、WebLogic Serverは常に最初にWL_HOME\server\lib\mbeantypesからMBeanタイプをロードします。その後で、追加ディレクトリにあるすべての有効なアーカイブを検索して、ロードします。このとき拡張子は考慮されません。たとえば、-Dweblogic.alternateTypesDirectory = dirX,dirYの場合、WebLogic ServerはまずWL_HOME\server\lib\mbeantypesからMBeanタイプをロードし、次にdirXおよびdirYにある有効なアーカイブをロードします。WebLogic Serverに追加ディレクトリでMBeanタイプを検索するよう指示する際に、Javaセキュリティ・マネージャを使用している場合は、weblogic.policyファイルを更新して、MBeanタイプ(その結果として、カスタム・セキュリティ・プロバイダ)に適した許可を付与することも必要になります。詳細は、『Oracle WebLogic Serverセキュリティのプログラミング』のJavaセキュリティを使用したWebLogicリソースの保護に関する項を参照してください。


カスタムIDアサーション・プロバイダを構成することによって(「管理コンソールによるカスタムIDアサーション・プロバイダの構成」を参照)、MBeanタイプのインスタンスを作成して、GUI、他のJavaコード、またはAPIからそれらのMBeanインスタンスを使用することができます。たとえば、WebLogic Server管理コンソールを使用して、属性を取得/設定したり操作を呼び出したりすることもできますし、他のJavaオブジェクトを開発して、そのオブジェクトでMBeanをインスタンス化し、それらのMBeanから提供される情報に自動的に応答させることもできます。なお、これらのMBeanインスタンスをバックアップしておくことをお薦めします。

管理コンソールによるカスタムIDアサーション・プロバイダの構成

カスタムIDアサーション・プロバイダを構成するということは、そのカスタムIDアサーション・プロバイダをセキュリティ・レルムに追加するということです。追加されたカスタムIDアサーション・プロバイダには、ID断定サービスを必要とするアプリケーションからアクセスできます。

カスタム・セキュリティ・プロバイダの構成は管理タスクですが、カスタム・セキュリティ・プロバイダの開発者が行うこともできます。


注意:

WebLogic Server管理コンソールを使用してIDアサーション・プロバイダを構成する手順は、『Oracle WebLogic Serverの保護』のWebLogicセキュリティ・プロバイダの構成に関する項で説明されています。


チャレンジIDアサーション

チャレンジIDアサーション・インタフェースは、複数のチャレンジ、レスポンス・メッセージ、および状態を必要とするチャレンジ・レスポンス・スキームをサポートします。チャレンジIDアサーション・プロバイダ・インタフェースを使用すると、IDアサーション・プロバイダは、MicrosoftのWindows NTチャレンジ/レスポンス(NTLM)やSPNEGO (Simple and Protected GSS-API Negotiation)などのチャレンジ/レスポンス認証メカニズムを採用した認証プロトコルをサポートできます。

JavaサーブレットAPI 2.3環境におけるチャレンジ/レスポンスの制限

WebLogicセキュリティ・フレームワークを使用すると、カスタム認証プロバイダおよびカスタムIDアサーション・プロバイダを利用できます。ただし、JavaサーブレットAPI 2.3の仕様により、認証プロセス時は、認証プロバイダとクライアントまたは他のサーバーとの間の対話は制限されます。これにより、認証メカニズムは、サーブレット・コンテナが提供する認証メカニズムと互換性のある基本、フォーム、証明書の形式に制限されます。

サーブレット認証フィルタ(第13章「サーブレット認証フィルタ」を参照)には、アーキテクチャ依存の制限はほとんどありません。つまり、サーブレット認証フィルタは、サーブレット・コンテナが提供する認証メカニズムに依存していません。認証プロセスを開始するコンテナの前にフィルタを呼び出せるようにすれば、セキュリティ・レルムは、より柔軟な認証メカニズムを実装できます。たとえば、サーブレット認証フィルタを使用すると、認証用のSAMLプロバイダ・サイトにユーザーをリダイレクトできます。

サーブレット認証フィルタでは、ユーザーの環境にチャレンジ/レスポンス・プロトコルを簡単に実装できます。フィルタを使用すると、ユーザーのチャレンジ/レスポンス・メカニズムでチャレンジを完了するまで必要なだけチャレンジIDアサーション・インタフェースをループさせることができます。

weblogic.security.services.Authenticationクラスのフィルタと役割

サーブレット認証フィルタを使用すると、サーブレット・コンテナと互換性のある認証メカニズムに制限されることなくチャレンジ/レスポンス・プロトコルを実装できます。ただし、サーブレット認証フィルタは、セキュリティ・フレームワークで提供されている認証環境の外側で機能するので、セキュリティ・フレームワークを利用してプロバイダのコンテキストを判別することはできません。また、サーブレット認証フィルタでは、APIでチャレンジ回数が複数のIDアサーション・プロセスを駆動させる必要があります。

weblogic.security.services.Authenticationクラスが拡張され、サーブレット認証フィルタからの複数のチャレンジ/レスポンスIDアサーションが可能になりました。メソッドおよびインタフェースでは、ChallengeIdentityAsserterV2インタフェースとProviderChallengeContextインタフェースのラッパーが提供されるので、サーブレット認証フィルタから呼び出すことができます。

これ以外に、セキュリティ・フレームワークのコンテキスト内でサーブレット認証フィルタから複数のチャレンジ/レスポンス・ダイアログを実行する方法はドキュメント化されていません。サーブレット認証フィルタは、ChallengeIdentityAsserterV2インタフェースおよびProviderChallengeContextインタフェースを直接呼び出すことはできません。

そのため、ChallengeIdentityAsserterV2インタフェースとProviderChallengeContextインタフェースを実装し、weblogic.security.services.AuthenticationのメソッドとAppChallengeContextインタフェースを使用してサーブレット認証フィルタからそれらのインタフェースを呼び出す必要があります。

チャレンジIDアサーション・プロバイダの開発方法

チャレンジIDアサーション・プロバイダを開発するには:

ChallengeIdentityAsserterV2インタフェースの実装

ChallengeIdentityAsserterV2インタフェースは、IdentityAsserterV2 SSPIを拡張します。IdentityAsserterV2 SSPIに加えて、ChallengeIdentityAsserterV2インタフェースを実装する必要があります。

すべてのIdentityAsserterV2メソッドおよび次のメソッドの実装を提供します。

  • assertChallengeIdentity

    ProviderChallengeContext assertChallengeIdentity(String tokenType, Object token, ContextHandler handler)
    

    提供されているクライアント・トークンを使用し、場合によっては複数回のチャレンジでクライアントIDを確立します。このメソッドは、ProviderChallengeContextインタフェースの実装を返します。ProviderChallengeContextインタフェースには、チャレンジの状態を問い合せる手段があります。

  • continueChallengeIdentity

    void continueChallengeIdentity(ProviderChallengeContext context, String tokenType, Object token, 
    ContextHandler handler) 
    

    提供されているプロバイダ・コンテキストとクライアント・トークンを使用して、クライアントIDの確立を続行します。

  • getChallengeToken

    Object getChallengeToken(String type, ContextHandler handler) 
    

    このメソッドは、IDアサーション・プロバイダのチャレンジ・トークンを返します。

ProviderChallengeContextインタフェースの実装

ProviderChallengeContextインタフェースには、チャレンジの状態を問い合せる手段があります。ChallengeIdentityAsserterV2インタフェースのassertChallengeIdentityメソッドおよびcontinueChallengeIdentityメソッドを使用し、コールバック・ハンドラか、クライアントが応答する必要がある新しいチャレンジを返すことができます。

ProviderChallengeContextインタフェースを実装するには、以下のメソッドの実装を提供する必要があります。

  • getCallbackHandler

    CallbackHandler getCallbackHandler() 
    

    このメソッドは、チャレンジIDアサーションのコールバック・ハンドラを返します。hasChallengeIdentityCompletedメソッドがtrueを返した場合にのみ、このメソッドを呼び出します。

  • getChallengeToken

    Object getChallengeToken() 
    

    このメソッドは、チャレンジIDアサーションのチャレンジ・トークンを返します。hasChallengeIdentityCompletedメソッドがfalseを返した場合にのみ、このメソッドを呼び出します。

  • hasChallengeIdentityCompleted

    boolean hasChallengeIdentityCompleted 
    

    このメソッドは、チャレンジIDアサーションが完了したかどうかを返します。このメソッドは、チャレンジIDアサーションが完了した場合はtrue、完了していない場合はfalseを返します。trueの場合、呼出し側はgetCallbackHandlerメソッドを使用する必要があります。falseの場合、呼出し側はgetChallengeTokenメソッドを使用する必要があります。

weblogic.security.servicesのチャレンジIDメソッドの呼出し

ChallengeIdentityAsserterV2 SSPIを直接呼び出すのではなく、サーブレット認証フィルタからweblogic.security.services.Authenticationの次のメソッドを呼び出します。

  • assertChallengeIdentity

    AppChallengeContext assertChallengeIdentity(String tokenType, Object token, AppContext appContext) 
    

    提供されているクライアント・トークンを使用し、場合によっては複数回のチャレンジでクライアントIDを確立します。このメソッドは、チャレンジIDアサーションのコンテキストを戻します。この結果には、認証されたサブジェクトか、クライアントが応答する必要がある追加チャレンジが含まれる可能性があります。AppChallengeContextインタフェースには、チャレンジの状態を問い合せる手段があります。

  • continueChallengeIdentity

    void continueChallengeIdentity(AppChallengeContext context, String tokenType,
     Object token, AppContext appContext) 
    

    提供されているプロバイダ・コンテキストとクライアント・トークンを使用して、クライアントIDの確立を続行します。

  • getChallengeToken

    Object getChallengeToken 
    

    このメソッドは、チャレンジIDアサーションの初期チャレンジ・トークンを返します。

weblogic.security.servicesのAppChallengeContextメソッドの呼出し

ProviderChallengeContextインタフェースを直接呼び出すのではなく、サーブレット認証フィルタからAppChallengeContextの次のメソッドを呼び出します。

  • getAuthenticatedSubject

    Subject getAuthenticatedSubject() 
    

    このメソッドは、チャレンジIDアサーションで認証されたサブジェクトを返します。hasChallengeIdentityCompletedメソッドがtrueを返した場合にのみ、このメソッドを呼び出します。

  • getChallengeToken

    Object getChallengeToken() 
    

    このメソッドは、チャレンジIDアサーションのチャレンジ・トークンを返します。hasChallengeIdentityCompletedメソッドがfalseを返した場合にのみ、このメソッドを呼び出します。

  • hasChallengeIdentityCompleted

    boolean hasChallengeIdentityCompleted() 
    

    このメソッドは、チャレンジIDアサーションが完了したかどうかを返します。このメソッドは、チャレンジIDアサーションが完了した場合はtrue、完了していない場合はfalseを返します。trueの場合、呼出し側はgetCallbackHandlerメソッドを使用する必要があります。falseの場合、呼出し側はgetChallengeTokenメソッドを使用する必要があります。

フィルタからのチャレンジIDアサーションの実装

以下のコード・フローでは、サーブレット認証フィルタ(第13章「サーブレット認証フィルタ」を参照)は、HTTPレベルの対話(AuthorizationおよびWWW-Authenticate)を処理するとともに、weblogic.security.services.Authenticationメソッドとインタフェースを呼び出してチャレンジIDアサーション・プロセスを駆動させる役割も果たしています。

  1. ブラウザがリクエストを送信します。

  2. フィルタは、リクエストを認識してAuthorizationヘッダーがないことを判別すると、weblogic.security.services.Authentication getChallengeTokenメソッドを呼び出して初期トークンを取得し、WWW-Authenticateネゴシエーション・ヘッダー付きの401レスポンスを返します。

  3. ブラウザは、WWW-Authenticate付きの401を認識し、新しいリクエストと認証ネゴシエーション・トークン付きの応答を返します。

    1. フィルタは、これを認識してweblogic.security.services.AuthenticationのassertChallengeIdentityメソッドを呼び出します。assertChallengeIdentityは、トークンを入力として取り、アサーション・プロセスで従う必要があるルールに従ってそれを処理し(たとえば、NTLMの場合は、トークン処理用にNTLMで要求されている処理を行います)、その処理が成功したかどうかを判別します。assertChallengeIdentityは、AppChallengeContextインタフェースの実装を戻します。

    2. フィルタはappChallengeContext hasChallengeCompletedメソッドを呼び出します。AppChallengeContext hasChallengeIdentityCompletedメソッドを使用して、チャレンジが完了したかどうかを確認します。たとえば、このメソッドは、コールバック・ハンドラがnullでない(つまりユーザー名が含まれている)かどうかを判別し、trueを返すことができます。ここでは、falseが返されるので、別のチャレンジをクライアントに発行する必要があります。フィルタは、次にAppChallengeContext getChallengeTokenを呼び出し、チャレンジを再試行するためのトークンを取得します。

    3. フィルタは、おそらくセッション属性などにAppChallengeContextを格納しています。

    4. フィルタは、WWW-Authenticateネゴシエーションと新しいトークン付きの401レスポンスを送信します。

  4. ブラウザは、新しいチャレンジを認識し、Authorizationヘッダーを付けて再び応答します。

    1. フィルタは、これを認識してweblogic.security.services.Authentication continueChallengeIdentityメソッドを呼び出します。

    2. フィルタはAppChallengeContext hasChallengeCompletedメソッドを呼び出します。falseが返された場合は、別のチャレンジが用意されるので、AppChallengeContext getChallengeTokenメソッドを呼び出して、チャレンジを再試行するためのトークンを取得します(以降、falseの場合は同じ処理が繰り返されます)。trueが返された場合、チャレンジは完了したことになり、フィルタは次にAppChallengeContext getAuthenticatedSubjectメソッドを呼び出し、runAs(subject, request)を実行します。

PKGìlooPKÛ°-AOEBPS/credmap.htm€ÿ 資格証明マッピング・プロバイダ

11 資格証明マッピング・プロバイダ

この章では、資格証明マッピング・プロバイダの概念と機能、およびカスタム資格証明マッピング・プロバイダの開発手順について説明します。

資格証明マッピングとは、ターゲット・リソースにアクセスするユーザーを認証するための適切な資格証明のセットを、レガシー・システムのデータベースを用いて取得するプロセスのことです。WebLogic Serverでは、資格証明マッピング・プロバイダを使用して資格証明マッピング・サービスを提供し、新しいタイプの資格証明をWebLogic Server環境に導入します。

以下の節では、資格証明マッピング・プロバイダの概念と機能、およびカスタム資格証明マッピング・プロバイダの開発手順について説明します。

資格証明マッピングの概念

サブジェクト、つまりWebLogicリソース・リクエストの発信元は、資格証明というセキュリティ関連の属性を持っています。資格証明には、新しいサービスにアクセスするサブジェクトを認証するための情報が含まれています。こうした資格証明には、ユーザー名/パスワードの組合せ、Kerberosチケット、および公開鍵証明書などがあります。また、サブジェクトが特定のアクティビティを実行することを許可するデータも資格証明に含まれています。たとえば、暗号鍵が表す資格証明を持っていれば、サブジェクトは署名したり、データを暗号化したりすることができます。

資格証明マップは、WebLogic Serverが使用する資格証明と、レガシー・システム(または任意のリモート・システム)で使用する資格証明とのマッピングです。これにより、WebLogic Serverは、そのシステム内の特定のリソースへの接続方法を知ります。つまり、資格証明マップを使用することで、WebLogic Serverは認証済みサブジェクトに代わってリモート・システムにログインできます。資格証明マッピング・プロバイダを開発すると、資格証明をこのようにマップできます。

資格証明マッピング・プロセス

資格証明マッピング・プロセスにおける資格証明マッピング・プロバイダとWebLogicセキュリティ・フレームワークとの対話を図11-1に示し、続いてそれについて説明します。

図11-1 資格証明マッピング・プロバイダと資格証明マッピング・プロセス

図11-1の説明が続きます
「図11-1 資格証明マッピング・プロバイダと資格証明マッピング・プロセス」の説明

一般に、資格証明マッピングは以下のように実行されます。

  1. JavaServer Page (JSP)、サーブレット、Enterprise JavaBeans (EJB)、リソース・アダプタなどのアプリケーション・コンポーネントは、適切なリソース・コンテナを通じてWebLogicセキュリティ・フレームワークを呼び出します。呼出しの中で、アプリケーション・コンポーネントは、サブジェクト(「誰が」リクエストしているのか)、WebLogicリソース(「何を」リクエストしているのか)、およびWebLogicリソースにアクセスするために必要な資格証明のタイプについての情報を渡します。

  2. WebLogicセキュリティ・フレームワークは、資格証明に対するアプリケーション・コンポーネントのリクエストを構成済み資格証明マッピング・プロバイダに送信します。トークンをサポートするかどうかは、資格証明マッピング・プロバイダによって異なります。トークンをサポートしている場合は、その処理が行われます。

  3. 資格証明マッピング・プロバイダは、レガシー・システムのデータベースを照会して、アプリケーション・コンポーネントがリクエストしているものに一致する資格証明群を取得します。

  4. 資格証明マッピング・プロバイダは、資格証明をWebLogicセキュリティ・フレームワークに返します。

  5. WebLogicセキュリティ・フレームワークは、リソース・コンテナを通じてリクエスト側のアプリケーション・コンポーネントに資格証明を返します。

    アプリケーション・コンポーネントは、資格証明を使用して外部システムにアクセスします。外部システムには、OracleやSQL Serverなどのデータベース・リソースがあります。

カスタム資格証明マッピング・プロバイダを開発する必要があるか

WebLogic Serverのデフォルト(つまりアクティブな)セキュリティ・レルムにはWebLogic資格証明マッピング・プロバイダが含まれています。WebLogic資格証明マッピング・プロバイダは、WebLogic Serverのユーザーおよびグループを、他の外部システムが必要とする適切なユーザー名/パスワード資格証明にマップします。必要な資格証明マッピングがWebLogic Serverのユーザーおよびグループと他のシステムのユーザー名/パスワードとの間のマッピングであれば、WebLogic資格証明マッピング・プロバイダで十分です。

WebLogic Serverには、PKI資格証明マッピング・プロバイダがあります。WebLogic ServerのPKI (公開鍵インフラストラクチャ)資格証明マッピング・プロバイダは、WebLogic Serverのサブジェクト(イニシエータ)とターゲット・リソース(および必要であれば資格証明アクション)を、ターゲットとなるリソースを使用する際にアプリケーションで使用するキー・ペアまたは公開証明書にマップします。PKI資格証明マッピング・プロバイダは、サブジェクトとリソース名を使用して対応する資格証明をキーストアから検索します。PKI資格証明マッピング・プロバイダで使用可能なトークンの種類はCredentialMapperV2.PKI_KEY_PAIR_TYPEとCredentialMapperV2.PKI_TRUSTED_CERTIFICATE_TYPEです。

また、WebLogic ServerにはSAML資格証明マッピング・プロバイダが含まれています。SAML資格証明マッピング・プロバイダでは、ターゲットのサイトまたはリソースに基づく認証されたサブジェクトに対するSAML 1.1および2.0アサーションを生成します。要求されたターゲットが、構成されておらず、デフォルトが設定されていない場合、アサーションは生成されません。ユーザー情報およびグループ・メンバーシップは、(そのように構成された場合)AttributeStatement内に置かれます。

『Oracle WebLogic Serverセキュリティのプログラミング』のSAML SSO属性サポートの構成に関する項で説明されているように、WebLogic Serverでは、追加属性(グループ情報以外)を取得してSAMLアサーションに書き込んだり、着信SAMLアサーションからの属性のマップを可能にするカスタム属性マッパーの使用をサポートするために、SAML 1.1および2.0の資格証明マッピング・プロバイダとIDアサーション・プロバイダのメカニズムが強化されています。

SAML資格証明マッピング・プロバイダでは、CredentialMapperV2.SAML_ASSERTION_B64_TYPE、CredentialMapperV2.SAML_ASSERTION_DOM_TYPE、およびCredentialMapperV2.SAML_ASSERTION_TYPEの各トークン・タイプがサポートされています。

SAML 2.0資格証明マッピング・プロバイダでは、CredentialMapperV2.SAML2_ASSERTION_DOM_TYPEトークン・タイプおよびCredentialMapperV2.SAML2_ASSERTION_TYPEトークン・タイプがサポートされています。

初期状態の資格証明マッピング・プロバイダが開発者のニーズを満たさない場合は、カスタム資格証明マッピング・プロバイダを開発する必要があります。ただし、WebLogic Serverリソース・コンテナでリクエストされるのは、次のトークンの種類のみです。

  • CredentialMapperV2.PASSWORD_TYPE

  • CredentialMapperV2.PKI_KEY_PAIR_TYPE

  • CredentialMapperV2.PKI_TRUSTED_CERTIFICATE_TYPE

  • CredentialMapperV2.SAML_ASSERTION_B64_TYPE

  • CredentialMapperV2.SAML_ASSERTION_DOM_TYPE

  • CredentialMapperV2.SAML_ASSERTION_TYPE

  • CredentialMapperV2.SAML2_ASSERTION_DOM_TYPE

  • CredentialMapperV2.SAML2_ASSERTION_TYPE

  • CredentialMapperV2.USER_PASSWORD_TYPE

カスタム資格証明マッピング・プロバイダでアプリケーションのバージョン管理をサポートする必要があるか

セキュリティ・レルムのすべての認可プロバイダ、ロール・マッピング・プロバイダ、および資格証明マッピング・プロバイダは、アプリケーションのデプロイにバージョンを使用するために、アプリケーションのバージョン管理をサポートする必要があります。認可、ロール・マッピング、または資格証明マッピング用にカスタム・セキュリティ・プロバイダを開発する際に、バージョン管理されたアプリケーションをサポートする必要がある場合は、第14章「バージョン管理可能なアプリケーションのプロバイダ」の説明に従って、バージョン管理可能なアプリケーションのSSPIを実装する必要があります。

カスタム資格証明マッピング・プロバイダの開発方法

WebLogic資格証明マッピング・プロバイダが開発者のニーズを満たさない場合、次の手順でカスタム資格証明マッピング・プロバイダを開発することができます。

  1. 適切なSSPIによるランタイム・クラスの作成

  2. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  3. 資格証明マップを管理するためのメカニズムの提供

適切なSSPIによるランタイム・クラスの作成

ランタイム・クラスを作成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム資格証明マッピング・プロバイダのランタイム・クラスを作成します。

CredentialProviderV2 SSPIの実装

CredentialProviderV2 SSPIを実装するには、「「Provider」SSPIの目的について」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • getCredentialProvider

    public CredentialMapperV2 getCredentialProvider();
    

    getCredentialProviderV2メソッドはCredentialMapperV2 SSPIの実装を取得します。(図3-3にあるような)MyCredentialMapperProviderImpl.javaという単一のランタイム・クラスの場合、getCredentialProviderメソッドの実装は次のようになります:

    return this;
    

    ランタイム・クラスが2つの場合、getCredentialProviderメソッドの実装は次のようになります。

    return new MyCredentialMapperImpl;
    

    これは、CredentialProviderV2 SSPIを実装するランタイム・クラスが、CredentialMapperV2 SSPIを実装するクラスを取得する場合のファクトリとして使用されるためです。

CredentialProviderV2 SSPIとgetCredentialProviderメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

DeployableCredentialProvider SSPIの実装


注意:

DeployableCredentialProvider SSPIは、このリリースのWebLogic Serverでは非推奨になっています。


DeployableCredentialProvider SSPIを実装するには、「「Provider」SSPIの目的について」および「CredentialProviderV2 SSPIの実装」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • deployCredentialMapping

    public void deployCredentialMapping(Resource resource, String
    initiatingPrincipal, String eisUsername, String eisPassword)throws
    ResourceCreationException;
    

    deployCredentialMappingメソッドは資格証明マップをデプロイします。マッピングがすでに存在する場合、マッピングは削除され、このマッピングによって置き換えられます。resourceパラメータは、Stringで表される開始元プリンシパルがアクセスをリクエストしているWebLogicリソースを表します。エンタープライズ情報システム(EIS)のユーザー名およびパスワードは、資格証明のマップ先のレガシー・システム(リモート・システム)における資格証明です。

  • undeployCredentialMappings

    public void undeployCredentialMappings(Resource resource) throws
    ResourceRemovalException;
    

    undeployCredentialMappingsメソッドは、資格証明マップをアンデプロイします(つまり、アンデプロイ済みのリソース・アダプタにかわって資格証明マッピングをデータベースから削除します)。resourceパラメータは、マッピングを削除するWebLogicリソースを表します。


    注意:

    deployCredentialMappingメソッド、およびundeployCredentialMappingsメソッドは、ユーザー名/パスワード資格証明のみを操作します。


DeployableCredentialProvider SSPIとdeployCredentialMapping/undeployCredentialMappingsメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

CredentialMapperV2 SSPIの実装

CredentialMapperV2インタフェースは、アプリケーション内でスコープが指定されている特定のリソースに対して適切な資格証明群の取得が可能なオブジェクトのセキュリティ・サービス・プロバイダ・インタフェース(SSPI)を定義します。

以下の資格証明の種類のみがサポートされており、CredentialMapperV2インタフェースに渡されます。

  • PASSWORD_TYPE

  • PKI_KEY_PAIR_TYPE

  • PKI_TRUSTED_CERTIFICATE_TYPE

  • SAML_ASSERTION_B64_TYPE

  • SAML_ASSERTION_DOM_TYPE

  • SAML_ASSERTION_TYPE

  • SAML2_ASSERTION_DOM_TYPE

  • SAML2_ASSERTION_TYPE

  • USER_PASSWORD_TYPE

CredentialMapperV2 SSPIを実装するには、以下のメソッドの実装を提供する必要があります。

  • getCredential

    public Object getCredential(Subject requestor, String initiator, Resource
    resource, ContextHandler handler, String credType);
    

    getCredentialメソッドは、指定したイニシエータに関連付けられているターゲット・リソースから、指定した種類の資格証明を返します。

  • getCredentials

    public Object[] getCredentials(Subject requestor, Subject initiator, Resource
    resource, ContextHandler handler, String credType);
    

    getCredentialsメソッドは、指定したイニシエータに関連付けられているターゲット・リソースから、指定した種類の資格証明を複数返します。

CredentialMapperV2 SSPIとgetCredentialおよびgetCredentialsメソッドの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

レルム・アダプタ認証プロバイダと互換性のあるカスタム資格証明マッピング・プロバイダを開発する

認証プロバイダは、サブジェクト内へのユーザーおよびグループの格納を担当するセキュリティ・プロバイダです。ユーザーおよびグループはその後、資格証明マッピング・プロバイダなど、他のタイプのセキュリティ・プロバイダによって、サブジェクトから抽出されます。セキュリティ・レルム内で構成された認証プロバイダがレルム・アダプタ認証プロバイダである場合、ユーザーおよびグループの情報は、他の認証プロバイダとは少し異なる形でサブジェクト内に格納されます。したがって、このユーザーおよびグループの情報もまた、少し異なる方法で抽出する必要があります。

例11-1では、サブジェクトへの格納にレルム・アダプタ認証プロバイダが使用された場合に、サブジェクトがユーザー名またはグループ名に一致するかどうかをチェックするため、カスタム資格証明マッピング・プロバイダで使用できるコードを示します。このコードは、実装することを選択したgetCredentialsメソッドの形式に属しています。コードでは、weblogic.security.SubjectUtilsクラスで使用可能なメソッドを利用します。

例11-1 サンプル・コード:サブジェクトがユーザー名またはグループ名に一致するかどうかのチェック

/** 
 * Determines if the Subject matches a user/group name. 
 * 
 * @param principalWant A String containing the name of a principal in this role
 * (that is, the role definition). 
 * 
 * @param subject A Subject that contains the Principals that identify the user 
 * who is trying to access the resource as well as the user's groups. 
 * 
 * @return A boolean. true if the current subject matches the name of the 
 * principal in the role, false otherwise. 
 */ 
private boolean subjectMatches(String principalWant, Subject subject) 
{ 
   // first, see if it's a group name match 
   if (SubjectUtils.isUserInGroup(subject, principalWant)) { 
      return true; 
   } 
   // second, see if it's a user name match 
   if (principalWant.equals(SubjectUtils.getUsername(subject))) { 
      return true; 
   } 
   // didn't match 
   return false; 
}

WebLogic MBeanMakerを使用してMBeanタイプを生成する

カスタム・セキュリティ・プロバイダのMBeanタイプを生成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム資格証明マッピング・プロバイダのMBeanタイプを作成します。

  1. MBean定義ファイル(MDF)の作成

  2. WebLogic MBeanMakerを使用してMBeanタイプを生成する

  3. WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

  4. WebLogic Server環境にMBeanタイプをインストールする


    注意:

    複数のセキュリティ・プロバイダのサンプルで、これらの手順の実行方法を示します。

    この節で説明する手順はすべて、Windows環境での作業を想定しています。


MBean定義ファイル(MDF)の作成

MBean定義ファイル(MDF)を作成するには、次の手順に従います。

  1. サンプル認証プロバイダのMDFをテキスト・ファイルにコピーします。


    注意:

    サンプル認証プロバイダのMDFは、SimpleSampleAuthenticator.xmlです。(現在、サンプル資格証明マッピング・プロバイダはありません)。


  2. MDFで<MBeanType>要素と<MBeanAttribute>要素の内容をカスタム資格証明マッピング・プロバイダに合わせて修正します。

  3. カスタム属性および操作(つまり、<MBeanAttribute>および<MBeanOperation>要素)をMDFに追加します。

  4. ファイルを保存します。


    注意:

    MDF要素の構文についての詳細なリファレンスは、付録A「MBean定義ファイル(MDF)要素の構文」に収められています。


WebLogic MBeanMakerを使用してMBeanタイプを生成する

MDFを作成したら、WebLogic MBeanMakerを使用してそれを実行できます。WebLogic MBeanMakerは現在のところコマンドライン・ユーティリティで、入力としてMDFを受け取り、MBeanインタフェース、MBean実装、関連するMBean情報ファイルなどの中間Javaファイルをいくつか出力します。これらの中間ファイルが合わさって、カスタム・セキュリティ・プロバイダのMBeanタイプになります。

MBeanタイプの生成手順は、カスタム資格証明マッピング・プロバイダの設計に応じて異なります。必要な設計に合わせて適切な手順を実行してください。

オプショナルSSPI MBeanとカスタム操作を追加しない場合

カスタム資格証明マッピング・プロバイダのMDFがオプショナルSSPI MBeanを実装せず、かつ、いかなるカスタム操作も含まない場合、次の手順に従います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり資格証明マッピング・プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

オプショナルSSPI MBeanまたはカスタム操作を追加する場合

カスタム資格証明マッピング・プロバイダのMDFがオプショナルSSPI MBeanまたはカスタム操作を実装する場合、以下の質問に答えながら手順を進めてください。

MBeanタイプを作成するのは初めてですか。その場合は、次の手順に従ってください:

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebL Lô³ogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり資格証明マッピング・プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  3. オプショナルSSPI MBeanをMDFに実装した場合は、次の手順に従います。

    1. MBean実装ファイルを見つけます。

      WebLogic MBeanMakerによって生成されるMBean実装ファイルには、MBeanNameImpl.javaという名前が付けられます。たとえば、MyCredentialMapperという名前のMDFの場合、編集されるMBean実装ファイルはMyCredentialMapperImpl.javaという名前になります。

    2. MDFで実装したオプショナルSSPI MBeanごとに、各メソッドを実装します。オプショナルSSPI MBeanが継承するメソッドもすべて実装してください。

  4. MDFにカスタム操作を含めた場合、メソッド・スタブを使用してメソッドを実装します。

  5. ファイルを保存します。

  6. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

既存のMBeanタイプの更新ですか。その場合は、次の手順に従ってください:

  1. WebLogic MBeanMakerによって現在のメソッドの実装が上書きされないように、既存のMBean実装ファイルを一時ディレクトリにコピーします。

  2. 新しいDOSシェルを作成します。

  3. 次のコマンドを入力します。

    java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMDFフラグはWebLogic MBeanMakerがMDFをコードに変換すべきであることを示し、xmlFileはMDF (XML MBeanの記述ファイル)、filesdirはWebLogic MBeanMakerで作成されたMBeanタイプの中間ファイルが格納される場所を示します。

    xmlfileが入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=trueフラグを使用するたびに、既存のMBean実装ファイルがすべて上書きされます。


    注意:

    バージョン9.0以降のWebLogic Serverでは、-DMDFDIR <MDF directory name>オプションを使用して、複数のMDFを格納するディレクトリを指定することができます。旧バージョンのWebLogic Serverでは、WebLogic MBeanMakerで一度に処理されるMDFは1つだけです。したがって、MDF (つまり資格証明マッピング・プロバイダ)が複数ある場合には、このプロセスを繰り返す必要がありました。


  4. オプショナルSSPI MBeanをMDFに実装した場合は、次の手順に従います。

    1. MBean実装ファイルを見つけます。

      WebLogic MBeanMakerによって生成されるMBean実装ファイルには、MBeanNameImpl.javaという名前が付けられます。たとえば、SampleCredentialMapperという名前のMDFの場合、編集されるMBean実装ファイルはSampleCredentialMapperImpl.javaという名前になります。

    2. ステップ1で一時ディレクトリに保存した既存のMBean実装ファイルを開きます。

    3. 既存のMBean実装ファイルを、WebLogic MBeanMakerによって生成されたMBean実装ファイルと同期させます。

      これには、メソッドの実装を既存のMBean実装ファイルから新しく生成されたMBean実装ファイルにコピー(または、新しく生成されたMBean実装ファイルから既存のMBean実装ファイルに新しいメソッドを追加)し、いずれのMBean実装ファイルにも入っているメソッドのメソッド・シグネチャへの変更が、使用するMBean実装ファイルに反映されていることを確認するといった作業が必要です。

    4. MDFを修正して元のMDFにはないオプショナルSSPI MBeanを実装した場合は、各メソッドを実装します。オプショナルSSPI MBeanが継承するメソッドもすべて実装してください。

  5. MDFを変更して元のMDFにはないカスタム操作を含めた場合、メソッド・スタブを使用してメソッドを実装します。

  6. 完成した、つまりすべてのメソッドを実装したMBean実装ファイルを保存します。

  7. このMBean実装ファイルを、WebLogic MBeanMakerがMBeanタイプの実装ファイルを配置したディレクトリにコピーします。このディレクトリは、手順3でfilesdirとして指定したものです。(ステップ3の結果としてWebLogic MBeanMakerで生成されたMBean実装ファイルがオーバーライドされます)。

  8. 「WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成」に進みます。

生成されるMBeanインタフェース・ファイルについて

MBeanインタフェース・ファイルとは、ランタイム・クラスまたはMBean実装が構成データを取得するために使用するMBeanのクライアント側APIです。「「Provider」SSPIの目的について」で説明されているように、これはinitializeメソッドで使用するのが一般的です。

WebLogic MBeanMakerでは、作成済のMDFからMBeanタイプを生成するので、生成されるMBeanインタフェース・ファイルの名前は、そのMDF名の後に「MBean」というテキストが付いたものになります。たとえば、WebLogic MBeanMakerでMyCredentialMapper MDFを実行すると、MyCredentialMapperMBean.javaというMBeanインタフェース・ファイルが生成されます。

WebLogic MBeanMakerによるMBean JARファイル(MJF)の作成

WebLogic MBeanMakerでMDFを実行して中間ファイルを作成し、MBean実装ファイルを編集して適切なメソッドの実装を提供したら、カスタム資格証明マッピング・プロバイダのMBeanファイルとランタイム・クラスをMBean JARファイル(MJF)にパッケージ化する必要があります。このプロセスも、WebLogic MBeanMakerによって自動化されます。

カスタム資格証明マッピング・プロバイダのMJFを作成するには、次の手順に従います。

  1. 新しいDOSシェルを作成します。

  2. 次のコマンドを入力します。

    java -DMJF=jarfile -Dfiles=filesdir weblogic.management.commo.WebLogicMBeanMaker
    

    ここで、-DMJFフラグはWebLogic MBeanMakerが新しいMBeanタイプを含むJARファイルを構築すべきであることを示し、jarfileはMJFの名前、filesdirはWebLogic MBeanMakerでMJFにJAR化する対象ファイルが存在する場所を示します。

    この時点でコンパイルが行われるので、エラーが発生するおそれがあります。jarfileが指定されていて、エラーが発生しなかった場合には、指定された名前のMJFが作成されます。


    注意:

    カスタム・セキュリティ・プロバイダのJARファイルを作成する際には、一連のXMLバインディング・クラスと1つのスキーマも生成されます。そのスキーマに関連付けるネームスペースを選択できます。それにより、使用しているカスタム・クラスとOracleのカスタム・クラスとの競合を防ぐことができます。ネームスペースのデフォルトはvendorです。-targetNameSpace引数をWebLogicMBeanMakerまたは関連するWLMBeanMaker antタスクに渡すことで、このデフォルトを変更できます。

    既存のMJFを更新する場合は、単純にMJFを削除して再生成します。WebLogic MBeanMakerにも -DIncludeSourceオプションがあり、それを指定すると、生成されるMJFにソース・ファイルを含めるかどうかを制御できます。ソース・ファイルには、生成されたソースとMDFそのものがあります。デフォルトはfalseです。このオプションは、-DMJFを使用しない場合には無視されます。


生成されたMJFは、自らのWebLogic Server環境にインストールすることも、顧客に配布してそれぞれのWebLogic Server環境にインストールしてもらうこともできます。

WebLogic Server環境にMBeanタイプをインストールする

MBeanタイプをWebLogic Server環境にインストールするには、MJFをWL_HOME\server\lib\mbeantypesディレクトリにコピーします。ここで、WL_HOMEはWebLogic Serverの最上位のインストール・ディレクトリです。このインストール・コマンドによって、カスタム資格証明マッピング・プロバイダが「デプロイ」されます。つまり、カスタム資格証明マッピング・プロバイダをWebLogic Server管理コンソールから管理できるようになります。


注意:

MBeanタイプをインストールするデフォルトのディレクトリは、WL_HOME\server\lib\mbeantypesです。初めて使用するバージョンが9.0の場合、セキュリティ・プロバイダは...\domaindir\lib\mbeantypesからもロードできます。ただし、サーバーを起動するときに-Dweblogic.alternateTypesDirectory=<dir>コマンドライン・フラグを使用すれば、WebLogic Serverが追加ディレクトリでMBeanタイプを検索します。<dir>は、ディレクトリ名のカンマ区切りのリストです。このフラグを使用する場合、WebLogic Serverは常に最初にWL_HOME\server\lib\mbeantypesからMBeanタイプをロードします。その後で、追加ディレクトリにあるすべての有効なアーカイブを検索して、ロードします。このとき拡張子は考慮されません。

たとえば、-Dweblogic.alternateTypesDirectory = dirX,dirYの場合、WebLogic ServerはまずWL_HOME\server\lib\mbeantypesからMBeanタイプをロードし、次にdirXおよびdirYにある有効なアーカイブをロードします。WebLogic Serverに追加ディレクトリでMBeanタイプを検索するよう指示する際に、Javaセキュリティ・マネージャを使用している場合は、weblogic.policyファイルを更新して、MBeanタイプ(その結果として、カスタム・セキュリティ・プロバイダ)に適した許可を付与することも必要になります。詳細は、『Oracle WebLogic Serverセキュリティのプログラミング』のJavaセキュリティを使用したWebLogicリソースの保護に関する項を参照してください。


カスタム資格証明マッピング・プロバイダを構成することによって(「資格証明マップを管理するためのメカニズムの提供」を参照) MBeanタイプのインスタンスを作成して、GUI、他のJavaコード、またはAPIからそれらのMBeanインスタンスを使用することができます。たとえば、WebLogic Server管理コンソールを使用して、属性を取得/設定したり操作を呼び出したりすることもできますし、他のJavaオブジェクトを開発して、そのオブジェクトでMBeanをインスタンス化し、それらのMBeanから提供される情報に自動的に応答させることもできます。なお、これらのMBeanインスタンスをバックアップしておくことをお薦めします。

資格証明マップを管理するためのメカニズムの提供

WebLogic Server管理コンソールを使用してカスタム資格証明マッピング・プロバイダを構成すると、必要な資格証明マッピング・サービスにアプリケーションからアクセスできるようにすることはできますが、このセキュリティ・プロバイダに関連付けられた資格証明マップを管理する方法を管理者にも提供する必要があります。たとえばWebLogic資格証明マッピング・プロバイダには、資格証明マッピング・ページが管理者向けに用意されており、様々なコネクタ・モジュールの資格証明マッピングを追加、変更、または削除することができます。

カスタム資格証明マッピング・プロバイダを開発すると、管理者は資格証明マッピング・ページも右クリック・メニューも利用できません。したがって、資格証明マップを管理するための独自のメカニズムを提供する必要があります。このメカニズムでは、カスタム資格証明マッピング・プロバイダのデータベースの資格証明マップを読み書きできなければなりません。

それには、以下の2通りの方法があります。

オプション1 :資格証明マップ管理用のスタンドアロン・ツールの開発

WebLogic Server管理コンソールとまったく別のツールを開発する場合には、この方法を選択します。

この方法では、カスタム資格証明マッピング・プロバイダ向けにコンソール拡張を作成する必要も、管理MBeanを開発する必要もありません。ただし、ツールでは以下のことを行う必要があります。

  1. WebLogicリソースのIDを特定します。IDがコンソール拡張によって自動的に提供されないためです。詳細については、「WebLogicリソース識別子」を参照してください。

  2. ローカル・ユーザーとリモート・ユーザーとの関係を表す方法を特定します。この表現は完全に任意であり、文字列である必要はありません。

  3. カスタム資格証明マッピング・プロバイダのデータベースの式を読み書きします。

オプション2 : 管理コンソールに既存の資格証明マップ管理ツールの統合

WebLogic Server管理コンソールとは別のツールを持っており、それを管理コンソールから起動する場合には、この方法を選択します。

この方法の場合、ツールでは以下のことを行う必要があります。

  1. WebLogicリソースのIDを特定します。詳細については、「WebLogicリソース識別子」を参照してください。

  2. ローカル・ユーザーとリモート・ユーザーとの関係を表す方法を特定します。この表現は完全に任意であり、文字列である必要はありません。

  3. カスタム資格証明マッピング・プロバイダのデータベースの式を読み書きします。

  4. 『Oracle WebLogic Server管理コンソールの拡張』で説明されているように、基本的なコンソール拡張手法を使用して管理コンソールにリンクします。

PKS*&Ì ÌPKÛ°-AOEBPS/version.htmJ÷µ バージョン管理可能なアプリケーションのプロバイダ

14 バージョン管理可能なアプリケーションのプロバイダ

この章では、カスタム・セキュリティ・プロバイダにアプリケーションのバージョン管理機能を追加する前に理解しておく必要がある基本情報と、カスタム・セキュリティ・プロバイダにアプリケーションのバージョン管理機能を追加する手順について説明します。

バージョン管理可能なアプリケーションは、アプリケーション・アーカイブ(EARファイル)のマニフェスト内で指定されているアプリケーション・アーカイブのバージョンを持つアプリケーションです。バージョン管理可能なアプリケーションはサイドバイサイドでデプロイでき、同時にアクティブにすることが可能です。バージョン管理可能なアプリケーションを使用すると、アプリケーションの複数のバージョンを利用できます。各バージョンには、個別のセキュリティ制約を設定できます。

バージョン管理可能なアプリケーションのプロバイダSSPIを使用すると、バージョンが作成および削除されたときに、アプリケーションのバージョン管理をサポートするすべてのセキュリティ・プロバイダに通知できます。また、バージョンが1つしかないアプリケーションが削除された場合にも、アプリケーションのバージョン管理をサポートするすべてのセキュリティ・プロバイダに通知できます。

以下の節では、カスタム・セキュリティ・プロバイダにバージョン管理機能を追加する前に理解しておく必要がある基本情報と、カスタム・セキュリティ・プロバイダにバージョン管理機能を追加する手順について説明します。

バージョン管理可能なアプリケーションの概念

バージョン管理可能なアプリケーションの再デプロイメントは、以降の再デプロイメントで同じアーカイブ・バージョンが指定されている場合を除き、必ずサイドバイサイド・バージョンを介して行われます。ただし、バージョン管理可能なアプリケーションは、複数のバージョンが競合することなく並列的に実行できるように作成する必要があります。つまり、バージョン管理可能なアプリケーションは、アプリケーション名などの固有性を想定しないようにする必要があります。たとえば、アプリケーションが、データベース表やLDAPストアなどのグローバル・データ構造の一意のキーとしてアプリケーション名を使用する場合、アプリケーションは、その代わりにアプリケーション識別子を使用するよう変更する必要があります。

本番再デプロイメントは、構成されたセキュリティ・プロバイダがアプリケーション・バージョニング・セキュリティSSPIをサポートしている場合にのみ許可されます。セキュリティ・レルムのすべての認可プロバイダ、ロール・マッピング・プロバイダ、および資格証明マッピング・プロバイダは、アプリケーションのデプロイにバージョンを使用するために、アプリケーションのバージョン管理をサポートする必要があります。

アプリケーションでアプリケーション・バージョンを割り当てる方法の詳細は、『Oracle WebLogic Serverアプリケーションの開発』の本番再デプロイメント用アプリケーションの開発に関する項を参照してください。

バージョン管理可能なアプリケーションのプロセス

セキュリティ・プロバイダでアプリケーションのバージョニングをサポートするには、バージョン管理可能なアプリケーションのSSPIを実装する必要があります。WebLogicセキュリティ・フレームワークは、アプリケーションのバージョンが作成および削除されるときに、プロバイダがアプリケーションのバージョンに関連付けられたデータを作成、コピー、または削除するのに必要なアクションを実行できるように、バージョン管理可能なアプリケーションのプロバイダSSPIを呼び出します。実行するアクションは、プロバイダによって異なります。

また、バージョンが1つしかないアプリケーションが削除されたときにも、プロバイダがクリーンアップ・アクションを実行できるように、バージョン管理可能なアプリケーション・プロバイダSSPIが呼び出されます。

WebLogicセキュリティ・フレームワークは、新しいバージョンのアプリケーション識別子とアプリケーション・データのソースとして使用されるバージョンのアプリケーション識別子をバージョン管理可能なアプリケーション・プロバイダに渡します。ソース識別子が指定されなかった場合、アプリケーションの初期バージョンが作成中です。

バージョン管理可能なアプリケーションのカスタム・プロバイダを開発する必要があるか

WebLogic Serverの初期状態のセキュリティ・プロバイダ(認可、ロール・マッピング、および資格証明マッピング・プロバイダ)は、アプリケーション・バージョニングSSPIをサポートしています。新しいバージョンが作成されると、新しいアプリケーションのバージョンを表す新しいリソース識別子でカスタマイズされたすべてのロール、ポリシー、および資格証明マップのクローンが作成されます。さらに、アプリケーションのバージョンが削除されると、削除されたバージョンに関連付けられたリソースが削除されます。

認可、ロール・マッピング、または資格証明マッピング用にカスタム・セキュリティ・プロバイダを開発する際に、バージョン管理されたアプリケーションをサポートする必要がある場合は、バージョン管理可能なアプリケーションのSSPIを実装する必要があります。

カスタムVersionableApplicationプロバイダの開発方法

バージョン管理可能なアプリケーションSSPIをサポートする必要がある場合、次の手順でバージョン管理可能なアプリケーションのカスタム・プロバイダを開発できます。

  • カスタム認可、ロール・マッピング、または資格証明マッピング・プロバイダの実装セキュリティ・レルムのすべての認可プロバイダ、ロール・マッピング・プロバイダ、または資格証明マッピング・プロバイダは、アプリケーションのデプロイにバージョンを使用するために、アプリケーションのバージョン管理をサポートする必要があります。

  • 適切なSSPIによるランタイム・クラスの作成

  • WebLogic MBeanMakerを使用してMBeanタイプを生成する

適切なSSPIによるランタイム・クラスの作成

ランタイム・クラスを作成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でバージョン管理可能なアプリケーションのカスタム・プロバイダのランタイム・クラスを作成します。

  • カスタム認可、ロール・マッピング、または資格証明マッピング・プロバイダの実装

  • VersionableApplication SSPIの実装

VersionableApplication SSPIの実装

VersionableApplication SSPIを実装するには、「「Provider」SSPIの目的について」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • createApplicationVersion

    void createApplicationVersion(String appIdentifier, String sourceAppIdentifier) 
    

    新しいアプリケーションのバージョンの作成をマークします。バージョンが作成された時点で、WebLogic Serverドメイン内の1つのサーバーで(WebLogic Serverドメイン内の管理サーバーでのみ)呼び出されます。WebLogicセキュリティ・フレームワークは、新しいバージョンのアプリケーション識別子(appIdentifier)とアプリケーション・データのソースとして使用されるバージョンのアプリケーション識別子(sourceAppIdentifier)をcreateApplicationVersionメソãƒ