import java.util.Scanner ;
import java.util.Objects ;
import java.io.BufferedReader ;
import java.io.FileReader ;
import java.io.IOException ;
class EmployeeDriverSystem
{
{
//System.out.println("Hello Java");
Employee[ ] a = new Employee[ 10 ] ;
int count;
// If file handling not needed, uncomment the codes from Line 15-24.
a[ 0 ] = new PermanentEmployee( "Maninder" , "Singh" , "30312306" ) ; // to be replaced by the university's student
a[ 1 ] = new PermanentEmployee( "Peter" , "VAMPLEW" , "VAM12345678" ) ;
a[ 2 ] = new PermanentEmployee( "Rudi" , "SKACEL" , "SKA51515151" , 56.7 ) ;
a[ 3 ] = new CasualEmployee( "Katie" ,"BLACKBURN" ,"BLA41925612" ) ;
a[ 4 ] = new CasualEmployee( "Neal" ,"STEPHENSON" ,"STE97527467" ,12.5 ) ;
a[ 5 ] = new CasualEmployee( "Neneh" ,"CHERRY" ,"CHE98765432" ,9.4 ) ;
a[ 6 ] = new CasualEmployee( "Chris" ,"BROOKMYRE" ,"BRO97635198" ) ;
a[ 7 ] = new CasualEmployee( "Grace" ,"HOPPER" ,"HOP26554432" ,3.4 ) ;
a[ 8 ] = new CasualEmployee( "Randall" ,"MUNROE" ,"XKCD1234567" ) ;
a[ 9 ] = new CasualEmployee( "Kaylee" ,"FRYE" ,"FRY90224718" ) ;
//Needs a file named file.txt in the same folder as the code. If file handling not needed, comment
// code from Line 28-41.
/*BufferedReader reader = new BufferedReader(new FileReader("employeedata.txt"));
for(int i = 0; i < 3; i++)
{
String line = reader.readLine();
String[] parts = line.split(" ");
a[i] = new PermanentEmployee(parts[0], parts[1], parts[2]);
}
for(int i = 3; i < 10; i++)
{
String line = reader.readLine();
String[] parts = line.split(" ");
a[i] = new CasualEmployee(parts[0], parts[1], parts[2]);
}
reader.close();*/
Employee[ ] [ ] b = new Employee [ 5 ] [ 4 ] ;
int flag = 0 ;
int n,n2,n3,n4;
while ( true )
{
if ( flag == 0 )
{
System .
out .
println ( "1. Display all staff" ) ; System .
out .
println ( "2. Clear schedule" ) ; System .
out .
println ( "3. Display schedule" ) ; System .
out .
println ( "4. Assign shift to casual employee" ) ; System .
out .
println ( "5. Assign shifts to permanent employee" ) ; System .
out .
println ( "6. Calculate total weekly wages" ) ; System .
out .
println ( "7. Exit Program" ) ; while ( true )
{
System .
out .
println ( "Enter your selection" ) ; //n = Integer.parseInt(System.console().readLine());
Scanner in
= new Scanner
( System .
in ) ; n = in.nextInt ( ) ;
// n = in.nextInt();
// n = in.nextInt();
if ( n <= 0 || n > 7 )
{
System .
out .
println ( "Invalid Selection - must be between 1 and 7." ) ; break ;
}
if ( n == 1 )
{
int i = 0 ;
for ( i = 0 ; i < 10 ; i++ )
{
}
break ;
}
else if ( n == 2 )
{
int i = 0 ;
int j = 0 ;
for ( i = 0 ; i < 10 ; i++ )
{
a[ i] .shiftsWorkedThisWeek = 0 ;
}
for ( i = 0 ; i < 5 ; i++ )
{
for ( j = 0 ; j < 4 ; j++ )
{
b[ i] [ j] = null ;
}
}
break ;
}
else if ( n == 3 )
{
int i,j;
for ( i = 0 ; i < 5 ; i++ )
{
if ( i == 0 )
else if ( i == 1 )
else if ( i == 2 )
else if ( i == 3 )
else if ( i == 4 )
for ( j = 0 ; j < 4 ; j++ )
{
if ( b[ i] [ j] == null )
{
System .
out .
print ( "------------------------\t " ) ; }
else
{
System .
out .
print ( b
[ i
] [ j
] .
toString ( ) ) ; }
}
}
break ;
}
else if ( n == 4 )
{
while ( true )
{
System .
out .
println ( "Which shift do you wish to allocate to a casual employee? (1..4):" ) ; if ( n2 < 1 || n2 > 4 )
{
System .
out .
println ( "Invalid selection - must be between 1 and 4." ) ; }
else
break ;
}
while ( true )
{
System .
out .
println ( "On which day? (1..5):" ) ; if ( n3 < 1 || n3 > 5 )
{
System .
out .
println ( "Invalid selection - must be between 1 and 5." ) ; }
else
break ;
}
if ( b[ n3- 1 ] [ n2- 1 ] != null )
{
System .
out .
println ( "This shift has already been allocated" ) ; break ;
}
else
{
int i;
for ( i = 0 ; i < 10 ; i++ )
{
if ( a[ i] instanceof CasualEmployee == true )
{
}
}
int flag2 = 0 ;
while ( true )
{
System .
out .
println ( "Enter ID" ) ; Scanner input
= new Scanner
( System .
in ) ; for ( i = 0 ; i < 10 ; i++ )
{
if ( Objects.equals ( y, a[ i] .ID ) == true )
{
flag2 = 1 ;
}
if ( flag2 == 1 )
break ;
}
if ( flag2 == 1 )
break ;
else
{
System .
out .
println ( "Invalid selection - try again." ) ; }
}
b[ n3- 1 ] [ n2- 1 ] = a[ i] ;
a[ i] .incrementShiftsWorkedThisWeek ( ) ;
}
break ;
}
else if ( n == 5 )
{
while ( true )
{
System .
out .
println ( "Which shift do you wish to allocate to a permanent employee? (1..4):" ) ; if ( n4 < 1 || n4 > 4 )
{
System .
out .
println ( "Invalid selection - must be between 1 and 4." ) ; }
else
break ;
}
int flag3 = 0 ;
int i;
for ( i = 0 ; i < 5 ; i++ )
{
if ( b[ i] [ n4] != null )
{
System .
out .
println ( "This shift is already allocated\n " ) ; flag3 = 1 ;
break ;
}
}
if ( flag3 == 0 )
{
for ( i = 0 ; i < 10 ; i++ )
{
if ( a[ i] instanceof PermanentEmployee == true )
{
}
}
int flag4 = 0 ;
while ( true )
{
System .
out .
println ( "Enter ID" ) ; Scanner input
= new Scanner
( System .
in ) ; for ( i = 0 ; i < 10 ; i++ )
{
if ( Objects.equals ( y, a[ i] .ID ) == true )
{
flag4 = 1 ;
}
if ( flag4 == 1 )
break ;
}
if ( flag4 == 1 )
break ;
else
{
System .
out .
println ( "Invalid selection - try again." ) ; }
}
int j;
for ( j = 0 ; j < 5 ; j++ )
{
b[ j] [ n4- 1 ] = a[ i] ;
}
a[ i] .shiftsWorkedThisWeek = a[ i] .shiftsWorkedThisWeek + 5 ;
}
break ;
}
else if ( n == 6 )
{
int i;
double total = 0 ;
for ( i = 0 ; i < 10 ; i++ )
{
System .
out .
print ( a
[ i
] .
toString ( ) ) ; double var = a[ i] .calculateWeeklyPay ( ) ;
total = total + var;
}
System .
out .
println ( "-----------------------------------------" ) ; System .
out .
print ( "TOTAL WAGES FOR THIS WEEK: " ) ; break ;
}
else if ( n == 7 )
{
flag = 1 ;
break ;
}
}
}
else
break ;
}
}
public abstract static class Employee
{
int shiftsWorkedThisWeek;
{
firstName = a;
lastName = b;
ID = c;
}
{
return firstName;
}
{
return lastName;
}
{
return ID;
}
public int getShiftsWorkedThisWeek( )
{
return shiftsWorkedThisWeek;
}
public void resetShiftsWorkedThisWeek( )
{
shiftsWorkedThisWeek = 0 ;
}
public void incrementShiftsWorkedThisWeek( )
{
shiftsWorkedThisWeek = shiftsWorkedThisWeek + 1 ;
}
public abstract double calculateWeeklyPay( ) ;
{
return a6;
}
}
public static class PermanentEmployee extends Employee
{
double weeklyWage;
{
super ( a1,a2,a3) ;
weeklyWage = 812.47 ;
}
{
super ( a1,a2,a3) ;
weeklyWage = a4;
}
public void setWeeklyWage( double a1)
{
weeklyWage = a1;
}
public double getWeeklyWage( )
{
return weeklyWage;
}
public double calculateWeeklyPay( )
{
return weeklyWage;
}
}
public static class CasualEmployee extends Employee
{
double shiftRate;
{
super ( a1,a2,a3) ;
shiftRate = 47.5 ;
}
{
super ( a1,a2,a3) ;
shiftRate = a4;
}
public void setShiftRate( double a1)
{
shiftRate = a1;
}
public double getShiftRate ( double a2)
{
return shiftRate;
}
public double calculateWeeklyPay( )
{
double a1 = shiftRate* shiftsWorkedThisWeek;
return a1;
}
}
}
aW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwppbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CmltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwppbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKCmNsYXNzIEVtcGxveWVlRHJpdmVyU3lzdGVtCnsgIAogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICB7ICAKICAgICAJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIEphdmEiKTsKICAgIAlFbXBsb3llZVtdIGEgPSBuZXcgRW1wbG95ZWVbMTBdOwogICAgCWludCBjb3VudDsKICAgICAgICAvLyBJZiBmaWxlIGhhbmRsaW5nIG5vdCBuZWVkZWQsIHVuY29tbWVudCB0aGUgY29kZXMgZnJvbSBMaW5lIDE1LTI0LiAKICAgIAlhWzBdID0gbmV3IFBlcm1hbmVudEVtcGxveWVlKCJNYW5pbmRlciIsICJTaW5naCIsICIzMDMxMjMwNiIpOyAvLyB0byBiZSByZXBsYWNlZCBieSB0aGUgdW5pdmVyc2l0eSdzIHN0dWRlbnQKICAgIAlhWzFdID0gbmV3IFBlcm1hbmVudEVtcGxveWVlKCJQZXRlciIsICJWQU1QTEVXIiwgIlZBTTEyMzQ1Njc4Iik7CiAgICAJYVsyXSA9IG5ldyBQZXJtYW5lbnRFbXBsb3llZSgiUnVkaSIsICJTS0FDRUwiLCAiU0tBNTE1MTUxNTEiLCA1Ni43KTsKICAgIAlhWzNdID0gbmV3IENhc3VhbEVtcGxveWVlKCJLYXRpZSIsIkJMQUNLQlVSTiIsIkJMQTQxOTI1NjEyIik7CiAgICAJYVs0XSA9IG5ldyBDYXN1YWxFbXBsb3llZSgiTmVhbCIsIlNURVBIRU5TT04iLCJTVEU5NzUyNzQ2NyIsMTIuNSk7CiAgICAJYVs1XSA9IG5ldyBDYXN1YWxFbXBsb3llZSgiTmVuZWgiLCJDSEVSUlkiLCJDSEU5ODc2NTQzMiIsOS40KTsKICAgIAlhWzZdID0gbmV3IENhc3VhbEVtcGxveWVlKCJDaHJpcyIsIkJST09LTVlSRSIsIkJSTzk3NjM1MTk4Iik7CiAgICAJYVs3XSA9IG5ldyBDYXN1YWxFbXBsb3llZSgiR3JhY2UiLCJIT1BQRVIiLCJIT1AyNjU1NDQzMiIsMy40KTsKICAgIAlhWzhdID0gbmV3IENhc3VhbEVtcGxveWVlKCJSYW5kYWxsIiwiTVVOUk9FIiwiWEtDRDEyMzQ1NjciKTsKICAgIAlhWzldID0gbmV3IENhc3VhbEVtcGxveWVlKCJLYXlsZWUiLCJGUllFIiwiRlJZOTAyMjQ3MTgiKTsKCiAgICAgICAgLy9OZWVkcyBhIGZpbGUgbmFtZWQgZmlsZS50eHQgaW4gdGhlIHNhbWUgZm9sZGVyIGFzIHRoZSBjb2RlLiBJZiBmaWxlIGhhbmRsaW5nIG5vdCBuZWVkZWQsIGNvbW1lbnQKICAgICAgICAvLyBjb2RlIGZyb20gTGluZSAyOC00MS4KICAgICAgICAvKkJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcigiZW1wbG95ZWVkYXRhLnR4dCIpKTsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBsaW5lLnNwbGl0KCIgIik7CiAgICAgICAgICAgIGFbaV0gPSBuZXcgUGVybWFuZW50RW1wbG95ZWUocGFydHNbMF0sIHBhcnRzWzFdLCBwYXJ0c1syXSk7CiAgICAgICAgfQogICAgICAgIGZvcihpbnQgaSA9IDM7IGkgPCAxMDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBsaW5lLnNwbGl0KCIgIik7CiAgICAgICAgICAgIGFbaV0gPSBuZXcgQ2FzdWFsRW1wbG95ZWUocGFydHNbMF0sIHBhcnRzWzFdLCBwYXJ0c1syXSk7CiAgICAgICAgfQogICAgICAgIHJlYWRlci5jbG9zZSgpOyovCiAgICAJRW1wbG95ZWVbXVtdIGIgPSBuZXcgRW1wbG95ZWUgWzVdWzRdOyAgCiAgICAJaW50IGZsYWcgPSAwOwogICAgCWludCBuLG4yLG4zLG40OwogICAgCXdoaWxlICh0cnVlKQogICAgCXsKICAgIAkJaWYgKGZsYWcgPT0gMCkKICAgIAkJewogICAgCQkJU3lzdGVtLm91dC5wcmludGxuKCIxLiBEaXNwbGF5IGFsbCBzdGFmZiIpOwogICAgCQkJU3lzdGVtLm91dC5wcmludGxuKCIyLiBDbGVhciBzY2hlZHVsZSIpOwogICAgCQkJU3lzdGVtLm91dC5wcmludGxuKCIzLiBEaXNwbGF5IHNjaGVkdWxlIik7CiAgICAJCQlTeXN0ZW0ub3V0LnByaW50bG4oIjQuIEFzc2lnbiBzaGlmdCB0byBjYXN1YWwgZW1wbG95ZWUiKTsKICAgIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiNS4gQXNzaWduIHNoaWZ0cyB0byBwZXJtYW5lbnQgZW1wbG95ZWUiKTsKICAgIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiNi4gQ2FsY3VsYXRlIHRvdGFsIHdlZWtseSB3YWdlcyIpOwogICAgCQkJU3lzdGVtLm91dC5wcmludGxuKCI3LiBFeGl0IFByb2dyYW0iKTsKICAgIAkJCXdoaWxlICh0cnVlKQogICAgCQkJewogICAgCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXIgeW91ciBzZWxlY3Rpb24iKTsKICAgIAkJCQkvL24gPSBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbS5jb25zb2xlKCkucmVhZExpbmUoKSk7CiAgICAJCQkJU2Nhbm5lciBpbiA9IG5ldyBTY2FubmVyKFN5c3RlbS5pbik7CgkJCQkJbiA9IGluLm5leHRJbnQoKTsKCgkJCQkvLwluID0gaW4ubmV4dEludCgpOyAgCgkJCQkJIAoJCQkJCQoJCQkJLy8JbiA9IGluLm5leHRJbnQoKTsKICAgIAkJCQlpZiAobiA8PSAwIHx8IG4gPiA3KQogICAgCQkJCXsJCiAgICAJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCBTZWxlY3Rpb24gLSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNy4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAJCQkJfQogICAgCQkJCWlmIChuID09IDEpCiAgICAJCQkJewogICAgCQkJCQlpbnQgaSA9IDA7CiAgICAJCQkJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQogICAgCQkJCQl7CiAgICAJCQkJCQlTdHJpbmcgeCA9IGFbaV0udG9TdHJpbmcoKTsKICAgIAkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbih4KTsKICAgIAkJCQkJfQogICAgCQkJCQlicmVhazsKICAgIAkJCQl9CQogICAgCQkJCWVsc2UgaWYgKG4gPT0gMikgCiAgICAJCQkJewogICAgCQkJCQlpbnQgaSA9IDA7CiAgICAJCQkJCWludCBqID0gMDsKICAgIAkJCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCiAgICAJCQkJCXsKICAgIAkJCQkJCWFbaV0uc2hpZnRzV29ya2VkVGhpc1dlZWsgPSAwOwogICAgCQkJCQl9CiAgICAJCQkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKysgKQogICAgCQkJCQl7CiAgICAJCQkJCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrICkKICAgIAkJCQkJCXsKICAgIAkJCQkJCQliW2ldW2pdID0gbnVsbDsKICAgIAkJCQkJCX0KICAgIAkJCQkJfQogICAgCQkJCQlicmVhazsKICAgIAkJCQl9CiAgICAJCQkJZWxzZSBpZiAobiA9PSAzKQogICAgCQkJCXsKICAgIAkJCQkJaW50IGksajsKICAgIAkJCQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKICAgIAkJCQkJewogICAgCQkJCQkJaWYgKGkgPT0gMCkKICAgIAkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJNT05cdCIpOwogICAgCQkJCQkJZWxzZSBpZiAoaSA9PSAxKQogICAgCQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIlRVRVx0Iik7CiAgICAJCQkJCQllbHNlIGlmIChpID09IDIpCiAgICAJCQkJCQkJU3lzdGVtLm91dC5wcmludCgiV0VEXHQiKTsKICAgIAkJCQkJCWVsc2UgaWYgKGkgPT0gMykKICAgIAkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJUSFVcdCIpOwogICAgCQkJCQkJZWxzZSBpZiAoaSA9PSA0KQogICAgCQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIkZSSVx0Iik7CiAgICAJCQkJCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKQogICAgCQkJCQkJewogICAgCQkJCQkJCWlmIChiW2ldW2pdID09IG51bGwpCiAgICAJCQkJCQkJewogICAgCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cdCIpOwogICAgCQkJCQkJCX0KICAgIAkJCQkJCQllbHNlCiAgICAJCQkJCQkJewogICAgCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KGJbaV1bal0udG9TdHJpbmcoKSk7CiAgICAJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIlx0Iik7CiAgICAJCQkJCQkJfQogICAgCQkJCQkJfQogICAgCQkJCQkJU3lzdGVtLm91dC5wcmludCgiXG4iKTsKICAgIAkJCQkJfQogICAgCQkJCQlicmVhazsKICAgIAkJCQl9CiAgICAJCQkJZWxzZSBpZiAobiA9PSA0KQogICAgCQkJCXsKICAgIAkJCQkJd2hpbGUgKHRydWUpCiAgICAJCQkJCXsKICAgIAkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2hpY2ggc2hpZnQgZG8geW91IHdpc2ggdG8gYWxsb2NhdGUgdG8gYSBjYXN1YWwgZW1wbG95ZWU/ICgxLi40KToiKTsKICAgIAkJCQkJCW4yID0gSW50ZWdlci5wYXJzZUludChTeXN0ZW0uY29uc29sZSgpLnJlYWRMaW5lKCkpOwogICAgCQkJCQkJaWYgKG4yIDwgMSB8fCBuMiA+IDQpCiAgICAJCQkJCQl7CiAgICAJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkIHNlbGVjdGlvbiAtIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA0LiIpOwogICAgCQkJCQkJfQogICAgCQkJCQkJZWxzZQogICAgCQkJCQkJCWJyZWFrOwogICAgCQkJCQl9CiAgICAJCQkJCXdoaWxlICh0cnVlKQogICAgCQkJCQl7CiAgICAJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9uIHdoaWNoIGRheT8gKDEuLjUpOiIpOwogICAgCQkJCQkJbjMgPSBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbS5jb25zb2xlKCkucmVhZExpbmUoKSk7CiAgICAJCQkJCQlpZiAobjMgPCAxIHx8IG4zID4gNSkKICAgIAkJCQkJCXsKICAgIAkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWQgc2VsZWN0aW9uIC0gbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDUuIik7CiAgICAJCQkJCQl9CiAgICAJCQkJCQllbHNlCiAgICAJCQkJCQkJYnJlYWs7CiAgICAJCQkJCX0KICAgIAkJCQkJaWYgKGJbbjMtMV1bbjItMV0gIT0gbnVsbCkKICAgIAkJCQkJewogICAgCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGlzIHNoaWZ0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIik7CiAgICAJCQkJCQlicmVhazsKICAgIAkJCQkJfQogICAgCQkJCQllbHNlCiAgICAJCQkJCXsKICAgIAkJCQkJCWludCBpOwogICAgCQkJCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCiAgICAJCQkJCQl7CiAgICAJCQkJCQkJaWYgKGFbaV0gaW5zdGFuY2VvZiBDYXN1YWxFbXBsb3llZSA9PSB0cnVlKQogICAgCQkJCQkJCXsKICAgIAkJCQkJCQkJU3RyaW5nIHYgPSBhW2ldLnRvU3RyaW5nKCk7CiAgICAJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbih2KTsKICAgIAkJCQkJCQl9CiAgICAJCQkJCQl9CiAgICAJCQkJCQlpbnQgZmxhZzIgPSAwOwogICAgCQkJCQkJd2hpbGUgKHRydWUpCiAgICAJCQkJCQl7CiAgICAJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFbnRlciBJRCIpOwogICAgCQkJCQkJCVNjYW5uZXIgaW5wdXQgPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pOwogICAgCQkJCQkJCVN0cmluZyB5ID0gaW5wdXQubmV4dExpbmUoKTsKICAgIAkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKICAgIAkJCQkJCQl7CiAgICAJCQkJCQkJCWlmIChPYmplY3RzLmVxdWFscyh5LCBhW2ldLklEKSA9PSB0cnVlKQogICAgCQkJCQkJCQl7CiAgICAJCQkJCQkJCQlmbGFnMiA9IDE7CiAgICAJCQkJCQkJCX0KICAgIAkJCQkJCQkJaWYgKGZsYWcyID09IDEpCiAgICAJCQkJCQkJCQlicmVhazsKICAgIAkJCQkJCQl9CiAgICAJCQkJCQkJaWYgKGZsYWcyID09IDEpCiAgICAJCQkJCQkJCWJyZWFrOwogICAgCQkJCQkJCWVsc2UKICAgIAkJCQkJCQl7CiAgICAJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCBzZWxlY3Rpb24gLSB0cnkgYWdhaW4uIik7CiAgICAJCQkJCQkJfQogICAgCQkJCQkJfQogICAgCQkJCQkJYltuMy0xXVtuMi0xXSA9IGFbaV07CiAgICAJCQkJCQlhW2ldLmluY3JlbWVudFNoaWZ0c1dvcmtlZFRoaXNXZWVrKCk7CiAgICAJCQkJCX0KICAgIAkJCQkJYnJlYWs7CiAgICAJCQkJfQogICAgCQkJCWVsc2UgaWYgKG4gPT0gNSkKICAgIAkJCQl7CiAgICAJCQkJCXdoaWxlICh0cnVlKQogICAgCQkJCQl7CiAgICAJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldoaWNoIHNoaWZ0IGRvIHlvdSB3aXNoIHRvIGFsbG9jYXRlIHRvIGEgcGVybWFuZW50IGVtcGxveWVlPyAoMS4uNCk6Iik7CiAgICAJCQkJCQluNCA9IEludGVnZXIucGFyc2VJbnQoU3lzdGVtLmNvbnNvbGUoKS5yZWFkTGluZSgpKTsKICAgIAkJCQkJCWlmIChuNCA8IDEgfHwgbjQgPiA0KQogICAgCQkJCQkJewogICAgCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCBzZWxlY3Rpb24gLSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNC4iKTsKICAgIAkJCQkJCX0KICAgIAkJCQkJCWVsc2UKICAgIAkJCQkJCQlicmVhazsKICAgIAkJCQkJfQogICAgCQkJCQlpbnQgZmxhZzMgPSAwOwogICAgCQkJCQlpbnQgaTsKICAgIAkJCQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKICAgIAkJCQkJewogICAgCQkJCQkJaWYgKGJbaV1bbjRdICE9IG51bGwpCiAgICAJCQkJCQl7CiAgICAJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGlzIHNoaWZ0IGlzIGFscmVhZHkgYWxsb2NhdGVkXG4iKTsKICAgIAkJCQkJCQlmbGFnMyA9IDE7CiAgICAJCQkJCQkJYnJlYWs7CiAgICAJCQkJCQl9CiAgICAJCQkJCX0KICAgIAkJCQkJaWYgKGZsYWczID09IDApCiAgICAJCQkJCXsKICAgIAkJCQkJCQogICAgCQkJCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCiAgICAJCQkJCQl7CiAgICAJCQkJCQkJaWYgKGFbaV0gaW5zdGFuY2VvZiBQZXJtYW5lbnRFbXBsb3llZSA9PSB0cnVlKQogICAgCQkJCQkJCXsKICAgIAkJCQkJCQkJU3RyaW5nIHYgPSBhW2ldLnRvU3RyaW5nKCk7CiAgICAJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbih2KTsKICAgIAkJCQkJCQl9CiAgICAJCQkJCQl9CiAgICAJCQkJCQlpbnQgZmxhZzQgPSAwOwogICAgCQkJCQkJd2hpbGUgKHRydWUpCiAgICAJCQkJCQl7CiAgICAJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFbnRlciBJRCIpOwogICAgCQkJCQkJCVNjYW5uZXIgaW5wdXQgPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pOwogICAgCQkJCQkJCVN0cmluZyB5ID0gaW5wdXQubmV4dExpbmUoKTsKICAgIAkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKICAgIAkJCQkJCQl7CiAgICAJCQkJCQkJCWlmIChPYmplY3RzLmVxdWFscyh5LCBhW2ldLklEKSA9PSB0cnVlKQogICAgCQkJCQkJCQl7CiAgICAJCQkJCQkJCQlmbGFnNCA9IDE7CiAgICAJCQkJCQkJCX0KICAgIAkJCQkJCQkJaWYgKGZsYWc0ID09IDEpCiAgICAJCQkJCQkJCQlicmVhazsKICAgIAkJCQkJCQl9CiAgICAJCQkJCQkJaWYgKGZsYWc0ID09IDEpCiAgICAJCQkJCQkJCWJyZWFrOwogICAgCQkJCQkJCWVsc2UKICAgIAkJCQkJCQl7CiAgICAJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCBzZWxlY3Rpb24gLSB0cnkgYWdhaW4uIik7CiAgICAJCQkJCQkJfQogICAgCQkJCQkJfQogICAgCQkJCQkJaW50IGo7CiAgICAJCQkJCQlmb3IgKGogPSAwOyBqIDwgNTsgaisrKQogICAgCQkJCQkJewogICAgCQkJCQkJCWJbal1bbjQtMV0gPSBhW2ldOwogICAgCQkJCQkJfQogICAgCQkJCQkJYVtpXS5zaGlmdHNXb3JrZWRUaGlzV2VlayA9IGFbaV0uc2hpZnRzV29ya2VkVGhpc1dlZWsgKyA1OwogICAgCQkJCQl9CiAgICAJCQkJCWJyZWFrOwogICAgCQkJCX0KICAgIAkJCQllbHNlIGlmICggbiA9PSA2ICkKICAgIAkJCQl7CiAgICAJCQkJCWludCBpOwogICAgCQkJCQlkb3VibGUgdG90YWwgPSAwOwogICAgCQkJCQlmb3IgKCBpID0gMDsgaSA8IDEwOyBpKysgKQogICAgCQkJCQl7CiAgICAJCQkJCQlTeXN0ZW0ub3V0LnByaW50KGFbaV0udG9TdHJpbmcoKSk7CiAgICAJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICAgICIpOwogICAgCQkJCQkJZG91YmxlIHZhciA9IGFbaV0uY2FsY3VsYXRlV2Vla2x5UGF5KCk7CiAgICAJCQkJCQlTeXN0ZW0ub3V0LnByaW50KHZhcik7CiAgICAJCQkJCQl0b3RhbCA9IHRvdGFsICsgdmFyOwogICAgCQkJCQkJU3lzdGVtLm91dC5wcmludCgiXG4iKTsKICAgIAkJCQkJfQogICAgCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CiAgICAJCQkJCVN5c3RlbS5vdXQucHJpbnQoIlRPVEFMIFdBR0VTIEZPUiBUSElTIFdFRUs6ICAiKTsKICAgIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKHRvdGFsKTsKICAgIAkJCQkJYnJlYWs7CiAgICAJCQkJfSAKICAgIAkJCQllbHNlIGlmIChuID09IDcpCiAgICAJCQkJewogICAgCQkJCQlmbGFnID0gMTsKICAgIAkJCQkJYnJlYWs7CiAgICAJCQkJfQogICAgCQkJfQogICAgCQl9CiAgICAJCWVsc2UKICAgIAkJCWJyZWFrOwogICAgCX0gCiAgICB9IAoJcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBFbXBsb3llZQoJewoJCVN0cmluZyBmaXJzdE5hbWU7CgkJU3RyaW5nIGxhc3ROYW1lOwoJCVN0cmluZyBJRDsKCQlpbnQgc2hpZnRzV29ya2VkVGhpc1dlZWs7CgkJRW1wbG95ZWUoU3RyaW5nIGEsIFN0cmluZyBiLCBTdHJpbmcgYykKCQl7CgkJCWZpcnN0TmFtZSA9IGE7CgkJCWxhc3ROYW1lID0gYjsKCQkJSUQgPSBjOwoJCX0KCQlwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpCgkJewoJCQlyZXR1cm4gZmlyc3ROYW1lOwoJCX0KCQlwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkKCQl7CgkJCXJldHVybiBsYXN0TmFtZTsKCQl9CgkJcHVibGljIFN0cmluZyBnZXRJRCgpCgkJewoJCQlyZXR1cm4gSUQ7CgkJfQoJCXB1YmxpYyBpbnQgZ2V0U2hpZnRzV29ya2VkVGhpc1dlZWsoKQoJCXsKCQkJcmV0dXJuIHNoaWZ0c1dvcmtlZFRoaXNXZWVrOwoJCX0KCQlwdWJsaWMgdm9pZCByZXNldFNoaWZ0c1dvcmtlZFRoaXNXZWVrKCkKCQl7CgkJCXNoaWZ0c1dvcmtlZFRoaXNXZWVrID0gMDsKCQl9CgkJcHVibGljIHZvaWQgaW5jcmVtZW50U2hpZnRzV29ya2VkVGhpc1dlZWsoKQoJCXsKCQkJc2hpZnRzV29ya2VkVGhpc1dlZWsgPSBzaGlmdHNXb3JrZWRUaGlzV2VlayArIDE7CgkJfQoJCXB1YmxpYyBhYnN0cmFjdCBkb3VibGUgY2FsY3VsYXRlV2Vla2x5UGF5KCk7CgkJcHVibGljIFN0cmluZyB0b1N0cmluZygpCgkJewoJCQlTdHJpbmcgYTEgPSAiWyIgKyBJRCArICJdIjsKCQkJU3RyaW5nIGEyID0gYTEgKyAiICI7CgkJCVN0cmluZyBhMyA9IGxhc3ROYW1lICsgIiwiOwoJCQlTdHJpbmcgYTQgPSBhMyArICIgIjsKCQkJU3RyaW5nIGE1ID0gZmlyc3ROYW1lOwoJCQlTdHJpbmcgYTYgPSBhMiArIGE0ICsgYTU7CgkJCXJldHVybiBhNjsKCQl9Cgl9CgoJcHVibGljIHN0YXRpYyBjbGFzcyBQZXJtYW5lbnRFbXBsb3llZSBleHRlbmRzIEVtcGxveWVlCgl7CgkJZG91YmxlIHdlZWtseVdhZ2U7CgkJUGVybWFuZW50RW1wbG95ZWUoU3RyaW5nIGExLCBTdHJpbmcgYTIsIFN0cmluZyBhMykKCQl7CgkJCXN1cGVyKGExLGEyLGEzKTsKCQkJd2Vla2x5V2FnZSA9IDgxMi40NzsKCQl9CgkJUGVybWFuZW50RW1wbG95ZWUoU3RyaW5nIGExLCBTdHJpbmcgYTIsIFN0cmluZyBhMywgZG91YmxlIGE0KQoJCXsKCQkJc3VwZXIoYTEsYTIsYTMpOwoJCQl3ZWVrbHlXYWdlID0gYTQ7CgkJfQoJCXB1YmxpYyB2b2lkIHNldFdlZWtseVdhZ2UoZG91YmxlIGExKQoJCXsKCQkJd2Vla2x5V2FnZSA9IGExOwoJCX0KCQlwdWJsaWMgZG91YmxlIGdldFdlZWtseVdhZ2UoKQoJCXsKCQkJcmV0dXJuIHdlZWtseVdhZ2U7CgkJfQoJCXB1YmxpYyBkb3VibGUgY2FsY3VsYXRlV2Vla2x5UGF5KCkKCQl7CgkJCXJldHVybiB3ZWVrbHlXYWdlOwoJCX0KCX0KCglwdWJsaWMgc3RhdGljIGNsYXNzIENhc3VhbEVtcGxveWVlIGV4dGVuZHMgRW1wbG95ZWUKCXsKCQlkb3VibGUgc2hpZnRSYXRlOwoJCUNhc3VhbEVtcGxveWVlKFN0cmluZyBhMSwgU3RyaW5nIGEyLCBTdHJpbmcgYTMpCgkJewoJCQlzdXBlcihhMSxhMixhMyk7CgkJCXNoaWZ0UmF0ZSA9IDQ3LjU7CgkJfQoJCUNhc3VhbEVtcGxveWVlKFN0cmluZyBhMSwgU3RyaW5nIGEyLCBTdHJpbmcgYTMsIGRvdWJsZSBhNCkKCQl7CgkJCXN1cGVyKGExLGEyLGEzKTsKCQkJc2hpZnRSYXRlID0gYTQ7CgkJfQoJCXB1YmxpYyB2b2lkIHNldFNoaWZ0UmF0ZShkb3VibGUgYTEpCgkJewoJCQlzaGlmdFJhdGUgPSBhMTsKCQl9CgkJcHVibGljIGRvdWJsZSBnZXRTaGlmdFJhdGUgKGRvdWJsZSBhMikKCQl7CgkJCXJldHVybiBzaGlmdFJhdGU7CgkJfQoJCXB1YmxpYyBkb3VibGUgY2FsY3VsYXRlV2Vla2x5UGF5KCkgCgkJewoJCQlkb3VibGUgYTEgPSBzaGlmdFJhdGUqc2hpZnRzV29ya2VkVGhpc1dlZWs7CgkJCXJldHVybiBhMTsKCQl9Cgl9Cn0KCgo=