#define LOCAL
/** ` Micro Mezzo Macro Flation -- Overheated Economy ., **/
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
#define REP(i, n) for (int i=0;i<int(n);++i)
#define FOR(i, a, b) for (int i=int(a);i<int(b);++i)
#define DWN(i, b, a) for (int i=int(b-1);i>=int(a);--i)
#define REP_1(i, n) for (int i=1;i<=int(n);++i)
#define FOR_1(i, a, b) for (int i=int(a);i<=int(b);++i)
#define DWN_1(i, b, a) for (int i=int(b);i>=int(a);--i)
#define REP_C(i, n) for (int n____=int(n),i=0;i<n____;++i)
#define FOR_C(i, a, b) for (int b____=int(b),i=a;i<b____;++i)
#define DWN_C(i, b, a) for (int a____=int(a),i=b-1;i>=a____;--i)
#define REP_N(i, n) for (i=0;i<int(n);++i)
#define FOR_N(i, a, b) for (i=int(a);i<int(b);++i)
#define DWN_N(i, b, a) for (i=int(b-1);i>=int(a);--i)
#define REP_1_C(i, n) for (int n____=int(n),i=1;i<=n____;++i)
#define FOR_1_C(i, a, b) for (int b____=int(b),i=a;i<=b____;++i)
#define DWN_1_C(i, b, a) for (int a____=int(a),i=b;i>=a____;--i)
#define REP_1_N(i, n) for (i=1;i<=int(n);++i)
#define FOR_1_N(i, a, b) for (i=int(a);i<=int(b);++i)
#define DWN_1_N(i, b, a) for (i=int(b);i>=int(a);--i)
#define REP_C_N(i, n) for (n____=int(n),i=0;i<n____;++i)
#define FOR_C_N(i, a, b) for (b____=int(b),i=a;i<b____;++i)
#define DWN_C_N(i, b, a) for (a____=int(a),i=b-1;i>=a____;--i)
#define REP_1_C_N(i, n) for (n____=int(n),i=1;i<=n____;++i)
#define FOR_1_C_N(i, a, b) for (b____=int(b),i=a;i<=b____;++i)
#define DWN_1_C_N(i, b, a) for (a____=int(a),i=b;i>=a____;--i)
#define ECH(it, A) for (typeof(A.begin()) it=A.begin(); it != A.end(); ++it)
#define DO(n) while(n--)
#define DO_C(n) int n____ = n; while(n____--)
#define TO(i, a, b) int s_=a<b?1:-1,b_=b+s_;for(int i=a;i!=b_;i+=s_)
#define TO_1(i, a, b) int s_=a<b?1:-1,b_=b;for(int i=a;i!=b_;i+=s_)
#define SQZ(i, j, a, b) for (int i=int(a),j=int(b)-1;i<j;++i,--j)
#define SQZ_1(i, j, a, b) for (int i=int(a),j=int(b);i<=j;++i,--j)
#define REP_2(i, j, n, m) REP(i, n) REP(j, m)
#define REP_2_1(i, j, n, m) REP_1(i, n) REP_1(j, m)
#define ALL(A) A.begin(), A.end()
#define LLA(A) A.rbegin(), A.rend()
#define CPY(A, B) memcpy(A, B, sizeof(A))
#define INS(A, P, B) A.insert(A.begin() + P, B)
#define ERS(A, P) A.erase(A.begin() + P)
#define BSC(A, X) find(ALL(A), X) // != A.end()
#define CTN(T, x) (T.find(x) != T.end())
#define SZ(A) int(A.size())
#define PB push_back
#define MP(A, B) make_pair(A, B)
#define Rush int T____; RD(T____); DO(T____)
#pragma comment(linker, "/STACK:36777216")
//#pragma GCC optimize ("O2")
#define Ruby system("ruby main.rb")
#define Haskell system("runghc main.hs")
#define Pascal system("fpc main.pas")
typedef long long LL;
typedef double DB;
typedef unsigned UINT;
typedef unsigned long long ULL;
typedef vector< int > VI;
typedef vector< char > VC;
typedef vector< string> VS;
typedef vector< LL> VL;
typedef vector< DB> VD;
typedef set< int > SI;
typedef set< string> SS;
typedef set< LL> SL;
typedef set< DB> SD;
typedef map< int , int > MII;
typedef map< string, int > MSI;
typedef map< LL, int > MLI;
typedef map< DB, int > MDI;
typedef map< int , bool > MIB;
typedef map< string, bool > MSB;
typedef map< LL, bool > MLB;
typedef map< DB, bool > MDB;
typedef pair< int , int > PII;
typedef pair< int , bool > PIB;
typedef vector< PII> VII;
typedef vector< VI> VVI;
typedef vector< VII> VVII;
typedef set< PII> SII;
typedef map< PII, int > MPIII;
typedef map< PII, bool > MPIIB;
/** I/O Accelerator **/
/* ... :" We are I/O Accelerator ... Use us at your own risk ;) ... " .. */
template < class T> inline void RD( T & ) ;
template < class T> inline void OT( const T & ) ;
inline int RD( ) { int x; RD( x) ; return x; }
template < class T> inline T& _RD( T & x) { RD( x) ; return x; }
inline void RC( char & c) { scanf ( " %c" , & c) ; }
inline void RS( char * s) { scanf ( "%s" , s) ; }
template < class T0, class T1> inline void RD( T0 & x0, T1 & x1) { RD( x0) , RD( x1) ; }
template < class T0, class T1, class T2> inline void RD( T0 & x0, T1 & x1, T2 & x2) { RD( x0) , RD( x1) , RD( x2) ; }
template < class T0, class T1, class T2, class T3> inline void RD( T0 & x0, T1 & x1, T2 & x2, T3 & x3) { RD( x0) , RD( x1) , RD( x2) , RD( x3) ; }
template < class T0, class T1, class T2, class T3, class T4> inline void RD( T0 & x0, T1 & x1, T2 & x2, T3 & x3, T4 & x4) { RD( x0) , RD( x1) , RD( x2) , RD( x3) , RD( x4) ; }
template < class T0, class T1, class T2, class T3, class T4, class T5> inline void RD( T0 & x0, T1 & x1, T2 & x2, T3 & x3, T4 & x4, T5 & x5) { RD( x0) , RD( x1) , RD( x2) , RD( x3) , RD( x4) , RD( x5) ; }
template < class T0, class T1, class T2, class T3, class T4, class T5, class T6> inline void RD( T0 & x0, T1 & x1, T2 & x2, T3 & x3, T4 & x4, T5 & x5, T6 & x6) { RD( x0) , RD( x1) , RD( x2) , RD( x3) , RD( x4) , RD( x5) , RD( x6) ; }
template < class T0, class T1> inline void OT( T0 & x0, T1 & x1) { OT( x0) , OT( x1) ; }
template < class T0, class T1, class T2> inline void OT( T0 & x0, T1 & x1, T2 & x2) { OT( x0) , OT( x1) , OT( x2) ; }
template < class T0, class T1, class T2, class T3> inline void OT( T0 & x0, T1 & x1, T2 & x2, T3 & x3) { OT( x0) , OT( x1) , OT( x2) , OT( x3) ; }
template < class T0, class T1, class T2, class T3, class T4> inline void OT( T0 & x0, T1 & x1, T2 & x2, T3 & x3, T4 & x4) { OT( x0) , OT( x1) , OT( x2) , OT( x3) , OT( x4) ; }
template < class T0, class T1, class T2, class T3, class T4, class T5> inline void OT( T0 & x0, T1 & x1, T2 & x2, T3 & x3, T4 & x4, T5 & x5) { OT( x0) , OT( x1) , OT( x2) , OT( x3) , OT( x4) , OT( x5) ; }
template < class T0, class T1, class T2, class T3, class T4, class T5, class T6> inline void OT( T0 & x0, T1 & x1, T2 & x2, T3 & x3, T4 & x4, T5 & x5, T6 & x6) { OT( x0) , OT( x1) , OT( x2) , OT( x3) , OT( x4) , OT( x5) , OT( x6) ; }
template < class T> inline void RST( T & A) { memset ( A, 0 , sizeof ( A) ) ; }
template < class T0, class T1> inline void RST( T0 & A0, T1 & A1) { RST( A0) , RST( A1) ; }
template < class T0, class T1, class T2> inline void RST( T0 & A0, T1 & A1, T2 & A2) { RST( A0) , RST( A1) , RST( A2) ; }
template < class T0, class T1, class T2, class T3> inline void RST( T0 & A0, T1 & A1, T2 & A2, T3 & A3) { RST( A0) , RST( A1) , RST( A2) , RST( A3) ; }
template < class T0, class T1, class T2, class T3, class T4> inline void RST( T0 & A0, T1 & A1, T2 & A2, T3 & A3, T4 & A4) { RST( A0) , RST( A1) , RST( A2) , RST( A3) , RST( A4) ; }
template < class T0, class T1, class T2, class T3, class T4, class T5> inline void RST( T0 & A0, T1 & A1, T2 & A2, T3 & A3, T4 & A4, T5 & A5) { RST( A0) , RST( A1) , RST( A2) , RST( A3) , RST( A4) , RST( A5) ; }
template < class T0, class T1, class T2, class T3, class T4, class T5, class T6> inline void RST( T0 & A0, T1 & A1, T2 & A2, T3 & A3, T4 & A4, T5 & A5, T6 & A6) { RST( A0) , RST( A1) , RST( A2) , RST( A3) , RST( A4) , RST( A5) , RST( A6) ; }
template < class T> inline void CLR( priority_queue< T, vector< T> , less< T> > & Q) {
while ( ! Q.empty ( ) ) Q.pop ( ) ;
}
template < class T> inline void CLR( priority_queue< T, vector< T> , greater< T> > & Q) {
while ( ! Q.empty ( ) ) Q.pop ( ) ;
}
template < class T> inline void CLR( T & A) { A.clear ( ) ; }
template < class T0, class T1> inline void CLR( T0 & A0, T1 & A1) { CLR( A0) , CLR( A1) ; }
template < class T0, class T1, class T2> inline void CLR( T0 & A0, T1 & A1, T2 & A2) { CLR( A0) , CLR( A1) , CLR( A2) ; }
template < class T0, class T1, class T2, class T3> inline void CLR( T0 & A0, T1 & A1, T2 & A2, T3 & A3) { CLR( A0) , CLR( A1) , CLR( A2) , CLR( A3) ; }
template < class T0, class T1, class T2, class T3, class T4> inline void CLR( T0 & A0, T1 & A1, T2 & A2, T3 & A3, T4 & A4) { CLR( A0) , CLR( A1) , CLR( A2) , CLR( A3) , CLR( A4) ; }
template < class T0, class T1, class T2, class T3, class T4, class T5> inline void CLR( T0 & A0, T1 & A1, T2 & A2, T3 & A3, T4 & A4, T5 & A5) { CLR( A0) , CLR( A1) , CLR( A2) , CLR( A3) , CLR( A4) , CLR( A5) ; }
template < class T0, class T1, class T2, class T3, class T4, class T5, class T6> inline void CLR( T0 & A0, T1 & A1, T2 & A2, T3 & A3, T4 & A4, T5 & A5, T6 & A6) { CLR( A0) , CLR( A1) , CLR( A2) , CLR( A3) , CLR( A4) , CLR( A5) , CLR( A6) ; }
template < class T> inline void CLR( T & A, int n) { REP( i, n) CLR( A[ i] ) ; }
template < class T> inline void FLC( T & A, int x) { memset ( A, x, sizeof ( A) ) ; }
template < class T0, class T1> inline void FLC( T0 & A0, T1 & A1, int x) { FLC( A0, x) , FLC( A1, x) ; }
template < class T0, class T1, class T2> inline void FLC( T0 & A0, T1 & A1, T2 & A2) { FLC( A0) , FLC( A1) , FLC( A2) ; }
template < class T0, class T1, class T2, class T3> inline void FLC( T0 & A0, T1 & A1, T2 & A2, T3 & A3) { FLC( A0) , FLC( A1) , FLC( A2) , FLC( A3) ; }
template < class T0, class T1, class T2, class T3, class T4> inline void FLC( T0 & A0, T1 & A1, T2 & A2, T3 & A3, T4 & A4) { FLC( A0) , FLC( A1) , FLC( A2) , FLC( A3) , FLC( A4) ; }
template < class T0, class T1, class T2, class T3, class T4, class T5> inline void FLC( T0 & A0, T1 & A1, T2 & A2, T3 & A3, T4 & A4, T5 & A5) { FLC( A0) , FLC( A1) , FLC( A2) , FLC( A3) , FLC( A4) , FLC( A5) ; }
template < class T0, class T1, class T2, class T3, class T4, class T5, class T6> inline void FLC( T0 & A0, T1 & A1, T2 & A2, T3 & A3, T4 & A4, T5 & A5, T6 & A6) { FLC( A0) , FLC( A1) , FLC( A2) , FLC( A3) , FLC( A4) , FLC( A5) , FLC( A6) ; }
template < class T> inline void SRT( T & A) { sort( ALL( A) ) ; }
template < class T, class C> inline void SRT( T & A, C B) { sort( ALL( A) , B) ; }
/** Add - On **/
const int MOD = 1000000007 ;
const int INF = 1000000000 ;
const DB EPS = 1e-2 ;
const DB OO = 1e15 ;
const DB PI = 3.14159265358979323846264 ; //M_PI;
// <<= ` 0. Daily Use .,
template < class T> inline void checkMin( T & a,const T b) { if ( b< a) a= b; }
template < class T> inline void checkMax( T & a,const T b) { if ( b> a) a= b; }
template < class T, class C> inline void checkMin( T& a, const T b, C c) { if ( c( b,a) ) a = b; }
template < class T, class C> inline void checkMax( T& a, const T b, C c) { if ( c( a,b) ) a = b; }
template < class T> inline T min( T a, T b, T c) { return min( min( a, b) , c) ; }
template < class T> inline T max( T a, T b, T c) { return max( max( a, b) , c) ; }
template < class T> inline T min( T a, T b, T c, T d) { return min( min( a, b) , min( c, d) ) ; }
template < class T> inline T max( T a, T b, T c, T d) { return max( min( a, b) , max( c, d) ) ; }
template < class T> inline T sqr( T a) { return a* a; }
template < class T> inline T cub( T a) { return a* a* a; }
int Ceil( int x, int y) { return ( x - 1 ) / y + 1 ; }
// <<= ` 1. Bitwise Operation .,
inline bool _1( int x, int i) { return x & 1 << i; }
inline bool _1( LL x, int i) { return x & 1LL<< i; }
inline LL _1( int i) { return 1LL<< i; }
//inline int _1(int i){return 1<<i;}
inline LL _U( int i) { return _1( i) - 1 ; } ;
//inline int _U(int i){return _1(i) - 1;};
template < class T> inline T low_bit( T x) {
return x & - x;
}
template < class T> inline T high_bit( T x) {
T p = low_bit( x) ;
while ( p ! = x) x - = p, p = low_bit( x) ;
return p;
}
inline int count_bits( int x) {
x = ( x & 0x55555555 ) + ( ( x & 0xaaaaaaaa ) >> 1 ) ;
x = ( x & 0x33333333 ) + ( ( x & 0xcccccccc ) >> 2 ) ;
x = ( x & 0x0f0f0f0f ) + ( ( x & 0xf0f0f0f0 ) >> 4 ) ;
x = ( x & 0x00ff00ff ) + ( ( x & 0xff00ff00 ) >> 8 ) ;
x = ( x & 0x0000ffff ) + ( ( x & 0xffff0000 ) >> 16 ) ;
return x;
}
inline int count_bits( LL x) {
x = ( x & 0x5555555555555555LL) + ( ( x & 0xaaaaaaaaaaaaaaaaLL) >> 1 ) ;
x = ( x & 0x3333333333333333LL) + ( ( x & 0xccccccccccccccccLL) >> 2 ) ;
x = ( x & 0x0f0f0f0f0f0f0f0fLL) + ( ( x & 0xf0f0f0f0f0f0f0f0LL) >> 4 ) ;
x = ( x & 0x00ff00ff00ff00ffLL) + ( ( x & 0xff00ff00ff00ff00LL) >> 8 ) ;
x = ( x & 0x0000ffff0000ffffLL) + ( ( x & 0xffff0000ffff0000LL) >> 16 ) ;
x = ( x & 0x00000000ffffffffLL) + ( ( x & 0xffffffff00000000LL) >> 32 ) ;
return x;
}
int reverse_bits( int x) {
x = ( ( x >> 1 ) & 0x55555555 ) | ( ( x << 1 ) & 0xaaaaaaaa ) ;
x = ( ( x >> 2 ) & 0x33333333 ) | ( ( x << 2 ) & 0xcccccccc ) ;
x = ( ( x >> 4 ) & 0x0f0f0f0f ) | ( ( x << 4 ) & 0xf0f0f0f0 ) ;
x = ( ( x >> 8 ) & 0x00ff00ff ) | ( ( x << 8 ) & 0xff00ff00 ) ;
x = ( ( x >> 16 ) & 0x0000ffff ) | ( ( x << 16 ) & 0xffff0000 ) ;
return x;
}
LL reverse_bits( LL x) {
x = ( ( x >> 1 ) & 0x5555555555555555LL) | ( ( x << 1 ) & 0xaaaaaaaaaaaaaaaaLL) ;
x = ( ( x >> 2 ) & 0x3333333333333333LL) | ( ( x << 2 ) & 0xccccccccccccccccLL) ;
x = ( ( x >> 4 ) & 0x0f0f0f0f0f0f0f0fLL) | ( ( x << 4 ) & 0xf0f0f0f0f0f0f0f0LL) ;
x = ( ( x >> 8 ) & 0x00ff00ff00ff00ffLL) | ( ( x << 8 ) & 0xff00ff00ff00ff00LL) ;
x = ( ( x >> 16 ) & 0x0000ffff0000ffffLL) | ( ( x << 16 ) & 0xffff0000ffff0000LL) ;
x = ( ( x >> 32 ) & 0x00000000ffffffffLL) | ( ( x << 32 ) & 0xffffffff00000000LL) ;
return x;
}
// <<= ` 2. Modular Arithmetic Basic .,
inline void INC( int & a, int b) { a + = b; if ( a >= MOD) a - = MOD; }
inline int sum( int a, int b) { a + = b; if ( a >= MOD) a - = MOD; return a; }
inline void DEC( int & a, int b) { a - = b; if ( a < 0 ) a + = MOD; }
inline int dff( int a, int b) { a - = b; if ( a < 0 ) a + = MOD; return a; }
inline void MUL( int & a, int b) { a = ( LL) a * b % MOD; }
inline int pdt( int a, int b) { return ( LL) a * b % MOD; }
inline int pow ( int a, int b) {
int c = 1 ;
while ( b) {
if ( b& 1 ) MUL( c, a) ;
MUL( a, a) , b >>= 1 ;
}
return c;
}
template < class T>
inline int pow ( T a, int b) {
T c( 1 ) ;
while ( b) {
if ( b& 1 ) MUL( c, a) ;
MUL( a, a) , b >>= 1 ;
}
return c;
}
inline int _I( int b) {
int a = MOD, x1 = 0 , x2 = 1 , q;
while ( true ) {
q = a / b, a % = b;
if ( ! a) return ( x2 + MOD) % MOD;
DEC( x1, pdt( q, x2) ) ;
q = b / a, b % = a;
if ( ! b) return ( x1 + MOD) % MOD;
DEC( x2, pdt( q, x1) ) ;
}
}
inline void DIV( int & a, int b) { MUL( a, _I( b) ) ; }
inline int qtt( int a, int b) { return pdt( a, _I( b) ) ; }
inline int sum( int a, int b, int MOD) {
a + = b; if ( a >= MOD) a - = MOD;
return a;
}
inline int phi( int n) {
int res = n;
for ( int i= 2 ; sqr( i) <= n; ++ i) if ( ! ( n% i) ) {
DEC( res, qtt( res, i) ) ;
do { n / = i; } while ( ! ( n% i) ) ;
}
if ( n ! = 1 )
DEC( res, qtt( res, n) ) ;
return res;
}
// <<= '9. Comutational Geometry .,
struct Po; struct Line; struct Seg;
inline int sgn( DB x) { return x < - EPS ? - 1 : x > EPS; }
inline int sgn( DB x, DB y) { return sgn( x - y) ; }
struct Po{
DB x, y;
Po( DB _x = 0 , DB _y = 0 ) : x( _x) , y( _y) { }
friend istream& operator >> ( istream& in, Po & p) { return in >> p.x >> p.y ; }
friend ostream& operator << ( ostream& out, Po p) { return out << "(" << p.x << ", " << p.y << ")" ; }
friend bool operator == ( Po, Po) ;
friend bool operator ! = ( Po, Po) ;
friend Po operator + ( Po, Po) ;
friend Po operator - ( Po, Po) ;
friend Po operator * ( Po, DB) ;
friend Po operator / ( Po, DB) ;
bool operator < ( const Po & rhs) const { return sgn( x, rhs.x ) < 0 || sgn( x, rhs.x ) == 0 && sgn( y, rhs.y ) < 0 ; }
Po operator- ( ) const { return Po( - x, - y) ; }
Po& operator + = ( Po rhs) { x + = rhs.x , y + = rhs.y ; return * this ; }
Po& operator - = ( Po rhs) { x - = rhs.x , y - = rhs.y ; return * this ; }
Po& operator * = ( DB k) { x * = k, y * = k; return * this ; }
Po& operator / = ( DB k) { x / = k, y / = k; return * this ; }
DB length_sqr( ) { return sqr( x) + sqr( y) ; }
DB length( ) { return sqrt ( length_sqr( ) ) ; }
DB atan ( ) {
return atan2 ( y, x) ;
}
void input( ) {
scanf ( "%lf %lf" , & x, & y) ;
}
} ;
bool operator == ( Po a, Po b) { return sgn( a.x - b.x ) == 0 && sgn( a.y - b.y ) == 0 ; }
bool operator ! = ( Po a, Po b) { return sgn( a.x - b.x ) ! = 0 || sgn( a.y - b.y ) ! = 0 ; }
Po operator + ( Po a, Po b) { return Po( a.x + b.x , a.y + b.y ) ; }
Po operator - ( Po a, Po b) { return Po( a.x - b.x , a.y - b.y ) ; }
Po operator * ( Po a, DB k) { return Po( a.x * k, a.y * k) ; }
Po operator * ( DB k, Po a) { return a * k; }
Po operator / ( Po a, DB k) { return Po( a.x / k, a.y / k) ; }
struct Line{
Po a, b;
Line( Po _a = Po( ) , Po _b = Po( ) ) : a( _a) , b( _b) { }
Line( DB x0, DB y0, DB x1, DB y1) : a( Po( x0, y0) ) , b( Po( x1, y1) ) { }
Line( Seg) ;
friend ostream& operator << ( ostream& out, Line p) { return out << p.a << "-" << p.b ; }
} ;
struct Seg{
Po a, b;
Seg( Po _a = Po( ) , Po _b = Po( ) ) : a( _a) , b( _b) { }
Seg( DB x0, DB y0, DB x1, DB y1) : a( Po( x0, y0) ) , b( Po( x1, y1) ) { }
Seg( Line l) ;
friend ostream& operator << ( ostream& out, Seg p) { return out << p.a << "-" << p.b ; }
DB length( ) { return ( b - a) .length ( ) ; }
} ;
Line:: Line ( Seg l) : a( l.a ) , b( l.b ) { }
Seg:: Seg ( Line l) : a( l.a ) , b( l.b ) { }
#define innerProduct dot
#define scalarProduct dot
#define dotProduct dot
#define outerProduct det
#define crossProduct det
inline DB dot( DB x1, DB y1, DB x2, DB y2) { return x1 * x2 + y1 * y2; }
inline DB dot( Po a, Po b) { return dot( a.x , a.y , b.x , b.y ) ; }
inline DB dot( Po p0, Po p1, Po p2) { return dot( p1 - p0, p2 - p0) ; }
inline DB dot( Line l1, Line l2) { return dot( l1.b - l1.a , l2.b - l2.a ) ; }
inline DB det( DB x1, DB y1, DB x2, DB y2) { return x1 * y2 - x2 * y1; }
inline DB det( Po a, Po b) { return det( a.x , a.y , b.x , b.y ) ; }
inline DB det( Po p0, Po p1, Po p2) { return det( p1 - p0, p2 - p0) ; }
inline DB det( Line l1, Line l2) { return det( l1.b - l1.a , l2.b - l2.a ) ; }
template < class T1, class T2> inline DB dist( T1 x, T2 y) { return sqrt ( dist_sqr( x, y) ) ; }
inline DB dist_sqr( Po a, Po b) { return sqr( a.x - b.x ) + sqr( a.y - b.y ) ; }
inline DB dist_sqr( Po p, Line l) { Po v0 = l.b - l.a , v1 = p - l.a ; return sqr( fabs ( det( v0, v1) ) ) / v0.length_sqr ( ) ; }
inline DB dist_sqr( Po p, Seg l) {
Po v0 = l.b - l.a , v1 = p - l.a , v2 = p - l.b ;
if ( sgn( dot( v0, v1) ) * sgn( dot( v0, v2) ) <= 0 ) return dist_sqr( p, Line( l) ) ;
else return min( v1.length_sqr ( ) , v2.length_sqr ( ) ) ;
}
inline DB dist_sqr( Line l, Po p) { return dist_sqr( p, l) ; }
inline DB dist_sqr( Seg l, Po p) { return dist_sqr( p, l) ; }
inline DB dist_sqr( Line l1, Line l2) {
if ( sgn( det( l1, l2) ) ! = 0 ) return 0 ;
return dist_sqr( l1.a , l2) ;
}
inline DB dist_sqr( Line l1, Seg l2) {
Po v0 = l1.b - l1.a , v1 = l2.a - l1.a , v2 = l2.b - l1.a ; DB c1 = det( v0, v1) , c2 = det( v0, v2) ;
return sgn( c1) ! = sgn( c2) ? 0 : sqr( min( fabs ( c1) , fabs ( c2) ) ) / v0.length_sqr ( ) ;
}
bool isIntersect( Seg l1, Seg l2) {
//if (l1.a == l2.a || l1.a == l2.b || l1.b == l2.a || l1.b == l2.b) return true;
return
min( l1.a .x , l1.b .x ) <= max( l2.a .x , l2.b .x ) &&
min( l2.a .x , l2.b .x ) <= max( l1.a .x , l1.b .x ) &&
min( l1.a .y , l1.b .y ) <= max( l2.a .y , l2.b .y ) &&
min( l2.a .y , l2.b .y ) <= max( l1.a .y , l1.b .y ) &&
sgn( det( l1.a , l2.a , l2.b ) ) * sgn( det( l1.b , l2.a , l2.b ) ) <= 0 &&
sgn( det( l2.a , l1.a , l1.b ) ) * sgn( det( l2.b , l1.a , l1.b ) ) <= 0 ;
}
inline DB dist_sqr( Seg l1, Seg l2) {
if ( isIntersect( l1, l2) ) return 0 ;
else return min( dist_sqr( l1.a , l2) , dist_sqr( l1.b , l2) , dist_sqr( l2.a , l1) , dist_sqr( l2.b , l1) ) ;
}
inline bool isOnExtremePoint( const Po & p, const Seg & l) {
return p == l.a || p == l.b ;
}
inline bool isOnseg( const Po & p, const Seg & l) {
//if (p == l.a || p == l.b) return false;
return sgn( det( p, l.a , l.b ) ) == 0 &&
sgn( l.a .x , p.x ) * sgn( l.b .x , p.x ) <= 0 && sgn( l.a .y , p.y ) * sgn( l.b .y , p.y ) <= 0 ;
}
inline Po intersect( const Line & l1, const Line & l2) {
return l1.a + ( l1.b - l1.a ) * ( det( l2.a , l1.a , l2.b ) / det( l2, l1) ) ;
}
// perpendicular foot
inline Po intersect( const Po & p, const Line & l) {
return intersect( Line( p, p + Po( l.a .y - l.b .y , l.b .x - l.a .x ) ) , l) ;
}
inline Po rotate( Po p, DB alpha, Po o = Po( ) ) {
p.x - = o.x , p.y - = o .y ;
return Po( p.x * cos ( alpha) - p.y * sin ( alpha) , p.y * cos ( alpha) + p.x * sin ( alpha) ) + o;
}
// <<= ' A. Random Event ..
inline int rand32( ) { return ( bool ( rand ( ) & 1 ) << 30 ) | ( rand ( ) << 15 ) + rand ( ) ; }
inline int random32( int l, int r) { return rand32( ) % ( r - l + 1 ) + l; }
inline int random( int l, int r) { return rand ( ) % ( r - l + 1 ) + l; }
int dice( ) { return rand ( ) % 6 ; }
bool coin( ) { return rand ( ) % 2 ; }
// <<= ' 0. I/O Accelerator interface .,
template < class T> inline void RD( T & x) {
//cin >> x;
scanf ( "%d" , & x) ;
//char c; for (c = getchar(); c < '0'; c = getchar()); x = c - '0'; for (c = getchar(); c >= '0'; c = getchar()) x = x * 10 + c - '0';
//char c; c = getchar(); x = c - '0'; for (c = getchar(); c >= '0'; c = getchar()) x = x * 10 + c - '0';
}
template < class T> inline void OT( const T & x) {
printf ( "%d\n " , x) ;
}
/* .................................................................................................................................. */
const int N = 10009 , NN = 1000009 ;
int l[ NN] , r[ NN] , p[ NN] , ky[ NN] = { INF} , sz[ NN] , total;
int A[ N] , n, m;
#define lx l[x]
#define rx r[x]
struct Splay{
int root;
//private:
inline void set( int l[ ] , int y, int x) {
l[ y] = x, p[ x] = y;
}
inline void update( int x) {
if ( ! x) return ;
sz[ x] = sz[ lx] + sz[ rx] + 1 ;
}
inline void rotate( int x) {
int y = p[ x] , z = p[ y] ; set( y == l[ z] ? l : r, z, x) ; if ( x == l[ y] ) {
set( l, y, rx) , set( r, x, y) ;
}
else {
set( r, y, lx) , set( l, x, y) ;
}
update( y) , update( x) ;
}
inline void splay( int x) {
while ( p[ x] ) rotate( x) ;
root = x;
}
inline void insert( int & x, int y, const int & v) {
if ( ! x) {
x = ++ total, ky[ x] = v, sz[ x] = 1 , p[ x] = y;
Splay( x) ;
}
else {
++ sz[ x] ;
insert( v < ky[ x] ? lx : rx, x, v) ;
}
}
void inorder( int x) {
if ( ! x) return ;
inorder( lx) , printf ( "%d " , ky[ x] ) , inorder( rx) ;
}
// public:
// >= v, leftmost
inline int Search( int v) {
int x = root, res = 0 ;
while ( x) {
if ( v > ky[ x] ) x = rx;
else res = x, x = lx;
}
splay( res) ;
return res;
}
inline int Select( int k) {
int x = root; while ( sz[ lx] ! = k) {
if ( k > sz[ lx] ) k - = sz[ lx] + 1 , x = rx;
else x = lx;
}
splay( x) ;
return x;
}
inline int Rank( int v) {
Search( v) ; return sz[ l[ root] ] - 1 ;
}
inline void Insert( int v) {
insert( root, 0 , v) ;
}
inline void Delete( int & x) {
int k = Rank( x) + 1 , y = Select( k- 1 ) , z = Select( k+ 1 ) ;
-- sz[ z] , -- sz[ y] ; r[ y] = 0 ;
}
void Inorder( ) {
inorder( root) ; puts ( "" ) ;
}
inline void Init( int l, int r) {
root = 0 , Insert( - INF) , Insert( INF) ;
FOR_1( i, l, r) Insert( A[ i] ) ;
}
} T[ N] ;
int x, y, z, k, a, b, _x;
void Build( ) {
REP_1( i, n) T[ i] .Init ( i - low_bit( i) + 1 , i) ;
}
void Modify( int x) {
while ( x <= n) {
T[ x] .Delete ( z) , T[ x] .Insert ( y) ;
x + = low_bit( x) ;
}
}
int Sum( int x) {
int res = 0 ; while ( x) {
res + = T[ x] .Rank ( _x) ;
x ^ = low_bit( x) ;
}
return res;
}
int f( ) {
return Sum( b) - Sum( a- 1 ) ;
}
#undef m
int main( ) {
#ifndef ONLINE_JUDGE
freopen ( "in.txt" , "r" , stdin ) ;
//freopen("out.txt", "w", stdout);
#endif
//Rush{
RD( n, m) ; REP_1( i, n) RD( A[ i] ) ;
Build( ) ;
char cmd; DO( m) {
RC( cmd) ; if ( cmd == 'Q' ) {
RD( a, b, k) ; -- k; int l = 0 , r = INF;
while ( l < r) {
_x = ( l + r + 1 ) >> 1 ;
if ( f( ) > k) r = _x - 1 ;
else l = _x;
}
OT( l) ;
}
else {
RD( x, y) ; z = A[ x] , A[ x] = y;
Modify( x) ;
}
}
//}
}
I2RlZmluZSBMT0NBTAoKLyoqIGAgTWljcm8gTWV6em8gTWFjcm8gRmxhdGlvbiAtLSBPdmVyaGVhdGVkIEVjb25vbXkgLiwgKiovCgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjc3RkaW8+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxiaXRzZXQ+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPHN0YWNrPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxjdGltZT4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxtYXA+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBSRVAoaSwgbikgZm9yIChpbnQgaT0wO2k8aW50KG4pOysraSkKI2RlZmluZSBGT1IoaSwgYSwgYikgZm9yIChpbnQgaT1pbnQoYSk7aTxpbnQoYik7KytpKQojZGVmaW5lIERXTihpLCBiLCBhKSBmb3IgKGludCBpPWludChiLTEpO2k+PWludChhKTstLWkpCiNkZWZpbmUgUkVQXzEoaSwgbikgZm9yIChpbnQgaT0xO2k8PWludChuKTsrK2kpCiNkZWZpbmUgRk9SXzEoaSwgYSwgYikgZm9yIChpbnQgaT1pbnQoYSk7aTw9aW50KGIpOysraSkKI2RlZmluZSBEV05fMShpLCBiLCBhKSBmb3IgKGludCBpPWludChiKTtpPj1pbnQoYSk7LS1pKQojZGVmaW5lIFJFUF9DKGksIG4pIGZvciAoaW50IG5fX19fPWludChuKSxpPTA7aTxuX19fXzsrK2kpCiNkZWZpbmUgRk9SX0MoaSwgYSwgYikgZm9yIChpbnQgYl9fX189aW50KGIpLGk9YTtpPGJfX19fOysraSkKI2RlZmluZSBEV05fQyhpLCBiLCBhKSBmb3IgKGludCBhX19fXz1pbnQoYSksaT1iLTE7aT49YV9fX187LS1pKQojZGVmaW5lIFJFUF9OKGksIG4pIGZvciAoaT0wO2k8aW50KG4pOysraSkKI2RlZmluZSBGT1JfTihpLCBhLCBiKSBmb3IgKGk9aW50KGEpO2k8aW50KGIpOysraSkKI2RlZmluZSBEV05fTihpLCBiLCBhKSBmb3IgKGk9aW50KGItMSk7aT49aW50KGEpOy0taSkKI2RlZmluZSBSRVBfMV9DKGksIG4pIGZvciAoaW50IG5fX19fPWludChuKSxpPTE7aTw9bl9fX187KytpKQojZGVmaW5lIEZPUl8xX0MoaSwgYSwgYikgZm9yIChpbnQgYl9fX189aW50KGIpLGk9YTtpPD1iX19fXzsrK2kpCiNkZWZpbmUgRFdOXzFfQyhpLCBiLCBhKSBmb3IgKGludCBhX19fXz1pbnQoYSksaT1iO2k+PWFfX19fOy0taSkKI2RlZmluZSBSRVBfMV9OKGksIG4pIGZvciAoaT0xO2k8PWludChuKTsrK2kpCiNkZWZpbmUgRk9SXzFfTihpLCBhLCBiKSBmb3IgKGk9aW50KGEpO2k8PWludChiKTsrK2kpCiNkZWZpbmUgRFdOXzFfTihpLCBiLCBhKSBmb3IgKGk9aW50KGIpO2k+PWludChhKTstLWkpCiNkZWZpbmUgUkVQX0NfTihpLCBuKSBmb3IgKG5fX19fPWludChuKSxpPTA7aTxuX19fXzsrK2kpCiNkZWZpbmUgRk9SX0NfTihpLCBhLCBiKSBmb3IgKGJfX19fPWludChiKSxpPWE7aTxiX19fXzsrK2kpCiNkZWZpbmUgRFdOX0NfTihpLCBiLCBhKSBmb3IgKGFfX19fPWludChhKSxpPWItMTtpPj1hX19fXzstLWkpCiNkZWZpbmUgUkVQXzFfQ19OKGksIG4pIGZvciAobl9fX189aW50KG4pLGk9MTtpPD1uX19fXzsrK2kpCiNkZWZpbmUgRk9SXzFfQ19OKGksIGEsIGIpIGZvciAoYl9fX189aW50KGIpLGk9YTtpPD1iX19fXzsrK2kpCiNkZWZpbmUgRFdOXzFfQ19OKGksIGIsIGEpIGZvciAoYV9fX189aW50KGEpLGk9YjtpPj1hX19fXzstLWkpCgojZGVmaW5lIEVDSChpdCwgQSkgZm9yICh0eXBlb2YoQS5iZWdpbigpKSBpdD1BLmJlZ2luKCk7IGl0ICE9IEEuZW5kKCk7ICsraXQpCiNkZWZpbmUgRE8obikgd2hpbGUobi0tKQojZGVmaW5lIERPX0MobikgaW50IG5fX19fID0gbjsgd2hpbGUobl9fX18tLSkKI2RlZmluZSBUTyhpLCBhLCBiKSBpbnQgc189YTxiPzE6LTEsYl89YitzXztmb3IoaW50IGk9YTtpIT1iXztpKz1zXykKI2RlZmluZSBUT18xKGksIGEsIGIpIGludCBzXz1hPGI/MTotMSxiXz1iO2ZvcihpbnQgaT1hO2khPWJfO2krPXNfKQojZGVmaW5lIFNRWihpLCBqLCBhLCBiKSBmb3IgKGludCBpPWludChhKSxqPWludChiKS0xO2k8ajsrK2ksLS1qKQojZGVmaW5lIFNRWl8xKGksIGosIGEsIGIpIGZvciAoaW50IGk9aW50KGEpLGo9aW50KGIpO2k8PWo7KytpLC0taikKI2RlZmluZSBSRVBfMihpLCBqLCBuLCBtKSBSRVAoaSwgbikgUkVQKGosIG0pCiNkZWZpbmUgUkVQXzJfMShpLCBqLCBuLCBtKSBSRVBfMShpLCBuKSBSRVBfMShqLCBtKQoKI2RlZmluZSBBTEwoQSkgQS5iZWdpbigpLCBBLmVuZCgpCiNkZWZpbmUgTExBKEEpIEEucmJlZ2luKCksIEEucmVuZCgpCiNkZWZpbmUgQ1BZKEEsIEIpIG1lbWNweShBLCBCLCBzaXplb2YoQSkpCiNkZWZpbmUgSU5TKEEsIFAsIEIpIEEuaW5zZXJ0KEEuYmVnaW4oKSArIFAsIEIpCiNkZWZpbmUgRVJTKEEsIFApIEEuZXJhc2UoQS5iZWdpbigpICsgUCkKI2RlZmluZSBCU0MoQSwgWCkgZmluZChBTEwoQSksIFgpIC8vICE9IEEuZW5kKCkKI2RlZmluZSBDVE4oVCwgeCkgKFQuZmluZCh4KSAhPSBULmVuZCgpKQojZGVmaW5lIFNaKEEpIGludChBLnNpemUoKSkKI2RlZmluZSBQQiBwdXNoX2JhY2sKI2RlZmluZSBNUChBLCBCKSBtYWtlX3BhaXIoQSwgQikKCiNkZWZpbmUgUnVzaCBpbnQgVF9fX187IFJEKFRfX19fKTsgRE8oVF9fX18pCiNwcmFnbWEgY29tbWVudChsaW5rZXIsICIvU1RBQ0s6MzY3NzcyMTYiKQovLyNwcmFnbWEgR0NDIG9wdGltaXplICgiTzIiKQojZGVmaW5lIFJ1Ynkgc3lzdGVtKCJydWJ5IG1haW4ucmIiKQojZGVmaW5lIEhhc2tlbGwgc3lzdGVtKCJydW5naGMgbWFpbi5ocyIpCiNkZWZpbmUgUGFzY2FsIHN5c3RlbSgiZnBjIG1haW4ucGFzIikKCnR5cGVkZWYgbG9uZyBsb25nIExMOwp0eXBlZGVmIGRvdWJsZSBEQjsKdHlwZWRlZiB1bnNpZ25lZCBVSU5UOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVTEw7Cgp0eXBlZGVmIHZlY3RvcjxpbnQ+IFZJOwp0eXBlZGVmIHZlY3RvcjxjaGFyPiBWQzsKdHlwZWRlZiB2ZWN0b3I8c3RyaW5nPiBWUzsKdHlwZWRlZiB2ZWN0b3I8TEw+IFZMOwp0eXBlZGVmIHZlY3RvcjxEQj4gVkQ7CnR5cGVkZWYgc2V0PGludD4gU0k7CnR5cGVkZWYgc2V0PHN0cmluZz4gU1M7CnR5cGVkZWYgc2V0PExMPiBTTDsKdHlwZWRlZiBzZXQ8REI+IFNEOwp0eXBlZGVmIG1hcDxpbnQsIGludD4gTUlJOwp0eXBlZGVmIG1hcDxzdHJpbmcsIGludD4gTVNJOwp0eXBlZGVmIG1hcDxMTCwgaW50PiBNTEk7CnR5cGVkZWYgbWFwPERCLCBpbnQ+IE1ESTsKdHlwZWRlZiBtYXA8aW50LCBib29sPiBNSUI7CnR5cGVkZWYgbWFwPHN0cmluZywgYm9vbD4gTVNCOwp0eXBlZGVmIG1hcDxMTCwgYm9vbD4gTUxCOwp0eXBlZGVmIG1hcDxEQiwgYm9vbD4gTURCOwp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IFBJSTsKdHlwZWRlZiBwYWlyPGludCwgYm9vbD4gUElCOwp0eXBlZGVmIHZlY3RvcjxQSUk+IFZJSTsKdHlwZWRlZiB2ZWN0b3I8Vkk+IFZWSTsKdHlwZWRlZiB2ZWN0b3I8VklJPiBWVklJOwp0eXBlZGVmIHNldDxQSUk+IFNJSTsKdHlwZWRlZiBtYXA8UElJLCBpbnQ+IE1QSUlJOwp0eXBlZGVmIG1hcDxQSUksIGJvb2w+IE1QSUlCOwoKLyoqIEkvTyBBY2NlbGVyYXRvciAqKi8KCi8qIC4uLiA6IiBXZSBhcmUgSS9PIEFjY2VsZXJhdG9yIC4uLiBVc2UgdXMgYXQgeW91ciBvd24gcmlzayA7KSAuLi4gIiAuLiAqLwoKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgUkQoVCAmKTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgT1QoY29uc3QgVCAmKTsKCmlubGluZSBpbnQgUkQoKXsgaW50IHg7IFJEKHgpOyByZXR1cm4geDt9CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBUJiBfUkQoVCAmeCl7IFJEKHgpOyByZXR1cm4geDt9CmlubGluZSB2b2lkIFJDKGNoYXIgJmMpe3NjYW5mKCIgJWMiLCAmYyk7fQppbmxpbmUgdm9pZCBSUyhjaGFyICpzKXtzY2FuZigiJXMiLCBzKTt9Cgp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDE+IGlubGluZSB2b2lkIFJEKFQwICZ4MCwgVDEgJngxKXtSRCh4MCksIFJEKHgxKTt9CnRlbXBsYXRlPGNsYXNzIFQwLCBjbGFzcyBUMSwgY2xhc3MgVDI+IGlubGluZSB2b2lkIFJEKFQwICZ4MCwgVDEgJngxLCBUMiAmeDIpe1JEKHgwKSwgUkQoeDEpLCBSRCh4Mik7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMz4gaW5saW5lIHZvaWQgUkQoVDAgJngwLCBUMSAmeDEsIFQyICZ4MiwgVDMgJngzKXtSRCh4MCksIFJEKHgxKSwgUkQoeDIpLCBSRCh4Myk7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMywgY2xhc3MgVDQ+IGlubGluZSB2b2lkIFJEKFQwICZ4MCwgVDEgJngxLCBUMiAmeDIsIFQzICZ4MywgVDQgJng0KXtSRCh4MCksIFJEKHgxKSwgUkQoeDIpLCBSRCh4MyksIFJEKHg0KTt9CnRlbXBsYXRlPGNsYXNzIFQwLCBjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzLCBjbGFzcyBUNCwgY2xhc3MgVDU+IGlubGluZSB2b2lkIFJEKFQwICZ4MCwgVDEgJngxLCBUMiAmeDIsIFQzICZ4MywgVDQgJng0LCBUNSAmeDUpe1JEKHgwKSwgUkQoeDEpLCBSRCh4MiksIFJEKHgzKSwgUkQoeDQpLCBSRCh4NSk7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMywgY2xhc3MgVDQsIGNsYXNzIFQ1LCBjbGFzcyBUNj4gaW5saW5lIHZvaWQgUkQoVDAgJngwLCBUMSAmeDEsIFQyICZ4MiwgVDMgJngzLCBUNCAmeDQsIFQ1ICZ4NSwgVDYgJng2KXtSRCh4MCksIFJEKHgxKSwgUkQoeDIpLCBSRCh4MyksIFJEKHg0KSwgUkQoeDUpLCBSRCh4Nik7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDE+IGlubGluZSB2b2lkIE9UKFQwICZ4MCwgVDEgJngxKXtPVCh4MCksIE9UKHgxKTt9CnRlbXBsYXRlPGNsYXNzIFQwLCBjbGFzcyBUMSwgY2xhc3MgVDI+IGlubGluZSB2b2lkIE9UKFQwICZ4MCwgVDEgJngxLCBUMiAmeDIpe09UKHgwKSwgT1QoeDEpLCBPVCh4Mik7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMz4gaW5saW5lIHZvaWQgT1QoVDAgJngwLCBUMSAmeDEsIFQyICZ4MiwgVDMgJngzKXtPVCh4MCksIE9UKHgxKSwgT1QoeDIpLCBPVCh4Myk7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMywgY2xhc3MgVDQ+IGlubGluZSB2b2lkIE9UKFQwICZ4MCwgVDEgJngxLCBUMiAmeDIsIFQzICZ4MywgVDQgJng0KXtPVCh4MCksIE9UKHgxKSwgT1QoeDIpLCBPVCh4MyksIE9UKHg0KTt9CnRlbXBsYXRlPGNsYXNzIFQwLCBjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzLCBjbGFzcyBUNCwgY2xhc3MgVDU+IGlubGluZSB2b2lkIE9UKFQwICZ4MCwgVDEgJngxLCBUMiAmeDIsIFQzICZ4MywgVDQgJng0LCBUNSAmeDUpe09UKHgwKSwgT1QoeDEpLCBPVCh4MiksIE9UKHgzKSwgT1QoeDQpLCBPVCh4NSk7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMywgY2xhc3MgVDQsIGNsYXNzIFQ1LCBjbGFzcyBUNj4gaW5saW5lIHZvaWQgT1QoVDAgJngwLCBUMSAmeDEsIFQyICZ4MiwgVDMgJngzLCBUNCAmeDQsIFQ1ICZ4NSwgVDYgJng2KXtPVCh4MCksIE9UKHgxKSwgT1QoeDIpLCBPVCh4MyksIE9UKHg0KSwgT1QoeDUpLCBPVCh4Nik7fQoKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgUlNUKFQgJkEpe21lbXNldChBLCAwLCBzaXplb2YoQSkpO30KdGVtcGxhdGU8Y2xhc3MgVDAsIGNsYXNzIFQxPiBpbmxpbmUgdm9pZCBSU1QoVDAgJkEwLCBUMSAmQTEpe1JTVChBMCksIFJTVChBMSk7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDEsIGNsYXNzIFQyPiBpbmxpbmUgdm9pZCBSU1QoVDAgJkEwLCBUMSAmQTEsIFQyICZBMil7UlNUKEEwKSwgUlNUKEExKSwgUlNUKEEyKTt9CnRlbXBsYXRlPGNsYXNzIFQwLCBjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzPiBpbmxpbmUgdm9pZCBSU1QoVDAgJkEwLCBUMSAmQTEsIFQyICZBMiwgVDMgJkEzKXtSU1QoQTApLCBSU1QoQTEpLCBSU1QoQTIpLCBSU1QoQTMpO30KdGVtcGxhdGU8Y2xhc3MgVDAsIGNsYXNzIFQxLCBjbGFzcyBUMiwgY2xhc3MgVDMsIGNsYXNzIFQ0PiBpbmxpbmUgdm9pZCBSU1QoVDAgJkEwLCBUMSAmQTEsIFQyICZBMiwgVDMgJkEzLCBUNCAmQTQpe1JTVChBMCksIFJTVChBMSksIFJTVChBMiksIFJTVChBMyksIFJTVChBNCk7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMywgY2xhc3MgVDQsIGNsYXNzIFQ1PiBpbmxpbmUgdm9pZCBSU1QoVDAgJkEwLCBUMSAmQTEsIFQyICZBMiwgVDMgJkEzLCBUNCAmQTQsIFQ1ICZBNSl7UlNUKEEwKSwgUlNUKEExKSwgUlNUKEEyKSwgUlNUKEEzKSwgUlNUKEE0KSwgUlNUKEE1KTt9CnRlbXBsYXRlPGNsYXNzIFQwLCBjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzLCBjbGFzcyBUNCwgY2xhc3MgVDUsIGNsYXNzIFQ2PiBpbmxpbmUgdm9pZCBSU1QoVDAgJkEwLCBUMSAmQTEsIFQyICZBMiwgVDMgJkEzLCBUNCAmQTQsIFQ1ICZBNSwgVDYgJkE2KXtSU1QoQTApLCBSU1QoQTEpLCBSU1QoQTIpLCBSU1QoQTMpLCBSU1QoQTQpLCBSU1QoQTUpLCBSU1QoQTYpO30KCgp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCBDTFIocHJpb3JpdHlfcXVldWU8VCwgdmVjdG9yPFQ+LCBsZXNzPFQ+ID4gJlEpewogICAgd2hpbGUgKCFRLmVtcHR5KCkpIFEucG9wKCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIENMUihwcmlvcml0eV9xdWV1ZTxULCB2ZWN0b3I8VD4sIGdyZWF0ZXI8VD4gPiAmUSl7CiAgICB3aGlsZSAoIVEuZW1wdHkoKSkgUS5wb3AoKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgQ0xSKFQgJkEpe0EuY2xlYXIoKTt9CnRlbXBsYXRlPGNsYXNzIFQwLCBjbGFzcyBUMT4gaW5saW5lIHZvaWQgQ0xSKFQwICZBMCwgVDEgJkExKXtDTFIoQTApLCBDTFIoQTEpO30KdGVtcGxhdGU8Y2xhc3MgVDAsIGNsYXNzIFQxLCBjbGFzcyBUMj4gaW5saW5lIHZvaWQgQ0xSKFQwICZBMCwgVDEgJkExLCBUMiAmQTIpe0NMUihBMCksIENMUihBMSksIENMUihBMik7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMz4gaW5saW5lIHZvaWQgQ0xSKFQwICZBMCwgVDEgJkExLCBUMiAmQTIsIFQzICZBMyl7Q0xSKEEwKSwgQ0xSKEExKSwgQ0xSKEEyKSwgQ0xSKEEzKTt9CnRlbXBsYXRlPGNsYXNzIFQwLCBjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzLCBjbGFzcyBUND4gaW5saW5lIHZvaWQgQ0xSKFQwICZBMCwgVDEgJkExLCBUMiAmQTIsIFQzICZBMywgVDQgJkE0KXtDTFIoQTApLCBDTFIoQTEpLCBDTFIoQTIpLCBDTFIoQTMpLCBDTFIoQTQpO30KdGVtcGxhdGU8Y2xhc3MgVDAsIGNsYXNzIFQxLCBjbGFzcyBUMiwgY2xhc3MgVDMsIGNsYXNzIFQ0LCBjbGFzcyBUNT4gaW5saW5lIHZvaWQgQ0xSKFQwICZBMCwgVDEgJkExLCBUMiAmQTIsIFQzICZBMywgVDQgJkE0LCBUNSAmQTUpe0NMUihBMCksIENMUihBMSksIENMUihBMiksIENMUihBMyksIENMUihBNCksIENMUihBNSk7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMywgY2xhc3MgVDQsIGNsYXNzIFQ1LCBjbGFzcyBUNj4gaW5saW5lIHZvaWQgQ0xSKFQwICZBMCwgVDEgJkExLCBUMiAmQTIsIFQzICZBMywgVDQgJkE0LCBUNSAmQTUsIFQ2ICZBNil7Q0xSKEEwKSwgQ0xSKEExKSwgQ0xSKEEyKSwgQ0xSKEEzKSwgQ0xSKEE0KSwgQ0xSKEE1KSwgQ0xSKEE2KTt9CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIENMUihUICZBLCBpbnQgbil7UkVQKGksIG4pIENMUihBW2ldKTt9CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIEZMQyhUICZBLCBpbnQgeCl7bWVtc2V0KEEsIHgsIHNpemVvZihBKSk7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDE+IGlubGluZSB2b2lkIEZMQyhUMCAmQTAsIFQxICZBMSwgaW50IHgpe0ZMQyhBMCwgeCksIEZMQyhBMSwgeCk7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDEsIGNsYXNzIFQyPiBpbmxpbmUgdm9pZCBGTEMoVDAgJkEwLCBUMSAmQTEsIFQyICZBMil7RkxDKEEwKSwgRkxDKEExKSwgRkxDKEEyKTt9CnRlbXBsYXRlPGNsYXNzIFQwLCBjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzPiBpbmxpbmUgdm9pZCBGTEMoVDAgJkEwLCBUMSAmQTEsIFQyICZBMiwgVDMgJkEzKXtGTEMoQTApLCBGTEMoQTEpLCBGTEMoQTIpLCBGTEMoQTMpO30KdGVtcGxhdGU8Y2xhc3MgVDAsIGNsYXNzIFQxLCBjbGFzcyBUMiwgY2xhc3MgVDMsIGNsYXNzIFQ0PiBpbmxpbmUgdm9pZCBGTEMoVDAgJkEwLCBUMSAmQTEsIFQyICZBMiwgVDMgJkEzLCBUNCAmQTQpe0ZMQyhBMCksIEZMQyhBMSksIEZMQyhBMiksIEZMQyhBMyksIEZMQyhBNCk7fQp0ZW1wbGF0ZTxjbGFzcyBUMCwgY2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMywgY2xhc3MgVDQsIGNsYXNzIFQ1PiBpbmxpbmUgdm9pZCBGTEMoVDAgJkEwLCBUMSAmQTEsIFQyICZBMiwgVDMgJkEzLCBUNCAmQTQsIFQ1ICZBNSl7RkxDKEEwKSwgRkxDKEExKSwgRkxDKEEyKSwgRkxDKEEzKSwgRkxDKEE0KSwgRkxDKEE1KTt9CnRlbXBsYXRlPGNsYXNzIFQwLCBjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzLCBjbGFzcyBUNCwgY2xhc3MgVDUsIGNsYXNzIFQ2PiBpbmxpbmUgdm9pZCBGTEMoVDAgJkEwLCBUMSAmQTEsIFQyICZBMiwgVDMgJkEzLCBUNCAmQTQsIFQ1ICZBNSwgVDYgJkE2KXtGTEMoQTApLCBGTEMoQTEpLCBGTEMoQTIpLCBGTEMoQTMpLCBGTEMoQTQpLCBGTEMoQTUpLCBGTEMoQTYpO30KCnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIFNSVChUICZBKXtzb3J0KEFMTChBKSk7fQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBDPiBpbmxpbmUgdm9pZCBTUlQoVCAmQSwgQyBCKXtzb3J0KEFMTChBKSwgQik7fQoKLyoqIEFkZCAtIE9uICoqLwoKY29uc3QgaW50IE1PRCA9IDEwMDAwMDAwMDc7CmNvbnN0IGludCBJTkYgPSAxMDAwMDAwMDAwOwpjb25zdCBEQiBFUFMgPSAxZS0yOwpjb25zdCBEQiBPTyA9IDFlMTU7CmNvbnN0IERCIFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDsgLy9NX1BJOwoKLy8gPDw9IGAgMC4gRGFpbHkgVXNlIC4sCgp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCBjaGVja01pbihUICZhLGNvbnN0IFQgYil7aWYgKGI8YSkgYT1iO30KdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgY2hlY2tNYXgoVCAmYSxjb25zdCBUIGIpe2lmIChiPmEpIGE9Yjt9CnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDPiBpbmxpbmUgdm9pZCBjaGVja01pbihUJiBhLCBjb25zdCBUIGIsIEMgYyl7aWYgKGMoYixhKSkgYSA9IGI7fQp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQz4gaW5saW5lIHZvaWQgY2hlY2tNYXgoVCYgYSwgY29uc3QgVCBiLCBDIGMpe2lmIChjKGEsYikpIGEgPSBiO30KdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIFQgbWluKFQgYSwgVCBiLCBUIGMpe3JldHVybiBtaW4obWluKGEsIGIpLCBjKTt9CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBUIG1heChUIGEsIFQgYiwgVCBjKXtyZXR1cm4gbWF4KG1heChhLCBiKSwgYyk7fQp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgVCBtaW4oVCBhLCBUIGIsIFQgYywgVCBkKXtyZXR1cm4gbWluKG1pbihhLCBiKSwgbWluKGMsIGQpKTt9CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBUIG1heChUIGEsIFQgYiwgVCBjLCBUIGQpe3JldHVybiBtYXgobWluKGEsIGIpLCBtYXgoYywgZCkpO30KdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIFQgc3FyKFQgYSl7cmV0dXJuIGEqYTt9CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBUIGN1YihUIGEpe3JldHVybiBhKmEqYTt9CmludCBDZWlsKGludCB4LCBpbnQgeSl7cmV0dXJuICh4IC0gMSkgLyB5ICsgMTt9CgovLyA8PD0gYCAxLiBCaXR3aXNlIE9wZXJhdGlvbiAuLAppbmxpbmUgYm9vbCBfMShpbnQgeCwgaW50IGkpe3JldHVybiB4ICYgMTw8aTt9CmlubGluZSBib29sIF8xKExMIHgsIGludCBpKXtyZXR1cm4geCAmIDFMTDw8aTt9CmlubGluZSBMTCBfMShpbnQgaSl7cmV0dXJuIDFMTDw8aTt9Ci8vaW5saW5lIGludCBfMShpbnQgaSl7cmV0dXJuIDE8PGk7fQppbmxpbmUgTEwgX1UoaW50IGkpe3JldHVybiBfMShpKSAtIDE7fTsKLy9pbmxpbmUgaW50IF9VKGludCBpKXtyZXR1cm4gXzEoaSkgLSAxO307CgoKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIFQgbG93X2JpdChUIHgpIHsKICAgIHJldHVybiB4ICYgLXg7Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBUIGhpZ2hfYml0KFQgeCkgewogICAgVCBwID0gbG93X2JpdCh4KTsKICAgIHdoaWxlIChwICE9IHgpIHggLT0gcCwgcCA9IGxvd19iaXQoeCk7CiAgICByZXR1cm4gcDsKfQoKaW5saW5lIGludCBjb3VudF9iaXRzKGludCB4KXsKICAgIHggPSAoeCAmIDB4NTU1NTU1NTUpICsgKCh4ICYgMHhhYWFhYWFhYSkgPj4gMSk7CiAgICB4ID0gKHggJiAweDMzMzMzMzMzKSArICgoeCAmIDB4Y2NjY2NjY2MpID4+IDIpOwogICAgeCA9ICh4ICYgMHgwZjBmMGYwZikgKyAoKHggJiAweGYwZjBmMGYwKSA+PiA0KTsKICAgIHggPSAoeCAmIDB4MDBmZjAwZmYpICsgKCh4ICYgMHhmZjAwZmYwMCkgPj4gOCk7CiAgICB4ID0gKHggJiAweDAwMDBmZmZmKSArICgoeCAmIDB4ZmZmZjAwMDApID4+IDE2KTsKICAgIHJldHVybiB4Owp9CgppbmxpbmUgaW50IGNvdW50X2JpdHMoTEwgeCl7CiAgICB4ID0gKHggJiAweDU1NTU1NTU1NTU1NTU1NTVMTCkgKyAoKHggJiAweGFhYWFhYWFhYWFhYWFhYWFMTCkgPj4gMSk7CiAgICB4ID0gKHggJiAweDMzMzMzMzMzMzMzMzMzMzNMTCkgKyAoKHggJiAweGNjY2NjY2NjY2NjY2NjY2NMTCkgPj4gMik7CiAgICB4ID0gKHggJiAweDBmMGYwZjBmMGYwZjBmMGZMTCkgKyAoKHggJiAweGYwZjBmMGYwZjBmMGYwZjBMTCkgPj4gNCk7CiAgICB4ID0gKHggJiAweDAwZmYwMGZmMDBmZjAwZmZMTCkgKyAoKHggJiAweGZmMDBmZjAwZmYwMGZmMDBMTCkgPj4gOCk7CiAgICB4ID0gKHggJiAweDAwMDBmZmZmMDAwMGZmZmZMTCkgKyAoKHggJiAweGZmZmYwMDAwZmZmZjAwMDBMTCkgPj4gMTYpOwogICAgeCA9ICh4ICYgMHgwMDAwMDAwMGZmZmZmZmZmTEwpICsgKCh4ICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyKTsKICAgIHJldHVybiB4Owp9CgppbnQgcmV2ZXJzZV9iaXRzKGludCB4KXsKICAgIHggPSAoKHggPj4gMSkgJiAweDU1NTU1NTU1KSB8ICgoeCA8PCAxKSAmIDB4YWFhYWFhYWEpOwogICAgeCA9ICgoeCA+PiAyKSAmIDB4MzMzMzMzMzMpIHwgKCh4IDw8IDIpICYgMHhjY2NjY2NjYyk7CiAgICB4ID0gKCh4ID4+IDQpICYgMHgwZjBmMGYwZikgfCAoKHggPDwgNCkgJiAweGYwZjBmMGYwKTsKICAgIHggPSAoKHggPj4gOCkgJiAweDAwZmYwMGZmKSB8ICgoeCA8PCA4KSAmIDB4ZmYwMGZmMDApOwogICAgeCA9ICgoeCA+PjE2KSAmIDB4MDAwMGZmZmYpIHwgKCh4IDw8MTYpICYgMHhmZmZmMDAwMCk7CiAgICByZXR1cm4geDsKfQoKTEwgcmV2ZXJzZV9iaXRzKExMIHgpewogICAgeCA9ICgoeCA+PiAxKSAmIDB4NTU1NTU1NTU1NTU1NTU1NUxMKSB8ICgoeCA8PCAxKSAmIDB4YWFhYWFhYWFhYWFhYWFhYUxMKTsKICAgIHggPSAoKHggPj4gMikgJiAweDMzMzMzMzMzMzMzMzMzMzNMTCkgfCAoKHggPDwgMikgJiAweGNjY2NjY2NjY2NjY2NjY2NMTCk7CiAgICB4ID0gKCh4ID4+IDQpICYgMHgwZjBmMGYwZjBmMGYwZjBmTEwpIHwgKCh4IDw8IDQpICYgMHhmMGYwZjBmMGYwZjBmMGYwTEwpOwogICAgeCA9ICgoeCA+PiA4KSAmIDB4MDBmZjAwZmYwMGZmMDBmZkxMKSB8ICgoeCA8PCA4KSAmIDB4ZmYwMGZmMDBmZjAwZmYwMExMKTsKICAgIHggPSAoKHggPj4xNikgJiAweDAwMDBmZmZmMDAwMGZmZmZMTCkgfCAoKHggPDwxNikgJiAweGZmZmYwMDAwZmZmZjAwMDBMTCk7CiAgICB4ID0gKCh4ID4+MzIpICYgMHgwMDAwMDAwMGZmZmZmZmZmTEwpIHwgKCh4IDw8MzIpICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpOwogICAgcmV0dXJuIHg7Cn0KCi8vIDw8PSBgIDIuIE1vZHVsYXIgQXJpdGhtZXRpYyBCYXNpYyAuLAoKaW5saW5lIHZvaWQgSU5DKGludCAmYSwgaW50IGIpe2EgKz0gYjsgaWYgKGEgPj0gTU9EKSBhIC09IE1PRDt9CmlubGluZSBpbnQgc3VtKGludCBhLCBpbnQgYil7YSArPSBiOyBpZiAoYSA+PSBNT0QpIGEgLT0gTU9EOyByZXR1cm4gYTt9CmlubGluZSB2b2lkIERFQyhpbnQgJmEsIGludCBiKXthIC09IGI7IGlmIChhIDwgMCkgYSArPSBNT0Q7fQppbmxpbmUgaW50IGRmZihpbnQgYSwgaW50IGIpe2EgLT0gYjsgaWYgKGEgPCAwKSBhICArPSBNT0Q7IHJldHVybiBhO30KaW5saW5lIHZvaWQgTVVMKGludCAmYSwgaW50IGIpe2EgPSAoTEwpYSAqIGIgJSBNT0Q7fQppbmxpbmUgaW50IHBkdChpbnQgYSwgaW50IGIpe3JldHVybiAoTEwpYSAqIGIgJSBNT0Q7fQoKaW5saW5lIGludCBwb3coaW50IGEsIGludCBiKXsKICAgIGludCBjID0gMTsKICAgIHdoaWxlIChiKSB7CiAgICAgICAgaWYgKGImMSkgTVVMKGMsIGEpOwogICAgICAgIE1VTChhLCBhKSwgYiA+Pj0gMTsKICAgIH0KICAgIHJldHVybiBjOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBUPgppbmxpbmUgaW50IHBvdyhUIGEsIGludCBiKXsKICAgIFQgYygxKTsKICAgIHdoaWxlIChiKSB7CiAgICAgICAgaWYgKGImMSkgTVVMKGMsIGEpOwogICAgICAgIE1VTChhLCBhKSwgYiA+Pj0gMTsKICAgIH0KICAgIHJldHVybiBjOwp9CgppbmxpbmUgaW50IF9JKGludCBiKXsKICAgIGludCBhID0gTU9ELCB4MSA9IDAsIHgyID0gMSwgcTsKICAgIHdoaWxlICh0cnVlKXsKICAgICAgICBxID0gYSAvIGIsIGEgJT0gYjsKICAgICAgICBpZiAoIWEpIHJldHVybiAoeDIgKyBNT0QpICUgTU9EOwogICAgICAgIERFQyh4MSwgcGR0KHEsIHgyKSk7CgogICAgICAgIHEgPSBiIC8gYSwgYiAlPSBhOwogICAgICAgIGlmICghYikgcmV0dXJuICh4MSArIE1PRCkgJSBNT0Q7CiAgICAgICAgREVDKHgyLCBwZHQocSwgeDEpKTsKICAgIH0KfQoKaW5saW5lIHZvaWQgRElWKGludCAmYSwgaW50IGIpe01VTChhLCBfSShiKSk7fQppbmxpbmUgaW50IHF0dChpbnQgYSwgaW50IGIpe3JldHVybiBwZHQoYSwgX0koYikpO30KCmlubGluZSBpbnQgc3VtKGludCBhLCBpbnQgYiwgaW50IE1PRCl7CiAgICBhICs9IGI7IGlmIChhID49IE1PRCkgYSAtPSBNT0Q7CiAgICByZXR1cm4gYTsKfQoKaW5saW5lIGludCBwaGkoaW50IG4pewogICAgaW50IHJlcyA9IG47CiAgICBmb3IgKGludCBpPTI7c3FyKGkpPD1uOysraSkgaWYgKCEobiVpKSl7CiAgICAgICAgREVDKHJlcywgcXR0KHJlcywgaSkpOwogICAgICAgIGRve24gLz0gaTt9IHdoaWxlKCEobiVpKSk7CiAgICB9CiAgICBpZiAobiAhPSAxKQogICAgICAgIERFQyhyZXMsIHF0dChyZXMsIG4pKTsKICAgIHJldHVybiByZXM7Cn0KCi8vIDw8PSAnOS4gQ29tdXRhdGlvbmFsIEdlb21ldHJ5IC4sCgpzdHJ1Y3QgUG87IHN0cnVjdCBMaW5lOyBzdHJ1Y3QgU2VnOwoKaW5saW5lIGludCBzZ24oREIgeCl7cmV0dXJuIHggPCAtRVBTID8gLTEgOiB4ID4gRVBTO30KaW5saW5lIGludCBzZ24oREIgeCwgREIgeSl7cmV0dXJuIHNnbih4IC0geSk7fQoKc3RydWN0IFBvewogICAgREIgeCwgeTsKICAgIFBvKERCIF94ID0gMCwgREIgX3kgPSAwKTp4KF94KSwgeShfeSl7fQoKICAgIGZyaWVuZCBpc3RyZWFtJiBvcGVyYXRvciA+Pihpc3RyZWFtJiBpbiwgUG8gJnApe3JldHVybiBpbiA+PiBwLnggPj4gcC55O30KICAgIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvciA8PChvc3RyZWFtJiBvdXQsIFBvIHApe3JldHVybiBvdXQgPDwgIigiIDw8IHAueCA8PCAiLCAiIDw8IHAueSA8PCAiKSI7fQoKICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID09KFBvLCBQbyk7CiAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPShQbywgUG8pOwogICAgZnJpZW5kIFBvIG9wZXJhdG9yICsoUG8sIFBvKTsKICAgIGZyaWVuZCBQbyBvcGVyYXRvciAtKFBvLCBQbyk7CiAgICBmcmllbmQgUG8gb3BlcmF0b3IgKihQbywgREIpOwogICAgZnJpZW5kIFBvIG9wZXJhdG9yIC8oUG8sIERCKTsKCiAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IFBvICZyaHMpIGNvbnN0e3JldHVybiBzZ24oeCwgcmhzLngpIDwgMCB8fCBzZ24oeCwgcmhzLngpID09IDAgJiYgc2duKHksIHJocy55KSA8IDA7fQogICAgUG8gb3BlcmF0b3ItKCkgY29uc3R7cmV0dXJuIFBvKC14LCAteSk7fQogICAgUG8mIG9wZXJhdG9yICs9KFBvIHJocyl7eCArPSByaHMueCwgeSArPSByaHMueTsgcmV0dXJuICp0aGlzO30KICAgIFBvJiBvcGVyYXRvciAtPShQbyByaHMpe3ggLT0gcmhzLngsIHkgLT0gcmhzLnk7IHJldHVybiAqdGhpczt9CiAgICBQbyYgb3BlcmF0b3IgKj0oREIgayl7eCAqPSBrLCB5ICo9IGs7IHJldHVybiAqdGhpczt9CiAgICBQbyYgb3BlcmF0b3IgLz0oREIgayl7eCAvPSBrLCB5IC89IGs7IHJldHVybiAqdGhpczt9CgogICAgREIgbGVuZ3RoX3Nxcigpe3JldHVybiBzcXIoeCkgKyBzcXIoeSk7fQogICAgREIgbGVuZ3RoKCl7cmV0dXJuIHNxcnQobGVuZ3RoX3NxcigpKTt9CgogICAgREIgYXRhbigpewogICAgICAgIHJldHVybiBhdGFuMih5LCB4KTsKICAgIH0KCiAgICB2b2lkIGlucHV0KCl7CiAgICAgICAgc2NhbmYoIiVsZiAlbGYiLCAmeCwgJnkpOwogICAgfQp9OwoKYm9vbCBvcGVyYXRvciA9PShQbyBhLCBQbyBiKXtyZXR1cm4gc2duKGEueCAtIGIueCkgPT0gMCAmJiBzZ24oYS55IC0gYi55KSA9PSAwO30KYm9vbCBvcGVyYXRvciAhPShQbyBhLCBQbyBiKXtyZXR1cm4gc2duKGEueCAtIGIueCkgIT0gMCB8fCBzZ24oYS55IC0gYi55KSAhPSAwO30KUG8gb3BlcmF0b3IgKyhQbyBhLCBQbyBiKXtyZXR1cm4gUG8oYS54ICsgYi54LCBhLnkgKyBiLnkpO30KUG8gb3BlcmF0b3IgLShQbyBhLCBQbyBiKXtyZXR1cm4gUG8oYS54IC0gYi54LCBhLnkgLSBiLnkpO30KUG8gb3BlcmF0b3IgKihQbyBhLCBEQiBrKXtyZXR1cm4gUG8oYS54ICogaywgYS55ICogayk7fQpQbyBvcGVyYXRvciAqKERCIGssIFBvIGEpe3JldHVybiBhICogazt9ClBvIG9wZXJhdG9yIC8oUG8gYSwgREIgayl7cmV0dXJuIFBvKGEueCAvIGssIGEueSAvIGspO30KCnN0cnVjdCBMaW5lewogICAgUG8gYSwgYjsKICAgIExpbmUoUG8gX2EgPSBQbygpLCBQbyBfYiA9IFBvKCkpOmEoX2EpLCBiKF9iKXt9CiAgICBMaW5lKERCIHgwLCBEQiB5MCwgREIgeDEsIERCIHkxKTphKFBvKHgwLCB5MCkpLCBiKFBvKHgxLCB5MSkpe30KICAgIExpbmUoU2VnKTsKCiAgICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3IgPDwob3N0cmVhbSYgb3V0LCBMaW5lIHApe3JldHVybiBvdXQgPDwgcC5hIDw8ICItIiA8PCBwLmI7fQp9OwoKc3RydWN0IFNlZ3sKICAgIFBvIGEsIGI7CiAgICBTZWcoUG8gX2EgPSBQbygpLCBQbyBfYiA9IFBvKCkpOmEoX2EpLCBiKF9iKXt9CiAgICBTZWcoREIgeDAsIERCIHkwLCBEQiB4MSwgREIgeTEpOmEoUG8oeDAsIHkwKSksIGIoUG8oeDEsIHkxKSl7fQogICAgU2VnKExpbmUgbCk7CgogICAgZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yIDw8KG9zdHJlYW0mIG91dCwgU2VnIHApe3JldHVybiBvdXQgPDwgcC5hIDw8ICItIiA8PCBwLmI7fQogICAgREIgbGVuZ3RoKCl7cmV0dXJuIChiIC0gYSkubGVuZ3RoKCk7fQp9OwoKTGluZTo6TGluZShTZWcgbCk6YShsLmEpLCBiKGwuYil7fQpTZWc6OlNlZyhMaW5lIGwpOmEobC5hKSwgYihsLmIpe30KCiNkZWZpbmUgaW5uZXJQcm9kdWN0IGRvdAojZGVmaW5lIHNjYWxhclByb2R1Y3QgZG90CiNkZWZpbmUgZG90UHJvZHVjdCBkb3QKI2RlZmluZSBvdXRlclByb2R1Y3QgZGV0CiNkZWZpbmUgY3Jvc3NQcm9kdWN0IGRldAoKaW5saW5lIERCIGRvdChEQiB4MSwgREIgeTEsIERCIHgyLCBEQiB5Mil7cmV0dXJuIHgxICogeDIgKyB5MSAqIHkyO30KaW5saW5lIERCIGRvdChQbyBhLCBQbyBiKXtyZXR1cm4gZG90KGEueCwgYS55LCBiLngsIGIueSk7fQppbmxpbmUgREIgZG90KFBvIHAwLCBQbyBwMSwgUG8gcDIpe3JldHVybiBkb3QocDEgLSBwMCwgcDIgLSBwMCk7fQppbmxpbmUgREIgZG90KExpbmUgbDEsIExpbmUgbDIpe3JldHVybiBkb3QobDEuYiAtIGwxLmEsIGwyLmIgLSBsMi5hKTt9CmlubGluZSBEQiBkZXQoREIgeDEsIERCIHkxLCBEQiB4MiwgREIgeTIpe3JldHVybiB4MSAqIHkyIC0geDIgKiB5MTt9CmlubGluZSBEQiBkZXQoUG8gYSwgUG8gYil7cmV0dXJuIGRldChhLngsIGEueSwgYi54LCBiLnkpO30KaW5saW5lIERCIGRldChQbyBwMCwgUG8gcDEsIFBvIHAyKXtyZXR1cm4gZGV0KHAxIC0gcDAsIHAyIC0gcDApO30KaW5saW5lIERCIGRldChMaW5lIGwxLCBMaW5lIGwyKXtyZXR1cm4gZGV0KGwxLmIgLSBsMS5hLCBsMi5iIC0gbDIuYSk7fQoKdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyPiBpbmxpbmUgREIgZGlzdChUMSB4LCBUMiB5KXtyZXR1cm4gc3FydChkaXN0X3Nxcih4LCB5KSk7fQoKaW5saW5lIERCIGRpc3Rfc3FyKFBvIGEsIFBvIGIpe3JldHVybiBzcXIoYS54IC0gYi54KSArIHNxcihhLnkgLSBiLnkpO30KaW5saW5lIERCIGRpc3Rfc3FyKFBvIHAsIExpbmUgbCl7UG8gdjAgPSBsLmIgLSBsLmEsIHYxID0gcCAtIGwuYTsgcmV0dXJuIHNxcihmYWJzKGRldCh2MCwgdjEpKSkgLyB2MC5sZW5ndGhfc3FyKCk7fQppbmxpbmUgREIgZGlzdF9zcXIoUG8gcCwgU2VnIGwpewogICAgUG8gdjAgPSBsLmIgLSBsLmEsIHYxID0gcCAtIGwuYSwgdjIgPSBwIC0gbC5iOwogICAgaWYgKHNnbihkb3QodjAsIHYxKSkgKiBzZ24oZG90KHYwLCB2MikpIDw9IDApIHJldHVybiBkaXN0X3NxcihwLCBMaW5lKGwpKTsKICAgIGVsc2UgcmV0dXJuIG1pbih2MS5sZW5ndGhfc3FyKCksIHYyLmxlbmd0aF9zcXIoKSk7Cn0KCmlubGluZSBEQiBkaXN0X3NxcihMaW5lIGwsIFBvIHApe3JldHVybiBkaXN0X3NxcihwLCBsKTt9CmlubGluZSBEQiBkaXN0X3NxcihTZWcgbCwgUG8gcCl7cmV0dXJuIGRpc3Rfc3FyKHAsIGwpO30KCmlubGluZSBEQiBkaXN0X3NxcihMaW5lIGwxLCBMaW5lIGwyKXsKICAgIGlmIChzZ24oZGV0KGwxLCBsMikpICE9IDApIHJldHVybiAwOwogICAgcmV0dXJuIGRpc3Rfc3FyKGwxLmEsIGwyKTsKfQppbmxpbmUgREIgZGlzdF9zcXIoTGluZSBsMSwgU2VnIGwyKXsKICAgIFBvIHYwID0gbDEuYiAtIGwxLmEsIHYxID0gbDIuYSAtIGwxLmEsIHYyID0gbDIuYiAtIGwxLmE7IERCIGMxID0gZGV0KHYwLCB2MSksIGMyID0gZGV0KHYwLCB2Mik7CiAgICByZXR1cm4gc2duKGMxKSAhPSBzZ24oYzIpID8gMCA6IHNxcihtaW4oZmFicyhjMSksIGZhYnMoYzIpKSkgLyB2MC5sZW5ndGhfc3FyKCk7Cn0KCmJvb2wgaXNJbnRlcnNlY3QoU2VnIGwxLCBTZWcgbDIpewoKICAgIC8vaWYgKGwxLmEgPT0gbDIuYSB8fCBsMS5hID09IGwyLmIgfHwgbDEuYiA9PSBsMi5hIHx8IGwxLmIgPT0gbDIuYikgcmV0dXJuIHRydWU7CgogICAgcmV0dXJuCiAgICAgICAgbWluKGwxLmEueCwgbDEuYi54KSA8PSBtYXgobDIuYS54LCBsMi5iLngpICYmCiAgICAgICAgbWluKGwyLmEueCwgbDIuYi54KSA8PSBtYXgobDEuYS54LCBsMS5iLngpICYmCiAgICAgICAgbWluKGwxLmEueSwgbDEuYi55KSA8PSBtYXgobDIuYS55LCBsMi5iLnkpICYmCiAgICAgICAgbWluKGwyLmEueSwgbDIuYi55KSA8PSBtYXgobDEuYS55LCBsMS5iLnkpICYmCiAgICBzZ24oIGRldChsMS5hLCBsMi5hLCBsMi5iKSApICogc2duKCBkZXQobDEuYiwgbDIuYSwgbDIuYikgKSA8PSAwICYmCiAgICBzZ24oIGRldChsMi5hLCBsMS5hLCBsMS5iKSApICogc2duKCBkZXQobDIuYiwgbDEuYSwgbDEuYikgKSA8PSAwOwoKfQoKaW5saW5lIERCIGRpc3Rfc3FyKFNlZyBsMSwgU2VnIGwyKXsKICAgIGlmIChpc0ludGVyc2VjdChsMSwgbDIpKSByZXR1cm4gMDsKICAgIGVsc2UgcmV0dXJuIG1pbihkaXN0X3NxcihsMS5hLCBsMiksIGRpc3Rfc3FyKGwxLmIsIGwyKSwgZGlzdF9zcXIobDIuYSwgbDEpLCBkaXN0X3NxcihsMi5iLCBsMSkpOwp9CgppbmxpbmUgYm9vbCBpc09uRXh0cmVtZVBvaW50KGNvbnN0IFBvICZwLCBjb25zdCBTZWcgJmwpewogICAgcmV0dXJuIHAgPT0gbC5hIHx8IHAgPT0gbC5iOwp9CgppbmxpbmUgYm9vbCBpc09uc2VnKGNvbnN0IFBvICZwLCBjb25zdCBTZWcgJmwpewoKICAgIC8vaWYgKHAgPT0gbC5hIHx8IHAgPT0gbC5iKSByZXR1cm4gZmFsc2U7CgogICAgcmV0dXJuIHNnbihkZXQocCwgbC5hLCBsLmIpKSA9PSAwICYmCiAgICAgICAgc2duKGwuYS54LCBwLngpICogc2duKGwuYi54LCBwLngpIDw9IDAgJiYgc2duKGwuYS55LCBwLnkpICogc2duKGwuYi55LCBwLnkpIDw9IDA7Cn0KCmlubGluZSBQbyBpbnRlcnNlY3QoY29uc3QgTGluZSAmbDEsIGNvbnN0IExpbmUgJmwyKXsKICAgIHJldHVybiBsMS5hICsgKGwxLmIgLSBsMS5hKSAqIChkZXQobDIuYSwgbDEuYSwgbDIuYikgLyBkZXQobDIsIGwxKSk7Cn0KCi8vIHBlcnBlbmRpY3VsYXIgZm9vdAppbmxpbmUgUG8gaW50ZXJzZWN0KGNvbnN0IFBvICYgcCwgY29uc3QgTGluZSAmbCl7CiAgICByZXR1cm4gaW50ZXJzZWN0KExpbmUocCwgcCArIFBvKGwuYS55IC0gbC5iLnksIGwuYi54IC0gbC5hLngpKSwgbCk7Cn0KCmlubGluZSBQbyByb3RhdGUoUG8gcCwgREIgYWxwaGEsIFBvIG8gPSBQbygpKXsKICAgIHAueCAtPSBvLngsIHAueSAtPSBvIC55OwogICAgcmV0dXJuIFBvKHAueCAqIGNvcyhhbHBoYSkgLSBwLnkgKiBzaW4oYWxwaGEpLCBwLnkgKiBjb3MoYWxwaGEpICsgcC54ICogc2luKGFscGhhKSkgKyBvOwp9CgovLyA8PD0gJyBBLiBSYW5kb20gRXZlbnQgLi4KCmlubGluZSBpbnQgcmFuZDMyKCl7cmV0dXJuIChib29sKHJhbmQoKSAmIDEpIDw8IDMwKSB8IChyYW5kKCkgPDwgMTUpICsgcmFuZCgpO30KaW5saW5lIGludCByYW5kb20zMihpbnQgbCwgaW50IHIpe3JldHVybiByYW5kMzIoKSAlIChyIC0gbCArIDEpICsgbDt9CmlubGluZSBpbnQgcmFuZG9tKGludCBsLCBpbnQgcil7cmV0dXJuIHJhbmQoKSAlIChyIC0gbCArIDEpICsgbDt9CmludCBkaWNlKCl7cmV0dXJuIHJhbmQoKSAlIDY7fQpib29sIGNvaW4oKXtyZXR1cm4gcmFuZCgpICUgMjt9CgovLyA8PD0gJyAwLiBJL08gQWNjZWxlcmF0b3IgaW50ZXJmYWNlIC4sCgp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCBSRChUICZ4KXsKICAgIC8vY2luID4+IHg7CiAgICBzY2FuZigiJWQiLCAmeCk7CiAgICAvL2NoYXIgYzsgZm9yIChjID0gZ2V0Y2hhcigpOyBjIDwgJzAnOyBjID0gZ2V0Y2hhcigpKTsgeCA9IGMgLSAnMCc7IGZvciAoYyA9IGdldGNoYXIoKTsgYyA+PSAnMCc7IGMgPSBnZXRjaGFyKCkpIHggPSB4ICogMTAgKyBjIC0gJzAnOwogICAgLy9jaGFyIGM7IGMgPSBnZXRjaGFyKCk7IHggPSBjIC0gJzAnOyBmb3IgKGMgPSBnZXRjaGFyKCk7IGMgPj0gJzAnOyBjID0gZ2V0Y2hhcigpKSB4ID0geCAqIDEwICsgYyAtICcwJzsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgT1QoY29uc3QgVCAmeCl7CiAgICBwcmludGYoIiVkXG4iLCB4KTsKfQoKLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLwoKY29uc3QgaW50IE4gPSAxMDAwOSwgTk4gPSAxMDAwMDA5OwoKaW50IGxbTk5dLCByW05OXSwgcFtOTl0sIGt5W05OXSA9IHtJTkZ9LCBzeltOTl0sIHRvdGFsOwppbnQgQVtOXSwgbiwgbTsKCiNkZWZpbmUgbHggbFt4XQojZGVmaW5lIHJ4IHJbeF0KCnN0cnVjdCBTcGxheXsKCiAgICBpbnQgcm9vdDsKCi8vcHJpdmF0ZToKCiAgICBpbmxpbmUgdm9pZCBzZXQoaW50IGxbXSwgaW50IHksIGludCB4KXsKICAgICAgICBsW3ldID0geCwgcFt4XSA9IHk7CiAgICB9CgogICAgaW5saW5lIHZvaWQgdXBkYXRlKGludCB4KXsKICAgICAgICBpZiAoIXgpIHJldHVybjsKICAgICAgICBzelt4XSA9IHN6W2x4XSArIHN6W3J4XSArIDE7CiAgICB9CgogICAgaW5saW5lIHZvaWQgcm90YXRlKGludCB4KXsKICAgICAgICBpbnQgeSA9IHBbeF0sIHogPSBwW3ldOyBzZXQoeSA9PSBsW3pdID8gbCA6IHIsIHosIHgpOyBpZiAoeCA9PSBsW3ldKXsKICAgICAgICAgICAgc2V0KGwsIHksIHJ4KSwgc2V0KHIsIHgsIHkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc2V0KHIsIHksIGx4KSwgc2V0KGwsIHgsIHkpOwogICAgICAgIH0KICAgICAgICB1cGRhdGUoeSksIHVwZGF0ZSh4KTsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBzcGxheShpbnQgeCl7CiAgICAgICAgd2hpbGUgKHBbeF0pIHJvdGF0ZSh4KTsKICAgICAgICByb290ID0geDsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBpbnNlcnQoaW50JiB4LCBpbnQgeSwgY29uc3QgaW50JiB2KXsKICAgICAgICBpZiAoIXgpewogICAgICAgICAgICB4ID0gKyt0b3RhbCwga3lbeF0gPSB2LCBzelt4XSA9IDEsIHBbeF0gPSB5OwogICAgICAgICAgICBTcGxheSh4KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICsrc3pbeF07CiAgICAgICAgICAgIGluc2VydCh2IDwga3lbeF0gPyBseCA6IHJ4LCB4LCB2KTsKICAgICAgICB9CiAgICB9CgogICAgdm9pZCBpbm9yZGVyKGludCB4KXsKICAgICAgICBpZiAoIXgpIHJldHVybjsKICAgICAgICBpbm9yZGVyKGx4KSwgcHJpbnRmKCIlZCAiLCBreVt4XSksIGlub3JkZXIocngpOwogICAgfQoKLy8gcHVibGljOgoKICAgIC8vICA+PSB2LCBsZWZ0bW9zdAogICAgaW5saW5lIGludCBTZWFyY2goaW50IHYpewogICAgICAgIGludCB4ID0gcm9vdCwgcmVzID0gMDsKICAgICAgICB3aGlsZSAoeCl7CiAgICAgICAgICAgIGlmICh2ID4ga3lbeF0pIHggPSByeDsKICAgICAgICAgICAgZWxzZSByZXMgPSB4LCB4ID0gbHg7CiAgICAgICAgfQogICAgICAgIHNwbGF5KHJlcyk7CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KCiAgICBpbmxpbmUgaW50IFNlbGVjdChpbnQgayl7CiAgICAgICAgaW50IHggPSByb290OyB3aGlsZSAoc3pbbHhdICE9IGspewogICAgICAgICAgICBpZiAoayA+IHN6W2x4XSkgayAtPSBzeltseF0gKyAxLCB4ID0gcng7CiAgICAgICAgICAgIGVsc2UgeCA9IGx4OwogICAgICAgIH0KICAgICAgICBzcGxheSh4KTsKICAgICAgICByZXR1cm4geDsKICAgIH0KCiAgICBpbmxpbmUgaW50IFJhbmsoaW50IHYpewogICAgICAgIFNlYXJjaCh2KTsgcmV0dXJuIHN6W2xbcm9vdF1dIC0gMTsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBJbnNlcnQoaW50IHYpewogICAgICAgIGluc2VydChyb290LCAwLCB2KTsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBEZWxldGUoaW50ICZ4KXsKICAgICAgICBpbnQgayA9IFJhbmsoeCkgKyAxLCB5ID0gU2VsZWN0KGstMSksIHogPSBTZWxlY3QoaysxKTsKICAgICAgICAtLXN6W3pdLCAtLXN6W3ldOyByW3ldID0gMDsKICAgIH0KCiAgICB2b2lkIElub3JkZXIoKXsKICAgICAgICBpbm9yZGVyKHJvb3QpOyBwdXRzKCIiKTsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBJbml0KGludCBsLCBpbnQgcil7CiAgICAgICAgcm9vdCA9IDAsIEluc2VydCgtSU5GKSwgSW5zZXJ0KElORik7CiAgICAgICAgRk9SXzEoaSwgbCwgcikgSW5zZXJ0KEFbaV0pOwoKICAgIH0KfSBUW05dOwoKaW50IHgsIHksIHosIGssIGEsIGIsIF94OwoKdm9pZCBCdWlsZCgpewogICAgUkVQXzEoaSwgbikgVFtpXS5Jbml0KGkgLSBsb3dfYml0KGkpICsgMSwgaSk7Cn0KCnZvaWQgTW9kaWZ5KGludCB4KXsKICAgIHdoaWxlICh4IDw9IG4pewogICAgICAgIFRbeF0uRGVsZXRlKHopLCBUW3hdLkluc2VydCh5KTsKICAgICAgICB4ICs9IGxvd19iaXQoeCk7CiAgICB9Cn0KCmludCBTdW0oaW50IHgpewogICAgaW50IHJlcyA9IDA7IHdoaWxlICh4KXsKICAgICAgICByZXMgKz0gVFt4XS5SYW5rKF94KTsKICAgICAgICB4IF49IGxvd19iaXQoeCk7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgppbnQgZigpewogICAgcmV0dXJuIFN1bShiKSAtIFN1bShhLTEpOwp9CgojdW5kZWYgbQoKaW50IG1haW4oKXsKCiNpZm5kZWYgT05MSU5FX0pVREdFCiAgICBmcmVvcGVuKCJpbi50eHQiLCAiciIsIHN0ZGluKTsKICAgIC8vZnJlb3Blbigib3V0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKI2VuZGlmCgogICAgLy9SdXNoewogICAgUkQobiwgbSk7IFJFUF8xKGksIG4pIFJEKEFbaV0pOwoKICAgIEJ1aWxkKCk7CgogICAgY2hhciBjbWQ7IERPKG0pewogICAgICAgIFJDKGNtZCk7IGlmIChjbWQgPT0nUScpewogICAgICAgICAgICBSRChhLCBiLCBrKTsgLS1rOyBpbnQgbCA9IDAsIHIgPSBJTkY7CiAgICAgICAgICAgIHdoaWxlIChsIDwgcil7CiAgICAgICAgICAgICAgICBfeCA9IChsICsgciArIDEpID4+IDE7CiAgICAgICAgICAgICAgICBpZiAoZigpID4gaykgciA9IF94IC0gMTsKICAgICAgICAgICAgICAgIGVsc2UgbCA9IF94OwogICAgICAgICAgICB9CiAgICAgICAgICAgIE9UKGwpOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICBSRCh4LCB5KTsgeiA9IEFbeF0sIEFbeF0gPSB5OwogICAgICAgICAgICBNb2RpZnkoeCk7CiAgICAgICAgfQogICAgfQogICAgLy99Cn0K