§
    1�ÅjZn  ã                  óÞ   — d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
mZ erd dlmZ 	 d<d=d„Z	 	 	 	 	 	 d>d?d„Z	 	 	 	 	 	 	 	 	 	 d@dAd$„Z	 	 	 	 	 	 	 	 dBdCd4„Z	 	 	 	 	 	 	 	 dDdEd7„Z	 dFdGd:„Z	 dFdHd;„ZdS )Ié    )Úannotations)ÚTYPE_CHECKING)ÚAttributeProtoÚ
GraphProtoÚ
ModelProtoÚTensorProtoÚcheckerÚhelperÚutils)ÚMutableMappingNÚg1r   Úg2Úio_mapúlist[tuple[str, str]] | NoneÚreturnúlist[tuple[str, list[str]]]c                ó&  — t          | t          ¦  «        st          d¦  «        ‚t          |t          ¦  «        st          d¦  «        ‚dd„}ddd„}g }|sg }d„ |D ¦   «         } | || ¦  «         |||¬¦  «        ¦  «        }|r|                     d|f¦  «          |d„ | j        D ¦   «         d„ |j        D ¦   «         ¦  «        }|r|                     d|f¦  «          |d„ | j        D ¦   «         d„ |j        D ¦   «         ¦  «        }|r|                     d|f¦  «          |d„ | j        D ¦   «         d„ |j        D ¦   «         ¦  «         |d„ | j        D ¦   «         d„ |j        D ¦   «         ¦  «        z   }|r|                     d|f¦  «         |S )aý  Checks whether there are name collisions between two graphs

    Returns a list of tuples where the first element represents the member containing overlapping names
    (One of: "node", "edge", "value_info", "initializer", "sparse_initializer"), and the
    second element contains a list of names that appear in both graphs on that category.

    Optionally, it takes an io_map, representing the output/inputs to be connected. It provided, overlapping
    present in the io_map argument will be ignored.
    ú g1 argument is not an ONNX graphú g2 argument is not an ONNX graphÚc1ú	list[str]Úc2r   c                óZ   — t          t          | ¦  «        t          |¦  «        z  ¦  «        S ©N)ÚlistÚset)r   r   s     ú=C:\Projects\Historical\venv\Lib\site-packages\onnx/compose.pyÚ_overlappingz-check_overlapping_names.<locals>._overlapping'   s!   € Ý•C˜‘G”G�c "™gœgÑ%Ñ&Ô&Ð&ó    NÚgraphr   Úexcludeúset[str] | Nonec                óâ   — |€t          ¦   «         }g }| j        D ]T}|j        D ]!}|dk    r||vr|                     |¦  «         Œ"|j        D ]!}|dk    r||vr|                     |¦  «         Œ"ŒU|S )NÚ )r   ÚnodeÚinputÚappendÚoutput)r    r!   ÚedgesÚnÚiÚos         r   Ú_edge_namesz,check_overlapping_names.<locals>._edge_names*   sš   € Øˆ?Ý‘e”eˆGØˆØ”ð 	$ð 	$ˆAØ”Wð $ð $�Ø˜’7�7˜q¨Ð/Ð/Ø—L’L ‘O”O�OøØ”Xð $ð $�Ø˜’7�7˜q¨Ð/Ð/Ø—L’L ‘O”O�Oøð$ð ˆr   c                ó   — h | ]
}|d          ’ŒS ©é   © )Ú.0Úelems     r   ú	<setcomp>z*check_overlapping_names.<locals>.<setcomp>;   s   € Ð0Ð0Ð0 �T˜!”WÐ0Ð0Ð0r   )r!   Úedgec                ó   — g | ]	}|j         ‘Œ
S r1   ©Úname©r2   Úes     r   ú
<listcomp>z+check_overlapping_names.<locals>.<listcomp>C   s   € Ð'Ð'Ð'�AˆŒÐ'Ð'Ð'r   c                ó   — g | ]	}|j         ‘Œ
S r1   r7   r9   s     r   r;   z+check_overlapping_names.<locals>.<listcomp>C   s   € Ð)HÐ)HÐ)H°Q¨!¬&Ð)HÐ)HÐ)Hr   Ú
value_infoc                ó   — g | ]	}|j         ‘Œ
S r1   r7   r9   s     r   r;   z+check_overlapping_names.<locals>.<listcomp>I   s   € Ð(Ð(Ð(�AˆŒÐ(Ð(Ð(r   c                ó   — g | ]	}|j         ‘Œ
S r1   r7   r9   s     r   r;   z+check_overlapping_names.<locals>.<listcomp>I   s   € Ð*JÐ*JÐ*J°a¨1¬6Ð*JÐ*JÐ*Jr   Úinitializerc                ó&   — g | ]}|j         j        ‘ŒS r1   ©Úvaluesr8   r9   s     r   r;   z+check_overlapping_names.<locals>.<listcomp>O   ó   € Ð6Ð6Ð6˜1ˆŒŒÐ6Ð6Ð6r   c                ó&   — g | ]}|j         j        ‘ŒS r1   rB   r9   s     r   r;   z+check_overlapping_names.<locals>.<listcomp>P   rD   r   c                ó&   — g | ]}|j         j        ‘ŒS r1   ©Úindicesr8   r9   s     r   r;   z+check_overlapping_names.<locals>.<listcomp>R   ó   € Ð7Ð7Ð7˜AˆŒŒÐ7Ð7Ð7r   c                ó&   — g | ]}|j         j        ‘ŒS r1   rG   r9   s     r   r;   z+check_overlapping_names.<locals>.<listcomp>S   rI   r   Úsparse_initializer)r   r   r   r   r   r   r   )r    r   r!   r"   r   r   )Ú
isinstancer   Ú	TypeErrorr'   r=   r@   rK   )r   r   r   r   r-   ÚresultÚio_map_inputsÚoverlaps           r   Úcheck_overlapping_namesrQ      s1  € õ �b�*Ñ%Ô%ð <ÝÐ:Ñ;Ô;Ð;Ý�b�*Ñ%Ô%ð <ÝÐ:Ñ;Ô;Ð;ð'ð 'ð 'ð 'ðð ð ð ð ð €Fàð ØˆØ0Ð0¨Ð0Ñ0Ô0€Mð ˆl˜;˜; r™?œ?¨K¨K¸ÀMÐ,RÑ,RÔ,RÑSÔS€GØð )Ø�Š�v˜wÐ'Ñ(Ô(Ð(àˆlØ'Ð'˜œÐ'Ñ'Ô'Ð)HÐ)H¸"¼-Ð)HÑ)HÔ)Hñô €Gð ð /Ø�Š�| WÐ-Ñ.Ô.Ð.àˆlØ(Ð(˜œÐ(Ñ(Ô(Ð*JÐ*J¸2¼>Ð*JÑ*JÔ*Jñô €Gð ð 0Ø�Š�} gÐ.Ñ/Ô/Ð/àˆlØ6Ð6 Ô 5Ð6Ñ6Ô6Ø6Ð6 Ô 5Ð6Ñ6Ô6ñô ð 	ˆØ7Ð7 Ô!6Ð7Ñ7Ô7Ø7Ð7 Ô!6Ð7Ñ7Ô7ñ	ô 	ñ€Gð ð 7Ø�ŠÐ+¨WÐ5Ñ6Ô6Ð6à€Mr   úlist[tuple[str, str]]Úinputsúlist[str] | NoneÚoutputsÚprefix1ú
str | NoneÚprefix2r8   Ú
doc_stringc	                óö  ‡‡‡‡‡‡‡‡ ‡!‡"— t          | t          ¦  «        st          d¦  «        ‚t          |t          ¦  «        st          d¦  «        ‚‰s‰r‰r6t          ¦   «         }	|	                     | ¦  «         |	} t	          | ‰¬¦  «        } ‰r6t          ¦   «         }
|
                     |¦  «         |
}t	          |‰¬¦  «        }ˆˆfd„|D ¦   «         }d„ |D ¦   «         Šd„ |D ¦   «         Šd„ |D ¦   «         Š!d„ | j        D ¦   «         }d	„ |j        D ¦   «         }|s|�rÌ|s#d
„ | j        D ¦   «         }d„ |j        D ¦   «         }n6t          |¦  «        Šˆfd„| j        D ¦   «         }ˆˆfd„|j        D ¦   «         }|s#d„ | j        D ¦   «         }d„ |j        D ¦   «         }n6t          |¦  «        Š ˆˆ fd„| j        D ¦   «         }ˆ fd„|j        D ¦   «         }t          |¦  «        t          | j        ¦  «        k     s%t          |¦  «        t          | j        ¦  «        k     rAt          j
        t          j        | ¦  «        ¦  «        }|                     ||¦  «        j        } t          |¦  «        t          |j        ¦  «        k     s%t          |¦  «        t          |j        ¦  «        k     rAt          j
        t          j        |¦  «        ¦  «        }|                     ||¦  «        j        }|D ]3\  }}||vrt          d|› d�¦  «        ‚||vrt          d|› d�¦  «        ‚Œ4t!          | ||¦  «        }t          |¦  «        dk    r:|d         \  }}t          d|› d�d                     |¦  «        z   dz   dz   ¦  «        ‚t          ¦   «         }|j                             | j        ¦  «         t          |j        ¦  «        }|j                             |j        ¦  «         t          |j        ¦  «        }d5ˆˆ!fd#„Š ‰|||¦  «         |rft          |¦  «        Š|j                             ˆfd$„| j        D ¦   «         ¦  «         |j                             ˆfd%„|j        D ¦   «         ¦  «         nJ|j                             | j        ¦  «         |j                             ˆfd&„|j        D ¦   «         ¦  «         |rft          |¦  «        Š |j                             ˆ fd'„| j        D ¦   «         ¦  «         |j                             ˆ fd(„|j        D ¦   «         ¦  «         nJ|j                             ˆfd)„| j        D ¦   «         ¦  «         |j                             |j        ¦  «         |j                             | j        ¦  «         |j                             ˆfd*„|j        D ¦   «         ¦  «         |j                             | j        ¦  «         |j                             ˆfd+„|j        D ¦   «         ¦  «         |j                             | j        ¦  «         |j                             ˆfd,„|j        D ¦   «         ¦  «         d-„ |j        D ¦   «         Š"d.„ |j        D ¦   «         Š|j                             ˆˆˆ"fd/„| j        D ¦   «         ¦  «         |�|n| j        › d1|j        › �|_        |€<d2| j        › d3|j        › d�| j        z   d4z   | j        z   d4z   |j        z   d4z   |j        z   }||_        |S )6a�  Combines two ONNX graphs into a single one.

    The combined graph is defined by connecting the specified set of outputs/inputs. Those inputs/outputs
    not specified in the io_map argument will remain as inputs/outputs of the combined graph.

    Arguments:
        g1 (GraphProto): First graph
        g2 (GraphProto): Second graph
        io_map (list of pairs of string): The pairs of names [(out0, in0), (out1, in1), ...]
                                          representing outputs of the first graph and inputs of the second
                                          to be connected
        inputs (list of string): Optional list of inputs to be included in the combined graph
                                 By default, all inputs not present in the ``io_map`` argument will be
                                 included in the combined model
        outputs (list of string): Optional list of outputs to be included in the combined graph
                                  By default, all outputs not present in the ``io_map`` argument will be
                                  included in the combined model
        prefix1 (string): Optional prefix to be added to all names in g1
        prefix2 (string): Optional prefix to be added to all names in g2
        name (string): Optional name for the combined graph
                       By default, the name is g1.name and g2.name concatenated with an underscore delimiter
        doc_string (string): Optional docstring for the combined graph
                             If not provided, a default docstring with the concatenation of g1 and g2 docstrings is used

    Returns:
        GraphProto
    r   r   ©Úprefixc                ód   •— g | ],}‰r‰|d          z   n|d          ‰r‰|d         z   n|d         f‘Œ-S ©r   r0   r1   ©r2   ÚiorV   rX   s     €€r   r;   z merge_graphs.<locals>.<listcomp>’   ó]   ø€ ð 
ð 
ð 
ð
 ð $+Ð5�˜"˜Qœ%‘�°°1´Ø#*Ð5�˜"˜Qœ%‘�°°1´ðð
ð 
ð 
r   c                ó   — h | ]
}|d          ’ŒS )r   r1   ©r2   r`   s     r   r4   zmerge_graphs.<locals>.<setcomp>š   s   € Ð-Ð-Ð- �b˜”eÐ-Ð-Ð-r   c                ó   — h | ]
}|d          ’ŒS r/   r1   rc   s     r   r4   zmerge_graphs.<locals>.<setcomp>›   s   € Ð,Ð,Ð,˜r�R˜”UÐ,Ð,Ð,r   c                ó   — i | ]\  }}||“Œ	S r1   r1   )r2   Úout_nameÚin_names      r   ú
<dictcomp>z merge_graphs.<locals>.<dictcomp>œ   s   € ÐIÐIÐIÑ->¨X°w�w ÐIÐIÐIr   c                ó   — h | ]	}|j         ’Œ
S r1   r7   ©r2   r,   s     r   r4   zmerge_graphs.<locals>.<setcomp>�   s   € Ð)Ð)Ð)˜!ˆqŒvÐ)Ð)Ð)r   c                ó   — h | ]	}|j         ’Œ
S r1   r7   ©r2   r+   s     r   r4   zmerge_graphs.<locals>.<setcomp>ž   s   € Ð'Ð'Ð'˜ˆaŒfÐ'Ð'Ð'r   c                ó   — g | ]	}|j         ‘Œ
S r1   r7   rl   s     r   r;   z merge_graphs.<locals>.<listcomp>£   ó   € Ð2Ð2Ð2 A˜œÐ2Ð2Ð2r   c                ó   — g | ]	}|j         ‘Œ
S r1   r7   rl   s     r   r;   z merge_graphs.<locals>.<listcomp>¤   rn   r   c                ó0   •— g | ]}|j         ‰v ¯|j         ‘ŒS r1   r7   ©r2   r+   Ú	input_sets     €r   r;   z merge_graphs.<locals>.<listcomp>§   s'   ø€ ÐIÐIÐI A°Q´V¸yÐ5HÐ5H˜œÐ5HÐ5HÐ5Hr   c                óB   •— g | ]}|j         ‰v s	|j         ‰v ¯|j         ‘ŒS r1   r7   )r2   r+   rr   Úio_map_g2_inss     €€r   r;   z merge_graphs.<locals>.<listcomp>¨   s>   ø€ ð ð ð àØ”6˜YÐ&Ð&¨!¬&°MÐ*AÐ*Að ”à*AÐ*AÐ*Ar   c                ó   — g | ]	}|j         ‘Œ
S r1   r7   rj   s     r   r;   z merge_graphs.<locals>.<listcomp>¯   ó   € Ð4Ð4Ð4 Q˜!œ&Ð4Ð4Ð4r   c                ó   — g | ]	}|j         ‘Œ
S r1   r7   rj   s     r   r;   z merge_graphs.<locals>.<listcomp>°   rv   r   c                óB   •— g | ]}|j         ‰v s	|j         ‰v ¯|j         ‘ŒS r1   r7   )r2   r,   Úio_map_g1_outsÚ
output_sets     €€r   r;   z merge_graphs.<locals>.<listcomp>³   s>   ø€ ð ð ð àØ”6˜ZÐ'Ð'¨1¬6°^Ð+CÐ+Cð ”à+CÐ+CÐ+Cr   c                ó0   •— g | ]}|j         ‰v ¯|j         ‘ŒS r1   r7   ©r2   r,   rz   s     €r   r;   z merge_graphs.<locals>.<listcomp>¸   s'   ø€ ÐLÐLÐL Q°q´vÀÐ7KÐ7K˜!œ&Ð7KÐ7KÐ7Kr   zOutput z is not present in g1zInput z is not present in g2r   z=Cant merge two graphs with overlapping names. Found repeated z names: ú, ú
zYConsider using ``onnx.compose.add_prefix`` to add a prefix to names in one of the graphs.Ú	sub_graphr   ÚstartÚintÚendr   ÚNonec           
     ó²  •— t          ||¦  «        D ]Ä}| j        |         }|j        D ]}|j        t          j        k    r* ‰	|j        dt          |j        j        ¦  «        ¦  «         ŒA|j        t          j        k    r)|j	        D ]!} ‰	|dt          |j        ¦  «        ¦  «         Œ"Œ€t          |j        ¦  «        D ]\  }}|‰
v r‰
|         |j        |<   ŒŒÅd S ©Nr   )Úranger%   Ú	attributeÚtyper   ÚGRAPHÚgÚlenÚGRAPHSÚgraphsÚ	enumerater&   )r   r€   r‚   Únode_idxr%   ÚattrÚsub_gÚindexÚname_Ú
connect_ioÚreversed_io_maps            €€r   r”   z merge_graphs.<locals>.connect_ioÝ   sø   ø€ Ý˜e SÑ)Ô)ð 	?ð 	?ˆHØ”> (Ô+ˆDØœð >ð >�Ø”9¥Ô 4Ò4Ð4Ø�J˜tœv q­#¨d¬f¬kÑ*:Ô*:Ñ;Ô;Ð;Ð;Ø”Y¥.Ô"7Ò7Ð7Ø!%¤ð >ð >˜Ø"˜
 5¨!­S°´©_¬_Ñ=Ô=Ð=Ð=øå )¨$¬*Ñ 5Ô 5ð ?ð ?‘��uØ˜OÐ+Ð+Ø(7¸Ô(>�D”J˜uÑ%øð?ð	?ð 	?r   c                ó&   •— g | ]}|j         ‰v ¯|‘ŒS r1   r7   rq   s     €r   r;   z merge_graphs.<locals>.<listcomp>ð   ó%   ø€ ÐCÐCÐC˜a¨q¬v¸Ð/BÐ/B˜Ð/BÐ/BÐ/Br   c                ó&   •— g | ]}|j         ‰v ¯|‘ŒS r1   r7   rq   s     €r   r;   z merge_graphs.<locals>.<listcomp>ñ   r—   r   c                ó&   •— g | ]}|j         ‰v¯|‘ŒS r1   r7   )r2   r+   rt   s     €r   r;   z merge_graphs.<locals>.<listcomp>ô   s%   ø€ ÐKÐKÐK˜a¨q¬v¸]Ð/JÐ/J˜Ð/JÐ/JÐ/Jr   c                ó&   •— g | ]}|j         ‰v ¯|‘ŒS r1   r7   r|   s     €r   r;   z merge_graphs.<locals>.<listcomp>ø   ó%   ø€ ÐFÐFÐF˜q°´¸:Ð1EÐ1E˜Ð1EÐ1EÐ1Er   c                ó&   •— g | ]}|j         ‰v ¯|‘ŒS r1   r7   r|   s     €r   r;   z merge_graphs.<locals>.<listcomp>ù   r›   r   c                ó&   •— g | ]}|j         ‰v¯|‘ŒS r1   r7   )r2   r,   ry   s     €r   r;   z merge_graphs.<locals>.<listcomp>û   s%   ø€ ÐNÐNÐN˜q°´¸~Ð1MÐ1M˜Ð1MÐ1MÐ1Mr   c                ó&   •— g | ]}|j         ‰v¯|‘ŒS r1   r7   ©r2   Úinitrt   s     €r   r;   z merge_graphs.<locals>.<listcomp>   s%   ø€ ÐKÐKÐK�$¨D¬I¸]Ð,JÐ,JˆÐ,JÐ,JÐ,Jr   c                ó0   •— g | ]}|j         j        ‰v¯|‘ŒS r1   rB   rŸ   s     €r   r;   z merge_graphs.<locals>.<listcomp>  s3   ø€ ð 	
ð 	
ð 	
àØŒ{Ô }Ð4Ð4ð à4Ð4Ð4r   c                ó&   •— g | ]}|j         ‰v¯|‘ŒS r1   r7   )r2   Úvirt   s     €r   r;   z merge_graphs.<locals>.<listcomp>  s%   ø€ ÐTÐTÐT °r´wÀmÐ7SÐ7S˜Ð7SÐ7SÐ7Sr   c                ó   — h | ]	}|j         ’Œ
S r1   r7   )r2   r£   s     r   r4   zmerge_graphs.<locals>.<setcomp>  s   € Ð7Ð7Ð7 B˜œÐ7Ð7Ð7r   c                ó   — h | ]	}|j         ’Œ
S r1   r7   rj   s     r   r4   zmerge_graphs.<locals>.<setcomp>  s   € Ð-Ð-Ð-˜q�A”FÐ-Ð-Ð-r   c                óJ   •— g | ]}|j         ‰v r|j         ‰vr|j         ‰v¯|‘Œ S r1   r7   )r2   r,   ry   Úoutput_namesÚvalue_info_namess     €€€r   r;   z merge_graphs.<locals>.<listcomp>  sM   ø€ ð 	
ð 	
ð 	
àØŒv˜Ð'Ð'Ø”Ð.Ð.Ð.Ø”˜lÐ*Ð*ð	 ð +Ð*Ð*r   NÚ_zGraph combining ú and z

)r   r   r€   r�   r‚   r�   r   rƒ   )rL   r   rM   ÚCopyFromÚadd_prefix_graphr(   r&   r   r‹   r   Ú	Extractorr
   Ú
make_modelÚextract_modelr    Ú
ValueErrorrQ   Újoinr%   Úextendr@   rK   r=   r8   rY   )#r   r   r   rS   rU   rV   rX   r8   rY   Úg1_copyÚg2_copyÚg1_outsÚg2_insÚ	g1_inputsÚ	g2_inputsÚ
g1_outputsÚ
g2_outputsÚe1Úe2Úg1_out_nameÚ
g2_in_nameÚoverlapping_namesÚcategoryÚnamesrŠ   Úg2_nodes_beginÚg2_nodes_endr”   rr   ry   rt   r§   rz   r•   r¨   s#        ``                    @@@@@@@@r   Úmerge_graphsrÄ   [   s<  øøøøøøøøøø€ õL �b�*Ñ%Ô%ð <ÝÐ:Ñ;Ô;Ð;Ý�b�*Ñ%Ô%ð <ÝÐ:Ñ;Ô;Ð;ð ð 
�'ð 
Øð 	6Ý ‘l”lˆGØ×Ò˜RÑ Ô Ð ØˆBÝ! "¨WÐ5Ñ5Ô5ˆBØð 	6Ý ‘l”lˆGØ×Ò˜RÑ Ô Ð ØˆBÝ! "¨WÐ5Ñ5Ô5ˆBð
ð 
ð 
ð 
ð 
ð
 ð
ñ 
ô 
ˆð .Ð- fÐ-Ñ-Ô-€NØ,Ð, VÐ,Ñ,Ô,€MØIÐIÀ&ÐIÑIÔI€OØ)Ð)˜rœyÐ)Ñ)Ô)€GØ'Ð'˜bœhÐ'Ñ'Ô'€Fð ð ?�ñ ?Øð 
	Ø2Ð2¨¬Ð2Ñ2Ô2ˆIØ2Ð2¨¬Ð2Ñ2Ô2ˆIˆIå˜F™œˆIØIÐIÐIÐI¨¬ÐIÑIÔIˆIðð ð ð ð àœðñ ô ˆIð ð 
	MØ4Ð4¨"¬)Ð4Ñ4Ô4ˆJØ4Ð4¨"¬)Ð4Ñ4Ô4ˆJˆJå˜W™œˆJðð ð ð ð àœðñ ô ˆJð
 MÐLÐLÐL¨"¬)ÐLÑLÔLˆJåˆy‰>Œ>�C ¤™MœMÒ)Ð)­S°©_¬_½sÀ2Ä9¹~¼~Ò-MÐ-MÝ”¥Ô!2°2Ñ!6Ô!6Ñ7Ô7ˆBØ×!Ò! )¨ZÑ8Ô8Ô>ˆBåˆy‰>Œ>�C ¤™MœMÒ)Ð)­S°©_¬_½sÀ2Ä9¹~¼~Ò-MÐ-MÝ”¥Ô!2°2Ñ!6Ô!6Ñ7Ô7ˆBØ×!Ò! )¨ZÑ8Ô8Ô>ˆBð $*ð Ið IÑˆ�ZØ˜gÐ%Ð%ÝÐI {ÐIÐIÐIÑJÔJÐJØ˜VÐ#Ð#ÝÐG jÐGÐGÐGÑHÔHÐHð $õ 0°°B¸Ñ?Ô?ÐÝ
ÐÑÔ Ò!Ð!Ø+¨AÔ.‰ˆ�%Ýð1Ø&ð1ð 1ð 1à�iŠi˜ÑÔñð ñð jñ	jñ
ô 
ð 	
õ 	‰Œ€Aà„F‡M‚M�"”'ÑÔÐÝ˜œ‘[”[€NØ„F‡M‚M�"”'ÑÔÐÝ�q”v‘;”;€Lð?ð ?ð ?ð ?ð ?ð ?ð ?ð €Jˆq�. ,Ñ/Ô/Ð/àð MÝ˜‘K”Kˆ	Ø	Œ�ŠÐCÐCÐCÐC 2¤8ÐCÑCÔCÑDÔDÐDØ	Œ�ŠÐCÐCÐCÐC 2¤8ÐCÑCÔCÑDÔDÐDÐDà	Œ�Š�r”xÑ Ô Ð Ø	Œ�ŠÐKÐKÐKÐK 2¤8ÐKÑKÔKÑLÔLÐLàð #Ý˜‘\”\ˆ
Ø	Œ�ŠÐFÐFÐFÐF B¤IÐFÑFÔFÑGÔGÐGØ	Œ�ŠÐFÐFÐFÐF B¤IÐFÑFÔFÑGÔGÐGÐGà	Œ�ŠÐNÐNÐNÐN B¤IÐNÑNÔNÑOÔOÐOØ	Œ�Š˜œ	Ñ"Ô"Ð"à„M×Ò˜œÑ(Ô(Ð(Ø„M×ÒØKÐKÐKÐK˜"œ.ÐKÑKÔKñô ð ð Ô×Ò Ô 5Ñ6Ô6Ð6ØÔ×Òð	
ð 	
ð 	
ð 	
àÔ-ð	
ñ 	
ô 	
ñô ð ð „L×Ò˜œÑ&Ô&Ð&Ø„L×ÒÐTÐTÐTÐT b¤mÐTÑTÔTÑUÔUÐUØ7Ð7¨!¬,Ð7Ñ7Ô7ÐØ-Ð- A¤HÐ-Ñ-Ô-€LØ„L×Òð	
ð 	
ð 	
ð 	
ð 	
ð 	
à”Yð	
ñ 	
ô 	
ñô ð ð Ð%ˆTˆT¨b¬gÐ+AÐ+A¸¼Ð+AÐ+A€A„FàÐà8˜rœwÐ8Ð8¨R¬WÐ8Ð8Ð8ØŒgñàñð Œmñð ñ	ð
 Œgñð ñð Œmñð 	ð €A„Là€Hr   úonnx.compose.merge_modelsú1.0r$   r0   Úm1r   Úm2Úproducer_nameÚproducer_versionÚdomainÚmodel_versionú
int | Nonec           
     óò  ‡‡— t          | t          ¦  «        st          d¦  «        ‚t          |t          ¦  «        st          d¦  «        ‚| j        |j        k    r t	          d| j        › d|j        › d�¦  «        ‚| j        }i }t          | j        ¦  «        t          |j        ¦  «        z   }|D ]R}|j        |v r8||j                 }|j        |k    rt	          d| j        › d|j        › �¦  «        ‚ŒC|j        ||j        <   ŒS‰s‰r‰r6t          ¦   «         }| 	                    | ¦  «         |} t          | ‰¬¦  «        } ‰r6t          ¦   «         }| 	                    |¦  «         |}t          |‰¬¦  «        }ˆˆfd	„|D ¦   «         }t          | j        |j        |||||¬
¦  «        }t          j        ||	|
||||¬¦  «        }i }| j        D ]}|j        ||j        <   Œ|j        D ]V}|j        |v r<||j                 }||j        k    r#t	          d|j        › d|› d|j        › d�¦  «        ‚ŒG|j        ||j        <   ŒWt          j        ||¦  «         t          d„ | j        D ¦   «         d„ |j        D ¦   «         z  ¦  «        }|r%t	          dd                     |¦  «        z   ¦  «        ‚|j                             | j        ¦  «         |j                             |j        ¦  «         t-          j        |¦  «         |S )a>  Combines two ONNX models into a single one.

    The combined model is defined by connecting the specified set of outputs/inputs.
    Those inputs/outputs not specified in the io_map argument will remain as
    inputs/outputs of the combined model.

    Both models should have the same IR version, and same operator sets imported.

    Arguments:
        m1 (ModelProto): First model
        m2 (ModelProto): Second model
        io_map (list of pairs of string): The pairs of names [(out0, in0), (out1, in1), ...]
                                          representing outputs of the first graph and inputs of the second
                                          to be connected
        inputs (list of string): Optional list of inputs to be included in the combined graph
                                 By default, all inputs not present in the ``io_map`` argument will be
                                 included in the combined model
        outputs (list of string): Optional list of outputs to be included in the combined graph
                                  By default, all outputs not present in the ``io_map`` argument will be
                                  included in the combined model
        prefix1 (string): Optional prefix to be added to all names in m1
        prefix2 (string): Optional prefix to be added to all names in m2
        name (string): Optional name for the combined graph
                       By default, the name is g1.name and g2.name concatenated with an underscore delimiter
        doc_string (string): Optional docstring for the combined graph
                             If not provided, a default docstring with the concatenation of g1 and g2 docstrings is used
        producer_name (string): Optional producer name for the combined model. Default: 'onnx.compose'
        producer_version (string): Optional producer version for the combined model. Default: "1.0"
        domain (string): Optional domain of the combined model. Default: ""
        model_version (int): Optional version of the graph encoded. Default: 1

    Returns:
        ModelProto
    z m1 argument is not an ONNX modelz m2 argument is not an ONNX modelzIR version mismatch z != z-. Both models should have the same IR versionzPCan't merge two models with different operator set ids for a given domain. Got: rª   r[   c                ód   •— g | ],}‰r‰|d          z   n|d          ‰r‰|d         z   n|d         f‘Œ-S r^   r1   r_   s     €€r   r;   z merge_models.<locals>.<listcomp>ƒ  ra   r   )rS   rU   r8   rY   )rÉ   rÊ   rË   rÌ   Úopset_importsÚ
ir_versionzaCan't merge models with different values for the same model metadata property. Found: property = z, with values ú.c                ó   — h | ]	}|j         ’Œ
S r1   r7   ©r2   Úfs     r   r4   zmerge_models.<locals>.<setcomp>°  s   € Ð&Ð&Ð&�AˆŒÐ&Ð&Ð&r   c                ó   — h | ]	}|j         ’Œ
S r1   r7   rÔ   s     r   r4   zmerge_models.<locals>.<setcomp>°  s   € Ð)GÐ)GÐ)G°Q¨!¬&Ð)GÐ)GÐ)Gr   zPCan't merge models with overlapping local function names. Found in both graphs: r}   )rL   r   rM   rÑ   r°   r   Úopset_importrË   Úversionr«   Ú
add_prefixrÄ   r    r
   r®   Úmetadata_propsÚvalueÚkeyÚset_model_propsÚ	functionsr±   Ú	MergeFromr	   Úcheck_model)rÇ   rÈ   r   rS   rU   rV   rX   r8   rY   rÉ   rÊ   rË   rÌ   rÑ   Úopset_import_maprÐ   ÚentryÚfound_versionÚm1_copyÚm2_copyr    ÚmodelÚmodel_propsÚ
meta_entryrÛ   Úfunction_overlaps        ``                   r   Úmerge_modelsrê   ,  sõ  øø€ õb �b�*Ñ%Ô%ð <ÝÐ:Ñ;Ô;Ð;Ý�b�*Ñ%Ô%ð <ÝÐ:Ñ;Ô;Ð;à	„}˜œÒ%Ð%Ýð; 2¤=ð ;ð ;°b´mð ;ð ;ð ;ñ
ô 
ð 	
ð ”€Jà13ÐÝ˜œÑ)Ô)­D°´Ñ,AÔ,AÑA€Màð 	;ð 	;ˆØŒ<Ð+Ð+Ð+Ø,¨U¬\Ô:ˆMØŒ} Ò-Ð-Ý ðDØœOðDð DØ24´/ðDð Dñô ð ð .ð .3¬]Ð˜Uœ\Ñ*Ð*ð ð 
�'ð 
Øð 	0Ý ‘l”lˆGØ×Ò˜RÑ Ô Ð ØˆBÝ˜B wÐ/Ñ/Ô/ˆBØð 	0Ý ‘l”lˆGØ×Ò˜RÑ Ô Ð ØˆBÝ˜B wÐ/Ñ/Ô/ˆBð
ð 
ð 
ð 
ð 
ð
 ð
ñ 
ô 
ˆõ Ø
ŒØ
ŒØØØØØðñ ô €Eõ ÔØØ#Ø)ØØ#Ø#Øðñ ô €Eð €KØÔ'ð 7ð 7ˆ
Ø&0Ô&6ˆ�J”NÑ#Ð#ØÔ'ð 	;ð 	;ˆ
ØŒ>˜[Ð(Ð(Ø 
¤Ô/ˆEØ˜
Ô(Ò(Ð(Ý ðhØ*4¬.ðhð hØHMðhð hØT^ÔTdðhð hð hñô ð ð )ð +5Ô*:ˆK˜
œÑ'Ð'Ý
Ô˜5 +Ñ.Ô.Ð.õ Ø&Ð&˜œÐ&Ñ&Ô&Ð)GÐ)G¸"¼,Ð)GÑ)GÔ)GÑGñô Ðð ð 
Ýð&Ø(,¯	ª	Ð2BÑ(CÔ(CñDñ
ô 
ð 	
ð 
„O×Ò˜bœlÑ+Ô+Ð+Ø	„O×Ò˜bœlÑ+Ô+Ð+åÔ˜ÑÔÐØ€Lr   TFr    r\   ÚstrÚrename_nodesúbool | NoneÚrename_edgesÚrename_inputsÚrename_outputsÚrename_initializersÚrename_value_infosÚinplaceÚname_mapúdict[str, str] | Nonec
           	     ó²  — t          | t          ¦  «        st          d¦  «        ‚|s$t          ¦   «         }
|
                     | ¦  «         n| }
dd„}|	€i }	|r8d„ |
j        D ¦   «         }|
j        D ]}|j        D ]}||vr |||¦  «        |	|<   ŒŒ |r#|
j        D ]} |||j        ¦  «        |	|j        <   Œ|r#|
j        D ]} |||j        ¦  «        |	|j        <   Œ|rt|
j        D ]l} |||j        ¦  «        |_        |j        D ]L}| 	                    d	¦  «        rt          |j        |d
|	¬¦  «         |j        D ]}t          ||d
|	¬¦  «         ŒŒMŒm|rs|
j        D ]} |||j        ¦  «        |	|j        <   Œ|
j        D ]H} |||j        j        ¦  «        |	|j        j        <    |||j        j        ¦  «        |	|j        j        <   ŒI|r#|
j        D ]} |||j        ¦  «        |	|j        <   Œ|
j        D ]t}t%          |j        ¦  «        D ]$\  }}|j        |         |	v r|	|         |j        |<   Œ%t%          |j        ¦  «        D ]$\  }}|j        |         |	v r|	|         |j        |<   Œ%Œu|
j        D ]}|j        |	v r|	|j                 |_        Œ|
j        D ]}|j        |	v r|	|j                 |_        Œ|
j        D ]}|j        |	v r|	|j                 |_        Œ|
j        D ]V}|j        j        |	v r|	|j        j                 |j        _        |j        j        |	v r|	|j        j                 |j        _        ŒW|
j        D ]}|j        |	v r|	|j                 |_        Œ|
S )aÖ  Adds a prefix to names of elements in a graph: nodes, edges, inputs, outputs,
    initializers, sparse initializer, value infos.

    It can be used as a utility before merging graphs that have overlapping names.
    Empty names are not prefixed.

    Arguments:
        graph (GraphProto): Graph
        prefix (str): Prefix to be added to each name in the graph
        rename_nodes (bool): Whether to prefix node names
        rename_edges (bool): Whether to prefix node edge names
        rename_inputs (bool): Whether to prefix input names
        rename_outputs (bool): Whether to prefix output names
        rename_initializers (bool): Whether to prefix initializer and sparse initializer names
        rename_value_infos (bool): Whether to prefix value info names
        inplace (bool): If True, mutates the graph directly.
                        Otherwise, a copy will be created
        name_map: (Dict): shared name_map in subgraph

    Returns:
        GraphProto
    ú#graph argument is not an ONNX graphr\   rë   r8   r   c                ó6   — t          |¦  «        dk    r| |z   n|S r…   )r‹   )r\   r8   s     r   Ú	_prefixedz#add_prefix_graph.<locals>._prefixedé  s   € Ý # D¡	¤	¨A¢ ˆv˜‰}ˆ}°4Ð7r   Nc                ó   — h | ]	}|j         ’Œ
S r1   r7   rj   s     r   r4   z#add_prefix_graph.<locals>.<setcomp>ó  s   € Ð7Ð7Ð7¨˜aœfÐ7Ð7Ð7r   rŠ   T)ró   rô   )r\   rë   r8   rë   r   rë   )rL   r   rM   r«   r(   r%   r&   r8   r‡   ÚHasFieldr¬   rŠ   r�   r@   rK   rC   rH   r=   rŽ   )r    r\   rì   rî   rï   rð   rñ   rò   ró   rô   rŠ   rù   Úgraph_output_namesr*   r:   râ   r‡   r‘   r    Úsparse_initr+   r(   Úinput_Úin_descÚout_descr@   rK   r=   s                               r   r¬   r¬   ¾  s™  € õD �e�ZÑ(Ô(ð ?ÝÐ=Ñ>Ô>Ð>àð Ý‰LŒLˆØ	�
Š
�5ÑÔÐÐàˆð8ð 8ð 8ð 8ð ÐØˆàð 7ð 8Ð7¨a¬hÐ7Ñ7Ô7ÐØ”ð 	7ð 	7ˆAØ”Xð 7ð 7�ØÐ.Ð.Ð.Ø"+ )¨F°AÑ"6Ô"6�H˜Q‘Køð7ð ð AØ”Wð 	Að 	AˆEØ#, 9¨V°U´ZÑ#@Ô#@ˆH�U”ZÑ Ð Øð AØ”Xð 	Að 	AˆEØ#, 9¨V°U´ZÑ#@Ô#@ˆH�U”ZÑ Ð àð 	UØ”ð 	Uð 	UˆAØ�Y˜v q¤vÑ.Ô.ˆAŒFØœ[ð Uð U�	Ø×%Ò% cÑ*Ô*ð Ý$Ø!œ V°TÀHðñ ô ð ð 'Ô-ð Uð U�EÝ$ U¨F¸DÈ8ÐTÑTÔTÐTÐTðUðUð ð 	Ø”Mð 	?ð 	?ˆDØ"+ )¨F°D´IÑ">Ô">ˆH�T”YÑÐØÔ/ð 	ð 	ˆKØ09°	Ø˜Ô*Ô/ñ1ô 1ˆH�[Ô'Ô,Ñ-ð 2;°Ø˜Ô+Ô0ñ2ô 2ˆH�[Ô(Ô-Ñ.Ð.ð ð AØ”\ð 	Að 	AˆEØ#, 9¨V°U´ZÑ#@Ô#@ˆH�U”ZÑ Ð àŒVð .ð .ˆÝ" 1¤8Ñ,Ô,ð 	/ð 	/‰IˆAˆvØŒx˜Œ{˜hÐ&Ð&Ø& vÔ.�”˜‘øÝ" 1¤7Ñ+Ô+ð 	.ð 	.‰IˆAˆvØŒw�qŒz˜XÐ%Ð%Ø% fÔ-�”˜‘
øð	.ð ”7ð 2ð 2ˆØŒ<˜8Ð#Ð#Ø# G¤LÔ1ˆGŒLøØ”Hð 4ð 4ˆØŒ=˜HÐ$Ð$Ø$ X¤]Ô3ˆHŒMøà”}ð :ð :ˆØÔ˜xÐ'Ð'Ø'¨Ô(8Ô9ˆKÔøØÔ2ð Xð XÐØÔ$Ô)¨XÐ5Ð5Ø-5Ð6HÔ6OÔ6TÔ-UÐÔ%Ô*ØÔ%Ô*¨hÐ6Ð6Ø.6Ð7IÔ7QÔ7VÔ.WÐÔ&Ô+øà”lð 8ð 8ˆ
ØŒ?˜hÐ&Ð&Ø& z¤Ô7ˆJŒOøà€Hr   ræ   Úrename_functionsc
                óÚ  — t          | t          ¦  «        st          d¦  «        ‚|	s%t          ¦   «         }
|
                     | ¦  «         |
} t	          | j        |||||||d¬¦	  «	         |r€i }| j        D ]}||j        z   }|||j        <   ||_        Œ| j        D ]'}|j        D ]}|j	        |v r||j	                 |_	        ŒŒ(| j        j        D ]}|j	        |v r||j	                 |_	        Œ| S )aþ  Adds a prefix to names of elements in a graph: nodes, edges, inputs, outputs,
    initializers, sparse initializer, value infos, and local functions.

    It can be used as a utility before merging graphs that have overlapping names.
    Empty names are not _prefixed.

    Arguments:
        model (ModelProto): Model
        prefix (str): Prefix to be added to each name in the graph
        rename_nodes (bool): Whether to prefix node names
        rename_edges (bool): Whether to prefix node edge names
        rename_inputs (bool): Whether to prefix input names
        rename_outputs (bool): Whether to prefix output names
        rename_initializers (bool): Whether to prefix initializer and sparse initializer names
        rename_value_infos (bool): Whether to prefix value info nanes
        rename_functions (bool): Whether to prefix local function names
        inplace (bool): If True, mutates the model directly.
                        Otherwise, a copy will be created

    Returns:
        ModelProto
    ú#model argument is not an ONNX modelT)rì   rî   rï   rð   rñ   rò   ró   )
rL   r   rM   r«   r¬   r    rÞ   r8   r%   Úop_type)ræ   r\   rì   rî   rï   rð   rñ   rò   r  ró   ÚmÚ
f_name_maprÕ   Ú
new_f_namer*   s                  r   rÙ   rÙ   9  s>  € õD �e�ZÑ(Ô(ð ?ÝÐ=Ñ>Ô>Ð>àð Ý‰LŒLˆØ	�
Š
�5ÑÔÐØˆåØŒØØ!Ø!Ø#Ø%Ø/Ø-Øð
ñ 
ô 
ð 
ð ð 2Øˆ
Ø”ð 	 ð 	 ˆAØ !¤&™ˆJØ!+ˆJ�q”vÑØˆAŒFˆFð ”ð 	6ð 	6ˆAØ”Vð 6ð 6�Ø”9 
Ð*Ð*Ø *¨1¬9Ô 5�A”Iøð6ð ”Ô!ð 	2ð 	2ˆAØŒy˜JÐ&Ð&Ø& q¤yÔ1�”	øà€Lr   Údim_idxr�   c                óZ  — t          | t          ¦  «        st          d¦  «        ‚|s$t          ¦   «         }|                     | ¦  «         n| }d„ |j        D ¦   «         }|j        D ]^}t          |j        ¦  «        D ]\  }}||v r|d|› �z   |j        |<   Œt          |j        ¦  «        D ]\  }}||v r|d|› �z   |j        |<   ŒŒ_|j        dz   }	|j         	                    t          j        dg |	g|	› d�t          j        |	› d�t          j        dg|g¬	¦  «        ¬
¦  «        ¦  «         t          t!          |j        ¦  «        ¦  «        D ]á}
|j                             d¦  «        }|j        d|› �z   }|j         	                    t          j        d||	g|j        gd|j        › �¬¦  «        ¦  «         d„ |j        j        j        j        D ¦   «         }|                     |d¦  «         |j         	                    t          j        |j        |j        j        j        |¦  «        ¦  «         Œâ|S )aE  Inserts an extra dimension with extent 1 to each output in the graph.

    Inserts an Unsqueeze node for each output. It can be used as a utility before merging graphs,
    for example when the second one expects a batch dimension.

    Arguments:
        graph (GraphProto): Graph
        dim_idx (int): Index of the dimension to be inserted.
                       A negative value means counting dimensions from the back.
        inplace (bool): If True, mutates the model directly.
                        Otherwise, a copy will be created

    Returns:
        GraphProto
    r÷   c                ó   — g | ]	}|j         ‘Œ
S r1   r7   )r2   r(   s     r   r;   z(expand_out_dim_graph.<locals>.<listcomp>   s   € Ð9Ð9Ð9 f�f”kÐ9Ð9Ð9r   Ú_collapsed_dim_Ú_expand_out_dim_idxÚConstantz	-constantz-valuer0   )r8   Ú	data_typeÚdimsÚvals)rS   rU   r8   rÛ   r   Ú	Unsqueezez
unsqueeze-)rS   rU   r8   c                ó   — g | ]	}|j         ‘Œ
S r1   )Ú	dim_value)r2   Úds     r   r;   z(expand_out_dim_graph.<locals>.<listcomp>É  s   € ÐGÐGÐG Q�Q”[ÐGÐGÐGr   )rL   r   rM   r«   r(   r%   rŽ   r&   r8   r'   r
   Ú	make_nodeÚmake_tensorr   ÚINT64r†   r‹   Úpoprˆ   Útensor_typeÚshapeÚdimÚinsertÚmake_tensor_value_infoÚ	elem_type)r    r  ró   rŠ   Úorig_out_namesr*   r+   ÚoutÚinpÚexpand_dim_kr©   r,   Úprev_outputÚ	new_shapes                 r   Úexpand_out_dim_graphr%  ƒ  sœ  € õ( �e�ZÑ(Ô(ð ?ÝÐ=Ñ>Ô>Ð>àð Ý‰LŒLˆØ	�
Š
�5ÑÔÐÐàˆà9Ð9°´Ð9Ñ9Ô9€NàŒVð ?ð ?ˆÝ ¤Ñ)Ô)ð 	@ð 	@‰FˆAˆsØ�nÐ$Ð$Ø!Ð$?°gÐ$?Ð$?Ñ?�”˜‘øÝ ¤Ñ(Ô(ð 	?ð 	?‰FˆAˆsØ�nÐ$Ð$Ø Ð#>°WÐ#>Ð#>Ñ>�”˜‘
øð	?ð ”6Ð1Ñ1€LØ„F‡M‚MÝÔØØØ!�NØ Ð+Ð+Ð+ÝÔ$Ø$Ð,Ð,Ð,Ý%Ô+àðð ðð	ñ 	ô 	ð	
ñ 	
ô 	
ñô ð õ& •3�q”x‘=”=Ñ!Ô!ð 
ð 
ˆØŒH�LŠL˜‰OŒOˆØ”fÐ:°Ð:Ð:Ñ:ˆØ	Œ�ŠÝÔØØ# \Ð2Øœ˜Ø* !¤&Ð*Ð*ð	ñ ô ñ	
ô 	
ð 	
ð HÐG¨!¬&Ô*<Ô*BÔ*FÐGÑGÔGˆ	Ø×Ò˜ !Ñ$Ô$Ð$Ø	Œ�ŠÝÔ)Ø”˜œÔ*Ô4°iñô ñ	
ô 	
ð 	
ð 	
ð
 €Hr   c                óÊ   — t          | t          ¦  «        st          d¦  «        ‚|s%t          ¦   «         }|                     | ¦  «         |} t	          | j        |d¬¦  «         | S )aE  Inserts an extra dimension with extent 1 to each output in the graph.

    Inserts an Unsqueeze node for each output. It can be used as a utility before merging graphs,
    for example when the second one expects a batch dimension.

    Arguments:
        model (ModelProto): Model
        dim_idx (int): Index of the dimension to be inserted.
                       A negative value means counting dimensions from the back.
        inplace (bool): If True, mutates the model directly.
                        Otherwise, a copy will be created

    Returns:
        ModelProto
    r  T)ró   )rL   r   rM   r«   r%  r    )ræ   r  ró   r  s       r   Úexpand_out_dimr'  Ó  sv   € õ( �e�ZÑ(Ô(ð ?ÝÐ=Ñ>Ô>Ð>àð Ý‰LŒLˆØ	�
Š
�5ÑÔÐØˆåØŒØØðñ ô ð ð
 €Lr   r   )r   r   r   r   r   r   r   r   )NNNNNN)r   r   r   r   r   rR   rS   rT   rU   rT   rV   rW   rX   rW   r8   rW   rY   rW   r   r   )
NNNNNNrÅ   rÆ   r$   r0   )rÇ   r   rÈ   r   r   rR   rS   rT   rU   rT   rV   rW   rX   rW   r8   rW   rY   rW   rÉ   rW   rÊ   rW   rË   rW   rÌ   rÍ   r   r   )TTTTTTFN)r    r   r\   rë   rì   rí   rî   rí   rï   rí   rð   rí   rñ   rí   rò   rí   ró   rí   rô   rõ   r   r   )TTTTTTTF)ræ   r   r\   rë   rì   rí   rî   rí   rï   rí   rð   rí   rñ   rí   rò   rí   r  rí   ró   rí   r   r   )F)r    r   r  r�   ró   rí   r   r   )ræ   r   r  r�   ró   rí   r   r   )Ú
__future__r   Útypingr   Úonnxr   r   r   r   r	   r
   r   Úcollections.abcr   rQ   rÄ   rê   r¬   rÙ   r%  r'  r1   r   r   ú<module>r,     s÷  ðð #Ð "Ð "Ð "Ð "Ð "à  Ð  Ð  Ð  Ð  Ð  ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð /Ø.Ð.Ð.Ð.Ð.Ð.ð LPðBð Bð Bð Bð BðR  $Ø $ØØØØ!ðNð Nð Nð Nð Nðj  $Ø $ØØØØ!Ø ;Ø#(ØØ !ðOð Oð Oð Oð Oðj !%Ø $Ø!%Ø"&Ø'+Ø&*Ø Ø&*ðxð xð xð xð xð| !%Ø $Ø!%Ø"&Ø'+Ø&*Ø$(Ø ðGð Gð Gð Gð GðZ !ðMð Mð Mð Mð Mðf !ð!ð !ð !ð !ð !ð !ð !r   