/*
_______________________________________
| Thành Viên Nhóm | Mã Sinh Viên |
|_____________________________________|
| Nguy?n Ð?c Quang | :2411061767 |
| |
| Tr?n Minh Quang | :2411062029 |
| |
| Lu?ng Vi?t Nh?t | :2411061614 |
| |
| Hoàng Gia Th? | :2411061927 |
| |
| Nguy?n Ti?n Dung | :2411061649 |
|_____________________________________|
*/
/*
_______________________________________
| Thành Viên Nhóm | Ma Sinh Viên |
|_____________________________________|
| Nguy?n Ð?c Quang | :2411061767 |
| |
| Tr?n Minh Quang | :2411062029 |
| |
| Lu?ng Vi?t Nh?t | :2411061614 |
| |
| Hoàng Gia Th? | :2411061927 |
| |
| Nguy?n Ti?n Dung | :2411061649 |
|_____________________________________|
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100
typedef int Position;
// Cau truc sinh vien
struct Sinhvien {
char id[ 20 ] ;
char name[ 50 ] ;
char ns[ 20 ] ;
int tuoi;
} ;
// Kieu danh sach mang
typedef struct {
struct Sinhvien A[ MAX] ;
int Last;
} List;
// ================== Cac thao tac co ban ==================
// Vi tri dau tien
Position FIRST( List L) {
return 1 ;
}
// Vi tri ket thuc (sau phan tu cuoi)
Position END( List L) {
return L.Last + 1 ;
}
// Vi tri ke tiep
Position NEXT( Position P, List L) {
if ( P < END( L) ) return P + 1 ;
return END( L) ;
}
// Vi tri truoc do
Position PREVIOUS( Position P, List L) {
if ( P > FIRST( L) ) return P - 1 ;
return FIRST( L) ;
}
// Lay phan tu o vi tri P
struct Sinhvien RETRIEVE( Position P, List L) {
return L.A [ P- 1 ] ;
}
// Tim sinh vien theo MSSV
Position LOCATE( char id[ ] , List L) {
for ( int i = 0 ; i < L.Last ; i++ ) {
if ( strcmp ( L.
A [ i
] .
id , id
) == 0 ) return i+ 1 ;
}
return END( L) ;
}
// Tao danh sach rong
void MAKENULL_LIST( List * L) {
L-> Last = 0 ;
}
// Kiem tra rong
int EMPTY_LIST( List L) {
return L.Last == 0 ;
}
// Chen phan tu vao vi tri P
void INSERT_LIST( struct Sinhvien x, Position P, List * L) {
if ( L-> Last >= MAX) {
return ;
}
if ( P < FIRST( * L) || P > END( * L) ) {
printf ( "Vi tri khong hop le\n " ) ; return ;
}
for ( int i = L-> Last; i >= P; i-- ) {
L-> A[ i] = L-> A[ i- 1 ] ;
}
L-> A[ P- 1 ] = x;
L-> Last++;
}
// Xoa phan tu tai vi tri P
void DELETE_LIST( Position P, List * L) {
if ( P < FIRST( * L) || P >= END( * L) ) {
printf ( "Vi tri khong hop le\n " ) ; return ;
}
for ( int i = P- 1 ; i < L-> Last- 1 ; i++ ) {
L-> A[ i] = L-> A[ i+ 1 ] ;
}
L-> Last--;
}
// ================== Cac chuc nang mo rong ==================
// Chuan hoa ngay sinh
void ChuanHoan( char s[ ] , int size) {
for ( int i = 0 ; i < size; i++ ) {
if ( s[ i] == '/' ) {
if ( i == 1 ) {
for ( int j = size; j >= 0 ; j-- ) {
s[ j+ 1 ] = s[ j] ;
}
s[ 0 ] = '0' ;
size++;
}
if ( s[ i+ 2 ] == '/' && i+ 2 < size) {
for ( int k = size; k >= i+ 1 ; k-- ) {
s[ k+ 1 ] = s[ k] ;
}
s[ i+ 1 ] = '0' ;
size++;
}
}
}
}
int laNamNhuan( int y) {
return ( ( y % 400 == 0 ) || ( y % 4 == 0 && y % 100 != 0 ) ) ;
}
int soNgayTrongThang( int m, int y) {
if ( m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12 )
return 31 ;
if ( m == 4 || m == 6 || m == 9 || m == 11 )
return 30 ;
if ( m == 2 )
return laNamNhuan( y) ? 29 : 28 ;
return 0 ;
}
// Nhap thong tin sinh vien moi
struct Sinhvien nhapSinhVien( List L) {
struct Sinhvien sv;
printf ( "\n +-----------------------------------------+\n " ) ; printf ( "| NHAP THONG TIN SINH VIEN MOI |\n " ) ; printf ( "+-----------------------------------------+\n " ) ; while ( 1 ) {
if ( LOCATE( sv.id , L) != END( L) ) {
printf ( "MSSV da ton tai, nhap lai\n " ) ; } else {
break ;
}
}
scanf ( " %[^\n ]" , sv.
name ) ;
do {
printf ( "Nhap ngay sinh (dd/mm/yyyy): " ) ;
ChuanHoan( sv.ns , size) ;
// printf("%s",sv.ns);
char day[ 3 ] , month[ 3 ] , year[ 5 ] ;
day[ 0 ] = sv.ns [ 0 ] ;
day[ 1 ] = sv.ns [ 1 ] ;
day[ 2 ] = '\0 ' ;
month[ 0 ] = sv.ns [ 3 ] ;
month[ 1 ] = sv.ns [ 4 ] ;
month[ 2 ] = '\0 ' ;
for ( int i = 6 , j = 0 ; i <= size; i++, j++ ) {
year[ j] = sv.ns [ i] ;
year[ j+ 1 ] = '\0 ' ;
}
// printf("thang: %d \n",m);
// printf("nam: %d \n",y);
int maxday = soNgayTrongThang( m, y) ;
// printf("Ngay max: %d \n",maxday);
if ( d <= 0 || d > maxday || m <= 0 || m > 12 || y <= 100 ) {
printf ( "Ngay sinh khong hop le vui long nhap lai!\n " ) ; } else {
int namNow = 2025 ;
do {
if ( sv.tuoi < namNow - y - 2 || sv.tuoi > namNow - y + 2 ) {
printf ( "Vui long nhap lai tuoi dung voi tuoi that cua ban\n " ) ; }
} while ( sv.tuoi < namNow - y - 2 || sv.tuoi > namNow - y + 2 ) ;
break ;
}
} while ( 1 ) ;
return sv;
}
// In danh sach sinh vien
void PRINT_LIST( List L) {
if ( L.Last == 0 ) {
return ;
}
printf ( "\n |-----+--------------+---------------------------+--------------+-------|\n " ) ; printf ( "| STT | MSSV | Ho Ten | Ngay Sinh | Tuoi |\n " ) ; printf ( "|-----+--------------+---------------------------+--------------+-------|\n " ) ;
for ( int i = 0 ; i < L.Last ; i++ ) {
printf ( "| %-3d | %-12s | %-25s | %-12s | %-5d |\n " , i+ 1 , L.A [ i] .id , L.A [ i] .name , L.A [ i] .ns , L.A [ i] .tuoi ) ;
}
printf ( "|-----+--------------+---------------------------+--------------+-------|\n " ) ; }
// Sap xep theo ten
void SORT_BY_NAME( List * L) {
for ( int i = 0 ; i < L-> Last - 1 ; i++ ) {
for ( int j = i + 1 ; j < L-> Last; j++ ) {
if ( strcmp ( L
-> A
[ i
] .
name , L
-> A
[ j
] .
name ) > 0 ) { struct Sinhvien tmp = L-> A[ i] ;
L-> A[ i] = L-> A[ j] ;
L-> A[ j] = tmp;
}
}
}
printf ( "Da sap xep theo ten\n " ) ; }
// Sap xep theo tuoi
void SORT_BY_TUOI( List * L) {
for ( int i = 0 ; i < L-> Last - 1 ; i++ ) {
for ( int j = i + 1 ; j < L-> Last; j++ ) {
if ( L-> A[ i] .tuoi > L-> A[ j] .tuoi ) {
struct Sinhvien tmp = L-> A[ i] ;
L-> A[ i] = L-> A[ j] ;
L-> A[ j] = tmp;
}
}
}
printf ( "Da sap xep theo tuoi\n " ) ; }
// Tim kiem theo ten
void SEARCH_BY_NAME( List L) {
char ten[ 50 ] ;
int found = 0 ;
printf ( ">> Nhap ten can tim: " ) ; for ( int i = 0 ; i < L.Last ; i++ ) {
if ( strcmp ( L.
A [ i
] .
name , ten
) == 0 ) { printf ( "MSSV: %s | Ho ten: %s | Ngay sinh: %s | Tuoi: %d\n " , L.A [ i] .id , L.A [ i] .name , L.A [ i] .ns , L.A [ i] .tuoi ) ;
found = 1 ;
}
}
if ( ! found
) printf ( "Khong tim thay sinh vien\n " ) ; }
// ================== MAIN ==================
int main( ) {
char * names[ ] = {
"NGUYEN DUC QUANG" ,
"TRAN MINH QUANG" ,
"LUONG VIET NHAT" ,
"HOANG GIA THE" ,
"NGUYEN TIEN DUNG"
} ;
char * ids[ ] = {
"2411061767" ,
"2411062029" ,
"2411061614" ,
"2411061927" ,
"2411061649"
} ;
int n = 5 ; // so thanh vien
printf ( "+==================================================================================+\n " ) ; printf ( "| BAI TAP LON BAI 7 - QUAN LI SINH VIEN | \n " ) ; printf ( "+==================================================================================+\n " ) ; printf ( "| %-30s | %-20s | |\n " , "THANH VIEN NHOM" , "MA SINH VIEN" ) ; printf ( "+----------------------------------------------------------------------------------+\n " ) ;
for ( int i = 0 ; i < n; i++ ) {
printf ( "| %-30s | :%-19s | | \n " , names
[ i
] , ids
[ i
] ) ; printf ( "+----------------------------------------------------------------------------------+\n " ) ; }
List L;
MAKENULL_LIST( & L) ;
int choice;
while ( 1 ) {
printf ( "\n +=================================================================+\n " ) ; printf ( "| HE THONG QUAN LY SINH VIEN |\n " ) ; printf ( "+=================================================================+\n " ) ; printf ( "| [1] Them sinh vien vao vi tri bat ky (INSERT_LIST) |\n " ) ; printf ( "| [2] Xoa sinh vien tai vi tri (DELETE_LIST) |\n " ) ; printf ( "| [3] Tim kiem sinh vien theo MSSV (LOCATE) |\n " ) ; printf ( "| [4] Xem thong tin theo vi tri (RETRIEVE) |\n " ) ; printf ( "| [5] In danh sach sinh vien (PRINT_LIST) |\n " ) ; printf ( "| [6] Sap xep danh sach theo ten |\n " ) ; printf ( "| [7] Sap xep danh sach theo tuoi |\n " ) ; printf ( "| [8] Tim kiem sinh vien theo ten |\n " ) ; printf ( "| [0] Thoat chuong trinh |\n " ) ; printf ( "+=================================================================+\n " ) ; printf ( ">> Nhap lua chon cua ban: " ) ;
if ( choice == 0 ) {
break ;
}
switch ( choice) {
case 1 : {
struct Sinhvien sv = nhapSinhVien( L) ;
Position p;
printf ( "Nhap Vi Tri Sinh Vien Muon Them Chen Vao Dau 1 Cuoi 2: " ) ; if ( p == 1 ) {
INSERT_LIST( sv, 1 , & L) ;
printf ( "Them sinh vien vao thanh cong. " ) ; }
else if ( p == 2 ) {
INSERT_LIST( sv, END( L) , & L) ;
printf ( "Them sinh vien vao thanh cong. " ) ; }
else {
printf ( "Lua chon khong hop le \n " ) ; }
break ;
}
case 2 : {
Position p;
printf ( ">> Nhap vi tri muon xoa (1..%d): " , L.
Last ) ; DELETE_LIST( p, & L) ;
break ;
}
case 3 : {
char id[ 20 ] ;
printf ( "\n +-----------------------------------------+\n " ) ; printf ( "| TIM KIEM SINH VIEN THEO MSV |\n " ) ; printf ( "+-----------------------------------------+\n " ) ; printf ( ">> Nhap MSV can tim: " ) ; Position pos = LOCATE( id, L) ;
if ( pos == END( L) ) {
} else {
struct Sinhvien sv = RETRIEVE( pos, L) ;
printf ( "Tim thay MSSV: %s | Ho ten: %s | Ngay sinh: %s | Tuoi: %d\n " , sv.id , sv.name , sv.ns , sv.tuoi ) ;
}
break ;
}
case 4 : {
Position p;
printf ( "\n +-----------------------------------------+\n " ) ; printf ( "| XEM THONG TIN THEO VI TRI |\n " ) ; printf ( "+-----------------------------------------+\n " ) ; if ( p < FIRST( L) || p >= END( L) ) {
printf ( "Vi tri khong hop le\n " ) ; } else {
struct Sinhvien sv = RETRIEVE( p, L) ;
printf ( "Thong tin SV tai vi tri %d: MSSV: %s | Ho ten: %s | Ngay sinh: %s | Tuoi: %d\n " , p, sv.id , sv.name , sv.ns , sv.tuoi ) ;
}
break ;
}
case 5 :
PRINT_LIST( L) ;
break ;
case 6 :
SORT_BY_NAME( & L) ;
break ;
case 7 :
SORT_BY_TUOI( & L) ;
break ;
case 8 :
SEARCH_BY_NAME( L) ;
break ;
default :
printf ( "Lua chon khong hop le\n " ) ; }
}
return 0 ;
}
LyoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCnwgICBUaMOgbmggVmnDqm4gTmjDs20gIHwgICBNw6MgU2luaCBWacOqbiB8CnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAp8CU5ndXk/biDDkD9jIFF1YW5nIHwJOjI0MTEwNjE3NjcJICB8CnwJCQkJCQkJCQkgIHwKfAlUcj9uIE1pbmggUXVhbmcJIHwJOjI0MTEwNjIwMjkgICB8CnwJCQkJCQkJCQkgIHwKfAlMdT9uZyBWaT90IE5oP3QJIHwJOjI0MTEwNjE2MTQgICB8CnwJCQkJCQkJCQkgIHwKfAlIb8OgbmcgR2lhIFRoPwkgfAk6MjQxMTA2MTkyNyAgIHwKfAkJCQkJCQkJCSAgfAp8CU5ndXk/biBUaT9uIER1bmcgfAk6MjQxMTA2MTY0OSAgIHwKfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiovCi8qCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp8ICAgVGjDoG5oIFZpw6puIE5ow7NtICB8ICAgTWEgU2luaCBWacOqbiB8CnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAp8CU5ndXk/biDDkD9jIFF1YW5nIHwJOjI0MTEwNjE3NjcJICB8CnwJCQkJCQkJCQkgIHwKfAlUcj9uIE1pbmggUXVhbmcJIHwJOjI0MTEwNjIwMjkgICB8CnwJCQkJCQkJCQkgIHwKfAlMdT9uZyBWaT90IE5oP3QJIHwJOjI0MTEwNjE2MTQgICB8CnwJCQkJCQkJCQkgIHwKfAlIb8OgbmcgR2lhIFRoPwkgfAk6MjQxMTA2MTkyNyAgIHwKfAkJCQkJCQkJCSAgfAp8CU5ndXk/biBUaT9uIER1bmcgfAk6MjQxMTA2MTY0OSAgIHwKfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2RlZmluZSBNQVggMTAwCnR5cGVkZWYgaW50IFBvc2l0aW9uOwoKLy8gQ2F1IHRydWMgc2luaCB2aWVuCnN0cnVjdCBTaW5odmllbiB7CiAgICBjaGFyIGlkWzIwXTsKICAgIGNoYXIgbmFtZVs1MF07CiAgICBjaGFyIG5zWzIwXTsKICAgIGludCB0dW9pOwp9OwoKLy8gS2lldSBkYW5oIHNhY2ggbWFuZwp0eXBlZGVmIHN0cnVjdCB7CiAgICBzdHJ1Y3QgU2luaHZpZW4gQVtNQVhdOwogICAgaW50IExhc3Q7IAp9IExpc3Q7CgovLyA9PT09PT09PT09PT09PT09PT0gQ2FjIHRoYW8gdGFjIGNvIGJhbiA9PT09PT09PT09PT09PT09PT0KCi8vIFZpIHRyaSBkYXUgdGllbgpQb3NpdGlvbiBGSVJTVChMaXN0IEwpIHsKICAgIHJldHVybiAxOwp9CgovLyBWaSB0cmkga2V0IHRodWMgKHNhdSBwaGFuIHR1IGN1b2kpClBvc2l0aW9uIEVORChMaXN0IEwpIHsKICAgIHJldHVybiBMLkxhc3QgKyAxOwp9CgovLyBWaSB0cmkga2UgdGllcApQb3NpdGlvbiBORVhUKFBvc2l0aW9uIFAsIExpc3QgTCkgewogICAgaWYgKFAgPCBFTkQoTCkpIHJldHVybiBQICsgMTsKICAgIHJldHVybiBFTkQoTCk7Cn0KCi8vIFZpIHRyaSB0cnVvYyBkbwpQb3NpdGlvbiBQUkVWSU9VUyhQb3NpdGlvbiBQLCBMaXN0IEwpIHsKICAgIGlmIChQID4gRklSU1QoTCkpIHJldHVybiBQIC0gMTsKICAgIHJldHVybiBGSVJTVChMKTsKfQoKLy8gTGF5IHBoYW4gdHUgbyB2aSB0cmkgUApzdHJ1Y3QgU2luaHZpZW4gUkVUUklFVkUoUG9zaXRpb24gUCwgTGlzdCBMKSB7CiAgICByZXR1cm4gTC5BW1AtMV07Cn0KCi8vIFRpbSBzaW5oIHZpZW4gdGhlbyBNU1NWClBvc2l0aW9uIExPQ0FURShjaGFyIGlkW10sIExpc3QgTCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMLkxhc3Q7IGkrKykgewogICAgICAgIGlmIChzdHJjbXAoTC5BW2ldLmlkLCBpZCkgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIGkrMTsKICAgIH0KICAgIHJldHVybiBFTkQoTCk7Cn0KCi8vIFRhbyBkYW5oIHNhY2ggcm9uZwp2b2lkIE1BS0VOVUxMX0xJU1QoTGlzdCAqTCkgewogICAgTC0+TGFzdCA9IDA7Cn0KCi8vIEtpZW0gdHJhIHJvbmcKaW50IEVNUFRZX0xJU1QoTGlzdCBMKXsKICAgIHJldHVybiBMLkxhc3QgPT0gMDsKfQoKLy8gQ2hlbiBwaGFuIHR1IHZhbyB2aSB0cmkgUAp2b2lkIElOU0VSVF9MSVNUKHN0cnVjdCBTaW5odmllbiB4LCBQb3NpdGlvbiBQLCBMaXN0ICpMKSB7CiAgICBpZiAoTC0+TGFzdCA+PSBNQVgpIHsKICAgICAgICBwcmludGYoIkRhbmggc2FjaCBkYXlcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChQIDwgRklSU1QoKkwpIHx8IFAgPiBFTkQoKkwpKSB7CiAgICAgICAgcHJpbnRmKCJWaSB0cmkga2hvbmcgaG9wIGxlXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGludCBpID0gTC0+TGFzdDsgaSA+PSBQOyBpLS0pIHsKICAgICAgICBMLT5BW2ldID0gTC0+QVtpLTFdOwogICAgfQogICAgCiAgICBMLT5BW1AtMV0gPSB4OwogICAgTC0+TGFzdCsrOwp9CgovLyBYb2EgcGhhbiB0dSB0YWkgdmkgdHJpIFAKdm9pZCBERUxFVEVfTElTVChQb3NpdGlvbiBQLCBMaXN0ICpMKSB7CiAgICBpZiAoUCA8IEZJUlNUKCpMKSB8fCBQID49IEVORCgqTCkpIHsKICAgICAgICBwcmludGYoIlZpIHRyaSBraG9uZyBob3AgbGVcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoaW50IGkgPSBQLTE7IGkgPCBMLT5MYXN0LTE7IGkrKykgewogICAgICAgIEwtPkFbaV0gPSBMLT5BW2krMV07CiAgICB9CiAgICBMLT5MYXN0LS07Cn0KCi8vID09PT09PT09PT09PT09PT09PSBDYWMgY2h1YyBuYW5nIG1vIHJvbmcgPT09PT09PT09PT09PT09PT09CgoKLy8gQ2h1YW4gaG9hIG5nYXkgc2luaAoKdm9pZCBDaHVhbkhvYW4oY2hhciBzW10sIGludCBzaXplKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgIGlmIChzW2ldID09ICcvJykgewogICAgICAgICAgICBpZiAoaSA9PSAxKSB7IAogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHNpemU7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICAgICAgICAgICAgc1tqKzFdID0gc1tqXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNbMF0gPSAnMCc7CiAgICAgICAgICAgICAgICBzaXplKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNbaSsyXSA9PSAnLycgJiYgaSsyIDwgc2l6ZSkgewogICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IHNpemU7IGsgPj0gaSsxOyBrLS0pIHsKICAgICAgICAgICAgICAgICAgICBzW2srMV0gPSBzW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc1tpKzFdID0gJzAnOwogICAgICAgICAgICAgICAgc2l6ZSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgoKCmludCBsYU5hbU5odWFuKGludCB5KSB7CiAgICByZXR1cm4gKCAoeSAlIDQwMCA9PSAwKSB8fCAoeSAlIDQgPT0gMCAmJiB5ICUgMTAwICE9IDApICk7Cn0KCmludCBzb05nYXlUcm9uZ1RoYW5nKGludCBtLCBpbnQgeSkgewogICAgaWYgKG0gPT0gMSB8fCBtID09IDMgfHwgbSA9PSA1IHx8IG0gPT0gNyB8fCBtID09IDggfHwgbSA9PSAxMCB8fCBtID09IDEyKQogICAgICAgIHJldHVybiAzMTsKICAgIGlmIChtID09IDQgfHwgbSA9PSA2IHx8IG0gPT0gOSB8fCBtID09IDExKQogICAgICAgIHJldHVybiAzMDsKICAgIGlmIChtID09IDIpCiAgICAgICAgcmV0dXJuIGxhTmFtTmh1YW4oeSkgPyAyOSA6IDI4OwogICAgcmV0dXJuIDA7IAp9CgoKCgoKCi8vIE5oYXAgdGhvbmcgdGluIHNpbmggdmllbiBtb2kKc3RydWN0IFNpbmh2aWVuIG5oYXBTaW5oVmllbihMaXN0IEwpIHsKICAgIHN0cnVjdCBTaW5odmllbiBzdjsKICAgIHByaW50ZigiXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iKTsKICAgIHByaW50ZigifCAgICAgICBOSEFQIFRIT05HIFRJTiBTSU5IIFZJRU4gTU9JICAgICAgfFxuIik7CiAgICBwcmludGYoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiIpOwoJd2hpbGUgKDEpIHsKICAgICAgICBwcmludGYoIj4+IE5oYXAgTVNTVjogIik7CiAgICAgICAgc2NhbmYoIiVzIiwgc3YuaWQpOwogICAgICAgIGlmIChMT0NBVEUoc3YuaWQsIEwpICE9IEVORChMKSkgewogICAgICAgICAgICBwcmludGYoIk1TU1YgZGEgdG9uIHRhaSwgbmhhcCBsYWlcbiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIHByaW50ZigiPj4gTmhhcCBobyB0ZW46ICIpOwogICAgc2NhbmYoIiAlW15cbl0iLCBzdi5uYW1lKTsKICAgIAogIGRvIHsKICAgIHByaW50ZigiTmhhcCBuZ2F5IHNpbmggKGRkL21tL3l5eXkpOiAiKTsKICAgIHNjYW5mKCIlcyIsIHN2Lm5zKTsKICAgIAogICAgaW50IHNpemUgPSBzdHJsZW4oc3YubnMpOwogICAgQ2h1YW5Ib2FuKHN2Lm5zLCBzaXplKTsKICAgIAovLyAgICBwcmludGYoIiVzIixzdi5ucyk7CgogICAgY2hhciBkYXlbM10sIG1vbnRoWzNdLCB5ZWFyWzVdOwoKIAogICAgZGF5WzBdID0gc3YubnNbMF07CiAgICBkYXlbMV0gPSBzdi5uc1sxXTsKICAgIGRheVsyXSA9ICdcMCc7CgogIAogICAgbW9udGhbMF0gPSBzdi5uc1szXTsKICAgIG1vbnRoWzFdID0gc3YubnNbNF07CiAgICBtb250aFsyXSA9ICdcMCc7CgogICAgZm9yIChpbnQgaSA9IDYsIGogPSAwOyBpIDw9IHNpemU7IGkrKywgaisrKSB7CiAgICAgICAgeWVhcltqXSA9IHN2Lm5zW2ldOwogICAgICAgIHllYXJbaisxXSA9ICdcMCc7CiAgICB9CgogICAgaW50IGQgPSBhdG9pKGRheSk7CiAgICBpbnQgbSA9IGF0b2kobW9udGgpOwogICAgaW50IHkgPSBhdG9pKHllYXIpOwovLyAgICBwcmludGYoInRoYW5nOiAlZCBcbiIsbSk7Ci8vICAgIHByaW50ZigibmFtOiAlZCBcbiIseSk7CiAgICBpbnQgbWF4ZGF5ID0gc29OZ2F5VHJvbmdUaGFuZyhtLHkpOwovLwlwcmludGYoIk5nYXkgbWF4OiAlZCBcbiIsbWF4ZGF5KTsKICAgIGlmIChkIDw9IDAgfHwgZCA+IG1heGRheSB8fCBtIDw9IDAgfHwgbSA+IDEyIHx8IHkgPD0gMTAwKSB7CiAgICAgICAgcHJpbnRmKCJOZ2F5IHNpbmgga2hvbmcgaG9wIGxlIHZ1aSBsb25nIG5oYXAgbGFpIVxuIik7CiAgICB9IGVsc2UgewogICAgCQogICAgaW50IG5hbU5vdyA9IDIwMjU7CgoJZG8gewoJICAgIHByaW50ZigiTmhhcCB0dW9pOiAiKTsKCSAgICBzY2FuZigiJWQiLCAmc3YudHVvaSk7CgkgICAgaWYgKHN2LnR1b2kgPCBuYW1Ob3cgLSB5IC0gMiB8fCBzdi50dW9pID4gbmFtTm93IC0geSArIDIpIHsKCSAgICAgICAgcHJpbnRmKCJWdWkgbG9uZyBuaGFwIGxhaSB0dW9pIGR1bmcgdm9pIHR1b2kgdGhhdCBjdWEgYmFuXG4iKTsKCSAgICB9Cgl9IHdoaWxlIChzdi50dW9pIDwgbmFtTm93IC0geSAtIDIgfHwgc3YudHVvaSA+IG5hbU5vdyAtIHkgKyAyKTsKCSAgICAJCiAgICAJCiAgICAgICAgYnJlYWs7IAogICAgfQoKfSB3aGlsZSAoMSk7CgogICAgCiAgICByZXR1cm4gc3Y7Cn0KCgovLyBJbiBkYW5oIHNhY2ggc2luaCB2aWVuCnZvaWQgUFJJTlRfTElTVChMaXN0IEwpIHsKICAgIGlmIChMLkxhc3QgPT0gMCkgewogICAgICAgIHByaW50ZigiRGFuaCBzYWNoIHJvbmchXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcHJpbnRmKCJcbnwtLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLXxcbiIpOwogICAgcHJpbnRmKCJ8IFNUVCB8IE1TU1YgICAgICAgICB8IEhvIFRlbiAgICAgICAgICAgICAgICAgICAgfCBOZ2F5IFNpbmggICAgfCBUdW9pICB8XG4iKTsKICAgIHByaW50ZigifC0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tfFxuIik7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMLkxhc3Q7IGkrKykgewogICAgICAgIHByaW50ZigifCAlLTNkIHwgJS0xMnMgfCAlLTI1cyB8ICUtMTJzIHwgJS01ZCB8XG4iLAogICAgICAgICAgICAgICBpKzEsIEwuQVtpXS5pZCwgTC5BW2ldLm5hbWUsIEwuQVtpXS5ucywgTC5BW2ldLnR1b2kpOwogICAgfQoKICAgIHByaW50ZigifC0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tfFxuIik7Cn0KCgovLyBTYXAgeGVwIHRoZW8gdGVuCnZvaWQgU09SVF9CWV9OQU1FKExpc3QgKkwpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTC0+TGFzdCAtIDE7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IEwtPkxhc3Q7IGorKykgewogICAgICAgICAgICBpZiAoc3RyY21wKEwtPkFbaV0ubmFtZSwgTC0+QVtqXS5uYW1lKSA+IDApIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBTaW5odmllbiB0bXAgPSBMLT5BW2ldOwogICAgICAgICAgICAgICAgTC0+QVtpXSA9IEwtPkFbal07CiAgICAgICAgICAgICAgICBMLT5BW2pdID0gdG1wOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcHJpbnRmKCJEYSBzYXAgeGVwIHRoZW8gdGVuXG4iKTsKfQoKLy8gU2FwIHhlcCB0aGVvIHR1b2kKdm9pZCBTT1JUX0JZX1RVT0koTGlzdCAqTCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMLT5MYXN0IC0gMTsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgTC0+TGFzdDsgaisrKSB7CiAgICAgICAgICAgIGlmIChMLT5BW2ldLnR1b2kgPiBMLT5BW2pdLnR1b2kpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBTaW5odmllbiB0bXAgPSBMLT5BW2ldOwogICAgICAgICAgICAgICAgTC0+QVtpXSA9IEwtPkFbal07CiAgICAgICAgICAgICAgICBMLT5BW2pdID0gdG1wOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcHJpbnRmKCJEYSBzYXAgeGVwIHRoZW8gdHVvaVxuIik7Cn0KCi8vIFRpbSBraWVtIHRoZW8gdGVuCnZvaWQgU0VBUkNIX0JZX05BTUUoTGlzdCBMKSB7CiAgICBjaGFyIHRlbls1MF07CiAgICBpbnQgZm91bmQgPSAwOwogICAgcHJpbnRmKCI+PiBOaGFwIHRlbiBjYW4gdGltOiAiKTsKICAgIHNjYW5mKCIgJVteXG5dIiwgdGVuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTC5MYXN0OyBpKyspIHsKICAgICAgICBpZiAoc3RyY21wKEwuQVtpXS5uYW1lLCB0ZW4pID09IDApIHsKICAgICAgICAgICAgcHJpbnRmKCJNU1NWOiAlcyB8IEhvIHRlbjogJXMgfCBOZ2F5IHNpbmg6ICVzIHwgVHVvaTogJWRcbiIsCiAgICAgICAgICAgICAgICAgICBMLkFbaV0uaWQsIEwuQVtpXS5uYW1lLCBMLkFbaV0ubnMsIEwuQVtpXS50dW9pKTsKICAgICAgICAgICAgZm91bmQgPSAxOwogICAgICAgIH0KICAgIH0KICAgIGlmICghZm91bmQpIHByaW50ZigiS2hvbmcgdGltIHRoYXkgc2luaCB2aWVuXG4iKTsKfQoKLy8gPT09PT09PT09PT09PT09PT09IE1BSU4gPT09PT09PT09PT09PT09PT09CmludCBtYWluKCkgewoJCiAgY2hhciAqbmFtZXNbXSA9IHsKICAgICAgICAiTkdVWUVOIERVQyBRVUFORyIsCiAgICAgICAgIlRSQU4gTUlOSCBRVUFORyIsCiAgICAgICAgIkxVT05HIFZJRVQgTkhBVCIsCiAgICAgICAgIkhPQU5HIEdJQSBUSEUiLAogICAgICAgICJOR1VZRU4gVElFTiBEVU5HIgogICAgfTsKCiAgICBjaGFyICppZHNbXSA9IHsKICAgICAgICAiMjQxMTA2MTc2NyIsCiAgICAgICAgIjI0MTEwNjIwMjkiLAogICAgICAgICIyNDExMDYxNjE0IiwKICAgICAgICAiMjQxMTA2MTkyNyIsCiAgICAgICAgIjI0MTEwNjE2NDkiCiAgICB9OwoKICAgIGludCBuID0gNTsgLy8gc28gdGhhbmggdmllbgoKICAgIHByaW50ZigiKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4iKTsKICAgIHByaW50ZigifCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBSSBUQVAgTE9OIEJBSSA3IC0gUVVBTiBMSSBTSU5IIFZJRU4gICAgICAgICAgICAgICB8ICAgIFxuIik7CiAgICBwcmludGYoInwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBcbiIpOwogICAgcHJpbnRmKCJ8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPUDogREgxNEM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgXG4iKTsKICAgIHByaW50ZigiKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4iKTsKICAgIHByaW50ZigifCAgICAgICAgICAgICAgICUtMzBzIHwgJS0yMHMgfCAgICAgICAgICAgIHxcbiIsICJUSEFOSCBWSUVOIE5IT00iLCAiTUEgU0lOSCBWSUVOIik7CiAgICBwcmludGYoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIik7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgIHByaW50ZigifCAgICAgICAgICAgICAgICUtMzBzIHwgOiUtMTlzIHwgICAgICAgICAgICB8IFxuIiwgbmFtZXNbaV0sIGlkc1tpXSk7CiAgICBwcmludGYoIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIik7CiAgICB9CgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCiAgICBMaXN0IEw7CiAgICBNQUtFTlVMTF9MSVNUKCZMKTsKICAgICAgICBpbnQgY2hvaWNlOwogICAgd2hpbGUgKDEpIHsKICAgICAgICBwcmludGYoIlxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuIik7CiAgICAgICAgcHJpbnRmKCJ8ICAgICAgICAgICAgICAgICAgICAgSEUgVEhPTkcgUVVBTiBMWSBTSU5IIFZJRU4gICAgICAgICAgICAgICAgICB8XG4iKTsKICAgICAgICBwcmludGYoIis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiIpOwogICAgICAgIHByaW50ZigifCBbMV0gVGhlbSBzaW5oIHZpZW4gdmFvIHZpIHRyaSBiYXQga3kgKElOU0VSVF9MSVNUKSAgICAgICAgICAgICAgfFxuIik7CiAgICAgICAgcHJpbnRmKCJ8IFsyXSBYb2Egc2luaCB2aWVuIHRhaSB2aSB0cmkgKERFTEVURV9MSVNUKSAgICAgICAgICAgICAgICAgICAgICB8XG4iKTsKICAgICAgICBwcmludGYoInwgWzNdIFRpbSBraWVtIHNpbmggdmllbiB0aGVvIE1TU1YgKExPQ0FURSkgICAgICAgICAgICAgICAgICAgICAgIHxcbiIpOwogICAgICAgIHByaW50ZigifCBbNF0gWGVtIHRob25nIHRpbiB0aGVvIHZpIHRyaSAoUkVUUklFVkUpICAgICAgICAgICAgICAgICAgICAgICAgfFxuIik7CiAgICAgICAgcHJpbnRmKCJ8IFs1XSBJbiBkYW5oIHNhY2ggc2luaCB2aWVuIChQUklOVF9MSVNUKSAgICAgICAgICAgICAgICAgICAgICAgICB8XG4iKTsKICAgICAgICBwcmludGYoInwgWzZdIFNhcCB4ZXAgZGFuaCBzYWNoIHRoZW8gdGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiIpOwogICAgICAgIHByaW50ZigifCBbN10gU2FwIHhlcCBkYW5oIHNhY2ggdGhlbyB0dW9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuIik7CiAgICAgICAgcHJpbnRmKCJ8IFs4XSBUaW0ga2llbSBzaW5oIHZpZW4gdGhlbyB0ZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4iKTsKICAgICAgICBwcmludGYoInwgWzBdIFRob2F0IGNodW9uZyB0cmluaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiIpOwogICAgICAgIHByaW50ZigiKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuIik7CiAgICAgICAgcHJpbnRmKCI+PiBOaGFwIGx1YSBjaG9uIGN1YSBiYW46ICIpOwogICAgICAgIHNjYW5mKCIlZCIsICZjaG9pY2UpOwoKICAgICAgICBpZiAoY2hvaWNlID09IDApIHsKICAgICAgICAgICAgcHJpbnRmKCJEYSB0aG9hdFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKGNob2ljZSkgewogICAgICAgICAgICBjYXNlIDE6IHsKICAgICAgICAgICAgICAgIHN0cnVjdCBTaW5odmllbiBzdiA9IG5oYXBTaW5oVmllbihMKTsKICAgICAgICAgICAgICAgIFBvc2l0aW9uIHA7CiAgICAgICAgICAgICAgICBwcmludGYoIk5oYXAgVmkgVHJpIFNpbmggVmllbiBNdW9uIFRoZW0gQ2hlbiBWYW8gRGF1IDEgQ3VvaSAyOiAiKTsKICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsICZwKTsKICAgICAgICAgICAgICAgIGlmKHAgPT0gMSApewogICAgICAgICAgICAgICAgSU5TRVJUX0xJU1Qoc3YsIDEsICZMKTsJCiAgICAgICAgICAgICAgICBwcmludGYoIlRoZW0gc2luaCB2aWVuIHZhbyB0aGFuaCBjb25nLiAiKTsKCQkJCX0KCQkJCWVsc2UgaWYocCA9PSAyKXsKCQkJCSBJTlNFUlRfTElTVChzdiwgRU5EKEwpLCAmTCk7CgkJCQkgcHJpbnRmKCJUaGVtIHNpbmggdmllbiB2YW8gdGhhbmggY29uZy4gIikJOwkKCQkJCX0KCQkJCWVsc2V7CgkJCQkJcHJpbnRmKCJMdWEgY2hvbiBraG9uZyBob3AgbGUgXG4iKTsKCQkJCX0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAyOiB7CiAgICAgICAgICAgICAgICBQb3NpdGlvbiBwOwogICAgICAgICAgICAgICAgcHJpbnRmKCI+PiBOaGFwIHZpIHRyaSBtdW9uIHhvYSAoMS4uJWQpOiAiLCBMLkxhc3QpOwogICAgICAgICAgICAgICAgc2NhbmYoIiVkIiwgJnApOwogICAgICAgICAgICAgICAgREVMRVRFX0xJU1QocCwgJkwpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAzOiB7CiAgICAgICAgICAgICAgICBjaGFyIGlkWzIwXTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iKTsKICAgCQkJIAlwcmludGYoInwgICAgICAgICBUSU0gS0lFTSBTSU5IIFZJRU4gVEhFTyBNU1YgICAgICB8XG4iKTsKICAgCQkJCXByaW50ZigiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIik7CiAgIAkJCQlwcmludGYoIj4+IE5oYXAgTVNWIGNhbiB0aW06ICIpOwogICAgICAgICAgICAgICAgc2NhbmYoIiVzIiwgaWQpOwogICAgICAgICAgICAgICAgUG9zaXRpb24gcG9zID0gTE9DQVRFKGlkLCBMKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gRU5EKEwpKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJLaG9uZyB0aW0gdGhheVxuIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTaW5odmllbiBzdiA9IFJFVFJJRVZFKHBvcywgTCk7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJUaW0gdGhheSBNU1NWOiAlcyB8IEhvIHRlbjogJXMgfCBOZ2F5IHNpbmg6ICVzIHwgVHVvaTogJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2LmlkLCBzdi5uYW1lLCBzdi5ucywgc3YudHVvaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIDQ6IHsKICAgICAgICAgICAgICAgIFBvc2l0aW9uIHA7CiAgICAgICAgICAgICAgICBwcmludGYoIlxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuIik7CiAgICAgICAgICAgICAgICBwcmludGYoInwgICAgICAgIFhFTSBUSE9ORyBUSU4gVEhFTyBWSSBUUkkgICAgICAgIHxcbiIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4iKTsKICAgICAgICAgICAgICAgIHByaW50ZigiPj4gTmhhcCB2aSB0cmk6ICIpOwogICAgICAgICAgICAgICAgc2NhbmYoIiVkIiwgJnApOwogICAgICAgICAgICAgICAgaWYgKHAgPCBGSVJTVChMKSB8fCBwID49IEVORChMKSkgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiVmkgdHJpIGtob25nIGhvcCBsZVxuIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTaW5odmllbiBzdiA9IFJFVFJJRVZFKHAsIEwpOwogICAgICAgICAgICAgICAgICAgIHByaW50ZigiVGhvbmcgdGluIFNWIHRhaSB2aSB0cmkgJWQ6IE1TU1Y6ICVzIHwgSG8gdGVuOiAlcyB8IE5nYXkgc2luaDogJXMgfCBUdW9pOiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgc3YuaWQsIHN2Lm5hbWUsIHN2Lm5zLCBzdi50dW9pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgIFBSSU5UX0xJU1QoTCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgU09SVF9CWV9OQU1FKCZMKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICBTT1JUX0JZX1RVT0koJkwpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgIFNFQVJDSF9CWV9OQU1FKEwpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBwcmludGYoIkx1YSBjaG9uIGtob25nIGhvcCBsZVxuIik7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9