+
    G-jÜ:  ã                   ó  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RI	H
t
 ^ RIt^ RIt^ RIHtHtHt ^ RIHt ^ RIt]P(                  ! ]4      tRtRt ! R	 R
]4      tR tR tR t]R8X  d
   ]! 4        R# R# )é    N)Údeque)Údatetime)ÚPath)Ú
ModelProtoÚTensorProtoÚnumpy_helper)Ú	OnnxModelÚconstant_shape_opt__Úreshape_input_shape__c                   ó®   a a€ ] tR t^!t oRtV 3R ltR tR tR tR t	R t
RR ltRR	 ltR
 tR tV3R lR ltV3R lR ltRV3R lR lltRtVtV ;t# )ÚBertOnnxModelShapeOptimizerz—
This optimizer will replace Shape output or the shape input of Reshape node by initializer. Currently, it requires
model inputs to have static shape.
c                ó:   <€ \         SV `  VP                  4       R # )N)ÚsuperÚ__init__Úmodel)ÚselfÚ
onnx_modelÚ	__class__s   &&€Úy/Volumes/fast/ai/experiments/nudenet-smoke/.venv/lib/python3.14/site-packages/onnxruntime/transformers/shape_optimizer.pyr   Ú$BertOnnxModelShapeOptimizer.__init__'   s   ø€ Ü‰Ñ˜×)Ñ)Ö*ó    c                ó  € \         P                  ! V\         P                  R7      pV P                  R\        4      p\
        P                  P                  V\        P                  VP                  VR7      pV P                  V4       V# )z(
Add an initializer for constant shape.
©ÚdtypeÚConstant)ÚnameÚ	data_typeÚdimsÚvals)ÚnpÚasarrayÚint64Úcreate_node_nameÚCONSTANT_SHAPE_NAME_PREFIXÚonnxÚhelperÚmake_tensorr   ÚINT64ÚshapeÚadd_initializer)r   r)   Úshape_valueÚconstant_shape_nameÚtensors   &&   r   Úadd_shape_initializerÚ1BertOnnxModelShapeOptimizer.add_shape_initializer*   sr   € ô —j’j ¬b¯h©hÔ7ˆØ"×3Ñ3°JÔ@ZÓ[ÐÜ—‘×(Ñ(Ø$Ü!×'Ñ'Ø×"Ñ"Øð	 )ó 
ˆð 	×Ñ˜VÔ$Øˆr   c                ó  € V P                  4       p. pV P                  P                  P                   FR  pVP                  R8X  g   K  VP
                  ^ ,          V9   g   K0  VP                  VP
                  ^ ,          4       KT  	  V# )z4
Returns a list of output names of all Shape nodes.
ÚShape)Úinput_name_to_nodesr   ÚgraphÚnodeÚop_typeÚoutputÚappend)r   r2   Úoutputsr4   s   &   r   Úget_shape_outputsÚ-BertOnnxModelShapeOptimizer.get_shape_outputs9   sj   € ð #×6Ñ6Ó8ÐàˆØ—J‘J×$Ñ$×)Ô)ˆDØ�|‰|˜wÖ&Ø—;‘;˜q•>Ð%8Ö8Ø—N‘N 4§;¡;¨q¥>Ö2ñ *ð
 ˆr   c                óâ   € V P                  4        . pV P                  P                  P                   F8  pVP                  R8X  g   K  VP                  VP                  ^,          4       K:  	  V# )z7
Returns a list of shape input names of Reshape nodes.
ÚReshape)Úoutput_name_to_noder   r3   r4   r5   r7   Úinput)r   Úshape_inputsr4   s   &  r   Úget_reshape_shape_inputsÚ4BertOnnxModelShapeOptimizer.get_reshape_shape_inputsG   sY   € ð 	× Ñ Ô"àˆØ—J‘J×$Ñ$×)Ô)ˆDØ�|‰|˜yÖ(Ø×#Ñ# D§J¡J¨q¥MÖ2ñ *ð Ðr   c                ó‚  € . p. pV P                   P                  P                   F…  pVP                  R8X  g   K  VP                  ^ ,          pV P                  R\        4      p\        P                  P                  RV.V.R7      pVP                  V4       VP                  V4       K‡  	  V P                  V4       V# )zp
For each Reshape node, create a Shape node for its first input.
Returns the output names of these Shape nodes.
r<   ÚReshape_Inputr1   )Úinputsr8   )r   r3   r4   r5   r>   r#   ÚRESHAPE_INPUT_SHAPE_PREFIXr%   r&   Ú	make_noder7   Ú	add_nodes)r   Úoutput_namesÚnodes_to_addr4   r>   Úoutput_nameÚ
shape_nodes   &      r   Úadd_shape_for_reshape_inputÚ7BertOnnxModelShapeOptimizer.add_shape_for_reshape_inputT   s¥   € ð
 ˆØˆØ—J‘J×$Ñ$×)Ô)ˆDØ�|‰|˜yÖ(ØŸ
™
 1��Ø"×3Ñ3°OÔE_Ó`�Ü!Ÿ[™[×2Ñ2°7ÀEÀ7ÐU`ÐTaÐ2Ób�
Ø×#Ñ# JÔ/Ø×#Ñ# KÖ0ñ *ð 	�‰�|Ô$ØÐr   c                ó¼  € . pV P                   P                  P                   Uu. uF  q3P                  NK  	  ppV F–  pV P	                  V4      e   K  VP                  V4       WT9  g   K1  \        P                  P                  4       pWVn        V P                   P                  P                  P                  V.4       VP                  V4       K˜  	  V# u upi )z-
Add a list of output names to graph output.
)
r   r3   r6   r   Úget_initializerr7   r%   r&   ÚValueInfoProtoÚextend)r   Úextra_outputsÚnames_to_evaluater6   rH   r   Úoutput_infos   &&     r   Úadd_extra_graph_outputÚ2BertOnnxModelShapeOptimizer.add_extra_graph_outputf   s¸   € ð ÐØ26·*±*×2BÑ2B×2IÒ2IÓJÑ2I¨ŸœÑ2IˆÐJÛ!ˆDØ×#Ñ# DÓ)Ò5ÙØ×$Ñ$ TÔ*àÖ'Ü"Ÿk™k×8Ñ8Ó:�Ø#'Ô Ø—
‘
× Ñ ×'Ñ'×.Ñ.°¨}Ô=Ø×#Ñ# DÖ)ñ "ð !Ð ùò Ks   ¥Cc                ó4  € V P                   P                  P                   Fó  pVP                  V9   g   K  VP                  P
                  P                  P                  ^ ,          pW%n        VP                  P
                  P                  P                  ^,          pVP                  R4      '       d	   W5n        K�  VP                  R4      '       g   K¶  VP                  V8w  g   KÉ  \        RV R^ RVP                   RVP                   R2	4      h	  R# )	zO
Update the model to use static axes instead of dynamic axes for graph inputs.
Ú	dim_paramÚ	dim_valuez!Unable to set dimension value to z
 for axis z of z'. Contradicts existing dimension value Ú.N)r   r3   r>   r   ÚtypeÚtensor_typer)   ÚdimrY   ÚHasFieldÚ
ValueError)r   rD   Ú
batch_sizeÚmax_seq_lenr>   Ú	dim_protos   &&&&  r   Úuse_static_inputÚ,BertOnnxModelShapeOptimizer.use_static_inputz   s  € ð —Z‘Z×%Ñ%×+Ô+ˆEØ�z‰z˜VÖ#Ø!ŸJ™J×2Ñ2×8Ñ8×<Ñ<¸QÕ?�	Ø&0Ô#Ø!ŸJ™J×2Ñ2×8Ñ8×<Ñ<¸QÕ?�	Ø×%Ñ% k×2Ò2Ø*5Ö'Ø×'Ñ'¨×4Ô4¸×9LÑ9LÐP[Ö9[Ü$Ø;¸K¸=È
ÐSTÐRUÐUYÐZ_×ZdÑZdÐYeð  fMð  NW÷  Nañ  Nað  Mbð  bcð  dóð ó ,r   c                óF  € VR9   g   Q h\         P                  P                  WtV3\         P                  R7      p\         P                  ! WE3\         P                  R7      p	\         P
                  ! WE3\         P                  R7      p
V^8X  dD   \         P                  ! V4      p\         P                  ! V	4      p	\         P                  ! V
4      p
MIV^8X  dC   \         P                  ! V4      p\         P                  ! V	4      p	\         P                  ! V
4      p
WW9W*/pV# )z‹
Create dummy data for model inputs. If the model has more than 3 inputs, please update this function accordingly before running the tool.
)Úsizer   r   )é   é   é   )r    ÚrandomÚrandintÚint32ÚonesÚzerosÚfloat32r"   )r   Ú	input_idsÚsegment_idsÚ
input_maskr`   Úsequence_lengthÚ	elem_typeÚdictionary_sizeÚinput_1Úinput_2Úinput_3rD   s   &&&&&&&&    r   Úcreate_dummy_inputsÚ/BertOnnxModelShapeOptimizer.create_dummy_inputsŠ   sÜ   € ð ˜IÔ%Ð%Ð%ô —)‘)×#Ñ# OÀÐ:WÔ_a×_gÑ_gÐ#ÓhˆÜ—'’'˜:Ð7¼r¿x¹xÔHˆÜ—(’(˜JÐ8ÄÇÁÔIˆð ˜Œ>Ü—j’j Ó)ˆGÜ—j’j Ó)ˆGÜ—j’j Ó)‰GØ˜!Œ^Ü—h’h˜wÓ'ˆGÜ—h’h˜wÓ'ˆGÜ—h’h˜wÓ'ˆGà j¸;ÐPˆØˆr   c                ól  € W#V.V n         . pV'       d    VP                  V P                  4       4       V	'       dC   V P                  4       pV P	                  4       pVP                  V4       VP                  V4       \        V4      ^ 8X  d   R# V P                  V4      pV P                  V P                   Wg4       \        VR4      ;_uu_ 4       pVP                  V P                  P                  4       4       RRR4       \        P                  ! 4       p\        P                  P                  Vn        \        P"                  ! VVRR.R7      p^pV P                  P$                  P&                   F6  pVP(                  V8X  g   K  VP*                  P,                  P.                  pK8  	  V P1                  W#WFVV4      pVP3                  VV4      p/ p\5        V4       F  w  ppVV,          VV&   K  	  \6        P9                  RV 24       V	'       d3   \5        X4       F#  w  ppXV,          pV P;                  VVVV
4       K%  	  VP=                  4        F3  w  ppV P?                  V4      pV PA                  VVP(                  4       K5  	  V PC                  V4       R#   + '       g   i     EL±; i)r   NÚwbÚCUDAExecutionProviderÚCPUExecutionProvider)Ú	providerszshapes=)"Úbert_inputsrQ   r9   r@   rL   ÚlenrU   rc   ÚopenÚwriter   ÚSerializeToStringÚonnxruntimeÚSessionOptionsÚGraphOptimizationLevelÚORT_DISABLE_ALLÚgraph_optimization_levelÚInferenceSessionr3   r>   r   r[   r\   rt   ry   ÚrunÚ	enumerateÚloggerÚdebugÚupdate_target_shapeÚitemsr.   Úreplace_input_of_all_nodesÚprune_graph)r   Útemp_model_pathrp   rq   rr   rH   r`   rs   Úenable_shape_optÚenable_reshape_optÚverboserR   Úreshape_shape_inputsÚreshape_input_shapesrS   ÚoutÚsess_optionsÚsessionrt   r>   rD   r8   ÚshapesÚir   Úshape_inputÚinput_shaper)   r-   s   &&&&&&&&&&&                  r   Úshape_optimizationÚ.BertOnnxModelShapeOptimizer.shape_optimization«   sK  € ð &°JÐ?ˆÔàˆßØ× Ñ  ×!7Ñ!7Ó!9Ô:çØ#'×#@Ñ#@Ó#BÐ Ø#'×#CÑ#CÓ#EÐ Ø× Ñ Ð!5Ô6Ø× Ñ Ð!5Ô6äˆ}Ó Ô"Ùà ×7Ñ7¸ÓFÐð 	×Ñ˜d×.Ñ.°
ÔLä�/ 4×(Ô(¨CØ�I‰I�d—j‘j×2Ñ2Ó4Ô5÷ )ä"×1Ò1Ó3ˆÜ0;×0RÑ0R×0bÑ0bˆÔ-Ü×.Ò.ØØØ.Ð0FÐGô
ˆð ˆ	Ø—Z‘Z×%Ñ%×+Ô+ˆEØ�z‰z˜YÖ&Ø!ŸJ™J×2Ñ2×<Ñ<’	ñ ,ð ×)Ñ)¨)À*ÐZiÐktÓuˆà—+‘+Ð/°Ó8ˆØˆÜ Ð!2Ö3‰GˆAˆtØ" 1�:ˆF�4‹Lñ 4ô 	�‰�w˜v˜hÐ'Ô(çÜ"+Ð,@Ö"A‘��;Ø2°1Õ5�Ø×(Ñ(¨°¸kÈ7ÖSñ #Bð "Ÿ<™<ž>‰KˆD�%Ø×/Ñ/°Ó6ˆFØ×+Ñ+¨D°&·+±+Ö>ñ *ð
 	×Ñ˜Ö&÷C )×(Ð(ús   Ã*J"Ê"J3	c                óè  € W!9   d
   W,          pM-V P                  V4      pVf   Q h\        P                  ! V4      pW19   d
   W,          pM-V P                  V4      pVf   Q h\        P                  ! V4      p. p\        V4       FF  w  ršV	\	        V4      8  d!   Wy,          V
8X  d   VP                  ^ 4       K5  VP                  V
4       KH  	  W�V&   \        P                  RV RV RV 24       R# )zØ
Update the target shape to use 0 to represent that dimension value does not change.
For example, shape of source data is (2, 5, 8) and target shape is (2, 5, 4, 2), the target shape will be updated to (0, 0, 4, 2).
Nzsource_shape=z, target_shape=z, new_target_shape=)rO   r   Úto_arrayrŒ   r�   r7   r�   rŽ   )r   rœ   rž   rŸ   r–   Útarget_shapeÚinitializerÚsource_shapeÚnew_target_shaper�   rY   s   &&&&&      r   r�   Ú/BertOnnxModelShapeOptimizer.update_target_shapeï   sí   € ð
 Ô Ø!Õ.‰Là×.Ñ.¨{Ó;ˆKØÒ*Ð*Ð*Ü'×0Ò0°Ó=ˆLàÔ Ø!Õ.‰Là×.Ñ.¨{Ó;ˆKØÒ*Ð*Ð*Ü'×0Ò0°Ó=ˆLàÐÜ% lÖ3‰LˆAØ”3�|Ó$Ô$¨­¸IÔ)EØ ×'Ñ'¨Ö*à ×'Ñ'¨	Ö2ñ	 4ð
 /ˆ{Ñä�‰�} \ N°/À,ÀÐObÐcsÐbtÐuÖvr   c                ó    <€ V ^8„  d   QhRS[ /# )é   r>   )Ústr)ÚformatÚ__classdict__s   "€r   Ú__annotate__Ú(BertOnnxModelShapeOptimizer.__annotate__  s   ø€ ÷ `ñ `¡Cñ `r   c                óÐ   € V P                  V4      '       gJ   V P                  P                  P                   Uu. uF  qP                  NK  	  pp\        R X RV 24      hR# u upi )zInput z% does not exist in the graph inputs: N)Úfind_graph_inputr   r3   r>   r   Ú	Exception)r   r>   Úvalid_namess   && r   Úvalidate_inputÚ*BertOnnxModelShapeOptimizer.validate_input  s^   € Ø×$Ñ$ U×+Ò+Ø37·:±:×3CÑ3C×3IÒ3IÓJÑ3I¨%Ÿ:œ:Ñ3IˆKÐJÜ˜f U GÐ+PÐQ\ÐP]Ð^Ó_Ð_ñ ,ùÚJs   ºA#c                ó0   <€ V ^8„  d   QhRS[ S[,          /# )rª   rH   )Úlistr«   )r¬   r­   s   "€r   r®   r¯     s   ø€ ÷ eñ e©T±#­Yñ er   c                óÀ   € V P                   P                  P                   Uu. uF  q"P                  NK  	  ppV F  pWC9  g   K  \	        R V RV 24      h	  R# u upi )zOutput z& does not exist in the graph outputs: N)r   r3   r6   r   r²   )r   rH   r6   r³   r   s   &&   r   Úvalidate_outputsÚ,BertOnnxModelShapeOptimizer.validate_outputs  s[   € Ø15·±×1AÑ1A×1HÒ1HÓIÑ1H v—{”{Ñ1HˆÐIÛ ˆDØÖ&Ü '¨$¨Ð/UÐVaÐUbÐ cÓdÐdó !ùò Js   £Ac                ób   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ RS[RS[RS[S[ ,          R,          /# )	rª   Úoutput_pathrp   rq   rr   r”   r•   rH   N)r«   Úboolr·   )r¬   r­   s   "€r   r®   r¯     sZ   ø€ ÷ 9:ñ 9:áð9:ñ ð9:ñ ð	9:ñ
 ð9:ñ ð9:ñ !ð9:ñ ™3•i $Õ&ñ9:r   c                ó  € V P                   P                  P                   F@  pVP                  P	                  \
        4      '       g   K*  \        P                  R 4        R# 	  V P                  V4       V P                  V4       V P                  V4       Ve#   V P                  V4       V P                  V4       V P                   P                  P                   Uu. uF  qÌP                  NK  	  ppV'       g
   V'       Ed   \        V P                  4       4      ^8w  d   \        P                  R4       R# \        P                  ! 4       ;_uu_ 4       pRP!                  \"        P$                  ! 4       P'                  R4      4      pV
'       d   RMTp\(        P*                  P-                  VV4      pV P/                  VVVVVVV	VVV
4
       RRR4       \        P1                  RX 24       \        P3                  RV RV	 24       VeI   \5        VR	4      ;_uu_ 4       pVP7                  V P                   P9                  4       4       RRR4       R# R# u upi   + '       g   i     L–; i  + '       g   i     R# ; i)
z5Skip shape optimization since it has been done beforeNz9Skip shape optimization since graph input number is not 3ztemp_{}.onnxz%m_%d-%H_%M_%SrZ   z$Temp model with additional outputs: zZShape optimization is done. The optimized model might only work for input with batch_size=z sequence_length=r|   )r   r3   r¥   r   Ú
startswithr$   r�   Úinfor´   r¹   r’   r6   r�   Ú'get_graph_inputs_excluding_initializersÚtempfileÚTemporaryDirectoryr¬   r   ÚnowÚstrftimeÚosÚpathÚjoinr    rŽ   Úwarningr‚   rƒ   r„   )r   r¼   rp   rq   rr   r”   r•   rH   r`   rs   r–   r-   r6   Úremaining_outputsÚtemp_dirÚtemp_file_nameÚdirÚ	temp_filer™   s   &&&&&&&&&&&        r   ÚoptimizeÚ$BertOnnxModelShapeOptimizer.optimize  s	  € ð —j‘j×&Ñ&×2Ô2ˆFØ�{‰{×%Ñ%Ô&@×AÔAÜ—‘ÐSÔTÚñ 3ð
 	×Ñ˜IÔ&Ø×Ñ˜KÔ(Ø×Ñ˜JÔ'àÒ#Ø×!Ñ! ,Ô/Ø×Ñ˜\Ô*à7;·z±z×7GÑ7G×7NÒ7NÓOÑ7N¨VŸ[œ[Ñ7NÐÐOç×1Ð1Ü�4×?Ñ?ÓAÓBÀaÔGÜ—‘ÐWÔXÙä×,Ò,×.Ô.°(Ø!/×!6Ñ!6´x·|²|³~×7NÑ7NÐO_Ó7`Ó!a�ß$‘c¨(�ÜŸG™GŸL™L¨¨nÓ=�	Ø×'Ñ'ØØØØØ%ØØ#Ø$Ø&Øô÷	 /ô  �L‰LÐ?À	¸{ÐKÔLÜ�N‰NØlÐmwÐlxð  yJð  KZð  J[ð  \ôð Ò"Ü�k 4×(Ô(¨CØ—	‘	˜$Ÿ*™*×6Ñ6Ó8Ô9÷ )Ñ(ñ #ùò9 P÷ /×.ú÷, )×(Ð(ús   Ã IÅA:I!È&*I4É!I1	É4J	)r€   )rg   é€   )é   )Nrg   rÑ   F)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r.   r9   r@   rL   rU   rc   ry   r    r�   r´   r¹   rÏ   Ú__static_attributes__Ú__classdictcell__Ú__classcell__)r   r­   s   @@r   r   r   !   sg   ù‡ € ñõ
+òòòòò$!ô(ô òBB'òHw÷:`ð `÷
eð e÷9:÷ 9:ò 9:r   r   c                  óº  € \         P                  ! 4       p V P                  R R\        R7       V P                  RR\        R7       V P                  RR\        R7       V P                  RR\        R7       V P                  RR\        R7       V P                  RR\        R	R
7       V P                  RR\        ^R
7       V P                  RR\        ^€R
7       V P                  RRRR7       V P                  RR7       V P                  RRRR7       V P                  RR7       V P                  RRRR7       V P                  RR7       V P                  4       pV# )z--inputT)Úrequiredr[   z--outputz--input_idsz--segment_idsz--input_maskz--output_namesFN)rÜ   r[   Údefaultz--batch_sizez--sequence_lengthz--enable_shape_optÚ
store_true)rÜ   Úaction)r”   z--enable_reshape_opt)r•   z	--verbose)r–   )ÚargparseÚArgumentParserÚadd_argumentr«   ÚintÚset_defaultsÚ
parse_args)ÚparserÚargss     r   Úparse_argumentsrè   S  sG  € Ü×$Ò$Ó&€FØ
×Ñ˜	¨D´sÐÔ;Ø
×Ñ˜
¨T¼ÐÔ<Ø
×Ñ˜°¼3ÐÔ?Ø
×Ñ˜°$¼SÐÔAØ
×Ñ˜°¼CÐÔ@Ø
×ÑÐ(°5¼sÈDÐÔQØ
×Ñ˜°¼SÈ!ÐÔLØ
×ÑÐ+°eÄ#ÈsÐÔSØ
×ÑÐ,°uÀ\ÐÔRØ
×Ñ¨ÐÔ/Ø
×ÑÐ.¸À|ÐÔTØ
×Ñ¨5ÐÔ1Ø
×Ñ˜¨e¸LÐÔIØ
×Ñ ÐÔ&Ø×ÑÓ€DØ€Kr   c                 óª  € \         P                  ! \        P                  4      pV '       d7   VP	                  \         P
                  ! R 4      4       \         P                  pM5VP	                  \         P
                  ! R4      4       \         P                  pVP                  V4       \        P                  V4       \        P                  V4       R# )z8[%(filename)s:%(lineno)s - %(funcName)20s()] %(message)sz%(filename)20s: %(message)sN)ÚloggingÚStreamHandlerÚsysÚstdoutÚsetFormatterÚ	FormatterÚDEBUGÚINFOÚsetLevelr�   Ú
addHandler)r–   Úlog_handlerÚlogging_levels   &  r   Úsetup_loggingrö   g  s‡   € Ü×'Ò'¬¯
©
Ó3€KßØ× Ñ ¤×!2Ò!2Ð3mÓ!nÔoÜŸ™‰à× Ñ ¤×!2Ò!2Ð3PÓ!QÔRÜŸ™ˆØ×Ñ˜Ô'Ü
×Ñ�kÔ"Ü
‡O�O�MÖ"r   c                  ót  € \        4       p \        V P                  4       V P                  f   R MV P                  P	                  R4      p\        4       p\        V P                  R4      ;_uu_ 4       pVP                  VP                  4       4       R R R 4       \        V4      p\        V4      pVP                  V P                  V P                  V P                  V P                   V P"                  V P$                  VV P&                  V P(                  V P                  4
       R #   + '       g   i     Lœ; i)NÚ;Úrb)rè   rö   r–   rH   Úsplitr   r‚   r>   ÚParseFromStringÚreadr	   r   rÏ   r6   rp   rq   rr   r”   r•   r`   rs   )rç   rH   r   Ú
input_filer   Ú	optimizers         r   Úmainrÿ   t  sã   € ÜÓ€DÜ�$—,‘,Ôà×,Ñ,Ò4‘4¸$×:KÑ:K×:QÑ:QÐRUÓ:V€Lä‹L€EÜ	ˆd�j‰j˜$×	Ô	 :Ø×Ñ˜jŸo™oÓ/Ô0÷ 
 ä˜5Ó!€Jä+¨JÓ7€Ià×ÑØ�‰Ø�‰Ø×ÑØ�‰Ø×ÑØ×ÑØØ�‰Ø×ÑØ�‰ö÷ 
 ×	ús   Á3 D'Ä'D7	Ú__main__)rà   rê   rÆ   Úrerì   rÂ   Úcollectionsr   r   Úpathlibr   Únumpyr    r%   r   r   r   r   r	   r…   Ú	getLoggerrÓ   r�   r$   rE   r   rè   rö   rÿ   © r   r   Ú<module>r     s‚   ðó Û Û 	Û 	Û 
Û Ý Ý Ý ã Û ß 6Ñ 6Ý  ã à	×	Ò	˜8Ó	$€à3Ð Ø4Ð ôo: )ô o:òd	ò(
#òð6 ˆzÔÙ†Fñ r   