
    }iٹ                     L   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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mZ i fdddZdZ ee      Zej)                  g d	       ddddd
ddd
dddddddZ ee      Zej)                  g d       d ZdQdZdQdZ G d d      Z G d d      Zd ZdRdZd Zd Zd Z d Z!d Z"d  Z#d! Z$dSd"Z% e&d#      Z' e&d$      Z(e)e)e*fe+cZ,Z-Z.e/e&e0fZ1d% Z2d& Z3d' Z4i d(dd)dd*dd+dd, eejj                        d- eejl                        d. eejn                        d/ejp                  d0ejr                  d1 e#ejt                        d2 e#ejv                        d3 e$ejx                        d4 e$ejz                        d5 e$ej|                        d6 e$ej~                        d7 eej                        d8 eej                         eej                         eej                         eej                        e!e e"d9ZE e4d:        e4e2      d;ZFh d<ZGi eEeFZHd=ZI eJ eK eKd>d?d@             ZLdAZMdBZN G dC dD      ZO G dE dFeP      ZQ G dG dHeP      ZR G dI dJeP      ZS G dK dLej                        ZUdM ZVdN ZW G dO dP      ZXy)Tz
This module contains all the logic needed to interpret the JavaScript obfuscation functions that YouTube uses.

All this code was based on the yt-dlp project, see: https://github.com/yt-dlp/yt-dlp.

    N)update_wrapper)suppressFstrictc                   	
 d
dj                  d 
D              }d}d| d}d| dd	fd
| ddff	d fd	
fd}fd}t        j                  d||       } s]t        j                  dd|       } t        j                  dd |       } t        j                  dd|       } t        j                  dd|       } d| d| d| d| d| d}t        j                  d| d| d| d| d| d||       S )Nz'"`|c              3   0   K   | ]  }| d | d|   yw)z(?:\\.|[^\\z])*N ).0qs     =/usr/local/lib/python3.12/dist-packages/pytubefix/jsinterp.py	<genexpr>zjs_to_json.<locals>.<genexpr>   s!     LQC{1#S4Ls   z/\*(?:(?!\*/).)*?\*/|//[^\n]*\nz\s*(?:z)?\s*z(?s)^(0[xX][0-9a-fA-F]+)z:?$   z(?s)^(0+[0-7]+)   c                     d}| j                  d      xs | j                  d      }||v rd| S |dk(  rdS |dk(  rdS |S )	Nz"\bfnrtu      \xz\u00
 )group)matchJSON_PASSTHROUGH_ESCAPESescapes      r   process_escapez"js_to_json.<locals>.process_escape!   s^    #. Q15;;q>!'+C!C1VH 	 &#W	T>R	 	    c                 |    t        | j                  d            }|d   dk(  rt        j                  |      S |S )Nr   r   r   ")
js_to_jsonr   jsonloads)r   	evaluatedr   varss     r   template_substitutez'js_to_json.<locals>.template_substitute*   s:    u{{1~tFC	Q<3::i((r   c                    | j                  d      }|dv r|S |dv ry|j                  d      s'|j                  d      s|j                  d      s|dk(  ry	|d   	v rF|d   d
k(  rt        j                  d|dd       n|dd }t        j                  d
|      }d| d}|S D ]^  \  }}t        j                  ||      }|st        |j                  d      |      }|j                  d      rd| dc S t        |      c S  |v r 	 st        j                  |          |   S sd| dS t        d|       # t        j                  $ r t        j                  |         cY S w xY w)Nr   )truefalsenull)	undefinedzvoid 0r)   z/*z//!,r   `z(?s)\${([^}]+)}r   z(?s)(")|\\(.)r   :z":zUnknown value: )r   
startswithresubr   intendswithstrr!   r"   JSONDecodeErrordumps
ValueError)mvescapedrregexbaseimiINTEGER_TABLESTRING_QUOTESr   r   r%   r$   s           r   fix_kvzjs_to_json.<locals>.fix_kv0   s   GGAJ))H))\\$1<<#5c9JaSVhQ4= LMaDTWK)+>!BH]^_`ac]dAff-~qAGG9AAH( 	@KE4%#BT*$%JJsO1#Ry?Q?		@ 9JJtAw' Awqc8O?1#.// '' +zz$q'**+s   E +E/.E/c                     t        j                  t        t        j                  t	        | j                  d      xs d                        }|S )Nr   [])r$   )r!   r7   dictr"   r    r   )mobjr<   r$   s     r   
create_mapzjs_to_json.<locals>.create_mapS   s8    JJtDJJz$**Q-2G4d'STUVr   znew Map\((\[.*?\])?\)znew Date\((".+")\)z\g<1>znew \w+\((.*?)\)c                 J    t        j                  | j                  d            S Nr   )r!   r7   r   )r9   s    r   <lambda>zjs_to_json.<locals>.<lambda>Z   s    TZZ
5K r   zparseInt\([^\d]+(\d+)[^\d]+\)z\1zB\(function\([^)]*\)\s*\{[^}]*\}\s*\)\s*\(\s*(["\'][^)]*["\'])\s*\)z(?sx)
        z
|
        z|,(?=zw[\]}])|
        void\s0|(?:(?<![0-9])[eE]|[a-df-zA-DF-Z_$])[.a-zA-Z_$0-9]*|
        \b(?:0[xX][0-9a-fA-F]+|0+[0-7]+)(?:z:)?|
        [0-9]+(?=z:)|
        !+
        )joinr1   r2   )coder$   r   	STRING_RE
COMMENT_RESKIP_RErC   rH   r<   rA   rB   r   r%   s    ``      @@@@r   r    r       se   MLmLLI3J
|5)G$WIS	126G9C	(!,M
!0 !0F 66*J=Dvv+Xt<vv)+KTRvv6tDvv[]bdhi		 		E' #,,39 5 		A 66 		 		E' #,,39 5 	 T r   )*z%d %B %Yz%d %b %Yz%B %d %Yz
%B %dst %Yz
%B %dnd %Yz
%B %drd %Yz
%B %dth %Yz%b %d %Yz
%b %dst %Yz
%b %dnd %Yz
%b %drd %Yz
%b %dth %Yz%b %dst %Y %I:%Mz%b %dnd %Y %I:%Mz%b %drd %Y %I:%Mz%b %dth %Y %I:%Mz%Y %m %dz%Y-%m-%dz	%Y.%m.%d.z%Y/%m/%dz%Y/%m/%d %H:%Mz%Y/%m/%d %H:%M:%Sz
%Y%m%d%H%Mz%Y%m%d%H%M%Sz%Y%m%dz%Y-%m-%d %H:%Mz%Y-%m-%d %H:%M:%Sz%Y-%m-%d %H:%M:%S.%fz%Y-%m-%d %H:%M:%S:%fz%d.%m.%Y %H:%Mz%d.%m.%Y %H.%Mz%Y-%m-%dT%H:%M:%SZz%Y-%m-%dT%H:%M:%S.%fZz%Y-%m-%dT%H:%M:%S.%f0Zz%Y-%m-%dT%H:%M:%Sz%Y-%m-%dT%H:%M:%S.%fz%Y-%m-%dT%H:%Mz%b %d %Y at %H:%Mz%b %d %Y at %H:%M:%Sz%B %d %Y at %H:%Mz%B %d %Y at %H:%M:%Sz%H:%M %d-%b-%Y)z%m-%d-%Yz%m.%d.%Yz%m/%d/%Yz%m/%d/%yz%m/%d/%Y %H:%M:%Siii)UTUTCGMTZASTADTESTEDTCSTCDTMSTMDTPSTPDT)z%d-%m-%Yz%d.%m.%Yz%d.%m.%yz%d/%m/%Yz%d/%m/%yz%d/%m/%Y %H:%M:%Sz%d-%m-%Y %H:%Mz%H:%M %d/%m/%Yc           	         d}t        j                  ||       }|st        j                  d|       }t        j                  |xr |j	                  d      j                               }|| d t        |j	                  d              } t        j                  |xs d      }|| fS | d t        |j	                  d              } |j	                  d      st        j                         }|| fS |j	                  d      dk(  rdnd	}t        j                  |t        |j	                  d
            z  |t        |j	                  d            z        }|| fS )Na  (?x)
            ^.{8,}?                                              # >=8 char non-TZ prefix, if present
            (?P<tz>Z|                                            # just the UTC Z, or
                (?:(?<=.\b\d{4}|\b\d{2}:\d\d)|                   # preceded by 4 digits or hh:mm or
                   (?<!.\b[a-zA-Z]{3}|[a-zA-Z]{4}|..\b\d\d))     # not preceded by 3 alpha word or >= 4 alpha or 2 digits
                   [ ]?                                          # optional space
                (?P<sign>\+|-)                                   # +/-
                (?P<hours>[0-9]{2}):?(?P<minutes>[0-9]{2})       # hh[:]mm
            $)
        +\d{1,2}:\d{1,2}(?:\.\d+)?(?P<tz>\s*[A-Z]+)$tzr   hourssign+r   r.   rf   minutes)rf   ri   )
r1   searchTIMEZONE_NAMESgetr   striplendatetime	timedeltar3   )date_strr<   r9   timezonerg   s        r   extract_timezoners      s?   		A 			!XAIIDhO!%%a&AAGGDM,?,?,AB 4#aggdm"4!45H%%HM: X 0c!''$-001wwv))+H X	 3.1BD))S!122s1779#5668H Xr   c                     | rt         S t        S N)DATE_FORMATS_DAY_FIRSTDATE_FORMATS_MONTH_FIRST)	day_firsts    r   date_formatsry      s    %.!L4LLr   c           	         t        | t              sy t        j                  ddt        j                  dd|             } t        j                  d|       rdnd}t        |       \  }} t        j                  dd|       } t        j                  d	|       }|r| d t        |j                  d
              } t        j                  d|       }|r|j                  d      } t        |      D ]  }t        j                  t              5  t        j                  j                  | |      |z
  t        j                  |      z   }t        j                   |j#                               cd d d        c S  t$        j&                  j)                  |       }|r,t        j                   |      |dz  z   |j+                         z
  S y # 1 sw Y   xY w)Nz\s+ z:(?i)[,|]|(mon|tues?|wed(nes)?|thu(rs)?|fri|sat(ur)?)(day)?r   z(?i)PM   r   z(?i)\s*(?:AM|PM)(?:\s+[A-Z]+)?rc   rd   zT^([0-9]{4,}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{6})[0-9]+$r   re   i  )
isinstancer5   r1   r2   rj   rs   rn   r   ry   
contextlibr   r8   ro   strptimerp   calendartimegm	timetupleemailutilsparsedate_tztotal_seconds)rq   rx   pm_deltarr   r9   
expressiondtr   s           r   unified_timestampr      s   h$vvfc266Er8$U VH YYy(3rH)(3Hh vv7XFH 			@(KA0c!''$-001 			ikstA771:"9- 3
  , 	3""++HjAHLxOaOahpOqqB??2<<>2	3 	33
 ((2Iy)HtO;h>T>T>VVV 	3 	3s   AF;;G	c                       e Zd Zy)
NO_DEFAULTN__name__
__module____qualname__r
   r   r   r   r          r   r   c                        e Zd ZddZd Zd Zy)function_with_reprNc                 "    ||c| _         | _        y ru   )func_function_with_repr__repr)selfr   repr_s      r   __init__zfunction_with_repr.__init__  s    !%u	4;r   c                 &     | j                   |i |S ru   )r   )r   argskwargss      r   __call__zfunction_with_repr.__call__  s    tyy$)&))r   c                     | j                   r| j                   S | j                  j                   d| j                  j                   S )N.)r   r   r   r   r   s    r   __repr__zfunction_with_repr.__repr__	  s:    ;;;;))&&'q)?)?(@AAr   ru   )r   r   r   r   r   r   r
   r   r   r   r     s    -*Br   r   c                 h    | t        |       dk  r| S dD ]  }| d   |k(  s| d   |k(  s| dd c S  | S )Nr   )r   'r   r.   r   rn   )squotes     r   remove_quotesr     sL    yCFQJ Q45=QrUe^Qr7N Hr   c                 r    |dkD  r|dk\  sJ | t        |       ||z   k  r| S | d |dz
    d|r| | d   S d S )N   r   z...r   r   )r   leftrights      r   truncate_stringr     s_    !8
""yCFdUl*	l^3Uq%z;<<;<<r   c                      d  fd}|S )Nc                     | d t         fv ryt        j                  t              5  t	        j
                  |       r
	 d d d        y	 d d d        | S # 1 sw Y   | S xY wrJ   JS_Undefinedr~   r   	TypeErrormathisnan)r   s    r   zeroisez_js_bit_op.<locals>.zeroise   sY    |$$  + 	zz!}	 		 	 s   AAc                 4      |        |            dz  S )Nl    r
   )abopr   s     r   wrappedz_js_bit_op.<locals>.wrapped(  s    '!*gaj)J66r   r
   )r   r   r   s   ` @r   
_js_bit_opr     s    7 Nr   c                       fd}|S )Nc                 P    t         | |fv rt        d      S  | xs d|xs d      S Nnanr   r   floatr   r   r   s     r   r   z_js_arith_op.<locals>.wrapped/  s.    Aq6!<!&q!&q!!r   r
   r   r   s   ` r   _js_arith_opr   .  s    "
 Nr   c                 `    t         | |fv s| s|st        d      S |r	| xs d|z  S t        d      S )Nr   r   infr   r   r   s     r   _js_divr   7  s5    1va1U|AFa<.%,.r   c                 B    t         | |fv s|st        d      S | xs d|z  S r   r   r   s     r   _js_modr   =  s(    1vQU|Fa<r   c                 D    |syt         | |fv rt        d      S | xs d|z  S )Nr   r   r   r   r   s     r   _js_expr   C  s,    	!Q	U|Fq=r   c                       fd}|S )Nc                 B    | |hd t         hk  r	 | |       S  | |      S ru   r   r   s     r   r   z_js_eq_op.<locals>.wrappedL  s*    q6dL))a8O!Qxr   r
   r   s   ` r   	_js_eq_opr   K  s    
 Nr   c                       fd}|S )Nc                     t         | |fv ryt        | t              st        |t              r# t        | xs d      t        |xs d            S  | xs d|xs d      S )NFr   )r   r}   r5   r   s     r   r   z_js_comp_op.<locals>.wrappedU  sW    Aq6!aAs!3c!&qk3qvA;//!&q!&q!!r   r
   r   s   ` r   _js_comp_opr   T  s    " Nr   c                     | ddddt         fv r|S t        j                  t              5  t	        j
                  |       r|cddd       S 	 ddd       |S # 1 sw Y   |S xY w)z6Simulate JS's ternary operator (cndn?if_true:if_false)FNr   r   r   )cndnif_trueif_falses      r   _js_ternaryr   _  sb    tQL11			Y	' ::d  N Ns   AAr   r   c                     t        t        t              5  t        dt        dt
        dddddd di|    cd d d        S # 1 sw Y   nxY wt        dft        dffD ]  \  }}t        | |      s|c S  t        |       ryy)	Nr*   numberTbooleanFobjectstringfunction)
compat_contextlib_suppressr   KeyErrorr   _NaN	_Infinitycompat_basestringcompat_numeric_typesr}   callable)exprtns      r   
_js_typeofr   q  s    	#Ix	8 +(x)9(
    
H%	x( 1 dAH ~s	   <Ac                       fd}|S )Nc                 Z    t        |       }t        d      |j                  z   |_        |S )NJS_)r   r5   r   )wfr   s     r   update_and_rename_wrapperz+wraps_op.<locals>.update_and_rename_wrapper  s(    1b!Z!**,
r   r
   )r   r   s   ` r   wraps_opr     s     %$r   c                 .     t                fd       }|S )Nc                      |      S ru   r
   )_r   r   s     r   r   z_js_unary_op.<locals>.wrapped  s    !ur   )r   r   s   ` r   _js_unary_opr     s     b\  Nr   ???||&&r   ^&===!====!=<=>=<>z>>z<<)rh   -*%/z**c                     t         S ru   r   )r   s    r   rK   rK     s    < r   )voidtypeof>   r   r  r   r   r   r   r   r   z[a-zA-Z_$][\w$]*z()z{}rE   z'"/z&[^[\]]+(?:\[[^[\]]+(?:\[[^\]]+\])?\])?c                       e Zd Zy)r   Nr   r
   r   r   r   r     r   r   r   c                       e Zd Zd Zy)JS_Breakc                 0    t         j                  | d       y )NzInvalid break	Exceptionr   r   s    r   r   zJS_Break.__init__  s    41r   Nr   r   r   r   r
   r   r   r  r    s    2r   r  c                       e Zd Zd Zy)JS_Continuec                 0    t         j                  | d       y )NzInvalid continuer  r   s    r   r   zJS_Continue.__init__  s    4!34r   Nr  r
   r   r   r  r    s    5r   r  c                       e Zd Zd Zy)JS_Throwc                 D    || _         t        j                  | d|        y )NzUncaught exception )errorr  r   )r   es     r   r   zJS_Throw.__init__  s!    
4#6qc!:;r   Nr  r
   r   r   r  r    s    <r   r  c                       e Zd Zd Zd Zy)LocalNameSpacec                 `    | j                   D ]  }||v s|||<    y  || j                   d   |<   y rJ   )maps)r   keyvaluescopes       r   __setitem__zLocalNameSpace.__setitem__  s<    YY 	Ee|"c
	 "		!Sr   c                     t        d      )NzDeleting is not supported)NotImplementedError)r   r  s     r   __delitem__zLocalNameSpace.__delitem__  s    !"=>>r   N)r   r   r   r  r"  r
   r   r   r  r    s    "?r   r  c                     t        j                  d|       }|r2|j                  d      |j                  d      |j                  d      fS y)Na  (?x)
            (?P<q1>["\'])use\s+strict(?P=q1);\s*
            (?P<code>
                var\s+(?P<name>[a-zA-Z0-9_$]+)\s*=\s*
                (?P<value>
                    (?P<q2>["\'])(?:(?!(?P=q2)).|\\.)+(?P=q2)
                    \.split\((?P<q3>["\'])(?:(?!(?P=q3)).)+(?P=q3)\)
                    |\[\s*(?:(?P<q4>["\'])(?:(?!(?P=q4)).|\\.)*(?P=q4)\s*,?\s*)+\]
                )
            )[;,]
        rM   namer  )NNN)r1   rj   r   )jscode
global_vars     r   extract_player_js_global_varr'    sQ    
	 J ')9)9&)A:CSCST[C\\\r   c                 t    t        |      \  }}}|r|dz   |z   }| t        j                  d| d    dd|      fS )Nz; zR;\s*if\s*\(\s*typeof\s+[a-zA-Z0-9_$]+\s*===?\s*(["\'])undefined\1\s*\)\s*return\s+r   ;)r'  r1   r2   )argnamesrM   	full_coder&  r   s        r   _fixup_n_function_coder,    sW    3I>J1D 4'RVV]^fgh^i]jjklT  r   c                      e Zd ZdZddej
                  ej                  ej                  ej                  ddZ	ddZ
 G d d	e      Zd
 Zed        Zedd       Zedd       Zd ZddZd Zd ZddZd Zd Zd Zd Zd Zd Zd Zd Zy)JSInterpreterr   i   i   i   )dgr@   r9   r   uyNc                 D    |i c| _         | _        |i | _        y || _        y ru   )rM   
_functions_objects)r   rM   objectss      r   r   zJSInterpreter.__init__  s#    %)2"	4?%o7r   c                         e Zd Zd fd	Z xZS )JSInterpreter.Exceptionc                 p    | |j                          dt        |dd       }t        |   |g|i | y )Nz in: 2   )rstripr   superr   )r   msgr   r   r   	__class__s        r   r   z JSInterpreter.Exception.__init__  s@    eOD"b,I+JKGS24262r   ru   )r   r   r   r   __classcell__)r>  s   @r   r  r8    s    	3 	3r   r  c                     | xj                   dz  c_         d| j                    }t        |      r*t        |t              st        |d| j                    d      }|||<   |S )Nr   __pytubefix_jsinterp_objF<r  )$_JSInterpreter__named_object_counterr   r}   r   )r   	namespaceobjr$  s       r   _named_objectzJSInterpreter._named_object  sa    ##q(#)$*E*E)FGC=C1C!D$SBt/J/J.K1*MNC	$r   c                     d}|s||fS t        |      D ]'  \  }}|| j                  vr n|| j                  |   z  }) ||dz   d  fS )Nr   r   )	enumerate	_RE_FLAGS)clsr   flagsidxchs        r   _regex_flagszJSInterpreter._regex_flags'  sd    $;  	'GC&S]]2&&E	' d378n$$r   c              #     K   d}| sy t         j                         D ci c]  }|d }}dddt        |      dz
  f\  }}}}	d\  }
}}}t        |       D ]  \  }}|
s|t         v r|t         |   xx   dz  cc<   nI|
s||v r||   r>||xx   dz  cc<   n0|s.|t        v r|
|d fv r|
s|s|dk7  r|
r|sd n|}
n|
dk(  r	|dv r|dk(  }| xr	 |
xr |dk(  }|
 xr | xr
 |d	vxr |d
v }|
s||v r|n|j                         xr |}|||   k7  st        |j                               s|
s|rd}||	k7  r|dz  }| |||	z
    |dz   d}}|dz  }|s||k\  s n | |d   y c c}w w)Nz+-*/%&|^=<>!,;{}:[r   r   )NFTFr  rE   [r   TFz-+)_MATCHING_PARENSvaluesrn   rH  _QUOTESisspaceany)r   delim	max_splitOP_CHARSkcountersstartsplitspos	delim_lenin_quoteescapingafter_opin_regex_char_grouprL  charin_unary_ops                    r   	_separatezJSInterpreter._separate2  s    '"2"9"9";<QAqD<<()1aUa(?%vsI<T9(H&9"4 	IC(8 8)$/0A50$("2D>TNa'N7?xD$<'?8ts{+3<O4UY_*.#+'#|AATT\H'< N0C,C N'}<NAE $,1AtId\dHuSz!S):%;x;	!qucIo..q!3EaKFVy0;	< 56lC =s   E!
ED"E!E!E!c                     ||xr t         |d      }t        | j                  ||d            }t        |      dk  r| j	                  d| |      |d   dd  j                         |d   j                         fS )Nr   r   r   zNo terminating paren )rR  listrf  rn   r  rm   )rJ  r   rW  	separateds       r   _separate_at_parenz JSInterpreter._separate_at_parenZ  s    =6-d1g6EtUA67	y>A--"7w ?FF|AB%%'1););)===r   c           	      f   |dv r|dk(  t        |      z  r5|S |dk(  r|d t        fvr$|S |dk(  rt        |g| j                  |dd       }| j                  |||      }t        j                  |      s|S 	 t	        |   ||      S # t        $ r"}| j                  d|d| d|||	      d }~ww xY w)
N)r   r   r   r   r   r/   r   zFailed to evaluate r{   cause)r   r   rf  interpret_expression
_OPERATORSrl   r  )	r   r   left_val
right_exprr   
local_varsallow_recursion	right_valr  s	            r   	_operatorzJSInterpreter._operatorc  s    d
k(334Zl333Y$XSz3PQ0RSJ--j*oV	~~b!	gb>(I66 	g..#6xl!B4q!VX\de.ff	gs   6B 	B0B++B0c                     |dk(  rt        |      S 	 t        |t              r|t        |         S ||   S # t        $ r2}|rt
        cY d }~S | j	                  d| t        |      |      d }~ww xY w)NlengthzCannot get index rl  )rn   r}   rh  r3   r  r   repr)r   rE  rL  allow_undefinedr  s        r   _indexzJSInterpreter._indexv  st    (?s8O	P$.sD$93s3x=Gs3xG 	P##..#4SE!:DIQ.OO	Ps$   5 5 	A0A+A0 A++A0c                 p    	 t        j                  |      S # t        $ r | j                  ||      cY S w xY wru   )r!   r7   r   rF  )r   rE  rD  s      r   _dumpzJSInterpreter._dump  s7    	6::c?" 	6%%i55	6s    55c           	         t         D ]  }t        | j                  ||            }|j                         }	 |dv r2t	        |      dkD  r$|d   j                         s|j                          n|r|dk(  r|j                  d      sn"| | }|dk7  r|j                          | | }q|s| j                  |j                  |      ||      }| j                  ||||||      dfc S  y )NTz?<>*-r   r.   r   r   r  )
_ALL_OPERATORSrh  rf  poprn   rm   r0   rn  rL   ru  )r   r   rr  rs  r   ri  rq  rp  s           r   handle_operatorszJSInterpreter.handle_operators  s      	eBT^^D"56I"J=S^a%7	"@S@S@UMMO#c	j6K6KC6P "tJ<0
9$-MMO#4RD!EJ  001CZQ`aH>>"h
D*o^`ddd	er   c                 #   789:;<= dk  r j                  d      dz  d}t         j                  |d            xs dg}|j                         j	                         x:}|D ]   } j                  |      \  }}|s||fc S  t        j                  d|      }|rj|t        |j                  d            d  j	                         :|j                  d      rt         j                  :            |j                  d	       }:sd |fS :d   t        v r j                  ::d   d      \  }	}
:d   d
k(  r j                  |
      \  }}
|	 d
| }	n't        j                  t!        |	 :d    d            }	|
s|	|fS  j#                  |	      |
z   ::j%                  d      r:dd  }|j%                  d      rm j'                  |dd        \  }}t)         j                  |      d      }| j                  d|:       j+                  t-        |dz              |z   :n j                  d| :      :j%                  d      r j                  :dd        }d |fS t.        D ]K  }:j%                  |      s:t        |      d  }|r|d   dk7  r. j1                  :      }|sD|d   |fc S  :j%                  d      r j'                  :      \  }	}
 j                  |	      D cg c],  }t         j                  |j	                         dd            . }}t3        d |D              r fd9t5        9fd|D              |fS  j                  |	      \  }	}|
r|r|	|xs |fS  j+                  |	      |
z   ::j%                  d      rK j'                  :      \  }	}
 j                  |	      \  }	}|
r|r|	|xs |fS  j+                  |	      |
z   ::j%                  d      rY j'                  :      \  }	}
 j#                   j                  |	      D cg c]  } j                  |       c}      }||
z   :t        j                  d:      }|r|j7                         ni }|j9                  d      r j'                  :|j;                         dz
  d        \  }::j%                  d      r j'                  :      \  }:n j'                  d:dd      \  }:d }t        j                  d :      }|r( j'                  :|j;                         dz
  d        \  }:t=         j                  |            } j                  |r|n|      \  }}|r|dfS |j9                  d!      ri j'                  :|j;                         dz
  d        \  }:d }	  j                  |      \  }}|r|dfS 	 d"}t        j                  d#t>         d$:      }|r j'                  :|j;                         dz
  d        \  }:|rii } |j                  d%      r0tA        |t              r|jB                  n|| |j                  d%      <   jE                  |       } d  j                  ||       }}t        j                  d&:      }|rD j'                  :|j;                         dz
  d        \  }: j                  |      \  }}|r|dfS |\  }}|r|dfS |rC||j9                  d'      r, j'                  :|j;                         dz
  d        \  }!}"|"j%                  d      r j'                  |"      \  }#:ndt        j                  d(|"      }$|$rG j'                  |"|$j;                         dz
  d        \  }%}" j'                  |"d)      \  }#:d*|%d+|#d)}#n|"dc}#: j                  |!d      \  }&}}' j                  |&       	 t=         j                  |            sn5	  j                  |#      \  }}|r|dfS 	  j                  |'       P|j9                  d,      r j'                  :|j;                         dz
  d        \  }%}" j                  |%      }% j'                  |"d)      \  }#:|#jK                  d-d.      jM                  d/      dd  }(d0D ]y  })d}*|(D ]l  }d1  j                  |dd      D        \  }+}|)r
|*xs |+d2k(  }*n|*s|+d2k7  xr |% j                  |+      k(  }*|*sN	  j                  |      \  }}|r|c c S n |*sy n |r j                  :      \  }}||xs |fS t         j                  :            }t        |      dkD  r)|D ]   } j                  |      \  }}|s|dfc S  dfS d3t>         d4tN         d5d6jQ                  tS        t        jT                  tW        tX              tZ        z
               d7},t        j                  |,:      }|rbj9                  |j                  d8            }-|j                  d9      s\ j]                  |j                  d:      |-|j                  d;      :      |j                  d8      <   |j                  d8         |fS |-d t^        fv r$ j                  d<|j                  d8       :       j                  |j                  d9            }.tA        |.t,        t`        f      s j                  d=|. d>:      t-        |.      }. j]                  |j                  d:       jc                  |-|.      |j                  d;      :      |-|.<   |-|.   |fS t        jd                  d?t>         d@t>         dA:      D ]  }|j                  dB      xs |j                  dC      }/|jg                         \  }&}0|j                  dD      xs |j                  dE      }1|/   }|/xx   |1d   dFk(  rdndGz  cc<   |j                  dD      r|/   }:d |&  j+                  |      z   :|0d  z   : :sd |fS t        j                  dHt>         d4tN         d5d6jQ                  tS        t        jT                  tW        tX              tZ        z
               dIt>         dJt>         dKtN         dLt>         dMt>         dN:      }|rt|j                  dO      rbj9                  |j                  d8            }-|j                  d9      s\ j]                  |j                  d:      |-|j                  d;      :      |j                  d8      <   |j                  d8         |fS |-d t^        fv r$ j                  d<|j                  d8       :       j                  |j                  d9            }.tA        |.t,        t`        f      s j                  d=|. d>:      t-        |.      }. j]                  |j                  d:       jc                  |-|.      |j                  d;      :      |-|.<   |-|.   |fS :ji                         rt-        :      |fS :dPk(  r
tG               :dQk(  r
tI               :dRk(  rt^        |fS :dSk(  rta        dS      |fS |r(|j                  dT      r	 |j                  dU         |fS tq        jr                  tt              5  t        j                  t!        :d            |fcd d d        S c c}w c c}w # t         $ r}|}Y d }~	Yd }~ww xY w# tF        $ r Y tH        $ r Y -w xY w# tF        $ r Y  -w xY w# tj        $ r*} jm                  |jn                  d         |fcY d }~S d }~ww xY w# 1 sw Y   nxY w|r[|j                  dV      rJ|j                  dW         }2 j                  |j                  dX            }. jc                  |2|.      |fS  j1                  :      }|r|d   |fS |r|j                  dY      r|j                  d	dZd[      \  =;<;s" j                  |j                  d\            ;:|j;                         d  77j%                  d      r j'                  7      \  7}"nd 7c7}":; fd]878:;< =f	d^}3|"r6 j                   j#                   |3             |"z         \  }}||xs |fS  |3       |fS |r|j                  d_      r|j                  d`      }4 j                  |j                  da            D 5cg c]  }5 j                  |5       nc c}5w }6}5|4v r |4   |6b      |fS |4 jv                  vr jy                  |4       jv                  |4<     jv                  |4   |6b      |fS  j                  dc:|k7  rt{        :dddd      nd |      )eNr   zRecursion limit reachedr   Fr)  r   zJ(?P<var>(?:var|const|let)\s)|return(?:\s+|(?=["\'])|$)|(?P<throw>throw\s+)throwvarr  Tr   znew    zDate(zFailed to parse date i  zUnsupported object zvoid    r{   {r/   c              3   8   K   | ]  }t        |      d k(    yw)r   Nr   )r   sub_exprs     r   r   z4JSInterpreter.interpret_statement.<locals>.<genexpr>  s     F(3x=A%Fs   c                     j                  |      }t        j                  t        |       r| |fS j                  |       |fS ru   )rn  r1   r   _NAME_RE)r  valrs  rr  r   s     r   	dict_itemz4JSInterpreter.interpret_statement.<locals>.dict_item  sI    33C_UCxx#."Cx44S*oVX[[[r   c              3   6   K   | ]  \  }} ||        y wru   r
   )r   rZ  r:   r  s      r   r   z4JSInterpreter.interpret_statement.<locals>.<genexpr>  s     H1IaOHs   (rP  z(?x)
                (?P<try>try)\s*\{|
                (?P<if>if)\s*\(|
                (?P<switch>switch)\s*\(|
                (?P<for>for)\s*\(
                if)rW  zelse\s*{try)NFzcatch\s*(?P<err>\(\s*z	\s*\))?\{errzfinally\s*\{forzswitch\s*\(}zswitch(z){switchzdefault:zcase default:zcase )FTc              3   <   K   | ]  }|j                           y wru   )rm   )r   r@   s     r   r   z4JSInterpreter.interpret_statement.<locals>.<genexpr>X  s     !R!'')!Rs   defaultz(?x)
                (?P<out>z)(?:\[(?P<index>z )\])?\s*
                (?P<op>r   z3)?
                =(?!=)(?P<expr>.*)$
            outindexr   r   z Cannot index undefined variable zList index z must be integerz3(?x)
                (?P<pre_sign>\+\+|--)(?P<var1>z)|
                (?P<var2>z)(?P<post_sign>\+\+|--)var1var2pre_sign	post_signrh   r.   z5(?x)
            (?P<assign>
                (?P<out>z)?
                =(?!=)(?P<expr>.*)$
            )|(?P<return>
                (?!if|return|true|false|null|undefined|NaN)(?P<name>z8)$
            )|(?P<attribute>
                (?P<var>z`)(?:
                    (?P<nullish>\?)?\.(?P<member>[^(]+)|
                    \[(?P<member2>zL)\]
                )\s*
            )|(?P<indexing>
                (?P<in>zH)\[(?P<idx>.+)\]$
            )|(?P<function>
                (?P<fname>z )\((?P<args>.*)\)$
            )assignbreakcontinuer*   NaNreturnr$  indexinginrL  	attributemembernullishmember2c                 8    | sj                   d|       y)z3 assert, but without risk of getting optimized out r{   N)r  )r   r=  r   r  r   s     r   	assertionz4JSInterpreter.interpret_statement.<locals>.assertion  s'    ..F81SE):DAA r   c            	        	 t         t        t        d} j                  | j                  t                    }|t        u rNj
                  vr 	 j                        j
                  <   j
                  j                  t              }r|t        u rt        S j                  |      S j                        D cg c]  }j                  |       }}t        |t              rj                  d      rj                  d      d   j                  d      \  }}} |d        t        |d   |      d|        |dk(  r|^}}nL|d	k(  r2 t!        |      dk(  d
       |\  }} t        |t              d       nj                  d|       ||t         k(  rBdk(  r( |d       dj#                  t%        t&        |            S j                  d       |t        k(  r:dk(  r  t!        |      dk(  d
       |d   |d   z  S j                  d       dk(  rB |d        t!        |      dk(  d       |d   r|j)                  |d         S t        |      S dk(  r@ t        |t              d        t!        |      dk(  d       |d   j#                  |      S dk(  r | d       |j+                          |S dk(  rB t        |t        t         f      d        t!        |      dk  d       |t-        g |d     S dk(  r t        |t              d        |d       t%        t.        |t!        |      gz   d d       \  }}|dk  r|t!        |      z  }|dd  }	g }
t1        |t3        ||z   t!        |                  D ]"  }|
j5                  |j7                  |             $ t9        |	      D ]  \  }}|j;                  ||z   |        |
S dk(  rD t        |t              d        |d       t=        |      D ]  }|j;                  d|        |S dk(  r4 t        |t              d        | d       |sy |j7                         S d k(  r |d       |j?                  |       |S d!k(  rU |d        t!        |      dk  d"       |dgz   d d \  }}t9        |      D cg c]  \  }} ||||fd#|i       c}}S d$k(  r= |d        t!        |      dk  d"       |dgz   d d \  }}	 |jA                  ||      S d&k(  rc t        |t               d'        t!        |      dk(  d       t        |d   t.              r|d   nd}|t!        |      k\  ry tE        ||         S t        |t              rt/              n} ||   |(      S # j                  $ r s Y qw xY wc c}w c c}}w # tB        $ r Y y%w xY w))N)StringMathArrayz
prototype.r   r   ztakes one or more argumentsr   zneeds binding to type callapplyztakes two argumentsz"second argument needs to be a listzUnsupported Function method fromCharCoder   zUnsupported String method powr   zUnsupported Math method splitz&with limit argument is not implementedrL   zmust be applied on a listztakes exactly one argumentreversezdoes not take any argumentsslicez#must be applied on a list or stringztakes between 0 and 2 argumentsspliceunshiftr  pushforEachztakes at-most 2 argumentsthisindexOfr.   
charCodeAtzmust be applied on a stringrs  )#r5   r   rh  rl   r   r5  extract_objectr  r   rz  rf  rn  r}   typer0   	partitionrn   rL   mapchrr  r  r  r3   rangeminappendr  rH  insertreversedextendr  r8   ord)typesrE  r:   argvals
new_memberr   func_prototyper  howMany	add_itemsresr@   itemr   r  rL  r\  rs  arg_strr  r   rr  r  r  r   variables                    r   eval_methodz6JSInterpreter.interpret_statement.<locals>.eval_method  sK    "!!
 !nnXuyy:/NO*$t}}4&6:6I6I(T^6_DMM(3 --++HlCCsl2'' ?;;sFG<<
 "^^G46 --a_M6 6 c4(V->->|-L4:4D4DS4I!4L4V4VWZ4[1J>g'DEjS9=STWSX;YZ%/(/g'72!#g,!"35JK'.W!*Wd";=ab"nn/KNK[-\^bcc'F#:/!'+HI!wws3'899..+EfX)NPTUUE\!#g,!"35JK&qzWQZ77..+CF8)LdSSW$g'DEc'la/1YZ4;AJ399WQZ0MDIMv%jd35PQc'la/1MN"1:??3//y('k+HIKKMJw&jtSk:<abc'la/1RSu4g4t455x'jd35PQg'DE%(w#c(/CRa.H%INE7qyS) 'IC"5#egos3x*HI 3

3775>23#,Y#7 44

519d34Jy(jd35PQg'DE ( 1 ,

1d+,Ju_jd35PQ'k+HI779$v%g'DEJJw'Jy(g'DEc'la/1LM&"~r2GAtbklobpqU^UXZ^AtS#.Pqqy(g'DEc'la/1LM")QC-!!4JC""yye44 |+jc24QRc'la/1MN(271:s(C'!*Cc#h#s3x=(%/T%:c&ks3xII_  $~~ &#* % $+&6` r & "!"s0   W W%W*(W0 W"!W"0	W<;W<r   fnamer   r  zUnsupported JS expression    )>r  rh  rf  r  rm   interpret_statementr1   r   rn   r   r  rn  rT  rN  r!   r"   r    rF  r0   rj  r   r|  r3   _UNARY_OPERATORS_Xr  allrF   	groupdictrl   endr   r  r}   r  	new_childr  r  replacer  _NESTED_BRACKETSrL   r  r   setro  _COMP_OPERATORSru  r   r   rz  finditerspanisdigitr   extract_global_varr   r~   r   r8   r4  extract_functionr   )>r   stmtrr  rs  should_returnsub_statementssub_stmtretr9   innerouterrK  rE  r   r   dater   operand	op_resultr  sub_expressionsshould_abortr  r$  mdr   if_expr	else_exprtry_exprr  r  pending
catch_varsconstructor	remainingbodyswitch_m
switch_valr\  	incrementitemsr  matchedcaseprp  rL  r  r  rg   r  r  r  r:   r  r  r  r  r   r  r  r  s>   ` ``                                                   @@@@@@@r   r  z!JSInterpreter.interpret_statement  s   Q..!:;;1dnnT378@RD$((*0022t& 	*H!%!9!9(JP_!`CM))	*
 HHbdhiAGGAJ()//1Dwwwt88z?[\\ !.M&&7g>>$Q;LE5Aw#~#007u '5'* 

:Qy.A$#OPm++%%j%85@D??6"qr(C~~g&"55c!"g>e(--dJPRWY<..+@)I4PPzz#dTk"2J?%Gnn':3%%@$GG??7#,,T!"Xz?SD&&$ 	3B??2&3r78nGgajC/--dJPI |]22	3 ??32248LE5^b^l^lmr^stRZtDNN8>>3CS!$LMtOtFoFF\ HHH-WW"&":":5*o"^E<Ll;m;;zz%4u<??32248LE5"&":":5*o"^E<Ll;m;;zz%4u<??32248LE5%%j NN5133 ))$
OL33 4D %<DHH 
   Q[[]R66$<00aeegkl1CDJD$s# $ 7 7 = !% 7 7$8HPS 7 TId+A"&"9"9$quuw{|:L"M	4t88z?[\D $ 8 8Y
O!MCDy 66%=!44T!%%'A+,5GHNHdC$($<$<XzSb$c!\9$   $G1(:FMA!%!8!8aeegkl9K!L$!#Jwwu~BLSRZB[SYYad
1775>2!+!5!5j!AJ#')A)A(JXg)hC$/A!%!8!8aeegkl9K!L$$($<$<XzSb$c!\9$ 'CDy 	VVE]%)%<%<T!%%'A+,=O%P"K##C(!44Y?
d88NI>,0,C,CIhlln_`N`NaDb,c)J	!%!8!8C!HJD$/94@D!*BJD$%)^^K%E"E4%%eZI"4#<#<T:#_`(,(@(@zSb(c%C#"Dy( $ )))ZQ  VVH$($;$;D1<N$O!J	22:z?[J00C@JD$LL_=CCGLQRPE( ! D!RT^^D#q5Q!RJD$")">TY->$#'9#4 $r'1T5N5NtU_ap5q'q  " ,0,D,DT:Wf,g)\'#&J ( %(  $ 8 8z? [C555 t~~d34!#+ %$($<$<XzSb$c!\9$% :!
"23C2D ERYYJ/0Q!RST U
 HHQ!~~aggen5H777#-1^^GGDM8QWWV_dJP_.a
1775>*!!''%.1=@@dL11nn'GPUGW%XZ^__++AGGG,<j/ZCcC<0nn{3%7G%H$OOc(C NNt{{8S91776?DR\^moHSMC=-// #//7j 9"#:>?CE 
	KA ''&/4QWWV_CJE377:&>!''+*>DS/CsODGsNq:Owwz" o<$**S*"==ST
JD
	K &&HH !
"23C2D ERYYJ/0Q!RST UE FNJ O!
 ###3"4 5 !z "#* %  !" "!~~aggen5H777#-1^^GGDM8QWWV_dJP_.a
1775>*!!''%.1=@@dL11nn'GPUGW%XZ^__++AGGG,<j/ZCcC<0nn{3%7G%H$OOc(C NNt{{8S91776?DR\^moHSMC=-//\\^t9m++W_*Z-[ ..U]<..1778$I!!''&/2MAA   , 	L::jd;<mK	L 	Lq u433H  d   " 0 $ V  I..qvvay9=HHI	L 	L $QWWT]+C++AGGENJXC;;sC(-77))$
OL	Q<..%()x(K%Hfg2217793EzSbc15578nG!!#&%)%<%<W%E"%)7"B
{J {Jz $($<$<&&z;=AIM%1!\ M9\99"}m33177:&GGG$E $qwwv ?A 00JP A AG A
"(z%(/RTaaadoo-)-)>)>u)E&)4??5)'?SUbbbnn($RV,r2)F\^(_`bfh 	hs   ?1|8|
<|! |: }<}& +"~!	|7*|22|7:	}}}	}#"}#&	~/~~~~%EAE#c                 Z    | j                  |||      \  }}|r| j                  d|      |S )Nz Cannot return from an expression)r  r  )r   r   rr  rs  r  r  s         r   rn  z"JSInterpreter.interpret_expression  s5    !55dJX]..!CTJJ
r   c                     t        j                  dt        j                  |       d| j                        }|j	                  d      }|S )Nzvar\s?z=(?P<val>.*?);r  )r1   rj   r   rM   r   )r   r  r&  rM   s       r   r  z JSInterpreter.extract_global_var  sC    YY		#'~8II

 &r   c           	         d}i }t        j                  dt        j                  |      d|d| j                        }|s| j	                  d|       |j                  d      }t        j                  d|dt        d	|      }|D ]p  }|j                  d
      j                  d      }	t        |j                  d            }
t         | j                  |	|j                  d      g| d|
 d      ||
<   r |S )Nz1(?:[a-zA-Z$0-9]+|"[a-zA-Z$0-9]+"|'[a-zA-Z$0-9]+')z'(?x)
                (?<![a-zA-Z$0-9.])z,\s*=\s*{\s*
                    (?P<fields>(zP\s*:\s*function\s*\(.*?\)\s*{.*?}(?:,\s*)?)*)
                }\s*;
            zCould not find object fieldsz(?x)
                (?P<key>z!)\s*:\s*function\s*\((?P<args>(?:z%|,)*)\){(?P<code>[^}]+)}
            r   r,   r  rM   rB  r  )r1   rj   r   rM   r  r   r  r  r  r   r   build_function)r   objnameglobal_stack_FUNC_NAME_RErE  obj_mr  fields_mr   r*  r$  s              r   r  zJSInterpreter.extract_object  s   P		
 99W%}	6
 II ..#9'!CDDX&;; !(, 	
  	]Awwv,,S1H 0D*###HaggfoMMQSTXSYYZ|]CI	] 
r   c                 l   t        j                  ddt        j                  |      iz  | j                        }|| j	                  d| d      | j                  |j                  d            \  }}|j                  d      j                  d      D cg c]  }|j                          c}|fS c c}w )z @returns argnames, code a  (?xs)
                (?:
                    function\s+%(name)s|
                    [{;,]\s*%(name)s\s*=\s*function|
                    (?:var|const|let)\s+%(name)s\s*=\s*function
                )\s*
                \((?P<args>[^)]*)\)\s*
                (?P<code>{.+})r$  zCould not find JS function "r   rM   r   r,   )	r1   rj   r   rM   r  rj  r   r  rm   )r   funcnamefunc_mrM   r   r   s         r   extract_function_codez#JSInterpreter.extract_function_code  s    " &,RYYx-@$AB II	 >..#?z!KLL))&,,v*>?a#)<<#7#=#=c#BCa	CTIICs   B1c           
          t         | j                  t        g | j                  |      | j                    d| d      S )NrB  r  )r   extract_function_from_coder,  r  rM   )r   r  s     r   r  zJSInterpreter.extract_function  sL    !+D++-C-uTE_E_`hEi-ukoktkt-uv
! 	r   c           
         i }	 t        j                  d|      }|n|j                         \  }}| j                  ||dz
  d        \  }}	| j	                  | | j
                  |j                  d      j                  d      D 
cg c]  }
|
j                          c}
||g|       }|d | |z   |	z   } | j                  |||g| S c c}
w )Nzfunction\((?P<args>[^)]*)\)\s*{r   r   r,   )
r1   rj   r  rj  rF  r  r   r  rm   r  )r   r*  rM   r  rr  rG   r\  
body_startr  r  r   r$  s               r   r  z(JSInterpreter.extract_function_from_code  s    
99?FD| $		E:"55d:>?6KLOD)%%j2Q$2Q2Q$(JJv$6$<$<S$ABqBj31#/31 2D <$&2D  #t""8T:MMM Cs   C
c                 0     | j                  |      |      S ru   )r  )r   r  r   s      r   call_functionzJSInterpreter.call_function  s    .t$$X.t44r   c                 Z     t              xs i gt              i df fd	}|S )Nd   c                     d   j                  t        j                  | d              d   j                  |       t         }	j	                  j                  dd      ||dz
        \  }}|r|S y )Nr   )	fillvaluer   r{   r   )update	itertoolszip_longestr  r  r  )
r   r   rs  	var_stackr  r  r*  rM   r  r   s
         r   resfz*JSInterpreter.build_function.<locals>.resf  sz    O""9#8#84SW#XYO""6*&5I $ 8 8dC9PR[]lop]p qC
 r   )rh  tuple)r   r*  rM   r  r  s   ```` r   r  zJSInterpreter.build_function  s3    L)1bT? # 	 	 r   ru   )r,   N)F)r  )r   r   r   rC  r1   IMSUrI  r   r  rF  classmethodrN  staticmethodrf  rj  ru  rz  r|  r  r  rn  r  r  r  r  r  r  r  r
   r   r   r.  r.    s     TTTTTTTTI;3I 3 % % % %N > >g&P6e$ehN6J"
N5r   r.  )T)r   rQ  )Y__doc__collectionsr~   r  r!   r   operatorr1   ro   email.utilsr   r   	functoolsr   r   r   r    DATE_FORMATSrh  rw   r  rk   rv   rs   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r5   bytesr  
compat_strr   
compat_chrr3   complexr   r   r   r   or_xorand_is_is_noteqnelegeltgtrshiftlshiftaddr2   mulro  r  r  r~  r  rF   ziprR  rT  r  r   r  r  r  r  ChainMapr  r'  r,  r.  r
   r   r   <module>r@     s}         	    $ =  W Wt+Z  -     !  Aaabbbbb l+     	 	<MWB	 	
B 
B=/ U|%L	 #us *
z UG, *%$ 	$ 	$	 HLL	! HLL	! HMM	" 
8<< 
8?? 	)HKK
  	)HKK
  	+hkk
"  	+hkk
"!" X[[	!#$ X[[	!%( 	*X__
%)* 	*X__
%+. 
hll	#	hll	#	hll	#		
;
B /0:& 
 C6J6#56StT234 
< 	 	2y 2
5) 5
<y <	?[)) 	? &V Vr   