§
    »yñj  ã                  óh  — d Z ddlmZ ddlZddlZddlZddlZddlm	Z	  e	e
¦  «                             ¦   «         j        d         Zej                             d ee¦  «        ¦  «         ddlmZ dd	„Zdd„Zdd„Zddd„Zej        j        fdd„Zdefdd„Zedk    r e e¦   «         ¦  «        ‚dS )aË  Install BiRefNet-lite, the background remover every backend uses once it is present.

    python scripts/bootstrap_matte.py          # says what it will fetch, then asks
    python scripts/bootstrap_matte.py --yes    # non-interactive
    python scripts/bootstrap_matte.py --check  # exit 0 if installed, 1 if not

Without it, runs fall back to u2net, which ate a white robot's arms on a light backdrop, an
axe handle and a sword + shield in a side-by-side test (2026-09-28); BiRefNet-lite kept
all of them and matched full BiRefNet. One file, 181 MB, MIT licensed: BiRefNet-lite's own
weights exported with ONNX's built-in DeformConv layer, which needs about 4 GB of memory per
cut-out where rembg's copy of the same model needed 9.5 GB. Saved where rembg looks
(`~/.u2net`, or `$U2NET_HOME`) and checked against its SHA-256 before it is kept.

A machine that already has rembg's copy (224 MB) keeps working with it; `--check` reports it
as not installed, so Setup & Status offers the lighter file. Installing the lighter file
removes the older copy once the new one loads, and running this again removes a leftover one.

Nothing is fetched without an explicit yes: AGENTS.md forbids weight downloads the user
has not chosen.
é    )ÚannotationsN)ÚPathé   )ÚmatteÚreturnÚstrc                 ó  — dt           j        dz  d›dt           j        › dt          j        t           j        ¦  «        › �} t          j        t           j        ¦  «        }|                     ¦   «         r| dt           j        dz  d›d|› �z  } | S )Nz#Background remover: BiRefNet-lite (ç    €„.Aú.0fz MB, MIT)
  from   z

  to     z,
  then removes the older copy it replaces (z MB)
         )r   Ú
LEAN_BYTESÚLEAN_URLÚ
model_fileÚ
LEAN_MODELÚ
LITE_MODELÚis_fileÚ
LITE_BYTES)ÚtextÚolders     ú*G:\AssetFurnace\scripts\bootstrap_matte.pyÚannouncementr   %   s¨   € ð=µ%Ô2BÀSÑ2HÐYð =ð =Ýœð=ð =åÔ(­Ô)9Ñ:Ô:ð=ð =€Dõ Ô�UÔ-Ñ.Ô.€EØ‡}‚}�„ð (Øð 'ÅÔAQÐTWÑAWÐað 'ð 'Ø$ð'ð 'ñ 	(ˆà€Kó    ÚNonec                 ó|   — t          j        ¦   «         } | r&t          d| › dt           j        dz  d›d�¦  «         d S d S )Nz!  removed the older remover file z (r
   r   z MB))r   Úretire_older_copyÚprintr   )Úremoveds    r   r   r   0   sY   € ÝÔ%Ñ'Ô'€GØð _ÝÐ]°'Ð]Ð]½UÔ=MÐPSÑ=SÐ]Ð]Ð]Ð]Ñ^Ô^Ð^Ð^Ð^ð_ð _r   Úpathr   c                ó  ‡— t          j        ¦   «         }|                      d¦  «        5 Št          ˆfd„d¦  «        D ]}|                     |¦  «         Œ	 d d d ¦  «         n# 1 swxY w Y   |                     ¦   «         S )NÚrbc                 ó.   •— ‰                       d¦  «        S )Né   )Úread)Úhandles   €r   ú<lambda>zsha256_of.<locals>.<lambda>9   s   ø€  &§+¢+¨gÑ"6Ô"6€ r   r   )ÚhashlibÚsha256ÚopenÚiterÚupdateÚ	hexdigest)r   ÚdigestÚblockr#   s      @r   Ú	sha256_ofr-   6   sÃ   ø€ ÝŒ^ÑÔ€FØ	�Š�4‰Œð !˜FÝÐ6Ð6Ð6Ð6¸Ñ<Ô<ð 	!ð 	!ˆEØ�MŠM˜%Ñ Ô Ð Ð ð	!ð!ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !ð ×ÒÑÔÐs   ª,A#Á#A'Á*A'ÚtargetúPath | Nonec                ó:  — | pt          j        t           j        ¦  «        } |                      ¦   «         rdS |pt	          ¦   «         d         }t          dt           j        dz  d›d�d¬¦  «          || ¦  «         t          d	| › �¦  «         t          ¦   «          dS )
z•BiRefNet-lite, unless it is already there. Setups that cut out pictures call this
    so a first generation never fetches a remover nobody agreed to.NÚdownloadz
Fetching BiRefNet-lite (r
   r   z MB)...T©Úflushz  background remover in )r   r   r   r   Úglobalsr   r   r   )r.   r1   s     r   Úinstall_if_missingr5   >   sª   € ð Ð9•uÔ'­Ô(8Ñ9Ô9€FØ‡~‚~ÑÔð ØˆØÐ0�7™9œ9 ZÔ0€HÝ	Ð
J¥uÔ'7¸#Ñ'=Ð
JÐ
JÐ
JÐ
JÐRVÐWÑWÔWÐWØ€HˆVÑÔÐÝ	Ð
- VÐ
-Ð
-Ñ.Ô.Ð.ÝÑÔÐÐÐr   c                ó\  — | j                              dd¬¦  «         |                      d¦  «        } |t          j        ¦  «        5 }|                     d¦  «        5 }|                     d¦  «        x}r,|                     |¦  «         |                     d¦  «        x}°,ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   t          |¦  «        }|t          j	        k    r)| 
                    d¬¦  «         t          d|› d	�¦  «        ‚|                     | ¦  «         | S )
zRFetch to a temporary name, verify, then move into place. A bad file is never kept.T)ÚparentsÚexist_okz.partÚwbr!   N)Ú
missing_okzchecksum mismatch (z); nothing was installed)ÚparentÚmkdirÚwith_suffixr   r   r'   r"   Úwriter-   ÚLEAN_SHA256ÚunlinkÚ
SystemExitÚreplace)r.   ÚopenerÚpartialÚresponseÚoutr,   Úactuals          r   r1   r1   K   sŸ  € à
„M×Ò ¨tÐÑ4Ô4Ð4Ø× Ò  Ñ)Ô)€GØ	ˆ•”Ñ	Ô	ð  8¨W¯\ª\¸$Ñ-?Ô-?ð À3Ø—}’} WÑ-Ô-Ð-ˆeð 	Ø�IŠI�eÑÔÐð  —}’} WÑ-Ô-Ð-ˆeð 	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ �wÑÔ€FØ•Ô"Ò"Ð"Ø�Š $ˆÑ'Ô'Ð'ÝÐO¨vÐOÐOÐOÑPÔPÐPØ‡O‚O�FÑÔÐØ€Ms7   ÁCÁAB-Â!CÂ-B1	Â1CÂ4B1	Â5CÃCÃCÚargvúlist[str] | NoneÚintc                óL  — t          j        t                               ¦   «         d         ¬¦  «        }|                     ddd¬¦  «         |                     ddd¬¦  «         |                     | ¦  «        }t          j        t          j        ¦  «        }| 	                    ¦   «         r)t          d	|› �¦  «         |j        st          ¦   «          dS |j        rt          d
¦  «         dS t          t          ¦   «         d¬¦  «         |j        sf	  |d¦  «        }n # t          $ r t          d¦  «         Y dS w xY w|                     ¦   «                              ¦   «         dvrt          d¦  «         dS t%          |¦  «         t          d|› �¦  «         t          ¦   «          dS )Nr   )Údescriptionz--yesÚ
store_truezdownload without asking)ÚactionÚhelpz--checkzreport onlyzBiRefNet-lite is installed: zBiRefNet-lite is not installedr   Tr2   zDownload it? [y/N] z?Refusing to download without --yes when there is nobody to ask.)ÚyÚyeszNothing downloaded.z
Installed )ÚargparseÚArgumentParserÚ__doc__Ú
splitlinesÚadd_argumentÚ
parse_argsr   r   r   r   r   Úcheckr   r   rQ   ÚEOFErrorÚstripÚlowerr1   )rH   ÚaskÚparserÚargsr.   Úanswers         r   Úmainr`   Z   s¹  € ÝÔ$µ×1CÒ1CÑ1EÔ1EÀaÔ1HÐIÑIÔI€FØ
×Ò˜¨Ð;TÐÑUÔUÐUØ
×Ò˜	¨,¸]ÐÑKÔKÐKØ×Ò˜TÑ"Ô"€DåÔ�eÔ.Ñ/Ô/€FØ‡~‚~ÑÔð ÝÐ5¨VÐ5Ð5Ñ6Ô6Ð6ØŒzð 	 ÝÑÔÐØˆqØ„zð ÝÐ.Ñ/Ô/Ð/Øˆqå	�,‰.Œ. Ð%Ñ%Ô%Ð%ØŒ8ð ð	Ø�SÐ.Ñ/Ô/ˆFˆFøÝð 	ð 	ð 	ÝÐSÑTÔTÐTØ�1�1ð	øøøð �<Š<‰>Œ>×ÒÑ!Ô!¨Ð5Ð5ÝÐ'Ñ(Ô(Ð(Ø�1ÝˆVÑÔÐÝ	Ð
�vÐ
Ð
Ñ Ô Ð ÝÑÔÐØˆ1s   ÄD ÄD9Ä8D9Ú__main__)r   r   )r   r   )r   r   r   r   )NN)r.   r/   r   r   )r.   r   r   r   )rH   rI   r   rJ   )rT   Ú
__future__r   rR   r%   ÚsysÚurllib.requestÚurllibÚpathlibr   Ú__file__Úresolver7   ÚREPOr   Úinsertr   Úimage_to_3dlabr   r   r   r-   r5   ÚrequestÚurlopenr1   Úinputr`   Ú__name__rA   © r   r   ú<module>rq      su  ððð ð* #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð à€tˆH�~„~×ÒÑÔÔ'¨Ô*€Ø „‡‚��3�3�t‘9”9Ñ Ô Ð à  Ð  Ð  Ð  Ð  Ð  ðð ð ð ð_ð _ð _ð _ðð ð ð ð
ð 
ð 
ð 
ð 
ð #)¤.Ô"8ð ð ð ð ð ð #'¨Eð ð ð ð ð ð@ ˆzÒÐØ
ˆ*�T�T‘V”VÑ
Ô
Ðð Ðr   