import  java.io.BufferedOutputStream ; 
import  java.io.BufferedReader ; 
import  java.io.FileInputStream ; 
import  java.io.FileNotFoundException ; 
import  java.io.FileOutputStream ; 
import  java.io.IOException ; 
import  java.io.InputStream ; 
import  java.io.InputStreamReader ; 
import  java.io.OutputStream ; 
import  java.io.PrintWriter ; 
import  java.util.Arrays ; 
import  java.util.StringTokenizer ; 
 
public  class  R2D2AndDroidArmy { 
	public  static  void  main
( String [ ]  args
)  {  		try  { 
		} 
		Kattio io =  new  Kattio( input, output) ; 
		//int t=io.getInt(); 
		//for (int i=1; i<=t; i++) 
		( new  Solve( io) ) .main ( ) ; 
		io.close ( ) ; 
 
			try  { 
				input.close ( ) ; 
			} 
			try  { 
				output.close ( ) ; 
			} 
	} 
} 
 
class  RMQ
{ 
	int  n; 
	int [ ]  arr; 
	int [ ]  l,r; 
	int [ ]  dat; 
	int [ ]  pos; 
 
	public  RMQ( int  n) 
	{ 
		this .n  =  n; 
		arr =  new  int [ n+ 1 ] ; 
		dat =  new  int [ 4 * n+ 1 ] ; 
		l =  new  int [ 4 * n+ 1 ] ; 
		r =  new  int [ 4 * n+ 1 ] ; 
		pos =  new  int [ n+ 1 ] ; 
		RMQHelper( 1 ,1 ,n) ; 
	} 
 
	private  void  RMQHelper( int  i,int  x,int  y) 
	{ 
		l[ i] = x; 
		r[ i] = y; 
		if  ( x== y) 
		{ 
			dat[ i] = arr[ x] ; 
			pos[ x] = i; 
		} 
		else 
		{ 
			int  m= ( x+ y) / 2 ; 
			RMQHelper( i* 2 ,x,m) ; 
			RMQHelper( i* 2 + 1 ,m+ 1 ,y) ; 
			dat
[ i
] = Math .
max ( dat
[ i
* 2 ] , dat
[ i
* 2 + 1 ] ) ; 		} 
	} 
 
	public  void  update( int  x,int  y) 
	{ 
		arr[ x]  =  y; 
		dat[ pos[ x] ]  =  y; 
		updateHelper( pos[ x] / 2 ) ; 
	} 
 
	private  void  updateHelper( int  x) 
	{ 
		if  ( x== 0 )  return ; 
 
		dat
[ x
]  =  Math .
max ( dat
[ x
* 2 ] ,dat
[ x
* 2 + 1 ] ) ; 		updateHelper( x/ 2 ) ; 
	} 
 
	public  int  get( int  l,int  r) 
	{ 
		return  getHelper( 1 ,l,r) ; 
	} 
 
	private  int  getHelper( int  i,int  x,int  y) 
	{ 
		int  res; 
		if  ( y< l[ i]  ||  x> r[ i] )  res= 0 ; 
		else 
		if  ( x<= l[ i]  &&  r[ i] <= y)  res= dat[ i] ; 
		else 
		{ 
			res= getHelper( i* 2 ,x,y) ; 
			res
= Math .
max ( res,getHelper
( i
* 2 + 1 ,x,y
) ) ; 		} 
 
		return  res; 
	} 
 
	@Override
		return  "RMQ [n="  +  n 
+  ", arr="  +  Arrays .
toString ( arr
)  +  ", l="  +  Arrays .
toString ( l
)  +  ", r="  				+  Arrays .
toString ( r
)  +  ", dat="  +  Arrays .
toString ( dat
)  +  ", pos="  +  Arrays .
toString ( pos
)  +  "]" ;  	} 
} 
 
class  RMQEfficient
{ 
	int  n; 
	int [ ]  arr; 
	int [ ] [ ]  rmq; 
	int [ ]  pow; 
	int [ ]  mn; 
 
	public  RMQEfficient( int [ ]  arr) 
	{ 
		this .n  =  arr.length - 1 ; 
 
		this .arr  =  new  int [ arr.length ] ; 
		for  ( int  i= 1 ;  i<= n;  i++ ) 
			this .arr [ i]  =  arr[ i] ; 
 
		initPowMn( ) ; 
		initRMQ( ) ; 
	} 
 
	private  void  initPowMn( ) 
	{ 
		pow =  new  int [ 31 ] ; 
		pow[ 0 ]  =  1 ; 
 
		mn =  new  int [ n+ 1 ] ; 
 
		for  ( int  i= 1 ;  i<= 30 ;  i++ ) 
		{ 
			pow[ i] = 2 * pow[ i- 1 ] ; 
			if  ( pow[ i] <= n)  
			{ 
				try 
				{ 
					mn[ pow[ i] ]  =  i; 
				} 
				{ 
					System .
out .
println ( n
+ " " + pow
[ i
] + " " + i
) ;  				} 
			} 
		} 
 
		for  ( int  i= 1 ;  i<= n;  i++ ) 
			mn
[ i
]  =  Math .
max ( mn
[ i
- 1 ] , mn
[ i
] ) ; 	} 
 
	private  void  initRMQ( ) 
	{ 
		rmq =  new  int [ n+ 1 ] [ 31 ] ; 
		for  ( int  i= 1 ;  i<= n;  i++ ) 
		for  ( int  i= 1 ;  i<= n;  i++ ) 
			for  ( int  j= 0 ;  j<= 30 ;  j++ ) 
				initRMQHelper( i,j) ; 
	} 
 
	private  int  initRMQHelper( int  x,int  y) 
	{ 
		if  ( x> n)  return  0 ; 
		else 
		if  ( rmq[ x] [ y] !=- 1 )  return  rmq[ x] [ y] ; 
		else 
		if  ( y== 0 ) 
			rmq[ x] [ y] = arr[ x] ; 
		else 
		{ 
			int  endSide =  x+ pow[ y] - 1 ; 
			rmq
[ x
] [ y
] = Math .
max ( initRMQHelper
( x,y
- 1 ) ,
					initRMQHelper( endSide- pow[ y- 1 ] + 1 ,y- 1 ) ) ; 
		} 
		return  rmq[ x] [ y] ; 
	} 
 
	public  int  get( int  l,int  r) 
	{ 
		if  ( r< l)  return  0 ; 
		//System.out.println("get "+l+" "+r); 
		int  length =  ( r- l+ 1 ) ; 
		int  step =  mn[ length] ; 
		//System.out.println(step); 
		try 
		{ 
			return  Math .
max ( rmq
[ l
] [ step
] ,rmq
[ r
- pow
[ step
] + 1 ] [ step
] ) ;  		} 
		{ 
			System .
out .
println ( l
+ " " + r
+ " " + ( r
- pow
[ step
] + 1 ) + " " + step
) ;  			return  0 ; 
		} 
	} 
 
} 
 
class  Solve { 
	Kattio io; 
	int  n,m,k; 
	int [ ] [ ]  a; 
	RMQEfficient[ ]  ds; 
	Solve( Kattio io)  { 
		this .io  =  io; 
	} 
 
	boolean  check( int  l,int  r) 
	{ 
		//io.println("check "+l+" "+r); 
		if  ( r> n)  return  false ; 
		int  sum =  0 ; 
		for  ( int  i= 1 ;  i<= m;  i++ ) 
		{ 
			//io.println("check "+l+" "+r); 
			sum+= ds[ i] .get ( l, r) ; 
		} 
		return  ( sum<= k) ; 
	} 
 
	void  main( )  { 
		n= io.getInt ( ) ; 
		m= io.getInt ( ) ; 
		k= io.getInt ( ) ; 
		a =  new  int [ n+ 1 ] [ m+ 1 ] ; 
		for  ( int  i= 1 ;  i<= n;  i++ ) 
			for  ( int  j= 1 ;  j<= m;  j++ ) 
				a[ i] [ j] = io.getInt ( ) ; 
 
		ds =  new  RMQEfficient[ m+ 1 ] ; 
 
		for  ( int  i= 1 ;  i<= m;  i++ ) 
		{ 
			int [ ]  init =  new  int [ n+ 1 ] ; 
			for  ( int  j= 1 ;  j<= n;  j++ ) 
				init[ j] = a[ j] [ i] ; 
			ds[ i]  =  new  RMQEfficient( init) ; 
		} 
 
		//for (int i=1; i<=m; i++) 
		//	io.println(ds[i]); 
 
		int  res =  0 ; 
		int  vtres =  0 ; 
		for  ( int  i= 1 ;  i<= n;  i++ ) 
		{ 
			int  dau =  i, cuoi =  n; 
			do 
			{ 
				int  giua= ( dau+ cuoi) / 2 ; 
				if  ( check( i,giua) )  dau= giua+ 1 ; 
				else  cuoi= giua- 1 ; 
			} 
			while  ( dau<= cuoi) ; 
 
			if  ( cuoi- i+ 1 > res) 
			{ 
				res= cuoi- i+ 1 ; 
				vtres= i; 
			} 
		} 
 
		for  ( int  i= 1 ;  i<= m;  i++ ) 
			io.print ( ds[ i] .get ( vtres,vtres+ res- 1 ) + " " ) ; 
 
	} 
} 
 
	} 
 
	} 
 
	public  boolean  hasMoreTokens( )  { 
		return  peekToken( )  !=  null ; 
	} 
 
	public  int  getInt( )  { 
		return  Integer .
parseInt ( nextToken
( ) ) ;  	} 
 
	public  double  getDouble( )  { 
		return  Double .
parseDouble ( nextToken
( ) ) ;  	} 
 
	public  long  getLong( )  { 
		return  Long .
parseLong ( nextToken
( ) ) ;  	} 
 
		return  nextToken( ) ; 
	} 
 
 
		if  ( token ==  null ) 
			try  { 
				while  ( st ==  null  ||  ! st.hasMoreTokens ( ) )  { 
					line =  r.readLine ( ) ; 
					if  ( line ==  null ) 
						return  null ; 
				} 
				token =  st.nextToken ( ) ; 
			} 
		return  token; 
	} 
 
		token =  null ; 
		return  ans; 
	} 
} 
aW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwppbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwoKcHVibGljIGNsYXNzIFIyRDJBbmREcm9pZEFybXkgewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewoJCUlucHV0U3RyZWFtIGlucHV0OwoJCU91dHB1dFN0cmVhbSBvdXRwdXQ7CgkJdHJ5IHsKCQkJaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKCJpbnB1dC50eHQiKTsKCQkJb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dHB1dC50eHQiKTsKCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewoJCQlpbnB1dCA9IFN5c3RlbS5pbjsKCQkJb3V0cHV0ID0gU3lzdGVtLm91dDsKCQl9CgkJS2F0dGlvIGlvID0gbmV3IEthdHRpbyhpbnB1dCwgb3V0cHV0KTsKCQkvL2ludCB0PWlvLmdldEludCgpOwoJCS8vZm9yIChpbnQgaT0xOyBpPD10OyBpKyspCgkJKG5ldyBTb2x2ZShpbykpLm1haW4oKTsKCQlpby5jbG9zZSgpOwoKCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlSW5wdXRTdHJlYW0pCgkJCXRyeSB7CgkJCQlpbnB1dC5jbG9zZSgpOwoJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CgkJCX0KCQlpZiAob3V0cHV0IGluc3RhbmNlb2YgRmlsZU91dHB1dFN0cmVhbSkKCQkJdHJ5IHsKCQkJCW91dHB1dC5jbG9zZSgpOwoJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CgkJCX0KCX0KfQoKY2xhc3MgUk1RCnsKCWludCBuOwoJaW50W10gYXJyOwoJaW50W10gbCxyOwoJaW50W10gZGF0OwoJaW50W10gcG9zOwoJCglwdWJsaWMgUk1RKGludCBuKQoJewoJCXRoaXMubiA9IG47CgkJYXJyID0gbmV3IGludFtuKzFdOwoJCWRhdCA9IG5ldyBpbnRbNCpuKzFdOwoJCWwgPSBuZXcgaW50WzQqbisxXTsKCQlyID0gbmV3IGludFs0Km4rMV07CgkJcG9zID0gbmV3IGludFtuKzFdOwoJCVJNUUhlbHBlcigxLDEsbik7Cgl9CgkKCXByaXZhdGUgdm9pZCBSTVFIZWxwZXIoaW50IGksaW50IHgsaW50IHkpCgl7CgkJbFtpXT14OwoJCXJbaV09eTsKCQlpZiAoeD09eSkKCQl7CgkJCWRhdFtpXT1hcnJbeF07CgkJCXBvc1t4XT1pOwoJCX0KCQllbHNlCgkJewoJCQlpbnQgbT0oeCt5KS8yOwoJCQlSTVFIZWxwZXIoaSoyLHgsbSk7CgkJCVJNUUhlbHBlcihpKjIrMSxtKzEseSk7CgkJCWRhdFtpXT1NYXRoLm1heChkYXRbaSoyXSwgZGF0W2kqMisxXSk7CgkJfQoJfQoJCglwdWJsaWMgdm9pZCB1cGRhdGUoaW50IHgsaW50IHkpCgl7CgkJYXJyW3hdID0geTsKCQlkYXRbcG9zW3hdXSA9IHk7CgkJdXBkYXRlSGVscGVyKHBvc1t4XS8yKTsKCX0KCQoJcHJpdmF0ZSB2b2lkIHVwZGF0ZUhlbHBlcihpbnQgeCkKCXsKCQlpZiAoeD09MCkgcmV0dXJuOwoJCQoJCWRhdFt4XSA9IE1hdGgubWF4KGRhdFt4KjJdLGRhdFt4KjIrMV0pOwoJCXVwZGF0ZUhlbHBlcih4LzIpOwoJfQoJCglwdWJsaWMgaW50IGdldChpbnQgbCxpbnQgcikKCXsKCQlyZXR1cm4gZ2V0SGVscGVyKDEsbCxyKTsKCX0KCQoJcHJpdmF0ZSBpbnQgZ2V0SGVscGVyKGludCBpLGludCB4LGludCB5KQoJewoJCWludCByZXM7CgkJaWYgKHk8bFtpXSB8fCB4PnJbaV0pIHJlcz0wOwoJCWVsc2UKCQlpZiAoeDw9bFtpXSAmJiByW2ldPD15KSByZXM9ZGF0W2ldOwoJCWVsc2UKCQl7CgkJCXJlcz1nZXRIZWxwZXIoaSoyLHgseSk7CgkJCXJlcz1NYXRoLm1heChyZXMsZ2V0SGVscGVyKGkqMisxLHgseSkpOwoJCX0KCQkKCQlyZXR1cm4gcmVzOwoJfQoKCUBPdmVycmlkZQoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlyZXR1cm4gIlJNUSBbbj0iICsgbiArICIsIGFycj0iICsgQXJyYXlzLnRvU3RyaW5nKGFycikgKyAiLCBsPSIgKyBBcnJheXMudG9TdHJpbmcobCkgKyAiLCByPSIKCQkJCSsgQXJyYXlzLnRvU3RyaW5nKHIpICsgIiwgZGF0PSIgKyBBcnJheXMudG9TdHJpbmcoZGF0KSArICIsIHBvcz0iICsgQXJyYXlzLnRvU3RyaW5nKHBvcykgKyAiXSI7Cgl9Cn0KCmNsYXNzIFJNUUVmZmljaWVudAp7CglpbnQgbjsKCWludFtdIGFycjsKCWludFtdW10gcm1xOwoJaW50W10gcG93OwoJaW50W10gbW47CgkKCXB1YmxpYyBSTVFFZmZpY2llbnQoaW50W10gYXJyKQoJewoJCXRoaXMubiA9IGFyci5sZW5ndGgtMTsKCQkKCQl0aGlzLmFyciA9IG5ldyBpbnRbYXJyLmxlbmd0aF07CgkJZm9yIChpbnQgaT0xOyBpPD1uOyBpKyspCgkJCXRoaXMuYXJyW2ldID0gYXJyW2ldOwoJCQoJCWluaXRQb3dNbigpOwoJCWluaXRSTVEoKTsKCX0KCQoJcHJpdmF0ZSB2b2lkIGluaXRQb3dNbigpCgl7CgkJcG93ID0gbmV3IGludFszMV07CgkJcG93WzBdID0gMTsKCQkKCQltbiA9IG5ldyBpbnRbbisxXTsKCQlBcnJheXMuZmlsbChtbiwgMCk7CgkJCgkJZm9yIChpbnQgaT0xOyBpPD0zMDsgaSsrKQoJCXsKCQkJcG93W2ldPTIqcG93W2ktMV07CgkJCWlmIChwb3dbaV08PW4pIAoJCQl7CgkJCQl0cnkKCQkJCXsKCQkJCQltbltwb3dbaV1dID0gaTsKCQkJCX0KCQkJCWNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpCgkJCQl7CgkJCQkJU3lzdGVtLm91dC5wcmludGxuKG4rIiAiK3Bvd1tpXSsiICIraSk7CgkJCQl9CgkJCX0KCQl9CgkJCgkJZm9yIChpbnQgaT0xOyBpPD1uOyBpKyspCgkJCW1uW2ldID0gTWF0aC5tYXgobW5baS0xXSwgbW5baV0pOwoJfQoJCglwcml2YXRlIHZvaWQgaW5pdFJNUSgpCgl7CgkJcm1xID0gbmV3IGludFtuKzFdWzMxXTsKCQlmb3IgKGludCBpPTE7IGk8PW47IGkrKykKCQkJQXJyYXlzLmZpbGwocm1xW2ldLC0xKTsKCQlmb3IgKGludCBpPTE7IGk8PW47IGkrKykKCQkJZm9yIChpbnQgaj0wOyBqPD0zMDsgaisrKQoJCQkJaW5pdFJNUUhlbHBlcihpLGopOwoJfQoJCglwcml2YXRlIGludCBpbml0Uk1RSGVscGVyKGludCB4LGludCB5KQoJewoJCWlmICh4Pm4pIHJldHVybiAwOwoJCWVsc2UKCQlpZiAocm1xW3hdW3ldIT0tMSkgcmV0dXJuIHJtcVt4XVt5XTsKCQllbHNlCgkJaWYgKHk9PTApCgkJCXJtcVt4XVt5XT1hcnJbeF07CgkJZWxzZQoJCXsKCQkJaW50IGVuZFNpZGUgPSB4K3Bvd1t5XS0xOwoJCQlybXFbeF1beV09TWF0aC5tYXgoaW5pdFJNUUhlbHBlcih4LHktMSksCgkJCQkJaW5pdFJNUUhlbHBlcihlbmRTaWRlLXBvd1t5LTFdKzEseS0xKSk7CgkJfQoJCXJldHVybiBybXFbeF1beV07Cgl9CgkKCXB1YmxpYyBpbnQgZ2V0KGludCBsLGludCByKQoJewoJCWlmIChyPGwpIHJldHVybiAwOwoJCS8vU3lzdGVtLm91dC5wcmludGxuKCJnZXQgIitsKyIgIityKTsKCQlpbnQgbGVuZ3RoID0gKHItbCsxKTsKCQlpbnQgc3RlcCA9IG1uW2xlbmd0aF07CgkJLy9TeXN0ZW0ub3V0LnByaW50bG4oc3RlcCk7CgkJdHJ5CgkJewoJCQlyZXR1cm4gTWF0aC5tYXgocm1xW2xdW3N0ZXBdLHJtcVtyLXBvd1tzdGVwXSsxXVtzdGVwXSk7CgkJfQoJCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkKCQl7CgkJCVN5c3RlbS5vdXQucHJpbnRsbihsKyIgIityKyIgIisoci1wb3dbc3RlcF0rMSkrIiAiK3N0ZXApOwoJCQlyZXR1cm4gMDsKCQl9Cgl9CgkKfQoKY2xhc3MgU29sdmUgewoJS2F0dGlvIGlvOwoJaW50IG4sbSxrOwoJaW50W11bXSBhOwoJUk1RRWZmaWNpZW50W10gZHM7CglTb2x2ZShLYXR0aW8gaW8pIHsKCQl0aGlzLmlvID0gaW87Cgl9CgkKCWJvb2xlYW4gY2hlY2soaW50IGwsaW50IHIpCgl7CgkJLy9pby5wcmludGxuKCJjaGVjayAiK2wrIiAiK3IpOwoJCWlmIChyPm4pIHJldHVybiBmYWxzZTsKCQlpbnQgc3VtID0gMDsKCQlmb3IgKGludCBpPTE7IGk8PW07IGkrKykKCQl7CgkJCS8vaW8ucHJpbnRsbigiY2hlY2sgIitsKyIgIityKTsKCQkJc3VtKz1kc1tpXS5nZXQobCwgcik7CgkJfQoJCXJldHVybiAoc3VtPD1rKTsKCX0KCgl2b2lkIG1haW4oKSB7CgkJbj1pby5nZXRJbnQoKTsKCQltPWlvLmdldEludCgpOwoJCWs9aW8uZ2V0SW50KCk7CgkJYSA9IG5ldyBpbnRbbisxXVttKzFdOwoJCWZvciAoaW50IGk9MTsgaTw9bjsgaSsrKQoJCQlmb3IgKGludCBqPTE7IGo8PW07IGorKykKCQkJCWFbaV1bal09aW8uZ2V0SW50KCk7CgkJCgkJZHMgPSBuZXcgUk1RRWZmaWNpZW50W20rMV07CgkJCgkJZm9yIChpbnQgaT0xOyBpPD1tOyBpKyspCgkJewoJCQlpbnRbXSBpbml0ID0gbmV3IGludFtuKzFdOwoJCQlmb3IgKGludCBqPTE7IGo8PW47IGorKykKCQkJCWluaXRbal09YVtqXVtpXTsKCQkJZHNbaV0gPSBuZXcgUk1RRWZmaWNpZW50KGluaXQpOwoJCX0KCQkKCQkvL2ZvciAoaW50IGk9MTsgaTw9bTsgaSsrKQoJCS8vCWlvLnByaW50bG4oZHNbaV0pOwoJCQoJCWludCByZXMgPSAwOwoJCWludCB2dHJlcyA9IDA7CgkJZm9yIChpbnQgaT0xOyBpPD1uOyBpKyspCgkJewoJCQlpbnQgZGF1ID0gaSwgY3VvaSA9IG47CgkJCWRvCgkJCXsKCQkJCWludCBnaXVhPShkYXUrY3VvaSkvMjsKCQkJCWlmIChjaGVjayhpLGdpdWEpKSBkYXU9Z2l1YSsxOwoJCQkJZWxzZSBjdW9pPWdpdWEtMTsKCQkJfQoJCQl3aGlsZSAoZGF1PD1jdW9pKTsKCQkJCgkJCWlmIChjdW9pLWkrMT5yZXMpCgkJCXsKCQkJCXJlcz1jdW9pLWkrMTsKCQkJCXZ0cmVzPWk7CgkJCX0KCQl9CgkJCgkJZm9yIChpbnQgaT0xOyBpPD1tOyBpKyspCgkJCWlvLnByaW50KGRzW2ldLmdldCh2dHJlcyx2dHJlcytyZXMtMSkrIiAiKTsKCQkKCX0KfQoKY2xhc3MgS2F0dGlvIGV4dGVuZHMgUHJpbnRXcml0ZXIgewoJcHVibGljIEthdHRpbyhJbnB1dFN0cmVhbSBpKSB7CgkJc3VwZXIobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKFN5c3RlbS5vdXQpKTsKCQlyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpKSk7Cgl9CgoJcHVibGljIEthdHRpbyhJbnB1dFN0cmVhbSBpLCBPdXRwdXRTdHJlYW0gbykgewoJCXN1cGVyKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvKSk7CgkJciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaSkpOwoJfQoKCXB1YmxpYyBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7CgkJcmV0dXJuIHBlZWtUb2tlbigpICE9IG51bGw7Cgl9CgoJcHVibGljIGludCBnZXRJbnQoKSB7CgkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQobmV4dFRva2VuKCkpOwoJfQoKCXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKCkgewoJCXJldHVybiBEb3VibGUucGFyc2VEb3VibGUobmV4dFRva2VuKCkpOwoJfQoKCXB1YmxpYyBsb25nIGdldExvbmcoKSB7CgkJcmV0dXJuIExvbmcucGFyc2VMb25nKG5leHRUb2tlbigpKTsKCX0KCglwdWJsaWMgU3RyaW5nIGdldFdvcmQoKSB7CgkJcmV0dXJuIG5leHRUb2tlbigpOwoJfQoKCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgcjsKCXByaXZhdGUgU3RyaW5nIGxpbmU7Cglwcml2YXRlIFN0cmluZ1Rva2VuaXplciBzdDsKCXByaXZhdGUgU3RyaW5nIHRva2VuOwoKCXByaXZhdGUgU3RyaW5nIHBlZWtUb2tlbigpIHsKCQlpZiAodG9rZW4gPT0gbnVsbCkKCQkJdHJ5IHsKCQkJCXdoaWxlIChzdCA9PSBudWxsIHx8ICFzdC5oYXNNb3JlVG9rZW5zKCkpIHsKCQkJCQlsaW5lID0gci5yZWFkTGluZSgpOwoJCQkJCWlmIChsaW5lID09IG51bGwpCgkJCQkJCXJldHVybiBudWxsOwoJCQkJCXN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lKTsKCQkJCX0KCQkJCXRva2VuID0gc3QubmV4dFRva2VuKCk7CgkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCQkJfQoJCXJldHVybiB0b2tlbjsKCX0KCglwcml2YXRlIFN0cmluZyBuZXh0VG9rZW4oKSB7CgkJU3RyaW5nIGFucyA9IHBlZWtUb2tlbigpOwoJCXRva2VuID0gbnVsbDsKCQlyZXR1cm4gYW5zOwoJfQp9