package structur ;
import java.util.Random ;
public class struct_class {
public static void main
( String [ ] args
) {
System .
out .
println ( "\t * Проста обробка без розгалужень *" ) ; //1. Вивести елементи масиву в прямому та зворотньому порядках.
int [ ] array = { 15 ,21 ,3 ,44 ,- 84 ,- 15 ,23 ,17 ,22 ,30 } ;
System .
out .
print ( "Початковий масив: " ) ; for ( int x: array)
int [ ] obern = new int [ array.length ] ;
for ( int i= 0 ; i< array.length ; i++ ) {
obern[ array.length - i- 1 ] = array[ i] ;
}
System .
out .
print ( "\n Обернений масив: " ) ; for ( int x: obern)
//2. Порахувати суму елементів масиву.
int suma = 0 ;
for ( int x: array)
suma+= x;
System .
out .
println ( "Сума всіх елементів: " + suma
) ;
//3. Визначити максимальний елемент масиву.
int max = array[ 0 ] ;
for ( int x: array) {
if ( max < x)
max = x;
}
System .
out .
println ( "Mаксимальний елемент: " + max
) ;
//4. Визначити мінімальний елемент масиву та його індекс.
int min = array[ 0 ] , min_id = 0 ;
for ( int i= 0 ; i< array.length ; i++ ) {
if ( min > array[ i] ) {
min = array[ i] ;
min_id = i;
}
}
System .
out .
println ( "Mінімальний елемент: " + min
+ ", індекс: " + min_id
) ;
System .
out .
println ( "\t * Обробка із розгалуженням *" ) ; //5. Порахувати кількість та суму парних елементів масиву.
int kilk_parn= 0 , sum_parn= 0 ;
for ( int x: array) {
if ( x % 2 == 0 ) {
kilk_parn++;
sum_parn+= x;
}
}
System .
out .
println ( "Кількість парних елементів: " + kilk_parn
+ ", сума: " + sum_parn
) ;
//6. Порахувати к-ть та суму парних елементів масиву, що
// знаходяться в діапазоні 20…30.
int k_pd= 0 , s_pd= 0 ;
for ( int x: array) {
if ( x % 2 == 0 ) {
if ( x>= 20 && x <= 30 ) {
k_pd++;
s_pd+= x;
}
}
}
System .
out .
println ( "Кількість парних елементів з [20...30]: " + k_pd
+ ", сума: " + s_pd
) ;
//7. Визначити максимальний з парних та мінімальний з непарних елементів масиву.
int min_neparn = array[ 0 ] , max_parn= array[ 0 ] ;
for ( int x: array) {
if ( x% 2== 0 ) {
if ( max_parn< x) {
max_parn= x;
}
}
if ( x% 2!= 0 ) {
if ( min_neparn> x) {
min_neparn= x;
}
}
}
System .
out .
println ( "Mаксимальний з парних : " + max_parn
+ ", мінімальний з непарних елементів:" + min_neparn
) ;
//8. Змінити знак від’ємних елементів масиву.
int [ ] arr = new int [ array.length ] ;
for ( int i= 0 ; i< array.length ; i++ ) {
arr[ i] = array[ i] ;
if ( arr[ i] < 0 ) arr[ i] *=- 1 ;
}
System .
out .
print ( "Змінити знак від’ємних елементів масиву: " ) ; for ( int x: arr)
//9. Проінкрементувати додатні та продекрементувати від’ємні елементи масиву.
int [ ] arr2 = new int [ array.length ] ;
for ( int i= 0 ; i< array.length ; i++ ) {
arr2[ i] = array[ i] ;
if ( arr2[ i] >= 0 )
++ arr2[ i] ;
if ( arr2[ i] < 0 )
-- arr2[ i] ;
}
System .
out .
print ( "Проінкрементувати додатні та продекрементувати від’ємні: " ) ; for ( int x: arr2)
//10. Визначити середнє арифметичне елементів масиву та кількість елементів, що є більшими за середнє арифметичне.
double seredn= 0 ;
int k_seredn= 0 ;
for ( int x: array)
seredn+= x;
seredn/= array.length ;
for ( int x: array)
if ( x> seredn)
k_seredn++;
System .
out .
println ( "Cереднє арифметичне: " + seredn
+ ", більших за середнє: " + k_seredn
+ " елементів" ) ;
System .
out .
println ( "\t * Утворення третього масиву відомої довжини *" ) ; //11. Утворити третій масив як попарну суму елементів двох масивів однакової довжини.
System .
out .
print ( "Утворити третій масив як попарну суму елементів двох масивів однакової довжини: " ) ; int mass_a1[ ] = { 2 ,3 ,- 8 ,10 ,11 } ;
int mass_b1[ ] = { 5 ,1 ,3 ,- 5 ,9 } ;
System .
out .
print ( "\n [-] Масив перший: " ) ; for ( int x: mass_a1)
System .
out .
print ( "\n [-] Масив другий: " ) ; for ( int x: mass_b1)
int mass_c1[ ] = new int [ mass_a1.length ] ;
for ( int i= 0 ; i< mass_a1.length ; i++ )
mass_c1[ i] = mass_a1[ i] + mass_b1[ i] ;
System .
out .
print ( "\n [+] Попарнa сума: " ) ; for ( int x: mass_c1)
//12. Утворити третій масив як конкатенацію двох масивів різної довжини.
System .
out .
print ( "Утворити третій масив як конкатенацію двох масивів різної довжини: " ) ; int mass_a2[ ] = { 2 ,3 ,- 8 ,10 ,11 ,4 ,- 2 ,5 ,8 } ;
int mass_b2[ ] = { 5 ,1 ,3 ,- 5 ,9 ,4 } ;
System .
out .
print ( "\n [-] Масив перший: " ) ; for ( int x: mass_a2)
System .
out .
print ( "\n [-] Масив другий: " ) ; for ( int x: mass_b2)
int mass_c2[ ] = new int [ mass_a2.length + mass_b2.length ] ;
for ( int i= 0 ; i< mass_c2.length ; i++ ) {
if ( i< mass_a2.length )
mass_c2[ i] = mass_a2[ i] ;
if ( i>= mass_a2.length )
mass_c2[ i] = mass_b2[ i- mass_a2.length ] ;
}
System .
out .
print ( "\n [+] Kонкатенація масивів: " ) ; for ( int x
: mass_c2
) System .
out .
print ( x
+ " " ) ;
//13. В масиві поміняти місцями максимум та мінімум.
System .
out .
println ( "В масиві поміняти місцями максимум та мінімум: " ) ; int mass_a3[ ] = { - 2 ,3 ,5 ,31 ,4 ,- 2 ,32 } ;
int mass_b3[ ] = new int [ mass_a3.length ] ;
for ( int i= 0 ; i< mass_b3.length ; i++ ) {
mass_b3[ i] = mass_a3[ i] ;
System .
out .
print ( mass_b3
[ i
] + " " ) ; }
int max_el= mass_b3[ 0 ] , min_el= mass_b3[ 0 ] , m= 0 ,n= 0 ;
for ( int i= 0 ; i< mass_b3.length ; i++ ) {
if ( max_el< mass_b3[ i] ) {
max_el= mass_b3[ i] ;
n= i;
}
if ( min_el> mass_b3[ i] ) {
min_el= mass_b3[ i] ;
m= i;
}
}
for ( int x: mass_b3) {
if ( x== min_el ) {
x= max_el;
continue ;
}
if ( x== max_el) {
x= min_el;
}
}
int p = mass_b3[ n] ;
mass_b3[ n] = mass_b3[ m] ;
mass_b3[ m] = p;
for ( int x: mass_b3)
//14. В масиві усунути максимум та мінімум.
System .
out .
print ( "В масиві усунути максимум та мінімум: " ) ; int mass_a4[ ] = new int [ mass_a3.length ] ;
int k= 0 ;
for ( int x: mass_a3)
for ( int x: mass_a3) {
if ( x== min_el | x== max_el )
continue ;
else {
mass_a4[ k] = x;
k++;
}
}
System .
out .
println ( "\n \t * Утворення нових масивів невідомої довжини *" ) ; // 15. Масив поділити на два масиви: з додатніх та від’ємних елементів.
System .
out .
print ( "Масив поділити на два масиви: з додатніх та від’ємних елементів" ) ; int first_massiv[ ] = { 1 ,2 ,3 ,4 ,- 5 ,- 6 ,- 7 ,- 8 } ;
System .
out .
print ( "\n [-] Дано масив: " ) ; for ( int x: first_massiv)
int [ ] neg_mass = new int [ array.length ] ;
int [ ] pos_mass = new int [ array.length ] ;
int k1= 0 ,k2= 0 ;
for ( int x: first_massiv) {
if ( x< 0 ) {
neg_mass[ k1] = x;
k1++;
}
if ( x>= 0 ) {
pos_mass[ k2] = x;
k2++;
}
}
System .
out .
print ( "\n [+] Від'ємний: " ) ; for ( int x: neg_mass) {
if ( x!= 0 )
}
System .
out .
print ( "\n [+] Додатній: " ) ; for ( int x: pos_mass) {
if ( x
!= 0 ) System .
out .
print ( x
+ " " ) ; }
//16. Утворити третій масив з елементів двох масивів однакової довжини, які є одночасно непарними. Утворити четвертий масив з індексів цих елементів.
System .
out .
print ( "Утворити третій масив з елементів двох масивів однакової довжини, які є одночасно непарними. Утворити четвертий масив з індексів цих елементів. " ) ; int massiv_a[ ] = { 1 ,24 ,21 ,3 ,2 ,6 ,8 ,7 } ;
int massiv_b[ ] = { 3 ,42 ,53 ,2 ,6 ,7 ,3 ,1 } ;
System .
out .
print ( "\n [-] Масив перший: " ) ; for ( int x: massiv_a)
System .
out .
print ( "\n [-] Масив другий: " ) ; for ( int x: massiv_b)
int massiv_c1[ ] = new int [ massiv_a.length * 2 ] ;
int massiv_c2[ ] = new int [ massiv_a.length ] ;
int p1= 0 ,p2= 0 ;
for ( int i= 0 ; i< massiv_a.length ; i++ ) {
if ( ( massiv_a[ i] % 2== 1 ) && ( massiv_b[ i] % 2== 1 ) ) {
massiv_c1[ p1] = massiv_a[ i] ; p1++;
massiv_c1[ p1] = massiv_b[ i] ;
p1++;
massiv_c2[ p2] = i+ 1 ;
p2++;
}
}
System .
out .
print ( "\n [+] Непарні елементи: " ) ; for ( int x: massiv_c1) {
if ( x
!= 0 ) System .
out .
print ( x
+ " " ) ; }
System .
out .
print ( "\n [+] Індекси: " ) ; for ( int x: massiv_c2) {
if ( x!= 0 )
}
//17. З масиву видалити дублікати максимума та мінімума.
System .
out .
print ( "З масиву видалити дублікати максимума та мінімума:" ) ; int dublicat[ ] = { 9 ,- 2 ,3 ,4 ,- 1 ,5 ,1 ,- 2 ,9 ,2 ,1 ,- 2 ,- 2 ,4 ,9 ,9 ,9 ,9 } ;
System .
out .
print ( "\n [-] Початковий масив: " ) ; for ( int x: dublicat)
int dubl_max= dublicat[ 0 ] , dubl_min= dublicat[ 0 ] ;
for ( int i= 0 ; i< dublicat.length ; i++ ) {
if ( dubl_max< dublicat[ i] ) {
dubl_max= dublicat[ i] ;
}
if ( dubl_min> dublicat[ i] ) {
dubl_min= dublicat[ i] ;
}
}
int dublicat2[ ] = new int [ dublicat.length ] ;
int d= 0 , d1= 0 , d2= 0 ;
for ( int x: dublicat) {
if ( x== dubl_min & d1== 1 | x== dubl_max & d2== 1 )
continue ;
if ( x== dubl_min) {
dublicat2[ d] = x;
d++;
d1++;
continue ;
}
if ( x== dubl_max) {
dublicat2[ d] = x;
d++;
d2++;
continue ;
}
else {
dublicat2[ d] = x;
d++;
}
}
System .
out .
print ( "\n [+] Масив без дублікатів: " ) ; for ( int x: dublicat2) {
if ( x!= 0 )
}
// 18. Визначити середні арифметичні двох масивів. Утворити третій масив з елементів обидвох масивів, що знаходяться в межах між значеннями середніх арифметичних.
System .
out .
print ( "Визначити середні арифметичні двох масивів. Утворити третій масив з елементів обидвох масивів, що знаходяться в межах між значеннями середніх арифметичних." ) ; int arra[ ] = { 1 ,2 ,3 ,2 ,1 ,2 ,1 ,1 ,2 } ;
int arrb[ ] = { 3 ,12 ,133 ,2 ,14 ,11 } ;
double sa= 0 , sb= 0 ;
for ( int x: arra)
sa+= x;
sa/= arra.length ;
for ( int x: arrb)
sb+= x;
sb/= arrb.length ;
System .
out .
print ( "\n [-] Масив перший: " ) ; for ( int x: arra)
System .
out .
print ( ", Cереднє: " + sa
) ; System .
out .
print ( "\n [-] Масив другий: " ) ; for ( int x: arrb)
System .
out .
print ( ", Cереднє: " + sb
) ;
int a,b;
if ( sa< sb) {
a= ( int ) sa;
b= ( int ) sb;
}
else {
a= ( int ) sb;
b= ( int ) sa;
}
int arrc[ ] = new int [ arra.length + arrb.length ] ;
int count= 0 ;
for ( int i= 0 ; i< arrc.length ; i++ ) {
if ( i< arra.length && arra[ i] > a && arra[ i] < b ) {
arrc[ count] = arra[ i] ;
count++;
}
if ( i>= arra.length && arrb[ i- arra.length ] > a && arrb[ i- arra.length ] < b) {
arrc[ count] = arrb[ i- arra.length ] ;
count++;
}
}
System .
out .
print ( "\n [+] Шуканий масив: " ) ; for ( int x: arrc) {
if ( x!= 0 )
}
System .
out .
println ( "\n \t * Рекурсивні *" ) ; //19. Згенерувати числа Фібоначчі.
int fi= 1 ;
long f1 = 1 , f2= 1 ,f= 0 ;
System .
out .
print ( "Перші 50+ чисел Фібоначчі: " + f1
+ " " + f2
+ " " ) ; while ( fi<= 50 ) {
f = f1 + f2;
f1= f2;
f2= f;
fi++;
}
System .
out .
println ( "\n \t * ДВОВИМІРНІ МАСИВИ *" ) ; //2. Знайти суму елементів матриці, розміщених між першим та другим
// додатніми елементами кожного рядка.
System .
out .
println ( "Знайти суму елементів матриці, розміщених між першим та другим додатніми елементами кожного рядка." ) ; int M= 3 , N= 10 ;
int matrix[ ] [ ] = new int [ M] [ N] ;
int sum_riad[ ] = new int [ M] ;
for ( int i= 0 ; i< M; i++ ) {
sum_riad[ i] = 0 ;
for ( int j= 0 ; j< N; j++ )
matrix[ i] [ j] = gener.nextInt ( 100 ) - 50 ;
}
System .
out .
println ( " [-] Дано матрицю:" ) ; for ( int i= 0 ; i< M; i++ ) {
for ( int j= 0 ; j< N; j++ )
System .
out .
print ( "\t " + matrix
[ i
] [ j
] ) ; }
for ( int i= 0 ; i< M; i++ ) {
int q= 0 ;
for ( int j= 0 ; j< N; j++ ) {
if ( q== 2 )
break ;
if ( matrix[ i] [ j] >= 0 ) {
sum_riad[ i] += matrix[ i] [ j] ;
q++;
continue ;
}
if ( q== 1 )
sum_riad[ i] += matrix[ i] [ j] ;
}
}
System .
out .
println ( " [+] Результат обчислення:" ) ; for ( int i= 0 ; i< M; i++ )
System .
out .
println ( "\t [" + i
+ "] = " + sum_riad
[ i
] ) ;
//3. Відняти від елементів кожного рядка матриці середнє арифметичне рядка.
System .
out .
println ( "Відняти від елементів кожного рядка матриці середнє арифметичне рядка." ) ; int M3= 3 , N3= 5 ;
double matrix3[ ] [ ] = new double [ M3] [ N3] ;
double new_matrix3[ ] [ ] = new double [ M3] [ N3] ;
double ser_riad[ ] = new double [ M3] ;
for ( int i= 0 ; i< M3; i++ ) {
ser_riad[ i] = 0 ;
for ( int j= 0 ; j< N3; j++ ) {
matrix3[ i] [ j] = gener.nextInt ( 30 ) - 15 ;
new_matrix3[ i] [ j] = matrix3[ i] [ j] ;
}
}
System .
out .
println ( " [-] Початкова матриця:" ) ; for ( int i= 0 ; i< M3; i++ ) {
for ( int j= 0 ; j< N3; j++ )
System .
out .
print ( "\t " + matrix3
[ i
] [ j
] ) ; }
for ( int i= 0 ; i< M3; i++ ) {
for ( int j= 0 ; j< N3; j++ ) {
ser_riad[ i] += matrix3[ i] [ j] ;
}
ser_riad[ i] /= N3;
}
for ( int i= 0 ; i< M3; i++ ) {
for ( int j= 0 ; j< N3; j++ ) {
new_matrix3[ i] [ j] -= ser_riad[ i] ;
}
}
System .
out .
print ( " [+] Середні арифметичні рядків:" ) ; for ( int i= 0 ; i< M3; i++ ) {
System .
out .
printf ( "\n \t [" + i
+ "] = %8.2f" , ser_riad
[ i
] ) ; }
System .
out .
println ( "\n [+] Результативна матриця:" ) ; for ( int i= 0 ; i< M3; i++ ) {
for ( int j= 0 ; j< N3; j++ )
System .
out .
printf ( "\t %8.2f" , new_matrix3
[ i
] [ j
] ) ; }
//4. Знайти максимальні элементи в матриці та видалити з матриці всі рядки та стовпці, що містять їх.
System .
out .
println ( "Знайти максимальні элементи в матриці та видалити з матриці всі рядки та стовпці, що містять їх." ) ; int M4= 5 , N4= 7 ;
int matrix4[ ] [ ] = new int [ M4] [ N4] ;
int new_matrix4[ ] [ ] = new int [ M4] [ N4] ;
int max_i[ ] = new int [ M4] ;
int max_j[ ] = new int [ N4] ;
int MatrixMaxEl= matrix4[ 0 ] [ 0 ] ;
for ( int i= 0 ; i< M4; i++ ) {
max_i[ i] = 0 ;
for ( int j= 0 ; j< N4; j++ ) {
matrix4[ i] [ j] = gener.nextInt ( 30 ) - 15 ;
max_j[ j] = 0 ;
}
}
System .
out .
println ( " [-] Початкова матриця:" ) ; for ( int i= 0 ; i< M4; i++ ) {
for ( int j= 0 ; j< N4; j++ )
System .
out .
print ( "\t " + matrix4
[ i
] [ j
] ) ; }
for ( int i= 0 ; i< M4; i++ ) {
for ( int j= 0 ; j< N4; j++ ) {
if ( matrix4[ i] [ j] > MatrixMaxEl) {
MatrixMaxEl = matrix4[ i] [ j] ;
}
}
}
for ( int i= 0 ; i< M4; i++ ) {
for ( int j= 0 ; j< N4; j++ ) {
if ( MatrixMaxEl== matrix4[ i] [ j] ) {
max_i[ i] = 1 ;
max_j[ j] = 1 ;
}
}
}
for ( int i= 0 ; i< M4; i++ ) {
for ( int j= 0 ; j< N4; j++ ) {
if ( max_i[ i] == 1 | max_j[ j] == 1 ) {
new_matrix4[ i] [ j] = 0 ;
}
else {
new_matrix4[ i] [ j] = matrix4[ i] [ j] ;
}
}
}
System .
out .
println ( "\n [+] Max:" + MatrixMaxEl
) ; System .
out .
println ( " [+] Результативна матриця:" ) ; for ( int i= 0 ; i< M4; i++ ) {
for ( int j= 0 ; j< N4; j++ )
System .
out .
print ( "\t " + new_matrix4
[ i
] [ j
] ) ; }
System .
out .
println ( " [+] Вичеркнем рядки і стовці де тільки нулі:" ) ; for ( int i= 0 ; i< M4; i++ ) {
for ( int j= 0 ; j< N4; j++ ) {
if ( max_i[ i] == 1 | max_j[ j] == 1 )
continue ;
else
System .
out .
print ( "\t " + new_matrix4
[ i
] [ j
] ) ; }
if ( max_i[ i] == 0 )
}
//5.Обміняти стовпці з максимальним i мінімальним елементами заданого рядка матриці.
System .
out .
println ( "Обміняти стовпці з максимальним i мінімальним елементами заданого рядка матриці." ) ;
int M5= 5 , N5= 5 ;
int matrix5[ ] [ ] = new int [ M5] [ N5] ;
int new_matrix5[ ] [ ] = new int [ M5] [ N5] ;
for ( int i= 0 ; i< M5; i++ ) {
for ( int j= 0 ; j< N5; j++ ) {
matrix5[ i] [ j] = gener.nextInt ( 100 ) ;
}
}
int MatrixMaxEl5 = matrix5[ 0 ] [ 0 ] ;
int MatrixMinEl5 = matrix5[ 0 ] [ 0 ] ;
System .
out .
println ( " [-] Початкова матриця:" ) ; for ( int i= 0 ; i< M5; i++ ) {
for ( int j= 0 ; j< N5; j++ )
System .
out .
print ( "\t " + matrix5
[ i
] [ j
] ) ; }
int scpecLine= 0 ; //УКАЗУЄМ ПО ЯКОМУ РЯДКУ МІНЯТИ СТОВПЦІ
int t1 = 0 ,t2 = 0 ;
for ( int j= 0 ; j< N5; j++ ) {
if ( MatrixMaxEl5 < matrix5[ scpecLine] [ j] ) {
MatrixMaxEl5 = matrix5[ scpecLine] [ j] ;
t1 = j;
}
if ( MatrixMinEl5> matrix5[ scpecLine] [ j] ) {
MatrixMinEl5 = matrix5[ scpecLine] [ j] ;
t2= j;
}
}
for ( int i= 0 ; i< M5; i++ ) {
for ( int j= 0 ; j< N5; j++ ) {
if ( j == t1) {
new_matrix5[ i] [ j] = matrix5[ i] [ t2] ;
}
else if ( j== t2) {
new_matrix5[ i] [ j] = matrix5[ i] [ t1] ;
}
else {
new_matrix5[ i] [ j] = matrix5[ i] [ j] ;
}
}
}
scpecLine++;
System .
out .
println ( "\n [+] У " + scpecLine
+ " рядку: Max = " + MatrixMaxEl5
+ ", Min = " + MatrixMinEl5
) ; System .
out .
println ( " [+] Результативна матриця:" ) ; for ( int i= 0 ; i< M5; i++ ) {
for ( int j= 0 ; j< N5; j++ )
System .
out .
print ( "\t " + new_matrix5
[ i
] [ j
] ) ; }
//6. Видалити в двовимірній матриці рядок та стовпчик для одного максимуму
System .
out .
println ( "Видалити в двовимірній матриці рядок та стовпчик для одного максимуму" ) ;
int M6= 5 , N6= 8 ;
int matrix6[ ] [ ] = new int [ M6] [ N6] ;
int new_matrix6[ ] [ ] = new int [ M6] [ N6] ;
for ( int i= 0 ; i< M6; i++ ) {
for ( int j= 0 ; j< N6; j++ ) {
matrix6[ i] [ j] = gener.nextInt ( 11 ) ;
}
}
System .
out .
println ( " [-] Початкова матриця:" ) ; for ( int i= 0 ; i< M6; i++ ) {
for ( int j= 0 ; j< N6; j++ )
System .
out .
print ( "\t " + matrix6
[ i
] [ j
] ) ; }
int MatrixMaxEl6= matrix6[ 0 ] [ 0 ] ;
int max_i6= 0 , max_j6= 0 ;
for ( int i= 0 ; i< M6; i++ ) {
for ( int j= 0 ; j< N6; j++ ) {
if ( matrix6[ i] [ j] > MatrixMaxEl6) {
MatrixMaxEl6 = matrix6[ i] [ j] ;
max_i6= i;
max_j6= j;
}
}
}
System .
out .
println ( "\n [+] Max:" + MatrixMaxEl6
) ;
for ( int i= 0 ; i< M6; i++ ) {
for ( int j= 0 ; j< N6; j++ ) {
if ( i== max_i6 | j== max_j6) {
new_matrix6[ i] [ j] = 0 ;
}
else {
new_matrix6[ i] [ j] = matrix6[ i] [ j] ;
}
}
}
System .
out .
println ( " [+] Результативна матриця:" ) ; for ( int i= 0 ; i< M6; i++ ) {
for ( int j= 0 ; j< N6; j++ )
System .
out .
print ( "\t " + new_matrix6
[ i
] [ j
] ) ; }
System .
out .
println ( " [+] Вичеркнем рядки і стовці де тільки нулі:" ) ; for ( int i= 0 ; i< M6; i++ ) {
for ( int j= 0 ; j< N6; j++ ) {
if ( max_i6== i | max_j6== j)
continue ;
else
System .
out .
print ( "\t " + new_matrix6
[ i
] [ j
] ) ; }
if ( max_i6!= i)
}
//7. Видалити в двовимірній матриці рядки та стовпчики для багатьох максимумів
System .
out .
println ( "Видалити в двовимірній матриці рядок та стовпчик для одного максимуму" ) ; System .
out .
println ( " [+] Це завдання таке ж саме як завдання (4)" ) ; //8.Поміняти місцями рядок і стовпчик з максимумом та рядок і стовпчик з мінімумом
System .
out .
println ( "Поміняти місцями рядок і стовпчик з максимумом та рядок і стовпчик з мінімумом" ) ; System .
out .
println ( " [+] Це завдання таке ж саме як завдання (5)" ) ;
}
}
cGFja2FnZSBzdHJ1Y3R1cjsKaW1wb3J0IGphdmEudXRpbC5SYW5kb207ICAKCnB1YmxpYyBjbGFzcyBzdHJ1Y3RfY2xhc3MgewpwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJClN5c3RlbS5vdXQucHJpbnRsbigiXHQqINCf0YDQvtGB0YLQsCDQvtCx0YDQvtCx0LrQsCDQsdC10Lcg0YDQvtC30LPQsNC70YPQttC10L3RjCAqIik7Ci8vMS4g0JLQuNCy0LXRgdGC0Lgg0LXQu9C10LzQtdC90YLQuCDQvNCw0YHQuNCy0YMg0LIg0L/RgNGP0LzQvtC80YMg0YLQsCDQt9Cy0L7RgNC+0YLQvdGM0L7QvNGDINC/0L7RgNGP0LTQutCw0YUuClN5c3RlbS5vdXQucHJpbnRsbigiKDEpIik7CgppbnRbXSBhcnJheSA9IHsxNSwyMSwzLDQ0LC04NCwtMTUsMjMsMTcsMjIsMzB9OwoJCQpTeXN0ZW0ub3V0LnByaW50KCLQn9C+0YfQsNGC0LrQvtCy0LjQuSDQvNCw0YHQuNCyOiAiKTsKZm9yIChpbnQgeDogYXJyYXkpIAoJU3lzdGVtLm91dC5wcmludCh4ICsgIiAiKTsKCQkKaW50W10gb2Jlcm4gPSBuZXcgaW50W2FycmF5Lmxlbmd0aF07CmZvciAoaW50IGk9MDtpPGFycmF5Lmxlbmd0aDtpKyspewoJb2Jlcm5bYXJyYXkubGVuZ3RoLWktMV0gID0gYXJyYXlbaV07IAp9ClN5c3RlbS5vdXQucHJpbnQoIlxu0J7QsdC10YDQvdC10L3QuNC5INC80LDRgdC40LI6ICIpOwpmb3IgKGludCB4OiBvYmVybikgCglTeXN0ZW0ub3V0LnByaW50KHggKyAiICIpOwoJCQovLzIuINCf0L7RgNCw0YXRg9Cy0LDRgtC4INGB0YPQvNGDINC10LvQtdC80LXQvdGC0ZbQsiDQvNCw0YHQuNCy0YMuClN5c3RlbS5vdXQucHJpbnQoIlxuKDIpICIpOwppbnQgc3VtYSA9IDA7CmZvciAoaW50IHg6IGFycmF5KSAKCXN1bWErPXg7ClN5c3RlbS5vdXQucHJpbnRsbigi0KHRg9C80LAg0LLRgdGW0YUg0LXQu9C10LzQtdC90YLRltCyOiAiICsgc3VtYSk7CgkJCi8vMy4g0JLQuNC30L3QsNGH0LjRgtC4INC80LDQutGB0LjQvNCw0LvRjNC90LjQuSDQtdC70LXQvNC10L3RgiDQvNCw0YHQuNCy0YMuClN5c3RlbS5vdXQucHJpbnQoIigzKSAiKTsKaW50IG1heCA9YXJyYXlbMF07CmZvciAoaW50IHg6IGFycmF5KSB7IAoJaWYgKG1heCA8IHgpIAoJCW1heCA9IHg7CQp9ClN5c3RlbS5vdXQucHJpbnRsbigiTdCw0LrRgdC40LzQsNC70YzQvdC40Lkg0LXQu9C10LzQtdC90YI6ICIgKyBtYXgpOwoJCi8vNC4g0JLQuNC30L3QsNGH0LjRgtC4INC80ZbQvdGW0LzQsNC70YzQvdC40Lkg0LXQu9C10LzQtdC90YIg0LzQsNGB0LjQstGDINGC0LAg0LnQvtCz0L4g0ZbQvdC00LXQutGBLgpTeXN0ZW0ub3V0LnByaW50KCIoNCkgIik7CmludCBtaW4gPWFycmF5WzBdLCBtaW5faWQgPSAwOwoKZm9yIChpbnQgaT0wO2k8YXJyYXkubGVuZ3RoO2krKykgewoJaWYgKG1pbiA+IGFycmF5W2ldKXsKCQltaW4gPSBhcnJheVtpXTsJCgkJbWluX2lkID0gaTsKCX0KfQpTeXN0ZW0ub3V0LnByaW50bG4oIk3RltC90ZbQvNCw0LvRjNC90LjQuSDQtdC70LXQvNC10L3RgjogIiArIG1pbiArICIsINGW0L3QtNC10LrRgTogIiArIG1pbl9pZCk7CgkJClN5c3RlbS5vdXQucHJpbnRsbigiXHQqINCe0LHRgNC+0LHQutCwINGW0Lcg0YDQvtC30LPQsNC70YPQttC10L3QvdGP0LwgKiIpOwovLzUuINCf0L7RgNCw0YXRg9Cy0LDRgtC4INC60ZbQu9GM0LrRltGB0YLRjCDRgtCwINGB0YPQvNGDINC/0LDRgNC90LjRhSDQtdC70LXQvNC10L3RgtGW0LIg0LzQsNGB0LjQstGDLgpTeXN0ZW0ub3V0LnByaW50KCIoNSkgIik7CmludCBraWxrX3Bhcm49MCwgc3VtX3Bhcm49MDsKZm9yKGludCB4OmFycmF5KXsKCWlmICh4ICUgMiA9PSAwKXsKCQlraWxrX3Bhcm4rKzsKCQlzdW1fcGFybis9eDsKCX0KfQpTeXN0ZW0ub3V0LnByaW50bG4oItCa0ZbQu9GM0LrRltGB0YLRjCDQv9Cw0YDQvdC40YUg0LXQu9C10LzQtdC90YLRltCyOiAiICsga2lsa19wYXJuICsgIiwgINGB0YPQvNCwOiAiICsgc3VtX3Bhcm4pOwoKLy82LiDQn9C+0YDQsNGF0YPQstCw0YLQuCDQui3RgtGMINGC0LAg0YHRg9C80YMg0L/QsNGA0L3QuNGFINC10LvQtdC80LXQvdGC0ZbQsiDQvNCw0YHQuNCy0YMsINGJ0L4gCi8vCQnQt9C90LDRhdC+0LTRj9GC0YzRgdGPINCyINC00ZbQsNC/0LDQt9C+0L3RliAyMOKApjMwLgpTeXN0ZW0ub3V0LnByaW50KCIoNikgIik7CmludCBrX3BkPTAsIHNfcGQ9MDsKCQkKZm9yKGludCB4OmFycmF5KSB7CglpZiAoeCAlIDIgPT0gMCApewoJCWlmICh4Pj0gMjAgJiYgeCA8PSAzMCkgewkKCQkJa19wZCsrOwoJCQlzX3BkKz14OwoJCX0KCX0KfQoJCQpTeXN0ZW0ub3V0LnByaW50bG4oItCa0ZbQu9GM0LrRltGB0YLRjCDQv9Cw0YDQvdC40YUg0LXQu9C10LzQtdC90YLRltCyINC3IFsyMC4uLjMwXTogIiArIGtfcGQgKyAiLCDRgdGD0LzQsDogIiArIHNfcGQpOwoKLy83LiDQktC40LfQvdCw0YfQuNGC0Lgg0LzQsNC60YHQuNC80LDQu9GM0L3QuNC5INC3INC/0LDRgNC90LjRhSDRgtCwINC80ZbQvdGW0LzQsNC70YzQvdC40Lkg0Lcg0L3QtdC/0LDRgNC90LjRhSDQtdC70LXQvNC10L3RgtGW0LIg0LzQsNGB0LjQstGDLgpTeXN0ZW0ub3V0LnByaW50KCIoNykgIik7CmludCBtaW5fbmVwYXJuID0gYXJyYXlbMF0sIG1heF9wYXJuPSBhcnJheVswXTsKCQkKZm9yKGludCB4OmFycmF5KXsKCWlmICh4JTI9PTApewoJCWlmIChtYXhfcGFybjx4KSB7CgkJCW1heF9wYXJuPXg7CgkJfQoJfQoJaWYgKHglMiE9MCkgewoJCWlmIChtaW5fbmVwYXJuPngpIHsKCQkJbWluX25lcGFybj14OwoJCX0KCX0KfQpTeXN0ZW0ub3V0LnByaW50bG4oIk3QsNC60YHQuNC80LDQu9GM0L3QuNC5INC3INC/0LDRgNC90LjRhSA6ICIgKyBtYXhfcGFybiArICIsINC80ZbQvdGW0LzQsNC70YzQvdC40Lkg0Lcg0L3QtdC/0LDRgNC90LjRhSDQtdC70LXQvNC10L3RgtGW0LI6IiArIG1pbl9uZXBhcm4pOwoKLy84LiDQl9C80ZbQvdC40YLQuCDQt9C90LDQuiDQstGW0LTigJnRlNC80L3QuNGFINC10LvQtdC80LXQvdGC0ZbQsiDQvNCw0YHQuNCy0YMuClN5c3RlbS5vdXQucHJpbnQoIig4KSAiKTsKaW50W10gYXJyID0gbmV3ICBpbnRbYXJyYXkubGVuZ3RoXTsKCQkKZm9yKGludCBpPTA7aTxhcnJheS5sZW5ndGg7aSsrKXsKCWFycltpXT1hcnJheVtpXTsKCQlpZiAoYXJyW2ldPDApIGFycltpXSo9LTE7Cn0KCQkKU3lzdGVtLm91dC5wcmludCgi0JfQvNGW0L3QuNGC0Lgg0LfQvdCw0Log0LLRltC04oCZ0ZTQvNC90LjRhSDQtdC70LXQvNC10L3RgtGW0LIg0LzQsNGB0LjQstGDOiAiKTsKZm9yIChpbnQgeDphcnIpIAoJU3lzdGVtLm91dC5wcmludCh4ICsgIiAiKTsKCi8vOS4g0J/RgNC+0ZbQvdC60YDQtdC80LXQvdGC0YPQstCw0YLQuCDQtNC+0LTQsNGC0L3RliDRgtCwINC/0YDQvtC00LXQutGA0LXQvNC10L3RgtGD0LLQsNGC0Lgg0LLRltC04oCZ0ZTQvNC90ZYg0LXQu9C10LzQtdC90YLQuCDQvNCw0YHQuNCy0YMuIApTeXN0ZW0ub3V0LnByaW50KCJcbig5KSAiKTsKaW50W10gYXJyMiA9IG5ldyAgaW50W2FycmF5Lmxlbmd0aF07CgkJCmZvcihpbnQgaT0wO2k8YXJyYXkubGVuZ3RoO2krKyl7CglhcnIyW2ldPWFycmF5W2ldOwoJaWYgKGFycjJbaV0+PTApIAoJCSsrYXJyMltpXTsKCWlmIChhcnIyW2ldPDApIAoJCS0tYXJyMltpXTsKfQpTeXN0ZW0ub3V0LnByaW50KCLQn9GA0L7RltC90LrRgNC10LzQtdC90YLRg9Cy0LDRgtC4INC00L7QtNCw0YLQvdGWINGC0LAg0L/RgNC+0LTQtdC60YDQtdC80LXQvdGC0YPQstCw0YLQuCDQstGW0LTigJnRlNC80L3RljogIik7CmZvciAoaW50IHg6YXJyMikgCglTeXN0ZW0ub3V0LnByaW50KHggKyAiICIpOwoKLy8xMC4g0JLQuNC30L3QsNGH0LjRgtC4INGB0LXRgNC10LTQvdGUINCw0YDQuNGE0LzQtdGC0LjRh9C90LUg0LXQu9C10LzQtdC90YLRltCyINC80LDRgdC40LLRgyDRgtCwINC60ZbQu9GM0LrRltGB0YLRjCDQtdC70LXQvNC10L3RgtGW0LIsINGJ0L4g0ZQg0LHRltC70YzRiNC40LzQuCDQt9CwINGB0LXRgNC10LTQvdGUINCw0YDQuNGE0LzQtdGC0LjRh9C90LUuClN5c3RlbS5vdXQucHJpbnQoIlxuKDEwKSAiKTsKZG91YmxlIHNlcmVkbj0wOwppbnQga19zZXJlZG49MDsKCQkKZm9yIChpbnQgeDphcnJheSkKCXNlcmVkbis9eDsKc2VyZWRuLz1hcnJheS5sZW5ndGg7CmZvciAoaW50IHg6YXJyYXkpCglpZiAoeD5zZXJlZG4pIAoJCWtfc2VyZWRuKys7ClN5c3RlbS5vdXQucHJpbnRsbigiQ9C10YDQtdC00L3RlCDQsNGA0LjRhNC80LXRgtC40YfQvdC1OiAiICsgc2VyZWRuICsgIiwg0LHRltC70YzRiNC40YUg0LfQsCDRgdC10YDQtdC00L3RlDogIiArIGtfc2VyZWRuICsgIiDQtdC70LXQvNC10L3RgtGW0LIiKTsKCQkKU3lzdGVtLm91dC5wcmludGxuKCJcdCog0KPRgtCy0L7RgNC10L3QvdGPINGC0YDQtdGC0YzQvtCz0L4g0LzQsNGB0LjQstGDINCy0ZbQtNC+0LzQvtGXINC00L7QstC20LjQvdC4ICoiKTsKLy8xMS4g0KPRgtCy0L7RgNC40YLQuCDRgtGA0LXRgtGW0Lkg0LzQsNGB0LjQsiDRj9C6INC/0L7Qv9Cw0YDQvdGDINGB0YPQvNGDINC10LvQtdC80LXQvdGC0ZbQsiDQtNCy0L7RhSDQvNCw0YHQuNCy0ZbQsiDQvtC00L3QsNC60L7QstC+0Zcg0LTQvtCy0LbQuNC90LguClN5c3RlbS5vdXQucHJpbnQoIigxMSkgIik7ClN5c3RlbS5vdXQucHJpbnQoItCj0YLQstC+0YDQuNGC0Lgg0YLRgNC10YLRltC5INC80LDRgdC40LIg0Y/QuiDQv9C+0L/QsNGA0L3RgyDRgdGD0LzRgyDQtdC70LXQvNC10L3RgtGW0LIg0LTQstC+0YUg0LzQsNGB0LjQstGW0LIg0L7QtNC90LDQutC+0LLQvtGXINC00L7QstC20LjQvdC4OiAiKTsKaW50IG1hc3NfYTFbXSA9IHsyLDMsLTgsMTAsMTF9OwppbnQgbWFzc19iMVtdID0gezUsMSwzLC01LDl9OwoJCQpTeXN0ZW0ub3V0LnByaW50KCAiXG4gWy1dINCc0LDRgdC40LIg0L/QtdGA0YjQuNC5OiAiKTsKZm9yIChpbnQgeDptYXNzX2ExKSAKCVN5c3RlbS5vdXQucHJpbnQoeCArICIgIik7ClN5c3RlbS5vdXQucHJpbnQoICJcbiBbLV0g0JzQsNGB0LjQsiDQtNGA0YPQs9C40Lk6ICIpOwpmb3IgKGludCB4Om1hc3NfYjEpIAoJU3lzdGVtLm91dC5wcmludCh4ICsgIiAiKTsKCQkKaW50IG1hc3NfYzFbXSA9IG5ldyBpbnRbbWFzc19hMS5sZW5ndGhdOwpmb3IgKGludCBpPTA7aTxtYXNzX2ExLmxlbmd0aDtpKyspCgltYXNzX2MxW2ldID0gbWFzc19hMVtpXSttYXNzX2IxW2ldOwoJCQpTeXN0ZW0ub3V0LnByaW50KCJcbiBbK10g0J/QvtC/0LDRgNC9YSDRgdGD0LzQsDogIik7CmZvciAoaW50IHg6bWFzc19jMSkgCglTeXN0ZW0ub3V0LnByaW50KHggKyAiICIpOwoJCQovLzEyLiDQo9GC0LLQvtGA0LjRgtC4INGC0YDQtdGC0ZbQuSDQvNCw0YHQuNCyINGP0Log0LrQvtC90LrQsNGC0LXQvdCw0YbRltGOINC00LLQvtGFINC80LDRgdC40LLRltCyINGA0ZbQt9C90L7RlyDQtNC+0LLQttC40L3QuC4KU3lzdGVtLm91dC5wcmludCgiXG4oMTIpICIpOwpTeXN0ZW0ub3V0LnByaW50KCLQo9GC0LLQvtGA0LjRgtC4INGC0YDQtdGC0ZbQuSDQvNCw0YHQuNCyINGP0Log0LrQvtC90LrQsNGC0LXQvdCw0YbRltGOINC00LLQvtGFINC80LDRgdC40LLRltCyINGA0ZbQt9C90L7RlyDQtNC+0LLQttC40L3QuDogIik7CmludCBtYXNzX2EyW10gPSB7MiwzLC04LDEwLDExLDQsLTIsNSw4fTsKaW50IG1hc3NfYjJbXSA9IHs1LDEsMywtNSw5LDR9OwoJCQpTeXN0ZW0ub3V0LnByaW50KCAiXG4gWy1dINCc0LDRgdC40LIg0L/QtdGA0YjQuNC5OiAiKTsKZm9yIChpbnQgeDptYXNzX2EyKSAKCVN5c3RlbS5vdXQucHJpbnQoeCArICIgIik7ClN5c3RlbS5vdXQucHJpbnQoICJcbiBbLV0g0JzQsNGB0LjQsiDQtNGA0YPQs9C40Lk6ICIpOwpmb3IgKGludCB4Om1hc3NfYjIpIAoJU3lzdGVtLm91dC5wcmludCh4ICsgIiAiKTsKCQkKaW50IG1hc3NfYzJbXSA9IG5ldyBpbnRbbWFzc19hMi5sZW5ndGggKyBtYXNzX2IyLmxlbmd0aF07CmZvciAoaW50IGk9MDtpPG1hc3NfYzIubGVuZ3RoO2krKyl7CglpZiAoaTxtYXNzX2EyLmxlbmd0aCkgCgkJbWFzc19jMltpXSA9IG1hc3NfYTJbaV07CglpZiAoaT49bWFzc19hMi5sZW5ndGgpCgkJbWFzc19jMltpXT0gbWFzc19iMltpLW1hc3NfYTIubGVuZ3RoXTsKfQkKU3lzdGVtLm91dC5wcmludCgiXG4gWytdIEvQvtC90LrQsNGC0LXQvdCw0YbRltGPICDQvNCw0YHQuNCy0ZbQsjogIik7CmZvciAoaW50IHg6bWFzc19jMikgU3lzdGVtLm91dC5wcmludCh4ICsgIiAiKTsKCQkKLy8xMy4g0JIg0LzQsNGB0LjQstGWINC/0L7QvNGW0L3Rj9GC0Lgg0LzRltGB0YbRj9C80Lgg0LzQsNC60YHQuNC80YPQvCDRgtCwINC80ZbQvdGW0LzRg9C8LgpTeXN0ZW0ub3V0LnByaW50KCJcbigxMykgIik7ClN5c3RlbS5vdXQucHJpbnRsbigi0JIg0LzQsNGB0LjQstGWICDQv9C+0LzRltC90Y/RgtC4INC80ZbRgdGG0Y/QvNC4INC80LDQutGB0LjQvNGD0Lwg0YLQsCDQvNGW0L3RltC80YPQvDogIik7CmludCBtYXNzX2EzW109IHstMiwzLDUsMzEsNCwtMiwzMn07CmludCBtYXNzX2IzW109IG5ldyBpbnQgW21hc3NfYTMubGVuZ3RoXTsKClN5c3RlbS5vdXQucHJpbnQoIiBbLV0gIik7CmZvciAoaW50ICBpPTA7aTxtYXNzX2IzLmxlbmd0aDtpKyspIHsKCW1hc3NfYjNbaV09bWFzc19hM1tpXTsKCVN5c3RlbS5vdXQucHJpbnQobWFzc19iM1tpXSArICIgIik7Cn0KCQkJCmludCBtYXhfZWw9bWFzc19iM1swXSwgbWluX2VsPW1hc3NfYjNbMF0sIG09MCxuPTA7CmZvcihpbnQgaT0wO2k8IG1hc3NfYjMubGVuZ3RoO2krKyApewoJaWYgKG1heF9lbDxtYXNzX2IzW2ldKSB7CgkJbWF4X2VsPW1hc3NfYjNbaV07CgkJbj1pOwoJfQoJaWYgKG1pbl9lbD5tYXNzX2IzW2ldKSB7CgkJbWluX2VsPW1hc3NfYjNbaV07CgkJbT1pOwoJfQp9CgkJCmZvcihpbnQgeDptYXNzX2IzKXsKCWlmKHg9PW1pbl9lbCApIHsKCQl4PW1heF9lbDsKCQljb250aW51ZTsKCX0KCWlmKCB4PT1tYXhfZWwpIHsKCQl4PW1pbl9lbDsKCX0KfQoJCQppbnQgcCA9IG1hc3NfYjNbbl07Cm1hc3NfYjNbbl0gPSBtYXNzX2IzW21dOwptYXNzX2IzW21dID0gcDsgCgkJICAKU3lzdGVtLm91dC5wcmludCgiXG4gWytdICIpOwpmb3IgKGludCB4Om1hc3NfYjMpIAoJU3lzdGVtLm91dC5wcmludCh4ICsgIiAiKTsKCQkKLy8xNC4g0JIg0LzQsNGB0LjQstGWINGD0YHRg9C90YPRgtC4INC80LDQutGB0LjQvNGD0Lwg0YLQsCDQvNGW0L3RltC80YPQvC4KU3lzdGVtLm91dC5wcmludCgiXG4oMTQpICIpOwpTeXN0ZW0ub3V0LnByaW50KCLQkiDQvNCw0YHQuNCy0ZYg0YPRgdGD0L3Rg9GC0Lgg0LzQsNC60YHQuNC80YPQvCDRgtCwINC80ZbQvdGW0LzRg9C8OiAiKTsKaW50IG1hc3NfYTRbXT1uZXcgaW50W21hc3NfYTMubGVuZ3RoXTsKaW50IGs9MDsKCQkKU3lzdGVtLm91dC5wcmludCgiXG4gWy1dICIpOwpmb3IgKGludCAgeDptYXNzX2EzKSAKCVN5c3RlbS5vdXQucHJpbnQoeCsgIiAiKTsKU3lzdGVtLm91dC5wcmludCgiXG4gWytdICIpOwpmb3IoaW50IHg6bWFzc19hMyl7CglpZih4PT1taW5fZWwgfCB4PT1tYXhfZWwgKSAKCQljb250aW51ZTsKCWVsc2V7CgkJbWFzc19hNFtrXT14OwoJCVN5c3RlbS5vdXQucHJpbnQoeCArICIgIik7CgkJaysrOwoJfQp9CgpTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHQqINCj0YLQstC+0YDQtdC90L3RjyDQvdC+0LLQuNGFINC80LDRgdC40LLRltCyINC90LXQstGW0LTQvtC80L7RlyDQtNC+0LLQttC40L3QuCAqIik7Ci8vCTE1LiDQnNCw0YHQuNCyINC/0L7QtNGW0LvQuNGC0Lgg0L3QsCDQtNCy0LAg0LzQsNGB0LjQstC4OiDQtyDQtNC+0LTQsNGC0L3RltGFINGC0LAg0LLRltC04oCZ0ZTQvNC90LjRhSDQtdC70LXQvNC10L3RgtGW0LIuClN5c3RlbS5vdXQucHJpbnQoIigxNSkgIik7ClN5c3RlbS5vdXQucHJpbnQoItCc0LDRgdC40LIg0L/QvtC00ZbQu9C40YLQuCDQvdCwINC00LLQsCDQvNCw0YHQuNCy0Lg6INC3INC00L7QtNCw0YLQvdGW0YUg0YLQsCDQstGW0LTigJnRlNC80L3QuNGFINC10LvQtdC80LXQvdGC0ZbQsiIpOwppbnQgZmlyc3RfbWFzc2l2W109IHsxLDIsMyw0LC01LC02LC03LC04fTsKCQkKU3lzdGVtLm91dC5wcmludCgiXG4gWy1dINCU0LDQvdC+INC80LDRgdC40LI6ICIpOwpmb3IgKGludCB4OmZpcnN0X21hc3NpdikgCglTeXN0ZW0ub3V0LnByaW50KHggKyAiICIpOwoJCQppbnRbXSBuZWdfbWFzcyA9IG5ldyBpbnQgW2FycmF5Lmxlbmd0aF07CmludFtdIHBvc19tYXNzID0gbmV3IGludCBbYXJyYXkubGVuZ3RoXTsKaW50IGsxPTAsazI9MDsKZm9yIChpbnQgeDpmaXJzdF9tYXNzaXYpewoJaWYgKHg8MCl7CgkJbmVnX21hc3NbazFdID0geDsKCQlrMSsrOwoJfQoJaWYgKHg+PTApewoJCXBvc19tYXNzW2syXSA9IHg7CgkJazIrKzsKCX0KfQoJCQpTeXN0ZW0ub3V0LnByaW50KCJcbiBbK10g0JLRltC0J9GU0LzQvdC40Lk6ICIpOwpmb3IgKGludCB4Om5lZ19tYXNzKSB7IAoJaWYgKHghPTApIAoJCVN5c3RlbS5vdXQucHJpbnQoeCArICIgIik7Cn0KU3lzdGVtLm91dC5wcmludCgiXG4gWytdINCU0L7QtNCw0YLQvdGW0Lk6ICIpOwpmb3IgKGludCB4OnBvc19tYXNzKSB7CglpZiAoeCE9MCkgU3lzdGVtLm91dC5wcmludCh4ICsgIiAiKTsKfQoJCQkKLy8xNi4g0KPRgtCy0L7RgNC40YLQuCDRgtGA0LXRgtGW0Lkg0LzQsNGB0LjQsiDQtyDQtdC70LXQvNC10L3RgtGW0LIg0LTQstC+0YUg0LzQsNGB0LjQstGW0LIg0L7QtNC90LDQutC+0LLQvtGXINC00L7QstC20LjQvdC4LCDRj9C60ZYg0ZQg0L7QtNC90L7Rh9Cw0YHQvdC+INC90LXQv9Cw0YDQvdC40LzQuC4g0KPRgtCy0L7RgNC40YLQuCDRh9C10YLQstC10YDRgtC40Lkg0LzQsNGB0LjQsiDQtyDRltC90LTQtdC60YHRltCyINGG0LjRhSDQtdC70LXQvNC10L3RgtGW0LIuClN5c3RlbS5vdXQucHJpbnQoIlxuKDE2KSAiKTsKU3lzdGVtLm91dC5wcmludCgi0KPRgtCy0L7RgNC40YLQuCDRgtGA0LXRgtGW0Lkg0LzQsNGB0LjQsiDQtyDQtdC70LXQvNC10L3RgtGW0LIg0LTQstC+0YUg0LzQsNGB0LjQstGW0LIg0L7QtNC90LDQutC+0LLQvtGXINC00L7QstC20LjQvdC4LCDRj9C60ZYg0ZQg0L7QtNC90L7Rh9Cw0YHQvdC+INC90LXQv9Cw0YDQvdC40LzQuC4g0KPRgtCy0L7RgNC40YLQuCDRh9C10YLQstC10YDRgtC40Lkg0LzQsNGB0LjQsiDQtyDRltC90LTQtdC60YHRltCyINGG0LjRhSDQtdC70LXQvNC10L3RgtGW0LIuICIpOwppbnQgbWFzc2l2X2FbXSA9IHsxLDI0LDIxLDMsMiw2LDgsN307CmludCBtYXNzaXZfYltdID0gezMsNDIsNTMsMiw2LDcsMywxfTsKCQkKU3lzdGVtLm91dC5wcmludCggIlxuIFstXSDQnNCw0YHQuNCyINC/0LXRgNGI0LjQuTogIik7CmZvciAoaW50IHg6bWFzc2l2X2EpIAoJU3lzdGVtLm91dC5wcmludCh4ICsgIiAiKTsKU3lzdGVtLm91dC5wcmludCggIlxuIFstXSDQnNCw0YHQuNCyINC00YDRg9Cz0LjQuTogIik7CmZvciAoaW50IHg6bWFzc2l2X2IpIAoJU3lzdGVtLm91dC5wcmludCh4ICsgIiAiKTsKCQkKaW50IG1hc3Npdl9jMVtdID0gbmV3IGludFttYXNzaXZfYS5sZW5ndGgqMl07CmludCBtYXNzaXZfYzJbXSA9IG5ldyBpbnRbbWFzc2l2X2EubGVuZ3RoXTsKCQkKaW50IHAxPTAscDI9MDsKZm9yIChpbnQgaT0wO2k8bWFzc2l2X2EubGVuZ3RoO2krKykgewoJaWYgKChtYXNzaXZfYVtpXSUyPT0xKSYmKG1hc3Npdl9iW2ldJTI9PTEpKSB7CgkJbWFzc2l2X2MxW3AxXSA9IG1hc3Npdl9hW2ldOyBwMSsrOwoJCW1hc3Npdl9jMVtwMV0gPSBtYXNzaXZfYltpXTsKCQlwMSsrOwoJCW1hc3Npdl9jMltwMl0gPSBpKzE7CgkJcDIrKzsKCX0KfQogCQkKU3lzdGVtLm91dC5wcmludCggIlxuIFsrXSDQndC10L/QsNGA0L3RliDQtdC70LXQvNC10L3RgtC4OiAiKTsKZm9yIChpbnQgeDptYXNzaXZfYzEpIHsKCWlmICh4IT0wKSBTeXN0ZW0ub3V0LnByaW50KHggKyAiICIpOwp9ClN5c3RlbS5vdXQucHJpbnQoICJcbiBbK10g0IbQvdC00LXQutGB0Lg6ICIpOwpmb3IgKGludCB4Om1hc3Npdl9jMikgewoJaWYgKHghPTApIAoJCVN5c3RlbS5vdXQucHJpbnQoeC0xICsgIiAiKTsKfQoJCQovLzE3LiDQlyDQvNCw0YHQuNCy0YMg0LLQuNC00LDQu9C40YLQuCDQtNGD0LHQu9GW0LrQsNGC0Lgg0LzQsNC60YHQuNC80YPQvNCwINGC0LAg0LzRltC90ZbQvNGD0LzQsC4KU3lzdGVtLm91dC5wcmludCgiXG4oMTcpICIpOwpTeXN0ZW0ub3V0LnByaW50KCLQlyDQvNCw0YHQuNCy0YMg0LLQuNC00LDQu9C40YLQuCDQtNGD0LHQu9GW0LrQsNGC0Lgg0LzQsNC60YHQuNC80YPQvNCwINGC0LAg0LzRltC90ZbQvNGD0LzQsDoiKTsKaW50IGR1YmxpY2F0W109IHs5LC0yLDMsNCwtMSw1LDEsLTIsOSwyLDEsLTIsLTIsNCw5LDksOSw5fTsKCQkKU3lzdGVtLm91dC5wcmludCggIlxuIFstXSDQn9C+0YfQsNGC0LrQvtCy0LjQuSDQvNCw0YHQuNCyOiAiKTsKZm9yIChpbnQgeDpkdWJsaWNhdCkgCglTeXN0ZW0ub3V0LnByaW50KHggKyAiICIpOwppbnQgZHVibF9tYXg9ZHVibGljYXRbMF0sIGR1YmxfbWluPWR1YmxpY2F0WzBdOwpmb3IoaW50IGk9MDtpPCBkdWJsaWNhdC5sZW5ndGg7aSsrICl7CglpZiAoZHVibF9tYXg8ZHVibGljYXRbaV0pIHsKCQlkdWJsX21heD1kdWJsaWNhdFtpXTsKCX0KCWlmIChkdWJsX21pbj5kdWJsaWNhdFtpXSkgewoJCWR1YmxfbWluPWR1YmxpY2F0W2ldOwoJfQp9CmludCBkdWJsaWNhdDJbXT1uZXcgaW50W2R1YmxpY2F0Lmxlbmd0aF07CmludCBkPTAsIGQxPTAsIGQyPTA7CmZvcihpbnQgeDpkdWJsaWNhdCl7CglpZih4PT1kdWJsX21pbiAmIGQxPT0xIHwgeD09ZHVibF9tYXggJiBkMj09MSkgCgkJY29udGludWU7CQoJaWYoeD09ZHVibF9taW4pIHsKCQlkdWJsaWNhdDJbZF09eDsKCQlkKys7CgkJZDErKzsKCQljb250aW51ZTsJCgl9CglpZiggeD09ZHVibF9tYXgpIHsKCQlkdWJsaWNhdDJbZF09eDsKCQlkKys7CgkJZDIrKzsKCQljb250aW51ZTsJCgl9CgllbHNlIHsKCQlkdWJsaWNhdDJbZF09eDsKCQlkKys7Cgl9CQkKfQoJCQpTeXN0ZW0ub3V0LnByaW50KCAiXG4gWytdINCc0LDRgdC40LIg0LHQtdC3INC00YPQsdC70ZbQutCw0YLRltCyOiAiICk7CmZvciAoaW50IHg6ZHVibGljYXQyKSB7IAoJaWYoeCE9MCkgCgkJU3lzdGVtLm91dC5wcmludCh4ICsgIiAiKTsKfQoJCQovLyAxOC4g0JLQuNC30L3QsNGH0LjRgtC4INGB0LXRgNC10LTQvdGWINCw0YDQuNGE0LzQtdGC0LjRh9C90ZYg0LTQstC+0YUg0LzQsNGB0LjQstGW0LIuINCj0YLQstC+0YDQuNGC0Lgg0YLRgNC10YLRltC5INC80LDRgdC40LIg0Lcg0LXQu9C10LzQtdC90YLRltCyINC+0LHQuNC00LLQvtGFINC80LDRgdC40LLRltCyLCDRidC+INC30L3QsNGF0L7QtNGP0YLRjNGB0Y8g0LIg0LzQtdC20LDRhSDQvNGW0LYg0LfQvdCw0YfQtdC90L3Rj9C80Lgg0YHQtdGA0LXQtNC90ZbRhSDQsNGA0LjRhNC80LXRgtC40YfQvdC40YUuIApTeXN0ZW0ub3V0LnByaW50KCJcbigxOCkgIik7ClN5c3RlbS5vdXQucHJpbnQoItCS0LjQt9C90LDRh9C40YLQuCDRgdC10YDQtdC00L3RliDQsNGA0LjRhNC80LXRgtC40YfQvdGWINC00LLQvtGFINC80LDRgdC40LLRltCyLiDQo9GC0LLQvtGA0LjRgtC4INGC0YDQtdGC0ZbQuSDQvNCw0YHQuNCyINC3INC10LvQtdC80LXQvdGC0ZbQsiDQvtCx0LjQtNCy0L7RhSDQvNCw0YHQuNCy0ZbQsiwg0YnQviDQt9C90LDRhdC+0LTRj9GC0YzRgdGPINCyINC80LXQttCw0YUg0LzRltC2INC30L3QsNGH0LXQvdC90Y/QvNC4INGB0LXRgNC10LTQvdGW0YUg0LDRgNC40YTQvNC10YLQuNGH0L3QuNGFLiIpOwppbnQgYXJyYVtdID0gezEsMiwzLDIsMSwyLDEsMSwyfTsKaW50IGFycmJbXSA9IHszLDEyLDEzMywyLDE0LDExfTsKZG91YmxlIHNhPTAsIHNiPTA7CgkJCmZvciAoaW50IHg6YXJyYSkKCXNhKz14OwkJCnNhLz1hcnJhLmxlbmd0aDsKZm9yIChpbnQgeDphcnJiKQoJc2IrPXg7CQkKc2IvPWFycmIubGVuZ3RoOwoJCQpTeXN0ZW0ub3V0LnByaW50KCAiXG4gWy1dINCc0LDRgdC40LIg0L/QtdGA0YjQuNC5OiAiKTsKZm9yIChpbnQgeDphcnJhKSAKCVN5c3RlbS5vdXQucHJpbnQoeCArICIgIik7ClN5c3RlbS5vdXQucHJpbnQoIiwgQ9C10YDQtdC00L3RlDogIiArIHNhKTsKU3lzdGVtLm91dC5wcmludCggIlxuIFstXSDQnNCw0YHQuNCyINC00YDRg9Cz0LjQuTogIik7CmZvciAoaW50IHg6YXJyYikgCglTeXN0ZW0ub3V0LnByaW50KHggKyAiICIpOwpTeXN0ZW0ub3V0LnByaW50KCIsIEPQtdGA0LXQtNC90ZQ6ICIgKyBzYik7CgkJCmludCBhLGI7CmlmIChzYTxzYikgewoJYT0oaW50KXNhOwoJYj0oaW50KXNiOwp9CmVsc2UgewoJYT0oaW50KXNiOwoJYj0oaW50KXNhOwp9CgkJCmludCBhcnJjW10gPSBuZXcgaW50W2FycmEubGVuZ3RoK2FycmIubGVuZ3RoXTsKaW50IGNvdW50PTA7CmZvciAoaW50IGk9MDtpPGFycmMubGVuZ3RoO2krKyl7CglpZiAoaTxhcnJhLmxlbmd0aCAmJiBhcnJhW2ldPmEgJiYgYXJyYVtpXTxiICApIHsKCQlhcnJjW2NvdW50XT1hcnJhW2ldOwoJCWNvdW50Kys7Cgl9CglpZiAoaT49YXJyYS5sZW5ndGggJiYgYXJyYltpLWFycmEubGVuZ3RoXT5hICYmIGFycmJbaS1hcnJhLmxlbmd0aF08YikgewoJCWFycmNbY291bnRdPWFycmJbaS1hcnJhLmxlbmd0aF07CgkJY291bnQrKzsKCX0KfQoJCQkKU3lzdGVtLm91dC5wcmludCggIlxuIFsrXSDQqNGD0LrQsNC90LjQuSDQvNCw0YHQuNCyOiAiKTsKZm9yIChpbnQgeDphcnJjKSB7CglpZih4IT0wKSAKCQlTeXN0ZW0ub3V0LnByaW50KHggKyAiICIpOwp9CgkJCQoJCQkKU3lzdGVtLm91dC5wcmludGxuKCJcblx0KiDQoNC10LrRg9GA0YHQuNCy0L3RliAqIik7Ci8vMTkuINCX0LPQtdC90LXRgNGD0LLQsNGC0Lgg0YfQuNGB0LvQsCDQpNGW0LHQvtC90LDRh9GH0ZYuClN5c3RlbS5vdXQucHJpbnQoIigxOSkgIik7CmludCBmaT0xOwpsb25nIGYxID0xLCBmMj0xLGY9MDsKCQkKU3lzdGVtLm91dC5wcmludCgi0J/QtdGA0YjRliA1MCsg0YfQuNGB0LXQuyDQpNGW0LHQvtC90LDRh9GH0ZY6ICIgKyBmMSArICIgIiArIGYyICsgIiAiICk7CndoaWxlKGZpPD01MCkgewoJZiA9IGYxICsgZjI7CglTeXN0ZW0ub3V0LnByaW50KGYgKyAiICIpOwoJZjE9ZjI7CglmMj1mOwoJZmkrKzsKfQoJCQkKU3lzdGVtLm91dC5wcmludGxuKCJcblx0KiDQlNCS0J7QktCY0JzQhtCg0J3QhiDQnNCQ0KHQmNCS0JggKiIpOwovLzIuINCX0L3QsNC50YLQuCDRgdGD0LzRgyDQtdC70LXQvNC10L3RgtGW0LIg0LzQsNGC0YDQuNGG0ZYsINGA0L7Qt9C80ZbRidC10L3QuNGFINC80ZbQtiDQv9C10YDRiNC40Lwg0YLQsCDQtNGA0YPQs9C40LwKLy8J0LTQvtC00LDRgtC90ZbQvNC4INC10LvQtdC80LXQvdGC0LDQvNC4INC60L7QttC90L7Qs9C+INGA0Y/QtNC60LAuClN5c3RlbS5vdXQucHJpbnQoIigyKSAiKTsKU3lzdGVtLm91dC5wcmludGxuKCLQl9C90LDQudGC0Lgg0YHRg9C80YMg0LXQu9C10LzQtdC90YLRltCyINC80LDRgtGA0LjRhtGWLCDRgNC+0LfQvNGW0YnQtdC90LjRhSDQvNGW0LYg0L/QtdGA0YjQuNC8INGC0LAg0LTRgNGD0LPQuNC8INC00L7QtNCw0YLQvdGW0LzQuCDQtdC70LXQvNC10L3RgtCw0LzQuCDQutC+0LbQvdC+0LPQviDRgNGP0LTQutCwLiIpOwkJCmludCBNPTMsIE49MTA7CQppbnQgbWF0cml4W11bXT1uZXcgaW50W01dW05dOwppbnQgc3VtX3JpYWRbXT1uZXcgaW50W01dOwpSYW5kb20gZ2VuZXIgPSBuZXcgUmFuZG9tKCk7CgkKZm9yIChpbnQgaT0wO2k8TTtpKyspIHsKCXN1bV9yaWFkW2ldPTA7Cglmb3IgKGludCBqPTA7ajxOO2orKykKCQltYXRyaXhbaV1bal09IGdlbmVyLm5leHRJbnQoMTAwKS01MDsKfQoJIApTeXN0ZW0ub3V0LnByaW50bG4oIiBbLV0g0JTQsNC90L4g0LzQsNGC0YDQuNGG0Y46Iik7CQpmb3IgKGludCBpPTA7aTxNO2krKykgewoJZm9yIChpbnQgaj0wO2o8TjtqKyspCgkJU3lzdGVtLm91dC5wcmludCgiXHQiK21hdHJpeFtpXVtqXSk7CglTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwp9Cgpmb3IgKGludCBpPTA7aTxNO2krKykgewoJaW50IHE9MDsKCWZvciAoaW50IGo9MDtqPE47aisrKSB7CgkJaWYgKHE9PTIpIAoJCQlicmVhazsKCQlpZiAobWF0cml4W2ldW2pdPj0wKSB7CgkJCXN1bV9yaWFkW2ldKz1tYXRyaXhbaV1bal07CgkJCXErKzsKCQkJY29udGludWU7CgkJfQoJCWlmKHE9PTEpIAoJCQlzdW1fcmlhZFtpXSs9bWF0cml4W2ldW2pdOwoJfQp9CgkgClN5c3RlbS5vdXQucHJpbnRsbigiIFsrXSDQoNC10LfRg9C70YzRgtCw0YIg0L7QsdGH0LjRgdC70LXQvdC90Y86Iik7IApmb3IgKGludCBpPTA7aTxNO2krKykgCglTeXN0ZW0ub3V0LnByaW50bG4oIlx0WyIraSsiXSA9ICIrc3VtX3JpYWRbaV0pOwoJIAovLzMuINCS0ZbQtNC90Y/RgtC4INCy0ZbQtCDQtdC70LXQvNC10L3RgtGW0LIg0LrQvtC20L3QvtCz0L4g0YDRj9C00LrQsCDQvNCw0YLRgNC40YbRliDRgdC10YDQtdC00L3RlCDQsNGA0LjRhNC80LXRgtC40YfQvdC1INGA0Y/QtNC60LAuClN5c3RlbS5vdXQucHJpbnQoIigzKSAiKTsKU3lzdGVtLm91dC5wcmludGxuKCLQktGW0LTQvdGP0YLQuCDQstGW0LQg0LXQu9C10LzQtdC90YLRltCyINC60L7QttC90L7Qs9C+INGA0Y/QtNC60LAg0LzQsNGC0YDQuNGG0ZYg0YHQtdGA0LXQtNC90ZQg0LDRgNC40YTQvNC10YLQuNGH0L3QtSDRgNGP0LTQutCwLiIpOwppbnQgTTM9MywgTjM9NTsJCmRvdWJsZSBtYXRyaXgzW11bXT1uZXcgZG91YmxlW00zXVtOM107CmRvdWJsZSBuZXdfbWF0cml4M1tdW109bmV3IGRvdWJsZVtNM11bTjNdOwpkb3VibGUgc2VyX3JpYWRbXT1uZXcgZG91YmxlW00zXTsKCQkJCmZvciAoaW50IGk9MDtpPE0zO2krKykgewoJc2VyX3JpYWRbaV09MDsKCWZvciAoaW50IGo9MDtqPE4zO2orKykgewoJCW1hdHJpeDNbaV1bal09IGdlbmVyLm5leHRJbnQoMzApLTE1OwoJCW5ld19tYXRyaXgzW2ldW2pdID0gbWF0cml4M1tpXVtqXTsKCX0JCQkKfQoJCQpTeXN0ZW0ub3V0LnByaW50bG4oIiBbLV0g0J/QvtGH0LDRgtC60L7QstCwINC80LDRgtGA0LjRhtGPOiIpOwpmb3IgKGludCBpPTA7aTxNMztpKyspIHsKCWZvciAoaW50IGo9MDtqPE4zO2orKykKCQlTeXN0ZW0ub3V0LnByaW50KCJcdCIrbWF0cml4M1tpXVtqXSk7CgkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKCX0KCQpmb3IgKGludCBpPTA7aTxNMztpKyspIHsKCWZvciAoaW50IGo9MDtqPE4zO2orKykgewoJCXNlcl9yaWFkW2ldKz1tYXRyaXgzW2ldW2pdOwoJfQoJc2VyX3JpYWRbaV0vPU4zOwp9Cgpmb3IgKGludCBpPTA7aTxNMztpKyspIHsKCWZvciAoaW50IGo9MDtqPE4zO2orKykgewoJCW5ld19tYXRyaXgzW2ldW2pdLT1zZXJfcmlhZFtpXTsKCX0KfQoJCQpTeXN0ZW0ub3V0LnByaW50KCIgWytdICDQodC10YDQtdC00L3RliDQsNGA0LjRhNC80LXRgtC40YfQvdGWINGA0Y/QtNC60ZbQsjoiKTsKZm9yIChpbnQgaT0wO2k8TTM7aSsrKSB7CglTeXN0ZW0ub3V0LnByaW50ZigiXG4gXHRbIitpKyJdID0gJTguMmYiLCBzZXJfcmlhZFtpXSk7Cn0KU3lzdGVtLm91dC5wcmludGxuKCJcbiBbK10gINCg0LXQt9GD0LvRjNGC0LDRgtC40LLQvdCwINC80LDRgtGA0LjRhtGPOiIpOwpmb3IgKGludCBpPTA7aTxNMztpKyspIHsKCWZvciAoaW50IGo9MDtqPE4zO2orKykKCQlTeXN0ZW0ub3V0LnByaW50ZigiXHQlOC4yZiIsIG5ld19tYXRyaXgzW2ldW2pdKTsKCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Cn0KCQovLzQuINCX0L3QsNC50YLQuCDQvNCw0LrRgdC40LzQsNC70YzQvdGWINGN0LvQtdC80LXQvdGC0Lgg0LIg0LzQsNGC0YDQuNGG0ZYg0YLQsCDQstC40LTQsNC70LjRgtC4INC3INC80LDRgtGA0LjRhtGWINCy0YHRliDRgNGP0LTQutC4INGC0LAg0YHRgtC+0LLQv9GG0ZYsINGJ0L4g0LzRltGB0YLRj9GC0Ywg0ZfRhS4KU3lzdGVtLm91dC5wcmludCgiKDQpICIpOwpTeXN0ZW0ub3V0LnByaW50bG4oItCX0L3QsNC50YLQuCDQvNCw0LrRgdC40LzQsNC70YzQvdGWINGN0LvQtdC80LXQvdGC0Lgg0LIg0LzQsNGC0YDQuNGG0ZYg0YLQsCDQstC40LTQsNC70LjRgtC4INC3INC80LDRgtGA0LjRhtGWINCy0YHRliDRgNGP0LTQutC4INGC0LAg0YHRgtC+0LLQv9GG0ZYsINGJ0L4g0LzRltGB0YLRj9GC0Ywg0ZfRhS4iKTsKaW50IE00PTUsIE40PTc7CQppbnQgbWF0cml4NFtdW109bmV3IGludFtNNF1bTjRdOwppbnQgbmV3X21hdHJpeDRbXVtdPW5ldyBpbnRbTTRdW040XTsKaW50IG1heF9pW109bmV3IGludFtNNF07CmludCBtYXhfaltdPW5ldyBpbnRbTjRdOwppbnQgTWF0cml4TWF4RWw9IG1hdHJpeDRbMF1bMF07CgkJCmZvciAoaW50IGk9MDtpPE00O2krKykgewoJbWF4X2lbaV09MDsKCWZvciAoaW50IGo9MDtqPE40O2orKykgewoJCW1hdHJpeDRbaV1bal09IGdlbmVyLm5leHRJbnQoMzApLTE1OwoJCW1heF9qW2pdID0gMDsKCX0JCn0KCQkKU3lzdGVtLm91dC5wcmludGxuKCIgWy1dINCf0L7Rh9Cw0YLQutC+0LLQsCDQvNCw0YLRgNC40YbRjzoiKTsKZm9yIChpbnQgaT0wO2k8TTQ7aSsrKSB7Cglmb3IgKGludCBqPTA7ajxONDtqKyspCgkJU3lzdGVtLm91dC5wcmludCgiXHQiK21hdHJpeDRbaV1bal0pOwoJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKfQoJCQkKZm9yIChpbnQgaT0wO2k8TTQ7aSsrKSB7Cglmb3IgKGludCBqPTA7ajxONDtqKyspIHsKCQlpZiAobWF0cml4NFtpXVtqXT5NYXRyaXhNYXhFbCkgewoJCQlNYXRyaXhNYXhFbCA9bWF0cml4NFtpXVtqXTsJCgkJfQoJfQp9CgkJCQkKZm9yIChpbnQgaT0wO2k8TTQ7aSsrKSB7Cglmb3IgKGludCBqPTA7ajxONDtqKyspIHsKCQlpZiAoTWF0cml4TWF4RWw9PW1hdHJpeDRbaV1bal0pIHsKCQkJCW1heF9pW2ldID0gMTsKCQkJbWF4X2pbal0gPSAxOwoJCX0KCX0KfQoJCQkJCmZvciAoaW50IGk9MDtpPE00O2krKykgewoJZm9yIChpbnQgaj0wO2o8TjQ7aisrKSB7CgkJaWYgKG1heF9pW2ldPT0xIHwgbWF4X2pbal09PTEpIHsKCQkJbmV3X21hdHJpeDRbaV1bal09MDsKCQl9CgkJZWxzZSAgewoJCQluZXdfbWF0cml4NFtpXVtqXT1tYXRyaXg0W2ldW2pdOyAKCQl9Cgl9Cn0KCQkKU3lzdGVtLm91dC5wcmludGxuKCJcbiBbK10gTWF4OiIgKyBNYXRyaXhNYXhFbCk7ClN5c3RlbS5vdXQucHJpbnRsbigiIFsrXSDQoNC10LfRg9C70YzRgtCw0YLQuNCy0L3QsCDQvNCw0YLRgNC40YbRjzoiKTsKZm9yIChpbnQgaT0wO2k8TTQ7aSsrKSB7Cglmb3IgKGludCBqPTA7ajxONDtqKyspCgkJU3lzdGVtLm91dC5wcmludCgiXHQiK25ld19tYXRyaXg0W2ldW2pdKTsKCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Cn0KCQkKU3lzdGVtLm91dC5wcmludGxuKCIgWytdINCS0LjRh9C10YDQutC90LXQvCDRgNGP0LTQutC4INGWINGB0YLQvtCy0YbRliDQtNC1INGC0ZbQu9GM0LrQuCDQvdGD0LvRljoiKTsKZm9yIChpbnQgaT0wO2k8TTQ7aSsrKSB7Cglmb3IgKGludCBqPTA7ajxONDtqKyspIHsKCQlpZiAobWF4X2lbaV09PTEgfCBtYXhfaltqXT09MSkKCQkJY29udGludWU7CgkJZWxzZSAKCQkJU3lzdGVtLm91dC5wcmludCgiXHQiK25ld19tYXRyaXg0W2ldW2pdKTsKCX0KCWlmIChtYXhfaVtpXT09MCkgCgkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKfQovLzUu0J7QsdC80ZbQvdGP0YLQuCDRgdGC0L7QstC/0YbRliDQtyDQvNCw0LrRgdC40LzQsNC70YzQvdC40LwgaSDQvNGW0L3RltC80LDQu9GM0L3QuNC8INC10LvQtdC80LXQvdGC0LDQvNC4INC30LDQtNCw0L3QvtCz0L4g0YDRj9C00LrQsCDQvNCw0YLRgNC40YbRli4KU3lzdGVtLm91dC5wcmludCgiKDUpICIpOwpTeXN0ZW0ub3V0LnByaW50bG4oItCe0LHQvNGW0L3Rj9GC0Lgg0YHRgtC+0LLQv9GG0ZYg0Lcg0LzQsNC60YHQuNC80LDQu9GM0L3QuNC8IGkg0LzRltC90ZbQvNCw0LvRjNC90LjQvCDQtdC70LXQvNC10L3RgtCw0LzQuCDQt9Cw0LTQsNC90L7Qs9C+INGA0Y/QtNC60LAg0LzQsNGC0YDQuNGG0ZYuIik7CgkJCQkgCmludCBNNT01LCBONT01OwkKaW50IG1hdHJpeDVbXVtdPW5ldyBpbnRbTTVdW041XTsKaW50IG5ld19tYXRyaXg1W11bXT1uZXcgaW50W001XVtONV07CgkKZm9yIChpbnQgaT0wO2k8TTU7aSsrKSB7Cglmb3IgKGludCBqPTA7ajxONTtqKyspIHsKCQltYXRyaXg1W2ldW2pdPSBnZW5lci5uZXh0SW50KDEwMCk7Cgl9CQp9CgkKaW50IE1hdHJpeE1heEVsNSA9IG1hdHJpeDVbMF1bMF07CmludCBNYXRyaXhNaW5FbDUgPSBtYXRyaXg1WzBdWzBdOwkKU3lzdGVtLm91dC5wcmludGxuKCIgWy1dINCf0L7Rh9Cw0YLQutC+0LLQsCDQvNCw0YLRgNC40YbRjzoiKTsKZm9yIChpbnQgaT0wO2k8TTU7aSsrKSB7Cglmb3IgKGludCBqPTA7ajxONTtqKyspCgkJU3lzdGVtLm91dC5wcmludCgiXHQiK21hdHJpeDVbaV1bal0pOwoJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKfQoJCmludCBzY3BlY0xpbmU9MDsgLy/Qo9Ca0JDQl9Cj0ITQnCDQn9CeINCv0JrQntCc0KMg0KDQr9CU0JrQoyAg0JzQhtCd0K/QotCYINCh0KLQntCS0J/QptCGCmludCB0MSA9IDAsdDIgPSAwOwpmb3IgKGludCBqPTA7ajxONTtqKyspIHsKCWlmIChNYXRyaXhNYXhFbDUgPCBtYXRyaXg1W3NjcGVjTGluZV1bal0pIHsKCQlNYXRyaXhNYXhFbDUgPSBtYXRyaXg1W3NjcGVjTGluZV1bal07CgkJdDEgPWo7Cgl9CglpZiAoTWF0cml4TWluRWw1Pm1hdHJpeDVbc2NwZWNMaW5lXVtqXSkgewoJCU1hdHJpeE1pbkVsNSA9bWF0cml4NVtzY3BlY0xpbmVdW2pdOwoJCXQyPWo7Cgl9Cn0KCmZvciAoaW50IGk9MDtpPE01O2krKykgewoJZm9yIChpbnQgaj0wO2o8TjU7aisrKSB7CgkJaWYgKGogPT0gdDEpIHsKCQkJbmV3X21hdHJpeDVbaV1bal09bWF0cml4NVtpXVt0Ml07IAoJCX0KCQllbHNlIGlmIChqPT10MikgewoJCQluZXdfbWF0cml4NVtpXVtqXT1tYXRyaXg1W2ldW3QxXTsKCQl9CgkJZWxzZSB7CgkJCW5ld19tYXRyaXg1W2ldW2pdPW1hdHJpeDVbaV1bal07CgkJfQoJfQp9CgkJCnNjcGVjTGluZSsrOwpTeXN0ZW0ub3V0LnByaW50bG4oIlxuIFsrXSDQoyAiICtzY3BlY0xpbmUrIiDRgNGP0LTQutGDOiBNYXggPSAiICsgTWF0cml4TWF4RWw1ICsgIiwgTWluID0gIiArIE1hdHJpeE1pbkVsNSk7ClN5c3RlbS5vdXQucHJpbnRsbigiIFsrXSDQoNC10LfRg9C70YzRgtCw0YLQuNCy0L3QsCDQvNCw0YLRgNC40YbRjzoiKTsKZm9yIChpbnQgaT0wO2k8TTU7aSsrKSB7Cglmb3IgKGludCBqPTA7ajxONTtqKyspCgkJU3lzdGVtLm91dC5wcmludCgiXHQiK25ld19tYXRyaXg1W2ldW2pdKTsKCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Cn0KCQkKLy82LiDQktC40LTQsNC70LjRgtC4INCyINC00LLQvtCy0LjQvNGW0YDQvdGW0Lkg0LzQsNGC0YDQuNGG0ZYg0YDRj9C00L7QuiDRgtCwINGB0YLQvtCy0L/Rh9C40Log0LTQu9GPINC+0LTQvdC+0LPQviDQvNCw0LrRgdC40LzRg9C80YMgIApTeXN0ZW0ub3V0LnByaW50KCIoNikgIik7ClN5c3RlbS5vdXQucHJpbnRsbigi0JLQuNC00LDQu9C40YLQuCDQsiDQtNCy0L7QstC40LzRltGA0L3RltC5INC80LDRgtGA0LjRhtGWINGA0Y/QtNC+0Log0YLQsCDRgdGC0L7QstC/0YfQuNC6INC00LvRjyDQvtC00L3QvtCz0L4g0LzQsNC60YHQuNC80YPQvNGDIik7CgkJCmludCBNNj01LCBONj04OwkKaW50IG1hdHJpeDZbXVtdPW5ldyBpbnRbTTZdW042XTsKaW50IG5ld19tYXRyaXg2W11bXT1uZXcgaW50W002XVtONl07CgkJCmZvciAoaW50IGk9MDtpPE02O2krKykgewoJZm9yIChpbnQgaj0wO2o8TjY7aisrKSB7CgkJbWF0cml4NltpXVtqXT0gZ2VuZXIubmV4dEludCgxMSk7Cgl9CQp9ClN5c3RlbS5vdXQucHJpbnRsbigiIFstXSDQn9C+0YfQsNGC0LrQvtCy0LAg0LzQsNGC0YDQuNGG0Y86Iik7CmZvciAoaW50IGk9MDtpPE02O2krKykgewoJZm9yIChpbnQgaj0wO2o8TjY7aisrKQoJCVN5c3RlbS5vdXQucHJpbnQoIlx0IittYXRyaXg2W2ldW2pdKTsKCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Cn0KCQkJCmludCBNYXRyaXhNYXhFbDY9IG1hdHJpeDZbMF1bMF07CmludCBtYXhfaTY9MCwgbWF4X2o2PTA7CmZvciAoaW50IGk9MDtpPE02O2krKykgewoJZm9yIChpbnQgaj0wO2o8TjY7aisrKSB7CgkJaWYgKG1hdHJpeDZbaV1bal0+TWF0cml4TWF4RWw2KSB7CgkJCU1hdHJpeE1heEVsNiA9bWF0cml4NltpXVtqXTsKCQkJbWF4X2k2PWk7CgkJCW1heF9qNj1qOwoJCX0KCX0KfQoKU3lzdGVtLm91dC5wcmludGxuKCJcbiBbK10gTWF4OiIgKyBNYXRyaXhNYXhFbDYpOwoKZm9yIChpbnQgaT0wO2k8TTY7aSsrKSB7Cglmb3IgKGludCBqPTA7ajxONjtqKyspIHsKCQlpZiAoaT09bWF4X2k2IHwgaj09bWF4X2o2KSB7CgkJCW5ld19tYXRyaXg2W2ldW2pdPTA7CgkJfQoJCWVsc2UgIHsKCQkJbmV3X21hdHJpeDZbaV1bal09bWF0cml4NltpXVtqXTsgCgkJfQoJfQp9CgpTeXN0ZW0ub3V0LnByaW50bG4oIiBbK10g0KDQtdC30YPQu9GM0YLQsNGC0LjQstC90LAg0LzQsNGC0YDQuNGG0Y86Iik7CmZvciAoaW50IGk9MDtpPE02O2krKykgewoJZm9yIChpbnQgaj0wO2o8TjY7aisrKQoJCVN5c3RlbS5vdXQucHJpbnQoIlx0IituZXdfbWF0cml4NltpXVtqXSk7CglTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwp9CgpTeXN0ZW0ub3V0LnByaW50bG4oIiBbK10g0JLQuNGH0LXRgNC60L3QtdC8INGA0Y/QtNC60Lgg0ZYg0YHRgtC+0LLRhtGWINC00LUg0YLRltC70YzQutC4INC90YPQu9GWOiIpOwpmb3IgKGludCBpPTA7aTxNNjtpKyspIHsKCWZvciAoaW50IGo9MDtqPE42O2orKykgewoJCWlmIChtYXhfaTY9PWkgfCBtYXhfajY9PWopIAoJCQljb250aW51ZTsKCQllbHNlIAoJCQkJU3lzdGVtLm91dC5wcmludCgiXHQiK25ld19tYXRyaXg2W2ldW2pdKTsKCX0KCWlmIChtYXhfaTYhPWkpIAoJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Cn0JCQovLzcuINCS0LjQtNCw0LvQuNGC0Lgg0LIg0LTQstC+0LLQuNC80ZbRgNC90ZbQuSDQvNCw0YLRgNC40YbRliDRgNGP0LTQutC4INGC0LAg0YHRgtC+0LLQv9GH0LjQutC4INC00LvRjyDQsdCw0LPQsNGC0YzQvtGFINC80LDQutGB0LjQvNGD0LzRltCyIAkKU3lzdGVtLm91dC5wcmludCgiKDcpICIpOwpTeXN0ZW0ub3V0LnByaW50bG4oItCS0LjQtNCw0LvQuNGC0Lgg0LIg0LTQstC+0LLQuNC80ZbRgNC90ZbQuSDQvNCw0YLRgNC40YbRliDRgNGP0LTQvtC6INGC0LAg0YHRgtC+0LLQv9GH0LjQuiDQtNC70Y8g0L7QtNC90L7Qs9C+INC80LDQutGB0LjQvNGD0LzRgyIpOwpTeXN0ZW0ub3V0LnByaW50bG4oIiBbK10g0KbQtSDQt9Cw0LLQtNCw0L3QvdGPINGC0LDQutC1INC2INGB0LDQvNC1INGP0Log0LfQsNCy0LTQsNC90L3RjyAoNCkiKTsJCQkJCi8vOC7Qn9C+0LzRltC90Y/RgtC4INC80ZbRgdGG0Y/QvNC4INGA0Y/QtNC+0Log0ZYg0YHRgtC+0LLQv9GH0LjQuiDQtyDQvNCw0LrRgdC40LzRg9C80L7QvCDRgtCwINGA0Y/QtNC+0Log0ZYg0YHRgtC+0LLQv9GH0LjQuiDQtyDQvNGW0L3RltC80YPQvNC+0LwKU3lzdGVtLm91dC5wcmludCgiKDgpICIpOwpTeXN0ZW0ub3V0LnByaW50bG4oItCf0L7QvNGW0L3Rj9GC0Lgg0LzRltGB0YbRj9C80Lgg0YDRj9C00L7QuiDRliDRgdGC0L7QstC/0YfQuNC6INC3INC80LDQutGB0LjQvNGD0LzQvtC8INGC0LAg0YDRj9C00L7QuiDRliDRgdGC0L7QstC/0YfQuNC6INC3INC80ZbQvdGW0LzRg9C80L7QvCIpOwpTeXN0ZW0ub3V0LnByaW50bG4oIiBbK10g0KbQtSDQt9Cw0LLQtNCw0L3QvdGPINGC0LDQutC1INC2INGB0LDQvNC1INGP0Log0LfQsNCy0LTQsNC90L3RjyAoNSkiKTsKCQkJCgl9Cn0KCg==