§
    Û#äj§J  ã                   óH  — d Z ddlZddlZddlZddlZddlZddlmZ ddlZ	 eej
                             d ej        ¦   «         dz  ¦  «        ¦  «        Zej                             d ee¦  «        ¦  «         ej                             d e ee¦  «        j        ¦  «        ¦  «          ee¦  «                             ¦   «         j        j        Zedz  Z ej        ¦   «         dz  Z ej        ¦   «         dz  Z ej        ¦   «         d	z  Zed
z  edz  edz  edz  edz  edz  edz  edz  edz  edz  edz  edz  dœZg d¢ZdddœZg d¢ZdZd*d„Zd+d „Zd!„ Z d"„ Z!d#„ Z"d$„ Z#d%„ Z$d&„ Z%e&d'k    r1ej'        d(         d)v r$ e e$e#e%d)œej'        d(                  ¦   «          dS dS dS ),aª  Convex hull from the descriptor (fcp_hull.py) against qhull on the source mesh, for the report section "hull".

    cd ~/code/data/meshes/fcp_3010_hull
    env -u PYTHONPATH ~/code/fcp_devel/.venv/bin/python scripts/hull.py run    # out/hull.csv (per object and setting)
    env -u PYTHONPATH ~/code/fcp_devel/.venv/bin/python scripts/hull.py make   # figures, data.csv, section.html

Objects: the collision section's 12 (fcp_2910_collision/scripts/common.py). Encode: the package at FCP_API (default
~/code/fcp_devel/api), defaults except the layers and atoms of each setting. Times: median of 21 after one warm-up,
one thread (scipy's qhull and the numba kernel are both serial).
é    N)ÚPathÚFCP_APIzcode/fcp_devel/apiÚoutz)code/data/meshes/fcp_report/sections/hullz"code/data/meshes/data/meshes_cleanz*code/data/meshes/fcp_2910_collision/meshesz)gso__Room_Essentials_Mug_White_Yellow.plyz)gso__ACE_Coffee_Mug_Kristen_16_oz_cup.plyz)gso__Threshold_Bead_Cereal_Bowl_White.plyz5gso__Threshold_Porcelain_Serving_Bowl_Coupe_White.plyz>gso__Top_Paw_Dog_Bowl_Blue_Paw_Bone_Ceramic_25_fl_oz_total.plyz*gso__Central_Garden_Flower_Pot_Goo_425.plyz/gso__Timberland_Mens_Classic_2Eye_Boat_Shoe.plyzgso__Reebok_CLASSIC_JOGGER.plyz-gso__Schleich_Therizinosaurus_ln9cruulPqc.plyz&gso__Breyer_Horse_Of_The_Year_2015.plyz
spring.plyzknot.ply)ÚmugÚmug_aceÚbowlÚbowl_servingÚbowl_dogÚ
flower_potÚshoeÚjoggerÚdinoÚhorseÚspringÚknot))é€   i   é@   ©r   é   r   ©r   r   r   ©é   r   r   r   r   )r   r   )r   r
   r   r   r   r   ç      à?é   c                 ó  —  | ¦   «          g }t          |¦  «        D ]H}t          j        ¦   «         } | ¦   «          |                     t          j        ¦   «         |z
  ¦  «         ŒIdt	          t          j        |¦  «        ¦  «        z  S )Ng     @�@)ÚrangeÚtimeÚperf_counterÚappendÚfloatÚnpÚmedian)ÚfÚnÚtÚ_Út0s        ú9/home/joao/code/data/meshes/fcp_3010_hull/scripts/hull.pyÚtimeitr)   *   s~   € Ø€A�C„C€CØ
€AÝ�1‰XŒXð +ð +ˆÝÔÑ Ô ˆØ	ˆ‰ŒˆØ	�Š•Ô"Ñ$Ô$ rÑ)Ñ*Ô*Ð*Ð*Ø••r”y ‘|”|Ñ$Ô$Ñ$Ð$ó    é N  c                 óð   — ddl }|j                             | |d¬¦  «        \  }}|j                             ||¦  «        \  }}}d|                     ¦   «         z  |z  d|                     ¦   «         z  |z  fS )zIDistances (% diag) from n points on surface A to surface B: max and mean.r   N)Úseedéd   )ÚtrimeshÚsampleÚsample_surfaceÚ	proximityÚclosest_pointÚmaxÚmean)ÚAÚBÚdiagr$   r/   ÚPr&   Úds           r(   Úgapsr;   4   sv   € à€N€N€NàŒ>×(Ò(¨¨A°AÐ(Ñ6Ô6�D€A€qØÔ×-Ò-¨a°Ñ3Ô3�G€A€qˆ!Ø�—’‘”‰=˜4Ñ  q§v¢v¡x¤x¡°$Ñ!6Ð6Ð6r*   c                  óü  ‡‡‡‡‡‡— dd l } dd l}ddlmŠ dd lŠddlmŠ g }t                               ¦   «         D �])\  }}| 	                    |d¬¦  «        }t          j        |j        t          j        ¦  «        Št          t          j                             |j        d         |j        d         z
  ¦  «        ¦  «        } ‰‰¦  «        }|                     ‰|j        ¦  «        }|                     ¦   «          t+          ˆˆfd„¦  «        }	t,          D �]M\  }
}Š‰                     |||
d¬	¦  «        Š ‰‰‰t0          ‰         ¦  «        \  }}|                     ||d
¬¦  «        }t+          ˆˆˆfd„¦  «        }t+          ˆˆˆfd„d¦  «        } ‰|¦  «        }|                     ||j        ¦  «        }|                     ¦   «          t3          |||¦  «        \  }}t3          |||¦  «        \  }}t3          |||¦  «        \  }}t5          d6i d|“d|
“d|“d‰j        “d‰“dt0          ‰         “dt9          |j        ¦  «        “dt9          ‰¦  «        “d‰j        “d|“d|	“d|“d|“dt9          |¦  «        “dt9          |¦  «        “dt9          |j        ¦  «        “d|j        |j        z  “d |j         “d!|“d"|“d#|“d$|“d%|“d&|“Ž}| !                    |¦  «         tE          d'„ |                     ¦   «         D ¦   «         d(¬)¦  «         |
|‰fd*k    rL|tF          v rCt          j$        tJ          d+|› d,�z  ||‰t          j        |j        ¦  «        |j        |¬-¦  «         �ŒO�Œ+tJ           &                    d(¬.¦  «         |  '                    |¦  «         (                    tJ          d/z  d
¬0¦  «         tJ          d1z   )                    d2tU          ¦   «         › d3tV          › d4tY          tV          ¦  «        › d5�¦  «         d S )7Nr   )Ú
ConvexHull)Úconvex_hullÚmesh)Úforceé   c                  ó   •—  ‰ ‰¦  «        S ©N© )r=   ÚV0s   €€r(   ú<lambda>zrun.<locals>.<lambda>M   s   ø€   ¨B¡¤€ r*   Úcpu)ÚatomsÚlayersÚdeviceF©Úprocessc                  ó4   •—  ‰‰‰ t           ‰          ¦  «        S rC   )ÚN_T)ÚMr>   r:   s   €€€r(   rF   zrun.<locals>.<lambda>R   s   ø€  ; ;¨q°!µS¸´VÑ#<Ô#<€ r*   c                  óN   •—  ‰ ‰                      ‰d¬¦  «        j        ¦  «        S )NrG   )rJ   )ÚdecodeÚvertices)r=   r:   Úfcps   €€€r(   rF   zrun.<locals>.<lambda>S   s$   ø€  : :¨c¯jªj¸À5¨jÑ.IÔ.IÔ.RÑ#SÔ#S€ r*   é   ÚobjrI   Ú	atoms_reqrH   rO   Ún_tÚfacesÚvertsÚnbytesr8   Úqhull_msÚfcp_msÚdecode_qhull_msÚ
hull_vertsÚ	hull_trisÚtrue_hull_vertsÚ	vol_ratioÚ
watertightÚgap_true_to_fcp_maxÚgap_true_to_fcp_meanÚgap_fcp_to_true_maxÚgap_fcp_to_true_meanÚnonconvex_maxÚnonconvex_meanc                 ód   — i | ]-\  }}|t          |t          ¦  «        rt          |d ¦  «        n|“Œ.S )é   )Ú
isinstancer    Úround)Ú.0ÚkÚvs      r(   ú
<dictcomp>zrun.<locals>.<dictcomp>b   s9   € Ð[Ð[Ð[ÁtÀqÈ!�1¥j°µEÑ&:Ô&:ÐA•u˜Q ‘{”{�{ÀÐ[Ð[Ð[r*   T)Úflushr   Úrender_ú.npz)ÚVÚTrE   ÚF0ÚH0r8   )Úexist_okúhull.csv©Úindexúenv.txtzcpu: z
fcp: z @ ú
rD   )-Úpandasr/   Úscipy.spatialr=   rS   Úfcp_hullr>   ÚOBJECTSÚitemsÚloadr!   ÚasarrayrR   Úfloat64r    ÚlinalgÚnormÚboundsÚTrimeshÚ	simplicesÚfix_normalsr)   ÚSETTINGSÚencoderN   r;   ÚdictÚn_atomsÚlenrX   rZ   ÚvolumeÚis_watertightr   ÚprintÚRENDERÚsavezÚOUTÚmkdirÚ	DataFrameÚto_csvÚ
write_textrG   ÚAPIÚgit) Úpdr/   ÚrowsÚnameÚpathÚmr8   rw   ÚtrueÚt_qhullrI   rH   rt   ru   ÚhÚt_fcpÚt_decÚHqÚhqÚout_maxÚout_meanÚin_maxÚin_meanÚcx_maxÚcx_meanÚrowr=   rO   rE   r>   r:   rS   s                              @@@@@@r(   Úrunr°   =   sâ  øøøøøø€ ØÐÐÐØ€N€N€NØ(Ð(Ð(Ð(Ð(Ð(à€J€J€JØ$Ð$Ð$Ð$Ð$Ð$à€DÝ—m’m‘o”oð zñ z‰
ˆˆdØ�LŠL˜ VˆLÑ,Ô,ˆÝŒZ˜œ
¥B¤JÑ/Ô/ˆÝ•R”Y—^’^ A¤H¨Q¤K°!´(¸1´+Ñ$=Ñ>Ô>Ñ?Ô?ˆØˆZ˜‰^Œ^ˆØ�Š˜r 2¤<Ñ0Ô0ˆØ×ÒÑÔÐÝÐ/Ð/Ð/Ð/Ð/Ñ0Ô0ˆÝ (ð 	zñ 	zÑˆF�E˜1Ø—
’
˜1 E°&À�
ÑGÔGˆAØ�;˜q !¥S¨¤VÑ,Ô,‰DˆAˆqØ—’  1¨e�Ñ4Ô4ˆAÝÐ<Ð<Ð<Ð<Ð<Ð<Ñ=Ô=ˆEÝÐSÐSÐSÐSÐSÐSÐUVÑWÔWˆEØ�˜A‘”ˆBØ—’  B¤LÑ1Ô1ˆBØ�NŠNÑÔÐÝ $ T¨1¨dÑ 3Ô 3ÑˆG�XÝ" 1 d¨DÑ1Ô1‰OˆF�GÝ" 2 q¨$Ñ/Ô/‰OˆF�GÝð Eð Eð E˜4˜4ð E¨¨ð E¸%¸%ð EÀqÄyÀyð EÐTUÐTUð EÕ[^Ð_`Ô[aÐ[að EÕilÐmnÔmtÑiuÔiuÐiuð Eõ  ~Að  BDñ  ~Eô  ~Eð  ~Eð EØœh˜hðEØ-1¨TðEØ<C¸GðEØLQÈEðEØchÐchðEå"% a¡&¤& &ðEå47¸±F´F°FðEåLOÐPRÔP[ÑL\ÔL\ÐL\ðEð "#¤¨B¬IÑ!5Ð!5ðEð CDÄ/À/ðEð ,3¨7ð	Eð JRÈð	Eð
 ,2¨6ðEð
 IPÈðEð &, VðEð =D¸GðEˆCð �KŠK˜ÑÔÐÝÐ[Ð[ÈsÏyÊyÉ{Ì{Ð[Ñ[Ô[ÐcgÐhÑhÔhÐhØ˜˜qÐ! _Ò4Ð4¸Å¸¸Ý”�Ð3¨Ð3Ð3Ð3Ñ3°q¸AÀ"ÍÌÐTUÔT[ÑI\ÔI\ÐacÔamÐtxÐyÑyÔyÐyùñ-	zõ. ‡I‚I�t€IÑÔÐØ‡L‚L�ÑÔ×Ò�c JÑ.°eÐÑ<Ô<Ð<Ýˆ9�_× Ò Ø2•‘”Ð2Ð2�cÐ2Ð2¥c­#¡h¤hÐ2Ð2Ð2ñ4ô 4ð 4ð 4ð 4r*   c                  óÖ   — t          d¦  «        D ]G} |                      d¦  «        r0|                      dd¦  «        d                              ¦   «         c S ŒHt	          j        ¦   «         S )Nz/proc/cpuinfoz
model nameú:rA   )ÚopenÚ
startswithÚsplitÚstripÚplatformÚ	processor)Úlines    r(   rG   rG   k   sl   € Ý�_Ñ%Ô%ð 1ð 1ˆØ�?Š?˜<Ñ(Ô(ð 	1Ø—:’:˜c 1Ñ%Ô% aÔ(×.Ò.Ñ0Ô0Ð0Ð0Ð0ð	1åÔÑÔÐr*   c                 óˆ   — t          j        ddt          | ¦  «        dddgdd¬¦  «        }|j                             ¦   «         S )Nrœ   z-CÚdescribez--alwaysz--dirtyT)Úcapture_outputÚtext)Ú
subprocessr°   ÚstrÚstdoutr¶   )ÚpÚrs     r(   rœ   rœ   r   s?   € ÝŒ˜˜t¥S¨¡V¤V¨Z¸ÀYÐOÐ`dÐkoÐpÑpÔp€AØŒ8�>Š>ÑÔÐr*   c                  ó
  — dd l } |                      d¦  «         dd lm} dd l}ddlm} t          j        g d¢¦  «        t          j	         
                    g d¢¦  «        z  }|                     d¦  «        }|                     dt          t          ¦  «        z  df¬¦  «        }t          t          ¦  «        D �]¡\  }}t          j        t"          d	|› d
�z  ¦  «        }	|	d         |	d         |	d         |	d         t%          |	d         ¦  «        f\  }
}}}}|                     ||	d         ¦  «        }|                     ¦   «          |                     ||d¬¦  «        }|                     |
|d¬¦  «        }|j                             ||j        ¦  «        \  }}}|                     d¦  «        |                     d¦  «        }}||z   dz  ||z
                       ¦   «         dz  }}t5          d¦  «        D �]b}|                     dt          t          ¦  «        |t          t          ¦  «        z  |z   dz   d¬¦  «        }|dk    rÌddt          j        |j        |z  dd¦  «        z  z   }|                      ||j        t          j         |dz  |dz  |dz  t          j!        |¦  «        f         d¬¦  «        ¦  «         |                      ||j        ddd¬ ¦  «        ¦  «         | "                    | #                    d!d"¦  «        d#¬$¦  «         n�d%d&t          j        |j        |z  dd¦  «        z  z   } |t          j        d'|z  |z  tH          z  dd¦  «        ¦  «        d d …d d(…f         |d d …d f         z  }|                      ||j        |d¬¦  «        ¦  «         | %                    |d         |z
  |d         |z   ¦  «         | &                    |d         |z
  |d         |z   ¦  «         | '                    |d         |z
  |d         |z   ¦  «         | (                    d)¦  «         | )                    d*d+¦  «         | *                    ¦   «          �Œd�Œ£|j+         ,                    || -                    dtH          ¦  «        ¬,¦  «        }| .                    ||j/        d-d.d/d0¬1¦  «        }| 0                    d2¦  «         | 1                    ddd3d4dd¬5¦  «         | 2                    tf          d6z  d7d8¬9¦  «         d S ):Nr   ÚAgg)ÚPoly3DCollection)g333333Ó?g      à¿gš™™™™™é?Úviridisrj   gÍÌÌÌÌÌ @)Úfigsizerr   rs   rt   ru   rE   rv   r8   rw   FrK   é   rA   Ú3d)Ú
projectiongÍÌÌÌÌÌÜ?r   g…ëQ¸…ë?g)\�Âõ(ì?Únone)Ú
facecolorsÚ
edgecolors)çffffffî?çš™™™™™á?g333333Ã?gš™™™™™¹?)g333333ë?gffffffÖ?gš™™™™™©?rÏ   g      Ð?)rÌ   rÍ   Ú
linewidthsr&   ú é   )Úfontsizeg333333ã?gš™™™™™Ù?r.   é   )rA   rA   rA   é   iÄÿÿÿ)Úcmapr‡   Ú
horizontalgš™™™™™™?g{®Gáz”?é<   )ÚaxÚorientationÚfractionÚpadÚaspectzPdistance from the descriptor's hull to the source mesh's hull, % of the diagonalrÎ   g{®Gáz´?)ÚleftÚrightÚtopÚbottomÚwspaceÚhspacezfig_renders.pngén   Úwhite)ÚdpiÚ	facecolor)4Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotr/   Úmpl_toolkits.mplot3d.art3drÅ   r!   Úarrayr†   r‡   Úget_cmapÚfigurer�   r”   Ú	enumeraterƒ   r–   r    r‰   r‹   r2   r3   Útriangles_centerÚminr4   r   Úadd_subplotÚclipÚface_normalsÚadd_collection3dÚ	trianglesÚc_Ú	ones_likeÚ	set_titleÚreplaceÚSCALEÚset_xlimÚset_ylimÚset_zlimÚset_box_aspectÚ	view_initÚset_axis_offÚcmÚScalarMappableÚ	NormalizeÚcolorbarÚaxesÚ	set_labelÚsubplots_adjustÚsavefigÚSECTION)rè   Úpltr/   rÅ   ÚlightrÖ   ÚfigÚirŸ   Úzrt   ru   rE   rv   r8   r¢   Úsrcr¤   r&   ÚdistÚloÚhiÚcrÂ   r¯   rÙ   ÚshÚcolÚsmÚcbs                                 r(   Úrenderr  w   s*  € ØÐÐÐà‡N‚N�5ÑÔÐØ#Ð#Ð#Ð#Ð#Ð#Ø€N€N€NØ;Ð;Ð;Ð;Ð;Ð;åŒHÐ%Ð%Ð%Ñ&Ô&­¬¯ªÐ8HÐ8HÐ8HÑ)IÔ)IÑI€EØ�<Š<˜	Ñ"Ô"€DØ
�*Š*˜a¥#¥f¡+¤+™o¨sÐ3ˆ*Ñ
4Ô
4€CÝ�VÑ$Ô$ð ñ ‰ˆˆ4ÝŒG•CÐ. DÐ.Ð.Ð.Ñ.Ñ/Ô/ˆØ˜sœV Q s¤V¨Q¨t¬W°a¸´g½uÀQÀvÄYÑ?OÔ?OÐOÑˆˆ1ˆb�"�dØ�Š˜r 1 T¤7Ñ+Ô+ˆØ×ÒÑÔÐØ�oŠo˜b "¨eˆoÑ4Ô4ˆØ�OŠO˜A˜q¨%ˆOÑ0Ô0ˆØÔ&×4Ò4°T¸1Ô;MÑNÔN‰
ˆˆ4�Ø—’˜‘”˜BŸFšF 1™IœIˆBˆØ�R‘˜1‰}˜r B™wŸmšm™oœo°Ñ1ˆ1ˆÝ˜‘8”8ð 	ñ 	ˆCØ—’ ¥C­¡K¤K°µs½6±{´{Ñ1BÀQÑ1FÈÑ1JÐW[�Ñ\Ô\ˆBØ�aŠxˆxØ˜C¥"¤'¨#Ô*:¸UÑ*BÀAÀqÑ"IÔ"IÑIÑI�Ø×#Ò#Ð$4Ð$4°S´]ÍrÌuÐUWÐZ]ÑU]Ð_aÐdgÑ_gÐikÐnqÑiqÕsuÔsð  ACñ  tDô  tDð  VDô  PEØ@Fð%Hñ %Hô %Hñ Iô Ið Ià×#Ò#Ð$4Ð$4°Q´[ÐMeØ@XÐeið%kñ %kô %kñ lô lð là—’˜TŸ\š\¨#¨sÑ3Ô3¸b�ÑAÔAÐAÐAà˜3¥¤¨¬¸%Ñ)?ÀÀAÑ!FÔ!FÑFÑF�Ø�d�2œ7 3¨¡:°Ñ#4µuÑ#<¸aÀÑCÔCÑDÔDÀQÀQÀQÈÈÈÀUÔKÈbÐQRÐQRÐQRÐTXÐQXÌkÑY�Ø×#Ò#Ð$4Ð$4°Q´[ÈSÐ]cÐ$dÑ$dÔ$dÑeÔeÐeØ�KŠK˜˜!œ˜q™ ! A¤$¨¡(Ñ+Ô+Ð+Ø�KŠK˜˜!œ˜q™ ! A¤$¨¡(Ñ+Ô+Ð+Ø�KŠK˜˜!œ˜q™ ! A¤$¨¡(Ñ+Ô+Ð+Ø×Ò˜iÑ(Ô(Ð(Ø�LŠL˜˜SÑ!Ô!Ð!Ø�OŠOÑÔÐÑñ%	ð& 
Œ×	Ò	 D¨s¯}ª}¸QÅÑ/FÔ/FÐ	Ñ	GÔ	G€BØ	�Š�b˜SœX°<È%ÐUYÐbdˆÑ	eÔ	e€BØ‡L‚LÐcÑdÔdÐdØ×Ò˜Q a¨T¸$ÀqÐQRÐÑSÔSÐSØ‡K‚K•Ð+Ñ+°À€KÑHÔHÐHÐHÐHr*   c                  ó”  — dd l } t                               dd¬¦  «         t          ¦   «          |                      t
          dz  ¦  «        }d|vr)d„ t          t          |¦  «        ¦  «        D ¦   «         |d<   |j        |j	        z  |d<   |j	        |j        k     |d<   | 
                    g d	¢d
¬¦  «                             ddddddddddddd¬¦  «                             ¦   «         }|                     t          dz  d
¬¦  «         |                     t          dz  d
¬¦  «         t          |                     ¦   «         ¦  «         d S )Nr   T)Úparentsrx   ry   rV   c                 ó^   — g | ]*}t           |t          t           ¦  «        z           d          ‘Œ+S )rA   )rŒ   r�   )rm   r  s     r(   ú
<listcomp>zmake.<locals>.<listcomp>­   s-   € ÐRÐRÐR¸a�8 A­­H©¬Ñ$5Ô6°qÔ9ÐRÐRÐRr*   ÚspeedupÚfaster©rI   rV   rO   F©Úsort)r[   r"   )r\   r"   )r]   r"   )r  rò   )r  r"   )ra   rò   )ra   r"   )rc   r4   )rd   r5   )re   r4   )rg   r4   )r   Úsum)rb   Úall)r[   r\   r]   Úspeedup_minÚspeedup_medÚvol_minÚvol_medrc   rd   re   rg   r   rb   zdata.csvrz   úhull_objects.csv)r~   r  r—   r  Úread_csvr–   r   r�   r[   r\   ÚgroupbyÚaggÚreset_indexr™   r“   Ú	to_string)r�   Údfr-  s      r(   Úmaker1  ¦   sU  € ØÐÐÐå‡M‚M˜$¨€MÑ.Ô.Ð.Ý
�H„H€HØ	�Š•S˜:Ñ%Ñ	&Ô	&€BØ˜"ÐÐØRÐRÅ5ÍÈRÉÌÁ>Ä>ÐRÑRÔRˆˆ;‰Ø”K "¤)Ñ+€B€y�MØ”9˜rœ{Ò*€B€x�LØ
�*Š*Ð1Ð1Ð1¸ˆ*Ñ
>Ô
>×
BÒ
BØ'Ð0DÐVsØ&Ð4IØ$Ð.EØ:ÐQqØ:ÐJbØ Ð-Bð Cñ Dô D÷ EPÂKÁMÄMð ð ‡J‚J�w˜Ñ#¨5€JÑ1Ô1Ð1Ø‡I‚I�gÐ*Ñ*°%€IÑ8Ô8Ð8Ý	ˆ#�-Š-‰/Œ/ÑÔÐÐÐr*   c            
      óì  ‡ ‡!‡"— ddl } ddl}ddl}|                     t          dz  ¦  «        Š t          d„ t          dz                       ¦   «                              ¦   «         D ¦   «         ¦  «        }i }t          dz                       ¦   «                              ¦   «         D ]€}|  	                    d|¦  «        D ]g\  }}}}	| 
                    t          |¦  «        t          |¦  «        t          |¦  «        fg ¦  «                             t          |	¦  «        ¦  «         ŒhŒ�dLd	„Š"g }
‰                      g d
¢d¬¦  «        D �]u\  \  }}}}||||f         }	|
                     d                     g d‘|› ‘d‘|› ‘d‘|› ‘d‘ ‰"|j                             ¦   «         d¦  «        › ‘d‘ ‰"|j                             ¦   «         d¦  «        › ‘d‘ ‰"|j                             ¦   «         d¦  «        › ‘d‘t          |j        |j        k                          ¦   «         ¦  «        › ‘d‘t)          |¦  «        › ‘d‘ ‰"|j        |j        z                       ¦   «         ¦  «        › ‘d‘ ‰"|j        |j        z                       ¦   «         ¦  «        › ‘d‘ ‰"|j        |j        z                       ¦   «         ¦  «        › ‘d‘ ‰"|j                             ¦   «         d¦  «        › ‘d‘ ‰"|j                             ¦   «         d¦  «        › ‘d‘ ‰"|j                             ¦   «         d¦  «        › ‘d‘ ‰"|j                             ¦   «         ¦  «        › ‘d‘ ‰"|j                             ¦   «         ¦  «        › ‘d‘t'          d„ |	D ¦   «         ¦  «        › ‘d‘t)          |	¦  «        › ‘d‘¦  «        ¦  «         �Œw‰ ‰ j        dk    ‰ j        dk    z  ‰ j        dk    z           }‰ ‰ j        dk    ‰ j        dk    z           }||j        |j        k              j        j          !                    dd¦  «         "                    ¦   «         }|                     t          dz  ¦  «         #                    d¦  «        Š!| $                    t          dz  t          dz  ¦  «         ‰                      g d
¢¦  «        j                             ¦   «         }|d         |d          z  |d!         |d          z  }}|j%        |j         &                    ¦   «         df          !                    dd¦  «        }tO          j(        t          d"z  ¦  «        }d#tS          |d$         dd…df                              ¦   «         |d%         dd…df                              ¦   «         z
  ¦  «        z  tU          |d&         ¦  «        z  }|j        |j        z  }ˆ fd'„} |d(d¦  «         |d(d¦  «         |d)d¦  «         |d)d¦  «        f\  }}}}d                     ˆ!ˆ"fd*„| +                    ¦   «         D ¦   «         ¦  «        }d                     g d+‘|d,         › ‘d-‘d                     |
¦  «        › ‘d.‘ ‰"|j                             ¦   «         d¦  «        › ‘d‘ ‰"|j                             ¦   «         d¦  «        › ‘d/‘ ‰"|j                             ¦   «         d¦  «        › ‘d‘ ‰"|j                             ¦   «         d¦  «        › ‘d0‘t)          |¦  «        › ‘d1‘d2                     |¦  «        › ‘d3‘ ‰"|j        |j        z                       ¦   «         ¦  «        › ‘d4‘ ‰"|j                             ¦   «         d¦  «        › ‘d‘ ‰"|j                             ¦   «         d¦  «        › ‘d5‘ ‰"|                     ¦   «         d¦  «        › ‘d‘ ‰"|                     ¦   «         d¦  «        › ‘d6‘ ‰"|d¦  «        › ‘d7‘ ‰"|d¦  «        › ‘d8‘ ‰"|j                             ¦   «         d¦  «        › ‘d‘ ‰"|j                             ¦   «         d¦  «        › ‘d9‘ ‰"|j                             ¦   «         d¦  «        › ‘d‘ ‰"|j                             ¦   «         d¦  «        › ‘d:‘ ‰"|j                             ¦   «         ¦  «        › ‘d;‘|› ‘d<‘ ‰"‰!j,                             ¦   «         d¦  «        › ‘d‘ ‰"‰!j,                             ¦   «         d¦  «        › ‘d=‘ ‰"‰!j-                             ¦   «         ¦  «        › ‘d>‘ ‰"‰!j.                             ¦   «         d¦  «        › ‘d‘ ‰"‰!j.                             ¦   «         d¦  «        › ‘d?‘ ‰"‰!j/                             ¦   «         ¦  «        › ‘d‘ ‰"‰!j/                             ¦   «         ¦  «        › ‘d@‘ ‰"|¦  «        › ‘dA‘ ‰"|¦  «        › ‘dB‘ ‰"|¦  «        › ‘dA‘ ‰"|¦  «        › ‘dC‘ ‰"‰!j-        d(         ¦  «        › ‘d2‘ ‰"‰!j-        d)         ¦  «        › ‘dD‘ ‰"|¦  «        › ‘dE‘ ‰"|j                             ¦   «         ¦  «        › ‘dF‘|j%        |j         &                    ¦   «         df         › ‘dG‘|› ‘dH‘¦  «        }t          dIz   0                    |¦  «         t          dJz   0                    dK¦  «         | $                    t          dz  t          dz  ¦  «         dS )MzFsections/hull/section.html from out/hull.csv and out/closed_check.txt.r   Nr*  c              3   óB   K  — | ]}|                      d d¦  «        V — ŒdS )z: rA   N)rµ   )rm   r¹   s     r(   ú	<genexpr>zsection.<locals>.<genexpr>Å   s0   è è € ÐZÐZ tˆt�zŠz˜$ Ñ"Ô"ÐZÐZÐZÐZÐZÐZr*   r|   zclosed_check.txtz+(\d+)/(\d+)/(\d+): open 0 over-shared (\d+)rÈ   c                 ó   — | d|› d�›S )Nú.r#   rD   )ro   r$   s     r(   rF   zsection.<locals>.<lambda>Ê   s   € ˜!�|˜a�|�|�|�|€ r*   r!  Fr"  Ú z<tr><td>ú	</td><td>rA   z / z (u   â€“z
)</td><td>rÔ   c              3   ó"   K  — | ]
}|d k    V — ŒdS )r   NrD   )rm   Úxs     r(   r4  zsection.<locals>.<genexpr>Ô   s&   è è € ÐATÐATÈQÀ!ÀqÂ&ÐATÐATÐATÐATÐATÐATr*   ú
</td></tr>r   r   r   r&   rÑ   zdecoded_gap.csvrU   r   r   r   zrender_mug.npzr.   rt   rE   r8   c                 óŽ   •— ‰‰j         | k    ‰j        dk    z  ‰j        dk    z  ‰j        |k    z           j        j        d         S )Nr   r   r   )rU   rI   rV   rO   rc   Úiloc)ÚorO   r0  s     €r(   rF   zsection.<locals>.<lambda>à   sE   ø€ �b˜"œ& Aš+¨"¬)°sÒ*:Ñ;¸r¼|ÈtÒ?SÑTÐXZÔX\Ð`aÒXaÑbÔcÔwÔ|Ð}~Ô€ r*   r   r   c               3   ó  •K  — | �]}d |j                              dd¦  «        › d|j        › d|j        › d ‰|j        d¦  «        › d ‰|j        d¦  «        › d ‰|j        d¦  «        › d|j        › d|j        › d ‰|j	        d¦  «        › d ‰|j
        d¦  «        › d ‰|j        ¦  «        › d ‰‰j        |j                  d¦  «        › d ‰‰j        |j                  ¦  «        › d ‰‰j        |j                  d¦  «        › d�V — �ŒdS )	z <tr><td style='text-align:left'>r&   rÑ   r8  rA   r   rÔ   r;  N)rU   rû   rY   rH   r\   r[   r]   r^   r`   ra   rd   rc   Údec_meanÚdec_maxÚfcp_to_dec_mean)rm   rÂ   Údgr#   s     €€r(   r4  zsection.<locals>.<genexpr>â   sØ  øè è € ð Yñ Yð
 BCð		}¨1¬5¯=ª=¸¸cÑ+BÔ+Bð 	}ð 	}ÈQÌWð 	}ð 	}Ð_`Ô_fð 	}ð 	}Øˆq�”˜1‰~Œ~ð	}ð 	}Ø()¨¨!¬*°aÑ(8Ô(8ð	}ð 	}ØCDÀ1ÀQÔEVÐXYÑCZÔCZð	}ð 	}àŒ|ð	}ð 	}à&'Ô&7ð	}ð 	}àBCÀ!ÀAÄKÐQRÑBSÔBSð	}ð 	}ð ˆq�Ô'¨Ñ+Ô+ð	}ð 	}ð 78°a¸Ô8MÑ6NÔ6Nð	}ð 	}ð ˆq�”˜QœUÔ# QÑ'Ô'ð		}ð 	}ð 34°!°B´J¸q¼uÔ4EÑ2FÔ2Fð		}ð 	}ð RSÐQRÐSUÔSeÐfgÔfkÔSlÐnoÑQpÔQpð		}ð 	}ð 	}ðYð Yð Yñ Yð Yð Yr*   an  <h2>Convex hull straight from the descriptor</h2>
<p>Package v5.31 (commit db3e6ceb; the working tree only raises <code>MAX_ATOMS</code> to 12288; defaults: <code>parts="tracked-fit"</code>, <code>interp="poly"</code>), the 12 objects
of the collision section, encoded at 128 layers (1024 or 6144 atoms) and at 256 layers (6144 atoms). The hull is built from the
descriptor without a decode grid, a mesh or qhull: the solid rings are evaluated from the Fourier and Chebyshev
coefficients (holes are inside the solid and never touch the hull), each part's end rings are held to the part's
outer edges, and per level (a layer centre or a part edge) one numba kernel takes the 2D hull of the ring samples and
its support point in M directions. In each direction a hull vertex must lie on the upper concave envelope of
(height, support) over the levels; neighbouring directions' envelopes are joined by height and the end levels capped,
which gives a closed triangle surface in O(levels &times; M). Reference: scipy's qhull on the source mesh's vertices,
and the route through the decoded mesh (<code>fcp.decode</code>, then qhull). CPU: rG   u¨  , one thread for both
(median of 21 runs; the decode route of 7). Distances in % of the source mesh's diagonal, from 20k points on the
source mesh's hull to the descriptor's hull; volume relative to the source mesh's hull.</p>
<div class="tablewrap"><table>
<thead><tr><th>layers</th><th>atoms</th><th>directions M</th><th>FCP hull, ms (median)</th><th>qhull on the mesh, ms (median)</th>
<th>decode + qhull, ms (median)</th><th>FCP faster than qhull</th><th>speed-up, median (minâ€“max)</th>
<th>volume / true hull, median (min)</th><th>gap, mean % diag</th><th>gap, max % diag</th>
<th>non-convex dent, max % diag</th><th>hulls with no over-shared edge</th></tr></thead>
<tbody>z\</tbody></table></div>
<p><b>Time:</b> at 128 layers and M = 64 the descriptor's hull takes z ms, against
uK    ms for qhull on these meshes (2.3kâ€“38k vertices): about even, faster on
z of 12 (z, z), at most zA&times;. The gain is in not having the mesh:
the decode route is z ms, a’  &times; slower. qhull's cost grows with the
hull it outputs, and the descriptor's hull has more vertices than the mesh's (the rings are dense where the mesh is
coarse), so a large source mesh is where the descriptor wins outright (a 222k-vertex dress outside this set: 3.5 ms
against 39 ms); the knot and spring, with many parts per level, are the slowest descriptor hulls. M = 128 and 256 layers
cost z&times; and z;&times; the time (medians). <b>Accuracy:</b> the volume is z. of the true hull at 128 layers,
the mean gap z  % of the diagonal, the largest
z % (zv). Nearly all of it is the encoding, not the hull: the decoded mesh's hull (qhull) is as far
from the true hull (mean z %, max up to z0 %), and the descriptor's hull is within a mean
z % of it (max zh %, the spring and knot at the top: 64
directions are too few there; M = 128 lowers their max gap, knot z &rarr; z %, spring z % (decoded mesh's hull: z‡ %)). A flat top or bottom also moves: a part ends at a layer
edge, so a cap sits up to half a layer from the true one (the mug's top: zâ % of the diagonal). 256 layers lower the gap
only where the layers were the limit (horse, mug ace, spring); elsewhere it is the rings' own error. <b>Defects:</b> the surface is convex only up to the M directions (dents up to
z% % of the diagonal at M = 64, on the uš  ); and where one pair of support points lies on the envelopes of two
non-neighbouring directions, the bands on both sides use that edge: no open edge on any of the 48 hulls, but 0â€“11
edges shared by four triangles (a fold, not a hole; the volume is unaffected). A final qhull over the descriptor
hull's own vertices would remove both (1â€“6 ms on 500â€“2400 such vertices in the first trials), giving up most of the gain. Prototype, not in the package.</p>
<div class="tablewrap"><table>
<thead><tr><th style='text-align:left'>object (128 layers, 6144 atoms, M = 64)</th><th>mesh vertices</th><th>atoms held</th><th>FCP hull, ms</th>
<th>qhull, ms</th><th>decode + qhull, ms</th><th>FCP hull vertices</th><th>true hull vertices</th><th>volume / true</th>
<th>gap, mean %</th><th>gap, max %</th><th>decoded mesh's hull: gap, mean %</th><th>its gap, max %</th>
<th>FCP hull to decoded hull, mean %</th></tr></thead><tbody>u  </tbody></table></div>
<figure><img src="sections/hull/fig_renders.png" alt="Six objects: the source mesh inside the descriptor's hull (top) and the descriptor's hull coloured by its distance to the mesh's hull (bottom)">
<figcaption>Top: the source mesh (grey) inside the hull built from the descriptor (orange edges). Bottom: the descriptor's hull,
each triangle coloured by the distance of its centre to the source mesh's hull (0â€“0.5 % of the diagonal); 128 layers,
6144 atoms, M = 64. The brightest triangles are the flat tops (caps) of the mug and the dog bowl: long fans whose centres lie
below the true rim.</figcaption></figure>
zsection.htmlz
README.txta´  Produced by ~/code/data/meshes/fcp_3010_hull/scripts/hull.py (the hull: scripts/fcp_hull.py):
  cd ~/code/data/meshes/fcp_3010_hull && env -u PYTHONPATH ~/code/fcp_devel/.venv/bin/python scripts/hull.py run
  ... scripts/closed_check.py > out/closed_check.txt && ... scripts/hull.py make && ... scripts/hull.py section
data.csv: the first table (per setting); hull_objects.csv: per object and setting; closed_check.txt: edges per hull.
)rÈ   )1ÚreÚshutilr~   r+  r  rŽ   r–   Ú	read_textÚ
splitlinesÚfindallÚ
setdefaultÚintr   r,  Újoinr\   r"   r[   r]   r$  r�   rò   r4   ra   rd   r5   rc   rg   rI   rV   rO   rU   r¿   rû   ÚtolistÚ	set_indexÚcopyÚlocÚidxmaxr!   rƒ   Úabsr    Ú
itertuplesr@  rA  rB  Úfcp_to_dec_maxrš   )#rD  rE  r�   ÚenvÚoverr¹   ÚlÚaÚmmr>  rž   rI   rH   rO   ÚgÚmainÚg64ÚfastÚmedÚt128Út256ÚworstÚzmÚcap_mugÚ	dec_ratioÚgmÚk64Úk128Ús64Ús128ÚorowsÚhtmlr0  rC  r#   s#                                   @@@r(   Úsectionrk  ½   sÜ  øøø€ à€I€I€IØ€M€M€MàÐÐÐà	�Š•WÐ1Ñ1Ñ	2Ô	2€BÝ
ÐZÐZµ°i±×/JÒ/JÑ/LÔ/L×/WÒ/WÑ/YÔ/YÐZÑZÔZÑ
ZÔ
Z€CØ€DÝÐ)Ñ)×4Ò4Ñ6Ô6×AÒAÑCÔCð Jð JˆØŸ:š:Ð&TÐVZÑ[Ô[ð 	Jð 	J‰KˆAˆq�"�aØ�OŠO�S ™VœV¥S¨¡V¤V­S°©W¬WÐ5°rÑ:Ô:×AÒAÅ#ÀaÁ&Ä&ÑIÔIÐIÐIð	Jà#Ð#Ð#€AØ€DØ!#§¢Ð,HÐ,HÐ,HÈu Ñ!UÔ!Uð mñ mÑÑˆ�˜˜AØ�&˜% Ð#Ô$ˆØ�Šð l÷ lò lð lð lð l˜vð lð lð lð l°ð lð lð lð lÀð lð lð lð lÈAÈAÈaÌhÏoÊoÑN_ÔN_ÐabÑLcÔLcð lð lð lð lØ˜1˜QœZ×.Ò.Ñ0Ô0°!Ñ4Ô4ðlð lð lð lØ?@¸qÀÔAR×AYÒAYÑA[ÔA[Ð]^Ñ?_Ô?_ðlð lð lð lå ¤¨1¬:Ò 5×:Ò:Ñ<Ô<Ñ=Ô=ðlð lð lð låBEÀaÁ&Ä&ðlð lð lð lð ˜1˜aœj¨1¬8Ñ3×;Ò;Ñ=Ô=Ñ>Ô>ðlð lð lð lð CDÀ!ÀQÄZÐRSÔRZÑEZ×D_ÒD_ÑDaÔDaÑBbÔBbðlð lð lð lð hiÐghÐjkÔjtÐwxÔwÑj÷  jEò  jEñ  jGô  jGñ  hHô  hHðlð lð lð lð ˜1˜Qœ[×/Ò/Ñ1Ô1°1Ñ5Ô5ð	lð lð lð lð :;¸¸1¼;¿?º?Ñ;LÔ;LÈaÑ9PÔ9Pð	lð lð lð lð
 ˜1˜QÔ3×8Ò8Ñ:Ô:¸AÑ>Ô>ðlð lð lð lð
 JKÈÈ1ÔK`×KdÒKdÑKfÔKfÑIgÔIgðlð lð lð lð ˜1˜Qœ_×0Ò0Ñ2Ô2Ñ3Ô3ðlð lð lð lõ ?BÐATÐATÐRSÐATÑATÔATÑ>TÔ>Tðlð lð lð lõ Z]Ð]^ÑY_ÔY_ðlð lð lð lñ lô lñ 	mô 	mð 	mñ 	mð ˆrŒy˜CÒ B¤L°DÒ$8Ñ9¸R¼TÀRºZÑHÔI€DØ
ˆbŒi˜3Ò 2¤4¨2¢:Ñ.Ô
/€CØ�”˜dœmÒ+Ô,Ô0Ô4×<Ò<¸SÀ#ÑFÔF×MÒMÑOÔO€DØ	�Š•SÐ,Ñ,Ñ	-Ô	-×	7Ò	7¸Ñ	>Ô	>€BØ
‡K‚K•Ð'Ñ'­Ð3DÑ)DÑEÔEÐEØ
�*Š*Ð1Ð1Ð1Ñ
2Ô
2Ô
9×
@Ò
@Ñ
BÔ
B€CØÐ%Ô&¨¨_Ô)=Ñ=¸sÐCSÔ?TÐWZÐ[jÔWkÑ?kˆ$€DØŒH�TÔ-×4Ò4Ñ6Ô6¸Ð=Ô>×FÒFÀsÈCÑPÔP€EÝ	Œ•Ð'Ñ'Ñ	(Ô	(€BØ•C˜˜3œ    1 œ×)Ò)Ñ+Ô+¨b°¬h°q°q°q¸!°t¬n×.@Ò.@Ñ.BÔ.BÑBÑCÔCÑCÅeÈBÈvÌJÑFWÔFWÑW€GØÔ$ t¤{Ñ2€IØ	Ð	Ð	Ð	€BØ˜2˜f b™>œ>¨2¨2¨f°c©?¬?¸B¸B¸xÈÑ<LÔ<LÈbÈbÐQYÐ[^ÑN_ÔN_Ð_Ñ€Cˆˆs�DØ�GŠGð Yð Yð Yð Yð Yð
 GK÷  GVò  GVñ  GXô  GXðYñ Yô Yñ Yô Y€Eð.÷ .ò .ð .ð .ð .ð UXÐX]ÔT^ð.ð .ð .ð .ð" 	�Š�‰Œð#.ð .ð .ð .ð$ GHÀaÈÌ
ÏÊÑHXÔHXÐZ[ÑF\ÔF\ð%.ð .ð .ð .ð$ bcÐabÐcfÔcm×cqÒcqÑcsÔcsÐuvÑawÔawð%.ð .ð .ð .ð& €€4„=×ÒÑÔ˜ÑÔð'.ð .ð .ð .ð&  !˜q ¤×!2Ò!2Ñ!4Ô!4°aÑ8Ô8ð'.ð .ð .ð .õ( €T�„ð).ð .ð .ð .ð( —I’I˜d‘O”Oð).ð .ð .ð .ð( 12°°4´=À4Ä;Ñ3N×2SÒ2SÑ2UÔ2UÑ0VÔ0Vð).ð .ð .ð .ð* �Q�tÔ+×/Ò/Ñ1Ô1°1Ñ5Ô5ð+.ð .ð .ð .ð* ;<¸!¸DÔ<P×<TÒ<TÑ<VÔ<VÐXYÑ:ZÔ:Zð+.ð .ð .ð .ð* bcÐabÐcl×cpÒcpÑcrÔcrÐtuÑavÔavð+.ð .ð .ð .ð* |}Ð{|ð  ~G÷  ~Kò  ~Kñ  ~Mô  ~Mð  OPñ  |Qô  |Qð+.ð .ð .ð .ð2 €aˆˆa�j„jð3.ð .ð .ð .ð2  ˜a  a™jœjð3.ð .ð .ð .ð2 fgÐefÐgkÔgu×gyÒgyÑg{Ôg{Ð}~ÑeÔeð3.ð .ð .ð .ð2 EFð  EFð  GKô  GU÷  GYò  GYñ  G[ô  G[ð  ]^ñ  E_ô  E_ð3.ð .ð .ð .ð4 ˆa�Ô)×-Ò-Ñ/Ô/°Ñ3Ô3ð5.ð .ð .ð .ð4 9:¸¸$Ô:S×:WÒ:WÑ:YÔ:YÐ[\Ñ8]Ô8]ð5.ð .ð .ð .ð6 €€4Ô×ÒÑ!Ô!Ñ"Ô"ð7.ð .ð .ð .ð6 ).ð7.ð .ð .ð .ð8 ˜!˜BœKŸOšOÑ-Ô-¨qÑ1Ô1ð9.ð .ð .ð .ð8 78°a¸¼¿ºÑ8IÔ8IÈ1Ñ6MÔ6Mð9.ð .ð .ð .ð8 ^_Ð]^Ð_aÔ_i×_mÒ_mÑ_oÔ_oÑ]pÔ]pð9.ð .ð .ð .ð: €€2Ô×ÒÑÔ˜QÑÔð;.ð .ð .ð .ð: %& A bÔ&8×&<Ò&<Ñ&>Ô&>ÀÑ$BÔ$Bð;.ð .ð .ð .ð: STÐRSÐTVÔTe×TiÒTiÑTkÔTkÑRlÔRlð;.ð .ð .ð .ð: rsÐqrÐsuô  tE÷  tIò  tIñ  tKô  tKñ  rLô  rLð;.ð .ð .ð .ð< CDÀ!ÀCÁ&Ä&ð=.ð .ð .ð .ð< STÐRSÐTXÑRYÔRYð=.ð .ð .ð .ð< ghÐfgÐhkÑflÔflð=.ð .ð .ð .ð< wxÐvwÐx|Ñv}Ôv}ð=.ð .ð .ð .ð< YZð  YZð  []ô  [eð  flô  [mñ  Ynô  Ynð=.ð .ð .ð .ð< rsð  rsð  tvô  t~ð  Gô  tHñ  rIô  rIð=.ð .ð .ð .ð> KLÈ!ÈGÉ*Ì*ð?.ð .ð .ð .ðB €€4Ô×ÒÑÔÑÔðC.ð .ð .ð .ðB DHÄ8ÈDÔL^×LeÒLeÑLgÔLgÐinÐLnÔCoðC.ð .ð .ð .ðR ?DðS.ð .ð .ð .ñ .ô .€Dõ^ ˆ~Ñ×)Ò)¨$Ñ/Ô/Ð/Ýˆ|Ñ×'Ò'ð	AñBô Bð Bð
 ‡K‚K•Ð(Ñ(­'Ð4FÑ*FÑGÔGÐGÐGÐGr*   Ú__main__rA   )r°   r1  r  rk  )r   )r+   )(Ú__doc__Úosr·   r¾   Úsysr   Úpathlibr   Únumpyr!   ÚenvironÚgetÚhomer›   r    Úinsertr¿   Ú__file__ÚparentÚresolveÚROOTr–   r  ÚGÚCr�   rŒ   rN   r”   rü   r)   r;   r°   rG   rœ   r  r1  rk  Ú__name__ÚargvrD   r*   r(   ú<module>r~     s¹  ðð	ð 	ð 
€	€	€	Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð à Ð Ð Ð à
€dˆ2Œ:�>Š>˜) Y T¤Y¡[¤[Ð3GÑ%GÑHÔHÑIÔI€Ø „‡‚��3�3�s‘8”8Ñ Ô Ð Ø „‡‚��3�3�t�t˜H‘~”~Ô,Ñ-Ô-Ñ .Ô .Ð .Ø€tˆH�~„~×ÒÑÔÔ&Ô-€Ø
ˆU�l€Ø
ˆ$Œ)‰+Œ+ÐCÑ
C€Ø€D„I�K„KÐ6Ñ6€Ø€D„I�K„KÐ>Ñ>€ØÐAÑAÈaÐR}ÑN}ØÐBÑBØÐVÑVØÐ[Ñ[ØÐIÑIØÐHÑHÐTUÐXxÑTxØÐFÑFÐQRÐU}ÑQ}Ø˜Ñ%¨q°:©~ð?ð ?€ð RÐQÐQ€Ø�SÐÐ€Ø	=Ð	=Ð	=€Ø€ð%ð %ð %ð %ð7ð 7ð 7ð 7ð+4ð +4ð +4ð\ ð  ð  ðð ð ð
,Ið ,Ið ,Ið^ð ð ð.`Hð `Hð `HðF ˆzÒÐ˜cœh qœkÐ-QÐQÐQØQˆC˜¨¸GÐDÐDÀSÄXÈaÄ[ÔQÑSÔSÐSÐSÐSð ÐÐQÐQr*   