
    
3j˄                     b
   % S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKrS SKrS SKrS SKJr  S SKrS SKrS SK J!r!  S	S
K"J#r#   S	SK$J$r$  S r) " S S5      r* " S S5      r+\RX                  " S	S9S 5       r- SYS\S\.\/   S\0S\.\   4S jjr1 SYS\.\/   S\0S\.\/   4S jjr2 " S S\5      r3\" SS S!9r4 " S" S \5      r5 " S# S$\55      r6 " S% S&\55      r7    SZS'\S(\S-  S)\/S*\/S-  S+\/S-  4
S, jjr8S- r9SYS. jr:S[S/ jr;S0 r<Sr=\R|                  R                  S15      (       a  S2r=O%S3\	R                  ;   a  S4r=OS5\	R                  ;   a  S6r=\" \A5      R                  R                  5       rD\" \R                  5      rF\" \R                  5      rG\" \R                  5      rI\" \R                  5      rK\FS7-  rL\/" \
R                  " 5       5      rN\DS8-  S9-  rO\DS:-  rP\:" \P5        \PR                  5       (       a6  \PR                  5        H"  rS\SR                  5       (       d  M  \:" \S5        M$     \:" \F5        \:" \FS;-  5        \#R                  " 5        V Vs0 s H  u  pX_M	     snn rV\W" 5       rX\W\/   \YS<'   \!R                  R                  \!R                  R                  \!R                  R                  \!R                  R                  \!R                  R                  \!R                  R                  S=.raS>\R                  S\R                  \R                     4S? jreS@\R                  SA\\R                  /\!RB                  \R                  \R                     -  4   S\.\!RB                     \.\R                  \R                        -  4SB jrfS@\R                  S\.\!RB                     4SC jrgSD\!RB                  \.\!RB                     -  S\R                  4SE jrhSF\R                  \R                     \\R                  \R                        -  S\R                  4SG jrjS@\R                  S\.\R                  \R                        4SH jrkS\\/-  S\4SI jrlSJ rmS[SK jrnSL roSM rpSN rqSO rrSP rsSQ\/SR\/4SS jrtST ruS[SU jrvS\SV jrw/ SWQrxSX ryg! \% aS     S SK$J$r$  \$RL                  " S5         GNp! \% a-    S SK'r'\'RP                  " S5      r$\$RL                  " S5          GNf = ff = fs  snn f )]    N)CallableSequence)Enum)reduce)Path)TypeVar)urlparse)Image   )pip_map)logz"Imported log without relative pathzcomfy mtb utilsz:[comfy mtb] You probably called the file outside a module.c                      g N r       </home/wildlama/comfy/ComfyUI/custom_nodes/comfy_mtb/utils.pymake_reportr   .   s    r   c                   L    \ rS rSrSS\S\4S jjrSS jrS rS rS	 r	S
 r
Srg)
numpy_NFOV6   Nheightwidthc                     U=(       d    SS/U l         [        R                  U l        [        R                  S-  U l        [        R                  S-  U l        X l        X0l        U R                  5       U l	        g )Ng?      ?g       @)
field_of_viewnppiPIPI_2PI2r   r   _get_screen_imgscreen_points)selffovr   r   s       r   __init__numpy_NFOV.__init__7   sW     0T4L%%EECK	553;
!113r   c                    U(       aK  [         R                  " U5      nUS-  S-
  [         R                  " U R                  U R                  /5      -  $ U R                  S-  S-
  [         R                  " U R                  U R                  /5      -  [         R
                  " U R                  R                  5      U R                  -  -  $ N   r   )r   arrayr   r   r"   onesshaper   )r#   is_center_pointcenter_points      r   _get_coord_radnumpy_NFOV._get_coord_rad@   s    88L1L 1$q(BHHdggtyy5I,JJJ ##a'!+((DGGTYY/01774--334t7I7IIKr   c                 0   [         R                  " [         R                  " SSU R                  5      [         R                  " SSU R                  5      5      u  p[         R
                  " UR                  5       UR                  5       /5      R                  $ )Nr   r   )r   meshgridlinspacer   r   r*   ravelT)r#   xxyys      r   r!   numpy_NFOV._get_screen_imgK   sa    KK1djj)2;;q!T[[+I
 xxRXXZ01333r   c           
      R   UR                   S   nUR                   S   n[        R                  " US-  US-  -   5      n[        R                  " U5      n[        R                  " U5      n[        R
                  " U5      n[        R                  " U[        R                  " U R                  S   5      -  X6-  [        R
                  " U R                  S   5      -  U-  -   5      nU R                  S   [        R                  " X&-  U[        R
                  " U R                  S   5      -  U-  U[        R                  " U R                  S   5      -  U-  -
  5      -   n	XR                  -  S-   S-  nXR                  -  S-   S-  n	[        R                  " X/5      R                   $ )Nr   r   r)         ?r   )r5   r   sqrtarctansincosarcsincparctan2r   r   r*   )
r#   converted_screen_coordxyroucsin_ccos_clatlons
             r   _calc_spherical_to_gnomonic&numpy_NFOV._calc_spherical_to_gnomonicQ   sQ   "$$Q'"$$Q'ggadQTk"IIcNq	q	iiBFF4771:&&!)bffTWWQZ6H*HC)OO
 ggaj2::I"&&$$u,q266$''!*3E/E/MM
 

 YY$+WW}s"c)xx
#%%%r   c                 (   [         R                  " UR                  S   S5      U R                  -  n[         R                  " UR                  S   S5      U R                  -  n[         R
                  " U5      R                  [        5      n[         R
                  " U5      R                  [        5      n[         R                  " U[         R                  " UR                  5      R                  [        5      5      n[         R                  " U[         R                  " UR                  5      R                  [        5      5      n[         R                  " XPR                  5      n[         R                  " XpR                  5      n	[         R                  " X5      n
[         R                  " X5      n[         R                  " X5      n[         R                  " X5      n[         R                  " U R                  SU R                  /5      n[         R                  " XSS9n[         R                  " XSS9n[         R                  " XSS9n[         R                  " XSS9n[         R                  " Xb-
  Xs-
  5      n[         R                  " Xb-
  X5-
  5      n[         R                  " X$-
  Xs-
  5      n[         R                  " X$-
  X5-
  5      n[         R                  " U[         R                   " UUU/5      R                  5      n[         R                  " U[         R                   " UUU/5      R                  5      n[         R                  " U[         R                   " UUU/5      R                  5      n[         R                  " U[         R                   " UUU/5      R                  5      n[         R                  " [         R"                  " UU-   U-   U-   5      R                  [         R$                  5      U R&                  U R(                  S/5      nU$ )Nr   r   )axis   )r   modr5   frame_widthframe_heightfloorastypeintaddr+   r,   multiplyreshapeframeframe_channeltaker*   rounduint8r   r   )r#   screen_coordufvfx0y0x2y2base_y0base_y2A_idxB_idxC_idxD_idxflat_imgABCDwawbwcwdAABBCCDDnfovs                               r   _bilinear_interpolation"numpy_NFOV._bilinear_interpolationg   s   VVLNN1%q)D,<,<<VVLNN1%q)D,=,==XXb\  %XXb\  %VV!((-
 VVB)0056++b"2"23++b"2"23w#w#w#w#::djj2t/A/A*BCGGH!,GGH!,GGH!,GGH!,[["'*[["'*[["'*[["'* [[BHHb"b\2445[[BHHb"b\2445[[BHHb"b\2445[[BHHb"b\2445zzHHR"Wr\B&'..rxx8[[$**a(

 r   c                    Xl         UR                  S   U l        UR                  S   U l        UR                  S   U l        U R                  USS9U l        U R                  SS9nU R                  U R                  U5      5      $ )Nr   r   r)   T)r.   r-   F)r-   )	rZ   r,   rS   rR   r[   r/   r@   rz   rK   )r#   rZ   r.   rB   s       r   to_nfovnumpy_NFOV.to_nfov   s    
!KKN ;;q>"[[^%%%t & 
 "&!4!4U!4!K++,,-CD
 	
r   )r   r    r   r@   r   rZ   r[   rS   rR   r   r"   r   )Ni  i   r   )__name__
__module____qualname____firstlineno__rV   r%   r/   r!   rK   rz   r}   __static_attributes__r   r   r   r   r   6   s/    4 43 4	4&,)V
r   r   c                   R    \ rS rSrS rS\4S jr\SS\4S jj5       rS\4S jr	S	r
g
)	IPChecker   c                     [        U R                  5       5      U l        [        R                  " S[        U R                  5       S35        [        5       U l        g )NzFound z
 local ips)listget_local_ipsipsr   debuglensetchecked_ipsr#   s    r   r%   IPChecker.__init__   s>    **,-		F3txx=/45%(Ur   test_url_templatec                     U R                    HZ  nX R                  ;  d  M  U R                  R                  U5        UR                  U5      nU R	                  U5      (       d  MX  Us  $    g r   )r   r   rW   format	_test_url)r#   r   iptest_urls       r   get_working_ipIPChecker.get_working_ip   sY    ((B)))  $$R(,33B7>>(++I  r   prefixc              #   R  #    [         R                  " 5       n[        R                  " SU 35        [         R                  " US 5       HZ  n[        R                  " U5        US   [         R
                  :X  d  M2  US   S   R                  U 5      (       d  MP  US   S   v   M\     g 7f)NzGetting local ips for r      )socketgethostnamer   r   getaddrinfoAF_INET
startswith)r   hostnameinfos      r   r   IPChecker.get_local_ips   s     %%'		*8*56&&x6DIIdOAw&..(T!WQZ-B-B6-J-J1gaj  7s   A4B':B'B'urlc                 l     [         R                  " USS9nUR                  S:H  $ ! [         a     gf = f)N
   )timeout   F)requestsgetstatus_code	Exception)r#   r   responses      r   r   IPChecker._test_url   s:    	||C4H''3.. 		s   #& 
33)r   r   N)z192.168.)r   r   r   r   r%   strr   staticmethodr   r   r   r   r   r   r   r      s:    +
  !c ! !S r   r   )maxsizec                      SSK Jn   [        5       nU R                  nUS:X  aN  [        R
                  " S5        UR                  SU R                   S35      n[        R
                  " SU 35        X R                  4$ )Nr   )argsz0.0.0.0z9Server set to 0.0.0.0, we will try to resolve the host IPz
http://{}:z/historyzSetting ip to )comfy.cli_argsr   r   listenr   r   r   port)r   
ip_checkerbase_urls      r   get_server_infor      sl    #JKKH9		MN,,499+X.
 			N8*-.ii  r   pathpatterns	recursivereturnc                 ^   ^  [        [        [        R                  U 4S jU 5       5      5      $ )z6Combine multiple glob patterns into a single iterator.c              3   X   >#    U  H  n[        TR                  U5      5      v   M!     g 7fr   )r   glob).0pr   s     r   	<genexpr> glob_multiple.<locals>.<genexpr>   s!     %JAc$))A,&7&7s   '*)r   r   operatoror_)r   r   r   s   `  r   glob_multipler      s!     x||%J%JKLLr   
extensionsc                 P    U(       a  SOSnU  Vs/ s H	  o2 SU 3PM     sn$ s  snf )z)Build glob patterns for given extensions.z**/ z*.r   )r   r   r   exts       r   build_glob_patternsr      s.      URF*45*3hb*555s   #c                   J    \ rS rSrSrSrSrSrSr\	S\
S-  S	S
4S j5       rSrg)SortMode   nonemodifiedzmodified-reversenamezname-reversevalueNr   zSortMode|Nonec                     U(       d  g  U " UR                  5       5      $ ! [         a    [        R                  " SU S35         g f = f)Nz
Sort mode z not supported)lower
ValueErrorr   warning)clsr   s     r   from_strSortMode.from_str   sE    	u{{}%% 	KK*UG>:;	s     $AAr   )r   r   r   r   NONEMODIFIEDMODIFIED_REVERSENAMENAME_REVERSEclassmethodr   r   r   r   r   r   r   r      s@    DH)D!LS4Z O  r   r   r5   StringConvertibleEnum)boundc                       \ rS rSrSr\S\\   S\\-  S\4S j5       r	\S\\   S\S\4S j5       r
\S\\   S\\   4S	 j5       rS\4S
 jrSrg)r      zSBase class for enums with utility methods for string conversion and member listing.r   labelr   c           	      6   [        X5      (       a  U$ [        U[        5      (       a0  XR                  ;   a  X   $ U  H  nUR                  U:X  d  M  Us  $    [	        SU S[        U R                  R                  5       5       SU R                  5        35      e)a  
Convert a string to the corresponding enum value (case sensitive).

Args:
    label (Union[str, T]): The string or enum value to convert.

Returns
-------
    T: The corresponding enum value.

Raises
------
    ValueError: If the label does not correspond to any enum member.
zUnknown label: 'z'. Valid members: z, valid values: )
isinstancer   __members__r   r   r   keyslist_members)r   r   members      r   r   StringConvertibleEnum.from_str  s      e!!LeS!!'z!<<5(!M  ug%7S__=Q=Q=S8T7U V --/02
 	
r   
enum_valuec                 V    [        X5      (       a  UR                  $ [        SU 35      e)z
Convert an enum value to its string representation.

Args:
    enum_value (T): The enum value to convert.

Returns
-------
    str: The string representation of the enum value.

Raises
------
    ValueError: If the enum value is invalid.
zInvalid Enum: )r   r   r   )r   r   s     r   to_strStringConvertibleEnum.to_str"  s-      j&&###>*677r   c                 D    U  Vs/ s H  oR                   PM     sn$ s  snf )z~
Return a list of string representations of all enum members.

Returns
-------
    List[str]: List of all enum member values.
r   )r   enums     r   r   "StringConvertibleEnum.list_members6  s     (++st

s+++s   c                     U R                   $ )z}
Returns the string representation of the enum value.

Returns
-------
    str: The string representation of the enum value.
r   r   s    r   __str__StringConvertibleEnum.__str__A  s     zzr   r   N)r   r   r   r   __doc__r   typer5   r   r   r   r   r   r   r   r   r   r   r   r      s    ]
d1g 
cAg 
! 
 
> 8DG 8 8s 8 8& ,$q' ,d3i , , r   c                   .    \ rS rSrSrSrSrSrSrS r	Sr
g	)
	PrecisioniL  fullfp32fp16bf16fp8c                 ^   U ==[         R                  :X  a  O=[         R                  :X  a  O  O    [        R                  $ =[         R
                  :X  a    [        R                  $ =[         R                  :X  a    [        R                  $ [         R                  :X  a  [        R                  $ g r   )r   FP32FULLtorchfloat32FP16float16BF16bfloat16FP8float8_e4m3fnr   s    r   to_dtypePrecision.to_dtypeS  sc    0.)..0}}$}}$~~%*** r   r   N)r   r   r   r   r  r  r  r  r
  r  r   r   r   r   r   r   L  s     DDDD
C	+r   r   c                        \ rS rSrSrSrSrSrg)	Operationi_  copyconvertdeleter   N)r   r   r   r   COPYCONVERTDELETEr   r   r   r   r  r  _  s    DGFr   r  fptarget
backup_dirsuffixr   c                    U R                  5       (       d  [        SU  35      eU=(       d    U R                  U-  nUR                  SSS9  U R                  nU(       d  U(       a  U=(       d    S U U=(       d    S 3nOU S[
        R                  " 5        3nXW U R                   3-  n[        R                  " X5        [        R                  " SU 35        g )NzNo file found at T)parentsexist_okr   _zFile backed up to )existsFileNotFoundErrorparentmkdirstemuuiduuid4r  shutilr  r   r   )	r  r  r  r  r   backup_directoryr"  new_stembackup_file_paths	            r   backup_filer)  e  s     99;;"3B4 8997Z!74$777Dl^D6&,B8V1TZZ\N+'Jryyk*BB KK%II"#3"456r   c                    ^   T R                  S5      m [        U 4S jS 5       5      $ ! [         a    [        R                  " ST  35         gf = f)N#c              3   F   >#    U  H  n[        TXS -    S5      v   M     g7f)r)      N)rV   )r   i	hex_colors     r   r   hex_to_rgb.<locals>.<genexpr>  s$     FIqS11u-r22I   !)r   r)   r   zInvalid hex color: )r   r   r   )lstriptupler   r   error)r/  s   `r   
hex_to_rgbr5    sO    $$S)	FIFFF 		'	{34s   %) #AAc                 v   [        U [        5      (       a  U  H  n[        X!5        M     g [        U [        5      (       a  U R	                  5       R                  5       n U [        R                  ;  aH  U(       a!  [        R                  R                  SU 5        g [        R                  R                  U 5        g g )Nr   )
r   r   add_pathr   resolveas_posixsysr   insertappend)r   prependr   s      r   r7  r7    s{    $AQ  $||~&&(388HHOOAt$HHOOD!	 r   c                    Uc  / n[        U [        5      (       a  U nO9[        U [        5      (       a  SR                  S U  5       5      nO[	        S5      e [        X!5        g ! [        R                   a_  n[        SUR                   3[        R                  S9  [        UR                  R                  5       [        R                  S9   S nAg S nAf[         a    [        S5         g f = f)N c              3      #    U  HI  n[        U[        5      (       a  UR                  5       O[        R                  " [        U5      5      v   MK     g 7fr   )r   r   r9  shlexquoter   )r   args     r   r   run_command.<locals>.<genexpr>  s;      
 )d33CLLNSX9NNs   AAzCInvalid 'cmd' argument. It must be a string or a list of arguments.z!Command failed with return code: filezCommand execution interrupted.)r   r   r   joinr   _run_command
subprocessCalledProcessErrorprint
returncoder:  stderrstripKeyboardInterrupt)cmdignored_lines_start	shell_cmdes       r   run_commandrT    s    " #s		C		HH 

 
	
 Q
 	
	0Y4(( 1/~>SZZ	
 	ahhnnSZZ0 0./0s   A$ $C-8ACC-,C-c           	        ^ [         R                  " SU  35        [        R                  " U [        R                  [        R                  SSSS9nUR
                  R                  5       R                  S5      nUR                  R                  5       R                  S5      nU H*  m[        U4S jU 5       5      (       a  M  [        T5        M,     U H  m[        T[        R                  S9  M     [        S5        g )NzRunning T)stdoutrM  textshellcheck
c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   )r   )r   ignlines     r   r   _run_command.<locals>.<genexpr>  s     G3FC4??3''3Fr1  rE  zCommand executed successfully!)r   r   rI  runPIPErV  rN  splitrM  anyrK  r:  )rR  rQ  resultstdout_linesstderr_linesr]  s        @r   rH  rH    s    II$%^^F ==&&(..t4L==&&(..t4L G3FGGG$K 
 d$  

*+r   	COLAB_GPUcolabpython_embededembededz.venvvenvstylesdatazfont.ttfexterncustom_nodeswarned_messages)nearestboxbilinearhammingbicubiclanczosimagec                     [         R                  " SU R                  5       R                  5       -  SS5      R	                  [         R
                  5      nU$ )zGConverts a tensor to a ndarray with proper scaling and type conversion.     o@r   r   )r   clipcpunumpyrU   r^   )rv  np_arrays     r   to_numpyr}    s<    wwuuyy{0022As;BB288LHOr   tensorfuncc                 l    [        U R                  S   5       Vs/ s H  o!" X   5      PM     sn$ s  snf )zDHandles batch processing for a given tensor and conversion function.r   )ranger,   )r~  r  r.  s      r   handle_batchr    s1    
 &+6<<?%;<%;DO%;<<<s   1c                 b    S[         R                  S[        R                  4S jn[        X5      $ )z4Converts a batch of tensors to a list of PIL Images.tr   c                 R   [        U 5      nUR                  S:X  a  [        R                  " USS9$ UR                  S:X  aP  UR                  S   S:X  a  [        R                  " USS9$ UR                  S   S:X  a  [        R                  " USS9$ [        SU R                   35      e)	Nr)   LmoderP   RGBr   RGBAInvalid tensor shape: )r}  ndimr
   	fromarrayr,   r   )r  r|  s     r   single_tensor2pil%tensor2pil.<locals>.single_tensor2pil"  s    A;==A??8#66]]a~~a A%xe<<"a'xf==1!'';<<r   )r  Tensorr
   r  )r~  r  s     r   
tensor2pilr    s*    	=U\\ 	=ekk 	= 22r   imagesc                     S[         R                   S[        R                  4S jn[        U [         R                   5      (       a  U" U 5      $ [        R                  " U  Vs/ s H
  o!" U5      PM     snSS9$ s  snf )z9Converts a PIL Image or a list of PIL Images to a tensor.rv  r   c                 "   [         R                  " U 5      R                  [         R                  5      S-  nUR                  S:X  a%  [
        R                  " U5      R                  S5      $ [
        R                  " U5      R                  S5      $ )Nrx  r)   r   )r   r*   rU   r  r  r  
from_numpy	unsqueeze)rv  np_images     r   single_pil2tensor%pil2tensor.<locals>.single_pil2tensor3  sg    88E?))"**5===A##H-77::##H-77::r   r   dim)r
   r  r  r   cat)r  r  imgs      r   
pil2tensorr  0  sd    ; ; ; &%++&& ((yyFCFS+C0FCKKCs   !A8r|  c                    S[         R                  [        R                     S[        R
                  4S jn[        U [        R                  5      (       a  U" U 5      $ [        R                  " U  Vs/ s H
  o!" U5      PM     snSS9$ s  snf )z=Converts a NumPy array or a list of NumPy arrays to a tensor.r*   r   c                    U R                   S:X  aE  [        R                  " U R                  [        R
                  5      S-  5      R                  S5      $ U R                   S:X  aE  [        R                  " U R                  [        R
                  5      S-  5      R                  S5      $ [        SU R                   35      e)Nr)   rx  r   rP   zInvalid array shape: )	r  r  r  rU   r   r  r  r   r,   )r*   s    r   single_np2tensor#np2tensor.<locals>.single_np2tensorE  s    ::?##RZZ(50il ZZ1_##RZZ(50il 0>??r   r   r  )	nptNDArrayr   r  r  r  r   ndarrayr  )r|  r  arrs      r   	np2tensorr  @  sp    
	@BJJ 7 	@ELL 	@ (BJJ''))yy8D8C*3/8D!LLDs   2B	c                     S[         R                  S[        R                  [        R
                     4S jn[        X5      $ )z6Converts a batch of tensors to a list of NumPy arrays.r  r   c                 
   U R                  5       n U R                  S:X  a  [        U 5      $ U R                  S:X  a1  U R                  S   S;   a  U R	                  SSS5      n [        U 5      $ [        SU R                   35      e)Nr)   rP   r   )r   rP   r   r   r  )squeezer  r}  r,   permuter   r  s    r   single_tensor2np#tensor2np.<locals>.single_tensor2npY  sp    IIK66Q;A;VVq[wwqzY&IIaA&A;5aggY?@@r   )r  r  r  r  r   r^   r  )r~  r  s     r   	tensor2npr  V  s6    	AELL 	AS[[-B 	A 11r   c                 $   [        U 5      n U R                  5       (       d	  [        U -  n U R                  5       (       d  U $ U R                  nU R
                  nU R                  nSn X1 SUS U 3-  nUR                  5       (       d  U$ US-  nM*  )z
Find the next available path by adding a numbered suffix. (mimics comfy's version).

Args:
    path (Path): The original path to check

Returns
-------
    Path: A path that doesn't exist yet
r   r  04d)r   is_absolute
output_dirr  r"  r  r   )r   r"  r  r   counternew_paths         r   nextAvailabler  g  s     :DD ;;==99D[[F[[FG
fAgc]6(;;  O1	 r   c                     [         R                  " SX44X445      n[        SU SUR                   35        [         R                  " XSS9$ )Nr   r   zpad_width: z	, shape: wrapr  )r   r*   rK  r,   pad)r  leftrighttopbottom	pad_widths         r   r  r    sK    &3-$?@I	
i[	)//):; 66#v..r   c           	      L   SnU R                   S   n[        R                  " XCU R                   S   U R                   S   45      n[        U5       HP  nUS:w  a  U" US-   U5        UR	                  SSXUS-    R                  [        R                  5      05      S   XV'   MR     U$ )zInfer each tile with the given model. progress_callback will be called with
arguments : current tile idx and total tiles amount (used to show progress on
cursor in Blender).
rP   r   r)   Nr   input)r,   r   emptyr  r_  rU   r  )tilesort_sessionprogress_callbackout_channelstiles_nb
pred_tilesr.  s          r   tiles_inferr    s    
 L{{1~H	QQ@J 8_$a!eX.#7Ea!e,33BJJ?@


  r   c                    U u  p#Uu  pEX$-
  nX5-
  n[         R                  " X#45      n[         R                  " SSUS9XU* 2SU24'   [         R                  " SSUS9XU* 2U* S24'   [         R                  " [         R                  " SSUS9S   S5      USU2Xw* 24'   [         R                  " [         R                  " SSUS9S   S5      X* S2Xw* 24'   Xg:X  d   e[         R                  " [        U5      S5      n	XSU2SU24'   [         R                  " U	S5      n	XSU2U* S24'   [         R                  " U	S5      n	XU* S2U* S24'   [         R                  " U	S5      n	XU* S2SU24'   U$ )zMGenerates a pyramidal-like mask. Used for mixing overlapping predicted tiles.r   r   )numN)r   r   r)   )r   r+   r3   	transposerot90corner_maskflip)
	tile_sizestride_sizetile_htile_wstride_hstride_wramp_hramp_wmaskcorners
             r   generate_maskr    s   NF$HFF77F#$D %'KK1&$AD&	 !%'[[A6%BD&	!"$&LL
Aqf%d+V%D&&.	 ! &(\\
Aqf%d+V&D6'>	!"
 XXk&)1-F#&'6'	WWVQF$&6'(	WWVQF%&F78	WWVQF$&7F7	Kr   c                     [         R                  " X /5      n[        SU 5       HB  n[        SU 5       H/  nX#:  a  X S-
  -  nSU-
  XU4'   X#::  d  M  X0S-
  -  nSU-
  XU4'   M1     MD     US[        U 5      -  -
  $ )zYGenerates the corner part of the pyramidal-like mask.
Currently, only for square shapes.
r   r   g      ?)r   zerosr  scaling_mask)side_lengthr  hwshsws         r   r  r    s     XX{01F1k"q+&Av/* 2v!tv/* 2v!t ' # D<4444r   c                 J   [         R                  " X /5      n[        SU 5       Hx  n[        SU 5       He  nX S-
  -  nX0S-
  -  nX#:  a  X U-
  ::  a  XQX#4'   X#::  a  X U-
  ::  a  XAX#4'   X#:  a  X U-
  :  a	  SU-
  XU4'   X#::  d  MR  X U-
  :  d  M\  SU-
  XU4'   Mg     Mz     SU-  $ )Nr   r   r)   )r   r  r  )r  scalingr  r  r  r  s         r   r  r    s    hh12G1k"q+&AAo&BAo&Bv!Q. "v!Q. "v!Q. !B1v!Q. !B1 ' # w;r   c                 "   U S   R                   u  pEnUu  pxpUS   U	-   U
-   nUS   U-   U-   nUu  pUS-  S:X  a	  US-  S:X  d   eXS-  :  a  XS-  :  d   eX::  a  X::  d   e[        R                  " US   X45      n[        XV4U5      nX-
  U-  S-   nX-
  U-  S-   nSn[	        SU5       HQ  n[	        SU5       H>  nUU-  UU-  U-   nnUU-  UU-  U-   nnUSS2UU2UU24==   U U   U-  -  ss'   US-  nM@     MS     USS2X* 2Xx* 24   $ )zXMerges the list of tiles into one image. img_size is the original size, before
padding.
r   r   r)   N)r,   r   r  r  r  )r  r  img_sizepaddingsr  r  r  pad_left	pad_rightpad_top
pad_bottomr   r   r  r  mergedr  h_rangew_rangeidxr  r  h_fromh_tow_fromw_tos                             r   tiles_merger    s    aAv/7,Ha[7"Z/FQK("Y.E$H qLAHqLA$566
"aZ)?@@X%788XXx{F23F&);7DH,1G8+q0G
C1gq'"Ax<X)>DFx<X)>DF1fTk6$;./5:3DD/1HC	 #  !W[((:*==>>r   c                 F   [         R                  " SU SU S35        Uu  p4Uu  pVU R                  S   U R                  S   pUS-  S:X  a	  US-  S:X  d   eXSS-  :  a  XdS-  :  d   eXS::  a  Xd::  d   eSu  pXs-
  U-  nX-
  U-  nUS:w  a  X[-
  n	US:w  a  Xl-
  n
X7:  a  X7-
  n	XH:  a  XH-
  n
U
S-  U-   nU
S-  S:X  a  UOUS-   nU	S-  U-   nU	S-  S:X  a  UOUS-   n[        XXU5      n U R                  S   U R                  S   pXs-
  U-  S-   nX-
  U-  S-   n[        R
                  " UU-  U R                  S   X4/5      nSn[        SU5       HF  n[        SU5       H3  nUU-  UU-  U-   nnUU-  UU-  U-   nnU SS2UU2UU24   UU'   US-  nM5     MH     UXUU44$ )	zReturns list of tiles from the given image and the padding used to fit the tiles
in it. Input image must have dimension C,H,W.
zSplitting img: tile z	, stride r?  r   r   r)   r  N)r   r   r,   r  r   r  r  )r  r  r  r  r  r  r  img_himg_wpad_hpad_w
remainer_h
remainer_wr  r  r  r  r  r  r  r  r  r  r  r  r  r  s                              r   tiles_splitr    s(    II$YKyQGHNF$H99Q<15 qLAHqLA$566
"aZ)?@@X%788 LE.H,J.H,JQ%Q% ~~ zH$H!AIN1Iqj8#G!AIN!J
cY
<C99Q<15 8+q0G8+q0GHHg'1vFGE
C1gq'"Ax<X)>DFx<X)>DFQtVD[89E#J1HC	 #  8<<<r   	model_urldestinationc                    [        U [        5      (       a  U  H  n[        X!5        M     g [        [	        U 5      R
                  5      R                  nSU ;   a/   SS KnSU ;   a   UR                  XS	S
9  g UR#                  XSS	S9  g	[$        R&                  " U S	S9n[)        UR*                  R'                  SS5      5      n[-        X5      nUR.                  R1                  S	S9  [2        R4                  R7                  U5      n[9        US5       n	UR;                  SS9 H.  n
U	R=                  U
5        UR?                  [A        U
5      5        M0     S S S 5        [        R                  " SU  SU 35        g ! [         aG    [        R                  " S5        [        R                  " [        R                  SSSS/5        SS Kn GNjf = f! [          a    UR                  XS9   g f = f! , (       d  f       N= f)Nzdrive.google.comr   zInstalling gdownz-mpipinstallgdownz	/folders/T)outputresume)r  F)quietr  )streamzcontent-length)r  rr   i   )
chunk_sizezDownloaded model from z to )!r   r   download_modelr   r	   r   r   r  ImportErrorr   r   rI  
check_callr:  
executabledownload_folder	TypeErrordownloadr   r   rV   headersget_model_pathr   r!  comfyutilsProgressBaropeniter_contentwriteupdater   )r  r  r   filenamer  r   
total_sizedestination_pathpbarrF  rl  s              r   r  r  M  s   )T""C3, HY',,-22HY&	 )#E%%$ &  yU4H||Id3HX%%))*:A>?J%k<!!4!0;;"":.D		%))T):DJJtKKD	" ; 
&
 HH
 40@/ABM  	HH'(!!NN 	&  E%%i%DE 
&	%s2   E8 %G AG+8AG	G	G('G(+
G9c                     Sn  SS K n[        R                  " S5        [        S5      nUS-  nUS-  S-  nUR	                  5       (       d  [        R
                  " SU 35        UR                  U UR                  5       S	S
9  [        R
                  " SU 35        UR	                  5       (       aW  SS KnUR                  UR                  5       S5       nUR                  UR                  R                  5       5        S S S 5        g g g ! , (       d  f       g = f! [         a   n[        R                  " SU  35        UeS nAff = f)Nz@https://drive.google.com/uc?id=18wEUfMNohBJ4K3Ly5wpTejPfDzp-8fI8r   zLoading antelopev2 modelinsightfacezantelopev2.zipmodels
antelopev2z%antelopev2 not found, downloading to T)r  zUnzipping antelopev2 to rzGCould not load or download antelopev2 model, download it manually from )r  r   r   r  r  r   r  r9  zipfileZipFile
extractallr   r   r4  )antelopev2_urlr  destarchive
final_pathr!  zip_refrS  s           r   download_antelopev2r)    s/   J 		,-m,))H_|3
  ""HH<TFCDNN  "   HH/
|<=~~__W%5%5%7=&&z'8'8'A'A'CD >=	   # >=  		UVdUef	
 	s6   CD *D
?D 

DD D 
E%E  Ec                 f   [         R                  " SU  SU 35        S nU(       a  [        R                  " X5      nO9[        R
                  " [        5         [        R                  " U 5      nS S S 5        U(       a  [        U[        5      (       aT  [        U5      S:  a@  SUS    SU 3nU[        ;  a+  [         R                  " U5        [        R                  U5        US   n[        U5      n[         R                  " SU 35        U$ [        U -  nU(       a  X!-  nU$ ! , (       d  f       N= f)NzRequesting z with model r   z,Found multiple match, we will pick the last rN   rZ  z'Resolved model path from folder_paths: )r   r   folder_pathsget_full_path
contextlibsuppressKeyErrorget_folder_pathsr   r   r   ro  r   rW   r   
models_dir)fammodelreswarn_msgs       r   r  r    s   IIC5UG45
C((4   *//4C + c4  3x!|I#b'RTUXTYZ?2HHX&#''1b'C3i		;C5AB J	 3LCJ% +*s   D""
D0c                 \   [         R                  " SSU S9n[         R                  " SSUS9n[         R                  " X#5      u  pE[         R                  " XS[         R                  S9nUR                  5       US S 2S S 2S4'   UR                  5       US S 2S S 2S4'   UR                  S5      $ )Ng        r:   )stepsrP   )dtyper   r   )r  r3   r2   r  r  r  r  )r   r   uvUVuv_maps          r   create_uv_map_tensorr>    s    sCu-AsCv.A>>!DA[[?FcceF1a7OcceF1a7OAr   )LinearSine InSine OutSine In/OutQuart In	Quart OutQuart In/OutCubic In	Cubic OutCubic In/OutCirc InCirc OutCirc In/OutBack InBack OutBack In/Out
Elastic InElastic OutElastic In/Out	Bounce In
Bounce OutBounce In/Outc                   ^^ US:X  a  U $ S nS nS nS nS nS nU4S jmS	 mUU4S
 jnS n	S n
S nS nS nS nS nS nS nS nS nS n0 SU_SU_SU_SU	_SU
_SU_SU_SU_SU_S U_S!U_S"U_S#U_S$U_S%U_S&U_S'U_UTTUS(.EnUR                  U5      nU(       a  U" U 5      $ [        R                  " S)U 35        [        R                  " S*[        UR	                  5       5       35        [        S)U 35      e)+Nr?  c                 &    SnX -  US-   U -  U-
  -  $ Ngaq89?r   r   r  ss     r   
easeInBack apply_easing.<locals>.easeInBack  s     uQ!a((r   c                 4    SnU S-
  U -  US-   U -  U-   -  S-   $ rW  r   rX  s     r   easeOutBack!apply_easing.<locals>.easeOutBack  s+    Q!A{Q/144r   c                 j    SnU S:  a  X -  XS-   -  U-
  -  S-  $ U S-
  U -  US-   U -  U-   -  S-   S-  $ )Ng@t_@r   r   r)   r   rX  s     r   easeInOutBack#apply_easing.<locals>.easeInOutBack  sS    s7EQa%[1_-22Q!A{Q/!3q88r   c                     U S:X  a  gU S:X  a  gSnUS-  n[         R                  " SSU S-
  -  5      [         R                  " U S-
  U-
  S[         R                  -  -  U-  5      -  * $ )Nr   r   333333?r   r)   r   mathpowr=   r   r  r   rY  s      r   easeInElastic#apply_easing.<locals>.easeInElastic	  so    66EHHQa!e%hhA	a$''k2Q678
 	
r   c                     U S:X  a  gU S:X  a  gSnUS-  n[         R                  " SSU -  5      [         R                  " X-
  S[         R                  -  -  U-  5      -  S-   $ )Nr   r   rc  r   r)   rd  rg  s      r   easeOutElastic$apply_easing.<locals>.easeOutElastic  s`    66Exx37#dhh!dgg+/F/J&KKaOOr   c                    U S:X  a  gU S:X  a  gSnUS-  nU S-  n U S:  aT  S[         R                  " SSU S-
  -  5      [         R                  " U S-
  U-
  S[         R                  -  -  U-  5      -  -  $ S[         R                  " SS	U S-
  -  5      -  [         R                  " U S-
  U-
  S[         R                  -  -  U-  5      -  S-   $ )
Nr   r   g?r   r)         r   r   rk  rd  rg  s      r   easeInOutElastic&apply_easing.<locals>.easeInOutElastic  s    66EEq5B!a%L)((AEAI!dgg+6:;< 
 hhq#Q-()hhA	a$''k2Q678 	
r   c                     > ST" SU -
  5      -
  $ Nr   r   )r  easeOutBounces    r   easeInBounce"apply_easing.<locals>.easeInBounce3  s    =Q'''r   c                     U S:  a  SU -  U -  $ U S:  a  U S-  n SU -  U -  S-   $ U S:  a  U S-  n SU -  U -  S-   $ U S	-  n SU -  U -  S
-   $ )NgF]tE?g     @@gF]tE?gtE]t?g      ?g]tE?g/袋.?g      ?g.袋?g     ?r   r  s    r   rt  #apply_easing.<locals>.easeOutBounce6  s|    >A:>!(^OAA:>D((*AA:>F**AA:>H,,r   c                 T   > U S:  a  T" U S-  5      S-  $ T" U S-  S-
  5      S-  S-   $ )Nr   r)   r   r   )r  ru  rt  s    r   easeInOutBounce%apply_easing.<locals>.easeInOutBounceC  s;    s7A&,,QUQY'#-33r   c                     X -  U -  U -  $ r   r   r  s    r   easeInQuart!apply_easing.<locals>.easeInQuartI  s    uqy1}r   c                 *    U S-  n U S-  U -  U -  S-
  * $ Nr   r)   r   r  s    r   easeOutQuart"apply_easing.<locals>.easeOutQuartL  s%    	QAA!""r   c                 `    U S-  n U S:  a  SU -  U -  U -  U -  $ U S-  n SU S-  U -  U -  S-
  -  $ )Nr)   r   r   ro  r   r  s    r   easeInOutQuart$apply_easing.<locals>.easeInOutQuartP  sN    	Qq57Q;?Q&&	Qq!tax!|a'((r   c                     X -  U -  $ r   r   r  s    r   easeInCubic!apply_easing.<locals>.easeInCubicX  s    uqyr   c                 "    U S-  n U S-  U -  S-   $ r  r   r  s    r   easeOutCubic"apply_easing.<locals>.easeOutCubic[  s    	Q!tax!|r   c                 T    U S-  n U S:  a  SU -  U -  U -  $ U S-  n SU S-  U -  S-   -  $ )Nr)   r   r   r   r  s    r   easeInOutCubic$apply_easing.<locals>.easeInOutCubic_  sD    	Qq57Q;?"	QadQhl##r   c                 @    [         R                  " SX -  -
  5      S-
  * $ rs  re  r;   r  s    r   
easeInCirc apply_easing.<locals>.easeInCircg  s    1qu9%)**r   c                 D    U S-  n [         R                  " SU S-  -
  5      $ r  r  r  s    r   easeOutCirc!apply_easing.<locals>.easeOutCircj  s"    	QyyQT""r   c                     U S-  n U S:  a"  S[         R                  " SU S-  -
  5      S-
  -  $ U S-  n S[         R                  " SU S-  -
  5      S-   -  $ )Nr)   r   ro  r   r  r  s    r   easeInOutCirc#apply_easing.<locals>.easeInOutCircn  s]    	Qq5499QAX.233	QdiiAqD)A-..r   c                 ^    [         R                  " U [         R                  S-  -  5      * S-   $ r(   re  r>   r   r  s    r   
easeInSine apply_easing.<locals>.easeInSinev  s&    dggk*++a//r   c                 V    [         R                  " U [         R                  S-  -  5      $ )Nr)   )re  r=   r   r  s    r   easeOutSine!apply_easing.<locals>.easeOutSiney  s    xxTWWq[)**r   c                 \    S[         R                  " [         R                  U -  5      S-
  -  $ )Nro  r   r  r  s    r   easeInOutSine#apply_easing.<locals>.easeInOutSine|  s#    txx!,q011r   r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  )rQ  rR  rS  rT  zUnknown easing type: zAvailable easing types: )r   r   r4  r   r   r   )r   easing_typerZ  r]  r`  rh  rl  rp  rz  r}  r  r  r  r  r  r  r  r  r  r  r  easing_functionsfunction_easeru  rt  s                          @@r   apply_easingr    s   h)59

P
*(-4#)$+#/0+2:K 	} 	K	
 	\ 	 	K 	\ 	 	: 	K 	} 	: 	K 	}  	m!" 	~#$ +!#(+0 %((5MU##II%k]34II(.>.C.C.E)F(GHI
,[M:
;;r   )F)Nz.bakNNr   )   r  )zr-  	functoolsre  r   osrA  r%  r   rI  r:  r#  collections.abcr   r   r   r   r   pathlibr   typingr   urllib.parser	   comfy.utilsr  r+  r{  r   numpy.typingr  r   r  PILr
   r  r   r   r	  warnlogging	getLoggerr   r   r   	lru_cacher   r   r   boolr   r   r   r5   r   r   r  r)  r5  r7  rT  rH  
comfy_modeenvironr   r  __file__r   absolutehere	base_path	comfy_dirr1  output_directoryr  input_directory	input_dir
styles_dirr$  
session_id	font_pathextern_rootr  iterdirpthis_diritemsreqs_mapr   ro  __annotations__
ResamplingNEARESTBOXBILINEARHAMMINGBICUBICLANCZOSPIL_FILTER_MAPr  r  r^   r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)  r  r>  EASINGSr  )keyr   s   00r   <module>r     sk       	     
  .     !        O 	h
 h
^ D Q!  !& 8=M
Ms)M04M	$ZM .36S	6&*6	#Y6t & C./JD JZ+% +&%  774K7 7 $J	7
 $J76" 08,D 
::>>+J'JJ H~%%' ''(	,))*
 ,//0
--.	!

6MJ&	 Xo  ""$::<<SM %
 	  ^	# $ *19:3EJ9  ES ! ''  ))''''''ELL S[[%: =LL=
ELL>5;;RXX1F#FF
G= 
%++ckk"((344=3u|| 3U[[(9 3"Lu{{T%++%66 L5<< L Mkk"**%RZZ1H(IIM
\\M,2ell 2tCKK,A'B 2"s
 t >/*#L5$&?D4=z3c 3 3l"JD
"4h<m  	OO56 O 12MNN	O	O@ :s0   ;S T+T(S11.T$T(#T$$T(