
    -Ph6s                    f   U d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZmZmZ dd	lmZmZmZmZmZ dd
lmZ ddlmZmZm Z m!Z! ddlm"Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 er@ddl9m:Z:m;Z; ddlm<Z<m=Z=m>Z> ddl2m?Z? ddl@mAZA ddlBmCZC ddlDmEZE ddlFmGZG eHdeIeJf         ZKdeLd<    G d de	          ZM e1jN        eO          ZP ejQ        d           ZRd!d"iZSdZTd#ZUd$ZV G d% d&e+          ZW G d' d(e/          ZX G d) d*e          ZY G d+ d,          ZZ G d- d.e          Z[ G d/ d0e          Z\ G d1 d2e          Z]dRd9Z^dSd>Z_ G d? d@e          Z`dTdEZa G dF dGe          ZbdUdKZcdVdOZddWdQZedS )Xz$The CheckExternalLinksBuilder class.    )annotationsN)StrEnum)
HTMLParser)PriorityQueueQueue)Thread)TYPE_CHECKING
NamedTuplecast)quoteunquoteurlparseurlsplit
urlunparse)nodes)ConnectionError	HTTPErrorSSLErrorTooManyRedirects)Timeout)darkgray	darkgreenpurplered	turquoise)DummyBuilder)__)SphinxPostTransform)loggingrequests)
encode_uri)rfc1123_to_epoch)get_node_line)CallableIterator)AnyLiteral	TypeAlias)Response)Sphinx)Config)_StrPath)ExtensionMetadata_Statusr(   _URIPropertiesc                  .    e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
r.   brokenignoredzrate-limited
redirectedtimeout	uncheckedunknownworkingN)__name__
__module____qualname__BROKENIGNOREDRATE_LIMITED
REDIRECTEDTIMEOUT	UNCHECKEDUNKNOWNWORKING     Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sphinx/builders/linkcheck.pyr.   r.   1   s6        FG!LJGIGGGGrD   z([a-z]+:)?//Acceptz/text/html,application/xhtml+xml;q=0.9,*/*;q=0.8   g      N@c                  T    e Zd ZdZdZ ed          ZddZddZdd
Z	ddZ
ddZdS )CheckExternalLinksBuilderz!Checks for broken external links.	linkcheckzCLook for any errors in the above output or in %(outdir)s/output.txtreturnNonec                X    d| _         d| _        i | _        t          j        d           d S )Nr   g      @)broken_hyperlinkstimed_out_hyperlinks
hyperlinkssocketsetdefaulttimeout)selfs    rE   initzCheckExternalLinksBuilder.initO   s0    !"$%!02 %%%%%rD   c                   t          | j                  }t                              d           | j        dz  }| j        dz  }t          |dd          5 | _        t          |dd          5 | _        |                    | j	                  D ]}| 
                    |           	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   | j        s| j        rd| j        _        d S d S )N z
output.txtzoutput.jsonwzutf-8)encodingrG   )HyperlinkAvailabilityCheckerconfigloggerinfooutdiropentxt_outfilejson_outfilecheckrP   process_resultrN   rO   app
statuscode)rS   checkeroutput_textoutput_jsonresults        rE   finishz CheckExternalLinksBuilder.finishV   sx   .t{;;BkL0kM1cG444	,8<8HcG444	,8<8I!--88 , ,##F++++,		, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, ! 	$T%> 	$"#DH	$ 	$s6   C	-8B2&C	2B6	6C	9B6	:C		CCrh   CheckResultc           	        | j                             |j        d          }|j        }t	          |          |j        |j        |j        ||j        d}| 	                    |           |j        r=|j        t          j        k    r(t                              d|j        |j        d           |j        xxt          j        k    rnxt          j        k    rn n  d S xt          j        k    rC |j        r| d|j         }n|}t                              t!          d          |z              d S xt          j        k    r6 t                              t%          d          | |j         z              d S xt          j        k    r | j        j        r7d	| |j         z   }t                              ||j        |j        f
           nDt/          d	          |z   t/          d|j                   z   }t                              |           |                     t          j        |j        ||j        | d|j                    | xj        dz  c_        d S xt          j        k    r | j        j        r=t                              t7          d          ||j        |j        |j        f
           nDt/          d          |z   t/          d|j                   z   }t                              |           |                     t          j        |j        ||j        | d|j                    | xj        dz  c_        d S xt          j        k    r
 |j        xdk    r d}n)xdk    r d}nxdk    r d}nxdk    r d}ndk    rd}n	 d}||d<   | d|j         }| j        j        r1d| d| }t                              ||j        |j        f
           nP|j        dk    rt@          ntB          } |d          |z    |d|           z   }t                              |           |                     d| |j        ||j        | d|j                    d S t          j"        k    rd}tG          |          d S )NF)filenamelinenostatuscodeurir\   z(%16s: line %4d) T)nonlz: z
-ignored- z
ok        z
timeout   )locationz - rG   zbroken link: %s (%s)z
broken    i-  permanentlyi.  z
with Foundi/  zwith See Otheri3  temporarilyi4  zwith unknown codetextz to z
redirect  zredirected zUnknown status.)$envdoc2pathdocnamerp   strrm   rn   ro   messagewrite_linkstatr.   r@   r[   r\   r=   r<   r   rB   r   r?   rc   quietwarningr   write_entryrO   r;   r   rN   r>   rZ   linkcheck_allowed_redirectsr   r   rA   
ValueError)	rS   rh   rl   res_urilinkstatmsgru   redirectioncolours	            rE   rb   z(CheckExternalLinksBuilder.process_resultf   s   8$$V^U;;* HmmKN4
 4
 	H%%%= 	WV]g.???KK+V^V]QUKVVVm9%%%%%(9(9(9(9(9(9(9(9(9 > "$8888CC!CH\22S899999 Il336R&.6R6RRSSSSS 8> %&G)EV^)E)EECNN3&.&-1PNQQQQl++g5<R&.<R<R8S8SSCKK$$$  ONM22&.22   ))Q.))))8> 	%NN122"(.&-!@	 #     l++g5<R&.<R<R8S8SSCKK$$$  NNM22&.22   &&!+&&&&#####k,,++//,,,,2#' !%;;6>;;;: %@w@@;@@CNN3&.&-1PNQQQQ*0+*<*<YY&F &..866BUBUBU;V;VVCKK$$$  ($((NM44FN44     ' oo% !rD   datadict[str, str | int | _Status]c                    | j                             t          j        |                     | j                             d           d S )N
)r`   writejsondumps)rS   r   s     rE   r{   z(CheckExternalLinksBuilder.write_linkstat   s@    
4 0 0111%%%%%rD   what_Status | strrx   ry   rl   r,   lineintrp   c           
     R    | j                             | d| d| d| d           d S )N:z: [z] r   )r_   r   )rS   r   rx   rl   r   rp   s         rE   r~   z%CheckExternalLinksBuilder.write_entry   sB     	(EETEEdEEcEEEFFFFFrD   NrK   rL   )rh   rj   rK   rL   )r   r   rK   rL   )r   r   rx   ry   rl   r,   r   r   rp   ry   rK   rL   )r8   r9   r:   __doc__namer   epilogrT   ri   rb   r{   r~   rC   rD   rE   rI   rI   I   s        ++DRUVVF& & & &$ $ $ $ _& _& _& _&B& & & &G G G G G GrD   rI   c                  .    e Zd ZdZdZddZddZddZdS )HyperlinkCollector)rJ      kwargsr&   rK   rL   c                    | j                                         D ]/}|                     |          x}r|                     ||           0d S N)documentfindallfind_uri_add_uri)rS   r   noderp   s       rE   runzHyperlinkCollector.run   sW    M))++ 	) 	)DmmD)))s )c4(((	) 	)rD   r   nodes.Element
str | Nonec                :   t          |t          j                  rd|v r|d         S t          |t          j                  r#|d                             d          }|rd|v r|S t          |t          j                  r|                    d          }|rd|v r|S dS )a  Find a URI for a given node.

        This call can be used to retrieve a URI from a provided node. If no
        URI exists for a provided node, this call will return ``None``.

        This method can be useful for extension developers who wish to
        easily inject hyperlinks into a builder by only needing to override
        this method.

        :param node: A node class
        :returns: URI of the node
        refuri
candidates?://sourceN)
isinstancer   	referenceimagegetraw)rS   r   rp   s      rE   r   zHyperlinkCollector.find_uri   s     dEO,, 	&4H~% dEK(( 	|$((--C u||
 dEI&& 	((8$$C u||
trD   rp   ry   c                T   t          d| j        j                  }|j        }| j        j        }| j        j                            d|          x}r|}	 t          |          }n# t          $ r d}Y nw xY w||vr/t          ||| j                            |          |          ||<   dS dS )a  Registers a node's URI into a builder's collection of hyperlinks.

        Provides the ability to register a URI value determined from a node
        into the linkcheck's builder. URI's processed through this call can
        be manipulated through a ``linkcheck-process-uri`` event before the
        builder attempts to validate.

        :param uri: URI to add
        :param node: A node class where the URI was found
        rI   linkcheck-process-uriN)r   rc   builderrP   rv   rx   eventsemit_firstresultr#   r   	Hyperlinkrw   )rS   rp   r   r   rP   rx   newurirm   s           rE   r   zHyperlinkCollector._add_uri   s     2DH4DEE'
("X_556MsSSS6 	C	"4((FF 	 	 	FFF	 j  'Wdh//88& JsOOO ! s   A# #A21A2N)r   r&   rK   rL   )r   r   rK   r   )rp   ry   r   r   rK   rL   )r8   r9   r:   buildersdefault_priorityr   r   r   rC   rD   rE   r   r      s\        H) ) ) )
   @     rD   r   c                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )	r   ry   rp   rx   r,   docpathr   rm   Nr8   r9   r:   __annotations__rC   rD   rE   r   r     s7         HHHLLLKKKKKrD   r   c                  6    e Zd ZddZdd	Zdd
ZddZddZdS )rY   rZ   r+   rK   rL   c                    || _         i | _        t                      | _        g | _        t                      | _        |j        | _        t          t          t          j        | j         j                            | _        d S r   )rZ   rate_limitsr   rqueueworkersr   wqueuelinkcheck_workersnum_workerslistmaprecompilelinkcheck_ignore	to_ignore)rS   rZ   s     rE   __init__z%HyperlinkAvailabilityChecker.__init__  sb    13*/''%'3@?? & 804
DK8991
 1
rD   rP   dict[str, Hyperlink]Iterator[CheckResult]c           	   #    K   |                                   d}|                                D ]}|                     |j                  r1t	          |j        |j        |j        t          j        dd          V  M| j	        
                    t          t          |          d           |dz  }d}||k     r&| j                                        V  |dz  }||k     &|                                  d S )Nr   rV   )rp   rx   rm   rn   rz   ro   FrG   )invoke_threadsvaluesis_ignored_urirp   rj   rx   rm   r.   r<   r   putCheckRequestCHECK_IMMEDIATELYr   r   shutdown_threads)rS   rP   total_links	hyperlinkdones        rE   ra   z"HyperlinkAvailabilityChecker.check+  s     #**,, 	! 	!I""9=11 !!!%-$+"?       ->	 J JERRRq [  +//#####AID [   	rD   c                    t          | j                  D ]V}t          | j        | j        | j        | j                  }|                                 | j        	                    |           Wd S r   )
ranger    HyperlinkAvailabilityCheckWorkerrZ   r   r   r   startr   append)rS   _ithreads      rE   r   z+HyperlinkAvailabilityChecker.invoke_threadsD  so    ()) 	( 	(B5T[$+t7G F LLNNNL''''	( 	(rD   c                    | j                                          | j        D ]0}| j                             t	          t
          d           d           1d S NF)r   joinr   r   r   r   )rS   _workers     rE   r   z-HyperlinkAvailabilityChecker.shutdown_threadsL  sY    | 	J 	JGKOOL):DAA5IIII	J 	JrD   rp   ry   boolc                D    t          fd| j        D                       S )Nc              3  B   K   | ]}|                               V  d S r   match).0patrp   s     rE   	<genexpr>z>HyperlinkAvailabilityChecker.is_ignored_uri.<locals>.<genexpr>R  s-      <<c399S>><<<<<<rD   )anyr   )rS   rp   s    `rE   r   z+HyperlinkAvailabilityChecker.is_ignored_uriQ  s(    <<<<T^<<<<<<rD   N)rZ   r+   rK   rL   )rP   r   rK   r   r   )rp   ry   rK   r   )r8   r9   r:   r   ra   r   r   r   rC   rD   rE   rY   rY     s|        

 

 

 

       2( ( ( (J J J J
= = = = = =rD   rY   c                  $    e Zd ZU ded<   ded<   dS )r   float
next_checkzHyperlink | Noner   Nr   rC   rD   rE   r   r   U  s*         rD   r   c                  L    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
S )rj   ry   rp   rx   r   rm   r.   rn   rz   ro   Nr   rC   rD   rE   rj   rj   Z  sF         HHHLLLKKKOOOLLLIIIIIrD   rj   c                  L     e Zd ZdZd  fdZd!dZd"dZd#dZd$dZd%dZ	 xZ
S )&r   z;A worker class for checking the availability of hyperlinks.rZ   r+   r   Queue[CheckResult]r   Queue[CheckRequest]r   dict[str, RateLimit]rK   rL   c                   || _         || _        || _        t          t	          t
          j        |j                            | _        t          t	          t
          j        |j	                            | _
        t          t	          t
          j        |j                            | _        d |j        D             | _        |j        | _        |j        | _        |j        | _        |  |j        | _        |j        | _        |j        | _        |j        | _        |  |j        rt<          j        | _         nt<          j!        | _         |j"        | _"        |j#        | _#        |j$        | _$        tK          j&        tO          t	          t
          j        |j(                                      | _)        tU                      +                    d           d S )Nc                @    g | ]\  }}t          j        |          |fS rC   )r   r   )r   pattern	auth_infos      rE   
<listcomp>z=HyperlinkAvailabilityCheckWorker.__init__.<locals>.<listcomp>z  s;     
 
 
" Z  ),
 
 
rD   )_ignored_redirectsT)daemon),r   r   r   r   r   r   r   linkcheck_anchors_ignoreanchors_ignore linkcheck_anchors_ignore_for_urlanchors_ignore_for_urllinkcheck_exclude_documentsdocuments_excludelinkcheck_authauthlinkcheck_timeoutr4   linkcheck_request_headersrequest_headerslinkcheck_anchorscheck_anchorsr   allowed_redirectslinkcheck_retriesretrieslinkcheck_rate_limit_timeoutrate_limit_timeoutlinkcheck_allow_unauthorized_allow_unauthorized#linkcheck_report_timeouts_as_brokenr.   r;   _timeout_statusr?   
user_agent
tls_verifytls_cacertsr    _Sessiontupler   _sessionsuperr   )rS   rZ   r   r   r   	__class__s        rE   r   z)HyperlinkAvailabilityCheckWorker.__init__f  s    '59
F;<<6
 6
 >B
FCDD>
 >
# 9=
F>??9
 9

 
&,&;
 
 
	
 ,2+C, 	 $*#;F!'!C"4"("E#)#F F5 	3#*>D  #*?D  + +!- )$SV5L%M%MNN
 
 
 	%%%%%rD   c           
     |   	 | j                                         \  }}|| j                                         d S |\  }}}}|d S t	          |          j        }t          j        t                    5  | j	        |         j
        }d d d            n# 1 swxY w Y   |t          j                    k    r]t          j        t                     | j                             t          ||          d           | j                                          |                     |||          \  }}	}
|t$          j        k    r;t(                              t-          d          |z   t-          d          z              n,| j                            t1          |||||	|
                     | j                                          )NTFz-rate limited-   z | sleeping...)r   r   r  closer   netloc
contextlibsuppressKeyErrorr   r   timesleepQUEUE_POLL_SECSr   r   	task_done_checkr.   r=   r[   r\   r   r   rj   )rS   r   r   rp   rx   _docpathrm   r  rn   r\   ro   s              rE   r   z$HyperlinkAvailabilityCheckWorker.run  s    	$$(KOO$5$5!J	 ##%%%-6*C(F{c]])F$X.. A A
 "-f5@
A A A A A A A A A A A A A A A DIKK'' 
?+++Z C CUKKK%%'''!%Wc9!E!EFD$---011C7(CS:T:TT    C&&$PT U UVVVK!!###A 	$s   3BBBrx   ry   rp   r   r   r/   c                   | j         D ]5}|                    |          r| d|j         d}t          j        |dfc S 6t          |          dk    s|                    d          rt          j        ddfS |                    d          sht                              |          rt          j        ddfS |j	        j
        |z                                  rt          j        ddfS t          j        ddfS t          j        dd}}}t          | j                  D ].}|                     ||          \  }}}|t          j        k    r n/|||fS )Nz	 matched z! from linkcheck_exclude_documentsr   )#zmailto:ztel:rV   )zhttp:zhttps:)r  r   r   r.   r<   len
startswithr@   uri_rer   parentexistsrB   r;   rA   r   r  
_check_uri)	rS   rx   rp   r   doc_matcherr\   rn   ro   _s	            rE   r%  z'HyperlinkAvailabilityCheckWorker._check  s     1 	0 	0K  )) 0 2 2)< 2 2 2  a////0 s88q==CNN+CDD=$b!++~~122 	)||C   0("a//!(3.6688 .A-->2q(( %_b!dt|$$ 	 	A!%i!@!@FD$'' ( tT!!rD   r	  r   anchor9Iterator[tuple[Callable[..., Response], dict[str, bool]]]c              #  Z   K   |r|s| j         j        ddifV  | j         j        ddifV  d S )Nallow_redirectsTstream)r  headr   )rS   r	  r1  s      rE   _retrieval_methodsz3HyperlinkAvailabilityCheckWorker._retrieval_methods  sV      
  	@F 	@-$'8$&?????m(D!1111111rD   c           	     z	   |                     d          \  }}}|rW|rU| j        D ]}|                    |          rd} n$| j        D ]}|                    |          rd} nt	          |          }	 |                    d           n# t          $ r t          |          }Y nw xY w| j        D ]\  }}|                    |          r nd }t          || j
                  }	d}
d}dx}}|                     | j        |          D ]\  }}	  |d|||	| j        d|| j        | j        | j        fd5 }|r| j        r|j        r{	 t%          ||          }n-# t&          $ r  t(          j        ddfcY cd d d            c S w xY w|s:t(          j        t/          d	          t1          |          z  dfcd d d            c S d d d            n# 1 swxY w Y   |j        }|j        r|j        d         j        nd }|j                            d
d          }|j         }|                                 ~ n# t>          $ r#}| j         tC          |          dfcY d }~c S d }~wtD          $ r(}t(          j        tC          |          dfcY d }~c S d }~wtF          tH          f$ r}tC          |          }
Y d }~d }~wtJ          j&        $ r(}t(          j        d|j'         |j        fcY d }~c S d }~wtP          $ r}tC          |          }
|dk    r3| j)        rt(          j*        ddfcY d }~c S t(          j        ddfcY d }~c S |dk    rm| +                    ||          x}r?| j,        -                    t]          ||          d           t(          j/        ddfcY d }~c S t(          j        |
dfcY d }~c S |dk    rt(          j        ddfcY d }~c S Y d }~d }~wt`          $ r(}t(          j        tC          |          dfcY d }~c S d }~ww xY wt(          j        |
dfS tc          |          j2        }| j3        4                    |d            |5                    d          |5                    d          k    stm          ||| j7                  rt(          j*        ddfS |t(          j8        ||fS t(          j8        |dfS )Nr(  rV   asciir   )urlr  headersr4   )_user_agent	_tls_infoz!unable to decode response contentr   zAnchor '%s' not foundzRetry-Afterzignored redirect: i  unauthorizedi  Fi  zservice unavailable/rC   )9	partitionr   r   r   r   encodeUnicodeErrorr!   r  _get_request_headersr  r7  r	  r4   r  r  r  okcontains_anchorUnicodeDecodeErrorr.   r<   r;   r   r   status_codehistoryr;  r   r:  raise_for_statusRequestTimeoutr  ry   r   r   r   r    _IgnoredRedirectiondestinationr   r  rB   
limit_rater   r   r   r=   	Exceptionr   r  r   poprstrip_allowed_redirectr
  r>   )rS   rp   r   req_url	delimiterr1  rexr   r   r;  error_messagerG  response_urlretry_afterretrieval_methodr   responsefoundredirect_status_codeerrr   r  s                         rE   r.  z+HyperlinkAvailabilityCheckWorker._check_uri  s   %(]]3%7%7"F 
	% 
	%*  99V$$ FE  6  Cyy)) !# V__F	*NN7#### 	* 	* 	* ))GGG	* #') 	 	GY}}S!!  I 'sD,@AA %''{(,(?(?)
 )
 ]	4 ]	4$fU3%% "# L	 
  !%#0@A      $"4  $3Hf$E$EEE1    ' C !$             %  ' "#: ; ;eFmm K !$'                        4 '28@8HRH$R(44d % '.22="EE"*,0))+++! 9 9 9+SXXq888888888 3 3 3~s3xx222222222#%56    !$C/    O:::O             #C #%%/ A&AAAAAAAAA&~~q@@@@@@@@@ #%%%)__\;%O%OOz ;Z(K(KUSSS&3R:::::::::">=!;;;;;;;;; #%%"?,A1DDDDDDDDD  3 3 3 ~s3xx2222222223 >=!33 '"")VT***   %%)<)<<< ,8NOO = ?B))!-%|5III%|Q66s
  4B
 
B&%B&(H66GEGF2G3H6F0G3H6H6G	H6G	AH66
P IPP+JPP"J77P	K,$P,P9*O#P+O9PAOPO,P4OPP#P>PPrV  rW  r   float | Nonec                4   t           }d }|ru	 t          |          }t          j                    |z   }nN# t          $ rA 	 t	          |          }|t          j                    z
  }n# t          t
          f$ r Y nw xY wY nw xY wt          |          j        }|i| j        }	 | j	        |         }|j
        }d|z  }||cxk    r|k    rn n|}n# t          $ r
 t           }Y nw xY w||k    rd S t          j                    |z   }t          ||          | j	        |<   |S )Ng       @)DEFAULT_DELAYr   r!  r   r"   	TypeErrorr   r  r  r   delayr   	RateLimit)	rS   rV  rW  ra  r   r  	max_delay
rate_limitlast_wait_times	            rE   rM  z+HyperlinkAvailabilityCheckWorker.limit_ratex  s{   
 	11k** "Y[[50

  	5 	5 	55!1+!>!>J '4EE #I.    D		5 ,''./I&!-f5
 ",!1n,95555~55555%E  & & &%& y  tu,J#,UJ#?#? sD   3 
A>A$A>$A85A>7A88A>=A>C CC)
rZ   r+   r   r   r   r   r   r   rK   rL   r   )rx   ry   rp   ry   r   r   rK   r/   )r	  r   r1  ry   rK   r2  )rp   ry   r   r   rK   r/   )rV  ry   rW  r   rK   r]  )r8   r9   r:   r   r   r   r%  r7  r.  rM  __classcell__r  s   @rE   r   r   c  s        EE1& 1& 1& 1& 1& 1&f!$ !$ !$ !$F" " " "@2 2 2 2Q7 Q7 Q7 Q7f# # # # # # # #rD   r   rp   ry   r  dict[str, dict[str, str]]rK   dict[str, str]c                    t          |           }|j         d|j         |j         d|j         d| df}|D ]}||v ri t          ||         c S i S )Nr   r?  *)r   schemer  DEFAULT_REQUEST_HEADERS)rp   r  r:  r   us        rE   rC  rC    s     3--C:&&#*&&:''#*'''	J  E ED-D1CDDDD  IrD   rY  r)   r1  r   c                   t          |          }|                     dd          D ]I}t          |t                    r|                                }|                    |           |j        r nJ|                                 |j        S )z<Determine if an anchor is contained within an HTTP response.i   T)
chunk_sizedecode_unicode)AnchorCheckParseriter_contentr   bytesdecodefeedrZ  r  )rY  r1  parserchunks       rE   rE  rE    s    v&&F &&$t&LL  eU## 	#LLNNEE< 	E	
LLNNN<rD   c                  ,     e Zd ZdZd fdZdd
Z xZS )rr  z9Specialised HTML parser that looks for a specific anchor.search_anchorry   rK   rL   c                d    t                                                       || _        d| _        d S r   )r  r   rz  rZ  )rS   rz  r  s     rE   r   zAnchorCheckParser.__init__  s,    *


rD   tagr&   attrsc                H    |D ]\  }}|dv r|| j         k    r
d| _         d S d S )N>   idr   T)rz  rZ  )rS   r|  r}  keyvalues        rE   handle_starttagz!AnchorCheckParser.handle_starttag  sF     	 	JCn$$$2D)D)D!
	 	rD   )rz  ry   rK   rL   )r|  r&   r}  r&   rK   rL   )r8   r9   r:   r   r   r  rf  rg  s   @rE   rr  rr    sW        CC            rD   rr  r:  new_urlr
  &dict[re.Pattern[str], re.Pattern[str]]c                b     t           fd|                                D                       S )Nc              3  r   K   | ]1\  }}|                               o|                               V  2d S r   r   )r   from_urlto_urlr  r:  s      rE   r   z$_allowed_redirect.<locals>.<genexpr>  sX        Hf 	s5W 5 5     rD   )r   items)r:  r  r
  s   `` rE   rQ  rQ    sO           1 7 7 9 9     rD   c                  $    e Zd ZU ded<   ded<   dS )rb  r   ra  r   Nr   rC   rD   rE   rb  rb    s'         LLLrD   rb  rc   r*   r   c                    t          |          }|j        dk    rP|j        rI|j                            d          }|s-d|j         }t	          |                    |                    S dS )zRewrite anchor name of the hyperlink to github.com

    The hyperlink anchors in github.com are dynamically generated.  This rewrites
    them before checking and makes them comparable.
    z
github.comzuser-content-)fragmentN)r   hostnamer  r*  r   _replace)rc   rp   parsedprefixedr  s        rE   rewrite_github_anchorr    sq     c]]F,&&6?&?--o>> 	B8v88Hfooxo@@AAA4rD   rZ   r+   rL   c                   | j         j        }t          |                                          D ]\  }}	 t	          j        |          |t	          j        |          <   nO# t          j        $ r=}t                              t          d          |j
        |j                   Y d}~nd}~ww xY w|                    |           # |                    |           w xY wdS )zFCompile patterns in linkcheck_allowed_redirects to the regexp objects.z=Failed to compile regex in linkcheck_allowed_redirects: %r %sN)rZ   r   r   r  r   r   errorr[   r}   r   r   r   rO  )rc   rZ   r   r:  r   excs         rE   #compile_linkcheck_allowed_redirectsr    s    "%*"H8>>@@AA 1 1W
	1;=:g;N;N'
388x 	 	 	NNRSS       	 (++C0000'++C00001 1s/   )ACB*-3B% C%B**CCr-   c           	         |                      t                     |                     t                     |                     dg dt          t          t          h                     |                     dg dt          t          t          h                     |                     di dt          t          h                     |                     dg dt          t          t          h                     |                     di dt          t          h                     |                     dd	dt          t          h                     |                     d
ddt          t          t          h                     |                     dddt          t          h                     |                     dddt          t          h                     |                     ddgdt          t          t          h                     |                     dddt          t          t          h                     |                     dddt          t          t          h                     |                     dddt          t          h                     |                     dddt          t          h                     |                     d           |                     dt          d           ddddS )Nr   rV   )typesr  r   r  r  r  rG   r     r      r  Tr   z^!r   rC   r  g     r@r  Fr  r   zconfig-initedr   )prioritybuiltin)versionparallel_read_safeparallel_write_safe)add_builderrI   add_post_transformr   add_config_value	frozensetr   r  dictr   r   r   	add_eventconnectr  )rc   s    rE   setupr    s   OO-...-...+R9dE];S;STTT%r2Ye}5M5M     6BiQUPVFWFWXXX)2rD%=9Q9QRRR4b"ItfDUDUVVV,a9cU;K;KLLL,b"Iucl<S<STTT,a9cU;K;KLLL,dBi>O>OPPP "TFBiu6N6N     *B)T5M:R:R     &rE3<9P9P     &rD69J9J     -ub	4&@Q@Q     MM)***KK!DsKSSS "#  rD   )rp   ry   r  rh  rK   ri  )rY  r)   r1  ry   rK   r   )r:  ry   r  ry   r
  r  rK   r   )rc   r*   rp   ry   rK   r   )rc   r*   rZ   r+   rK   rL   )rc   r*   rK   r-   )fr   
__future__r   r  r   r   rQ   r!  enumr   html.parserr   queuer   r   	threadingr   typingr	   r
   r   urllib.parser   r   r   r   r   docutilsr   requests.exceptionsr   r   r   r   r   rJ  sphinx._cli.util.colourr   r   r   r   r   sphinx.builders.dummyr   sphinx.localer   !sphinx.transforms.post_transformsr   sphinx.utilr   r    sphinx.util._urir!   sphinx.util.http_dater"   sphinx.util.nodesr#   collections.abcr$   r%   r&   r'   r(   r)   sphinx.applicationr*   sphinx.configr+   sphinx.util._pathlibr,   sphinx.util.typingr-   r  ry   r   r/   r   r.   	getLoggerr8   r[   r   r+  rm  r   r#  r_  rI   r   r   rY   r   rj   r   rC  rE  rr  rQ  rb  r  r  r  rC   rD   rE   <module>r     s=   * * * " " " " " "      				         " " " " " " & & & & & & & &       2 2 2 2 2 2 2 2 2 2 G G G G G G G G G G G G G G                  : 9 9 9 9 9 O O O O O O O O O O O O O O . . . . . .       A A A A A A ) ) ) ) ) ) ) ) ' ' ' ' ' ' 2 2 2 2 2 2 + + + + + + ;22222222..........!!!!!!))))))$$$$$$------444444 %ic&9 :N::::    g    
	8	$	$ 
N	#	# ?   EG EG EG EG EG EG EG EGPC C C C C, C C CL    
   4= 4= 4= 4= 4= 4= 4= 4=n         :      
    *   x x x x xv x x xv	   $   "    
           
   
   1 1 1 1"- - - - - -rD   