Skip to content

Commit a9ae38d

Browse files
zzzyxwvutchrisbra
authored andcommitted
runtime(java): Recognise all available standard doclet tags
* Complement the tag set with @SPEC, {@systemProperty}, {@summary}, @provides, @uses, @hidden, and {@index}. * Do not hoard all tags under a single highlighting group. * Skip over nested balanced braces in inline tags. * Observe that tag names are case sensitive: both {@docroot} and {@inheritdoc} are valid, whereas {@inheritdoc} and {@docroot} are not. * In the @see tag arguments, allow for: - module name prefixes (e.g. java.base/java.lang.String); - references to arbitrary URI fragments (e.g. ##foo); - matching any tag variation arguments on the next line. * Test directives and tags for Java module declarations. * Enforce the word end for "module-info" candidates. References: https://bugs.openjdk.org/browse/JDK-8226279 (@SPEC) https://bugs.openjdk.org/browse/JDK-8214559 ({@systemProperty}) https://bugs.openjdk.org/browse/JDK-8173425 ({@summary}) https://bugs.openjdk.org/browse/JDK-8160196 (@provides & @uses) https://bugs.openjdk.org/browse/JDK-8073100 (@hidden) https://bugs.openjdk.org/browse/JDK-8044243 ({@index}) https://docs.oracle.com/en/java/javase/21/docs/specs/javadoc/doc-comment-spec.html https://github.com/openjdk/jdk/blob/jdk-21-ga/src/jdk.compiler/share/classes/com/sun/source/doctree/DocTree.java closes: #15652 Signed-off-by: Aliaksei Budavei <[email protected]> Signed-off-by: Christian Brabandt <[email protected]>
1 parent 5084036 commit a9ae38d

15 files changed

Lines changed: 416 additions & 142 deletions

runtime/syntax/java.vim

Lines changed: 91 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
" Maintainer: Aliaksei Budavei <0x000c70 AT gmail DOT com>
44
" Former Maintainer: Claudio Fleiner <[email protected]>
55
" Repository: https://github.com/zzzyxwvut/java-vim.git
6-
" Last Change: 2024 Aug 26
6+
" Last Change: 2024 Sep 10
77

88
" Please check :help java.vim for comments on some of the options available.
99

@@ -157,13 +157,20 @@ endif
157157
" testing in a project without attendant confusion for IDEs, with the
158158
" ".java\=" extension used for a production version and an arbitrary
159159
" extension used for a testing version.
160-
if fnamemodify(bufname("%"), ":t") =~ '^module-info\%(\.class\>\)\@!'
160+
if fnamemodify(bufname("%"), ":t") =~ '^module-info\>\%(\.class\>\)\@!'
161161
syn keyword javaModuleStorageClass module transitive
162162
syn keyword javaModuleStmt open requires exports opens uses provides
163163
syn keyword javaModuleExternal to with
164164
hi def link javaModuleStorageClass StorageClass
165165
hi def link javaModuleStmt Statement
166166
hi def link javaModuleExternal Include
167+
168+
if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
169+
syn match javaDocProvidesTag contained "@provides\_s\+\S\+" contains=javaDocParam
170+
syn match javaDocUsesTag contained "@uses\_s\+\S\+" contains=javaDocParam
171+
hi def link javaDocProvidesTag Special
172+
hi def link javaDocUsesTag Special
173+
endif
167174
endif
168175

169176
" Fancy parameterised types (JLS-17, §4.5).
@@ -335,29 +342,99 @@ if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
335342
call s:ReportOnce(v:exception)
336343
endtry
337344

338-
syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag,javaTodo,javaCommentError,javaSpaceError,@Spell fold
339-
exec 'syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle end="\.$" end="\.[ \t\r]\@=" end="\%(^\s*\**\s*\)\@' . s:ff.Peek('80', '') . '<=@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag'
340-
syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*\s*\r\=\n\=\s*\**\s*\%({@return\>\)\@=" matchgroup=javaCommentTitle end="}\%(\s*\.*\)*" contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag
341-
syn region javaDocTags contained start="{@\%(li\%(teral\|nk\%(plain\)\=\)\|inherit[Dd]oc\|doc[rR]oot\|value\)\>" end="}"
342-
syn match javaDocTags contained "@\%(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
343-
syn match javaDocParam contained "\s\S\+"
344-
syn match javaDocTags contained "@\%(version\|author\|return\|deprecated\|serial\%(Field\|Data\)\=\)\>"
345-
syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
346-
syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\%(\k\|\.\)*\%(#\k\+\%((\_[^)]*)\)\=\)\=@ contains=@javaHtml extend
345+
syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,@javaDocTags,javaTodo,javaCommentError,javaSpaceError,@Spell fold
346+
exec 'syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle end="\.$" end="\.[ \t\r]\@=" end="\%(^\s*\**\s*\)\@' . s:ff.Peek('80', '') . '<=@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags'
347+
syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*\s*\r\=\n\=\s*\**\s*\%({@return\>\)\@=" matchgroup=javaCommentTitle end="}\%(\s*\.*\)*" contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags,javaTitleSkipBlock
348+
syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*\s*\r\=\n\=\s*\**\s*\%({@summary\>\)\@=" matchgroup=javaCommentTitle end="}" contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags,javaTitleSkipBlock
349+
" The members of javaDocTags are sub-grouped according to the Java
350+
" version of their introduction, and sub-group members in turn are
351+
" arranged in alphabetical order, so that future newer members can
352+
" be pre-sorted and appended without disturbing the current member
353+
" placement.
354+
" Since they only have significance in javaCommentTitle, neither
355+
" javaDocSummaryTag nor javaDocReturnTitleTag are defined.
356+
syn cluster javaDocTags contains=javaDocAuthorTag,javaDocDeprecatedTag,javaDocExceptionTag,javaDocParamTag,javaDocReturnTag,javaDocSeeTag,javaDocVersionTag,javaDocSinceTag,javaDocLinkTag,javaDocSerialTag,javaDocSerialDataTag,javaDocSerialFieldTag,javaDocThrowsTag,javaDocDocRootTag,javaDocInheritDocTag,javaDocLinkplainTag,javaDocValueTag,javaDocCodeTag,javaDocLiteralTag,javaDocHiddenTag,javaDocIndexTag,javaDocProvidesTag,javaDocUsesTag,javaDocSystemPropertyTag,javaDocSnippetTag,javaDocSpecTag
357+
358+
" Anticipate non-standard inline tags in {@return} and {@summary}.
359+
syn region javaTitleSkipBlock contained transparent start="{\%(@\%(return\|summary\)\>\)\@!" end="}"
360+
syn match javaDocDocRootTag contained "{@docRoot}"
361+
syn match javaDocInheritDocTag contained "{@inheritDoc}"
362+
syn region javaIndexSkipBlock contained transparent start="{\%(@index\>\)\@!" end="}" contains=javaIndexSkipBlock,javaDocIndexTag
363+
syn region javaDocIndexTag contained start="{@index\>" end="}" contains=javaDocIndexTag,javaIndexSkipBlock
364+
syn region javaLinkSkipBlock contained transparent start="{\%(@link\>\)\@!" end="}" contains=javaLinkSkipBlock,javaDocLinkTag
365+
syn region javaDocLinkTag contained start="{@link\>" end="}" contains=javaDocLinkTag,javaLinkSkipBlock
366+
syn region javaLinkplainSkipBlock contained transparent start="{\%(@linkplain\>\)\@!" end="}" contains=javaLinkplainSkipBlock,javaDocLinkplainTag
367+
syn region javaDocLinkplainTag contained start="{@linkplain\>" end="}" contains=javaDocLinkplainTag,javaLinkplainSkipBlock
368+
syn region javaLiteralSkipBlock contained transparent start="{\%(@literal\>\)\@!" end="}" contains=javaLiteralSkipBlock,javaDocLiteralTag
369+
syn region javaDocLiteralTag contained start="{@literal\>" end="}" contains=javaDocLiteralTag,javaLiteralSkipBlock
370+
syn region javaSystemPropertySkipBlock contained transparent start="{\%(@systemProperty\>\)\@!" end="}" contains=javaSystemPropertySkipBlock,javaDocSystemPropertyTag
371+
syn region javaDocSystemPropertyTag contained start="{@systemProperty\>" end="}" contains=javaDocSystemPropertyTag,javaSystemPropertySkipBlock
372+
syn region javaValueSkipBlock contained transparent start="{\%(@value\>\)\@!" end="}" contains=javaValueSkipBlock,javaDocValueTag
373+
syn region javaDocValueTag contained start="{@value\>" end="}" contains=javaDocValueTag,javaValueSkipBlock
374+
375+
syn match javaDocParam contained "\s\zs\S\+"
376+
syn match javaDocExceptionTag contained "@exception\s\+\S\+" contains=javaDocParam
377+
syn match javaDocParamTag contained "@param\s\+\S\+" contains=javaDocParam
378+
syn match javaDocSinceTag contained "@since\s\+\S\+" contains=javaDocParam
379+
syn match javaDocThrowsTag contained "@throws\s\+\S\+" contains=javaDocParam
380+
syn match javaDocSpecTag contained "@spec\_s\+\S\+\ze\_s\+\S\+" contains=javaDocParam
381+
382+
syn match javaDocAuthorTag contained "@author\>"
383+
syn match javaDocDeprecatedTag contained "@deprecated\>"
384+
syn match javaDocHiddenTag contained "@hidden\>"
385+
syn match javaDocReturnTag contained "@return\>"
386+
syn match javaDocSerialTag contained "@serial\>"
387+
syn match javaDocSerialDataTag contained "@serialData\>"
388+
syn match javaDocSerialFieldTag contained "@serialField\>"
389+
syn match javaDocVersionTag contained "@version\>"
390+
391+
syn match javaDocSeeTag contained "@see\>" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTagStar skipwhite skipempty
392+
syn match javaDocSeeTagStar contained "^\s*\*\+\%(\s*{\=@\|/\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3 skipwhite skipempty
393+
syn match javaDocSeeTag1 contained @"\_[^"]\+"@
394+
syn match javaDocSeeTag2 contained @<a\s\+\_.\{-}</a>@ contains=@javaHtml extend
395+
syn match javaDocSeeTag3 contained @["< \t]\@!\%(\k\|[/.]\)*\%(##\=\k\+\%((\_[^)]*)\)\=\)\=@ nextgroup=javaDocSeeTag3Label skipwhite skipempty
396+
syn match javaDocSeeTag3Label contained @\k\%(\k\+\s*\)*$@
397+
347398
syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
348399
syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
400+
349401
exec 'syn region javaDocSnippetTagAttr contained transparent matchgroup=javaHtmlArg start=/\<\%(class\|file\|id\|lang\|region\)\%(\s*=\)\@=/ matchgroup=javaHtmlString end=/:$/ end=/\%(=\s*\)\@' . s:ff.Peek('80', '') . '<=\%("[^"]\+"\|' . "\x27[^\x27]\\+\x27" . '\|\%([.\\/-]\|\k\)\+\)/ nextgroup=javaDocSnippetTagAttr skipwhite skipnl'
350402
syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
351403
syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
352404

353405
syntax case match
354406
hi def link javaDocComment Comment
407+
hi def link javaDocSeeTagStar javaDocComment
355408
hi def link javaCommentTitle SpecialComment
356-
hi def link javaDocTags Special
409+
hi def link javaDocParam Function
410+
411+
hi def link javaDocAuthorTag Special
357412
hi def link javaDocCodeTag Special
413+
hi def link javaDocDeprecatedTag Special
414+
hi def link javaDocDocRootTag Special
415+
hi def link javaDocExceptionTag Special
416+
hi def link javaDocHiddenTag Special
417+
hi def link javaDocIndexTag Special
418+
hi def link javaDocInheritDocTag Special
419+
hi def link javaDocLinkTag Special
420+
hi def link javaDocLinkplainTag Special
421+
hi def link javaDocLiteralTag Special
422+
hi def link javaDocParamTag Special
423+
hi def link javaDocReturnTag Special
424+
hi def link javaDocSeeTag Special
425+
hi def link javaDocSeeTag1 String
426+
hi def link javaDocSeeTag2 Special
427+
hi def link javaDocSeeTag3 Function
428+
hi def link javaDocSerialTag Special
429+
hi def link javaDocSerialDataTag Special
430+
hi def link javaDocSerialFieldTag Special
431+
hi def link javaDocSinceTag Special
358432
hi def link javaDocSnippetTag Special
359-
hi def link javaDocSeeTagParam Function
360-
hi def link javaDocParam Function
433+
hi def link javaDocSpecTag Special
434+
hi def link javaDocSystemPropertyTag Special
435+
hi def link javaDocThrowsTag Special
436+
hi def link javaDocValueTag Special
437+
hi def link javaDocVersionTag Special
361438
endif
362439

363440
" match the special comment /**/
Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1-
>/+0#0000e05#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |u|n|l|e|t|!| |g+0&#5fd7ff255|:+0&#ffffff0|j|a|v|a|_|i|g|n|o|r|e|_|j+0&#ffd7d7255|a|v|a|d|o|c| +0&#ffffff0|g|:|j|a|v|a|_|n|o|_|t|r|a|i|l|_|s|p|a|c|e|_|e|r@1|o|r| +0#0000000&
2-
|/+0#0000e05&@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |u|n|l|e|t|!| |g+0&#5fd7ff255|:+0&#ffffff0|j|a|v|a|_|n|o|_|t|a|b|_|s|p|a|c|e|_|e|r@1|o|r| +0#0000000&@24
3-
|/+0#0000e05&@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| |[|g|:|j|a|v|a|_|s|p|a|c|e|_|e|r@1|o|r|s|,|g|:|j|a|v|a|_|c|o|m@1|e|n|t|_|s|t|r|i|n|g|s|]| |=| |[|1+0#e000002&|,+0#0000e05&|1+0#e000002&|]+0#0000e05&| +0#0000000&
4-
|/+0#0000e05&@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |s+0&#ffd7d7255|e|t|l|o|c|a|l| +0&#ffffff0|s|p|e|l@1| ||| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |j+0&#ffd7d7255|a|v|a|C|o|m@1|e|n|t|S|t|a|r|t| +0&#ffffff0|T+0&#ffd7d7255|o|d|o| +0#0000000#ffffff0@3
5-
@75
6-
@75
7-
@75
8-
@75
9-
|/+0#0000e05&|*@1|/| +0#0000000&|/+0#0000001#ffff4012|*|/+0#0000e05#ffffff0| |*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000001#ffff4012|*| +0#0000e05#ffffff0|/+0#ffffff16#ff404010|*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000001#ffff4012|*|/+0#ffffff16#ff404010|*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000001#ffff4012|*|/+0#0000e05#ffffff0|/+0#ffffff16#ff404010|*+0#0000001#ffff4012|/| +0#0000000#ffffff0|/+0#0000e05&|*@1| +0#e000e06&|C|o|m@1|e|n|t| |t|e|s|t|s|.| +0#0000000&@24
10-
| +0#0000e05&|*| |<+0#00e0e07&|p+0#af5f00255&|>+0#00e0e07&|T+0#0000e05&|h|e|r|e| |i|s| |n|o| |e|n|t|r|y| |p|o|i|n|t| |m|e|t|h|o|d| |{+0#e000e06&|@|c|o|d|e| |m|a|i|n|}|:+0#0000e05&| +0#0000000&@24
11-
| +0#0000e05&|*| |{+0#e000e06&|@|s|n|i|p@1|e|t| |f+0#00e0003&|i|l|e| +0#e000e06&|=| |S+0#e000002&|n|i|p@1|e|t|s|.|j|a|v|a| +0#e000e06&|r+0#00e0003&|e|g|i|o|n| +0#e000e06&|=| |m+0#e000002&|a|i|n| +0#e000e06&|i+0#00e0003&|d| +0#e000e06&|=| |_+0#e000002&|0|1|}+0#e000e06&| +0#0000000&@17
12-
| +0#0000e05&|*| |<+0#00e0e07&|p+0#af5f00255&|>+0#00e0e07&|T+0#0000e05&|h|e|r|e| |i|s| |n|o| |t|e|x|t|u|a|l| |r|e|p|r|e|s|e|n|t|a|t|i|o|n|:| +0#0000000&@33
13-
| +0#0000e05&|*| |{+0#e000e06&|@|s|n|i|p@1|e|t| |c+0#00e0003&|l|a|s@1| +0#e000e06&|=| |S+0#e000002&|n|i|p@1|e|t|s| +0#e000e06&|r+0#00e0003&|e|g|i|o|n| +0#e000e06&|=| |t+0#e000002&|o|S|t|r|i|n|g| +0#e000e06&|i+0#00e0003&|d| +0#e000e06&|=| |_+0#e000002&|0|2|}+0#e000e06&| +0#0000e05&|*|/| +0#0000000&@14
14-
|c+0#00e0003&|l|a|s@1| +0#0000000&|C|o|m@1|e|n|t|s|T|e|s|t|s| @55
15-
|{| @73
16-
@4|/+0#0000e05&|*@1| +0#e000e06&|N|o|-|o|p|,| |i|.| +0#0000e05&|e+0&#5fd7ff255|.+0&#ffffff0| |n+0&#5fd7ff255|o| +0&#ffffff0|o|p|e|r|a|t|i|o|n|.| +0#0000000&@40
17-
| +0#0000e05&@3|*| |(|{+0#e000e06&|@|l|i|t|e|r|a|l|@|l|i|t|e|r|a|l|}| +0#0000e05&|m|a|y| |b|e| |u|s|e|d| |w|i|t|h| |{+0#e000e06&|@|c|o|d|e| |.|}| +0#0000e05&|f|o|r| |c|o|n|t|r|a|c|t|i|o|n|.|)| +0#0000000&@4
18-
| +0#0000e05&@3|*| |@+0#e000e06&|r|e|t|u|r|n| +0#0000e05&|{+0#e000e06&|@|c|o|d|e| |n|u|l@1|}| +0#0000e05&|*|/| +0#0000000&@45
19-
@4|V|o|i|d| |n|o|O|p|1|(|)| |{| |r+0#af5f00255&|e|t|u|r|n| +0#0000000&|n+0#e000002&|u|l@1|;+0#0000000&| |}| @41
1+
| +0#0000e05#a8a8a8255@1>/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |u|n|l|e|t|!| |g+0&#5fd7ff255|:+0&#ffffff0|j|a|v|a|_|n|o|_|t|a|b|_|s|p|a|c|e|_|e|r@1|o|r| |g|:|j|a|v|a|_|i|g|n|o|r|e|_|j+0&#ffd7d7255|a|v|a|d|o|c| +0#0000000#ffffff0
2+
| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |u|n|l|e|t|!| |g+0&#5fd7ff255|:+0&#ffffff0|j|a|v|a|_|n|o|_|t|r|a|i|l|_|s|p|a|c|e|_|e|r@1|o|r| +0#0000000&@20
3+
| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| |[|g|:|j|a|v|a|_|s|p|a|c|e|_|e|r@1|o|r|s|,|g|:|j|a|v|a|_|c|o|m@1|e|n|t|_|s|t|r|i|n|g|s|]|=|[|1+0#e000002&|,+0#0000e05&|1+0#e000002&|]+0#0000e05&| +0#0000000&
4+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
5+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
6+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
7+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
8+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
9+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
10+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
11+
| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |s+0&#ffd7d7255|e|t|l|o|c|a|l| +0&#ffffff0|s|p|e|l@1| |f+0&#ffd7d7255|d|c|=+0&#ffffff0|2+0#e000002&| +0#0000e05&|f+0&#ffd7d7255|d|l|=+0&#ffffff0|6+0#e000002&|4| +0#0000e05&|f+0&#ffd7d7255|d|m|=+0&#ffffff0|s|y|n|t|a|x| |f|e|n| +0#0000000&@12
12+
| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |j+0&#ffd7d7255|a|v|a|C|o|m@1|e|n|t|S|t|a|r|t| +0&#ffffff0|T+0&#ffd7d7255|o|d|o| +0#0000000#ffffff0@18
13+
| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| |j+0&#ffd7d7255|a|v|a|C|o|m@1|e|n|t|T|i|t|l|e| +0&#ffffff0|U|n|d|e|r|l|i|n|e|d| +0#0000000&@12
14+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
15+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
16+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
17+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
18+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
19+
| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
2020
@57|1|,|1| @10|T|o|p|

0 commit comments

Comments
 (0)