§
    fŠtjF  ã                   ó¤   — d dl mZmZ d dlmZ  G d„ d¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d	„ d
e¦  «        Zd„ Z	dd„Z
d„ ZdS )é    )Úarray_namespaceÚxp_size)Úcached_propertyc                   ó"   — e Zd ZdZdd„Zdd„ZdS )ÚRulea†	  
    Base class for numerical integration algorithms (cubatures).

    Finds an estimate for the integral of ``f`` over the region described by two arrays
    ``a`` and ``b`` via `estimate`, and find an estimate for the error of this
    approximation via `estimate_error`.

    If a subclass does not implement its own `estimate_error`, then it will use a
    default error estimate based on the difference between the estimate over the whole
    region and the sum of estimates over that region divided into ``2^ndim`` subregions.

    See Also
    --------
    FixedRule

    Examples
    --------
    In the following, a custom rule is created which uses 3D Genz-Malik cubature for
    the estimate of the integral, and the difference between this estimate and a less
    accurate estimate using 5-node Gauss-Legendre quadrature as an estimate for the
    error.

    >>> import numpy as np
    >>> from scipy.integrate import cubature
    >>> from scipy.integrate._rules import (
    ...     Rule, ProductNestedFixed, GenzMalikCubature, GaussLegendreQuadrature
    ... )
    >>> def f(x, r, alphas):
    ...     # f(x) = cos(2*pi*r + alpha @ x)
    ...     # Need to allow r and alphas to be arbitrary shape
    ...     npoints, ndim = x.shape[0], x.shape[-1]
    ...     alphas_reshaped = alphas[np.newaxis, :]
    ...     x_reshaped = x.reshape(npoints, *([1]*(len(alphas.shape) - 1)), ndim)
    ...     return np.cos(2*np.pi*r + np.sum(alphas_reshaped * x_reshaped, axis=-1))
    >>> genz = GenzMalikCubature(ndim=3)
    >>> gauss = GaussKronrodQuadrature(npoints=21)
    >>> # Gauss-Kronrod is 1D, so we find the 3D product rule:
    >>> gauss_3d = ProductNestedFixed([gauss, gauss, gauss])
    >>> class CustomRule(Rule):
    ...     def estimate(self, f, a, b, args=()):
    ...         return genz.estimate(f, a, b, args)
    ...     def estimate_error(self, f, a, b, args=()):
    ...         return np.abs(
    ...             genz.estimate(f, a, b, args)
    ...             - gauss_3d.estimate(f, a, b, args)
    ...         )
    >>> rng = np.random.default_rng()
    >>> res = cubature(
    ...     f=f,
    ...     a=np.array([0, 0, 0]),
    ...     b=np.array([1, 1, 1]),
    ...     rule=CustomRule(),
    ...     args=(rng.random((2,)), rng.random((3, 2, 3)))
    ... )
    >>> res.estimate
     array([[-0.95179502,  0.12444608],
            [-0.96247411,  0.60866385],
            [-0.97360014,  0.25515587]])
    © c                 ó   — t           ‚)a«  
        Calculate estimate of integral of `f` in rectangular region described by
        corners `a` and ``b``.

        Parameters
        ----------
        f : callable
            Function to integrate. `f` must have the signature::
                f(x : ndarray, \*args) -> ndarray

            `f` should accept arrays ``x`` of shape::
                (npoints, ndim)

            and output arrays of shape::
                (npoints, output_dim_1, ..., output_dim_n)

            In this case, `estimate` will return arrays of shape::
                (output_dim_1, ..., output_dim_n)
        a, b : ndarray
            Lower and upper limits of integration as rank-1 arrays specifying the left
            and right endpoints of the intervals being integrated over. Infinite limits
            are currently not supported.
        args : tuple, optional
            Additional positional args passed to ``f``, if any.

        Returns
        -------
        est : ndarray
            Result of estimation. If `f` returns arrays of shape ``(npoints,
            output_dim_1, ..., output_dim_n)``, then `est` will be of shape
            ``(output_dim_1, ..., output_dim_n)``.
        ©ÚNotImplementedError)ÚselfÚfÚaÚbÚargss        úZ/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/scipy/integrate/_rules/_base.pyÚestimatezRule.estimateC   s   € õB "Ð!ó    c                 óÒ   — |                       ||||¦  «        }d}t          ||¦  «        D ] \  }}||                       ||||¦  «        z  }Œ!| j                             ||z
  ¦  «        S )a-  
        Estimate the error of the approximation for the integral of `f` in rectangular
        region described by corners `a` and `b`.

        If a subclass does not override this method, then a default error estimator is
        used. This estimates the error as ``|est - refined_est|`` where ``est`` is
        ``estimate(f, a, b)`` and ``refined_est`` is the sum of
        ``estimate(f, a_k, b_k)`` where ``a_k, b_k`` are the coordinates of each
        subregion of the region described by ``a`` and ``b``. In the 1D case, this
        is equivalent to comparing the integral over an entire interval ``[a, b]`` to
        the sum of the integrals over the left and right subintervals, ``[a, (a+b)/2]``
        and ``[(a+b)/2, b]``.

        Parameters
        ----------
        f : callable
            Function to estimate error for. `f` must have the signature::
                f(x : ndarray, \*args) -> ndarray

            `f` should accept arrays `x` of shape::
                (npoints, ndim)

            and output arrays of shape::
                (npoints, output_dim_1, ..., output_dim_n)

            In this case, `estimate` will return arrays of shape::
                (output_dim_1, ..., output_dim_n)
        a, b : ndarray
            Lower and upper limits of integration as rank-1 arrays specifying the left
            and right endpoints of the intervals being integrated over. Infinite limits
            are currently not supported.
        args : tuple, optional
            Additional positional args passed to `f`, if any.

        Returns
        -------
        err_est : ndarray
            Result of error estimation. If `f` returns arrays of shape
            ``(npoints, output_dim_1, ..., output_dim_n)``, then `est` will be
            of shape ``(output_dim_1, ..., output_dim_n)``.
        r   )r   Ú_split_subregionÚxpÚabs)	r   r   r   r   r   ÚestÚrefined_estÚa_kÚb_ks	            r   Úestimate_errorzRule.estimate_errorf   su   € ðV �mŠm˜A˜q ! TÑ*Ô*ˆØˆå(¨¨AÑ.Ô.ð 	<ð 	<‰HˆC�Ø˜4Ÿ=š=¨¨C°°dÑ;Ô;Ñ;ˆKˆKàŒw�{Š{˜3 Ñ,Ñ-Ô-Ð-r   N©r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r      sH   € € € € € ð:ð :ðx!"ð !"ð !"ð !"ðF1.ð 1.ð 1.ð 1.ð 1.ð 1.r   r   c                   ó6   — e Zd ZdZd„ Zed„ ¦   «         Zdd„ZdS )Ú	FixedRuleaÞ  
    A rule implemented as the weighted sum of function evaluations at fixed nodes.

    Attributes
    ----------
    nodes_and_weights : (ndarray, ndarray)
        A tuple ``(nodes, weights)`` of nodes at which to evaluate ``f`` and the
        corresponding weights. ``nodes`` should be of shape ``(num_nodes,)`` for 1D
        cubature rules (quadratures) and more generally for N-D cubature rules, it
        should be of shape ``(num_nodes, ndim)``. ``weights`` should be of shape
        ``(num_nodes,)``. The nodes and weights should be for integrals over
        :math:`[-1, 1]^n`.

    See Also
    --------
    GaussLegendreQuadrature, GaussKronrodQuadrature, GenzMalikCubature

    Examples
    --------

    Implementing Simpson's 1/3 rule:

    >>> import numpy as np
    >>> from scipy.integrate._rules import FixedRule
    >>> class SimpsonsQuad(FixedRule):
    ...     @property
    ...     def nodes_and_weights(self):
    ...         nodes = np.array([-1, 0, 1])
    ...         weights = np.array([1/3, 4/3, 1/3])
    ...         return (nodes, weights)
    >>> rule = SimpsonsQuad()
    >>> rule.estimate(
    ...     f=lambda x: x**2,
    ...     a=np.array([0]),
    ...     b=np.array([1]),
    ... )
     [0.3333333]
    c                 ó   — d | _         d S ©N)r   ©r   s    r   Ú__init__zFixedRule.__init__Â   s   € ØˆŒˆˆr   c                 ó   — t           ‚r%   r
   r&   s    r   Únodes_and_weightszFixedRule.nodes_and_weightsÅ   s   € å!Ð!r   r   c           	      ó€   — | j         \  }}| j        €t          |¦  «        | _        t          ||||||| j        ¦  «        S )aM  
        Calculate estimate of integral of `f` in rectangular region described by
        corners `a` and `b` as ``sum(weights * f(nodes))``.

        Nodes and weights will automatically be adjusted from calculating integrals over
        :math:`[-1, 1]^n` to :math:`[a, b]^n`.

        Parameters
        ----------
        f : callable
            Function to integrate. `f` must have the signature::
                f(x : ndarray, \*args) -> ndarray

            `f` should accept arrays `x` of shape::
                (npoints, ndim)

            and output arrays of shape::
                (npoints, output_dim_1, ..., output_dim_n)

            In this case, `estimate` will return arrays of shape::
                (output_dim_1, ..., output_dim_n)
        a, b : ndarray
            Lower and upper limits of integration as rank-1 arrays specifying the left
            and right endpoints of the intervals being integrated over. Infinite limits
            are currently not supported.
        args : tuple, optional
            Additional positional args passed to `f`, if any.

        Returns
        -------
        est : ndarray
            Result of estimation. If `f` returns arrays of shape ``(npoints,
            output_dim_1, ..., output_dim_n)``, then `est` will be of shape
            ``(output_dim_1, ..., output_dim_n)``.
        )r)   r   r   Ú_apply_fixed_rule)r   r   r   r   r   ÚnodesÚweightss          r   r   zFixedRule.estimateÉ   sC   € ðH Ô/‰ˆˆwàŒ7ˆ?Ý% eÑ,Ô,ˆDŒGå   A q¨%°¸$ÀÄÑHÔHÐHr   Nr   )r   r   r    r!   r'   Úpropertyr)   r   r   r   r   r#   r#   š   sc   € € € € € ð%ð %ðNð ð ð ð"ð "ñ „Xð"ð)Ið )Ið )Ið )Ið )Ið )Ir   r#   c                   óL   — e Zd ZdZd„ Zed„ ¦   «         Zed„ ¦   «         Zdd„ZdS )	ÚNestedFixedRuleaÖ  
    A cubature rule with error estimate given by the difference between two underlying
    fixed rules.

    If constructed as ``NestedFixedRule(higher, lower)``, this will use::

        estimate(f, a, b) := higher.estimate(f, a, b)
        estimate_error(f, a, b) := \|higher.estimate(f, a, b) - lower.estimate(f, a, b)|

    (where the absolute value is taken elementwise).

    Attributes
    ----------
    higher : Rule
        Higher accuracy rule.

    lower : Rule
        Lower accuracy rule.

    See Also
    --------
    GaussKronrodQuadrature

    Examples
    --------

    >>> from scipy.integrate import cubature
    >>> from scipy.integrate._rules import (
    ...     GaussLegendreQuadrature, NestedFixedRule, ProductNestedFixed
    ... )
    >>> higher = GaussLegendreQuadrature(10)
    >>> lower = GaussLegendreQuadrature(5)
    >>> rule = NestedFixedRule(
    ...     higher,
    ...     lower
    ... )
    >>> rule_2d = ProductNestedFixed([rule, rule])
    c                 ó0   — || _         || _        d | _        d S r%   )ÚhigherÚlowerr   )r   r2   r3   s      r   r'   zNestedFixedRule.__init__  s   € ØˆŒØˆŒ
ØˆŒˆˆr   c                 ó6   — | j         �| j         j        S t          ‚r%   )r2   r)   r   r&   s    r   r)   z!NestedFixedRule.nodes_and_weights"  s   € àŒ;Ð"Ø”;Ô0Ð0å%Ð%r   c                 ó6   — | j         �| j         j        S t          ‚r%   )r3   r)   r   r&   s    r   Úlower_nodes_and_weightsz'NestedFixedRule.lower_nodes_and_weights)  s   € àŒ:Ð!Ø”:Ô/Ð/å%Ð%r   r   c                 ó>  — | j         \  }}| j        \  }}| j        €t          |¦  «        | _        | j                             ||gd¬¦  «        }	| j                             || gd¬¦  «        }
| j                             t          ||||	|
|| j        ¦  «        ¦  «        S )aÒ  
        Estimate the error of the approximation for the integral of `f` in rectangular
        region described by corners `a` and `b`.

        Parameters
        ----------
        f : callable
            Function to estimate error for. `f` must have the signature::
                f(x : ndarray, \*args) -> ndarray

            `f` should accept arrays `x` of shape::
                (npoints, ndim)

            and output arrays of shape::
                (npoints, output_dim_1, ..., output_dim_n)

            In this case, `estimate` will return arrays of shape::
                (output_dim_1, ..., output_dim_n)
        a, b : ndarray
            Lower and upper limits of integration as rank-1 arrays specifying the left
            and right endpoints of the intervals being integrated over. Infinite limits
            are currently not supported.
        args : tuple, optional
            Additional positional args passed to `f`, if any.

        Returns
        -------
        err_est : ndarray
            Result of error estimation. If `f` returns arrays of shape
            ``(npoints, output_dim_1, ..., output_dim_n)``, then `est` will be
            of shape ``(output_dim_1, ..., output_dim_n)``.
        Nr   ©Úaxis)r)   r6   r   r   Úconcatr   r+   )r   r   r   r   r   r,   r-   Úlower_nodesÚlower_weightsÚerror_nodesÚerror_weightss              r   r   zNestedFixedRule.estimate_error0  sŸ   € ðD Ô/‰ˆˆwØ%)Ô%AÑ"ˆ�]àŒ7ˆ?Ý% eÑ,Ô,ˆDŒGà”g—n’n e¨[Ð%9À�nÑBÔBˆØœŸš¨°-°Ð'@Àq˜ÑIÔIˆàŒw�{Š{Ý˜a  A {°MÀ4ÈÌÑQÔQñ
ô 
ð 	
r   Nr   )	r   r   r    r!   r'   r.   r)   r6   r   r   r   r   r0   r0   õ   sx   € € € € € ð%ð %ðNð ð ð
 ð&ð &ñ „Xð&ð ð&ð &ñ „Xð&ð-
ð -
ð -
ð -
ð -
ð -
r   r0   c                   óD   — e Zd ZdZd„ Zed„ ¦   «         Zed„ ¦   «         ZdS )ÚProductNestedFixeda`  
    Find the n-dimensional cubature rule constructed from the Cartesian product of 1-D
    `NestedFixedRule` quadrature rules.

    Given a list of N 1-dimensional quadrature rules which support error estimation
    using NestedFixedRule, this will find the N-dimensional cubature rule obtained by
    taking the Cartesian product of their nodes, and estimating the error by taking the
    difference with a lower-accuracy N-dimensional cubature rule obtained using the
    ``.lower_nodes_and_weights`` rule in each of the base 1-dimensional rules.

    Parameters
    ----------
    base_rules : list of NestedFixedRule
        List of base 1-dimensional `NestedFixedRule` quadrature rules.

    Attributes
    ----------
    base_rules : list of NestedFixedRule
        List of base 1-dimensional `NestedFixedRule` qudarature rules.

    Examples
    --------

    Evaluate a 2D integral by taking the product of two 1D rules:

    >>> import numpy as np
    >>> from scipy.integrate import cubature
    >>> from scipy.integrate._rules import (
    ...  ProductNestedFixed, GaussKronrodQuadrature
    ... )
    >>> def f(x):
    ...     # f(x) = cos(x_1) + cos(x_2)
    ...     return np.sum(np.cos(x), axis=-1)
    >>> rule = ProductNestedFixed(
    ...     [GaussKronrodQuadrature(15), GaussKronrodQuadrature(15)]
    ... ) # Use 15-point Gauss-Kronrod, which implements NestedFixedRule
    >>> a, b = np.array([0, 0]), np.array([1, 1])
    >>> rule.estimate(f, a, b) # True value 2*sin(1), approximately 1.6829
     np.float64(1.682941969615793)
    >>> rule.estimate_error(f, a, b)
     np.float64(2.220446049250313e-16)
    c                 ót   — |D ]&}t          |t          ¦  «        st          d¦  «        ‚Œ'|| _        d | _        d S )Nz<base rules for product need to be instance ofNestedFixedRule)Ú
isinstancer0   Ú
ValueErrorÚ
base_rulesr   )r   rD   Úrules      r   r'   zProductNestedFixed.__init__Œ  sS   € Øð 	4ð 	4ˆDÝ˜d¥OÑ4Ô4ð 4Ý ð "3ñ 4ô 4ð 4ð4ð %ˆŒØˆŒˆˆr   c                 óì   — t          d„ | j        D ¦   «         ¦  «        }| j        €t          |¦  «        | _        | j                             t          d„ | j        D ¦   «         ¦  «        d¬¦  «        }||fS )Nc                 ó(   — g | ]}|j         d          ‘ŒS ©r   ©r)   ©Ú.0rE   s     r   ú
<listcomp>z8ProductNestedFixed.nodes_and_weights.<locals>.<listcomp>˜  s    € ÐCÐCÐC¨4ˆTÔ# AÔ&ÐCÐCÐCr   c                 ó(   — g | ]}|j         d          ‘ŒS ©é   rI   rJ   s     r   rL   z8ProductNestedFixed.nodes_and_weights.<locals>.<listcomp>   s    € ÐGÐGÐG¨t�Ô'¨Ô*ÐGÐGÐGr   éÿÿÿÿr8   ©Ú_cartesian_productrD   r   r   Úprod©r   r,   r-   s      r   r)   z$ProductNestedFixed.nodes_and_weights•  s‡   € å"ØCÐC°4´?ÐCÑCÔCñ
ô 
ˆð Œ7ˆ?Ý% eÑ,Ô,ˆDŒGà”'—,’,ÝØGÐG°t´ÐGÑGÔGñô ð ð	 ñ 
ô 
ˆð �gˆ~Ðr   c                 óì   — t          d„ | j        D ¦   «         ¦  «        }| j        €t          |¦  «        | _        | j                             t          d„ | j        D ¦   «         ¦  «        d¬¦  «        }||fS )Nc                 ó(   — g | ]}|j         d          ‘ŒS rH   ©r6   ©rK   Úcubatures     r   rL   z>ProductNestedFixed.lower_nodes_and_weights.<locals>.<listcomp>ª  s    € ÐQÐQÐQ°XˆXÔ-¨aÔ0ÐQÐQÐQr   c                 ó(   — g | ]}|j         d          ‘ŒS rN   rW   rX   s     r   rL   z>ProductNestedFixed.lower_nodes_and_weights.<locals>.<listcomp>²  s    € ÐUÐUÐU¸�Ô1°!Ô4ÐUÐUÐUr   rP   r8   rQ   rT   s      r   r6   z*ProductNestedFixed.lower_nodes_and_weights§  s‡   € å"ØQÐQÀÄÐQÑQÔQñ
ô 
ˆð Œ7ˆ?Ý% eÑ,Ô,ˆDŒGà”'—,’,ÝØUÐUÀTÄ_ÐUÑUÔUñô ð ð	 ñ 
ô 
ˆð �gˆ~Ðr   N)r   r   r    r!   r'   r   r)   r6   r   r   r   r@   r@   `  sd   € € € € € ð)ð )ðVð ð ð ðð ñ „_ðð" ðð ñ „_ðð ð r   r@   c                 ó¦   — t          | Ž } |j        | ddiŽ}|                     |                     |d¬¦  «        dt	          | ¦  «        f¦  «        }|S )NÚindexingÚijrP   r8   )r   ÚmeshgridÚreshapeÚstackÚlen)Úarraysr   Ú	arrays_ixÚresults       r   rR   rR   º  sU   € Ý	˜&Ð	!€Bà�”˜VÐ3¨dÐ3Ð3€IØ�ZŠZ˜Ÿš °˜Ñ4Ô4°r½3¸v¹;¼;Ð6GÑHÔH€Fà€Mr   Nc              #   óˆ  ‡ ‡‡‡K  — t          ‰ ‰¦  «        Š‰€‰ ‰z   dz  Šˆ ˆˆfd„t          ‰ j        d         ¦  «        D ¦   «         }ˆˆˆfd„t          ‰j        d         ¦  «        D ¦   «         }t          |¦  «        }t          |¦  «        }t          |j        d         ¦  «        D ]}||df         ||df         fV — ŒdS )a
  
    Given the coordinates of a region like a=[0, 0] and b=[1, 1], yield the coordinates
    of all subregions, which in this case would be::

        ([0, 0], [1/2, 1/2]),
        ([0, 1/2], [1/2, 1]),
        ([1/2, 0], [1, 1/2]),
        ([1/2, 1/2], [1, 1])
    Né   c                 óV   •— g | ]%}‰                      ‰|         ‰|         f¦  «        ‘Œ&S r   ©r`   )rK   Úir   Úsplit_atr   s     €€€r   rL   z$_split_subregion.<locals>.<listcomp>Ò  s2   ø€ ÐEÐEÐE¨aˆB�HŠH�a˜”d˜H QœKÐ(Ñ)Ô)ÐEÐEÐEr   r   c                 óV   •— g | ]%}‰                      ‰|         ‰|         f¦  «        ‘Œ&S r   rh   )rK   ri   r   rj   r   s     €€€r   rL   z$_split_subregion.<locals>.<listcomp>Ó  s2   ø€ ÐFÐFÐF¨qˆR�XŠX�x ”{ A a¤DÐ)Ñ*Ô*ÐFÐFÐFr   .)r   ÚrangeÚshaperR   )	r   r   r   rj   ÚleftÚrightÚa_subÚb_subri   s	   ````     r   r   r   Ã  sí   øøøøè è € õ 
˜˜AÑ	Ô	€BàÐØ˜‘E˜Q‘;ˆàEÐEÐEÐEÐEÐEµ5¸¼À¼Ñ3DÔ3DÐEÑEÔE€DØFÐFÐFÐFÐFÐFµE¸!¼'À!¼*Ñ4EÔ4EÐFÑFÔF€Eå˜tÑ$Ô$€EÝ˜uÑ%Ô%€Eå�5”;˜q”>Ñ"Ô"ð +ð +ˆØ�A�s�FŒm˜U 1 c 6œ]Ð*Ð*Ð*Ð*Ð*ð+ð +r   c                 ó6  — |j         }|                     ||¦  «        }|                     ||¦  «        }|j        dk    r|d d …d f         }|j        d         }t	          |¦  «        }	t	          |¦  «        }
||	k    s||
k    rt          d|› d|	› d|
› �¦  «        ‚||z
  }|dz   |dz  z  |z   }|                     ||¬¦  «        d|z  z  }||z  } | |g|¢R Ž }|                     |dgdg|j        dz
  z  ¢R ¦  «        }|                     ||z  d	|¬
¦  «        }|S )NrO   rP   z@rule and function are of incompatible dimension, nodes havendim z,, while limit of integration has ndima_ndim=z	, b_ndim=g      à?)Údtyperf   r   )r9   rs   )	rs   ÚastypeÚndimrm   r   rC   rS   r_   Úsum)r   r   r   Ú
orig_nodesÚorig_weightsr   r   Úresult_dtypeÚ	rule_ndimÚa_ndimÚb_ndimÚlengthsr,   Úweight_scale_factorr-   Úf_nodesÚweights_reshapedr   s                     r   r+   r+   Ü  sz  € à”7€LØ—’˜: |Ñ4Ô4€JØ—9’9˜\¨<Ñ8Ô8€Lð „˜!ÒÐØ    4 Ô(ˆ
àÔ  Ô$€Iå�Q‰ZŒZ€FÝ�Q‰ZŒZ€Fà�FÒÐ˜i¨6Ò1Ð1Ýð =Ø!*ð=ð =à#)ð=ð =à4:ð=ð =ñ >ô >ð 	>ð �!‰e€Gð ˜!‰^ ¨#¡Ñ.°Ñ2€Eð Ÿ'š' '°˜'Ñ>Ô>ÀÀIÁÑMÐØÐ0Ñ0€Gàˆa�ˆo˜ˆoˆoˆo€GØ—z’z '¨BÐ+L°1°#¸¼ÈÑ9IÑ2JÐ+LÐ+LÑMÔMÐð
 �&Š&Ð! GÑ+°!¸<ˆ&Ñ
HÔ
H€Cà€Jr   r%   )Úscipy._lib._array_apir   r   Ú	functoolsr   r   r#   r0   r@   rR   r   r+   r   r   r   ú<module>rƒ      s=  ðØ :Ð :Ð :Ð :Ð :Ð :Ð :Ð :à %Ð %Ð %Ð %Ð %Ð %ðQ.ð Q.ð Q.ð Q.ð Q.ñ Q.ô Q.ð Q.ðhXIð XIð XIð XIð XI�ñ XIô XIð XIðvh
ð h
ð h
ð h
ð h
�iñ h
ô h
ð h
ðVWð Wð Wð Wð W˜ñ Wô Wð Wðtð ð ð+ð +ð +ð +ð2*ð *ð *ð *ð *r   