
    Ğia                     2   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m	Z	m
Z
mZmZmZ  G d de          Z G d d	e          Z G d
 de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          ZdS )    N   )InfoExtractor   )determine_extformat_fieldint_or_nonestr_or_nonetraverse_objtry_getc                   *    e Zd ZdZd Zd Zd Zd ZdS )GameJoltBaseIEzhttps://gamejolt.com/site-api/c                     |                     di                               ddi            | j        | j        |z   g|R i |d         S )NheadersAcceptzimage/webp,*/*payload)
setdefaultupdate_download_json	_API_BASE)selfendpointargskwargss       ^C:\Users\betacode\Desktop\descargarYoutube\venv\Lib\site-packages\yt_dlp/extractor/gamejolt.py	_call_apizGameJoltBaseIE._call_api   s[    )R((//;K0LMMM"t"4>H#<NtNNNvNNyYY    c                    |                     d          pg g }}|D ]}|                     d          dk    r)|                    |                     |                     D|                     d          pg d}}|D ]A}|                     d          r||d         z  }#|                     d          dk    r|dz  }B|                    |           d                    |          S )Ncontenttype	paragraph text	hardBreak
)getappend_parse_content_as_textjoin)r   r   outer_contentsjoined_contentsouter_contentinner_contentsinner_content_textinner_contents           r   r'   z%GameJoltBaseIE._parse_content_as_text   s   *1++i*@*@*FB+ 
	7 
	7M  ((K77&&t'B'B='Q'QRRR1>1B1B91M1M1SQSUW.N!/ / / $$V,, /&-*??&&"&&v..+==&$.&""#56666yy)))r   c              #   \  K   |                      ddgt                                                    d         d}}|dv }t          j        d          D ]W}|                     d|||rd	nd
|r|n|fz  |d|           }|                    d          s d S t          |dt                    D ]}|d         | 	                    | 
                    |d         |                    t          |                    d          d          |                    d          t          |dt          d          t          |dt                    t          |dt                    |                    d          pd dV  t          |d         d                             d                    }Yd S )Ncomment_sorthot)ie_keyr   )newyour   z"comments/Fireside_Post/%s/%s?%s=%d	scroll_idpagezDownloading comments list page )notecomments))r9   childComments.expected_typeidcomment_content	posted_on  scalevotes)user)display_namenameFr<   get_all)rD   username)rD   image_avatar	parent_id)r=   r"   	timestamp
like_countauthor	author_idauthor_thumbnailparent)_configuration_arg
GameJoltIEr2   	itertoolscountr   r%   r
   dictr'   _parse_jsonr   r	   )	r   post_num_idpost_hash_idsort_byr6   is_scrolledr7   comments_datacomments	            r   _get_commentszGameJoltBaseIE._get_comments(   s     !44^eWU_UfUfUhUh4iijklnp/OA&& 	T 	TD NN4#.:KKF<^IIZ^8` ` #KT#K#K	 + M MM
 !$$Z00 '7[koppp  !$- 77((1B)C\RRT T!,W[[-E-ET!R!R!R")++g"6"6*74Vfq  |A  B  B  B!-g7K[f!g!g!g(4W>Vfq(r(r(r%kk+66>$
 
 
 
 
 
 $M*$=b$A$E$Ek$R$RSSII)	T 	Tr   c           
         |d         }|                      |                    d          pd|d          pi }|                    d          p;|                     |                      |                    d          |                    d }}|                    d          r|                      |                    d          pC|                     d	|                    d
|           |ddd                              d          |d          }|                     |          }|                    d          pi }i dt                                          dddt          |                    d                    pd| d
|d|d|p|d|                    d          d|                    d          p|                    d          d|                    d          dt          |dd           d!d" |                    d#          pg D             d$t          |d%t          &          d't          |                    d'                    d(t          |                    d(          d)*          d+t          |                    d,          d-.          d/t          |                    d0          d-.          d1| 
                    |                    d
          |          }t          |d2t          d3          pi }	g i g }}}
|	                    d4          pg D ]d5                             d6d7          t          d5                                       d8          f\  }}}}|d9k    s|d:k    rG|                     ||d;|<          \  }}|
                    |           |                    |           |d=k    s|d>k    rF|                     |||?          \  }}|
                    |           |                    |           d@|v rV|                    ||                    dA                              dB                              dC          dD           M|
                    ||                    dA                              dB                              dC          dE|v rdFnd dG           |
r+i ||
||t          |	                    dH                    dIS g }|                    d4g           D ]~t          d5                   dJk    sdJ                    d6d7          vr4|                    d         dK                             dL          d)         fdMdND             dO           |r
dPdQi|dR|iS t          |dSt          d3          }|r|                     |          S |S )TNhashlead_content{}FfatalleadStrhas_articlearticle_contentzweb/posts/article/r=   zDownloading article metadataz#Unable to download article metadatar8   errnoterd   articlerD   extractor_key	extractorGameJoltwebpage_urlurlzhttps://gamejolt.com/p/titledescription
display_idsluguploaderrE   rF   uploader_idrI   uploader_urlzhttps://gamejolt.com%s
categoriesc                 0    g | ]}t          |d            S )c                     d                     | d         d         | d                             d          p| d         d                   S )Nz{} - {}	communityrF   channeldisplay_titlerp   )formatr%   )xs    r   <lambda>z7GameJoltBaseIE._parse_post.<locals>.<listcomp>.<lambda>Z   sr    y7G7G+W]H^`abk`l`p`p  rA  aB  aB  a[  FG  HQ  FR  SZ  F[  8\  8\ r   )r   ).0categorys     r   
<listcomp>z.GameJoltBaseIE._parse_post.<locals>.<listcomp>Z   sH     O O O' #8  .\  .\  ]  ] O O Or   communitiestags)r   .r   .marks.attrstagr;   rM   comment_countr   )defaultrL   added_onr@   rA   release_timestamppublished_on__post_extractor)videos.rG   mediaimg_urlfiletyper!   r   zapplication/vnd.apple.mpegurlm3u8mp4)m3u8_idzapplication/dash+xmlmpd)mpd_idimagewidthheightfilesize)r=   ro   r   r   r   z
video-cardnone	format_idro   r   r   r   acodec
view_count)formats	subtitles
thumbnailsr   giffilename.c           	          g | ]w}                     |          ||         |d k    r                     d          nd|d k    r                     d          nd|d k    r                     d          ndddxS )r   r   Nr   r   r   r   )r%   )r   url_keyr   s     r   r   z.GameJoltBaseIE._parse_post.<locals>.<listcomp>   s     F F F rwr{r{  }D  sE  sEF!( >3:i3G3GUYYw///T5<	5I5Ieii111t9@I9M9M		* 5 5 5SW$  F F Fr   )r   mediaserver_urlmediaserver_url_mp4mediaserver_url_webm)r=   rp   r   _typeplaylistentries)embeds.ro   )rW   r%   r'   r   rS   r2   r	   r   r
   r   extract_commentsrV   r   #_extract_m3u8_formats_and_subtitlesextendr   "_extract_mpd_formats_and_subtitlesr&   split
url_result)r   	post_datapost_idra   rq   full_descriptionrg   	user_data	info_dict
video_datar   r   r   	media_urlmimetypeextmedia_idhls_formatshls_subsdash_formats	dash_subsgif_entries	embed_urlr   s                          @r   _parse_postzGameJoltBaseIE._parse_postA   sH   F#''	n(E(E(Mw^c'ddjhj(1i(@(@ )FDD_D_Y]]>::GDDEF EFGK &=='' 	L"../00 R>>"Uy}}T77S7S"U"UW^'EOt  }B " C C DG  DG  HQ  DR  DRu	 / & &O
  $::?KKMM&))/R	
Z..00

 ;y}}U';';<<c@cZa@c@c
 '	

 [
 +:{
 )--//
 	n55Nv9N9N
 9==44
 LE;STT
  O O+4==+G+G+M2O O O
 L\lwy y y
 +immL&A&ABB
  [)G)GQRSSS!
" Y]]:%>%>dKKK#
$  Y]]>-J-JRV!W!W!W%
&  5 5immD6I6I7 S S'
	. ")_DZ_```fdf
)+RJ^^G,,2 	 	E16y1A599ZY[C\C\^klqr{l|^}^}  @E  @I  @I  JP  @Q  @Q  2Q.Ixh:::cVmm(,(P(PQZ\cejt|(P(}(}%X{+++  ****333se||*.*Q*QR[]dmu*Q*v*v'i|,,,  ++++H$$!!"$"YYw//#ii11 %		* 5 5# #     !)$"YYw//#ii11 %		* 5 5(4	(A(Afft         	"&()*..*F*FGG    ]]7B// 	 	EU9-..%775		R\^`HaHa;a;aFmz*0055a8F F F F "oF F F         	 ;   !,BR]glmmm	 	.??9---r   N)__name__
__module____qualname__r   r   r'   r^   r    r   r   r   r      s`        0IZ Z Z* * * T T T2f f f f fr   r   c                      e Zd ZdZddi dddddd	d
dddddddddddgdddgddddddddddd ed!ed"eid#d$d%i dd&d
d'dd(dddddd)ddd*d+dg d,d ed-d.dd/gd0d1dd2d3d4d5d6d7d8dd9d:ed;d<d#d=d>i dd?dddd@d
dAddBddCddDddEddgddFddGddHddGddId ed!ed"ed#dJdKdLdMdMdNdOdPg dQdRdSeedTdUdVdWdXdYigdZd[d\d]d^d_d`d`dadadbdcgdddeeedTdfgZdg ZdhS )irS   z<https?://(?:www\.)?gamejolt\.com/p/(?:[\w-]*-)?(?P<id>\w{8})z`https://gamejolt.com/p/introducing-ramses-jackson-some-fnf-himbo-i-ve-been-animating-fo-c6achnzu cd5f733258f6678b0ce500dd88166d86r=   c6achnzur   r   rr   zIintroducing-ramses-jackson-some-fnf-himbo-i-ve-been-animating-fo-c6achnzurp   ux   Introducing Ramses Jackson, some FNF himbo I’ve been animating for the past few days, hehe.
#fnfmod #fridaynightfunkinrq   rt   Jakeneutronru   rv   z!https://gamejolt.com/@Jakeneutronrw   Friday Night Funkin' - Videosr   fnfmodfridaynightfunkinrL   i9]aupload_date20211006r   i:]arelease_date	thumbnailzre:^https?://.+wgch9mhq.png$rM   r   r   )ro   md5r   z^https://gamejolt.com/p/hey-hey-if-there-s-anyone-who-s-looking-to-get-into-learning-a-n6g4jzpq 79a931ff500a5c783ef6c3bda3272e32XsNA_mzC0q4z5Adobe Animate CC 2021 Tutorial || Part 1 - The Basicsz$md5:9d1ab9e2625b3fe1f42b2a44c67fdd13z'http://www.youtube.com/user/Jakeneutrondurationi  )zAdobe Animate CCTutorial	Animationz
The BasicszFor Beginnersplayable_in_embedT	Educationavailabilitypublicz:https://i.ytimg.com/vi_webp/XsNA_mzC0q4/maxresdefault.webp	age_limitr   live_statusnot_livechannel_urlz8https://www.youtube.com/channel/UC6_L7fnczNalFZyBthUE9oAUC6_L7fnczNalFZyBthUE9oA20211015zcount:18)r{   
channel_idr   r   chaptersz4https://gamejolt.com/p/i-fuckin-broke-chaos-d56h3eue 786c1ccf98fde02c03a2768acb4258d0d56h3euezi-fuckin-broke-chaos-d56h3euezI fuckin broke Chaos.z@I moved my tab durning the cutscene so now it's stuck like this.Jeff____________The_Nyesh_Manz#https://gamejolt.com/@The_Nyesh_Mani]a20211218i
^azre:^https?://.+euksy8bd.png$zahttps://gamejolt.com/p/hello-everyone-i-m-developing-a-pixel-art-style-mod-for-fnf-and-i-vs4gdrd8vs4gdrd8zJhello-everyone-i-m-developing-a-pixel-art-style-mod-for-fnf-and-i-vs4gdrd8z$md5:cc3d8b031d9bc7ec2ec5a9ffc707e1f9QuesoguyCheeseguyDevz"https://gamejolt.com/@CheeseguyDev)zGame Dev - GeneralzArts n' Crafts - CreationszPixel Art - showcasezFriday Night Funkin' - Modsz&Newgrounds - Friday Night Funkin (13+)iaia)r=   rr   rp   rq   rt   ru   rv   rw   rL   r   rM   r   r   dszyjnwiwebmz"gif-presentacion-mejorado-dszyjnwi)r=   r   rp   r   ro   r   r   playlist_countz#https://gamejolt.com/p/gif-yhsqkumq#   yhsqkumqzgif-yhsqkumqGIFDaniilTvmanz!https://gamejolt.com/@DaniilTvmanz2Five Nights At The AGK Studio Comunity - NEWS gameiaia)ro   r   r   c                     |                      |          }|                     d| |          d         }|                     |          S )Nzweb/posts/view/post)	_match_idr   r   )r   ro   r   r   s       r   _real_extractzGameJoltIE._real_extract%  sO    ..%%NN'g''2 228:		***r   N)r   r   r   
_VALID_URLint_TESTSr   r   r   r   rS   rS      s       PJ r1
*
5
 e
   Q	

   W
 
 =
 ?
 ;<
 X23
 
 :
  
 J
 7
  #!
" S#
$ #%
 
	 4 p1
-
L
 A
 	

 =
 E
 5
 
 ```
 #
  
 ;-
 H
 U
 
  :!
" U#
$ %4%"-
 
 
	 < F1
*
5
 9
 ,	

 ^
 *
 ?
 A
 ;<
 
 :
  
 J
 7
 #
  S!
" ##
	 2 sf;A")@e e e#!+ 
 
   = 
  3 8 5( %(?OP#!+ 
 
	 KwFr+ + + + +r   rS   c                       e Zd Zddg fdZdS )GameJoltPostListBaseIEzDownloading post listzUnable to download post listc              #   ~  K   d\  }}|p|                      ||||          d         }|r|D ]}	|                     |	d                   V   |d         d         }|dz  }|                      ||| d| |t          j        d	|d
                                                                        d          }|d S d S )N)r   Nr8   ri   itemsaction_resource_modelr3   r6   r   z page from)scrollDirectionscrollId)r8   ri   data)r   r   jsondumpsencoder%   )
r   r   list_idr8   ri   initial_itemspage_numr6   r  items
             r   _entrieszGameJoltPostListBaseIE._entries-  s     %)g'V]!^!^_f!g 		* F F&&t,C'DEEEEEEb	+.IMHNN'4(A(Ax(A(A7Y]Yc'- )e e Z Z 688	 #   !S\\	   		* 		* 		* 		* 		*r   N)r   r   r   r  r   r   r   r   r   ,  s5        /FPn  A * * * * * *r   r   c                   :    e Zd ZdZdddddddd	ig d
dgZd ZdS )GameJoltUserIEz0https?://(?:www\.)?gamejolt\.com/@(?P<id>[\w-]+)z'https://gamejolt.com/@BlazikenSuperStarr   6116784zS. Blazez$md5:5ba7fbbb549e8ea2545aafbfe22eb03ar=   rp   rq   ignore_no_formats_errorTzskipping formatzNo video formats foundz!Requested format is not availablero   playlist_mincountr   paramsexpected_warningsc                    |                      |          }|                     d| |dd          d         }|                     |                     |                    dd          |d	          pi           }|                     |                     d
| d|dd          t          |                    d                    |                    d          p|                    d          |          S )Nzweb/profile/@zDownloading user infozUnable to download user infor  rD   bio_contentrb   Frc   zweb/posts/fetch/user/@z?tab=activezDownloading user postszUnable to download user postsr=   rE   rF   )r   r   r'   rW   r%   playlist_resultr  r	   )r   ro   user_idr   bios        r   r   zGameJoltUserIE._real_extractL  s   ..%%NN%G%%w5LVt # v vv|~	))Y]]=$??PUVV\Z\^ ^##MMG7GGGRj  mL  M  M	d++,,immN.K.K.dy}}]cOdOdfik k 	kr   Nr   r   r   r   r   r   r   r   r   r  r  <  so        DJ8A
 
 &t
 poo  Fk k k k kr   r  c                   :    e Zd ZdZdddddddd	ig d
dgZd ZdS )GameJoltGameIEz9https?://(?:www\.)?gamejolt\.com/games/[\w-]+/(?P<id>\d+)z,https://gamejolt.com/games/Friday4Fun/655124r   655124z"Friday Night Funkin': Friday 4 Funz$md5:576a7dd87912a2dcf33c50d2bd3966d3r  r  Tr  r  c                 z   |                      |          }|                     d| |dd          d         }|                     |                     |                    dd          |d	          pi           }|                     |                     d
| |dd          ||                    d          |          S )Nzweb/discover/games/zDownloading game infozUnable to download game infor  gamedescription_contentrb   Frc   zweb/posts/fetch/game/zDownloading game postszUnable to download game postsrp   )r   r   r'   rW   r%   r  r  )r   ro   game_id	game_datarq   s        r   r   zGameJoltGameIE._real_extractg  s    ..%%NN+'++W;R\z # | | }CD	11Y]]+@$GGX]^^dbdf f##MM;';;WF^`  A  AY]]7++[: : 	:r   Nr  r   r   r   r!  r!  W  sj        MJ=:A
 
 &t
 poo  F: : : : :r   r!  c                   j    e Zd ZdZdddddddd	d
dddiddddddddiddddddddigddgZd ZdS )GameJoltGameSoundtrackIEz\https?://(?:www\.)?gamejolt\.com/get/soundtrack(?:\?|\#!?)(?:.*?[&;])??game=(?P<id>(?:\d+)+)z7https://gamejolt.com/get/soundtrack?foo=bar&game=657899657899zFriday Night Funkin': Vs Oswaldr=   rp   r   184434mp3zGettin' Lucky (Menu Music)z(re:^https://.+vs-oswald-menu-music\.mp3$i wa20211025)r=   r   rp   ro   r   r   184435z Rabbit's Luck (Extended Version)z0re:^https://.+rabbit-s-luck--full-version-\.mp3$i9wa185228z
Last Strawzre:^https://.+last-straw\.mp3$ia20211102   r   c                     |                      |          }|                     d| |dd          }|                     d |                    d          pg D             |t	          |ddt
          d	
                    S )Nzweb/discover/games/overview/zDownloading soundtrack infoz"Unable to download soundtrack infor  c           
          g | ]}t          |                    d                     t          |                    d                    t          |                    d                    t          |                    d          d          dS )r=   rp   ro   r?   r@   rA   )r=   rp   ro   r   )r	   r%   r   )r   songs     r   r   z:GameJoltGameSoundtrackIE._real_extract.<locals>.<listcomp>  s     %8 %8 %8
 	 dhhtnn-- '!2!233txx//!,TXXk-B-B$!O!O!O	&
 &
 %8 %8 %8r   songs)	microdatarF   ))twitterfbrp   FrG   )r   r   r  r%   r
   r	   )r   ro   r&  game_overviews       r   r   z&GameJoltGameSoundtrackIE._real_extract  s    ..%%4744gDa  lP ' Q Q## %8 %8
 $''006B%8 %8 %8
 :A,02N^isxCz Cz Cz{ { 	{r   Nr  r   r   r   r)  r)  r  s        pJH7
 

 6B%/ * 	
 <J%/ * 	
 %8%/ * 	
%8 E# # #FJ
{ 
{ 
{ 
{ 
{r   r)  c                   \    e Zd ZdZddddddddd	g d
dddddddddd	g d
dgZd ZdS )GameJoltCommunityIEzhttps?://(?:www\.)?gamejolt\.com/c/(?P<id>(?P<community>[\w-]+)(?:/(?P<channel>[\w-]+))?)(?:(?:\?|\#!?)(?:.*?[&;])??sort=(?P<sort>\w+))?z!https://gamejolt.com/c/fnf/videos2   z
fnf/videosr   z$md5:6d8c06f27460f7d35c1554757ffe53c8r  Tplaylistendr  r  r  z https://gamejolt.com/c/youtuberszyoutubers/featuredzYoutubers - featuredz$md5:53e5582c93dcc467ab597bfca4db17d4c           
      t   |                      |                              dddd          \  }}}}|pd|pd}}|                     d| |dd	
          d         }t          |                     d| d| |ddd          d          pi }|                    d          p| d|                    d          p| }|                     |                     |                    d          pd|d          pi           }	|                     |                     d| d| d| |dd          | d| ||	          S )Nr=   rz   r{   sortfeaturedr4   zweb/communities/view/zDownloading community infoz!Unable to download community infor  zweb/communities/view-channel//zDownloading channel infozUnable to download channel infoFrh   rF   z - r|   r%  rb   rc   zweb/posts/fetch/community/z?channels[]=z&channels[]=zDownloading community postsz"Unable to download community posts)	_match_valid_urlgroupr   r
   r%   r'   rW   r  r  )
r   ro   rr   community_idr   rZ   community_datachannel_datarp   rq   s
             r   r   z!GameJoltCommunityIE._real_extract  s   8<8M8Mc8R8R8X8XY]_jluw}8~8~5
L*g(6J8H5G
2L22J-7Z ( \ \\gi $DNNGLGG:GG+5V^c %3 %e %efoq q wtv 	 "%%f--=ss,BRBRSbBcBcBqgqss11^//0EFFN$PZbghhnlnp p##MMh\hhwhh\fhh9;_a a **j**E;	@ @ 	@r   Nr  r   r   r   r<  r<    s         ]J25A
 
 '+
 
 poo  2&+A
 
 '+
 
 poo F8@ @ @ @ @r   r<  c                   |    e Zd ZdZddddZddddd	dd
dg ddddddd	dddddd	dddddd	dgZd Zd ZdS )GameJoltSearchIEz}https?://(?:www\.)?gamejolt\.com/search(?:/(?P<filter>communities|users|games))?(?:\?|\#!?)(?:.*?[&;])??q=(?P<id>(?:[^&#]+)+)z https://gamejolt.com/@{username}zhttps://gamejolt.com/c/{path}z&https://gamejolt.com/games/{slug}/{id})usersr   gamesz,https://gamejolt.com/search?foo=bar&q=%23fnfr=  z#fnfr+  Tr>  r  r  z6https://gamejolt.com/search/communities?q=cookie%20run
   z
cookie run)ro   r  r   z'https://gamejolt.com/search/users?q=mlpi  mlpz*https://gamejolt.com/search/games?q=robloxi  robloxc           	   #     K   |                      d| d| |d| dd| d          }t          |d| d          }|sd S t          d	t          j        ||d
         z            d	z             D ]f}|                      d| d| d| |d| d| d| d          }||         D ]/}|                      | j        |         j        di |          V  0gd S )Nzweb/search/z?q=zDownloading z listzUnable to download r  rU   Countr   perPagez&page=z list page r   )r   r
   rangemathceilr   _URL_FORMATSr}   )	r   queryfilter_modedisplay_queryinitial_search_dataentries_numr7   search_resultsresults	            r   _search_entriesz GameJoltSearchIE._search_entries  sm     "nn1+11%11=2222<dR]<d<d<d - f f ##6KAVAVAVWW 	F!TY{5H5S'STTWXXYY 	W 	WD!^^AkAAeAA4AA=BKBBDBBLtbmLtLtLt , v vN )5 W Woo&Kd&7&D&K&U&Uf&U&UVVVVVVW		W 	Wr   c                 j   |                      |                              dd          \  }}t          j                            |          }|                     |r|                     |||          n:|                     d| ||                     d| |dd          d         	          ||          S )
Nfilterr=   zweb/posts/fetch/search/zweb/search?q=zDownloading initial post listz$Unable to download initial post listr  posts)r  )	rD  rE  urllibparseunquoter  r^  r  r   )r   ro   rX  rW  rY  s        r   r   zGameJoltSearchIE._real_extract  s    !22377==hMMU,,U33##GR tD  ]CCCX\XeXe1%11=PTP^P^+E++]8Bh Q_ Qj QjjqQs Yf Yt Yt =* * 	*r   N)r   r   r   r   rV  r   r^  r   r   r   r   rJ  rJ    s        RJ369 L >
 

 '+
 
 poo  H!
 
  9 
 
  < 
 
 5!FFW W W* * * * *r   rJ  )rT   r  rT  urllib.parserb  commonr   utilsr   r   r   r	   r
   r   r   rS   r   r  r!  r)  r<  rJ  r   r   r   <module>rh     s%             ! ! ! ! ! !               V V V V V] V V Vr+ + + + + + + +D* * * * *^ * * * k k k k k+ k k k6: : : : :+ : : :61{ 1{ 1{ 1{ 1{~ 1{ 1{ 1{h0@ 0@ 0@ 0@ 0@0 0@ 0@ 0@f@* @* @* @* @*- @* @* @* @* @*r   