§
    $�’j¸Z  ã                   óš   — d Z ddlmZmZ ddlmZ ddlZddlm	Z	 g d¢Z
d„ Z	 dd	„Z	 dd
„Z	 	 dd„Zd„ Zd„ Zd„ Zej        ddddddfd„ZdS )z3Equality-constrained quadratic programming solvers.é    )ÚlinalgÚblock_array)ÚcopysignN)Únorm)Úeqp_kktfactÚsphere_intersectionsÚbox_intersectionsÚbox_sphere_intersectionsÚinside_box_boundariesÚmodified_doglegÚprojected_cgc                 óL  — t          j        |¦  «        \  }t          j        |¦  «        \  }t          | |j        g|dggd¬¦  «        }t          j        | | g¦  «        }t          j        |¦  «        }|                     |¦  «        }	|	d|…         }
|	|||z   …          }|
|fS )aË  Solve equality-constrained quadratic programming (EQP) problem.

    Solve ``min 1/2 x.T H x + x.t c`` subject to ``A x + b = 0``
    using direct factorization of the KKT system.

    Parameters
    ----------
    H : sparse array, shape (n, n)
        Hessian matrix of the EQP problem.
    c : array_like, shape (n,)
        Gradient of the quadratic objective function.
    A : sparse array
        Jacobian matrix of the EQP problem.
    b : array_like, shape (m,)
        Right-hand side of the constraint equation.

    Returns
    -------
    x : array_like, shape (n,)
        Solution of the KKT problem.
    lagrange_multipliers : ndarray, shape (m,)
        Lagrange multipliers of the KKT problem.
    NÚcsc)Úformat)ÚnpÚshaper   ÚTÚhstackr   ÚspluÚsolve)ÚHÚcÚAÚbÚnÚmÚ
kkt_matrixÚkkt_vecÚluÚkkt_solÚxÚlagrange_multiplierss               ú^C:\Projects\DSCons\.venv\Lib\site-packages\scipy\optimize\_trustregion_constr\qp_subproblem.pyr   r      s«   € õ0 
Œ�!‰Œ�B€AÝ	Œ�!‰Œ�B€Aõ
 ˜q !¤#˜h¨¨D¨	Ð2¸5ÐAÑAÔA€JåŒi˜!˜˜a˜R˜Ñ!Ô!€Gõ
 
Œ�ZÑ	 Ô	 €BØ�hŠh�wÑÔ€GØ���Œ€AØ# A a¨¡c EœN˜?ÐàÐ"Ð"Ð"ó    Fc                 ó~  — t          |¦  «        dk    rdS t          j        |¦  «        r'|rt          j         }t          j        }nd}d}d}|||fS t          j        ||¦  «        }dt          j        | |¦  «        z  }t          j        | | ¦  «        |dz  z
  }	||z  d|z  |	z  z
  }
|
dk     rd}dd|fS t          j        |
¦  «        }|t          ||¦  «        z   }| d|z  z  }d|	z  |z  }t          ||g¦  «        \  }}|rd}n5|dk     s|dk    rd}d}d}n"d}t          d|¦  «        }t          d|¦  «        }|||fS )	aH  Find the intersection between segment (or line) and spherical constraints.

    Find the intersection between the segment (or line) defined by the
    parametric  equation ``x(t) = z + t*d`` and the ball
    ``||x|| <= trust_radius``.

    Parameters
    ----------
    z : array_like, shape (n,)
        Initial point.
    d : array_like, shape (n,)
        Direction.
    trust_radius : float
        Ball radius.
    entire_line : bool, optional
        When ``True``, the function returns the intersection between the line
        ``x(t) = z + t*d`` (``t`` can assume any value) and the ball
        ``||x|| <= trust_radius``. When ``False``, the function returns the intersection
        between the segment ``x(t) = z + t*d``, ``0 <= t <= 1``, and the ball.

    Returns
    -------
    ta, tb : float
        The line/segment ``x(t) = z + t*d`` is inside the ball for
        for ``ta <= t <= tb``.
    intersect : bool
        When ``True``, there is a intersection between the line/segment
        and the sphere. On the other hand, when ``False``, there is no
        intersection.
    r   ©r   r   Fé   Té   é   Féþÿÿÿ)
r   r   ÚisinfÚinfÚdotÚsqrtr   ÚsortedÚmaxÚmin)ÚzÚdÚtrust_radiusÚentire_lineÚtaÚtbÚ	intersectÚar   r   ÚdiscriminantÚsqrt_discriminantÚauxs                r#   r   r   A   s†  € õB ˆA�w„w�!‚|€|Øˆ{å	„x�ÑÔð !Øð 	Ý”&�ˆBÝ”ˆBˆBàˆBØˆBØˆ	Ø�2�yÐ Ð å
Œˆq�!‰Œ€AØ	�BŒF�1�a‰LŒLÑ€AÝ
Œˆq�!‰Œ�| Q‘Ñ&€AØ�Q‘3˜˜1™˜Q™‘;€LØ�aÒÐØˆ	Ø�!�YˆÐÝœ Ñ-Ô-Ðð �hÐ(¨!Ñ,Ô,Ñ
,€CØ
ˆ��1‘‰€BØ	ˆA‰�‰€BÝ�R˜�HÑÔ�F€Bˆàð Øˆ	ˆ	ð �Š6ˆ6�R˜!’V�VØˆIØˆBØˆBˆBàˆIõ �Q˜‘”ˆBÝ�Q˜‘”ˆBàˆr�9ÐÐr$   c                 ó  — t          j        | ¦  «        } t          j        |¦  «        }t          j        |¦  «        }t          j        |¦  «        }t          |¦  «        dk    rdS |dk    }| |         ||         k                          ¦   «         s$| |         ||         k                         ¦   «         rd}dd|fS t          j        |¦  «        }| |         } ||         }||         }||         }|| z
  |z  }|| z
  |z  }	t          t          j        ||	¦  «        ¦  «        }
t          t          j        ||	¦  «        ¦  «        }|
|k    rd}nd}|s3|dk     s|
dk    rd}d}
d}n t          d|
¦  «        }
t          d|¦  «        }|
||fS )a5  Find the intersection between segment (or line) and box constraints.

    Find the intersection between the segment (or line) defined by the
    parametric  equation ``x(t) = z + t*d`` and the rectangular box
    ``lb <= x <= ub``.

    Parameters
    ----------
    z : array_like, shape (n,)
        Initial point.
    d : array_like, shape (n,)
        Direction.
    lb : array_like, shape (n,)
        Lower bounds to each one of the components of ``x``. Used
        to delimit the rectangular box.
    ub : array_like, shape (n, )
        Upper bounds to each one of the components of ``x``. Used
        to delimit the rectangular box.
    entire_line : bool, optional
        When ``True``, the function returns the intersection between the line
        ``x(t) = z + t*d`` (``t`` can assume any value) and the rectangular
        box. When ``False``, the function returns the intersection between the segment
        ``x(t) = z + t*d``, ``0 <= t <= 1``, and the rectangular box.

    Returns
    -------
    ta, tb : float
        The line/segment ``x(t) = z + t*d`` is inside the box for
        for ``ta <= t <= tb``.
    intersect : bool
        When ``True``, there is a intersection between the line (or segment)
        and the rectangular box. On the other hand, when ``False``, there is no
        intersection.
    r   r&   FTr'   )	r   Úasarrayr   ÚanyÚlogical_notr0   Úminimumr1   Úmaximum)r2   r3   ÚlbÚubr5   Úzero_dr8   Ú
not_zero_dÚt_lbÚt_ubr6   r7   s               r#   r	   r	   —   s—  € õJ 	Œ
�1‰Œ€AÝ
Œ
�1‰Œ€AÝ	Œ�B‰Œ€BÝ	Œ�B‰Œ€BåˆA�w„w�!‚|€|Øˆ{ð �1Šf€Fð 	
ˆ&Œ	�B�v”JÒ×#Ò#Ñ%Ô%ð ¨!¨F¬)°b¸´jÒ*@×)EÒ)EÑ)GÔ)Gð Øˆ	Ø�!�YˆÐå” Ñ'Ô'€JØ	ˆ*Œ€AØ	ˆ*Œ€AØ	ˆJŒ€BØ	ˆJŒ€Bð ˆq‰D�A‰:€DØˆq‰D�A‰:€Då	�RŒZ˜˜dÑ#Ô#Ñ	$Ô	$€BÝ	�RŒZ˜˜dÑ#Ô#Ñ	$Ô	$€Bð 
ˆR‚x€xØˆ	ˆ	àˆ	àð Ø�Š6ˆ6�R˜!’V�VØˆIØˆBØˆBˆBõ �Q˜‘”ˆBÝ�Q˜‘”ˆBàˆr�9ÐÐr$   c                 ó  — t          | ||||¦  «        \  }}}	t          | |||¦  «        \  }
}}t          j        ||
¦  «        }t          j        ||¦  «        }|	r|r	||k    rd}nd}|r|
||dœ}|||	dœ}|||||fS |||fS )aý  Find the intersection between segment (or line) and box/sphere constraints.

    Find the intersection between the segment (or line) defined by the
    parametric  equation ``x(t) = z + t*d``, the rectangular box
    ``lb <= x <= ub`` and the ball ``||x|| <= trust_radius``.

    Parameters
    ----------
    z : array_like, shape (n,)
        Initial point.
    d : array_like, shape (n,)
        Direction.
    lb : array_like, shape (n,)
        Lower bounds to each one of the components of ``x``. Used
        to delimit the rectangular box.
    ub : array_like, shape (n, )
        Upper bounds to each one of the components of ``x``. Used
        to delimit the rectangular box.
    trust_radius : float
        Ball radius.
    entire_line : bool, optional
        When ``True``, the function returns the intersection between the line
        ``x(t) = z + t*d`` (``t`` can assume any value) and the constraints.
        When ``False``, the function returns the intersection between the segment
        ``x(t) = z + t*d``, ``0 <= t <= 1`` and the constraints.
    extra_info : bool, optional
        When ``True``, the function returns ``intersect_sphere`` and ``intersect_box``.

    Returns
    -------
    ta, tb : float
        The line/segment ``x(t) = z + t*d`` is inside the rectangular box and
        inside the ball for ``ta <= t <= tb``.
    intersect : bool
        When ``True``, there is a intersection between the line (or segment)
        and both constraints. On the other hand, when ``False``, there is no
        intersection.
    sphere_info : dict, optional
        Dictionary ``{ta, tb, intersect}`` containing the interval ``[ta, tb]``
        for which the line intercepts the ball. And a boolean value indicating
        whether the sphere is intersected by the line.
    box_info : dict, optional
        Dictionary ``{ta, tb, intersect}`` containing the interval ``[ta, tb]``
        for which the line intercepts the box. And a boolean value indicating
        whether the box is intersected by the line.
    TF)r6   r7   r8   )r	   r   r   rB   rA   )r2   r3   rC   rD   r4   r5   Ú
extra_infoÚta_bÚtb_bÚintersect_bÚta_sÚtb_sÚintersect_sr6   r7   r8   Úsphere_infoÚbox_infos                     r#   r
   r
   ì   sÓ   € õb 0°°1°b¸"Ø0;ñ=ô =Ñ€Dˆ$�å2°1°aØ3?Ø3>ñ@ô @Ñ€Dˆ$�õ 
Œ�D˜$Ñ	Ô	€BÝ	Œ�D˜$Ñ	Ô	€BØð �{ð  r¨R¢x xØˆ	ˆ	àˆ	àð !Ø!¨¸KÐHÐHˆØ d¸ÐEÐEˆØ�2�y +¨xÐ7Ð7à�2�yÐ Ð r$   c                 ób   — || k                          ¦   «         o| |k                          ¦   «         S )zCheck if lb <= x <= ub.)Úall©r!   rC   rD   s      r#   r   r   1  s%   € à�!ŠG�=Š=‰?Œ?Ð.  R¢Ÿ}š}™œÐ.r$   c                 óR   — t          j        t          j        | |¦  «        |¦  «        S )zReturn clipped value of x)r   rA   rB   rU   s      r#   Úreinforce_box_boundariesrW   6  s    € åŒ:•b”j  BÑ'Ô'¨Ñ,Ô,Ð,r$   c                 óà  — |                      |¦  «         }t          |||¦  «        rt          |¦  «        |k    r|}|S | j                              |¦  «        }|                       |¦  «        }	t	          j         ||¦  «         t	          j         |	|	¦  «        z  |z  }
t	          j        |
¦  «        }|
}||
z
  }t          |||||¦  «        \  }}}|r	|||z  z   }n#|}|
}t          |||||¦  «        \  }}}|||z  z   }|}|}t          |||||¦  «        \  }}}|||z  z   }t          |                       |¦  «        |z   ¦  «        t          |                       |¦  «        |z   ¦  «        k     r|S |S )a?  Approximately  minimize ``1/2*|| A x + b ||^2`` inside trust-region.

    Approximately solve the problem of minimizing ``1/2*|| A x + b ||^2``
    subject to ``||x|| < Delta`` and ``lb <= x <= ub`` using a modification
    of the classical dogleg approach.

    Parameters
    ----------
    A : LinearOperator (or sparse array or ndarray), shape (m, n)
        Matrix ``A`` in the minimization problem. It should have
        dimension ``(m, n)`` such that ``m < n``.
    Y : LinearOperator (or sparse array or ndarray), shape (n, m)
        LinearOperator that apply the projection matrix
        ``Q = A.T inv(A A.T)`` to the vector. The obtained vector
        ``y = Q x`` being the minimum norm solution of ``A y = x``.
    b : array_like, shape (m,)
        Vector ``b``in the minimization problem.
    trust_radius: float
        Trust radius to be considered. Delimits a sphere boundary
        to the problem.
    lb : array_like, shape (n,)
        Lower bounds to each one of the components of ``x``.
        It is expected that ``lb <= 0``, otherwise the algorithm
        may fail. If ``lb[i] = -Inf``, the lower
        bound for the ith component is just ignored.
    ub : array_like, shape (n, )
        Upper bounds to each one of the components of ``x``.
        It is expected that ``ub >= 0``, otherwise the algorithm
        may fail. If ``ub[i] = Inf``, the upper bound for the ith
        component is just ignored.

    Returns
    -------
    x : array_like, shape (n,)
        Solution to the problem.

    Notes
    -----
    Based on implementations described in pp. 885-886 from [1]_.

    References
    ----------
    .. [1] Byrd, Richard H., Mary E. Hribar, and Jorge Nocedal.
           "An interior point algorithm for large-scale nonlinear
           programming." SIAM Journal on Optimization 9.4 (1999): 877-900.
    )r-   r   r   r   r   Ú
zeros_liker
   )r   ÚYr   r4   rC   rD   Únewton_pointr!   ÚgÚA_gÚcauchy_pointÚorigin_pointr2   ÚpÚ_Úalphar8   Úx1Úx2s                      r#   r   r   ;  s¡  € ð` —E’E˜!‘H”H�9€Lå˜\¨2¨rÑ2Ô2ð Ý�ÑÔ Ò-Ð-ØˆØˆð 	
Œ�Š�‰
Œ
€Að �%Š%�‰(Œ(€CÝ”F˜1˜a‘L”L�=¥2¤6¨#¨sÑ#3Ô#3Ñ3°aÑ7€Lå”= Ñ.Ô.€Lð 	€AØ�|Ñ#€AÝ2°1°a¸¸RØ3?ñAô AÑ€A€uˆiàð 	Ø��q‘‰[ˆˆð ˆØˆÝ.¨q°!°R¸Ø/;ñ=ô =‰ˆˆ5�!à��q‘‰[ˆð 	€AØ€AÝ*¨1¨a°°RØ+7ñ9ô 9�K€A€uˆaà	
ˆU�1‰W‰€Bõ ˆA�EŠE�"‰IŒI˜‰MÑÔ�T !§%¢%¨¡)¤)¨a¡-Ñ0Ô0Ò0Ð0Øˆ	àˆ	r$   c           	      ó¤  — d}t          j        |¦  «        \  }t          j        |¦  «        \  }|                     | ¦  «        }|                     |                      |¦  «        |z   ¦  «        }|                     |¦  «        }| }|r|g}|                      |¦  «        }t          |¦  «        dz  }|t          |¦  «        z
  }|dk     rt	          d¦  «        ‚||k     r&ddddœ}|r|                     |¦  «         ||d<   ||fS |€6t          t          d	t          j        |¦  «        z  d
|z  ¦  «        |¦  «        }|€ t          j	        |t           j
         ¦  «        }|€t          j	        |t           j
        ¦  «        }|	€||z
  }	t          |	||z
  ¦  «        }	|
€||z
  }
d}d}d}t          j        |¦  «        }d}t          |	¦  «        D �]Ü}||k     rd} �nÐ|dz  }|                     |¦  «        }|dk    r^t          j        |¦  «        rt	          d¦  «        ‚t          |||||d¬¦  «        \  }} }!|!r|| |z  z   }t          |||¦  «        }d}d} �nR||z  } || |z  z   }"t           j                             |"¦  «        |k    r>t          || |z  |||¦  «        \  }}#}!|!r||#| z  |z  z   }t          |||¦  «        }d}d} nät#          |"||¦  «        rd}n|dz  }|dk    r:t          || |z  |||¦  «        \  }}#}!|!r||#| z  |z  z   }t          |||¦  «        }d}||
k    r nƒ|r|                     |"¦  «         || |z  z   }$|                     |$¦  «        }%t          |%¦  «        dz  }&|&|z  }'|% |'|z  z   }|"}|%}|%}t          |¦  «        dz  }|                      |¦  «        }�ŒÞt#          |||¦  «        s|}d}|||dœ}|r||d<   ||fS )a¥  Solve EQP problem with projected CG method.

    Solve equality-constrained quadratic programming problem
    ``min 1/2 x.T H x + x.t c``  subject to ``A x + b = 0`` and,
    possibly, to trust region constraints ``||x|| < trust_radius``
    and box constraints ``lb <= x <= ub``.

    Parameters
    ----------
    H : LinearOperator (or sparse array or ndarray), shape (n, n)
        Operator for computing ``H v``.
    c : array_like, shape (n,)
        Gradient of the quadratic objective function.
    Z : LinearOperator (or sparse array or ndarray), shape (n, n)
        Operator for projecting ``x`` into the null space of A.
    Y : LinearOperator,  sparse array, ndarray, shape (n, m)
        Operator that, for a given a vector ``b``, compute smallest
        norm solution of ``A x + b = 0``.
    b : array_like, shape (m,)
        Right-hand side of the constraint equation.
    trust_radius : float, optional
        Trust radius to be considered. By default, uses ``trust_radius=inf``,
        which means no trust radius at all.
    lb : array_like, shape (n,), optional
        Lower bounds to each one of the components of ``x``.
        If ``lb[i] = -Inf`` the lower bound for the i-th
        component is just ignored (default).
    ub : array_like, shape (n, ), optional
        Upper bounds to each one of the components of ``x``.
        If ``ub[i] = Inf`` the upper bound for the i-th
        component is just ignored (default).
    tol : float, optional
        Tolerance used to interrupt the algorithm.
    max_iter : int, optional
        Maximum algorithm iterations. Where ``max_inter <= n-m``.
        By default, uses ``max_iter = n-m``.
    max_infeasible_iter : int, optional
        Maximum infeasible (regarding box constraints) iterations the
        algorithm is allowed to take.
        By default, uses ``max_infeasible_iter = n-m``.
    return_all : bool, optional
        When ``true``, return the list of all vectors through the iterations.

    Returns
    -------
    x : array_like, shape (n,)
        Solution of the EQP problem.
    info : Dict
        Dictionary containing the following:

            - niter : Number of iterations.
            - stop_cond : Reason for algorithm termination:
                1. Iteration limit was reached;
                2. Reached the trust-region boundary;
                3. Negative curvature detected;
                4. Tolerance was satisfied.
            - allvecs : List containing all intermediary vectors (optional).
            - hits_boundary : True if the proposed step is on the boundary
              of the trust region.

    Notes
    -----
    Implementation of Algorithm 6.2 on [1]_.

    In the absence of spherical and box constraints, for sufficient
    iterations, the method returns a truly optimal result.
    In the presence of those constraints, the value returned is only
    a inexpensive approximation of the optimal value.

    References
    ----------
    .. [1] Gould, Nicholas IM, Mary E. Hribar, and Jorge Nocedal.
           "On the solution of equality constrained quadratic
            programming problems arising in optimization."
            SIAM Journal on Scientific Computing 23.4 (2001): 1376-1395.
    gÙ}ÚõÐò¾:r(   r   z.Trust region problem does not have a solution.T)ÚniterÚ	stop_condÚhits_boundaryÚallvecsNg{®Gáz„?gš™™™™™¹?Fr'   r)   z9Negative curvature not allowed for unrestricted problems.)r5   é   )r   r   r-   r   Ú
ValueErrorÚappendr0   r1   r.   Úfullr,   rY   Úranger+   r
   rW   r   r   )(r   r   ÚZrZ   r   r4   rC   rD   ÚtolÚmax_iterÚmax_infeasible_iterÚ
return_allÚCLOSE_TO_ZEROr   r   r!   Úrr\   r`   ri   ÚH_pÚrt_gÚtr_distanceÚinforh   rg   ÚcounterÚlast_feasible_xÚkÚiÚpt_H_pra   rb   r8   Úx_nextÚthetaÚr_nextÚg_nextÚ	rt_g_nextÚbetas(                                           r#   r   r   ›  s·  € ð` €Må	Œ�!‰Œ�B€AÝ	Œ�!‰Œ�B€Að 	
�Šˆqˆb‰	Œ	€AØ	�Šˆa�eŠe�A‰hŒh˜‰lÑÔ€AØ	�Šˆa‰Œ€AØ	
ˆ€Að ð Ø�#ˆà
�%Š%�‰(Œ(€CÝ�‰7Œ7�A‰:€Dð ¥ a¡¤Ñ(€KØ�Q‚€ÝÐIÑJÔJÐJð 
�}Ò	$Ð	$Ø¨¸TÐBÐBˆØð 	&Ø�NŠN˜1ÑÔÐØ%ˆD�‰OØ�$ˆwˆð €{Ý•#�d�RœW T™]œ]Ñ*¨C°$©JÑ7Ô7¸ÑGÔGˆà	€zÝŒW�Q�œ˜Ñ Ô ˆØ	€zÝŒW�Q�œÑÔˆàÐØ�Q‘3ˆÝ�8˜Q˜q™SÑ!Ô!€HàÐ"Ø ™cÐà€MØ€IØ€GÝ”m AÑ&Ô&€OØ	€AÝ�8‰_Œ_ð Tñ Tˆà�#Š:ˆ:ØˆIØ‰EØ	ˆQ‰ˆà—’˜‘”ˆà�QŠ;ˆ;ÝŒx˜Ñ%Ô%ð Ý ð ">ñ ?ô ?ð ?õ '?Ø�q˜"˜b ,¸Dð'Bñ 'Bô 'BÑ#��5˜)ð ð $Ø˜E !™G™�Aõ -¨Q°°BÑ7Ô7�à�	Ø $�Ø‘ð �v‘ˆØ�U˜1‘W‘ˆõ Œ9�>Š>˜&Ñ!Ô! \Ò1Ð1å":¸1¸eÀA¹gÀrÈ2Ø;Gñ#Iô #IÑˆAˆu�ið ð &Ø˜˜e™ A™Ñ%�õ )¨¨B°Ñ3Ô3ˆAàˆIØ ˆMØˆEõ ! ¨¨RÑ0Ô0ð 	ØˆGˆGà�q‰LˆGà�QŠ;ˆ;Ý":¸1¸eÀA¹gÀrÈ2Ø;Gñ#Iô #IÑˆAˆu�iàð Ø"# e¨E¡k°!¡mÑ"3�õ #;¸?Ø;=¸rñ#Cô #C�à�àÐ(Ò(Ð(ØˆEàð 	#Ø�NŠN˜6Ñ"Ô"Ð"ð �U˜3‘Y‘ˆà—’�v‘”ˆå˜‘L”L !‘Oˆ	Ø˜4ÑˆØˆH�t˜A‘vÑˆàˆØˆØˆÝ�A‰wŒw˜‰zˆØ�eŠe�A‰hŒhˆ‰å   B¨Ñ+Ô+ð ØˆØˆØ YØ*ð,ð ,€Dàð "Ø!ˆˆY‰Øˆdˆ7€Nr$   )F)FF)Ú__doc__Úscipy.sparser   r   Úmathr   Únumpyr   Únumpy.linalgr   Ú__all__r   r   r	   r
   r   rW   r   r,   r   © r$   r#   ú<module>rŒ      s<  ðØ 9Ð 9à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð €ð*#ð *#ð *#ð\ &+ðSð Sð Sð Sðn #(ðRð Rð Rð Rðl */Ø(-ðB!ð B!ð B!ð B!ðJ/ð /ð /ð
-ð -ð -ð
]ð ]ð ]ð@ .0¬VØ˜T tØ°DØ!ðbð bð bð bð bð br$   