#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 52
#define TIMES 100 // 遊戲戰績儲存次數上限常數
#define BUF_SIZE 3
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
const char flower_table[ 4 ] = { '\5 ' , '\4 ' , '\3 ' , '\6 ' } ; // ascii code, \5 \4 \3 \6 分別代表梅花、方塊、紅心、黑桃
const char number_table[ 13 ] [ BUF_SIZE] = {
" A" , " 2" , " 3" , " 4" , " 5" , " 6" ,
" 7" , " 8" , " 9" , "10" , " J" , " Q" , " K" } ;
/* ※花色與數字的決定方法
for (i = 0; i!=52; ++i){
flower = i % 4; // 花色, 0~3
number = i / 4; // 數字, 0~12
}
*/
typedef struct handle Handle;
struct handle{
Handle * node;
int card; // 牌值
int flower; // 計算牌的花色
int number; // 計算牌的點數
float point; // 這一局的點數
float fnumber; // 這張牌的點數
int cardnum; // 手牌數量
} ;
typedef struct player Player;
struct player{
char record[ TIMES] ; // 戰績
int record_flag; // 戰績陣列索引
Handle hand; // struct 手牌
int Case; // Case 1: 玩家要牌 遊戲結束
} ;
// SWAP 交換
void Swap( int * a, int * b) {
// printf("***** Function Swap Begin *****\n\n");
int temp;
temp = * a;
* a = * b;
* b = temp;
return ;
// printf("***** Function Swap End *****\n\n");
}
// Shuttle 洗牌
void Shuttle( int * array) {
// printf("***** Function Shttle Begin *****\n\n");
//BLACK_RED;
printf ( "Creat New Deck And Shuttle !\n \n " ) ; ////BLACK_WHITE;
int i, pos;
for ( i = 0 ; i< 52 ; i++ ) {
array[ i] = i + 1 ;
}
for ( i = 0 ; i != N; ++ i) {
// 取出第pos張牌
pos
= ( int ) ( N
* ( double ) rand ( ) / RAND_MAX
) ; // 交換第i張與第pos張牌
Swap( & array[ i] , & array[ pos] ) ;
}
// printf("***** Function Shttle End *****\n\n");
return ;
}
void Deal( int * array, Player * a, int * flag) {
//BLACK_RED;
////BLACK_WHITE;
a-> hand.card = array[ * flag] ;
++* flag;
a-> hand.flower = a-> hand.card % 4 ;
a-> hand.number = a-> hand.card / 4 ;
a-> hand.fnumber = a-> hand.number ;
// printf("test card number : %d \n\n",a->hand.card);
// printf("Your card is %c%s \n\n",flower_table[flower],number_table[number]);
}
// Cardnum 算手牌數量
void Cardnum( int * cardnum) {
* cardnum = * cardnum + 1 ;
}
// Point 算手牌點數
void Point( float * fnumber, float * sumpoint) {
if ( * fnumber < 10.0 && * fnumber > 0.0 ) {
* fnumber = * fnumber + 1.0 ;
* sumpoint = * sumpoint + * fnumber;
}
else if ( * fnumber == 0.0 ) {
* fnumber = 1.0 ;
* sumpoint = * sumpoint + * fnumber;
}
else if ( * fnumber >= 10.0 && * fnumber <= 12.0 ) {
* fnumber = 0.5 ;
* sumpoint = * sumpoint + * fnumber;
}
}
// Watchdeal 得牌顯示
void Watchdeal( Player * a) {
//// BLACK_CYAN;
printf ( "Your card is %c%s \n \n " , flower_table
[ a
-> hand.
flower ] , number_table
[ a
-> hand.
number ] ) ; Point( & a-> hand.fnumber , & a-> hand.point ) ;
printf ( "POINT Now: %.1f\n \n " , a
-> hand.
point ) ; Cardnum( & a-> hand.cardnum ) ;
printf ( "Card Num Now: %d\n \n \n \n " , a
-> hand.
cardnum ) ; ////BLACK_WHITE;
}
// Win Lose 輸贏
void Lose( Player * A, Player * B) {
A-> record[ A-> record_flag] = 'L' ;
A-> record_flag++;
B-> record[ B-> record_flag] = 'W' ;
B-> record_flag++;
}
void Win( Player * A, Player * B) {
B-> record[ A-> record_flag] = 'L' ;
B-> record_flag++;
A-> record[ B-> record_flag] = 'W' ;
A-> record_flag++;
}
void Getcard( Player * A, Player * B, int card[ ] , int * flag) {
char buffer[ 2 ] ;
char temp = '0' ;
while ( 1 ) {
// 詢問是否要牌
////BLACK_YELLOW;
printf ( "Do you want to get card ? ( max card is 5 )\n \n " ) ; ////BLACK_YELLOW;
printf ( "Type 1 for YES , 2 for NO .\n \n " ) ; ////BLACK_WHITE;
// 防呆機制
if ( temp != '1' && temp != '2' ) {
//BLACK_RED;
printf ( "Your Type is wrong ! Retype Please.\n " ) ; ////BLACK_WHITE;
}
// 不要牌
if ( temp == '2' ) {
////BLACK_YELLOW;
printf ( "You Do Not Get Card Anymore !\n " ) ; //// BLACK_CYAN;
printf ( "Your End Point : %.1f\n \n \n \n " , A
-> hand.
point ) ; ////BLACK_WHITE;
return ;
}
if ( temp == '1' ) {
Deal( card, A, flag) ;
Watchdeal( A) ;
if ( A-> hand.point > 10.5 ) {
//BLACK_RED;
printf ( "BOOM ! YOU LOSE !\n \n " ) ; ////BLACK_WHITE;
Lose( A, B) ;
A-> Case = 1 ;
return ;
}
if ( A-> hand.cardnum == 5 ) {
//BLACK_RED;
printf ( "FIVE CARD ! YOU WIN !\n \n " ) ; ////BLACK_WHITE;
Win( A, B) ;
A-> Case = 1 ;
return ;
}
if ( A-> hand.point == 10.5 ) {
//BLACK_RED;
printf ( "10.5 ! YOU WIN !\n \n " ) ; ////BLACK_WHITE;
Win( A, B) ;
A-> Case = 1 ;
return ;
}
}
}
}
void Cgetcard( Player * A, Player * B, int card[ ] , int * flag) {
//BLACK_PURPLE;
printf ( "Computer's First Card is %c%s\n \n " , flower_table
[ B
-> hand.
flower ] , number_table
[ B
-> hand.
number ] ) ; printf ( "Coumputer's Point : %.1f\n \n " , B
-> hand.
point ) ;
}
void Display( ) {
////BLACK_YELLOW;
////BLACK_WHITE;
// 建立牌組
int card[ 52 ] = { } ;
int flag = 0 ; // 牌組堆疊用旗標
// 洗牌
Shuttle( card) ;
// 建立Player
Player A;
A.hand .cardnum = 0 ;
A.hand .fnumber = 0.0 ;
A.hand .point = 0.0 ;
A.record_flag = 0 ;
A.Case = 0 ;
int i = 0 ;
for ( i = 0 ; i< TIMES; i++ ) {
A.record [ i] = '\0 ' ;
}
Player B;
B.hand .cardnum = 0 ;
B.hand .fnumber = 0.0 ;
B.hand .point = 0.0 ;
B.record_flag = 0 ;
B.Case = 0 ;
for ( i = 0 ; i< TIMES; i++ ) {
B.record [ i] = '\0 ' ;
}
// 第一次發牌 (玩家)
//BLACK_YELLOW;
//BLACK_WHITE;
Deal( card, & A, & flag) ;
// BLACK_CYAN;
printf ( "Your card is %c%s \n \n " , flower_table
[ A.
hand .
flower ] , number_table
[ A.
hand .
number ] ) ; Point( & A.hand .fnumber , & A.hand .point ) ;
printf ( "POINT: %.1f\n \n " , A.
hand .
point ) ; Cardnum( & A.hand .cardnum ) ;
printf ( "Card Num Now: %d\n \n " , A.
hand .
cardnum ) ; //BLACK_WHITE;
// 第一次發牌 (電腦)
//BLACK_YELLOW;
printf ( "Computer Get Now.\n \n " ) ; //BLACK_WHITE;
Deal( card, & B, & flag) ;
Cardnum( & B.hand .cardnum ) ;
// printf("Computer's card is %5c%s\n\n",flower_table[B.hand.flower],number_table[B.hand.number]); // 電腦的點數(按遊戲規則不顯示)
Point( & B.hand .fnumber , & B.hand .point ) ;
// 要牌(玩家)
Getcard( & A, & B, card, & flag) ;
if ( A.Case == 1 ) return ; // 玩家點數爆 & 過五關 & 10半 結束遊戲
// 要牌(電腦)
Cgetcard( & A, & B, card, & flag) ;
}
int main( int argc, char * argv[ ] ) {
char p = 0 ;
// BLACK_BLUE;
printf ( "Program Start !\n \n " ) ; //BLACK_WHITE;
do {
Display( ) ;
//BLACK_YELLOW;
printf ( "Do you want to play again ?\n (1 for YES 2 for NO.)\n \n " ) ; //BLACK_WHITE;
while ( p != '1' && p != '2' ) {
//BLACK_YELLOW;
printf ( "Type Wrong ! Retype !\n \n " ) ; //BLACK_WHITE;
}
} while ( p == '1' ) ;
if ( p == '2' ) {
// BLACK_BLUE;
//BLACK_WHITE;
}
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KCiNkZWZpbmUgTiA1MgojZGVmaW5lIFRJTUVTIDEwMCAgICAgLy8g6YGK5oiy5oiw57i+5YSy5a2Y5qyh5pW45LiK6ZmQ5bi45pW4IAojZGVmaW5lIEJVRl9TSVpFIDMKCi8qIHJ1biB0aGlzIHByb2dyYW0gdXNpbmcgdGhlIGNvbnNvbGUgcGF1c2VyIG9yIGFkZCB5b3VyIG93biBnZXRjaCwgc3lzdGVtKCJwYXVzZSIpIG9yIGlucHV0IGxvb3AgKi8KCgpjb25zdCBjaGFyIGZsb3dlcl90YWJsZVs0XSA9IHsgJ1w1JywgJ1w0JywgJ1wzJywgJ1w2JyB9OyAgLy8gYXNjaWkgY29kZe+8jCBcNSBcNCBcMyBcNiDliIbliKXku6PooajmooXoirHjgIHmlrnloYrjgIHntIXlv4PjgIHpu5HmoYMKY29uc3QgY2hhciBudW1iZXJfdGFibGVbMTNdW0JVRl9TSVpFXSA9IHsKCSIgQSIsICIgMiIsICIgMyIsICIgNCIsICIgNSIsICIgNiIsCgkiIDciLCAiIDgiLCAiIDkiLCAiMTAiLCAiIEoiLCAiIFEiLCAiIEsiIH07CgovKiAg4oC76Iqx6Imy6IiH5pW45a2X55qE5rG65a6a5pa55rOVCmZvciAoaSA9IDA7IGkhPTUyOyArK2kpewpmbG93ZXIgPSBpICUgNDsgLy8g6Iqx6ImyLCAwfjMKbnVtYmVyID0gaSAvIDQ7IC8vIOaVuOWtlywgMH4xMgp9CiovCgp0eXBlZGVmIHN0cnVjdCBoYW5kbGUgSGFuZGxlOwpzdHJ1Y3QgaGFuZGxlewoJSGFuZGxlICpub2RlOwoJaW50IGNhcmQ7ICAgICAvLyDniYzlgLwgCglpbnQgZmxvd2VyOyAgICAvLyDoqIjnrpfniYznmoToirHoibIgCglpbnQgbnVtYmVyOyAgICAvLyDoqIjnrpfniYznmoTpu57mlbggCglmbG9hdCBwb2ludDsgICAvLyDpgJnkuIDlsYDnmoTpu57mlbggCglmbG9hdCBmbnVtYmVyOyAvLyDpgJnlvLXniYznmoTpu57mlbggCglpbnQgY2FyZG51bTsgICAvLyDmiYvniYzmlbjph48gCn07CgoKdHlwZWRlZiBzdHJ1Y3QgcGxheWVyIFBsYXllcjsKc3RydWN0IHBsYXllcnsKCWNoYXIgcmVjb3JkW1RJTUVTXTsgIC8vIOaIsOe4viAKCWludCByZWNvcmRfZmxhZzsgICAgIC8vIOaIsOe4vumZo+WIl+e0ouW8lSAKCUhhbmRsZSBoYW5kOyAgICAgICAgICAvLyBzdHJ1Y3Qg5omL54mMIAoJaW50IENhc2U7ICAgICAgICAgICAgIC8vIENhc2UgMTog546p5a626KaB54mMIOmBiuaIsue1kOadnyAKfTsKCgoKLy8gU1dBUCDkuqTmj5sKCnZvaWQgU3dhcChpbnQgKmEsIGludCAqYil7CgoJLy8gcHJpbnRmKCIqKioqKiAgRnVuY3Rpb24gIFN3YXAgIEJlZ2luICAqKioqKlxuXG4iKTsKCglpbnQgdGVtcDsKCgl0ZW1wID0gKmE7CgkqYSA9ICpiOwoJKmIgPSB0ZW1wOwoKCXJldHVybjsKCgkvLyBwcmludGYoIioqKioqICBGdW5jdGlvbiAgU3dhcCAgRW5kICAqKioqKlxuXG4iKTsKCn0KCi8vIFNodXR0bGUg5rSX54mMICAKdm9pZCBTaHV0dGxlKGludCAqYXJyYXkpewoKCS8vIHByaW50ZigiKioqKiogIEZ1bmN0aW9uICBTaHR0bGUgIEJlZ2luICAqKioqKlxuXG4iKTsKCgkvL0JMQUNLX1JFRDsKCXByaW50ZigiQ3JlYXQgTmV3IERlY2sgQW5kIFNodXR0bGUgIVxuXG4iKTsKCS8vLy9CTEFDS19XSElURTsKCglpbnQgaSwgcG9zOwoJc3JhbmQoKHVuc2lnbmVkKXRpbWUoTlVMTCkpOwoJcmFuZCgpOyAvLyDlhYjmir3kuIDmrKHkuoLmlbgg5omT5LqC5LqC5pW45bqPIAoKCglmb3IgKGkgPSAwOyBpPDUyOyBpKyspewoKCQlhcnJheVtpXSA9IGkgKyAxOwoKCX0KCgoJZm9yIChpID0gMDsgaSAhPSBOOyArK2kpewoJCS8vIOWPluWHuuesrHBvc+W8teeJjAoJCXBvcyA9IChpbnQpKE4qKGRvdWJsZSlyYW5kKCkgLyBSQU5EX01BWCk7CgkJLy8g5Lqk5o+b56ysaeW8teiIh+esrHBvc+W8teeJjAoJCVN3YXAoJmFycmF5W2ldLCAmYXJyYXlbcG9zXSk7Cgl9CgoJLy8gcHJpbnRmKCIqKioqKiAgRnVuY3Rpb24gIFNodHRsZSAgRW5kICAqKioqKlxuXG4iKTsKCglyZXR1cm47Cgp9CgoKdm9pZCBEZWFsKGludCAqYXJyYXksIFBsYXllciAqYSwgaW50ICpmbGFnKXsKCgkvL0JMQUNLX1JFRDsKCXByaW50ZigiRGVhbCAhXG5cbiIpOwoJLy8vL0JMQUNLX1dISVRFOwoJYS0+aGFuZC5jYXJkID0gYXJyYXlbKmZsYWddOwoJKysqZmxhZzsKCWEtPmhhbmQuZmxvd2VyID0gYS0+aGFuZC5jYXJkICUgNDsKCWEtPmhhbmQubnVtYmVyID0gYS0+aGFuZC5jYXJkIC8gNDsKCWEtPmhhbmQuZm51bWJlciA9IGEtPmhhbmQubnVtYmVyOwoKCS8vIHByaW50ZigidGVzdCBjYXJkIG51bWJlciA6ICVkIFxuXG4iLGEtPmhhbmQuY2FyZCk7CgoJLy8gcHJpbnRmKCJZb3VyIGNhcmQgaXMgJWMlcyBcblxuIixmbG93ZXJfdGFibGVbZmxvd2VyXSxudW1iZXJfdGFibGVbbnVtYmVyXSk7CgoKfQoKCi8vIENhcmRudW0g566X5omL54mM5pW46YePCgp2b2lkIENhcmRudW0oaW50ICpjYXJkbnVtKXsKCgkqY2FyZG51bSA9ICpjYXJkbnVtICsgMTsKCn0KCgovLyBQb2ludCDnrpfmiYvniYzpu57mlbgKCnZvaWQgUG9pbnQoZmxvYXQgKmZudW1iZXIsIGZsb2F0ICpzdW1wb2ludCl7CgoJaWYgKCpmbnVtYmVyIDwxMC4wICYmICpmbnVtYmVyID4wLjApewoJCSpmbnVtYmVyID0gKmZudW1iZXIgKyAxLjA7CgkJKnN1bXBvaW50ID0gKnN1bXBvaW50ICsgKmZudW1iZXI7Cgl9CgllbHNlIGlmICgqZm51bWJlciA9PSAwLjApewoJCSpmbnVtYmVyID0gMS4wOwoJCSpzdW1wb2ludCA9ICpzdW1wb2ludCArICpmbnVtYmVyOwoJfQoJZWxzZSBpZiAoKmZudW1iZXIgPj0gMTAuMCAmJiAqZm51bWJlciA8PSAxMi4wKXsKCQkqZm51bWJlciA9IDAuNTsKCQkqc3VtcG9pbnQgPSAqc3VtcG9pbnQgKyAqZm51bWJlcjsKCX0KCn0KCi8vIFdhdGNoZGVhbCAg5b6X54mM6aGv56S6Cgp2b2lkIFdhdGNoZGVhbChQbGF5ZXIgKmEpewoKCS8vLy8gQkxBQ0tfQ1lBTjsKCXByaW50ZigiWW91ciBjYXJkIGlzICVjJXMgXG5cbiIsIGZsb3dlcl90YWJsZVthLT5oYW5kLmZsb3dlcl0sIG51bWJlcl90YWJsZVthLT5oYW5kLm51bWJlcl0pOwoJUG9pbnQoJmEtPmhhbmQuZm51bWJlciwgJmEtPmhhbmQucG9pbnQpOwoJcHJpbnRmKCJQT0lOVCBOb3c6ICUuMWZcblxuIiwgYS0+aGFuZC5wb2ludCk7CglDYXJkbnVtKCZhLT5oYW5kLmNhcmRudW0pOwoJcHJpbnRmKCJDYXJkIE51bSBOb3c6ICVkXG5cblxuXG4iLCBhLT5oYW5kLmNhcmRudW0pOwoJLy8vL0JMQUNLX1dISVRFOwoKfQoKCi8vIFdpbiBMb3NlICDovLjotI8gCgp2b2lkIExvc2UoUGxheWVyICpBLCBQbGF5ZXIgKkIpewoKCUEtPnJlY29yZFtBLT5yZWNvcmRfZmxhZ10gPSAnTCc7CglBLT5yZWNvcmRfZmxhZysrOwoJQi0+cmVjb3JkW0ItPnJlY29yZF9mbGFnXSA9ICdXJzsKCUItPnJlY29yZF9mbGFnKys7Cgp9Cgp2b2lkIFdpbihQbGF5ZXIgKkEsIFBsYXllciAqQil7CgoJQi0+cmVjb3JkW0EtPnJlY29yZF9mbGFnXSA9ICdMJzsKCUItPnJlY29yZF9mbGFnKys7CglBLT5yZWNvcmRbQi0+cmVjb3JkX2ZsYWddID0gJ1cnOwoJQS0+cmVjb3JkX2ZsYWcrKzsKCn0KCgp2b2lkIEdldGNhcmQoUGxheWVyICpBLCBQbGF5ZXIgKkIsIGludCBjYXJkW10sIGludCAqZmxhZyl7CgoJY2hhciBidWZmZXJbMl07CgljaGFyIHRlbXAgPSAnMCc7CglwcmludGYoIiVwXG4iLCAmQS0+Q2FzZSk7CgoJd2hpbGUgKDEpewoKCQkvLyDoqaLllY/mmK/lkKbopoHniYwJCgkJLy8vL0JMQUNLX1lFTExPVzsKCQlwcmludGYoIkRvIHlvdSB3YW50IHRvIGdldCBjYXJkID8gICggbWF4IGNhcmQgaXMgNSApXG5cbiIpOwoJCS8vLy9CTEFDS19ZRUxMT1c7CgkJcHJpbnRmKCJUeXBlIDEgZm9yIFlFUyAsIDIgZm9yIE5PIC5cblxuIik7CgkJLy8vL0JMQUNLX1dISVRFOwoKCQlzY2FuZigiICVjIiwgJnRlbXApOwoKCQkvLyDpmLLlkYbmqZ/liLYgIAoJCWlmICh0ZW1wICE9ICcxJyAmJiB0ZW1wICE9ICcyJyl7CgoJCQkvL0JMQUNLX1JFRDsKCQkJcHJpbnRmKCJZb3VyIFR5cGUgaXMgd3JvbmcgISBSZXR5cGUgUGxlYXNlLlxuIik7CgkJCS8vLy9CTEFDS19XSElURTsKCQkJc2NhbmYoIiAlYyIsICZ0ZW1wKTsKCQkJcHJpbnRmKCJcbiIpOwoKCQl9CgoJCS8vIOS4jeimgeeJjCAKCQlpZiAodGVtcCA9PSAnMicpewoJCQkvLy8vQkxBQ0tfWUVMTE9XOwoJCQlwcmludGYoIllvdSBEbyBOb3QgR2V0IENhcmQgQW55bW9yZSAhXG4iKTsKCQkJLy8vLyBCTEFDS19DWUFOOwoJCQlwcmludGYoIllvdXIgRW5kIFBvaW50IDogJS4xZlxuXG5cblxuIiwgQS0+aGFuZC5wb2ludCk7CgkJCS8vLy9CTEFDS19XSElURTsKCQkJcmV0dXJuOwoJCX0KCgoJCWlmICh0ZW1wID09ICcxJyl7CgkJCURlYWwoY2FyZCwgQSwgZmxhZyk7CgkJCVdhdGNoZGVhbChBKTsKCQkJaWYgKEEtPmhhbmQucG9pbnQgPjEwLjUpewoJCQkJLy9CTEFDS19SRUQ7CgkJCQlwcmludGYoIkJPT00gISBZT1UgTE9TRSAhXG5cbiIpOwoJCQkJLy8vL0JMQUNLX1dISVRFOwoJCQkJTG9zZShBLCBCKTsKCQkJCUEtPkNhc2UgPSAxOwoJCQkJcmV0dXJuOwoJCQl9CgkJCWlmIChBLT5oYW5kLmNhcmRudW0gPT0gNSl7CgkJCQkvL0JMQUNLX1JFRDsKCQkJCXByaW50ZigiRklWRSBDQVJEICEgWU9VIFdJTiAhXG5cbiIpOwoJCQkJLy8vL0JMQUNLX1dISVRFOwoJCQkJV2luKEEsIEIpOwoJCQkJQS0+Q2FzZSA9IDE7CgkJCQlyZXR1cm47CgkJCX0KCQkJaWYgKEEtPmhhbmQucG9pbnQgPT0gMTAuNSl7CgkJCQkvL0JMQUNLX1JFRDsKCQkJCXByaW50ZigiMTAuNSAhIFlPVSBXSU4gIVxuXG4iKTsKCQkJCS8vLy9CTEFDS19XSElURTsKCQkJCVdpbihBLCBCKTsKCQkJCUEtPkNhc2UgPSAxOwoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCX0KCn0KCnZvaWQgQ2dldGNhcmQoUGxheWVyICpBLCBQbGF5ZXIgKkIsIGludCBjYXJkW10sIGludCAqZmxhZyl7CgoJLy9CTEFDS19QVVJQTEU7CglwcmludGYoIkNvbXB1dGVyJ3MgRmlyc3QgQ2FyZCBpcyAlYyVzXG5cbiIsIGZsb3dlcl90YWJsZVtCLT5oYW5kLmZsb3dlcl0sIG51bWJlcl90YWJsZVtCLT5oYW5kLm51bWJlcl0pOwoJcHJpbnRmKCJDb3VtcHV0ZXIncyBQb2ludCA6ICUuMWZcblxuIiwgQi0+aGFuZC5wb2ludCk7Cgp9CgoKCnZvaWQgRGlzcGxheSgpewoKCS8vLy9CTEFDS19ZRUxMT1c7CglwcmludGYoIlxuR2FtZSBTdGFydCAhXG5cbiIpOwoJLy8vL0JMQUNLX1dISVRFOwoKCS8vIOW7uueri+eJjOe1hCAKCWludCBjYXJkWzUyXSA9IHt9OwoJaW50IGZsYWcgPSAwOyAgLy8g54mM57WE5aCG55aK55So5peX5qiZIAoKCS8vIOa0l+eJjCAKCVNodXR0bGUoY2FyZCk7CgoJLy8g5bu656uLUGxheWVyIAoJUGxheWVyIEE7CglBLmhhbmQuY2FyZG51bSA9IDA7CglBLmhhbmQuZm51bWJlciA9IDAuMDsKCUEuaGFuZC5wb2ludCA9IDAuMDsKCUEucmVjb3JkX2ZsYWcgPSAwOwoJQS5DYXNlID0gMDsKCglpbnQgaSA9IDA7Cglmb3IgKGkgPSAwOyBpPFRJTUVTOyBpKyspewoJCUEucmVjb3JkW2ldID0gJ1wwJzsKCX0KCglQbGF5ZXIgQjsKCUIuaGFuZC5jYXJkbnVtID0gMDsKCUIuaGFuZC5mbnVtYmVyID0gMC4wOwoJQi5oYW5kLnBvaW50ID0gMC4wOwoJQi5yZWNvcmRfZmxhZyA9IDA7CglCLkNhc2UgPSAwOwoKCWZvciAoaSA9IDA7IGk8VElNRVM7IGkrKyl7CgkJQi5yZWNvcmRbaV0gPSAnXDAnOwoJfQoKCgkvLyDnrKzkuIDmrKHnmbzniYwgKOeOqeWutikgCgkvL0JMQUNLX1lFTExPVzsKCXByaW50ZigiWW91IEdldCBGaXJzdC5cblxuIik7CgkvL0JMQUNLX1dISVRFOwoKCURlYWwoY2FyZCwgJkEsICZmbGFnKTsKCgkvLyBCTEFDS19DWUFOOwoJcHJpbnRmKCJZb3VyIGNhcmQgaXMgJWMlcyBcblxuIiwgZmxvd2VyX3RhYmxlW0EuaGFuZC5mbG93ZXJdLCBudW1iZXJfdGFibGVbQS5oYW5kLm51bWJlcl0pOwoJUG9pbnQoJkEuaGFuZC5mbnVtYmVyLCAmQS5oYW5kLnBvaW50KTsKCXByaW50ZigiUE9JTlQ6ICUuMWZcblxuIiwgQS5oYW5kLnBvaW50KTsKCUNhcmRudW0oJkEuaGFuZC5jYXJkbnVtKTsKCXByaW50ZigiQ2FyZCBOdW0gTm93OiAlZFxuXG4iLCBBLmhhbmQuY2FyZG51bSk7CgkvL0JMQUNLX1dISVRFOwoKCS8vIOesrOS4gOasoeeZvOeJjCAo6Zu76IWmKQoJLy9CTEFDS19ZRUxMT1c7CglwcmludGYoIkNvbXB1dGVyIEdldCBOb3cuXG5cbiIpOwoJLy9CTEFDS19XSElURTsKCglEZWFsKGNhcmQsICZCLCAmZmxhZyk7CglDYXJkbnVtKCZCLmhhbmQuY2FyZG51bSk7CglwcmludGYoIlxuXG4iKTsKCgkvLyBwcmludGYoIkNvbXB1dGVyJ3MgY2FyZCBpcyAlNWMlc1xuXG4iLGZsb3dlcl90YWJsZVtCLmhhbmQuZmxvd2VyXSxudW1iZXJfdGFibGVbQi5oYW5kLm51bWJlcl0pOyAvLyDpm7vohabnmoTpu57mlbgo5oyJ6YGK5oiy6KaP5YmH5LiN6aGv56S6KSAKCVBvaW50KCZCLmhhbmQuZm51bWJlciwgJkIuaGFuZC5wb2ludCk7CgoJcHJpbnRmKCIlcFxuIiwgJkEuQ2FzZSk7CgkvLyDopoHniYwo546p5a62KSAKCUdldGNhcmQoJkEsICZCLCBjYXJkLCAmZmxhZyk7CglwcmludGYoIiVwXG4iLCAmQS5DYXNlKTsKCWlmIChBLkNhc2UgPT0gMSkgcmV0dXJuOyAgLy8g546p5a626bue5pW454iGICYg6YGO5LqU6ZecICYgMTDljYog57WQ5p2f6YGK5oiyIAoKCS8vIOimgeeJjCjpm7vohaYpIAoJQ2dldGNhcmQoJkEsICZCLCBjYXJkLCAmZmxhZyk7CgoKfQoKCgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewoKCWNoYXIgcCA9IDA7CgkvLyBCTEFDS19CTFVFOwoJcHJpbnRmKCJQcm9ncmFtIFN0YXJ0ICFcblxuIik7CgkvL0JMQUNLX1dISVRFOwoJZG97CgkJRGlzcGxheSgpOwoJCS8vQkxBQ0tfWUVMTE9XOwoJCXByaW50ZigiRG8geW91IHdhbnQgdG8gcGxheSBhZ2FpbiA/XG4oMSBmb3IgWUVTIDIgZm9yIE5PLilcblxuIik7CgkJLy9CTEFDS19XSElURTsKCQlzY2FuZigiICVjIiwgJnApOwoJCXdoaWxlIChwICE9ICcxJyAmJiBwICE9ICcyJyl7CgkJCS8vQkxBQ0tfWUVMTE9XOwoJCQlwcmludGYoIlR5cGUgV3JvbmcgISBSZXR5cGUgIVxuXG4iKTsKCQkJLy9CTEFDS19XSElURTsKCQkJc2NhbmYoIiAlYyIsICZwKTsKCQl9Cgl9IHdoaWxlIChwID09ICcxJyk7CgoJaWYgKHAgPT0gJzInKXsKCQkvLyBCTEFDS19CTFVFOwoJCXByaW50ZigiXG5Qcm9ncmFtIEVuZC5cblxuIik7CgkJLy9CTEFDS19XSElURTsKCX0KCglyZXR1cm4gMDsKfQ==