;Game of NIM -- Pooya
;******Some defs******
prnt_msg equ 09h
cr equ 0dh
nl equ 0ah
_in equ 01h
_out equ 0eh
spc equ 2 dup ( ' ' )
str equ 0b1h , 0b2h
;*****Color Table*****
black equ 00h
blue equ 01h
green equ 02h
cyan equ 03h
red equ 04h
magenta equ 05h
brown equ 06h
light_gray equ 07h
dark_gray equ 08h
light_blue equ 09h
light_green equ 0ah
light_cyan equ 0bh
light_red equ 0ch
light_magenta equ 0dh
yellow equ 0eh
white equ 0fh
;*********************
. MODEL SMALL
;******Stack Segment******
. STACK
dw 128 dup ( ?)
;*************************
;******Data Segement******
.DATA
star db cr, nl, spc, str , '$'
star2 db cr, nl, spc, str , 32 dup ( ' ' ) , str , '$'
space db spc, '$'
nim_desc db spc, spc, spc, spc
db 'THE GAME OF NIM'
db cr, nl, nl, '$'
pilesAsk db spc
db 'How many piles? (No more than 5)'
db cr, nl, '$'
wrong db cr, nl, nl
db spc
db 'Your input is wrong'
db cr, nl, '$'
sticks db cr, nl, nl
db spc
db , 'How many sticks in ' , '$'
sticks2 db ' pile? (no more than 9)'
db cr, nl, '$'
pile_num1 db cr, spc, str , '$'
pile_num2 db nl, cr
db spc, str , spc
db 'Pile #' , '$'
who_first db cr, nl, nl
db spc
db 'Who plays first?'
db cr, nl
db spc
db '0 = Computer, 1 = Player'
db cr, nl, nl, '$'
computer_think db cr, nl, nl
db 'Hmm... What should I pick now...?'
db cr, nl, '$'
computer_pick db cr, nl
db 'I picked ' , '$'
computer_pick2 db ' sticks from pile #' , '$'
first db - 1
piles dw 0
pile1 db 5 dup ( ?)
shape db 0f4h , 0f5h , '$'
new db cr, nl, '$'
pick_pile db cr, nl, nl
db spc
db 'Please pick one pile.'
db cr, nl, nl, '$'
pick_stick_ db cr, nl, nl
db spc
db 'How many sticks to remove? '
db '(Zero, or numbers greater than ' , '$'
pick_stick__ db ' are illegal.)'
db cr, nl, '$'
iwin db cr, nl
db spc
db 'I WON!!'
db cr, nl, '$'
uwin db cr, nl
db spc
db 'YOU WON!!'
db cr, nl, '$'
top db cr, nl
db spc
db 17 dup ( str ) , 0b1h , 0b2h , nl, '$'
again_ul db cr, nl, spc
db 'Do you want to play again?'
db cr, nl, spc
db 'Maybe this time you could beat me? (Y/n)'
db cr, nl, '$'
again_cl db cr, nl, spc
db 'Do you want to play again?'
db cr, nl, spc
db 'This time I will win for sure! (Y/n)'
db cr, nl, '$'
win_flag db - 1
gState db 0
computer_move db 0
rand dw 0
pile_choice dw 0
sum db 1
err db cr, spc
db 'You need to have at least two piles'
db cr, nl, '$'
temp dw 0
temp2 db 24h
;*************************
;******Code Segemnt*******
. CODE
. STARTUP
;**********Macro**********
set_color macro par ;macro to set a color for printing
pusha
mov bl , par
mov ah , 9
mov al , 0
int 10h
popa
endm
;************************
start :
;set video mode
mov ah , 0h
mov al , 03h
int 10h
;======================
set_color light_gray ; change color for second run (if i don't add this line,
; in second run (after play_again proc) some of character
; are colored in a random manner
;print description
lea dx , nim_desc
call print_msg
;======================
;ask for the number of piles
lea dx , pilesAsk
call print_msg
;===========================
;get piles:
jmp get_pile
wrong_pile:
lea dx , wrong
call print_msg
jmp get_pile
wrong_pile2:
lea dx , wrong
call print_msg
lea dx , err
call print_msg
get_pile:
call get_ch
sub al , 30h
cmp al , 5
jg wrong_pile
cmp al , 0
jz wrong_pile
cmp al , 1
jz wrong_pile2
mov b. piles, al
;===========================
mov cl , '1'
mov si , 0
jmp input
wrong_stick:
lea dx , wrong
call print_msg
dec cl
input:
;ask for number of sticks each pile contains:
lea dx , sticks
call print_msg
mov al , cl
call print_ch
mov dx , offset sticks2
call print_msg
inc cl
;==========================
;get sticks:
xor al , al
call get_ch
sub al , 30h
cmp al , 0
jz wrong_stick
mov pile1[ si ] , al
inc si
cmp si , piles
jb input
;==========================
;print pile
call print_pile
;==========================
;prompt user to choose who plays first (machine or user):
call who_turn
;==========================
turn:
cmp first, 0 ;compare to know who played first
jnz computer_next
player_next:
call print_pile
call user_turn
cmp win_flag, 0
jz closing
call print_pile
call computer_turn
cmp win_flag, 1
je closing
jmp player_next
jmp closing
computer_next:
call print_pile
call computer_turn
cmp win_flag, 1
je closing
call print_pile
call user_turn
cmp win_flag, 0
jz closing
jmp computer_next
closing:
call play_again
jmp exit
who_turn proc
lea dx , who_first
call print_msg
call get_ch
sub al , 30h
cmp al , 0
mov first, al
jnz label3
call computer_turn
jmp fin
label3:
call user_turn
fin:
ret
who_turn endp
user_turn proc
jmp pick_
wrong_:
lea dx , wrong
call print_msg
pick_:
lea dx , pick_pile
call print_msg
call get_ch
dec al
sub al , 30h
mov b. pile_choice, al
xor di , di
mov di , pile_choice
cmp pile1[ di ] , 0
jz wrong_
cmp al , b. piles
jg wrong_
mov dx , offset pick_stick_
call print_msg
mov si , pile_choice
mov al , pile1[ si ]
add al , 30h
call print_ch
lea dx , pick_stick__
call print_msg
jmp label2
wrong_choice2:
lea dx , wrong
call print_msg
label2:
call get_ch
sub al , 30h
cmp al , pile1[ si ]
jg wrong_choice2
cmp al , 0
jz wrong_choice2
sub pile1[ si ] , al
call get_sum
cmp sum, 0
jz u_win
jmp label5
u_win:
mov win_flag, 0
lea dx , uwin
call print_msg
label5:
ret
user_turn endp
computer_turn proc
lea dx , computer_think
call print_msg
call is_kernel
cmp gState, 0
jz pick
call make_kernel
call print_move
call get_sum
cmp sum, 0
jz i_win
jmp label1
pick:
call pick_stick
call print_move
call get_sum
cmp sum, 0
jz i_win
jmp label1
i_win:
call print_pile
mov win_flag, 1
lea dx , iwin
call print_msg
label1:
ret
computer_turn endp
print_move proc ;prints computer's move
pusha
lea dx , computer_pick
call print_msg
mov al , computer_move
add al , 30h
call print_ch
lea dx , computer_pick2
call print_msg
mov al , b. rand
inc al
add al , 30h
call print_ch
popa
ret
print_move endp
get_sum proc ; get sum of sticks. if there is not more sticks,
; player who's made the last move is the winner
pusha
mov cx , piles
xor si , si
xor al , al
label4:
add al , pile1[ si ]
inc si
loop label4
mov sum, al
popa
ret
get_sum endp
is_empty proc ; check if a pile is empty so user can't choose that one
pusha
mov al , pile1[ si ]
or al , al
popa
ret
is_empty endp
pick_stick proc ;pick one stick from a random pile when status is kernel
pusha
label:
call rand_gen
mov si , rand
call is_empty
jz label
sub pile1[ si ] , 1
mov computer_move, 1
popa
ret
pick_stick endp
rand_gen proc ;generates a random number -- not a good one, but does the job
pusha
mov ah , 0h
int 1ah
mov ax , dx
xor dx , dx
mov cx , piles
div cx
mov rand, dx
popa
ret
rand_gen endp
is_kernel proc ;check if game status is kernel
pusha
mov cx , piles
mov al , 0
xor si , si
_xor:
xor al , pile1[ si ]
inc si
loop _xor
mov gState, al
popa
ret
is_kernel endp
make_kernel proc ; make game status kernel. (computer's move)
jmp xor_
wrong_choice:
xchg bl , pile1[ di ]
xor_:
call rand_gen
mov di , rand
cmp pile1[ di ] , 0
jz xor_
mov bl , gState
xor bl , pile1[ di ]
xchg bl , pile1[ di ]
cmp pile1[ di ] , bl
jge wrong_choice
sub bl , pile1[ di ]
mov computer_move, bl
ret
make_kernel endp
print_pile proc ;print the piles. this is where my problem lies.
pusha
mov al , nl ; print a new line
call print_ch
lea dx , top ;print top of border
call print_msg
xor si , si
mov cx , piles
xor bl , bl
pile_loop: ;print pile number
lea dx , pile_num1
call print_msg
call set_cursor
lea dx , pile_num2
call print_msg
mov temp, si
mov al , b. temp
inc al
add al , 30h
call print_ch
mov al , ' ' ;print sticks in each pile in numbers
call print_ch
mov al , '('
call print_ch
mov al , pile1[ si ]
add al , 30h
call print_ch
mov al , ')'
call print_ch
mov al , ' '
call print_ch
lea dx , shape
mov bl , pile1[ si ]
cmp bl , 0
jz no_print
print_loop: ;prints sticks in each pile using an ascii character
set_color light_red ; here i want to print abovesaid shapes in a color
call print_msg
dec bl
cmp bl , 0
jnz print_loop
no_print:
call set_cursor
inc si
dec cx
or cx , cx
jnz pile_loop
lea dx , star2
call print_msg
lea dx , top
call print_msg
popa
ret
print_pile endp
; get and set cursor position in order to print a border
; around piles
get_cursor proc
mov ah , 03h
int 10h
ret
get_cursor endp
set_cursor proc
pusha
call get_cursor
mov temp2, 24h
sub temp2, dl
add dl , temp2
mov ah , 02h
int 10h
mov al , 0b1h
call print_ch
mov al , 0b2h
call print_ch
popa
ret
set_cursor endp
;==========================
print_msg proc
pusha
mov ah , prnt_msg
int 21h
popa
ret
print_msg endp
print_ch proc
pusha
mov ah , _out
int 10h
popa
ret
print_ch endp
get_ch proc
lea dx , space
call print_msg
mov ah , _in
int 21h
ret
get_ch endp
play_again proc ; here i prompt user for a second play
cmp win_flag, 0
jz computer_lost
lea dx , again_ul
jmp fin2
computer_lost:
lea dx , again_cl
fin2:
call print_msg
call get_ch
cmp al , 'y'
je start_again
cmp al , 'Y'
je start_again
cmp al , 'N'
je exit
cmp al , 'n'
je exit
start_again:
mov win_flag, - 1
jmp start
ret
play_again endp
exit:
mov ax , 4c00h
int 21h
. EXIT
END
O0dhbWUgb2YgTklNIC0tIFBvb3lhCjsqKioqKipTb21lIGRlZnMqKioqKioKcHJudF9tc2cgZXF1IDA5aApjciBlcXUgMGRoCm5sIGVxdSAwYWgKX2luIGVxdSAwMWgKX291dCBlcXUgMGVoCnNwYyBlcXUgMiBkdXAgKCcgJykKc3RyIGVxdSAwYjFoLCAwYjJoICAgIAoKOyoqKioqQ29sb3IgVGFibGUqKioqKgpibGFjayBlcXUgMDBoCmJsdWUgZXF1IDAxaApncmVlbiBlcXUgMDJoCmN5YW4gZXF1IDAzaApyZWQgZXF1IDA0aAptYWdlbnRhIGVxdSAwNWgKYnJvd24gZXF1IDA2aApsaWdodF9ncmF5IGVxdSAwN2gKZGFya19ncmF5IGVxdSAwOGgKbGlnaHRfYmx1ZSBlcXUgMDloCmxpZ2h0X2dyZWVuIGVxdSAwYWgKbGlnaHRfY3lhbiBlcXUgMGJoCmxpZ2h0X3JlZCBlcXUgMGNoCmxpZ2h0X21hZ2VudGEgZXF1IDBkaAp5ZWxsb3cgZXF1IDBlaAp3aGl0ZSBlcXUgMGZoCjsqKioqKioqKioqKioqKioqKioqKioKIAouTU9ERUwgU01BTEwKCjsqKioqKipTdGFjayBTZWdtZW50KioqKioqCi5TVEFDSwoKICAgIGR3ICAgMTI4ICBkdXAgKD8pCjsqKioqKioqKioqKioqKioqKioqKioqKioqCgo7KioqKioqRGF0YSBTZWdlbWVudCoqKioqKgouREFUQQoKICAgIHN0YXIgZGIgY3IsIG5sLCBzcGMsIHN0ciwgJyQnCiAgICBzdGFyMiBkYiBjciwgbmwsIHNwYywgc3RyLCAzMiBkdXAgKCcgJyksIHN0ciwgJyQnCiAgICBzcGFjZSBkYiBzcGMsICckJyAgCiAgICBuaW1fZGVzYyBkYiBzcGMsIHNwYywgc3BjLCBzcGMKICAgICAgICAgICAgIGRiICdUSEUgR0FNRSBPRiBOSU0nCiAgICAgICAgICAgICBkYiBjciwgbmwsIG5sLCAnJCcKICAgIAogICAgcGlsZXNBc2sgZGIgc3BjIAogICAgICAgICAgICAgZGIgJ0hvdyBtYW55IHBpbGVzPyAoTm8gbW9yZSB0aGFuIDUpJwogICAgICAgICAgICAgZGIgY3IsIG5sLCAnJCcKICAgIAogICAgd3JvbmcgZGIgY3IsIG5sLCBubAogICAgICAgICAgZGIgc3BjCiAgICAgICAgICBkYiAnWW91ciBpbnB1dCBpcyB3cm9uZycKICAgICAgICAgIGRiIGNyLCBubCwgJyQnCiAgICAKICAgIHN0aWNrcyAgZGIgY3IsIG5sLCBubAogICAgICAgICAgICBkYiBzcGMKICAgICAgICAgICAgZGIgLCAnSG93IG1hbnkgc3RpY2tzIGluICcsICckJwogICAgc3RpY2tzMiBkYiAnIHBpbGU/IChubyBtb3JlIHRoYW4gOSknCiAgICAgICAgICAgIGRiIGNyLCBubCwgJyQnIAogICAgCiAgICBwaWxlX251bTEgZGIgY3IsIHNwYywgc3RyLCAnJCcKICAgIAogICAgcGlsZV9udW0yIGRiIG5sLCBjcgogICAgICAgICAgICAgIGRiIHNwYywgc3RyLCBzcGMKICAgICAgICAgICAgICBkYiAnUGlsZSAjJywgJyQnCiAgICAKICAgIHdob19maXJzdCBkYiBjciwgbmwsIG5sCiAgICAgICAgICAgICAgZGIgc3BjCiAgICAgICAgICAgICAgZGIgJ1dobyBwbGF5cyBmaXJzdD8nCiAgICAgICAgICAgICAgZGIgY3IsIG5sCiAgICAgICAgICAgICAgZGIgc3BjCiAgICAgICAgICAgICAgZGIgJzAgPSBDb21wdXRlciwgMSA9IFBsYXllcicKICAgICAgICAgICAgICBkYiBjciwgbmwsIG5sLCAnJCcKICAgICAgICAgICAgICAKICAgIGNvbXB1dGVyX3RoaW5rIGRiIGNyLCBubCwgbmwKICAgICAgICAgICAgICAgICAgIGRiICdIbW0uLi4gV2hhdCBzaG91bGQgSSBwaWNrIG5vdy4uLj8nCiAgICAgICAgICAgICAgICAgICBkYiBjciwgbmwsICckJwogICAgICAgICAgICAgICAgICAgCiAgICBjb21wdXRlcl9waWNrICBkYiBjciwgbmwKICAgICAgICAgICAgICAgICAgIGRiICdJIHBpY2tlZCAnLCAnJCcKICAgIGNvbXB1dGVyX3BpY2syIGRiICcgc3RpY2tzIGZyb20gcGlsZSAjJywgJyQnICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBmaXJzdCBkYiAtMQogICAgcGlsZXMgZHcgMAogICAgcGlsZTEgZGIgNSBkdXAgKD8pCiAgICAKICAgIHNoYXBlIGRiIDBmNGgsIDBmNWgsICckJwogICAgbmV3IGRiIGNyLCBubCwgJyQnCiAgICAKICAgIHBpY2tfcGlsZSBkYiBjciwgbmwsIG5sCiAgICAgICAgICAgICAgZGIgc3BjCiAgICAgICAgICAgICAgZGIgJ1BsZWFzZSBwaWNrIG9uZSBwaWxlLicKICAgICAgICAgICAgICBkYiBjciwgbmwsIG5sLCAnJCcKICAgIAogICAgcGlja19zdGlja18gZGIgY3IsIG5sLCBubAogICAgICAgICAgICAgICAgZGIgc3BjCiAgICAgICAgICAgICAgICBkYiAnSG93IG1hbnkgc3RpY2tzIHRvIHJlbW92ZT8gJwogICAgICAgICAgICAgICAgZGIgJyhaZXJvLCBvciBudW1iZXJzIGdyZWF0ZXIgdGhhbiAnLCAnJCcKICAgICAgICAgICAgICAgIAogICAgcGlja19zdGlja19fIGRiICcgYXJlIGlsbGVnYWwuKScKICAgICAgICAgICAgICAgICBkYiBjciwgbmwsICckJwogICAgCiAgICBpd2luIGRiIGNyLCBubAogICAgICAgICBkYiBzcGMKICAgICAgICAgZGIgJ0kgV09OISEnCiAgICAgICAgIGRiIGNyLCBubCwgJyQnCiAgICAKICAgIHV3aW4gZGIgY3IsIG5sCiAgICAgICAgIGRiIHNwYwogICAgICAgICBkYiAnWU9VIFdPTiEhJwogICAgICAgICBkYiBjciwgbmwsICckJwogICAgICAgICAKICAgICAgICAgCiAgICB0b3AgZGIgY3IsIG5sCiAgICAgICAgZGIgc3BjCiAgICAgICAgZGIgMTcgZHVwIChzdHIpLCAwYjFoLCAwYjJoLCBubCwgJyQnCiAgICAKICAgIGFnYWluX3VsIGRiIGNyLCBubCwgc3BjCiAgICAgICAgICAgICBkYiAnRG8geW91IHdhbnQgdG8gcGxheSBhZ2Fpbj8nCiAgICAgICAgICAgICBkYiBjciwgbmwsIHNwYwogICAgICAgICAgICAgZGIgJ01heWJlIHRoaXMgdGltZSB5b3UgY291bGQgYmVhdCBtZT8gKFkvbiknCiAgICAgICAgICAgICBkYiBjciwgbmwsICckJwogICAgICAgICAgCiAgICBhZ2Fpbl9jbCBkYiBjciwgbmwsIHNwYwogICAgICAgICAgICAgZGIgJ0RvIHlvdSB3YW50IHRvIHBsYXkgYWdhaW4/JwogICAgICAgICAgICAgZGIgY3IsIG5sLCBzcGMKICAgICAgICAgICAgIGRiICdUaGlzIHRpbWUgSSB3aWxsIHdpbiBmb3Igc3VyZSEgKFkvbiknCiAgICAgICAgICAgICBkYiBjciwgbmwsICckJwogICAgICAgICAKICAgIHdpbl9mbGFnIGRiIC0xCiAgICAKICAgIGdTdGF0ZSBkYiAwCiAgICBjb21wdXRlcl9tb3ZlIGRiIDAKICAgIHJhbmQgZHcgMAogICAgcGlsZV9jaG9pY2UgZHcgMAogICAgc3VtIGRiIDEKICAgIGVyciBkYiBjciwgc3BjCiAgICAgICAgZGIgJ1lvdSBuZWVkIHRvIGhhdmUgYXQgbGVhc3QgdHdvIHBpbGVzJwogICAgICAgIGRiIGNyLCBubCwgJyQnCiAgICAgICAgCiAgICB0ZW1wIGR3IDAKICAgIHRlbXAyIGRiIDI0aAo7KioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgICAgICAgICAKOyoqKioqKkNvZGUgU2VnZW1udCoqKioqKiogICAgICAKLkNPREUKLlNUQVJUVVAKOyoqKioqKioqKipNYWNybyoqKioqKioqKioKc2V0X2NvbG9yIG1hY3JvIHBhciA7bWFjcm8gdG8gc2V0IGEgY29sb3IgZm9yIHByaW50aW5nCiAgICAgICBwdXNoYQogICAgICAgbW92IGJsLCBwYXIgIAogICAgICAgbW92IGFoLCA5IAogICAgICAgbW92IGFsLCAwIAogICAgICAgaW50IDEwaAogICAgICAgcG9wYSAKZW5kbQo7KioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgCnN0YXJ0Ogo7c2V0IHZpZGVvIG1vZGUKICAgIG1vdiBhaCwgMGgKICAgIG1vdiBhbCwgMDNoCiAgICBpbnQgMTBoCjs9PT09PT09PT09PT09PT09PT09PT09IAogCnNldF9jb2xvciBsaWdodF9ncmF5IDsgY2hhbmdlIGNvbG9yIGZvciBzZWNvbmQgcnVuIChpZiBpIGRvbid0IGFkZCB0aGlzIGxpbmUsCgkJCQkJIDsgaW4gc2Vjb25kIHJ1biAoYWZ0ZXIgcGxheV9hZ2FpbiBwcm9jKSBzb21lIG9mIGNoYXJhY3RlcgoJCQkJCSA7IGFyZSBjb2xvcmVkIGluIGEgcmFuZG9tIG1hbm5lcgogICAgICAgICAgICAgICAgICAgICAgIAo7cHJpbnQgZGVzY3JpcHRpb24KICAgIGxlYSBkeCwgbmltX2Rlc2MKICAgIGNhbGwgcHJpbnRfbXNnCjs9PT09PT09PT09PT09PT09PT09PT09CiAgICAKO2FzayBmb3IgdGhlIG51bWJlciBvZiBwaWxlcwogICAgbGVhIGR4LCBwaWxlc0FzawogICAgY2FsbCBwcmludF9tc2cgCjs9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAKO2dldCBwaWxlczoKICAgIGptcCBnZXRfcGlsZQogICAgd3JvbmdfcGlsZToKICAgIGxlYSBkeCwgd3JvbmcKICAgIGNhbGwgcHJpbnRfbXNnCiAgICAKICAgIGptcCBnZXRfcGlsZQogICAgd3JvbmdfcGlsZTI6CiAgICBsZWEgZHgsIHdyb25nCiAgICBjYWxsIHByaW50X21zZwogICAgbGVhIGR4LCBlcnIKICAgIGNhbGwgcHJpbnRfbXNnCiAgICAKICAgIGdldF9waWxlOgogICAgY2FsbCBnZXRfY2gKICAgIHN1YiBhbCwgMzBoCiAgICBjbXAgYWwsIDUKICAgIGpnIHdyb25nX3BpbGUKICAgIGNtcCBhbCwgMAogICAganogd3JvbmdfcGlsZQogICAgY21wIGFsLCAxCiAgICBqeiB3cm9uZ19waWxlMiAKICAgIG1vdiBiLiBwaWxlcywgYWwgCiA7PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgCiAgICAKICAgIG1vdiBjbCwgJzEnCiAgICBtb3Ygc2ksIDAKICAgIAoKICAgIGptcCBpbnB1dAogICAgd3Jvbmdfc3RpY2s6CiAgICBsZWEgZHgsIHdyb25nCiAgICBjYWxsIHByaW50X21zZwogICAgZGVjIGNsCiAgICAKaW5wdXQ6Cgo7YXNrIGZvciBudW1iZXIgb2Ygc3RpY2tzIGVhY2ggcGlsZSBjb250YWluczoKICAgIGxlYSBkeCwgc3RpY2tzCiAgICBjYWxsIHByaW50X21zZwogICAgCiAgICBtb3YgYWwsIGNsCiAgICBjYWxsIHByaW50X2NoCiAgICAKICAgIG1vdiBkeCwgb2Zmc2V0IHN0aWNrczIKICAgIGNhbGwgcHJpbnRfbXNnCiAgICBpbmMgY2wKOz09PT09PT09PT09PT09PT09PT09PT09PT09Cgo7Z2V0IHN0aWNrczogICAgCiAgICB4b3IgYWwsIGFsCiAgICBjYWxsIGdldF9jaCAgIAogICAgc3ViIGFsLCAzMGgKICAgIGNtcCBhbCwgMAogICAganogd3Jvbmdfc3RpY2sKICAgIG1vdiBwaWxlMVtzaV0sIGFsCiAgICBpbmMgc2kgICAgICAgICAgCiAgICBjbXAgc2ksIHBpbGVzIAogICAgamIgaW5wdXQKOz09PT09PT09PT09PT09PT09PT09PT09PT09Cgo7cHJpbnQgcGlsZQogICAgY2FsbCBwcmludF9waWxlCjs9PT09PT09PT09PT09PT09PT09PT09PT09PQoKO3Byb21wdCB1c2VyIHRvIGNob29zZSB3aG8gcGxheXMgZmlyc3QgKG1hY2hpbmUgb3IgdXNlcik6CiAgICBjYWxsIHdob190dXJuCjs9PT09PT09PT09PT09PT09PT09PT09PT09PQoKdHVybjoKICAgIGNtcCBmaXJzdCwgMCA7Y29tcGFyZSB0byBrbm93IHdobyBwbGF5ZWQgZmlyc3QKICAgIGpueiBjb21wdXRlcl9uZXh0CiAgICAKICAgIHBsYXllcl9uZXh0OgogICAgY2FsbCBwcmludF9waWxlCiAgICBjYWxsIHVzZXJfdHVybgogICAgY21wIHdpbl9mbGFnLCAwCiAgICBqeiBjbG9zaW5nCiAgICBjYWxsIHByaW50X3BpbGUKICAgIGNhbGwgY29tcHV0ZXJfdHVybgogICAgY21wIHdpbl9mbGFnLCAxCiAgICBqZSBjbG9zaW5nCiAgICBqbXAgcGxheWVyX25leHQKICAgIAogICAgam1wIGNsb3NpbmcKICAgICAgICAKICAgIGNvbXB1dGVyX25leHQ6CiAgICBjYWxsIHByaW50X3BpbGUKICAgIGNhbGwgY29tcHV0ZXJfdHVybgogICAgY21wIHdpbl9mbGFnLCAxCiAgICBqZSBjbG9zaW5nCiAgICBjYWxsIHByaW50X3BpbGUKICAgIGNhbGwgdXNlcl90dXJuCiAgICBjbXAgd2luX2ZsYWcsIDAKICAgIGp6IGNsb3NpbmcKICAgIGptcCBjb21wdXRlcl9uZXh0CiAgICAKICAgIAogICAgY2xvc2luZzoKICAgIGNhbGwgcGxheV9hZ2FpbgogICAgam1wIGV4aXQKICAgIAoKd2hvX3R1cm4gcHJvYwogICAgCiAgICBsZWEgZHgsIHdob19maXJzdAogICAgY2FsbCBwcmludF9tc2cKICAgIAogICAgY2FsbCBnZXRfY2gKICAgIHN1YiBhbCwzMGgKICAgIGNtcCBhbCwgMAogICAgbW92IGZpcnN0LCBhbAogICAgam56IGxhYmVsMwogICAgCiAgICBjYWxsIGNvbXB1dGVyX3R1cm4KICAgIAogICAgam1wIGZpbgogICAgCiAgICBsYWJlbDM6CiAgICBjYWxsIHVzZXJfdHVybgogICAgCiAgICBmaW46CiAgICByZXQKd2hvX3R1cm4gZW5kcCAgICAKCnVzZXJfdHVybiBwcm9jCiAgICAKICAgIGptcCBwaWNrXwogICAgd3JvbmdfOgogICAgbGVhIGR4LCB3cm9uZwogICAgY2FsbCBwcmludF9tc2cKICAgIAogICAgcGlja186ICAgIAogICAgbGVhIGR4LCBwaWNrX3BpbGUKICAgIGNhbGwgcHJpbnRfbXNnCiAgICAKICAgIGNhbGwgZ2V0X2NoCiAgICBkZWMgYWwKICAgIHN1YiBhbCwgMzBoCiAgICBtb3YgYi4gcGlsZV9jaG9pY2UsIGFsCiAgICAKICAgIHhvciBkaSwgZGkKICAgIG1vdiBkaSwgcGlsZV9jaG9pY2UKICAgIGNtcCBwaWxlMVtkaV0sIDAKICAgIGp6IHdyb25nXwogICAgY21wIGFsLCBiLiBwaWxlcwogICAgamcgd3JvbmdfCiAgICAKICAgIAogICAgbW92IGR4LCBvZmZzZXQgcGlja19zdGlja18KICAgIGNhbGwgcHJpbnRfbXNnCiAgICAKICAgIG1vdiBzaSwgcGlsZV9jaG9pY2UKICAgIG1vdiBhbCwgcGlsZTFbc2ldCiAgICBhZGQgYWwsIDMwaAogICAgY2FsbCBwcmludF9jaAogICAgCiAgICAKICAgIGxlYSBkeCwgcGlja19zdGlja19fCiAgICBjYWxsIHByaW50X21zZwogICAgCiAgICBqbXAgbGFiZWwyCiAgICB3cm9uZ19jaG9pY2UyOgogICAgbGVhIGR4LCB3cm9uZwogICAgY2FsbCBwcmludF9tc2cKICAgIAogICAgbGFiZWwyOgogICAgY2FsbCBnZXRfY2gKICAgIHN1YiBhbCwgMzBoCiAgICBjbXAgYWwsIHBpbGUxW3NpXQogICAgamcgd3JvbmdfY2hvaWNlMgogICAgY21wIGFsLCAwCiAgICBqeiB3cm9uZ19jaG9pY2UyCiAgICAKICAgIHN1YiBwaWxlMVtzaV0sIGFsCiAgICBjYWxsIGdldF9zdW0KICAgIGNtcCBzdW0sIDAKICAgIGp6IHVfd2luCiAgICAKICAgIGptcCBsYWJlbDUKICAgIHVfd2luOgogICAgbW92IHdpbl9mbGFnLCAwCiAgICBsZWEgZHgsIHV3aW4KICAgIGNhbGwgcHJpbnRfbXNnICAgIAogICAgCiAgICBsYWJlbDU6CiAgICByZXQKdXNlcl90dXJuIGVuZHAgICAgCgpjb21wdXRlcl90dXJuIHByb2MKICAgIGxlYSBkeCwgY29tcHV0ZXJfdGhpbmsKICAgIGNhbGwgcHJpbnRfbXNnICAgIAogICAgY2FsbCBpc19rZXJuZWwKICAgIGNtcCBnU3RhdGUsIDAKICAgIGp6IHBpY2sgIAogICAgCiAgICBjYWxsIG1ha2Vfa2VybmVsCiAgICBjYWxsIHByaW50X21vdmUKICAgIGNhbGwgZ2V0X3N1bQogICAgY21wIHN1bSwgMAogICAganogaV93aW4KICAgIAogICAgam1wIGxhYmVsMQogICAgCiAgICBwaWNrOgogICAgY2FsbCBwaWNrX3N0aWNrCiAgICBjYWxsIHByaW50X21vdmUKICAgIGNhbGwgZ2V0X3N1bQogICAgY21wIHN1bSwgMAogICAganogaV93aW4KICAgIAogICAgam1wIGxhYmVsMSAKICAgIAogICAgaV93aW46CiAgICBjYWxsIHByaW50X3BpbGUKICAgIG1vdiB3aW5fZmxhZywgMQogICAgbGVhIGR4LCBpd2luCiAgICBjYWxsIHByaW50X21zZwogICAgCiAgICBsYWJlbDE6IAogICAgCiAgICByZXQKY29tcHV0ZXJfdHVybiBlbmRwICAgICAKCnByaW50X21vdmUgcHJvYyA7cHJpbnRzIGNvbXB1dGVyJ3MgbW92ZQogICAgcHVzaGEKICAgIGxlYSBkeCwgY29tcHV0ZXJfcGljawogICAgY2FsbCBwcmludF9tc2cKICAgIG1vdiBhbCwgY29tcHV0ZXJfbW92ZQogICAgYWRkIGFsLCAzMGgKICAgIGNhbGwgcHJpbnRfY2gKICAgIGxlYSBkeCwgY29tcHV0ZXJfcGljazIKICAgIGNhbGwgcHJpbnRfbXNnCiAgICBtb3YgYWwsIGIuIHJhbmQKICAgIGluYyBhbAogICAgYWRkIGFsLCAzMGgKICAgIGNhbGwgcHJpbnRfY2gKICAgIHBvcGEKICAgIHJldApwcmludF9tb3ZlIGVuZHAKCmdldF9zdW0gcHJvYyA7IGdldCBzdW0gb2Ygc3RpY2tzLiBpZiB0aGVyZSBpcyBub3QgbW9yZSBzdGlja3MsCgkJCSA7IHBsYXllciB3aG8ncyBtYWRlIHRoZSBsYXN0IG1vdmUgaXMgdGhlIHdpbm5lcgogICAgcHVzaGEKICAgIG1vdiBjeCwgcGlsZXMKICAgIHhvciBzaSwgc2kKICAgIHhvciBhbCwgYWwKICAgICAgICAKICAgIGxhYmVsNDoKICAgIGFkZCBhbCwgcGlsZTFbc2ldCiAgICBpbmMgc2kKICAgIGxvb3AgbGFiZWw0CiAgICBtb3Ygc3VtLCBhbAogICAgcG9wYQogICAgcmV0CmdldF9zdW0gZW5kcAogICAgCmlzX2VtcHR5IHByb2MgOyBjaGVjayBpZiBhIHBpbGUgaXMgZW1wdHkgc28gdXNlciBjYW4ndCBjaG9vc2UgdGhhdCBvbmUKICAgIHB1c2hhCiAgICBtb3YgYWwsIHBpbGUxW3NpXQogICAgb3IgYWwsIGFsCiAgICBwb3BhCiAgICByZXQgCmlzX2VtcHR5IGVuZHAKCnBpY2tfc3RpY2sgcHJvYyA7cGljayBvbmUgc3RpY2sgZnJvbSBhIHJhbmRvbSBwaWxlIHdoZW4gc3RhdHVzIGlzIGtlcm5lbAogICAgcHVzaGEKICAgIGxhYmVsOgogICAgY2FsbCByYW5kX2dlbgogICAgbW92IHNpLCByYW5kCiAgICBjYWxsIGlzX2VtcHR5CiAgICBqeiBsYWJlbAogICAgc3ViIHBpbGUxW3NpXSwgMQogICAgbW92IGNvbXB1dGVyX21vdmUsIDEKICAgIHBvcGEKICAgIHJldApwaWNrX3N0aWNrIGVuZHAgICAgCgpyYW5kX2dlbiBwcm9jIDtnZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIC0tIG5vdCBhIGdvb2Qgb25lLCBidXQgZG9lcyB0aGUgam9iCiAgICBwdXNoYQogICAgbW92IGFoLCAwaAogICAgaW50IDFhaAogICAgbW92ICBheCwgZHgKICAgIHhvciAgZHgsIGR4CiAgICBtb3YgIGN4LCBwaWxlcyAgICAKICAgIGRpdiAgY3gKICAgIG1vdiByYW5kLCBkeAogICAgCiAgICBwb3BhCiAgICByZXQKcmFuZF9nZW4gZW5kcAoKaXNfa2VybmVsIHByb2MgO2NoZWNrIGlmIGdhbWUgc3RhdHVzIGlzIGtlcm5lbAogICAgcHVzaGEKICAgIG1vdiBjeCwgcGlsZXMgICAgICAgICAgCiAgICBtb3YgYWwsIDAKICAgIHhvciBzaSwgc2kKICAgIAogICAgX3hvcjoKICAgIHhvciBhbCwgcGlsZTFbc2ldCiAgICBpbmMgc2kKICAgIGxvb3AgX3hvcgogICAgCiAgICBtb3YgZ1N0YXRlLCBhbAogICAgcG9wYQogICAgcmV0CmlzX2tlcm5lbCBlbmRwCgptYWtlX2tlcm5lbCBwcm9jIDsgbWFrZSBnYW1lIHN0YXR1cyBrZXJuZWwuIChjb21wdXRlcidzIG1vdmUpCiAgICAgICAKICAgIGptcCB4b3JfCiAgICB3cm9uZ19jaG9pY2U6IAogICAgeGNoZyBibCwgcGlsZTFbZGldCiAgICAKICAgIHhvcl86CiAgICBjYWxsIHJhbmRfZ2VuCiAgICBtb3YgZGksIHJhbmQKICAgIAogICAgY21wIHBpbGUxW2RpXSwgMAogICAganogeG9yXwogICAgCiAgICBtb3YgYmwsIGdTdGF0ZQogICAgeG9yIGJsLCBwaWxlMVtkaV0KICAgIHhjaGcgYmwsIHBpbGUxW2RpXQogICAgCiAgICBjbXAgcGlsZTFbZGldLCBibAogICAgamdlIHdyb25nX2Nob2ljZQogICAgCiAgICBzdWIgYmwsIHBpbGUxW2RpXQogICAgbW92IGNvbXB1dGVyX21vdmUsIGJsCiAgICAKICAgIHJldAptYWtlX2tlcm5lbCBlbmRwCgoKcHJpbnRfcGlsZSAgcHJvYyA7cHJpbnQgdGhlIHBpbGVzLiB0aGlzIGlzIHdoZXJlIG15IHByb2JsZW0gbGllcy4KICAgIHB1c2hhCiAgICAKICAgIG1vdiBhbCwgbmwgOyBwcmludCBhIG5ldyBsaW5lCiAgICBjYWxsIHByaW50X2NoCiAgICBsZWEgZHgsIHRvcCA7cHJpbnQgdG9wIG9mIGJvcmRlcgogICAgY2FsbCBwcmludF9tc2cgCiAgICB4b3Igc2ksIHNpCiAgICBtb3YgY3gsIHBpbGVzCiAgICB4b3IgYmwsIGJsCiAgICAKICAgIHBpbGVfbG9vcDogO3ByaW50IHBpbGUgbnVtYmVyCiAgICBsZWEgZHgsIHBpbGVfbnVtMQogICAgY2FsbCBwcmludF9tc2cKICAgIGNhbGwgc2V0X2N1cnNvcgogICAgbGVhIGR4LCBwaWxlX251bTIKICAgIGNhbGwgcHJpbnRfbXNnCiAgICBtb3YgdGVtcCwgc2kKICAgIG1vdiBhbCwgYi4gdGVtcAogICAgaW5jIGFsCiAgICBhZGQgYWwsIDMwaAogICAgY2FsbCBwcmludF9jaAogICAgCiAgICBtb3YgYWwsICcgJyA7cHJpbnQgc3RpY2tzIGluIGVhY2ggcGlsZSBpbiBudW1iZXJzCiAgICBjYWxsIHByaW50X2NoCiAgICBtb3YgYWwsICcoJwogICAgY2FsbCBwcmludF9jaAogICAgbW92IGFsLCBwaWxlMVtzaV0KICAgIGFkZCBhbCwgMzBoCiAgICBjYWxsIHByaW50X2NoCiAgICBtb3YgYWwsICcpJwogICAgY2FsbCBwcmludF9jaAogICAgbW92IGFsLCAnICcKICAgIGNhbGwgcHJpbnRfY2gKICAgIAogICAgbGVhIGR4LCBzaGFwZSAKICAgIG1vdiBibCwgcGlsZTFbc2ldCiAgICBjbXAgYmwsIDAKICAgIGp6IG5vX3ByaW50CiAgICAgICAgcHJpbnRfbG9vcDogO3ByaW50cyBzdGlja3MgaW4gZWFjaCBwaWxlIHVzaW5nIGFuIGFzY2lpIGNoYXJhY3RlcgogICAgICAgIHNldF9jb2xvciBsaWdodF9yZWQgOyBoZXJlIGkgd2FudCB0byBwcmludCBhYm92ZXNhaWQgc2hhcGVzIGluIGEgY29sb3IKICAgICAgICBjYWxsIHByaW50X21zZwogICAgICAgIGRlYyBibAogICAgICAgIGNtcCBibCwgMAoKICAgICAgICBqbnogcHJpbnRfbG9vcAogICAgICAgIAogICAgbm9fcHJpbnQ6CiAgICAgICAgIAogICAgY2FsbCBzZXRfY3Vyc29yCiAgICAKICAgIGluYyBzaSAgICAKICAgIGRlYyBjeAogICAgb3IgY3gsIGN4CiAgICBqbnogcGlsZV9sb29wCiAgICBsZWEgZHgsIHN0YXIyCiAgICBjYWxsIHByaW50X21zZwogICAgbGVhIGR4LCB0b3AKICAgIGNhbGwgcHJpbnRfbXNnCiAgICBwb3BhCiAgICByZXQKcHJpbnRfcGlsZSBlbmRwCgo7IGdldCBhbmQgc2V0IGN1cnNvciBwb3NpdGlvbiBpbiBvcmRlciB0byBwcmludCBhIGJvcmRlcgo7IGFyb3VuZCBwaWxlcwpnZXRfY3Vyc29yIHByb2MKICAgIG1vdiBhaCwgMDNoCiAgICBpbnQgMTBoCiAgICByZXQKZ2V0X2N1cnNvciBlbmRwCgpzZXRfY3Vyc29yIHByb2MKICAgIHB1c2hhCiAgICBjYWxsIGdldF9jdXJzb3IKICAgIG1vdiB0ZW1wMiwgMjRoCiAgICBzdWIgdGVtcDIsIGRsIAogICAgYWRkIGRsLCB0ZW1wMgogICAgbW92IGFoLCAwMmgKICAgIGludCAxMGgKICAgIG1vdiBhbCwgMGIxaAogICAgY2FsbCBwcmludF9jaAogICAgbW92IGFsLCAwYjJoCiAgICBjYWxsIHByaW50X2NoCiAgICBwb3BhCiAgICByZXQKc2V0X2N1cnNvciBlbmRwCjs9PT09PT09PT09PT09PT09PT09PT09PT09PQoKcHJpbnRfbXNnIHByb2MKICAgIHB1c2hhCiAgICBtb3YgYWgsIHBybnRfbXNnCiAgICBpbnQgMjFoCiAgICBwb3BhCiAgICByZXQKcHJpbnRfbXNnIGVuZHAKCgpwcmludF9jaCBwcm9jCiAgICBwdXNoYQogICAgbW92IGFoLCBfb3V0CiAgICBpbnQgMTBoCiAgICBwb3BhCiAgICByZXQKcHJpbnRfY2ggZW5kcAogICAgICAgICAKICAgICAgICAgCmdldF9jaCBwcm9jCiAgICBsZWEgZHgsIHNwYWNlCiAgICBjYWxsIHByaW50X21zZwogICAgbW92IGFoLCBfaW4KICAgIGludCAyMWgKICAgIHJldApnZXRfY2ggZW5kcCAgICAgICAgCgogICAgICAgIApwbGF5X2FnYWluIHByb2MgOyBoZXJlIGkgcHJvbXB0IHVzZXIgZm9yIGEgc2Vjb25kIHBsYXkKICAgIGNtcCB3aW5fZmxhZywgMAogICAganogY29tcHV0ZXJfbG9zdAogICAgCiAgICBsZWEgZHgsIGFnYWluX3VsCiAgICAKICAgIGptcCBmaW4yCiAgICAKICAgIGNvbXB1dGVyX2xvc3Q6CiAgICBsZWEgZHgsIGFnYWluX2NsCiAgICAKICAgIGZpbjI6CiAgICBjYWxsIHByaW50X21zZwogICAgCiAgICBjYWxsIGdldF9jaAogICAgY21wIGFsLCAneScKICAgIGplIHN0YXJ0X2FnYWluCiAgICBjbXAgYWwsICdZJwogICAgamUgc3RhcnRfYWdhaW4KICAgIGNtcCBhbCwgJ04nCiAgICBqZSBleGl0CiAgICBjbXAgYWwsICduJwogICAgamUgZXhpdAoKICAgIHN0YXJ0X2FnYWluOgogICAgbW92IHdpbl9mbGFnLCAtMQogICAgam1wIHN0YXJ0CiAgICAKICAgIHJldCAgICAKcGxheV9hZ2FpbiBlbmRwCgpleGl0OgogICAgbW92IGF4LCA0YzAwaAogICAgaW50IDIxaAogICAgCi5FWElUCkVORAo=