Ë
    âQ(hìr  ã                   óB  — d Z ddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ddgZ G d„ d«      Z G d„ d	e«      Z G d
„ de«      Z G d„ de«      Zdd„Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zd„ Zy)aU  Abstract linear algebra library.

This module defines a class hierarchy that implements a kind of "lazy"
matrix representation, called the ``LinearOperator``. It can be used to do
linear algebra with extremely large sparse or structured matrices, without
representing those explicitly in memory. Such matrices can be added,
multiplied, transposed, etc.

As a motivating example, suppose you want have a matrix where almost all of
the elements have the value one. The standard sparse matrix representation
skips the storage of zeros, but not ones. By contrast, a LinearOperator is
able to represent such matrices efficiently. First, we need a compact way to
represent an all-ones matrix::

    >>> import numpy as np
    >>> from scipy.sparse.linalg._interface import LinearOperator
    >>> class Ones(LinearOperator):
    ...     def __init__(self, shape):
    ...         super().__init__(dtype=None, shape=shape)
    ...     def _matvec(self, x):
    ...         return np.repeat(x.sum(), self.shape[0])

Instances of this class emulate ``np.ones(shape)``, but using a constant
amount of storage, independent of ``shape``. The ``_matvec`` method specifies
how this linear operator multiplies with (operates on) a vector. We can now
add this operator to a sparse matrix that stores only offsets from one::

    >>> from scipy.sparse.linalg._interface import aslinearoperator
    >>> from scipy.sparse import csr_array
    >>> offsets = csr_array([[1, 0, 2], [0, -1, 0], [0, 0, 3]])
    >>> A = aslinearoperator(offsets) + Ones(offsets.shape)
    >>> A.dot([1, 2, 3])
    array([13,  4, 15])

The result is the same as that given by its dense, explicitly-stored
counterpart::

    >>> (np.ones(A.shape, A.dtype) + offsets.toarray()).dot([1, 2, 3])
    array([13,  4, 15])

Several algorithms in the ``scipy.sparse`` library are able to operate on
``LinearOperator`` instances.
é    N)Úissparse)ÚisshapeÚ	isintlikeÚasmatrixÚis_pydata_spmatrixÚLinearOperatorÚaslinearoperatorc                   óì   ‡ — e Zd ZdZdZdZˆ fd„Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z ee«      Z d„ Z! ee!«      Z"d„ Z#d„ Z$ˆ xZ%S ) r   al  Common interface for performing matrix vector products

    Many iterative methods (e.g. cg, gmres) do not need to know the
    individual entries of a matrix to solve a linear system A@x=b.
    Such solvers only require the computation of matrix vector
    products, A@v where v is a dense vector.  This class serves as
    an abstract interface between iterative solvers and matrix-like
    objects.

    To construct a concrete LinearOperator, either pass appropriate
    callables to the constructor of this class, or subclass it.

    A subclass must implement either one of the methods ``_matvec``
    and ``_matmat``, and the attributes/properties ``shape`` (pair of
    integers) and ``dtype`` (may be None). It may call the ``__init__``
    on this class to have these attributes validated. Implementing
    ``_matvec`` automatically implements ``_matmat`` (using a naive
    algorithm) and vice-versa.

    Optionally, a subclass may implement ``_rmatvec`` or ``_adjoint``
    to implement the Hermitian adjoint (conjugate transpose). As with
    ``_matvec`` and ``_matmat``, implementing either ``_rmatvec`` or
    ``_adjoint`` implements the other automatically. Implementing
    ``_adjoint`` is preferable; ``_rmatvec`` is mostly there for
    backwards compatibility.

    Parameters
    ----------
    shape : tuple
        Matrix dimensions (M, N).
    matvec : callable f(v)
        Returns returns A @ v.
    rmatvec : callable f(v)
        Returns A^H @ v, where A^H is the conjugate transpose of A.
    matmat : callable f(V)
        Returns A @ V, where V is a dense matrix with dimensions (N, K).
    dtype : dtype
        Data type of the matrix.
    rmatmat : callable f(V)
        Returns A^H @ V, where V is a dense matrix with dimensions (M, K).

    Attributes
    ----------
    args : tuple
        For linear operators describing products etc. of other linear
        operators, the operands of the binary operation.
    ndim : int
        Number of dimensions (this is always 2)

    See Also
    --------
    aslinearoperator : Construct LinearOperators

    Notes
    -----
    The user-defined matvec() function must properly handle the case
    where v has shape (N,) as well as the (N,1) case.  The shape of
    the return type is handled internally by LinearOperator.

    It is highly recommended to explicitly specify the `dtype`, otherwise
    it is determined automatically at the cost of a single matvec application
    on `int8` zero vector using the promoted `dtype` of the output.
    Python `int` could be difficult to automatically cast to numpy integers
    in the definition of the `matvec` so the determination may be inaccurate.
    It is assumed that `matmat`, `rmatvec`, and `rmatmat` would result in
    the same dtype of the output given an `int8` input as `matvec`.

    LinearOperator instances can also be multiplied, added with each
    other and exponentiated, all lazily: the result of these operations
    is always a new, composite LinearOperator, that defers linear
    operations to the original operators and combines the results.

    More details regarding how to subclass a LinearOperator and several
    examples of concrete LinearOperator instances can be found in the
    external project `PyLops <https://pylops.readthedocs.io>`_.


    Examples
    --------
    >>> import numpy as np
    >>> from scipy.sparse.linalg import LinearOperator
    >>> def mv(v):
    ...     return np.array([2*v[0], 3*v[1]])
    ...
    >>> A = LinearOperator((2,2), matvec=mv)
    >>> A
    <2x2 _CustomLinearOperator with dtype=int8>
    >>> A.matvec(np.ones(2))
    array([ 2.,  3.])
    >>> A @ np.ones(2)
    array([ 2.,  3.])

    é   Nc                 ó,  •— | t         u rt        ‰| �	  t        «      S t        ‰| �	  | «      }t	        |«      j
                  t         j
                  k(  rBt	        |«      j                  t         j                  k(  rt        j                  dt        d¬«       |S )NzMLinearOperator subclass should implement at least one of _matvec and _matmat.r   )ÚcategoryÚ
stacklevel)
r   ÚsuperÚ__new__Ú_CustomLinearOperatorÚtypeÚ_matvecÚ_matmatÚwarningsÚwarnÚRuntimeWarning)ÚclsÚargsÚkwargsÚobjÚ	__class__s       €ú\/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/scipy/sparse/linalg/_interface.pyr   zLinearOperator.__new__š   sx   ø€ Ø”.Ñ ä‘7‘?Ô#8Ó9Ð9ä‘'‘/ #Ó&ˆCä�S“	×!Ñ!¤^×%;Ñ%;Ò;Ü˜S›	×)Ñ)¬^×-CÑ-CÒCÜ—‘ð Fä'5À!õEð ˆJó    c                 ó˜   — |�t        j                  |«      }t        |«      }t        |«      st	        d|›d�«      ‚|| _        || _        y)z¡Initialize this LinearOperator.

        To be called by subclasses. ``dtype`` may be None; ``shape`` should
        be convertible to a length-2 tuple.
        Nzinvalid shape z (must be 2-d))ÚnpÚdtypeÚtupler   Ú
ValueErrorÚshape)Úselfr!   r$   s      r   Ú__init__zLinearOperator.__init__©   sI   € ð ÐÜ—H‘H˜U“OˆEä�e“ˆÜ�uŒ~Ü˜~¨e¨Y°nÐEÓFÐFàˆŒ
Øˆ�
r   c                 óH  — | j                   €it        j                  | j                  d   t        j                  ¬«      }	 t        j
                  | j                  |«      «      }|j                   | _         yy# t        $ r! t        j                   t        «      | _         Y yw xY w)aø  Determine the dtype by executing `matvec` on an `int8` test vector.

        In `np.promote_types` hierarchy, the type `int8` is the smallest,
        so we call `matvec` on `int8` and use the promoted dtype of the output
        to set the default `dtype` of the `LinearOperator`.
        We assume that `matmat`, `rmatvec`, and `rmatmat` would result in
        the same dtype of the output given an `int8` input as `matvec`.

        Called from subclasses at the end of the __init__ routine.
        Néÿÿÿÿ)r!   )	r!   r    Úzerosr$   Úint8ÚasarrayÚmatvecÚOverflowErrorÚint)r%   ÚvÚmatvec_vs      r   Ú_init_dtypezLinearOperator._init_dtype¹   sw   € ð �:‰:ÐÜ—‘˜Ÿ™ B™¬r¯w©wÔ7ˆAð,ÜŸ:™: d§k¡k°!£nÓ5�ð
 &Ÿ^™^�•
ð øô !ò +äŸX™X¤c›]�–
ð+ús   Á $A7 Á7'B!Â B!c                 ó¤   — t        j                  |j                  D �cg c]#  }| j                  |j	                  dd«      «      ‘Œ% c}«      S c c}w )zÌDefault matrix-matrix multiplication handler.

        Falls back on the user-defined _matvec method, so defining that will
        define matrix multiplication (though in a very suboptimal way).
        r(   é   )r    ÚhstackÚTr,   Úreshape©r%   ÚXÚcols      r   r   zLinearOperator._matmatÎ   s9   € ô �y‰yÀAÇCÁCÖH¸S˜$Ÿ+™+ c§k¡k°"°QÓ&7Õ8ÒHÓIÐIùÒHs   ž(Ac                 óD   — | j                  |j                  dd«      «      S )ay  Default matrix-vector multiplication handler.

        If self is a linear operator of shape (M, N), then this method will
        be called on a shape (N,) or (N, 1) ndarray, and should return a
        shape (M,) or (M, 1) ndarray.

        This default implementation falls back on _matmat, so defining that
        will define matrix-vector multiplication as well.
        r(   r3   )Úmatmatr6   ©r%   Úxs     r   r   zLinearOperator._matvec×   s   € ð �{‰{˜1Ÿ9™9 R¨Ó+Ó,Ð,r   c                 óÚ  — t        j                  |«      }| j                  \  }}|j                  |fk7  r|j                  |dfk7  rt        d«      ‚| j	                  |«      }t        |t         j                  «      rt        |«      }nt        j                  |«      }|j                  dk(  r|j                  |«      }|S |j                  dk(  r|j                  |d«      }|S t        d«      ‚)ax  Matrix-vector multiplication.

        Performs the operation y=A@x where A is an MxN linear
        operator and x is a column vector or 1-d array.

        Parameters
        ----------
        x : {matrix, ndarray}
            An array with shape (N,) or (N,1).

        Returns
        -------
        y : {matrix, ndarray}
            A matrix or ndarray with shape (M,) or (M,1) depending
            on the type and shape of the x argument.

        Notes
        -----
        This matvec wraps the user-specified matvec routine or overridden
        _matvec method to ensure that y has the correct shape and type.

        r3   údimension mismatchr   z/invalid shape returned by user-defined matvec())r    Ú
asanyarrayr$   r#   r   Ú
isinstanceÚmatrixr   r+   Úndimr6   ©r%   r=   ÚMÚNÚys        r   r,   zLinearOperator.matvecã   sÈ   € ô0 �M‰M˜!Óˆà�j‰j‰ˆˆ!à�7‰7�q�dŠ?˜qŸw™w¨1¨Q¨%Ò/ÜÐ1Ó2Ð2à�L‰L˜‹Oˆä�aœŸ™Ô#Ü˜“‰Aä—
‘
˜1“ˆAà�6‰6�QŠ;Ø—	‘	˜!“ˆAð ˆð �V‰V�qŠ[Ø—	‘	˜!˜A“ˆAð ˆô ÐNÓOÐOr   c                 óÚ  — t        j                  |«      }| j                  \  }}|j                  |fk7  r|j                  |dfk7  rt        d«      ‚| j	                  |«      }t        |t         j                  «      rt        |«      }nt        j                  |«      }|j                  dk(  r|j                  |«      }|S |j                  dk(  r|j                  |d«      }|S t        d«      ‚)a‰  Adjoint matrix-vector multiplication.

        Performs the operation y = A^H @ x where A is an MxN linear
        operator and x is a column vector or 1-d array.

        Parameters
        ----------
        x : {matrix, ndarray}
            An array with shape (M,) or (M,1).

        Returns
        -------
        y : {matrix, ndarray}
            A matrix or ndarray with shape (N,) or (N,1) depending
            on the type and shape of the x argument.

        Notes
        -----
        This rmatvec wraps the user-specified rmatvec routine or overridden
        _rmatvec method to ensure that y has the correct shape and type.

        r3   r?   r   z0invalid shape returned by user-defined rmatvec())r    r@   r$   r#   Ú_rmatvecrA   rB   r   r+   rC   r6   rD   s        r   ÚrmatveczLinearOperator.rmatvec  sÉ   € ô0 �M‰M˜!Óˆà�j‰j‰ˆˆ!à�7‰7�q�dŠ?˜qŸw™w¨1¨Q¨%Ò/ÜÐ1Ó2Ð2à�M‰M˜!Óˆä�aœŸ™Ô#Ü˜“‰Aä—
‘
˜1“ˆAà�6‰6�QŠ;Ø—	‘	˜!“ˆAð ˆð �V‰V�qŠ[Ø—	‘	˜!˜A“ˆAð ˆô ÐOÓPÐPr   c                 óT  — t        | «      j                  t        j                  k(  rht        | d«      rVt        | «      j                  t        j                  k7  r0| j	                  |j                  dd«      «      j                  d«      S t        ‚| j                  j                  |«      S )z6Default implementation of _rmatvec; defers to adjoint.Ú_rmatmatr(   r3   )	r   Ú_adjointr   ÚhasattrrL   r6   ÚNotImplementedErrorÚHr,   r<   s     r   rI   zLinearOperator._rmatvecA  sz   € ä�‹:×Ñ¤.×"9Ñ"9Ò9ä˜˜jÔ)Ü˜T›
×+Ñ+¬~×/FÑ/FÒFà—}‘} Q§Y¡Y¨r°1Ó%5Ó6×>Ñ>¸rÓBÐBÜ%Ð%à—6‘6—=‘= Ó#Ð#r   c                 ó
  — t        |«      s t        |«      st        j                  |«      }|j                  dk7  rt        d|j                  › d�«      ‚|j                  d   | j                  d   k7  r%t        d| j                  › d|j                  › �«      ‚	 | j                  |«      }t        |t        j                  «      rt        |«      }|S # t        $ r(}t        |«      st        |«      rt        d«      |‚‚ d	}~ww xY w)
aP  Matrix-matrix multiplication.

        Performs the operation y=A@X where A is an MxN linear
        operator and X dense N*K matrix or ndarray.

        Parameters
        ----------
        X : {matrix, ndarray}
            An array with shape (N,K).

        Returns
        -------
        Y : {matrix, ndarray}
            A matrix or ndarray with shape (M,K) depending on
            the type of the X argument.

        Notes
        -----
        This matmat wraps any user-specified matmat routine or overridden
        _matmat method to ensure that y has the correct type.

        r   z$expected 2-d ndarray or matrix, not z-dr   r3   údimension mismatch: ú, zdUnable to multiply a LinearOperator with a sparse matrix. Wrap the matrix in aslinearoperator first.N)r   r   r    r@   rC   r#   r$   r   Ú	ExceptionÚ	TypeErrorrA   rB   r   ©r%   r8   ÚYÚes       r   r;   zLinearOperator.matmatM  sì   € ô. ˜”Ô1°!Ô4Ü—‘˜aÓ ˆAà�6‰6�QŠ;ÜÐCÀAÇFÁFÀ8È2ÐNÓOÐOà�7‰7�1‰:˜Ÿ™ A™Ò&ÜÐ3°D·J±J°<¸rÀ!Ç'Á'ÀÐKÓLÐLð	Ø—‘˜Q“ˆAô �aœŸ™Ô#Ü˜“ˆAàˆøô ò 	Ü˜Œ{Ô0°Ô3ÜðBóð ðð ûð	ús   ÂC Ã	DÃ#C=Ã=Dc                 ó  — t        |«      s t        |«      st        j                  |«      }|j                  dk7  rt        d|j                  z  «      ‚|j                  d   | j                  d   k7  r%t        d| j                  › d|j                  › �«      ‚	 | j                  |«      }t        |t        j                  «      rt        |«      }|S # t        $ r(}t        |«      st        |«      rt        d«      |‚‚ d}~ww xY w)a;  Adjoint matrix-matrix multiplication.

        Performs the operation y = A^H @ x where A is an MxN linear
        operator and x is a column vector or 1-d array, or 2-d array.
        The default implementation defers to the adjoint.

        Parameters
        ----------
        X : {matrix, ndarray}
            A matrix or 2D array.

        Returns
        -------
        Y : {matrix, ndarray}
            A matrix or 2D array depending on the type of the input.

        Notes
        -----
        This rmatmat wraps the user-specified rmatmat routine.

        r   z(expected 2-d ndarray or matrix, not %d-dr   rR   rS   zfUnable to multiply a LinearOperator with a sparse matrix. Wrap the matrix in aslinearoperator() first.N)r   r   r    r@   rC   r#   r$   rL   rT   rU   rA   rB   r   rV   s       r   ÚrmatmatzLinearOperator.rmatmat|  sò   € ô, ˜”Ô1°!Ô4Ü—‘˜aÓ ˆAà�6‰6�QŠ;ÜÐGØ Ÿv™vñ&ó 'ð 'ð �7‰7�1‰:˜Ÿ™ A™Ò&ÜÐ3°D·J±J°<¸rÀ!Ç'Á'ÀÐKÓLÐLð	Ø—‘˜aÓ ˆAô �aœŸ™Ô#Ü˜“ˆAØˆøô ò 	Ü˜Œ{Ô0°Ô3ÜðDóð ðð ûð	ús   ÂC Ã	DÃ#C<Ã<Dc                 ó&  — t        | «      j                  t        j                  k(  rLt        j                  |j
                  D �cg c]#  }| j                  |j                  dd«      «      ‘Œ% c}«      S | j                  j                  |«      S c c}w )z@Default implementation of _rmatmat defers to rmatvec or adjoint.r(   r3   )
r   rM   r   r    r4   r5   rJ   r6   rP   r;   r7   s      r   rL   zLinearOperator._rmatmatª  se   € ä�‹:×Ñ¤.×"9Ñ"9Ò9Ü—9‘9È!Ï#É#ÖNÀ3˜dŸl™l¨3¯;©;°r¸1Ó+=Õ>ÒNÓOÐOà—6‘6—=‘= Ó#Ð#ùò Os   Á(Bc                 ó   — | |z  S ©N© r<   s     r   Ú__call__zLinearOperator.__call__±  s   € Ø�A‰vˆr   c                 ó$   — | j                  |«      S r]   )Údotr<   s     r   Ú__mul__zLinearOperator.__mul__´  s   € Ø�x‰x˜‹{Ðr   c                 ó`   — t        j                  |«      st        d«      ‚t        | d|z  «      S )Nz.Can only divide a linear operator by a scalar.g      ð?)r    Úisscalarr#   Ú_ScaledLinearOperator©r%   Úothers     r   Ú__truediv__zLinearOperator.__truediv__·  s+   € Ü�{‰{˜5Ô!ÜÐMÓNÐNä$ T¨3¨u©9Ó5Ð5r   c                 ó°  — t        |t        «      rt        | |«      S t        j                  |«      rt        | |«      S t        |«      s t        |«      st        j                  |«      }|j                  dk(  s!|j                  dk(  r#|j                  d   dk(  r| j                  |«      S |j                  dk(  r| j                  |«      S t        d|›�«      ‚)ar  Matrix-matrix or matrix-vector multiplication.

        Parameters
        ----------
        x : array_like
            1-d or 2-d array, representing a vector or matrix.

        Returns
        -------
        Ax : array
            1-d or 2-d array (depending on the shape of x) that represents
            the result of applying this linear operator on x.

        r3   r   ú)expected 1-d or 2-d array or matrix, got )rA   r   Ú_ProductLinearOperatorr    rd   re   r   r   r+   rC   r$   r,   r;   r#   r<   s     r   ra   zLinearOperator.dot½  s¬   € ô �aœÔ(Ü)¨$°Ó2Ð2Ü�[‰[˜Œ^Ü(¨¨qÓ1Ð1ä˜A”;Ô'9¸!Ô'<ä—J‘J˜q“M�à�v‰v˜Š{˜aŸf™f¨šk¨a¯g©g°a©j¸AªoØ—{‘{ 1“~Ð%Ø—‘˜1’Ø—{‘{ 1“~Ð%ä Ð#LÈQÈEÐ!RÓSÐSr   c                 ód   — t        j                  |«      rt        d«      ‚| j                  |«      S ©Nz0Scalar operands are not allowed, use '*' instead)r    rd   r#   rb   rf   s     r   Ú
__matmul__zLinearOperator.__matmul__Ü  s/   € Ü�;‰;�uÔÜð /ó 0ð 0à�|‰|˜EÓ"Ð"r   c                 ód   — t        j                  |«      rt        d«      ‚| j                  |«      S rm   )r    rd   r#   Ú__rmul__rf   s     r   Ú__rmatmul__zLinearOperator.__rmatmul__â  s/   € Ü�;‰;�uÔÜð /ó 0ð 0à�}‰}˜UÓ#Ð#r   c                 óf   — t        j                  |«      rt        | |«      S | j                  |«      S r]   )r    rd   re   Ú_rdotr<   s     r   rp   zLinearOperator.__rmul__è  s(   € Ü�;‰;�qŒ>Ü(¨¨qÓ1Ð1à—:‘:˜a“=Ð r   c                 ó(  — t        |t        «      rt        || «      S t        j                  |«      rt        | |«      S t        |«      s t        |«      st        j                  |«      }|j                  dk(  s!|j                  dk(  rA|j                  d   dk(  r/| j                  j                  |j                  «      j                  S |j                  dk(  r/| j                  j                  |j                  «      j                  S t        d|›�«      ‚)aï  Matrix-matrix or matrix-vector multiplication from the right.

        Parameters
        ----------
        x : array_like
            1-d or 2-d array, representing a vector or matrix.

        Returns
        -------
        xA : array
            1-d or 2-d array (depending on the shape of x) that represents
            the result of applying this linear operator on x from the right.

        Notes
        -----
        This is copied from dot to implement right multiplication.
        r3   r   r   rj   )rA   r   rk   r    rd   re   r   r   r+   rC   r$   r5   r,   r;   r#   r<   s     r   rs   zLinearOperator._rdotî  sÌ   € ô$ �aœÔ(Ü)¨!¨TÓ2Ð2Ü�[‰[˜Œ^Ü(¨¨qÓ1Ð1ä˜A”;Ô'9¸!Ô'<ä—J‘J˜q“M�ð �v‰v˜Š{˜aŸf™f¨šk¨a¯g©g°a©j¸AªoØ—v‘v—}‘} Q§S¡SÓ)×+Ñ+Ð+Ø—‘˜1’Ø—v‘v—}‘} Q§S¡SÓ)×+Ñ+Ð+ä Ð#LÈQÈEÐ!RÓSÐSr   c                 óP   — t        j                  |«      rt        | |«      S t        S r]   )r    rd   Ú_PowerLinearOperatorÚNotImplemented)r%   Úps     r   Ú__pow__zLinearOperator.__pow__  s    € Ü�;‰;�qŒ>Ü'¨¨aÓ0Ð0ä!Ð!r   c                 óF   — t        |t        «      rt        | |«      S t        S r]   )rA   r   Ú_SumLinearOperatorrw   r<   s     r   Ú__add__zLinearOperator.__add__  s   € Ü�aœÔ(Ü% d¨AÓ.Ð.ä!Ð!r   c                 ó   — t        | d«      S )Nr(   )re   ©r%   s    r   Ú__neg__zLinearOperator.__neg__  s   € Ü$ T¨2Ó.Ð.r   c                 ó&   — | j                  | «      S r]   )r|   r<   s     r   Ú__sub__zLinearOperator.__sub__!  s   € Ø�|‰|˜Q˜BÓÐr   c                 ó¨   — | j                   \  }}| j                  €d}ndt        | j                  «      z   }d||| j                  j                  |fz  S )Nzunspecified dtypezdtype=z<%dx%d %s with %s>)r$   r!   Ústrr   Ú__name__)r%   rE   rF   Údts       r   Ú__repr__zLinearOperator.__repr__$  sN   € Ø�j‰j‰ˆˆ!Ø�:‰:ÐØ$‰BàœC §
¡
›OÑ+ˆBà# q¨!¨T¯^©^×-DÑ-DÀbÐ&IÑIÐIr   c                 ó"   — | j                  «       S )aƒ  Hermitian adjoint.

        Returns the Hermitian adjoint of self, aka the Hermitian
        conjugate or Hermitian transpose. For a complex matrix, the
        Hermitian adjoint is equal to the conjugate transpose.

        Can be abbreviated self.H instead of self.adjoint().

        Returns
        -------
        A_H : LinearOperator
            Hermitian adjoint of self.
        )rM   r~   s    r   ÚadjointzLinearOperator.adjoint-  s   € ð �}‰}‹Ðr   c                 ó"   — | j                  «       S )z´Transpose this linear operator.

        Returns a LinearOperator that represents the transpose of this one.
        Can be abbreviated self.T instead of self.transpose().
        )Ú
_transposer~   s    r   Ú	transposezLinearOperator.transpose?  s   € ð �‰Ó Ð r   c                 ó   — t        | «      S )z6Default implementation of _adjoint; defers to rmatvec.)Ú_AdjointLinearOperatorr~   s    r   rM   zLinearOperator._adjointI  s   € ä% dÓ+Ð+r   c                 ó   — t        | «      S )z? Default implementation of _transpose; defers to rmatvec + conj)Ú_TransposedLinearOperatorr~   s    r   rŠ   zLinearOperator._transposeM  s   € ä(¨Ó.Ð.r   )&r„   Ú
__module__Ú__qualname__Ú__doc__rC   Ú__array_ufunc__r   r&   r1   r   r   r,   rJ   rI   r;   rZ   rL   r_   rb   rh   ra   rn   rq   rp   rs   ry   r|   r   r�   r†   rˆ   ÚpropertyrP   r‹   r5   rM   rŠ   Ú__classcell__©r   s   @r   r   r   7   sÃ   ø„ ñ\ð| €Dà€Oôòò ,ò*Jò
-ò-ò^-ò^
$ò-ò^,ò\$òòò6òTò>#ò$ò!ò"TòH"ò"ò/ò òJòñ  	�Ó€Aò!ñ 	�Ó€Aò,ö/r   c                   óN   ‡ — e Zd ZdZ	 	 dˆ fd„	Zˆ fd„Zd„ Zd„ Zˆ fd„Zd„ Z	ˆ xZ
S )	r   z>Linear operator defined in terms of user-specified operations.c                 óŒ   •— t         ‰| �  ||«       d| _        || _        || _        || _        || _        | j                  «        y )Nr^   )r   r&   r   Ú"_CustomLinearOperator__matvec_implÚ#_CustomLinearOperator__rmatvec_implÚ#_CustomLinearOperator__rmatmat_implÚ"_CustomLinearOperator__matmat_implr1   )r%   r$   r,   rJ   r;   r!   rZ   r   s          €r   r&   z_CustomLinearOperator.__init__U  sE   ø€ ä‰Ñ˜ Ô&àˆŒ	à#ˆÔØ%ˆÔØ%ˆÔØ#ˆÔà×ÑÕr   c                 ó\   •— | j                   �| j                  |«      S t        ‰| �	  |«      S r]   )rœ   r   r   ©r%   r8   r   s     €r   r   z_CustomLinearOperator._matmatb  s/   ø€ Ø×ÑÐ)Ø×%Ñ% aÓ(Ð(ä‘7‘? 1Ó%Ð%r   c                 ó$   — | j                  |«      S r]   )r™   r<   s     r   r   z_CustomLinearOperator._matvech  s   € Ø×!Ñ! !Ó$Ð$r   c                 óV   — | j                   }|€t        d«      ‚| j                  |«      S )Nzrmatvec is not defined)rš   rO   )r%   r=   Úfuncs      r   rI   z_CustomLinearOperator._rmatveck  s/   € Ø×"Ñ"ˆØˆ<Ü%Ð&>Ó?Ð?Ø×"Ñ" 1Ó%Ð%r   c                 ó\   •— | j                   �| j                  |«      S t        ‰| �	  |«      S r]   )r›   r   rL   rž   s     €r   rL   z_CustomLinearOperator._rmatmatq  s0   ø€ Ø×ÑÐ*Ø×&Ñ& qÓ)Ð)ä‘7Ñ# AÓ&Ð&r   c                 óÀ   — t        | j                  d   | j                  d   f| j                  | j                  | j                  | j
                  | j                  ¬«      S )Nr3   r   )r$   r,   rJ   r;   rZ   r!   )r   r$   rš   r™   r›   rœ   r!   r~   s    r   rM   z_CustomLinearOperator._adjointw  sQ   € Ü$¨D¯J©J°q©M¸4¿:¹:Àa¹=Ð+IØ,0×,?Ñ,?Ø-1×-?Ñ-?Ø,0×,?Ñ,?Ø-1×-?Ñ-?Ø+/¯:©:ô7ð 	7r   )NNNN)r„   r�   r‘   r’   r&   r   r   rI   rL   rM   r•   r–   s   @r   r   r   R  s*   ø„ ÙHà;?Ø%)õô&ò%ò&ô'ö7r   r   c                   ó:   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zd„ Zˆ xZ	S )r�   z$Adjoint of arbitrary Linear Operatorc                 ó–   •— |j                   d   |j                   d   f}t        ‰| �	  |j                  |¬«       || _        |f| _        y ©Nr3   r   )r!   r$   ©r$   r   r&   r!   ÚAr   ©r%   r¨   r$   r   s      €r   r&   z_AdjointLinearOperator.__init__ƒ  óC   ø€ Ø—‘˜‘˜QŸW™W Q™ZÐ(ˆÜ‰Ñ˜qŸw™w¨eÐÔ4ØˆŒØ�Dˆ�	r   c                 ó8   — | j                   j                  |«      S r]   )r¨   rI   r<   s     r   r   z_AdjointLinearOperator._matvec‰  ó   € Ø�v‰v�‰˜qÓ!Ð!r   c                 ó8   — | j                   j                  |«      S r]   )r¨   r   r<   s     r   rI   z_AdjointLinearOperator._rmatvecŒ  ó   € Ø�v‰v�~‰~˜aÓ Ð r   c                 ó8   — | j                   j                  |«      S r]   )r¨   rL   r<   s     r   r   z_AdjointLinearOperator._matmat�  r¬   r   c                 ó8   — | j                   j                  |«      S r]   )r¨   r   r<   s     r   rL   z_AdjointLinearOperator._rmatmat’  r®   r   ©
r„   r�   r‘   r’   r&   r   rI   r   rL   r•   r–   s   @r   r�   r�   €  s   ø„ Ù.ôò"ò!ò"ö!r   r�   c                   ó:   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zd„ Zd„ Zˆ xZ	S )r�   z*Transposition of arbitrary Linear Operatorc                 ó–   •— |j                   d   |j                   d   f}t        ‰| �	  |j                  |¬«       || _        |f| _        y r¦   r§   r©   s      €r   r&   z"_TransposedLinearOperator.__init__˜  rª   r   c                 ó„   — t        j                  | j                  j                  t        j                  |«      «      «      S r]   )r    Úconjr¨   rI   r<   s     r   r   z!_TransposedLinearOperator._matvecž  ó&   € ä�w‰w�t—v‘v—‘¤r§w¡w¨q£zÓ2Ó3Ð3r   c                 ó„   — t        j                  | j                  j                  t        j                  |«      «      «      S r]   )r    rµ   r¨   r   r<   s     r   rI   z"_TransposedLinearOperator._rmatvec¢  ó&   € Ü�w‰w�t—v‘v—~‘~¤b§g¡g¨a£jÓ1Ó2Ð2r   c                 ó„   — t        j                  | j                  j                  t        j                  |«      «      «      S r]   )r    rµ   r¨   rL   r<   s     r   r   z!_TransposedLinearOperator._matmat¥  r¶   r   c                 ó„   — t        j                  | j                  j                  t        j                  |«      «      «      S r]   )r    rµ   r¨   r   r<   s     r   rL   z"_TransposedLinearOperator._rmatmat©  r¸   r   r±   r–   s   @r   r�   r�   •  s   ø„ Ù4ôò4ò3ò4ö3r   r�   c                 ó’   — |€g }| D ]-  }|€Œt        |d«      sŒ|j                  |j                  «       Œ/ t        j                  |Ž S )Nr!   )rN   Úappendr!   r    Úresult_type)Ú	operatorsÚdtypesr   s      r   Ú
_get_dtyperÀ   ¬  sJ   € Ø€~ØˆØò %ˆØ‰?œw s¨GÕ4Ø�M‰M˜#Ÿ)™)Õ$ð%ô �>‰>˜6Ð"Ð"r   c                   ó<   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZ	S )r{   c                 ó  •— t        |t        «      rt        |t        «      st        d«      ‚|j                  |j                  k7  rt        d|› d|› d�«      ‚||f| _        t
        ‰| �  t        ||g«      |j                  «       y )Nú)both operands have to be a LinearOperatorzcannot add ú and ú: shape mismatch)rA   r   r#   r$   r   r   r&   rÀ   ©r%   r¨   ÚBr   s      €r   r&   z_SumLinearOperator.__init__¶  su   ø€ Ü˜!œ^Ô,Ü˜q¤.Ô1ÜÐHÓIÐIØ�7‰7�a—g‘gÒÜ˜{¨1¨#¨U°1°#Ð5EÐFÓGÐGØ˜�FˆŒ	Ü‰Ñœ Q¨ FÓ+¨Q¯W©WÕ5r   c                 ó|   — | j                   d   j                  |«      | j                   d   j                  |«      z   S ©Nr   r3   ©r   r,   r<   s     r   r   z_SumLinearOperator._matvec¿  ó3   € Ø�y‰y˜‰|×"Ñ" 1Ó%¨¯	©	°!©×(;Ñ(;¸AÓ(>Ñ>Ð>r   c                 ó|   — | j                   d   j                  |«      | j                   d   j                  |«      z   S rÉ   ©r   rJ   r<   s     r   rI   z_SumLinearOperator._rmatvecÂ  ó3   € Ø�y‰y˜‰|×#Ñ# AÓ&¨¯©°1©×)=Ñ)=¸aÓ)@Ñ@Ð@r   c                 ó|   — | j                   d   j                  |«      | j                   d   j                  |«      z   S rÉ   ©r   rZ   r<   s     r   rL   z_SumLinearOperator._rmatmatÅ  rÎ   r   c                 ó|   — | j                   d   j                  |«      | j                   d   j                  |«      z   S rÉ   ©r   r;   r<   s     r   r   z_SumLinearOperator._matmatÈ  rË   r   c                 óR   — | j                   \  }}|j                  |j                  z   S r]   ©r   rP   ©r%   r¨   rÇ   s      r   rM   z_SumLinearOperator._adjointË  ó!   € Ø�y‰y‰ˆˆ1Ø�s‰s�Q—S‘S‰yÐr   ©
r„   r�   r‘   r&   r   rI   rL   r   rM   r•   r–   s   @r   r{   r{   µ  s#   ø„ ô6ò?òAòAò?ör   r{   c                   ó<   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZ	S )rk   c                 ó>  •— t        |t        «      rt        |t        «      st        d«      ‚|j                  d   |j                  d   k7  rt        d|› d|› d�«      ‚t        ‰| �  t        ||g«      |j                  d   |j                  d   f«       ||f| _        y )NrÃ   r3   r   zcannot multiply rÄ   rÅ   )rA   r   r#   r$   r   r&   rÀ   r   rÆ   s      €r   r&   z_ProductLinearOperator.__init__Ñ  s“   ø€ Ü˜!œ^Ô,Ü˜q¤.Ô1ÜÐHÓIÐIØ�7‰7�1‰:˜Ÿ™ ™Ò#ÜÐ/°¨s°%¸°sÐ:JÐKÓLÐLÜ‰Ñœ Q¨ FÓ+Ø67·g±g¸a±jÀ!Ç'Á'È!Á*Ð5Mô	Oà˜�Fˆ�	r   c                 óv   — | j                   d   j                  | j                   d   j                  |«      «      S rÉ   rÊ   r<   s     r   r   z_ProductLinearOperator._matvecÛ  ó.   € Ø�y‰y˜‰|×"Ñ" 4§9¡9¨Q¡<×#6Ñ#6°qÓ#9Ó:Ð:r   c                 óv   — | j                   d   j                  | j                   d   j                  |«      «      S ©Nr3   r   rÍ   r<   s     r   rI   z_ProductLinearOperator._rmatvecÞ  ó.   € Ø�y‰y˜‰|×#Ñ# D§I¡I¨a¡L×$8Ñ$8¸Ó$;Ó<Ð<r   c                 óv   — | j                   d   j                  | j                   d   j                  |«      «      S rÝ   rÐ   r<   s     r   rL   z_ProductLinearOperator._rmatmatá  rÞ   r   c                 óv   — | j                   d   j                  | j                   d   j                  |«      «      S rÉ   rÒ   r<   s     r   r   z_ProductLinearOperator._matmatä  rÛ   r   c                 óR   — | j                   \  }}|j                  |j                  z  S r]   rÔ   rÕ   s      r   rM   z_ProductLinearOperator._adjointç  rÖ   r   r×   r–   s   @r   rk   rk   Ð  s!   ø„ ôò;ò=ò=ò;ör   rk   c                   ó<   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZ	S )re   c                 ó8  •— t        |t        «      st        d«      ‚t        j                  |«      st        d«      ‚t        |t
        «      r|j                  \  }}||z  }t        |gt        |«      g«      }t        ‰| �)  ||j                  «       ||f| _        y )NúLinearOperator expected as Azscalar expected as alpha)rA   r   r#   r    rd   re   r   rÀ   r   r   r&   r$   )r%   r¨   ÚalphaÚalpha_originalr!   r   s        €r   r&   z_ScaledLinearOperator.__init__í  sˆ   ø€ Ü˜!œ^Ô,ÜÐ;Ó<Ð<Ü�{‰{˜5Ô!ÜÐ7Ó8Ð8Ü�aÔ.Ô/Ø !§¡ÑˆAˆ~ð ˜NÑ*ˆEä˜A˜3¤ e£ Ó.ˆÜ‰Ñ˜ §¡Ô(Ø˜�Jˆ�	r   c                 ó^   — | j                   d   | j                   d   j                  |«      z  S rÝ   rÊ   r<   s     r   r   z_ScaledLinearOperator._matvecý  ó(   € Ø�y‰y˜‰|˜dŸi™i¨™l×1Ñ1°!Ó4Ñ4Ð4r   c                 ó„   — t        j                  | j                  d   «      | j                  d   j                  |«      z  S rÝ   )r    rµ   r   rJ   r<   s     r   rI   z_ScaledLinearOperator._rmatvec   ó1   € Ü�w‰w�t—y‘y ‘|Ó$ t§y¡y°¡|×';Ñ';¸AÓ'>Ñ>Ð>r   c                 ó„   — t        j                  | j                  d   «      | j                  d   j                  |«      z  S rÝ   )r    rµ   r   rZ   r<   s     r   rL   z_ScaledLinearOperator._rmatmat  rê   r   c                 ó^   — | j                   d   | j                   d   j                  |«      z  S rÝ   rÒ   r<   s     r   r   z_ScaledLinearOperator._matmat  rè   r   c                 ód   — | j                   \  }}|j                  t        j                  |«      z  S r]   )r   rP   r    rµ   )r%   r¨   rå   s      r   rM   z_ScaledLinearOperator._adjoint	  s&   € Ø—9‘9‰ˆˆ5Ø�s‰s”R—W‘W˜U“^Ñ#Ð#r   r×   r–   s   @r   re   re   ì  s!   ø„ ôò 5ò?ò?ò5ö$r   re   c                   óB   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	ˆ xZ
S )rv   c                 ó&  •— t        |t        «      st        d«      ‚|j                  d   |j                  d   k7  rt        d|›�«      ‚t	        |«      r|dk  rt        d«      ‚t
        ‰| �  t        |g«      |j                  «       ||f| _        y )Nrä   r   r3   z$square LinearOperator expected, got z"non-negative integer expected as p)	rA   r   r#   r$   r   r   r&   rÀ   r   )r%   r¨   rx   r   s      €r   r&   z_PowerLinearOperator.__init__  s�   ø€ Ü˜!œ^Ô,ÜÐ;Ó<Ð<Ø�7‰7�1‰:˜Ÿ™ ™Ò#ÜÐCÀAÀ5ÐIÓJÐJÜ˜Œ|˜q 1šuÜÐAÓBÐBä‰Ñœ Q C›¨!¯'©'Ô2Ø˜�Fˆ�	r   c                 ó~   — t        j                  |d¬«      }t        | j                  d   «      D ]
  } ||«      }Œ |S )NT)Úcopyr3   )r    ÚarrayÚranger   )r%   Úfunr=   ÚresÚis        r   Ú_powerz_PowerLinearOperator._power  s<   € Ü�h‰h�q˜tÔ$ˆÜ�t—y‘y ‘|Ó$ò 	ˆAÙ�c“(‰Cð	àˆ
r   c                 óT   — | j                  | j                  d   j                  |«      S ©Nr   )r÷   r   r,   r<   s     r   r   z_PowerLinearOperator._matvec   ó!   € Ø�{‰{˜4Ÿ9™9 Q™<×.Ñ.°Ó2Ð2r   c                 óT   — | j                  | j                  d   j                  |«      S rù   )r÷   r   rJ   r<   s     r   rI   z_PowerLinearOperator._rmatvec#  ó!   € Ø�{‰{˜4Ÿ9™9 Q™<×/Ñ/°Ó3Ð3r   c                 óT   — | j                  | j                  d   j                  |«      S rù   )r÷   r   rZ   r<   s     r   rL   z_PowerLinearOperator._rmatmat&  rü   r   c                 óT   — | j                  | j                  d   j                  |«      S rù   )r÷   r   r;   r<   s     r   r   z_PowerLinearOperator._matmat)  rú   r   c                 ó>   — | j                   \  }}|j                  |z  S r]   rÔ   )r%   r¨   rx   s      r   rM   z_PowerLinearOperator._adjoint,  s   € Ø�y‰y‰ˆˆ1Ø�s‰s�a‰xˆr   )r„   r�   r‘   r&   r÷   r   rI   rL   r   rM   r•   r–   s   @r   rv   rv     s&   ø„ ô	òò3ò4ò4ò3ör   rv   c                   ó*   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zˆ xZS )ÚMatrixLinearOperatorc                 óz   •— t         ‰| �  |j                  |j                  «       || _        d | _        |f| _        y r]   )r   r&   r!   r$   r¨   Ú_MatrixLinearOperator__adjr   )r%   r¨   r   s     €r   r&   zMatrixLinearOperator.__init__2  s1   ø€ Ü‰Ñ˜Ÿ™ !§'¡'Ô*ØˆŒØˆŒ
Ø�Dˆ�	r   c                 ó8   — | j                   j                  |«      S r]   )r¨   ra   )r%   r8   s     r   r   zMatrixLinearOperator._matmat8  s   € Ø�v‰v�z‰z˜!‹}Ðr   c                 óf   — | j                   €t        | j                  «      | _         | j                   S r]   )r  Ú_AdjointMatrixOperatorr¨   r~   s    r   rM   zMatrixLinearOperator._adjoint;  s&   € Ø�:‰:ÐÜ/°·±Ó7ˆDŒJØ�z‰zÐr   )r„   r�   r‘   r&   r   rM   r•   r–   s   @r   r  r  1  s   ø„ ôòör   r  c                   ó(   — e Zd Zd„ Zed„ «       Zd„ Zy)r  c                 ó˜   — |j                   j                  «       | _        |f| _        |j                  d   |j                  d   f| _        y rÝ   )r5   rµ   r¨   r   r$   )r%   Úadjoint_arrays     r   r&   z_AdjointMatrixOperator.__init__B  sB   € Ø—‘×%Ñ%Ó'ˆŒØ"Ð$ˆŒ	Ø"×(Ñ(¨Ñ+¨]×-@Ñ-@ÀÑ-CÐCˆ�
r   c                 ó4   — | j                   d   j                  S rù   )r   r!   r~   s    r   r!   z_AdjointMatrixOperator.dtypeG  s   € à�y‰y˜‰|×!Ñ!Ð!r   c                 ó2   — t        | j                  d   «      S rù   )r  r   r~   s    r   rM   z_AdjointMatrixOperator._adjointK  s   € Ü# D§I¡I¨a¡LÓ1Ð1r   N)r„   r�   r‘   r&   r”   r!   rM   r^   r   r   r  r  A  s!   „ òDð
 ñ"ó ð"ó2r   r  c                   ó>   ‡ — e Zd Zdˆ fd„	Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZ	S )ÚIdentityOperatorc                 ó&   •— t         ‰| �  ||«       y r]   )r   r&   )r%   r$   r!   r   s      €r   r&   zIdentityOperator.__init__P  s   ø€ Ü‰Ñ˜ Õ&r   c                 ó   — |S r]   r^   r<   s     r   r   zIdentityOperator._matvecS  ó   € Øˆr   c                 ó   — |S r]   r^   r<   s     r   rI   zIdentityOperator._rmatvecV  r  r   c                 ó   — |S r]   r^   r<   s     r   rL   zIdentityOperator._rmatmatY  r  r   c                 ó   — |S r]   r^   r<   s     r   r   zIdentityOperator._matmat\  r  r   c                 ó   — | S r]   r^   r~   s    r   rM   zIdentityOperator._adjoint_  s   € Øˆr   r]   r×   r–   s   @r   r  r  O  s!   ø„ õ'òòòòör   r  c                 ó”  — t        | t        «      r| S t        | t        j                  «      st        | t        j                  «      rM| j
                  dkD  rt        d«      ‚t        j                  t        j                  | «      «      } t        | «      S t        | «      st        | «      rt        | «      S t        | d«      r~t        | d«      rrd}d}d}t        | d«      r| j                  }t        | d«      r| j                  }t        | d«      r| j                  }t        | j                   | j"                  |||¬	«      S t%        d
«      ‚)aÿ  Return A as a LinearOperator.

    'A' may be any of the following types:
     - ndarray
     - matrix
     - sparse array (e.g. csr_array, lil_array, etc.)
     - LinearOperator
     - An object with .shape and .matvec attributes

    See the LinearOperator documentation for additional information.

    Notes
    -----
    If 'A' has no .dtype attribute, the data type is determined by calling
    :func:`LinearOperator.matvec()` - set the .dtype attribute to prevent this
    call upon the linear operator creation.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.sparse.linalg import aslinearoperator
    >>> M = np.array([[1,2,3],[4,5,6]], dtype=np.int32)
    >>> aslinearoperator(M)
    <2x3 MatrixLinearOperator with dtype=int32>
    r   zarray must have ndim <= 2r$   r,   NrJ   rZ   r!   )rJ   rZ   r!   ztype not understood)rA   r   r    ÚndarrayrB   rC   r#   Ú
atleast_2dr+   r  r   r   rN   rJ   rZ   r!   r$   r,   rU   )r¨   rJ   rZ   r!   s       r   r	   r	   c  s  € ô4 �!”^Ô$Øˆä	�A”r—z‘zÔ	"¤j°´B·I±IÔ&>Ø�6‰6�AŠ:ÜÐ8Ó9Ð9Ü�M‰Mœ"Ÿ*™* Q›-Ó(ˆÜ# AÓ&Ð&ä	�!ŒÔ*¨1Ô-Ü# AÓ&Ð&ô �1�gÔ¤7¨1¨hÔ#7ØˆGØˆGØˆEä�q˜)Ô$ØŸ)™)�Ü�q˜)Ô$ØŸ)™)�Ü�q˜'Ô"ØŸ™�Ü! !§'¡'¨1¯8©8¸WØ*1¸ô@ð @ô Ð1Ó2Ð2r   r]   )r’   r   Únumpyr    Úscipy.sparser   Úscipy.sparse._sputilsr   r   r   r   Ú__all__r   r   r�   r�   rÀ   r{   rk   re   rv   r  r  r  r	   r^   r   r   ú<module>r     sº   ðñ*óX ã å !ß RÓ RàÐ/Ð
0€÷X/ñ X/ôv+7˜Nô +7ô\!˜^ô !ô*3 ô 3ó.#ô˜ô ô6˜^ô ô8$˜Nô $ôD ˜>ô  ôF˜>ô ô 2Ð1ô 2ô�~ô ó(63r   