
    h,R                        S SK r S SKrS SKrS SKrS SKJr  S SKJrJrJ	r	J
r
  S SKJrJr  S SKJrJr  S SKJr  S SKJr  S SKJrJr  S S	KJr   " S
 S\5      r " S S5      r " S S\5      r " S S\\5      r " S S\5      r\" 5       rg)    N)md5)unquote	urldefragurlsplit
urlunsplit)STATICFILES_STORAGE_ALIASsettings)check_settingsmatches_patterns)ImproperlyConfigured)ContentFile)FileSystemStoragestorages)
LazyObjectc                   <   ^  \ rS rSrSrSU 4S jjrU 4S jrSrU =r$ )StaticFilesStorage   z
Standard file system storage for static files.

The defaults for ``location`` and ``base_url`` are
``STATIC_ROOT`` and ``STATIC_URL``.
c                    > Uc  [         R                  nUc  [         R                  n[        U5        [        TU ]  " X/UQ70 UD6  U(       d  S U l        S U l        g g N)r	   STATIC_ROOT
STATIC_URLr
   super__init__base_locationlocation)selfr   base_urlargskwargs	__class__s        T/var/www/html/env/lib/python3.13/site-packages/django/contrib/staticfiles/storage.pyr   StaticFilesStorage.__init__   s]    ++H**Hx =d=f= !%D DM     c                 Z   > U R                   (       d  [        S5      e[        TU ]  U5      $ )NzaYou're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.)r   r   r   path)r   namer    s     r!   r%   StaticFilesStorage.path%   s-    }}&0 
 w|D!!r#   )r   r   NN)	__name__
__module____qualname____firstlineno____doc__r   r%   __static_attributes____classcell__r    s   @r!   r   r      s    !" "r#   r   c                      ^  \ rS rSrSrSrSrSrSrSr	U 4S jr
SS	 jrSS
 jrSU 4S jjrSS jrSS jrSS jrS rS rS rS rS rSrU =r$ )HashedFilesMixin/   zurl("%(url)s")   F)*.js))zS(?P<matched>import(?s:(?P<import>[\s\{].*?))\s*from\s*['"](?P<url>[./].*?)["']\s*;)z import%(import)s from "%(url)s";)zT(?P<matched>export(?s:(?P<exports>[\s\{].*?))\s*from\s*["'](?P<url>[./].*?)["']\s*;)z!export%(exports)s from "%(url)s";)z2(?P<matched>import\s*['"](?P<url>[./].*?)["']\s*;)zimport"%(url)s";)z+(?P<matched>import\(["'](?P<url>.*?)["']\))zimport("%(url)s")))z*.css)z5(?P<matched>url\(['"]{0,1}\s*(?P<url>.*?)["']{0,1}\)))z.(?P<matched>@import\s*["']\s*(?P<url>.*?)["'])z@import url("%(url)s"))zG(?m)^(?P<matched>/\*#[ \t](?-i:sourceMappingURL)=(?P<url>.*)[ \t]*\*/)$z/*# sourceMappingURL=%(url)s */)r5   ))z9(?m)^(?P<matched>//# (?-i:sourceMappingURL)=(?P<url>.*))$z//# sourceMappingURL=%(url)sTc                   > U R                   (       a   U =R                  U R                  4-  sl        [        TU ]  " U0 UD6  0 U l        0 U l        U R                   H  u  p4U H  n[        U[        [        45      (       a  Uu  pVOU R                  n[        R                  " U[        R                  5      nU R
                  R                  U/ 5      R                  Xv45        M     M     g r   )$support_js_module_import_aggregationpatterns&_js_module_import_aggregation_patternsr   r   	_patternshashed_files
isinstancetuplelistdefault_templaterecompile
IGNORECASE
setdefaultappend)	r   r   r   	extensionr8   patterntemplatecompiledr    s	           r!   r   HashedFilesMixin.__init__l   s    44MMdIIKKM$)&)#'==I#gt}55(/%GX#44H::gr}}=)))R8??@TU $ $1r#   c                     Uc  g[        SS9nUR                  5        H  nUR                  U5        M     UR                  5       SS $ )zE
Return a hash of the file with the given name and optional content.
NF)usedforsecurity   )r   chunksupdate	hexdigest)r   r&   contenthasherchunks        r!   	file_hashHashedFilesMixin.file_hash{   sI     ?U+^^%EMM%  &!#2&&r#   c                 v   [        [        U5      5      nUR                  R                  5       nU=(       a,    [        [        U5      5      R                  R                  5       =(       d    UnUS L nU(       a<  U R	                  U5      (       d  [        SU< SU < S35      e U R                  U5      n U R                  XR5      nU(       a  UR                  5         [        R                  R                  U5      u  p[        R                  R                  U5      u  pU(       a  SU-  OSn[        R                  R                  X< U< U
< 35      n[        U5      nXS'   SU;   a  US   (       d  US==   S	-  ss'   [        U5      $ ! [         a    Us $ f = f! U(       a  UR                  5         f f = f)
Nz
The file 'z' could not be found with .z.%s    ?#   ?)r   r   r%   stripexists
ValueErroropenOSErrorrS   closeossplitsplitextjoinr>   r   )r   r&   rP   filenameparsed_name
clean_nameopenedrS   r%   rootexthashed_nameunparsed_names                r!   rl   HashedFilesMixin.hashed_name   sj    wt}- %%++-
I'(*;!<!A!A!G!G!IXjD;;x(( CKTR ))H-	 z;Iz2GG$$X.	+4UY&"	ggll4T9c)JK[)&a 4<a 0!#-((%    s   #F 5F FFF8c                   > [         R                  (       a  U(       d  USpeOI[        U5      u  pv[        U5      R                  R                  S5      (       a  UnOU4nUb  X4-  nU" U6 n[        TU ]  U5      n	SU;   n
U(       d  U
(       aR  [        [        U	5      5      nU(       a  US   (       d  XkS'   U
(       a  US   (       d  US==   S-  ss'   [        U5      n	[        U	5      $ )*
Return the non-hashed URL in DEBUG mode.
rW   /rY      rZ   rX   r[   )r	   DEBUGr   r   r%   endswithr   urlr>   r   r   )r   hashed_name_funcr&   forcer;   rl   fragmentrh   r   	final_urlquery_fragmenturlpartsr    s               r!   _urlHashedFilesMixin._url   s     >>%$("#,T? J
#((11#66""}+O+D.5GK,	 ~HY/0H&hqks""8,Iy!!r#   c                 :    U R                  U R                  X5      $ )rp   )r|   stored_name)r   r&   rw   s      r!   ru   HashedFilesMixin.url   s     yy))477r#   c                 >   ^ ^^^ Tc  T R                   mUUU U4S jnU$ )z:
Return the custom URL converter for the given file name.
c                   > U R                  5       nUS   nUS   n[        R                  " SU5      (       d  UR                  S5      (       a  U$ UR                  S5      (       a&  UR                  [        R
                  5      (       d  U$ [        U5      u  pEU(       d  U$ UR                  S5      (       aF  UR                  [        R
                  5      (       d   eUR                  [        R
                  5      nOa[        R                  S:X  a  TOTR                  [        R                  S5      n[        R                  " [        R                  " U5      U5      nTR                  TR                  [!        U5      ST
S9nSR                  UR#                  S5      SS	 UR#                  S5      S	S -   5      n	U(       a  U	S
U;   a  S
OSU-   -  n	[!        U	5      US'   TU-  $ )z
Convert the matched URL to a normalized and hashed URL.

This requires figuring out which files the matched URL resolves
to and calling the url() method of the storage.
matchedru   z^[a-z]+:z//rq   T)rw   r;   NrY   #)	groupdictr@   match
startswithr	   r   r   removeprefixrb   sepreplace	posixpathre   dirnamer|   _stored_namer   rc   )matchobjmatchesr   ru   url_pathrx   target_namesource_name
hashed_urltransformed_urlr;   r&   r   rG   s             r!   	converter1HashedFilesMixin.url_converter.<locals>.converter   s    ((*Gi(G%.C xxS))S^^D-A-A ~~c""3>>(:M:M+N+N "+3H ""3''**8+>+>????&33H4G4GH ')ffmdbffc9R'nnY->->{-KXV !!$)	 # J "hhs#CR(:+;+;C+@+EEO
 DCKDSH#LL %_5GENg%%r#   )r?   )r   r&   r;   rG   r   s   ```` r!   url_converterHashedFilesMixin.url_converter   s)     ,,H6	& 6	&p r#   c              +     #    U(       a  g0 nU Vs/ s H!  n[        XPR                  5      (       d  M  UPM#     nn0 nU R                  XU5       H.  u  ppX;  d  [        U
[        5      (       a  XU
4v   M(  XU
4Xx'   M0     U Vs0 s H  oUX   _M	     nnSn[        U R                  5       H;  nSnU R                  XU5       H  u  ppXU
4Xx'   U=(       d    UnM     U(       a  M;    O   U(       a  SS[        S5      4v   U R                  R                  U5        UR                  5        Sh  vN   gs  snf s  snf  N7f)a  
Post process the given dictionary of files (called from collectstatic).

Processing is actually two separate operations:

1. renaming files to include a hash of their content for cache-busting,
   and copying those files to the target storage.
2. adjusting files which contain references to other files so they
   refer to the cache-busting filenames.

If either of these are performed on a file, then that file is considered
post-processed.
NFAllz!Max post-process passes exceeded.)r   r:   _post_processr<   	Exceptionrangemax_post_process_passesRuntimeErrorr;   rN   values)r   pathsdry_runoptionsr;   r%   adjustable_pathsprocessed_adjustable_pathsr&   rl   	processed_substitutionsisubsts                  r!   post_processHashedFilesMixin.post_process  sg       #
"T&6t^^&LDU 	 

 &(" 04/A/A\0
+Dy +z)Y/O/O2248y3Q*00
 0@@/?tu{"/?@t334A!M7;7I7I839 59y3Q*0 - 68 != 5 |,OPPP 	  . .44666O
" A, 	7s5   ED6D6AED;AE'A	E0E 1Ec           	   #     #    S n[        XSS9 GH  nSnX   u  pxUR                  U5       n	U R                  U5      n
U R                  U
5      nX;  a  U R	                  XY5      nOX;   n[        U	S5      (       a  U	R                  S5        U R                  U5      nSnXR;   GaD  Un U	R                  5       R                  S5      nU R                  R                  5        HK  u  nn[        UU45      (       d  M  U H+  u  nnU R                  XSU5      n UR                  UW5      nM-     MM     U(       a  U R#                  U5        [%        WR'                  5       5      nU R(                  (       a  U R+                  UU5        U R	                  UU5      nU R                  U5      (       a  U R#                  U5        U R+                  UU5      nU R                  U5      nX:X  a  SnSnU(       d+  U(       d$  SnU R+                  X5      nU R                  U5      nXU'   X\X4v   S S S 5        GM!     g ! [         a  nUS US4v    S nAGNS nAff = f! [          a  nUS US4v    S nAGMo  S nAff = f! , (       d  f       GMu  = f7f)Nc                 R    [        U R                  [        R                  5      5      $ r   )lenrc   rb   r   )r&   s    r!   
path_level2HashedFilesMixin._post_process.<locals>.path_levelO  s    tzz"&&)**r#   T)keyreverseseekr   Fzutf-8)sortedr_   rh   hash_keyrl   hasattrr   r]   readdecodeUnicodeDecodeErrorr:   itemsr   r   subr^   deleter   encodekeep_intermediate_files_save)r   r   r   r;   r   r&   r   storager%   original_filecleaned_namer   rl   hashed_file_existsr   old_hashed_namerP   excrE   r8   rF   rG   r   content_file
saved_names                            r!   r   HashedFilesMixin._post_processM  si    	+ 5$?D M "KMGd#}#t4==6 /"&"2"24"GK"."8K =&11!&&q)%)[[%="!	 +&1O5"/"4"4"6"="=g"F 04~~/C/C/E+	8+D9,??5= 1,0,>,>$(-"	!A.5kk)W.MG 6> 0F *K0#.w~~/?#@L33

;="&"2"24"FK{{;//K0!%K!FJ"&//*"=K&5(- $I  .$(	%)ZZ%K
&*ooj&A *5X&AAC $# @8 . 5"D#u4445 (2 !A*.c5*@$@$@!AC $#sx   +JA;I5)H40I5<I5I)C=I5&J4
I>II5II5
I2I-&I5-I22I55
J	?	Jc                 &    UR                  SS5      $ )N\rq   )r   r   r&   s     r!   rh   HashedFilesMixin.clean_name  s    ||D#&&r#   c                     U$ r    r   s     r!   r   HashedFilesMixin.hash_key  s    r#   c                     [         R                  " U5      nU R                  U5      nU R                  U5      nUR	                  U5      nUc   U R                  U R                  U5      5      nU$ r   )r   normpathrh   r   getrl   )r   r&   r;   r   r   
cache_names         r!   r   HashedFilesMixin._stored_name  se     !!$'t,==.!%%h/
)9)9$)?@Jr#   c           	      j   U R                  U5      nU R                  U5      nU R                  R                  U5      nU(       a  U$ Un[	        U R
                  S-   5       H<  nU R                  U R                  US US95      nXT:X  a  X@R                  U'   Us  $ UnM>     [        SU< SU < S35      e)N   )rP   rf   z
The name 'z' could not be hashed with rV   )rh   r   r;   r   r   r   rl   r^   )r   r&   r   r   r   intermediate_namer   s          r!   r   HashedFilesMixin.stored_name  s    t,==.&&**84
 t33a78A  t>O PJ !..8!!(+!! %/! 9 tTUUr#   )r:   r;   r   r(   )FN)F)r)   r*   r+   r,   r?   r   r7   r9   r8   r   r   rS   rl   r|   ru   r   r   r   rh   r   r   r   r.   r/   r0   s   @r!   r2   r2   /   sv    ++0(.*6H8 #V	' )D">8?B=7~KBZ'
V Vr#   r2   c                   d   ^  \ rS rSrSrSrSrSrSS.U 4S jjrS	 r	S
 r
U 4S jrS rS rSrU =r$ )ManifestFilesMixini  1.1zstaticfiles.jsonTFN)manifest_storagec                v   > [         TU ]  " U0 UD6  Uc  U nXl        U R                  5       u  U l        U l        g r   )r   r   r   load_manifestr;   manifest_hash)r   r   r   r   r    s       r!   r   ManifestFilesMixin.__init__  s@    $)&)## 0040B0B0D-4-r#   c                      U R                   R                  U R                  5       nUR                  5       R	                  5       sS S S 5        $ ! , (       d  f       g = f! [
         a     g f = fr   )r   r_   manifest_namer   r   FileNotFoundError)r   manifests     r!   read_manifest ManifestFilesMixin.read_manifest  sS    	&&++D,>,>?8}}--/ @??  		s.   %A  A	A  
AA  A   
A-,A-c                 Z   U R                  5       nUc  0 S4$  [        R                  " U5      nUR                  S5      nUS;   a$  UR                  S0 5      UR                  SS5      4$  [        SU R                  < SU R                  < S35      e! [        R                   a     N>f = f)	NrW   version)z1.0r   r   hashzCouldn't load manifest 'z' (version ))r   jsonloadsr   JSONDecodeErrorr^   r   manifest_version)r   rP   storedr   s       r!   r    ManifestFilesMixin.load_manifest  s    $$&?r6M	GZZ(F jj+G.(zz'2.

620FFF )!!4#8#8:
 	
 ## 		s   B B*)B*c              /      >#    0 U l         [        TU ]  " U0 UD6 S h  vN   UR                  S5      (       d  U R	                  5         g g  N,7f)Nr   )r;   r   r   r   save_manifest)r   r   r   r    s      r!   r   ManifestFilesMixin.post_process  sK     7'8888zz)$$  % 	9s   AA-Ac                 V   U R                  S [        [        R                  " [	        U R
                  R                  5       5      5      R                  5       5      5      U l        U R
                  U R                  U R                  S.nU R                  R                  U R                  5      (       a%  U R                  R                  U R                  5        [        R                  " U5      R                  5       nU R                  R                  U R                  [        U5      5        g )N)r   r   r   )rS   r   r   dumpsr   r;   r   r   r   r   r   r]   r   r   r   )r   payloadcontentss      r!   r    ManifestFilesMixin.save_manifest  s    !^^+djj0A0A0G0G0I)JKRRTU
 &&,,&&

   ''(:(:;;!!((););<::g&--/##D$6$6H8MNr#   c                    [        [        U5      5      nUR                  R                  5       nU R	                  U5      nU R
                  R                  U5      nUc?  U R                  (       a  [        SU-  5      eU R                  U R                  U5      5      n[        U5      nXVS'   SU;   a  US   (       d  US==   S-  ss'   [        U5      $ )Nz+Missing staticfiles manifest entry for '%s'rX   rY   rZ   r[   )r   r   r%   r\   r   r;   r   manifest_strictr^   rh   rl   r>   r   )r   r&   rg   rh   r   r   rm   s          r!   r   ManifestFilesMixin.stored_name  s    wt}- %%++-
==,&&**84
## AJN  )9)9$)?@J[)%a 4<a 0!#-((r#   )r;   r   r   )r)   r*   r+   r,   r   r   r   r   r   r   r   r   r   r   r.   r/   r0   s   @r!   r   r     sG    &MO#/3 E E
"!O) )r#   r   c                       \ rS rSrSrSrg)ManifestStaticFilesStoragei  z\
A static file system storage backend which also saves
hashed copies of the files it saves.
r   N)r)   r*   r+   r,   r-   r.   r   r#   r!   r   r     s    
 	r#   r   c                       \ rS rSrS rSrg)ConfiguredStoragei  c                 (    [         [           U l        g r   )r   r   _wrapped)r   s    r!   _setupConfiguredStorage._setup  s     !:;r#   )r  N)r)   r*   r+   r,   r  r.   r   r#   r!   r  r    s    <r#   r  ) r   rb   r   r@   hashlibr   urllib.parser   r   r   r   django.confr   r	    django.contrib.staticfiles.utilsr
   r   django.core.exceptionsr   django.core.files.baser   django.core.files.storager   r   django.utils.functionalr   r   r2   r   r   r  staticfiles_storager   r#   r!   <module>r     s     	  	  A A ; M 7 . A ."* ">RV RVjJ)) J)Z	!35G 	<
 <
 () r#   