
    \hS                         S r SSKJrJr  SSKJrJrJr  SSKJ	r	  SSK
Jr  SSKJrJr  SSKJr  SSKJr  SS	KJr  S
 rSS jrS rSS jrSS jrS rS rS rS rS rSS jrg)u	  
The module implements routines to model the polarization of optical fields
and can be used to calculate the effects of polarization optical elements on
the fields.

- Jones vectors.

- Stokes vectors.

- Jones matrices.

- Mueller matrices.

Examples
========

We calculate a generic Jones vector:

>>> from sympy import symbols, pprint, zeros, simplify
>>> from sympy.physics.optics.polarization import (jones_vector, stokes_vector,
...     half_wave_retarder, polarizing_beam_splitter, jones_2_stokes)

>>> psi, chi, p, I0 = symbols("psi, chi, p, I0", real=True)
>>> x0 = jones_vector(psi, chi)
>>> pprint(x0, use_unicode=True)
⎡-ⅈ⋅sin(χ)⋅sin(ψ) + cos(χ)⋅cos(ψ)⎤
⎢                                ⎥
⎣ⅈ⋅sin(χ)⋅cos(ψ) + sin(ψ)⋅cos(χ) ⎦

And the more general Stokes vector:

>>> s0 = stokes_vector(psi, chi, p, I0)
>>> pprint(s0, use_unicode=True)
⎡          I₀          ⎤
⎢                      ⎥
⎢I₀⋅p⋅cos(2⋅χ)⋅cos(2⋅ψ)⎥
⎢                      ⎥
⎢I₀⋅p⋅sin(2⋅ψ)⋅cos(2⋅χ)⎥
⎢                      ⎥
⎣    I₀⋅p⋅sin(2⋅χ)     ⎦

We calculate how the Jones vector is modified by a half-wave plate:

>>> alpha = symbols("alpha", real=True)
>>> HWP = half_wave_retarder(alpha)
>>> x1 = simplify(HWP*x0)

We calculate the very common operation of passing a beam through a half-wave
plate and then through a polarizing beam-splitter. We do this by putting this
Jones vector as the first entry of a two-Jones-vector state that is transformed
by a 4x4 Jones matrix modelling the polarizing beam-splitter to get the
transmitted and reflected Jones vectors:

>>> PBS = polarizing_beam_splitter()
>>> X1 = zeros(4, 1)
>>> X1[:2, :] = x1
>>> X2 = PBS*X1
>>> transmitted_port = X2[:2, :]
>>> reflected_port = X2[2:, :]

This allows us to calculate how the power in both ports depends on the initial
polarization:

>>> transmitted_power = jones_2_stokes(transmitted_port)[0]
>>> reflected_power = jones_2_stokes(reflected_port)[0]
>>> print(transmitted_power)
cos(-2*alpha + chi + psi)**2/2 + cos(2*alpha + chi - psi)**2/2


>>> print(reflected_power)
sin(-2*alpha + chi + psi)**2/2 + sin(2*alpha + chi - psi)**2/2

Please see the description of the individual functions for further
details and examples.

References
==========

.. [1] https://en.wikipedia.org/wiki/Jones_calculus
.. [2] https://en.wikipedia.org/wiki/Mueller_calculus
.. [3] https://en.wikipedia.org/wiki/Stokes_parameters

    )Ipi)Absimre)exp)sqrt)cossin)Matrix)simplify)TensorProductc                     [        [        * [        U5      -  [        U 5      -  [        U5      [        U 5      -  -   [        [        U5      -  [        U 5      -  [        U 5      [        U5      -  -   /5      $ )u  A Jones vector corresponding to a polarization ellipse with `psi` tilt,
and `chi` circularity.

Parameters
==========

psi : numeric type or SymPy Symbol
    The tilt of the polarization relative to the `x` axis.

chi : numeric type or SymPy Symbol
    The angle adjacent to the mayor axis of the polarization ellipse.


Returns
=======

Matrix :
    A Jones vector.

Examples
========

The axes on the Poincaré sphere.

>>> from sympy import pprint, symbols, pi
>>> from sympy.physics.optics.polarization import jones_vector
>>> psi, chi = symbols("psi, chi", real=True)

A general Jones vector.

>>> pprint(jones_vector(psi, chi), use_unicode=True)
⎡-ⅈ⋅sin(χ)⋅sin(ψ) + cos(χ)⋅cos(ψ)⎤
⎢                                ⎥
⎣ⅈ⋅sin(χ)⋅cos(ψ) + sin(ψ)⋅cos(χ) ⎦

Horizontal polarization.

>>> pprint(jones_vector(0, 0), use_unicode=True)
⎡1⎤
⎢ ⎥
⎣0⎦

Vertical polarization.

>>> pprint(jones_vector(pi/2, 0), use_unicode=True)
⎡0⎤
⎢ ⎥
⎣1⎦

Diagonal polarization.

>>> pprint(jones_vector(pi/4, 0), use_unicode=True)
⎡√2⎤
⎢──⎥
⎢2 ⎥
⎢  ⎥
⎢√2⎥
⎢──⎥
⎣2 ⎦

Anti-diagonal polarization.

>>> pprint(jones_vector(-pi/4, 0), use_unicode=True)
⎡ √2 ⎤
⎢ ── ⎥
⎢ 2  ⎥
⎢    ⎥
⎢-√2 ⎥
⎢────⎥
⎣ 2  ⎦

Right-hand circular polarization.

>>> pprint(jones_vector(0, pi/4), use_unicode=True)
⎡ √2 ⎤
⎢ ── ⎥
⎢ 2  ⎥
⎢    ⎥
⎢√2⋅ⅈ⎥
⎢────⎥
⎣ 2  ⎦

Left-hand circular polarization.

>>> pprint(jones_vector(0, -pi/4), use_unicode=True)
⎡  √2  ⎤
⎢  ──  ⎥
⎢  2   ⎥
⎢      ⎥
⎢-√2⋅ⅈ ⎥
⎢──────⎥
⎣  2   ⎦

)r   r   r   r
   )psichis     Y/var/www/auris/envauris/lib/python3.13/site-packages/sympy/physics/optics/polarization.pyjones_vectorr   a   sd    ~ A2c#h;s3x'#c(3s8*;;SX:c#h&S#c()::< = =    c                     UnX2-  [        SU -  5      -  [        SU-  5      -  nX2-  [        SU -  5      -  [        SU-  5      -  nX2-  [        SU-  5      -  n[        XEXg/5      $ )u  A Stokes vector corresponding to a polarization ellipse with ``psi``
tilt, and ``chi`` circularity.

Parameters
==========

psi : numeric type or SymPy Symbol
    The tilt of the polarization relative to the ``x`` axis.
chi : numeric type or SymPy Symbol
    The angle adjacent to the mayor axis of the polarization ellipse.
p : numeric type or SymPy Symbol
    The degree of polarization.
I : numeric type or SymPy Symbol
    The intensity of the field.


Returns
=======

Matrix :
    A Stokes vector.

Examples
========

The axes on the Poincaré sphere.

>>> from sympy import pprint, symbols, pi
>>> from sympy.physics.optics.polarization import stokes_vector
>>> psi, chi, p, I = symbols("psi, chi, p, I", real=True)
>>> pprint(stokes_vector(psi, chi, p, I), use_unicode=True)
⎡          I          ⎤
⎢                     ⎥
⎢I⋅p⋅cos(2⋅χ)⋅cos(2⋅ψ)⎥
⎢                     ⎥
⎢I⋅p⋅sin(2⋅ψ)⋅cos(2⋅χ)⎥
⎢                     ⎥
⎣    I⋅p⋅sin(2⋅χ)     ⎦


Horizontal polarization

>>> pprint(stokes_vector(0, 0), use_unicode=True)
⎡1⎤
⎢ ⎥
⎢1⎥
⎢ ⎥
⎢0⎥
⎢ ⎥
⎣0⎦

Vertical polarization

>>> pprint(stokes_vector(pi/2, 0), use_unicode=True)
⎡1 ⎤
⎢  ⎥
⎢-1⎥
⎢  ⎥
⎢0 ⎥
⎢  ⎥
⎣0 ⎦

Diagonal polarization

>>> pprint(stokes_vector(pi/4, 0), use_unicode=True)
⎡1⎤
⎢ ⎥
⎢0⎥
⎢ ⎥
⎢1⎥
⎢ ⎥
⎣0⎦

Anti-diagonal polarization

>>> pprint(stokes_vector(-pi/4, 0), use_unicode=True)
⎡1 ⎤
⎢  ⎥
⎢0 ⎥
⎢  ⎥
⎢-1⎥
⎢  ⎥
⎣0 ⎦

Right-hand circular polarization

>>> pprint(stokes_vector(0, pi/4), use_unicode=True)
⎡1⎤
⎢ ⎥
⎢0⎥
⎢ ⎥
⎢0⎥
⎢ ⎥
⎣1⎦

Left-hand circular polarization

>>> pprint(stokes_vector(0, -pi/4), use_unicode=True)
⎡1 ⎤
⎢  ⎥
⎢0 ⎥
⎢  ⎥
⎢0 ⎥
⎢  ⎥
⎣-1⎦

Unpolarized light

>>> pprint(stokes_vector(0, 0, 0), use_unicode=True)
⎡1⎤
⎢ ⎥
⎢0⎥
⎢ ⎥
⎢0⎥
⎢ ⎥
⎣0⎦

   )r
   r   r   )r   r   pr   S0S1S2S3s           r   stokes_vectorr      sm    n 
B	
S3ZAcE
	"B	
S3ZAcE
	"B	
S3ZB22"##r   c                    U u  p[        [        U5      S-  [        U5      S-  -   [        U5      S-  [        U5      S-  -
  S[        XR                  5       -  5      -  S[	        XR                  5       -  5      -  /5      $ )u;  Return the Stokes vector for a Jones vector ``e``.

Parameters
==========

e : SymPy Matrix
    A Jones vector.

Returns
=======

SymPy Matrix
    A Jones vector.

Examples
========

The axes on the Poincaré sphere.

>>> from sympy import pprint, pi
>>> from sympy.physics.optics.polarization import jones_vector
>>> from sympy.physics.optics.polarization import jones_2_stokes
>>> H = jones_vector(0, 0)
>>> V = jones_vector(pi/2, 0)
>>> D = jones_vector(pi/4, 0)
>>> A = jones_vector(-pi/4, 0)
>>> R = jones_vector(0, pi/4)
>>> L = jones_vector(0, -pi/4)
>>> pprint([jones_2_stokes(e) for e in [H, V, D, A, R, L]],
...         use_unicode=True)
⎡⎡1⎤  ⎡1 ⎤  ⎡1⎤  ⎡1 ⎤  ⎡1⎤  ⎡1 ⎤⎤
⎢⎢ ⎥  ⎢  ⎥  ⎢ ⎥  ⎢  ⎥  ⎢ ⎥  ⎢  ⎥⎥
⎢⎢1⎥  ⎢-1⎥  ⎢0⎥  ⎢0 ⎥  ⎢0⎥  ⎢0 ⎥⎥
⎢⎢ ⎥, ⎢  ⎥, ⎢ ⎥, ⎢  ⎥, ⎢ ⎥, ⎢  ⎥⎥
⎢⎢0⎥  ⎢0 ⎥  ⎢1⎥  ⎢-1⎥  ⎢0⎥  ⎢0 ⎥⎥
⎢⎢ ⎥  ⎢  ⎥  ⎢ ⎥  ⎢  ⎥  ⎢ ⎥  ⎢  ⎥⎥
⎣⎣0⎦  ⎣0 ⎦  ⎣0⎦  ⎣0 ⎦  ⎣1⎦  ⎣-1⎦⎦

r   )r   r   r   	conjugater   )eexeys      r   jones_2_stokesr#   B  sy    P FB3r7A:B
*r7A:B
*R<<>)**bLLN*++- . .r   c                     [        [        U 5      S-  [        U 5      [        U 5      -  /[        U 5      [        U 5      -  [        U 5      S-  //5      nU$ )u  A linear polarizer Jones matrix with transmission axis at
an angle ``theta``.

Parameters
==========

theta : numeric type or SymPy Symbol
    The angle of the transmission axis relative to the horizontal plane.

Returns
=======

SymPy Matrix
    A Jones matrix representing the polarizer.

Examples
========

A generic polarizer.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import linear_polarizer
>>> theta = symbols("theta", real=True)
>>> J = linear_polarizer(theta)
>>> pprint(J, use_unicode=True)
⎡      2                     ⎤
⎢   cos (θ)     sin(θ)⋅cos(θ)⎥
⎢                            ⎥
⎢                     2      ⎥
⎣sin(θ)⋅cos(θ)     sin (θ)   ⎦


r   )r   r
   r   )thetaMs     r   linear_polarizerr'   q  sR    D 	UQE
3u: 56UCJ&E
A68 	9AHr   c           	         [        [        U 5      S-  [        [        U-  5      [	        U 5      S-  -  -   S[        [        U-  5      -
  [        U 5      -  [	        U 5      -  /S[        [        U-  5      -
  [        U 5      -  [	        U 5      -  [	        U 5      S-  [        [        U-  5      [        U 5      S-  -  -   //5      nU[        [        * U-  S-  5      -  $ )u  A phase retarder Jones matrix with retardance ``delta`` at angle ``theta``.

Parameters
==========

theta : numeric type or SymPy Symbol
    The angle of the fast axis relative to the horizontal plane.
delta : numeric type or SymPy Symbol
    The phase difference between the fast and slow axes of the
    transmitted light.

Returns
=======

SymPy Matrix :
    A Jones matrix representing the retarder.

Examples
========

A generic retarder.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import phase_retarder
>>> theta, delta = symbols("theta, delta", real=True)
>>> R = phase_retarder(theta, delta)
>>> pprint(R, use_unicode=True)
⎡                          -ⅈ⋅δ               -ⅈ⋅δ               ⎤
⎢                          ─────              ─────              ⎥
⎢⎛ ⅈ⋅δ    2         2   ⎞    2    ⎛     ⅈ⋅δ⎞    2                ⎥
⎢⎝ℯ   ⋅sin (θ) + cos (θ)⎠⋅ℯ       ⎝1 - ℯ   ⎠⋅ℯ     ⋅sin(θ)⋅cos(θ)⎥
⎢                                                                ⎥
⎢            -ⅈ⋅δ                                           -ⅈ⋅δ ⎥
⎢            ─────                                          ─────⎥
⎢⎛     ⅈ⋅δ⎞    2                  ⎛ ⅈ⋅δ    2         2   ⎞    2  ⎥
⎣⎝1 - ℯ   ⎠⋅ℯ     ⋅sin(θ)⋅cos(θ)  ⎝ℯ   ⋅cos (θ) + sin (θ)⎠⋅ℯ     ⎦

r      )r   r
   r   r   r   )r%   deltaRs      r   phase_retarderr,     s    N 	UQQuWc%j!m!;;3qw<U+CJ68C%L.#e*,SZ7E
AAeGSZ] ::<= 	>A S!E!_r   c                 "    [        U [        5      $ )uM  A half-wave retarder Jones matrix at angle ``theta``.

Parameters
==========

theta : numeric type or SymPy Symbol
    The angle of the fast axis relative to the horizontal plane.

Returns
=======

SymPy Matrix
    A Jones matrix representing the retarder.

Examples
========

A generic half-wave plate.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import half_wave_retarder
>>> theta= symbols("theta", real=True)
>>> HWP = half_wave_retarder(theta)
>>> pprint(HWP, use_unicode=True)
⎡   ⎛     2         2   ⎞                        ⎤
⎢-ⅈ⋅⎝- sin (θ) + cos (θ)⎠    -2⋅ⅈ⋅sin(θ)⋅cos(θ)  ⎥
⎢                                                ⎥
⎢                             ⎛   2         2   ⎞⎥
⎣   -2⋅ⅈ⋅sin(θ)⋅cos(θ)     -ⅈ⋅⎝sin (θ) - cos (θ)⎠⎦

r,   r   r%   s    r   half_wave_retarderr0     s    @ %$$r   c                 (    [        U [        S-  5      $ )u  A quarter-wave retarder Jones matrix at angle ``theta``.

Parameters
==========

theta : numeric type or SymPy Symbol
    The angle of the fast axis relative to the horizontal plane.

Returns
=======

SymPy Matrix
    A Jones matrix representing the retarder.

Examples
========

A generic quarter-wave plate.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import quarter_wave_retarder
>>> theta= symbols("theta", real=True)
>>> QWP = quarter_wave_retarder(theta)
>>> pprint(QWP, use_unicode=True)
⎡                       -ⅈ⋅π            -ⅈ⋅π               ⎤
⎢                       ─────           ─────              ⎥
⎢⎛     2         2   ⎞    4               4                ⎥
⎢⎝ⅈ⋅sin (θ) + cos (θ)⎠⋅ℯ       (1 - ⅈ)⋅ℯ     ⋅sin(θ)⋅cos(θ)⎥
⎢                                                          ⎥
⎢         -ⅈ⋅π                                        -ⅈ⋅π ⎥
⎢         ─────                                       ─────⎥
⎢           4                  ⎛   2           2   ⎞    4  ⎥
⎣(1 - ⅈ)⋅ℯ     ⋅sin(θ)⋅cos(θ)  ⎝sin (θ) + ⅈ⋅cos (θ)⎠⋅ℯ     ⎦

r   r.   r/   s    r   quarter_wave_retarderr2     s    H %A&&r   c                 H    [        [        U 5      S/S[        U 5      //5      $ )u  An attenuator Jones matrix with transmittance ``T``.

Parameters
==========

T : numeric type or SymPy Symbol
    The transmittance of the attenuator.

Returns
=======

SymPy Matrix
    A Jones matrix representing the filter.

Examples
========

A generic filter.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import transmissive_filter
>>> T = symbols("T", real=True)
>>> NDF = transmissive_filter(T)
>>> pprint(NDF, use_unicode=True)
⎡√T  0 ⎤
⎢      ⎥
⎣0   √T⎦

r   r   r	   )Ts    r   transmissive_filterr6     s$    < DGQ<!T!W.//r   c                 J    [        [        U 5      S/S[        U 5      * //5      $ )u  A reflective filter Jones matrix with reflectance ``R``.

Parameters
==========

R : numeric type or SymPy Symbol
    The reflectance of the filter.

Returns
=======

SymPy Matrix
    A Jones matrix representing the filter.

Examples
========

A generic filter.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import reflective_filter
>>> R = symbols("R", real=True)
>>> pprint(reflective_filter(R), use_unicode=True)
⎡√R   0 ⎤
⎢       ⎥
⎣0   -√R⎦

r   r4   )r+   s    r   reflective_filterr8   1  s&    : DGQ<!d1gX/00r   c           	          [        / SQ/ SQ/ SQS[        * [        S//5      n[        U[        X R	                  5       5      -  UR                  5       -  5      $ )u
  The Mueller matrix corresponding to Jones matrix `J`.

Parameters
==========

J : SymPy Matrix
    A Jones matrix.

Returns
=======

SymPy Matrix
    The corresponding Mueller matrix.

Examples
========

Generic optical components.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import (mueller_matrix,
...     linear_polarizer, half_wave_retarder, quarter_wave_retarder)
>>> theta = symbols("theta", real=True)

A linear_polarizer

>>> pprint(mueller_matrix(linear_polarizer(theta)), use_unicode=True)
⎡            cos(2⋅θ)      sin(2⋅θ)     ⎤
⎢  1/2       ────────      ────────    0⎥
⎢               2             2         ⎥
⎢                                       ⎥
⎢cos(2⋅θ)  cos(4⋅θ)   1    sin(4⋅θ)     ⎥
⎢────────  ──────── + ─    ────────    0⎥
⎢   2         4       4       4         ⎥
⎢                                       ⎥
⎢sin(2⋅θ)    sin(4⋅θ)    1   cos(4⋅θ)   ⎥
⎢────────    ────────    ─ - ────────  0⎥
⎢   2           4        4      4       ⎥
⎢                                       ⎥
⎣   0           0             0        0⎦

A half-wave plate

>>> pprint(mueller_matrix(half_wave_retarder(theta)), use_unicode=True)
⎡1              0                           0               0 ⎤
⎢                                                             ⎥
⎢        4           2                                        ⎥
⎢0  8⋅sin (θ) - 8⋅sin (θ) + 1           sin(4⋅θ)            0 ⎥
⎢                                                             ⎥
⎢                                     4           2           ⎥
⎢0          sin(4⋅θ)           - 8⋅sin (θ) + 8⋅sin (θ) - 1  0 ⎥
⎢                                                             ⎥
⎣0              0                           0               -1⎦

A quarter-wave plate

>>> pprint(mueller_matrix(quarter_wave_retarder(theta)), use_unicode=True)
⎡1       0             0            0    ⎤
⎢                                        ⎥
⎢   cos(4⋅θ)   1    sin(4⋅θ)             ⎥
⎢0  ──────── + ─    ────────    -sin(2⋅θ)⎥
⎢      2       2       2                 ⎥
⎢                                        ⎥
⎢     sin(4⋅θ)    1   cos(4⋅θ)           ⎥
⎢0    ────────    ─ - ────────  cos(2⋅θ) ⎥
⎢        2        2      2               ⎥
⎢                                        ⎥
⎣0    sin(2⋅θ)     -cos(2⋅θ)        0    ⎦

)r)   r   r   r)   )r)   r   r   )r   r)   r)   r   r   )r   r   r   r   r   inv)JAs     r   mueller_matrixr>   Q  sQ    N 	QB1 	 A
 AmA{{}55aeeg=>>r   c                 \   [        [        U 5      S[        [        U5      -  S/S[        U5      S[        * [        U5      -  [        [        U-  5      -  /[        [        U5      -  S[        U 5      S/S[        * [        U5      -  [        [        U-  5      -  S[        U5      //5      nU$ )a  A polarizing beam splitter Jones matrix at angle `theta`.

Parameters
==========

J : SymPy Matrix
    A Jones matrix.
Tp : numeric type or SymPy Symbol
    The transmissivity of the P-polarized component.
Rs : numeric type or SymPy Symbol
    The reflectivity of the S-polarized component.
Ts : numeric type or SymPy Symbol
    The transmissivity of the S-polarized component.
Rp : numeric type or SymPy Symbol
    The reflectivity of the P-polarized component.
phia : numeric type or SymPy Symbol
    The phase difference between transmitted and reflected component for
    output mode a.
phib : numeric type or SymPy Symbol
    The phase difference between transmitted and reflected component for
    output mode b.


Returns
=======

SymPy Matrix
    A 4x4 matrix representing the PBS. This matrix acts on a 4x1 vector
    whose first two entries are the Jones vector on one of the PBS ports,
    and the last two entries the Jones vector on the other port.

Examples
========

Generic polarizing beam-splitter.

>>> from sympy import pprint, symbols
>>> from sympy.physics.optics.polarization import polarizing_beam_splitter
>>> Ts, Rs, Tp, Rp = symbols(r"Ts, Rs, Tp, Rp", positive=True)
>>> phia, phib = symbols("phi_a, phi_b", real=True)
>>> PBS = polarizing_beam_splitter(Tp, Rs, Ts, Rp, phia, phib)
>>> pprint(PBS, use_unicode=False)
[   ____                           ____                    ]
[ \/ Tp            0           I*\/ Rp           0         ]
[                                                          ]
[                  ____                       ____  I*phi_a]
[   0            \/ Ts            0      -I*\/ Rs *e       ]
[                                                          ]
[    ____                         ____                     ]
[I*\/ Rp           0            \/ Tp            0         ]
[                                                          ]
[               ____  I*phi_b                    ____      ]
[   0      -I*\/ Rs *e            0            \/ Ts       ]

r   )r   r	   r   r   )TpRsTsRpphiaphibPBSs          r   polarizing_beam_splitterrG     s    p 48Q$r(
A.d2hA2d2h;s1T6{#:;T"X:q$r(A.qbbk#af+-q$r(;= >C Jr   N)r)   r)   )r   )r   r   )r)   r)   r   r   r   r   ) __doc__sympy.core.numbersr   r   $sympy.functions.elementary.complexesr   r   r   &sympy.functions.elementary.exponentialr   (sympy.functions.elementary.miscellaneousr	   (sympy.functions.elementary.trigonometricr
   r   sympy.matrices.denser   sympy.simplify.simplifyr   sympy.physics.quantumr   r   r   r#   r'   r,   r0   r2   r6   r8   r>   rG    r   r   <module>rR      sm   Rh ' > > 6 9 ? ' , /`=F{$|,.^$N+\ %F$'N0B1@L?^<r   