
    Wpfe                        U d Z ddlZddlZddlZddlmZmZmZmZm	Z	m
Z
mZ ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddl%m&Z& ddl%m'Z' ddl(m)Z) ddl(m*Z* ddl+m,Z, ddl+m-Z- ddl+m.Z. ddl+m/Z/ ddl+m0Z0 dZ1ej2        ej3        ej4        ej5        ej6        ej7        e'j8        dZ9de:de
ee:                  fd Z;ej<         G d! d"ej=                              Z>i d#e>j?        d$e>j@        d%e>jA        d&e>jB        d'e>jC        d(e>jB        d)e>jB        d*e>jC        d+e>jC        d,e>jD        d-e>jE        d.e>jF        d/e>jG        d0e>jH        d1e>jH        d2e>jH        d3e>jH        i d4e>jH        d5e>jH        d6e>jH        d7e>jH        d8e>jH        d9e>jH        d:e>jH        d;e>jH        d<e>jH        d=e>jH        d>e>jH        d?e>jI        d@e>jJ        dAe>jK        dBe>jK        dCe>jK        dDe>jK        e>jK        e>jK        e>jK        e>jK        e>jK        e>jK        e>jH        e>jH        e>jK        dE	ZLee:d"f         eMdF<    G dG dH          ZNdS )Ia  MediaPipe SolutionBase module.

MediaPipe SolutionBase is the common base class for the high-level MediaPipe
Solution APIs such as BlazeFace, hand tracking, and BlazePose. The SolutionBase
class contains the shared logic among the high-level Solution APIs including
graph initialization, processing image/audio data, and graph shutdown. Thus,
users can easily create new MediaPipe Solution APIs on top of the SolutionBase
class.
    N)AnyIterableListMapping
NamedTupleOptionalUnion)
containers)
descriptor)message)#constant_side_packet_calculator_pb2)#image_transformation_calculator_pb2)$tensors_to_detections_calculator_pb2)"landmarks_smoothing_calculator_pb2)logic_calculator_pb2)thresholding_calculator_pb2)calculator_pb2)body_rig_pb2)classification_pb2)detection_pb2)landmark_pb2)rect_pb2)annotation_data_pb2)-lift_2d_frame_annotation_to_3d_calculator_pb2)packet_creator)packet_getter)calculator_graph)image_frame)packet)resource_util)validated_graph_config   )ConstantSidePacketCalculatorImageTransformationCalculatorLandmarksSmoothingCalculatorLogicCalculatorThresholdingCalculatorTensorsToDetectionsCalculator#Lift2DFrameAnnotationTo3DCalculatoroneof_type_namereturnc                     |                      d          rY|                     d          rD| t          d          t          d                    }d |                    d          D             S d S )NzOneOf<>c                 6    g | ]}|                                 S  )strip).0ns     ^/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/mediapipe/python/solution_base.py
<listcomp>z)type_names_from_oneof.<locals>.<listcomp>U   s     @@@!AGGII@@@    ,)
startswithendswithlensplit)r*   comma_separated_typess     r3   type_names_from_oneofr<   R   su    )) Ao.F.Fs.K.K A+CMM3s88),CD@@4::3??@@@@	r5   c                   f    e 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dedd fd            ZdS )PacketDataTypez:The packet data types supported by the SolutionBase class.stringbool	bool_listintint_listfloat
float_listmatriximage
image_listr   proto
proto_listregistered_namer+   c                     	 t           |          S # t          $ rL}t          |           }|r4|D ]1}|t                                           v rt           |         c cY d }~S 2|d }~ww xY wN)NAME_TO_TYPEKeyErrorr<   keys)rK   enamesr2   s       r3   from_registered_namez#PacketDataType.from_registered_namek   s    /**   #O44e	 # 	# 	#A,##%%%%?"""""""" &gs     
A%>A A%A  A%N)__name__
__module____qualname____doc__STRINGBOOL	BOOL_LISTINTINT_LISTFLOAT
FLOAT_LISTAUDIOIMAGE
IMAGE_LISTIMAGE_FRAMEPROTO
PROTO_LISTstaticmethodstrrS   r/   r5   r3   r>   r>   Z   s        BB&	$)#(
%*
%
%*+
%*	C 	4D 	 	 	 <	 	 	r5   r>   r?   r@   z::std::vector<bool>rB   z::std::vector<int>int64int64_tz::std::vector<int64>z::std::vector<int64_t>rD   z::std::vector<float>z::mediapipe::Matrixz::mediapipe::ImageFramez::mediapipe::Classificationz::mediapipe::ClassificationListz)::mediapipe::ClassificationListCollectionz::mediapipe::Detectionz::mediapipe::DetectionListz::mediapipe::Landmarkz::mediapipe::LandmarkListz#::mediapipe::LandmarkListCollectionz::mediapipe::NormalizedLandmarkz::mediapipe::FrameAnnotationz::mediapipe::Triggerz::mediapipe::Rectz::mediapipe::NormalizedRectz#::mediapipe::NormalizedLandmarkListz-::mediapipe::NormalizedLandmarkListCollectionz::mediapipe::Imagez!::std::vector<::mediapipe::Image>z*::std::vector<::mediapipe::Classification>z.::std::vector<::mediapipe::ClassificationList>z%::std::vector<::mediapipe::Detection>z)::std::vector<::mediapipe::DetectionList>)	z$::std::vector<::mediapipe::Landmark>z(::std::vector<::mediapipe::LandmarkList>z.::std::vector<::mediapipe::NormalizedLandmark>z2::std::vector<::mediapipe::NormalizedLandmarkList>z ::std::vector<::mediapipe::Rect>z*::std::vector<::mediapipe::NormalizedRect>z::mediapipe::Jointz::mediapipe::JointListz%::std::vector<::mediapipe::JointList>rN   c                      e Zd ZdZ	 	 	 	 	 	 	 d!dee         deej                 deeee	f                  dee
j                 deeee	f                  deee                  d	eeeef                  fd
Zdeej        eeeej        e
j        f         f         f         defdZd"dZd"dZ	 	 	 d#dej        deeee	f                  deee                  d	eeeef                  fdZdej        deee	f         ddfdZde
j        deee	f         de
j        fdZdej        de
j        ddfdZdede	dej        fdZ dedej        de	fdZ!d Z"d  Z#dS )$SolutionBasea  The common base class for the high-level MediaPipe Solution APIs.

  The SolutionBase class contains the shared logic among the high-level solution
  APIs including graph initialization, processing image/audio data, and graph
  shutdown.

  Example usage:
    with solution_base.SolutionBase(
        binary_graph_path='mediapipe/modules/hand_landmark/hand_landmark_tracking_cpu.binarypb',
        side_inputs={'num_hands': 2}) as hand_tracker:
      # Read an image and convert the BGR image to RGB.
      input_image = cv2.cvtColor(cv2.imread('/tmp/hand.png'), COLOR_BGR2RGB)
      results = hand_tracker.process(input_image)
      print(results.palm_detections)
      print(results.multi_hand_landmarks)
  Nbinary_graph_pathgraph_configcalculator_paramsgraph_optionsside_inputsoutputsstream_type_hintsc                 6    t          |          t          |          k    rt          d          t          j                            t          j                            t                                        t          j                  dd                   }t          j
        |           t          j                    }	|r5|	                    t          j                            ||                     n|	                    |                                |	|||          }
|r                     |
|           |r                     |
j        |           t%          j        |
           _        d _        i  _        dt.          dt0          j        d	df fd
} j                                        D ]} j                            ||d            fd|pi                                 D              _         j                             j                   dS )a  Initializes the SolutionBase object.

    Args:
      binary_graph_path: The path to a binary mediapipe graph file (.binarypb).
      graph_config: A CalculatorGraphConfig proto message or its text proto
        format.
      calculator_params: A mapping from the
        {calculator_name}.{options_field_name} str to the field value.
      graph_options: The graph options protobuf for the mediapipe graph.
      side_inputs: A mapping from the side packet name to the packet raw data.
      outputs: A list of the graph output stream names to observe. If the list
        is empty, all the output streams listed in the graph config will be
        automatically observed by default.
      stream_type_hints: A mapping from the stream name to its packet type hint.

    Raises:
      FileNotFoundError: If the binary graph file can't be found.
      RuntimeError: If the underlying calculator graph can't be successfully
        initialized or started.
      ValueError: If any of the following:
        a) If not exactly one of 'binary_graph_path' or 'graph_config' arguments
        is provided.
        b) If the graph validation process contains error.
        c) If the registered type name of the streams and side packets can't be
        found.
        d) If the calculator options of the calculator listed in
        calculator_params is not allowed to be modified.
        e) If the calculator options field is a repeated field but the field
        value to be set is not iterable.
        f) If not all calculator params are valid.
    zBMust provide exactly one of 'binary_graph_path' or 'graph_config'.N)rk   )rl   r   stream_nameoutput_packetr+   c                     |j         | <   d S rM   )_graph_outputs)rt   ru   selfs     r3   callbackz'SolutionBase.__init__.<locals>.callback   s    )6d+&&&r5   Tc                 Z    i | ]'\  }}|                     j        |         |          (S r/   )_make_packet_side_input_type_info)r1   namedatarx   s      r3   
<dictcomp>z)SolutionBase.__init__.<locals>.<dictcomp>  sG          D$ 	d :4 @$GG     r5   ) r@   
ValueErrorossepjoinpathabspath__file__r:   r    set_resource_dirr!   ValidatedGraphConfig
initialize_initialize_graph_interface_modify_calculator_options_set_extensionrn   r   CalculatorGraph_graph_simulated_timestamprw   rf   r   Packet_output_stream_type_inforP   observe_output_streamitems_input_side_packets	start_run)rx   rk   rl   rm   rn   ro   rp   rq   	root_pathvalidated_graphcanonical_graph_config_protory   rt   s   `            r3   __init__zSolutionBase.__init__   s`   P $|"4"444
NP P P BGOOH55;;BFCCCRCHIII"9---,ACCO <  GLL4EFF ! H H H H   l ;;;#'#C#Cg/@$B $B  9
%%&B&79 9 9 )
6D') ) ) #213 3 3DK !DD7c 7&- 7D 7 7 7 7 7 7 499;; E E
k''XtDDDD       &,"3355     D 	K$233333r5   
input_datar+   c           
         | j                                          t          |t          j                  rs| j        t          d          t          | j                                                  dk    rt          d          t          t          | j                            |i}n|}| xj        dz  c_        | j        t          d          |                                D ],\  }}| j        |         }|t          j        k    s|t          j        k    r#t#          d| j        |         j         d          |t          j        k    s|t          j        k    rn|j        d	         t,          k    rt          d
          | j                            ||                     ||                              | j                             | j                            ||                     ||                              | j                             .| j                                         | j        t          d          t9          j        d| j                                                  }| j                                        D ]X}|| j         v r<t=          |||                     | j        |         | j         |                              Gt=          ||d           Y|S )a+  Processes a set of RGB image data and output SolutionOutputs.

    Args:
      input_data: Either a single numpy ndarray object representing the solo
        image input of a graph or a mapping from the stream name to the image or
        proto data that represents every input streams of a graph.

    Raises:
      NotImplementedError: If input_data contains audio data or a list of proto
        objects.
      RuntimeError: If the underlying graph occurs any error.
      ValueError: If the input image data is not three channel RGB.

    Returns:
      A NamedTuple object that contains the output data of a graph run.
        The field names in the NamedTuple object are mapping to the graph output
        stream names.

    Examples:
      solution = solution_base.SolutionBase(graph_config=hand_landmark_graph)
      results = solution.process(cv2.imread('/tmp/hand0.png')[:, :, ::-1])
      print(results.detection)
      results = solution.process(
          {'video_in' : cv2.imread('/tmp/hand1.png')[:, :, ::-1]})
      print(results.hand_landmarks)
    Nz/_input_stream_type_info is None in SolutionBase   zQCan't process single image input since the graph has more than one input streams.i5  z_graph is None in SolutionBasezASolutionBase can only process non-audio and non-proto-list data. z type is not supported yet.   z0Input image must contain three channel rgb data.)streamr   z0_output_stream_type_info is None in SolutionBaseSolutionOutputs) rw   clear
isinstancenpndarray_input_stream_type_infor   r9   rP   nextiterr   r   r   r>   rd   r_   NotImplementedErrorr}   rb   r`   shapeRGB_CHANNELSadd_packet_to_input_streamr{   atwait_until_idler   collections
namedtuplesetattr_get_packet_content)rx   r   
input_dictrt   r~   input_stream_typesolution_outputss          r3   processzSolutionBase.process  s&   < 	*bj)) 
		%	-JKKK	T)..00	1	1Q	6	6
 
 	
 d:;;<<jIjjj 	&{7888'--// J JT6{C
~8
8
8
~3
3
3!*+K8=* * *+ + 	+ !;;;!555:a=L((MNN
N..$$%6%)+ ++-2d.G+H+H 	/ 	J 	J 	J 	J
 	..$$%6%)+ ++-2d.G+H+H 	/ 	J 	J 	J 	J
 	K!!! $,IJJJ"-48==??A A499;; 5 5	+	+	+k$$T%B;%O%)%8%EG G	H 	H 	H 	H
 	 +t4444r5   c                     | j         t          d          | j                                          d| _         d| _        d| _        dS )+Closes all the input sources and the graph.Nz1Closing SolutionBase._graph which is already None)r   r   closer   r   rx   s    r3   r   zSolutionBase.closef  sJ    {JKKKKDK#'D $(D!!!r5   c                     | j         r:| j                                          | j                             | j                   dS dS )z!Resets the graph for another run.N)r   r   r   r   r   s    r3   resetzSolutionBase.reseto  sI    { 6
k
kD4555556 6r5   r   c                 L  	 t          j                    }|                    j                   d fd		fd|j        D             | _        |s|j        }n|}	fd|D             | _        fdfd|pi                                 D             | _	        |S )zSGets graph interface type information and returns the canonical graph config proto.c                 8    |                      d          d         S )N:)r:   )tag_index_names    r3   get_namez:SolutionBase._initialize_graph_interface.<locals>.get_name  s    !!#&&r**r5   c                      |           }r|                                 v r|         S t                                                  |                    S rM   )rP   r>   rS   registered_stream_type_name)packet_tag_index_namert   r   rq   r   s     r3   get_stream_packet_typezHSolutionBase._initialize_graph_interface.<locals>.get_stream_packet_type  si    H233k	 .{.?.D.D.F.FFF --00

5
5k
B
BD D Dr5   c                 :    i | ]} |           |          S r/   r/   r1   r   r   r   s     r3   r   z<SolutionBase._initialize_graph_interface.<locals>.<dictcomp>  sA     $ $ $ 	  "8"8"H"H$ $ $r5   c                 :    i | ]} |           |          S r/   r/   r   s     r3   r   z<SolutionBase._initialize_graph_interface.<locals>.<dictcomp>  sA     % % % 	  "8"8"H"H% % %r5   c                 p    t                                                    |                               S rM   )r>   rS    registered_side_packet_type_name)r   r   r   s    r3   get_side_packet_typezFSolutionBase._initialize_graph_interface.<locals>.get_side_packet_type  s<    00

:
:h,--/ /0 0 0r5   c                 @    i | ]\  }} |           |          S r/   r/   )r1   r   _r   r   s      r3   r   z<SolutionBase._initialize_graph_interface.<locals>.<dictcomp>  sE     " " "NA 	  "6"6~"F"F" " "r5   )
r   CalculatorGraphConfigParseFromStringbinary_configinput_streamr   output_streamr   r   r|   )
rx   r   ro   rp   rq   r   output_streamsr   r   r   s
    `  `  @@@r3   r   z(SolutionBase._initialize_graph_interfaceu  sK    $2#G#I#I  001NOOO+ + +D D D D D D D$ $ $ $ $:G$ $ $D 
  3Annn% % % % %,% % %D!0 0 0 0 0 0
" " " " ""-"3!:!:!<!<" " "D ('r5   calculator_graph_configc                    d }d } ||          }d}|j         D ]}|j        |vrt                              |j                  }|t          d|j         d          ||j                 }	|                    d          r|j        rt          d|j         d	          |j        rd
}
|j        D ]u}|j        	                    d          d         }||j
        j        k    rC|                    |j                  } |||	           |                                |_        d}
 nv|
sB |            } |||	           |j                                                            |           n! ||j        j        |j                 |	           |dz  }|t)          |          k    r n|t)          |          k     rt          d          dS )zNModifies the CalculatorOptions of the calculators listed in calculator_params.c                 (   i }|                                  D ]z\  }}|                    d          }t          |          dk    rt          d| d          |d         }|d         }||v r||                             ||f           r||fg||<   {|S )N.r   z	The key "z&" in the calculator_params is invalid.r   r   )r   r:   r9   r   append)flat_map
nested_mapcompound_namefield_valuecalculator_and_field_namecalculator_name
field_names          r3   !generate_nested_calculator_paramszRSolutionBase._modify_calculator_options.<locals>.generate_nested_calculator_params  s    j(0(8(8 
D 
D
$-$1$7$7$<$<!())Q..O-OOOQ Q Q3A6.q1
j((
_
%
,
,j+-F
G
G
G
G*4k)B(C*_
%
%r5   c                    |D ]\  }}||                      |           | j        j        |         j        }|t          j        j        k    rut          |t                    s"t          | dt          |           d          |                      |           |D ]%}t          | |                              |           &t          | ||           d S )Nz6 is a repeated proto field but the value to be set is z, which is not iterable.)
ClearField
DESCRIPTORfields_by_namelabelr   FieldDescriptorLABEL_REPEATEDr   r   r   typegetattrr   r   )calculator_optionsoptions_field_listr   r   field_labelelems         r3   modify_options_fieldszFSolutionBase._modify_calculator_options.<locals>.modify_options_fields  s&   %7 A A
!*k

'
'

3
3
3
3*5D J6EEEk844 O N N"&{"3"3N N NO O O ))*555# C C(*55<<TBBBBC &
K@@@@%A Ar5   r   Nz$Modifying the calculator options of z is not supported.optionsz(Cannot modify the calculator options of z5 because it has both options and node_options fields.F/r   Tr   z$Not all calculator params are valid.)noder}   CALCULATOR_TO_OPTIONSget
calculatorr   HasFieldnode_optionstype_urlr:   r   	full_name
FromStringvalueSerializeToStringaddPackr   
Extensionsextr9   )rx   r   rm   r   r   nested_calculator_paramsnum_modifiedr   options_typer   node_options_modifiedr   	type_namer   s                 r3   r   z'SolutionBase._modify_calculator_options  sh     A A A*  A@    L', ( (	2	2	2*..t??l		P49PPP
 
 	
 4DI>	y	!	! :d&7 :9ty 9 9 9: : 	: 
	 2 %% 	 	Dm))#..r2),1;;;!-!8!8!D!D!!"46HIII+==??DJ$(!E < % 	;+|~~


 24F
G
G
G




!
!
&
&'9
:
:
: 	dl5l6FG0	2 	2 	2 al 
566	6	6 
7c23333=>>> 43r5   options_messagevaluesc                 
   t          |d          r|                                }|D ]}|\  }}|                    d          }|}t          |          dk    r,t	          ||d                   }|d= t          |          dk    ,t	          ||d                   }t          |d          r|dd= |                    |           t          |d          r|                    |           t          ||d         |           |S )zSets protobuf field values.

    Args:
      options_message: the options protobuf message.
      values: field value pairs, where each field may be a "." separated path.

    Returns:
      the options protobuf message.
    r   r   r   r   r   NCopyFrom)hasattrr   r:   r9   r   extendr  r   )	rx   r  r  pairfieldr   fieldsmvs	            r3   create_graph_optionsz!SolutionBase.create_graph_options  s    vw ||~~f % %nue{{3f
aKK!OOAvay!!1I KK!OO !VAY

a	H		 %aaaD	1j!! %	

56!9e$$$$r5   extension_listextension_valuec                 D   |D ]u}|                     |j                  rY t          |                      }|                    |           |                    |           |                    |            dS v|                                                    |           dS )z:Sets one value in a repeated protobuf.Any extension field.N)Isr   r   Unpack	MergeFromr   r   )rx   r  r  extension_anyr  s        r3   r   zSolutionBase._set_extension'  s     (  			/4	5	5 !D!!##Q	O$$$1 o.....r5   packet_data_typer~   c                     |t           j        k    s|t           j        k    r7 t          t          d|j        z             |t          j        j                  S  t          t          d|j        z             |          S )Ncreate_)image_format)	r>   rb   r`   r   r   r   r   ImageFormatSRGB)rx   r  r~   s      r3   r{   zSolutionBase._make_packet4  s{    N666N000HW^Y1A1G%GHH
[49; ; ; ; IW^Y1A1G%GHHNNNr5   ru   c                 r   |                                 rdS |t          j        k    rt          j        |          S |t          j        k    s|t          j        k    r8 t          t          d|j        z             |          	                                S  t          t          d|j        z             |          S )zGets packet content from a packet by type.

    Args:
      packet_data_type: The supported packet data type.
      output_packet: The packet to get content from.

    Returns:
      Packet content by packet data type. None to indicate "no output".

    Nget_)
is_emptyr>   rX   r   get_strrb   r`   r   r   
numpy_view)rx   r  ru   s      r3   r   z SolutionBase._get_packet_content=  s      T>000"=111
n8
8
8
n2
2
2-W]F%+%, - --:< <<FJLLI EW]F-=-C$CDD
  r5   c                     | S )zA "with" statement support.r/   r   s    r3   	__enter__zSolutionBase.__enter__V  s    Kr5   c                 .    |                                   dS )r   N)r   )rx   exc_typeexc_valexc_tbs       r3   __exit__zSolutionBase.__exit__Z  s    JJLLLLLr5   )NNNNNNN)r+   N)NNN)$rT   rU   rV   rW   r   rf   r   r   r   r   r   Messager   r>   r   r	   r   r   r   r   r   r   r!   r   r   r   r  r
   RepeatedCompositeFieldContainerr   r   r   r{   r   r#  r(  r/   r5   r3   rj   rj      s        & *.EI7;1515%)BFM4 M4!#M4 ^ABM4 "'#s("34	M4
 go.M4 GCH-.M4 S	"M4 "'#~*=">?M4 M4 M4 M4dXbj'#uRZ=D_>M 8N 3N +O O PX X X X Xt) ) ) )6 6 6 6 26%)BF6( 6(-B6( GCH-.6( S	"	6(
 "'#~*=">?6( 6( 6( 6(pY?%3%IY? c*Y?/3Y? Y? Y? Y?v'/ #*38#49@   >/%/%O/&-o/:>/ / / /O> OO!'O O O O. )/;>   2      r5   rj   )OrW   r   enumr   typingr   r   r   r   r   r   r	   numpyr   google.protobuf.internalr
   google.protobufr   r   mediapipe.calculators.corer   mediapipe.calculators.imager   mediapipe.calculators.tensorr   mediapipe.calculators.utilr   r   r   mediapipe.frameworkr   mediapipe.framework.formatsr   r   r   r   r   'mediapipe.modules.objectron.calculatorsr   r   mediapipe.pythonr   r   $mediapipe.python._framework_bindingsr   r   r   r    r!   r   #ConstantSidePacketCalculatorOptions$ImageTransformationCalculatorOptions#LandmarksSmoothingCalculatorOptionsLogicCalculatorOptionsThresholdingCalculatorOptions$TensorsToDetectionsCalculatorOptions*Lift2DFrameAnnotationTo3DCalculatorOptionsr   rf   r<   uniqueEnumr>   rX   rY   rZ   r[   r\   r]   r^   r_   rb   rc   r`   ra   rd   rN   __annotations__rj   r/   r5   r3   <module>rC     s          				 L L L L L L L L L L L L L L L L L L     / / / / / / & & & & & & # # # # # # K J J J J J K K K K K K M M M M M M I I I I I I ; ; ; ; ; ; B B B B B B . . . . . . 4 4 4 4 4 4 : : : : : : 5 5 5 5 5 5 4 4 4 4 4 4 0 0 0 0 0 0 G G G G G G a a a a a a + + + + + + * * * * * * A A A A A A < < < < < < 7 7 7 7 7 7 > > > > > > G G G G G G 	,O+	-*N3#A,	-5	3#  *3 8DI3F         TY   8.0n#.0
N.0 >3.0 
>	.0
 .1.0 ^.0 ~!.0 N3.0 n5.0 ^!.0 N5.0 >/.0 ~9.0 ">#7.0 &~';.0  01E!.0" n2#.0 .0$ !."6%.0& ^1'.0(  !5).0* *>+?+.0, &~';-.0. #N$8/.00 N01.02 -3.04 ">#75.06 *>+?7.08 4^5I9.0: ..;.0< ()B=.0> 1.2K?.0@ 5n6OA.0B ,^-FC.0D 01JE.0 .0F -;,E0>0I6D6O!(6(A2@2K(.,2-;-F[.0 .0 .0gc++, . . .bt t t t t t t t t tr5   