// #################################################################################################
// # You told me #
// # At your absolute best, you still won't be good enough for the wrong person #
// # At your worst, you'll still be worth it to the right person #
// # It was good while it lasted, good bye #
// # I believe I really loved you... to that point that I always wanted to hear your voice #
// # But before my hand could reach you... you seem to be slowly disappearing from my sight #
// #################################################################################################
// #pragma GCC optimize ("Ofast,unroll-loops")
// #pragma GCC target ("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#define pb push_back
#define ff first
#define ss second
#define tm1 first
#define tm2 second.first
#define tm3 second.second
#define sz(x) ll(x.size())
#define fill(x, v) memset(x, v, sizeof(x))
#define all(v) (v).begin(), (v).end()
#define FER(i,a,b) for(ll i=ll(a); i< ll(b); ++i)
#define IFR(i,a,b) for(ll i=ll(a); i>=ll(b); i-- )
#define fastio ios_base::sync_with_stdio(0); cin.tie(0)
#define N 300005
#define mod1 1000000007
// #define mod1 998244353
#define mod2 1000000009
#define bas 987625403
#define sqr(x) 1LL * (x) * (x)
#define INF (ll) 2e9
using namespace std;
using namespace __gnu_pbds;
typedef int ll;
typedef pair< ll, ll> ii;
typedef pair< ll, ii> tri;
typedef vector< ll> vi;
typedef vector< ii> vii;
typedef tree< int , null_type, less< int > , rb_tree_tag, tree_order_statistics_node_update> S_t;
mt19937_64 rng( chrono:: steady_clock :: now ( ) .time_since_epoch ( ) .count ( ) ) ;
struct custom_Hash {
static uint64_t splitmix64( uint64_t x) {
x + = 0x9e3779b97f4a7c15 ;
x = ( x ^ ( x >> 30 ) ) * 0xbf58476d1ce4e5b9 ;
x = ( x ^ ( x >> 27 ) ) * 0x94d049bb133111eb ;
return x ^ ( x >> 31 ) ;
}
size_t operator( ) ( uint64_t x) const {
static const uint64_t FIXED_RANDOM = chrono:: steady_clock :: now ( ) .time_since_epoch ( ) .count ( ) ;
return splitmix64( x + FIXED_RANDOM) ;
}
} ;
#define trace(...) fff(#__VA_ARGS__, __VA_ARGS__)
template < typename t> void fff( const char * x, t&& val1) { cout << x << " : " << val1 << "\n " ; }
template < typename t1, typename ... t2 > void fff( const char * x, t1&& val1, t2&& ... val2 ) {
const char * xd = strchr ( x + 1 , ',' ) ;
cout .write ( x, xd - x) << " : " << val1 << " | " ;
fff( xd + 1 , val2...) ;
}
inline ll add( ll a, ll b, ll mod) { return a + b < mod? a + b : a + b - mod; }
inline ll rem( ll a, ll b, ll mod) { return a >= b? a - b: a - b + mod; }
inline ll mul( ll a, ll b, ll mod) { return ( long long ) a * b % mod; }
inline void Mul( ll & a, ll b, ll mod) { a = ( long long ) a * b % mod; }
inline ll bp( ll a, ll p, ll mod) {
ll ret;
for ( ret = 1 ; p; p >>= 1 , Mul( a, a, mod) ) ( p & 1 ) && ( Mul( ret, a, mod) , 1 ) ;
return ret;
}
static inline void read( ll & result) {
bool minus = false ;
char ch;
ch = getchar ( ) ;
while ( true ) {
if ( ch == '-' ) break ;
if ( ch >= '0' and ch <= '9' ) break ;
ch = getchar ( ) ;
}
( ch == '-' ) ? minus = true : result = ch - '0' ;
while ( true ) {
ch = getchar ( ) ;
if ( ch < '0' or ch > '9' ) break ;
result = ( result << 3 ) + ( result << 1 ) + ( ch - '0' ) ;
}
if ( minus) result = - result;
}
struct T {
ll mn, cnt;
long long val;
T( ) { }
T( ll mn, ll cnt, long long val) : mn( mn) , cnt( cnt) , val( val) { }
inline T Op( T a, T b) {
if ( a.mn ! = b.mn ) {
auto cur = a.mn < b.mn ? T( a.mn , a.cnt , a.val ) : T( b.mn , b.cnt , b.val ) ;
return cur;
}
auto cur = T( a.mn , a.cnt + b.cnt , a.val + b.val ) ;
return cur;
}
} ;
struct ST {
ll n, ar[ 1 << 19 ] ;
T t[ 1 << 21 ] ;
ii lazy[ 1 << 21 ] ;
inline void updpro( ii laz, ll id, ll l, ll r) {
if ( laz.ff ) {
t[ id] .mn + = laz.ff ;
lazy[ id] .ff + = laz.ff ;
}
}
inline void updpush( ii laz, ll id, ll l, ll r) {
if ( laz.ss ) {
t[ id] .val + = laz.ss * t[ id] .cnt ;
lazy[ id] .ss + = laz.ss ;
}
}
inline void proh( ll id, ll l, ll r) {
ll mid = ( l + r) >> 1 ;
updpro( lazy[ id] , id << 1 , l, mid) ;
updpro( lazy[ id] , id << 1 | 1 , mid, r) ;
if ( t[ id << 1 ] .mn <= t[ id << 1 | 1 ] .mn ) {
updpush( lazy[ id] , id << 1 , l, mid) ;
}
if ( t[ id << 1 | 1 ] .mn <= t[ id << 1 ] .mn ) {
updpush( lazy[ id] , id << 1 | 1 , mid, r) ;
}
lazy[ id] = { 0 , 0 } ;
}
inline void Upd( ll x, ll y, ii val, ll id, ll l, ll r) {
if ( r <= x or y <= l) return ;
if ( x <= l and r <= y) {
updpro( val, id, l, r) ;
updpush( val, id, l, r) ;
return ;
}
proh( id, l, r) ;
ll mid = ( l + r) >> 1 ;
Upd( x, y, val, id << 1 , l, mid) ;
Upd( x, y, val, id << 1 | 1 , mid, r) ;
auto nxt = t[ id] .val ;
t[ id] = t[ id] .Op ( t[ id << 1 ] , t[ id << 1 | 1 ] ) ;
t[ id] .val = nxt;
}
inline void Modify( ll p, ll val, ll id, ll l, ll r) {
if ( r <= p or p < l) return ;
if ( l == p and l + 1 == r) {
t[ id] = T( val, 1 , 0 ) ;
lazy[ id] = { 0 , 0 } ;
return ;
}
proh( id, l, r) ;
ll mid = ( l + r) >> 1 ;
Modify( p, val, id << 1 , l, mid) ;
Modify( p, val, id << 1 | 1 , mid, r) ;
auto nxt = t[ id] .val ;
t[ id] = t[ id] .Op ( t[ id << 1 ] , t[ id << 1 | 1 ] ) ;
t[ id] .val = nxt;
}
inline long long Query( ll x, ll y, ll id, ll l, ll r) {
if ( x >= r or y <= l) return 0LL;
if ( x <= l and r <= y) return t[ id] .val ;
proh( id, l, r) ;
ll mid = ( l + r) >> 1 ;
long long L, R;
L = Query( x, y, id << 1 , l, mid) ;
R = Query( x, y, id << 1 | 1 , mid, r) ;
return L + R;
}
inline void Build( ll id, ll l, ll r) {
if ( l + 1 == r) {
t[ id] = T( ar[ l] , 1 , 0 ) ;
return ;
}
ll mid = ( l + r) >> 1 ;
Build( id << 1 , l, mid) ;
Build( id << 1 | 1 , mid, r) ;
t[ id] = t[ id] .Op ( t[ id << 1 ] , t[ id << 1 | 1 ] ) ;
}
inline void upd( ll x, ll y, ii val) { return Upd( x, y, val, 1 , 0 , n) ; }
inline void modify( ll p, ll val) { Modify( p, val, 1 , 0 , n) ; }
inline long long query( ll x, ll y) { return Query( x, y, 1 , 0 , n) ; }
inline void build( ) { FER( i, 0 , n << 2 ) lazy[ i] = { 0 , 0 } ; return Build( 1 , 0 , n) ; }
} st;
vii Q[ 1 << 19 ] ;
long long Answer[ 1 << 19 ] ;
struct PQTree {
ll n;
inline void build( vi & ar) {
n = sz( ar) ;
st.n = n;
FER( i, 0 , n) st.ar [ i] = INF;
st.build ( ) ;
vi mx = { - 1 } , mn = { - 1 } ;
FER( i, 0 , n) {
st.modify ( i, 1 ) ;
while ( sz( mx) > 1 and ar[ mx.back ( ) ] < ar[ i] ) {
auto crt = mx.back ( ) ; mx.pop_back ( ) ;
st.upd ( mx.back ( ) + 1 , crt + 1 , { ar[ i] - ar[ crt] , 0 } ) ;
}
mx.pb ( i) ;
while ( sz( mn) > 1 and ar[ mn.back ( ) ] > ar[ i] ) {
auto crt = mn.back ( ) ; mn.pop_back ( ) ;
st.upd ( mn.back ( ) + 1 , crt + 1 , { ar[ crt] - ar[ i] , 0 } ) ;
}
mn.pb ( i) ;
st.upd ( 0 , i + 1 , { - 1 , 0 } ) ;
st.upd ( 0 , n, { 0 , 1 } ) ;
for ( auto [ l, idx] : Q[ i] ) Answer[ idx] = st.query ( l, i + 1 ) ;
}
}
} pqTree;
int main( ) {
// https://c...content-available-to-author-only...s.com/contest/997/problem/E
// counting good ranges on a given [l, r> offline (join nodes)
fastio;
string s;
while ( getline( cin , s) ) {
if ( s[ 0 ] - 32 == 0 or s[ 0 ] - 32 == - 23 or s[ 0 ] - 32 == - 24 or s[ 0 ] - 32 == - 22 or s[ 0 ] - 32 == 21 ) {
continue ;
}
cout << s << "\n " ;
}
return 0 ;
}
Ly8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSB0b2xkIG1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi8vICMgICAgICAgICAgIEF0IHlvdXIgYWJzb2x1dGUgYmVzdCwgeW91IHN0aWxsIHdvbid0IGJlIGdvb2QgZW5vdWdoIGZvciB0aGUgd3JvbmcgcGVyc29uICAgICAgICAgICMKLy8gIyAgICAgICAgICAgICAgICAgICBBdCB5b3VyIHdvcnN0LCB5b3UnbGwgc3RpbGwgYmUgd29ydGggaXQgdG8gdGhlIHJpZ2h0IHBlcnNvbiAgICAgICAgICAgICAgICAgIwovLyAjICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgd2FzIGdvb2Qgd2hpbGUgaXQgbGFzdGVkLCBnb29kIGJ5ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi8vICMgICAgSSBiZWxpZXZlIEkgcmVhbGx5IGxvdmVkIHlvdS4uLiB0byB0aGF0IHBvaW50IHRoYXQgSSBhbHdheXMgd2FudGVkIHRvIGhlYXIgeW91ciB2b2ljZSAgICAgICMKLy8gIyAgICBCdXQgYmVmb3JlIG15IGhhbmQgY291bGQgcmVhY2ggeW91Li4uIHlvdSBzZWVtIHRvIGJlIHNsb3dseSBkaXNhcHBlYXJpbmcgZnJvbSBteSBzaWdodCAgICAgIwovLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIAovLyAjcHJhZ21hIEdDQyBvcHRpbWl6ZSAoIk9mYXN0LHVucm9sbC1sb29wcyIpCi8vICNwcmFnbWEgR0NDIHRhcmdldCAoInNzZSxzc2UyLHNzZTMsc3NzZTMsc3NlNCxwb3BjbnQsYWJtLG1teCxhdngsdHVuZT1uYXRpdmUiKQogCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgojaW5jbHVkZTxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KIAojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZmICBmaXJzdAojZGVmaW5lIHNzIHNlY29uZAojZGVmaW5lIHRtMSBmaXJzdAojZGVmaW5lIHRtMiBzZWNvbmQuZmlyc3QKI2RlZmluZSB0bTMgc2Vjb25kLnNlY29uZAojZGVmaW5lIHN6KHgpIGxsKHguc2l6ZSgpKQojZGVmaW5lIGZpbGwoeCwgdikgbWVtc2V0KHgsIHYsIHNpemVvZih4KSkKI2RlZmluZSBhbGwodikgKHYpLmJlZ2luKCksICh2KS5lbmQoKQojZGVmaW5lIEZFUihpLGEsYikgZm9yKGxsIGk9bGwoYSk7IGk8IGxsKGIpOyArK2kpCiNkZWZpbmUgSUZSKGksYSxiKSBmb3IobGwgaT1sbChhKTsgaT49bGwoYik7IGktLSApCiNkZWZpbmUgZmFzdGlvIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCkKIAojZGVmaW5lIE4gMzAwMDA1CiNkZWZpbmUgbW9kMSAxMDAwMDAwMDA3Ci8vICNkZWZpbmUgbW9kMSA5OTgyNDQzNTMKI2RlZmluZSBtb2QyIDEwMDAwMDAwMDkKI2RlZmluZSBiYXMgOTg3NjI1NDAzCiNkZWZpbmUgc3FyKHgpIDFMTCAqICh4KSAqICh4KQojZGVmaW5lIElORiAobGwpIDJlOQogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIG5hbWVzcGFjZSBfX2dudV9wYmRzOwogCiAKdHlwZWRlZiBpbnQgbGw7CnR5cGVkZWYgcGFpcjxsbCwgbGw+IGlpOwp0eXBlZGVmIHBhaXI8bGwsIGlpPiB0cmk7CnR5cGVkZWYgdmVjdG9yPGxsPiB2aTsKdHlwZWRlZiB2ZWN0b3I8aWk+IHZpaTsKdHlwZWRlZiB0cmVlPGludCwgbnVsbF90eXBlLCBsZXNzPGludD4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+IFNfdDsKbXQxOTkzN182NCBybmcoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKc3RydWN0IGN1c3RvbV9IYXNoIHsKICAgIHN0YXRpYyB1aW50NjRfdCBzcGxpdG1peDY0KHVpbnQ2NF90IHgpIHsKICAgICAgICB4ICs9IDB4OWUzNzc5Yjk3ZjRhN2MxNTsKICAgICAgICB4ID0gKHggXiAoeCA+PiAzMCkpICogMHhiZjU4NDc2ZDFjZTRlNWI5OwogICAgICAgIHggPSAoeCBeICh4ID4+IDI3KSkgKiAweDk0ZDA0OWJiMTMzMTExZWI7CiAgICAgICAgcmV0dXJuIHggXiAoeCA+PiAzMSk7CiAgICB9CiAgICBzaXplX3Qgb3BlcmF0b3IoKSh1aW50NjRfdCB4KSBjb25zdCB7CiAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IEZJWEVEX1JBTkRPTSA9IGNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKTsKICAgICAgICByZXR1cm4gc3BsaXRtaXg2NCh4ICsgRklYRURfUkFORE9NKTsKICAgIH0KfTsKIAojZGVmaW5lIHRyYWNlKC4uLikgZmZmKCNfX1ZBX0FSR1NfXywgX19WQV9BUkdTX18pCnRlbXBsYXRlPHR5cGVuYW1lIHQ+IHZvaWQgZmZmKGNvbnN0IGNoYXIqIHgsIHQmJiB2YWwxKSB7IGNvdXQgPDwgeCA8PCAiIDogIiA8PCB2YWwxIDw8ICJcbiI7fQp0ZW1wbGF0ZTx0eXBlbmFtZSB0MSwgdHlwZW5hbWUuLi4gdDI+IHZvaWQgZmZmKGNvbnN0IGNoYXIqIHgsIHQxJiYgdmFsMSwgdDImJi4uLiB2YWwyKXsKICAgIGNvbnN0IGNoYXIqIHhkID0gc3RyY2hyKHggKyAxLCAnLCcpOwogICAgY291dC53cml0ZSh4LCB4ZCAtIHgpIDw8ICIgOiAiIDw8dmFsMSA8PCAiIHwgIjsKICAgIGZmZih4ZCArIDEsIHZhbDIuLi4pOwp9CiAKaW5saW5lIGxsIGFkZChsbCBhLCBsbCBiLCBsbCBtb2QpIHsgcmV0dXJuIGEgKyBiIDwgbW9kPyBhICsgYiA6IGEgKyBiIC0gbW9kO30KaW5saW5lIGxsIHJlbShsbCBhLCBsbCBiLCBsbCBtb2QpIHsgcmV0dXJuIGEgPj0gYj8gYSAtIGI6IGEgLSBiICsgbW9kO30KaW5saW5lIGxsIG11bChsbCBhLCBsbCBiLCBsbCBtb2QpIHsgcmV0dXJuIChsb25nIGxvbmcpIGEgKiBiICUgbW9kO30KaW5saW5lIHZvaWQgTXVsKGxsICZhLCBsbCBiLCBsbCBtb2QpIHsgYSA9IChsb25nIGxvbmcpIGEgKiBiICUgbW9kO30KaW5saW5lIGxsIGJwKGxsIGEsIGxsIHAsIGxsIG1vZCl7CiAgICBsbCByZXQ7CiAgICBmb3IocmV0ID0gMTsgcDsgcCA+Pj0gMSwgTXVsKGEsIGEsIG1vZCkpIChwICYgMSkgJiYgKE11bChyZXQsIGEsIG1vZCksIDEpOwogICAgcmV0dXJuIHJldDsKfQogCnN0YXRpYyBpbmxpbmUgdm9pZCByZWFkKGxsICZyZXN1bHQpIHsKICAgIGJvb2wgbWludXMgPSBmYWxzZTsKICAgIGNoYXIgY2g7CiAgICBjaCA9IGdldGNoYXIoKTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKGNoID09ICctJykgYnJlYWs7CiAgICAgICAgaWYgKGNoID49ICcwJyBhbmQgY2ggPD0gJzknKSBicmVhazsKICAgICAgICBjaCA9IGdldGNoYXIoKTsKICAgIH0KICAgIChjaCA9PSAnLScpPyBtaW51cyA9IHRydWU6IHJlc3VsdCA9IGNoIC0gJzAnOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBjaCA9IGdldGNoYXIoKTsKICAgICAgICBpZiAoY2ggPCAnMCcgb3IgY2ggPiAnOScpIGJyZWFrOwogICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgMykgKyAocmVzdWx0IDw8IDEpICsgKGNoIC0gJzAnKTsKICAgIH0KICAgIGlmKG1pbnVzKSByZXN1bHQgPSAtcmVzdWx0Owp9CnN0cnVjdCBUIHsKICAgIGxsIG1uLCBjbnQ7CiAgICBsb25nIGxvbmcgdmFsOwogICAgVCgpIHt9CiAgICBUKGxsIG1uLCBsbCBjbnQsIGxvbmcgbG9uZyB2YWwpIDogbW4obW4pLCBjbnQoY250KSwgdmFsKHZhbCkge30KICAgIGlubGluZSBUIE9wKFQgYSwgVCBiKSB7CiAgICAgICAgaWYoYS5tbiAhPSBiLm1uKSB7CiAgICAgICAgICAgIGF1dG8gY3VyID0gYS5tbiA8IGIubW4gPyBUKGEubW4sIGEuY250LCBhLnZhbCkgOiBUKGIubW4sIGIuY250LCBiLnZhbCk7CiAgICAgICAgICAgIHJldHVybiBjdXI7CiAgICAgICAgfQogICAgICAgIGF1dG8gY3VyID0gVChhLm1uLCBhLmNudCArIGIuY250LCBhLnZhbCArIGIudmFsKTsKICAgICAgICByZXR1cm4gY3VyOwogICAgfQp9OwoKc3RydWN0IFNUIHsKICAgIGxsIG4sIGFyWzEgPDwgMTldOwogICAgVCB0WzEgPDwgMjFdOwogICAgaWkgbGF6eVsxIDw8IDIxXTsKICAgIGlubGluZSB2b2lkIHVwZHBybyhpaSBsYXosIGxsIGlkLCBsbCBsLCBsbCByKSB7CiAgICAgICAgaWYobGF6LmZmKSB7CiAgICAgICAgICAgIHRbaWRdLm1uICs9IGxhei5mZjsKICAgICAgICAgICAgbGF6eVtpZF0uZmYgKz0gbGF6LmZmOwogICAgICAgIH0KICAgIH0KICAgIGlubGluZSB2b2lkIHVwZHB1c2goaWkgbGF6LCBsbCBpZCwgbGwgbCwgbGwgcikgewogICAgICAgIGlmKGxhei5zcykgewogICAgICAgICAgICB0W2lkXS52YWwgKz0gbGF6LnNzICogdFtpZF0uY250OwogICAgICAgICAgICBsYXp5W2lkXS5zcyArPSBsYXouc3M7CiAgICAgICAgfQogICAgfQogICAgaW5saW5lIHZvaWQgcHJvaChsbCBpZCwgbGwgbCwgbGwgcikgewogICAgICAgIGxsIG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICB1cGRwcm8obGF6eVtpZF0sIGlkIDw8IDEsIGwsIG1pZCk7CiAgICAgICAgdXBkcHJvKGxhenlbaWRdLCBpZCA8PCAxIHwgMSwgbWlkLCByKTsKICAgICAgICBpZih0W2lkIDw8IDFdLm1uIDw9IHRbaWQgPDwgMSB8IDFdLm1uKSB7CiAgICAgICAgICAgIHVwZHB1c2gobGF6eVtpZF0sIGlkIDw8IDEsIGwsIG1pZCk7CiAgICAgICAgfQogICAgICAgIGlmKHRbaWQgPDwgMSB8IDFdLm1uIDw9IHRbaWQgPDwgMV0ubW4pIHsKICAgICAgICAgICAgdXBkcHVzaChsYXp5W2lkXSwgaWQgPDwgMSB8IDEsIG1pZCwgcik7CiAgICAgICAgfQogICAgICAgIGxhenlbaWRdID0gezAsIDB9OwogICAgfQogICAgaW5saW5lIHZvaWQgVXBkKGxsIHgsIGxsIHksIGlpIHZhbCwgbGwgaWQsIGxsIGwsIGxsIHIpIHsKICAgICAgICBpZihyIDw9IHggb3IgeSA8PSBsKSByZXR1cm47CiAgICAgICAgaWYoeCA8PSBsIGFuZCByIDw9IHkpIHsKICAgICAgICAgICAgdXBkcHJvKHZhbCwgaWQsIGwsIHIpOwogICAgICAgICAgICB1cGRwdXNoKHZhbCwgaWQsIGwsIHIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHByb2goaWQsIGwsIHIpOwogICAgICAgIGxsIG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICBVcGQoeCwgeSwgdmFsLCBpZCA8PCAxLCBsLCBtaWQpOwogICAgICAgIFVwZCh4LCB5LCB2YWwsIGlkIDw8IDEgfCAxLCBtaWQsIHIpOwogICAgICAgIGF1dG8gbnh0ID0gdFtpZF0udmFsOwogICAgICAgIHRbaWRdID0gdFtpZF0uT3AodFtpZCA8PCAxXSwgdFtpZCA8PCAxIHwgMV0pOwogICAgICAgIHRbaWRdLnZhbCA9IG54dDsKICAgIH0KICAgIGlubGluZSB2b2lkIE1vZGlmeShsbCBwLCBsbCB2YWwsIGxsIGlkLCBsbCBsLCBsbCByKSB7CiAgICAgICAgaWYociA8PSBwIG9yIHAgPCBsKSByZXR1cm47CiAgICAgICAgaWYobCA9PSBwIGFuZCBsICsgMSA9PSByKSB7IAogICAgICAgICAgICB0W2lkXSA9IFQodmFsLCAxLCAwKTsgCiAgICAgICAgICAgIGxhenlbaWRdID0gezAsIDB9OwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHByb2goaWQsIGwsIHIpOwogICAgICAgIGxsIG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICBNb2RpZnkocCwgdmFsLCBpZCA8PCAxLCBsLCBtaWQpOwogICAgICAgIE1vZGlmeShwLCB2YWwsIGlkIDw8IDEgfCAxLCBtaWQsIHIpOwogICAgICAgIGF1dG8gbnh0ID0gdFtpZF0udmFsOwogICAgICAgIHRbaWRdID0gdFtpZF0uT3AodFtpZCA8PCAxXSwgdFtpZCA8PCAxIHwgMV0pOwogICAgICAgIHRbaWRdLnZhbCA9IG54dDsKICAgIH0KICAgIGlubGluZSBsb25nIGxvbmcgUXVlcnkobGwgeCwgbGwgeSwgbGwgaWQsIGxsIGwsIGxsIHIpIHsKICAgICAgICBpZih4ID49IHIgb3IgeSA8PSBsKSByZXR1cm4gMExMOwogICAgICAgIGlmKHggPD0gbCBhbmQgciA8PSB5KSByZXR1cm4gdFtpZF0udmFsOwogICAgICAgIHByb2goaWQsIGwsIHIpOwogICAgICAgIGxsIG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICBsb25nIGxvbmcgTCwgUjsKICAgICAgICBMID0gUXVlcnkoeCwgeSwgaWQgPDwgMSwgbCwgbWlkKTsKICAgICAgICBSID0gUXVlcnkoeCwgeSwgaWQgPDwgMSB8IDEsIG1pZCwgcik7CiAgICAgICAgcmV0dXJuIEwgKyBSOwogICAgfQogICAgaW5saW5lIHZvaWQgQnVpbGQobGwgaWQsIGxsIGwsIGxsIHIpIHsKICAgICAgICBpZihsICsgMSA9PSByKSB7CiAgICAgICAgICAgIHRbaWRdID0gVChhcltsXSwgMSwgMCk7CiAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgfSAKICAgICAgICBsbCBtaWQgPSAobCArIHIpID4+IDE7CiAgICAgICAgQnVpbGQoaWQgPDwgMSwgbCwgbWlkKTsKICAgICAgICBCdWlsZChpZCA8PCAxIHwgMSwgbWlkLCByKTsKICAgICAgICB0W2lkXSA9IHRbaWRdLk9wKHRbaWQgPDwgMV0sIHRbaWQgPDwgMSB8IDFdKTsKICAgIH0KICAgIGlubGluZSB2b2lkIHVwZChsbCB4LCBsbCB5LCBpaSB2YWwpIHsgcmV0dXJuIFVwZCh4LCB5LCB2YWwsIDEsIDAsIG4pO30KICAgIGlubGluZSB2b2lkIG1vZGlmeShsbCBwLCBsbCB2YWwpIHsgTW9kaWZ5KHAsIHZhbCwgMSwgMCwgbik7fQogICAgaW5saW5lIGxvbmcgbG9uZyBxdWVyeShsbCB4LCBsbCB5KSB7IHJldHVybiBRdWVyeSh4LCB5LCAxLCAwLCBuKTt9CiAgICBpbmxpbmUgdm9pZCBidWlsZCgpIHsgRkVSKGksIDAsIG4gPDwgMikgbGF6eVtpXSA9IHswLCAwfTsgcmV0dXJuIEJ1aWxkKDEsIDAsIG4pO30KfXN0OwoKdmlpIFFbMSA8PCAxOV07CmxvbmcgbG9uZyBBbnN3ZXJbMSA8PCAxOV07CgpzdHJ1Y3QgUFFUcmVlIHsKICAgIGxsIG47CiAgICBpbmxpbmUgdm9pZCBidWlsZCh2aSAmYXIpIHsKICAgICAgICBuID0gc3ooYXIpOwogICAgICAgIHN0Lm4gPSBuOwogICAgICAgIEZFUihpLCAwLCBuKSBzdC5hcltpXSA9IElORjsgCiAgICAgICAgc3QuYnVpbGQoKTsKICAgICAgICB2aSBteCA9IHstMX0sIG1uID0gey0xfTsKICAgICAgICBGRVIoaSwgMCwgbikgewogICAgICAgICAgICBzdC5tb2RpZnkoaSwgMSk7CiAgICAgICAgICAgIHdoaWxlKHN6KG14KSA+IDEgYW5kIGFyW214LmJhY2soKV0gPCBhcltpXSkgewogICAgICAgICAgICAJYXV0byBjcnQgPSBteC5iYWNrKCk7IG14LnBvcF9iYWNrKCk7CiAgICAgICAgICAgICAgICBzdC51cGQobXguYmFjaygpICsgMSwgY3J0ICsgMSwge2FyW2ldIC0gYXJbY3J0XSwgMH0pOwogICAgICAgICAgICB9IAogICAgICAgICAgICBteC5wYihpKTsKICAgICAgICAgICAgd2hpbGUoc3oobW4pID4gMSBhbmQgYXJbbW4uYmFjaygpXSA+IGFyW2ldKSB7CiAgICAgICAgICAgIAlhdXRvIGNydCA9IG1uLmJhY2soKTsgbW4ucG9wX2JhY2soKTsKICAgICAgICAgICAgICAgIHN0LnVwZChtbi5iYWNrKCkgKyAxLCBjcnQgKyAxLCB7YXJbY3J0XSAtIGFyW2ldLCAwfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbW4ucGIoaSk7CiAgICAgICAgICAgIHN0LnVwZCgwLCBpICsgMSwgey0xLCAwfSk7CiAgICAgICAgICAgIHN0LnVwZCgwLCBuLCB7MCwgMX0pOwogICAgICAgICAgICBmb3IoYXV0byBbbCwgaWR4XSA6IFFbaV0pIEFuc3dlcltpZHhdID0gc3QucXVlcnkobCwgaSArIDEpOwogICAgICAgIH0KICAgIH0KfXBxVHJlZTsKCmludCBtYWluKCkgewogICAgLy8gaHR0cHM6Ly9jLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS9jb250ZXN0Lzk5Ny9wcm9ibGVtL0UKICAgIC8vIGNvdW50aW5nIGdvb2QgcmFuZ2VzIG9uIGEgZ2l2ZW4gW2wsIHI+IG9mZmxpbmUgKGpvaW4gbm9kZXMpCiAgICBmYXN0aW87CiAgICBzdHJpbmcgczsKICAgIHdoaWxlKGdldGxpbmUoY2luLCBzKSkgewogICAgCWlmKHNbMF0gLSAzMiA9PSAwIG9yIHNbMF0gLSAzMiA9PSAtMjMgb3Igc1swXSAtIDMyID09IC0yNCBvciBzWzBdIC0gMzIgPT0gLTIyIG9yIHNbMF0gLSAzMiA9PSAyMSkgewogICAgCQljb250aW51ZTsKICAgIAl9CiAgICAJY291dCA8PCBzIDw8ICJcbiI7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==