#include <bits/stdc++.h>
#define NDEBUG
#include <cassert>
#define clean_errno() (errno == 0 ? "None" : strerror(errno))
#define log_error(M, ...) fprintf(stderr, "[assert] (%s:%d-errno:%s) " M "\n", __FILE__, __LINE__, clean_errno(), ##__VA_ARGS__)
#define assertf(A, M, ...) if(!(A)) {log_error(M, ##__VA_ARGS__); assert(A); }
#include <climits>
#include <cfloat>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
inline unsigned int rand16(){return ((rand()) << 15) ^ rand();}
inline unsigned int rand32(){return (rand16() << 16) | rand16();}
inline ULL rand64(){return ((LL)rand32() << 32) | rand32();}
inline ULL random(LL l, LL r){return l == r ? l : rand64() %(r-l) +l;}
inline double fRand(double fMin, double fMax) // RAND_MAX: [fMin,fMax)
{ double f = (double)rand()/(RAND_MAX+1.0f); return fMin + f*(fMax-fMin); }
const int INF = 0x3f3f3f3f;
const LL INFF = 1LL<<60;
const int MOD = 1000000007;
const double EPS = 1e-9;
const double PI = acos(-1.0);//2*acos(0.0);//M_PI;
//4 dirs anti-cw: int dx[]={1,0,-1,0}, dy[]={0,1,0,-1};
//4 dirs cw: int dx[]={-1,0,1,0}, dy[]={0,1,0,-1};
//8 dirs: int dx[]={1,1,0,-1,-1,-1,0,1}, dy[]={0,1,1,1,0,-1,-1,-1};
//hex: int dx[6]={2,1,-1,-2,-1,1}, dy[6]={0,1,1,0,-1,-1};
//knight: int dx[]={2,1,-1,-2,-2,-1,1,2}, dy[]={1,2,2,1,-1,-2,-2,-1};
#define FOR(i,a,b) for(int(i)=int(a);(i)<int(b);(i)++)
#define FOREQ(i,a,b) for(int(i)=int(a);(i)<=int(b);(i)++)
#define RFOR(i,a,b) for(int(i)=(a),_b(b);(i)>=_b;--(i))
#define FOREACH(c,itr) for(__typeof((c).begin()) itr=(c).begin();itr!=(c).end();itr++)
#define FILL(arr,val) memset((arr),(val),sizeof(arr))
#define CLR(a) memset((a),0,sizeof(a))
#define CPY(dest,src) memcpy((dest),(src),sizeof(dest))
#define ALL(a) (a).begin(),(a).end()
#define SZ(a) ((int)(a).size())
#define UNIQ(a) sort(ALL(a)); (a).erase(unique(ALL(a)),(a).end())
#define IDX(arr,ind) (lower_bound(ALL(arr),ind)-arr.begin())
#define fst first
#define snd second
#define pb push_back
#define mp make_pair
#define mt(a,b,c) mp(a,mp(b,c))
#include <sys/resource.h>
struct rlimit rl;
#define set_stk_sz \
getrlimit(RLIMIT_STACK,&rl); \
rl.rlim_cur=16*1024*1024; \
setrlimit(RLIMIT_STACK, &rl);
template< typename T, size_t N >
inline void print_ary(T(&ary)[N], int er)
{for(int r = 0; r < er; r++) {cout << ary[r] << " ";}cout<<endl;}
template< typename T, size_t N >
inline void print_ary_eq(T(&ary)[N], int er)
{for(int r = 1; r <= er; r++) {cout << ary[r] << " ";}cout<<endl;}
template< typename T, size_t N, size_t M >
inline void print_ary_2d(T(&ary)[N][M], int er, int ec)
{for(int r = 0; r < er; r++) {for(int c = 0; c < ec; c++) {cout << ary[r][c] << " ";}cout<<endl;}}
template< typename T, size_t N, size_t M >
inline void print_ary_2d_eq(T(&ary)[N][M], int er, int ec)
{for(int r = 1; r <= er; r++) {for(int c = 1; c <= ec; c++) {cout << ary[r][c] << " ";}cout<<endl;}}
inline LL lcm(LL a, LL b) {return a*b/__gcd(a,b);}
inline double dist(double x1, double y1, double x2, double y2)
{return hypot(x1-x2,y1-y2);}
//scanf("%[^\n]", &s);
inline int is_pow_of_2(unsigned int x) {return ((x!=0) && ((x&(~x+1))==x));}
//#leading 0-bits in x (32bit fixed width representation); x=0: undefined
inline int clz(int N) {return N ? 32 - __builtin_clz(N) : INT_MIN;}
inline int clz(ULL N) {return N ? 64 - __builtin_clzll(N) : 0;}
//#trailing 0-bits
inline int ctz(int n){return (n==0?-1:ctz(n>>1)+1);}
//#1-bits set
#define bitcnt __builtin_popcount
#define bitcntll __builtin_popcountll
#define bin_width 32
inline char* bin(int x,char *so){char s[bin_width+1];int i=bin_width;s[i--]=0x00;do{s[i--]=(x&1)?'1':'0';x>>=1;}while(x>0);i++;sprintf(so,"%s",s+i);return so;}
//USAGE: char buf[bin_width+1];printf("%s",bin(N,buf));
/*
const int MAXN = 10005;
int fact[MAXN];
#define FACT fact[0]=1;FOR(i,1,MAXN){fact[i]=(1LL*fact[i-1]*i)%MOD;}
inline LL modinv(int a, int b=MOD-2) {LL x=1,y=a;while(b){if(b&1)x=(x*y)%MOD;y=(y*y)%MOD;b>>=1;}return x;}
// nCr
inline LL c(int n, int r) {return ((((1LL*fact[n]*modinv(fact[n-r]))%MOD)*modinv(fact[r]))%MOD);}
*/
vector<vector<int> > mappings;
vector<int> m;
inline void recurse(int pos, const int N, vector<int> &mapping)
{
if (pos > N)
{
mappings.pb(mapping);
return;
}
FOREQ(i,1,N)
{
if (i != pos)
{
mapping.pb(i);
recurse(pos+1, N, mapping);
mapping.pop_back();
}
}
}
inline int bfs(const vector<int> &mapping, const int N)
{
bool visited[N+1];
FOREQ(i,1,N) { visited[i] = false; }
int colorn[N+1], colors[N+1];
FOREQ(i,1,N)
{
colorn[i] = -1;
colors[i] = 0;
}
int color = 1;
list<int> queue;
int len = SZ(mapping);
if (len < 1) {return 0;}
FOR(i,0,len)
{
if (!visited[i+1])
{
queue.pb(i+1);
}
if (!visited[mapping[i]])
{
queue.pb(mapping[i]);
}
bool flag = false;
while(!queue.empty())
{
int elem = queue.front();
queue.pop_front();
if (visited[elem]) {continue;}
colorn[elem] = color;
flag = true;
colors[color]++;
visited[elem] = true;
FOR(j,i+1,len)
{
if (elem == (j+1) && !visited[mapping[j]])
{
queue.pb(mapping[j]);
}
else if (elem == mapping[j] && !visited[j+1])
{
queue.pb(j+1);
}
}
}
if (flag) { color++; }
}
// printf("{");
// FOREQ(i,1,N)
// {
// printf("%d:%d", i,colorn[i]);
// if (i < N) { printf(","); }
// }
// printf("}");
int max_sz = 0;
//printf("{");
FOR(i,1,color)
{
// printf("%d:%d", i,colors[i]);
// if (i < color-1) { printf(","); }
max_sz = max(max_sz, colors[i]);
}
//printf("}");
return max_sz;
}
int main()
{
FOREQ(N,5,5)//2,9)
{
mappings.clear();
m.clear();
recurse(1, N, m);
int cnts[N+1];
FOREQ(i,0,N) { cnts[i] = 0; }
FOREACH(mappings, itr)
{
int len = SZ(*itr);
FOR(i,0,len)
{
// printf("(%d,%d)", i+1,(*itr)[i]);
if (i < len-1)
{
// printf(",");
}
}
int cnt = bfs(*itr, N);
cnts[cnt]++;
// printf(": %d\n", cnt);
}
ULL ans_top = 0ULL;
stringstream ss;
FOREQ(i,1,N)
{
if (cnts[i] > 0)
{
ss << i << ":" << cnts[i] << ",";
ans_top += i*cnts[i];
}
}
string s = ss.str();
s = s.substr(0, SZ(s)-1);
ULL ans_btm = (ULL)pow((N-1),N);
ULL ans_gcd = __gcd(ans_top, ans_btm);
printf("N=%d: {%s} %llu/%llu\n", N,s.c_str(),ans_top/ans_gcd,ans_btm/ans_gcd);
fflush(stdout);
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIE5ERUJVRwojaW5jbHVkZSA8Y2Fzc2VydD4KI2RlZmluZSBjbGVhbl9lcnJubygpIChlcnJubyA9PSAwID8gIk5vbmUiIDogc3RyZXJyb3IoZXJybm8pKQojZGVmaW5lIGxvZ19lcnJvcihNLCAuLi4pIGZwcmludGYoc3RkZXJyLCAiW2Fzc2VydF0gKCVzOiVkLWVycm5vOiVzKSAiIE0gIlxuIiwgX19GSUxFX18sIF9fTElORV9fLCBjbGVhbl9lcnJubygpLCAjI19fVkFfQVJHU19fKQojZGVmaW5lIGFzc2VydGYoQSwgTSwgLi4uKSBpZighKEEpKSB7bG9nX2Vycm9yKE0sICMjX19WQV9BUkdTX18pOyBhc3NlcnQoQSk7IH0KCiNpbmNsdWRlIDxjbGltaXRzPgojaW5jbHVkZSA8Y2Zsb2F0PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgbG9uZyBsb25nIExMOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVTEw7CgppbmxpbmUgdW5zaWduZWQgaW50IHJhbmQxNigpe3JldHVybiAoKHJhbmQoKSkgPDwgMTUpIF4gcmFuZCgpO30KaW5saW5lIHVuc2lnbmVkIGludCByYW5kMzIoKXtyZXR1cm4gKHJhbmQxNigpIDw8IDE2KSB8IHJhbmQxNigpO30KaW5saW5lIFVMTCByYW5kNjQoKXtyZXR1cm4gKChMTClyYW5kMzIoKSA8PCAzMikgfCByYW5kMzIoKTt9CmlubGluZSBVTEwgcmFuZG9tKExMIGwsIExMIHIpe3JldHVybiBsID09IHIgPyBsIDogcmFuZDY0KCkgJShyLWwpICtsO30KaW5saW5lIGRvdWJsZSBmUmFuZChkb3VibGUgZk1pbiwgZG91YmxlIGZNYXgpIC8vIFJBTkRfTUFYOiBbZk1pbixmTWF4KQoJeyBkb3VibGUgZiA9IChkb3VibGUpcmFuZCgpLyhSQU5EX01BWCsxLjBmKTsgcmV0dXJuIGZNaW4gKyBmKihmTWF4LWZNaW4pOyB9Cgpjb25zdCBpbnQgSU5GID0gMHgzZjNmM2YzZjsKY29uc3QgTEwgSU5GRiA9IDFMTDw8NjA7CmNvbnN0IGludCBNT0QgPSAxMDAwMDAwMDA3Owpjb25zdCBkb3VibGUgRVBTID0gMWUtOTsKY29uc3QgZG91YmxlIFBJID0gYWNvcygtMS4wKTsvLzIqYWNvcygwLjApOy8vTV9QSTsKCi8vNCBkaXJzIGFudGktY3c6IGludCBkeFtdPXsxLDAsLTEsMH0sIGR5W109ezAsMSwwLC0xfTsKLy80IGRpcnMgY3c6ICAgICAgaW50IGR4W109ey0xLDAsMSwwfSwgZHlbXT17MCwxLDAsLTF9OwovLzggZGlyczogaW50IGR4W109ezEsMSwwLC0xLC0xLC0xLDAsMX0sIGR5W109ezAsMSwxLDEsMCwtMSwtMSwtMX07Ci8vaGV4OiBpbnQgZHhbNl09ezIsMSwtMSwtMiwtMSwxfSwgZHlbNl09ezAsMSwxLDAsLTEsLTF9OwovL2tuaWdodDogaW50IGR4W109ezIsMSwtMSwtMiwtMiwtMSwxLDJ9LCBkeVtdPXsxLDIsMiwxLC0xLC0yLC0yLC0xfTsKCiNkZWZpbmUgRk9SKGksYSxiKSAgIGZvcihpbnQoaSk9aW50KGEpOyhpKTxpbnQoYik7KGkpKyspCiNkZWZpbmUgRk9SRVEoaSxhLGIpIGZvcihpbnQoaSk9aW50KGEpOyhpKTw9aW50KGIpOyhpKSsrKQojZGVmaW5lIFJGT1IoaSxhLGIpICBmb3IoaW50KGkpPShhKSxfYihiKTsoaSk+PV9iOy0tKGkpKQojZGVmaW5lIEZPUkVBQ0goYyxpdHIpIGZvcihfX3R5cGVvZigoYykuYmVnaW4oKSkgaXRyPShjKS5iZWdpbigpO2l0ciE9KGMpLmVuZCgpO2l0cisrKQoKI2RlZmluZSBGSUxMKGFycix2YWwpIG1lbXNldCgoYXJyKSwodmFsKSxzaXplb2YoYXJyKSkKI2RlZmluZSBDTFIoYSkgICAgICAgIG1lbXNldCgoYSksMCxzaXplb2YoYSkpCiNkZWZpbmUgQ1BZKGRlc3Qsc3JjKSBtZW1jcHkoKGRlc3QpLChzcmMpLHNpemVvZihkZXN0KSkKCiNkZWZpbmUgQUxMKGEpICAgICAgIChhKS5iZWdpbigpLChhKS5lbmQoKQojZGVmaW5lIFNaKGEpICAgICAgICAoKGludCkoYSkuc2l6ZSgpKQojZGVmaW5lIFVOSVEoYSkgICAgICBzb3J0KEFMTChhKSk7IChhKS5lcmFzZSh1bmlxdWUoQUxMKGEpKSwoYSkuZW5kKCkpCiNkZWZpbmUgSURYKGFycixpbmQpIChsb3dlcl9ib3VuZChBTEwoYXJyKSxpbmQpLWFyci5iZWdpbigpKQoKI2RlZmluZSBmc3QgZmlyc3QKI2RlZmluZSBzbmQgc2Vjb25kCiNkZWZpbmUgcGIgIHB1c2hfYmFjawojZGVmaW5lIG1wICBtYWtlX3BhaXIKI2RlZmluZSBtdChhLGIsYykgbXAoYSxtcChiLGMpKQoKI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgpzdHJ1Y3QgcmxpbWl0IHJsOwojZGVmaW5lIHNldF9zdGtfc3ogXAoJZ2V0cmxpbWl0KFJMSU1JVF9TVEFDSywmcmwpOyBcCglybC5ybGltX2N1cj0xNioxMDI0KjEwMjQ7IFwKCXNldHJsaW1pdChSTElNSVRfU1RBQ0ssICZybCk7Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgVCwgc2l6ZV90IE4gPgppbmxpbmUgdm9pZCBwcmludF9hcnkoVCgmYXJ5KVtOXSwgaW50IGVyKQoJe2ZvcihpbnQgciA9IDA7IHIgPCBlcjsgcisrKSB7Y291dCA8PCBhcnlbcl0gPDwgIiAiO31jb3V0PDxlbmRsO30KdGVtcGxhdGU8IHR5cGVuYW1lIFQsIHNpemVfdCBOID4KaW5saW5lIHZvaWQgcHJpbnRfYXJ5X2VxKFQoJmFyeSlbTl0sIGludCBlcikKCXtmb3IoaW50IHIgPSAxOyByIDw9IGVyOyByKyspIHtjb3V0IDw8IGFyeVtyXSA8PCAiICI7fWNvdXQ8PGVuZGw7fQp0ZW1wbGF0ZTwgdHlwZW5hbWUgVCwgc2l6ZV90IE4sIHNpemVfdCBNID4KaW5saW5lIHZvaWQgcHJpbnRfYXJ5XzJkKFQoJmFyeSlbTl1bTV0sIGludCBlciwgaW50IGVjKQoJe2ZvcihpbnQgciA9IDA7IHIgPCBlcjsgcisrKSB7Zm9yKGludCBjID0gMDsgYyA8IGVjOyBjKyspIHtjb3V0IDw8IGFyeVtyXVtjXSA8PCAiICI7fWNvdXQ8PGVuZGw7fX0KdGVtcGxhdGU8IHR5cGVuYW1lIFQsIHNpemVfdCBOLCBzaXplX3QgTSA+CmlubGluZSB2b2lkIHByaW50X2FyeV8yZF9lcShUKCZhcnkpW05dW01dLCBpbnQgZXIsIGludCBlYykKCXtmb3IoaW50IHIgPSAxOyByIDw9IGVyOyByKyspIHtmb3IoaW50IGMgPSAxOyBjIDw9IGVjOyBjKyspIHtjb3V0IDw8IGFyeVtyXVtjXSA8PCAiICI7fWNvdXQ8PGVuZGw7fX0KaW5saW5lIExMIGxjbShMTCBhLCBMTCBiKSB7cmV0dXJuIGEqYi9fX2djZChhLGIpO30KaW5saW5lIGRvdWJsZSBkaXN0KGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MikKCXtyZXR1cm4gaHlwb3QoeDEteDIseTEteTIpO30KLy9zY2FuZigiJVteXG5dIiwgJnMpOwppbmxpbmUgaW50IGlzX3Bvd19vZl8yKHVuc2lnbmVkIGludCB4KSB7cmV0dXJuICgoeCE9MCkgJiYgKCh4Jih+eCsxKSk9PXgpKTt9CgovLyNsZWFkaW5nIDAtYml0cyBpbiB4ICgzMmJpdCBmaXhlZCB3aWR0aCByZXByZXNlbnRhdGlvbik7IHg9MDogdW5kZWZpbmVkCmlubGluZSBpbnQgY2x6KGludCBOKSB7cmV0dXJuIE4gPyAzMiAtIF9fYnVpbHRpbl9jbHooTikgOiBJTlRfTUlOO30KaW5saW5lIGludCBjbHooVUxMIE4pIHtyZXR1cm4gTiA/IDY0IC0gX19idWlsdGluX2NsemxsKE4pIDogMDt9Ci8vI3RyYWlsaW5nIDAtYml0cwppbmxpbmUgaW50IGN0eihpbnQgbil7cmV0dXJuIChuPT0wPy0xOmN0eihuPj4xKSsxKTt9Ci8vIzEtYml0cyBzZXQKI2RlZmluZSBiaXRjbnQgICBfX2J1aWx0aW5fcG9wY291bnQKI2RlZmluZSBiaXRjbnRsbCBfX2J1aWx0aW5fcG9wY291bnRsbAoKI2RlZmluZSBiaW5fd2lkdGggMzIKaW5saW5lIGNoYXIqIGJpbihpbnQgeCxjaGFyICpzbyl7Y2hhciBzW2Jpbl93aWR0aCsxXTtpbnQgaT1iaW5fd2lkdGg7c1tpLS1dPTB4MDA7ZG97c1tpLS1dPSh4JjEpPycxJzonMCc7eD4+PTE7fXdoaWxlKHg+MCk7aSsrO3NwcmludGYoc28sIiVzIixzK2kpO3JldHVybiBzbzt9Ci8vVVNBR0U6IGNoYXIgYnVmW2Jpbl93aWR0aCsxXTtwcmludGYoIiVzIixiaW4oTixidWYpKTsKCi8qCmNvbnN0IGludCBNQVhOID0gMTAwMDU7CmludCBmYWN0W01BWE5dOwojZGVmaW5lIEZBQ1QgZmFjdFswXT0xO0ZPUihpLDEsTUFYTil7ZmFjdFtpXT0oMUxMKmZhY3RbaS0xXSppKSVNT0Q7fQppbmxpbmUgTEwgbW9kaW52KGludCBhLCBpbnQgYj1NT0QtMikge0xMIHg9MSx5PWE7d2hpbGUoYil7aWYoYiYxKXg9KHgqeSklTU9EO3k9KHkqeSklTU9EO2I+Pj0xO31yZXR1cm4geDt9Ci8vIG5DcgppbmxpbmUgTEwgYyhpbnQgbiwgaW50IHIpIHtyZXR1cm4gKCgoKDFMTCpmYWN0W25dKm1vZGludihmYWN0W24tcl0pKSVNT0QpKm1vZGludihmYWN0W3JdKSklTU9EKTt9CiovCgp2ZWN0b3I8dmVjdG9yPGludD4gPiBtYXBwaW5nczsKdmVjdG9yPGludD4gbTsKCmlubGluZSB2b2lkIHJlY3Vyc2UoaW50IHBvcywgY29uc3QgaW50IE4sIHZlY3RvcjxpbnQ+ICZtYXBwaW5nKQp7CglpZiAocG9zID4gTikKCXsKCQltYXBwaW5ncy5wYihtYXBwaW5nKTsKCQlyZXR1cm47Cgl9CgoJRk9SRVEoaSwxLE4pCgl7CgkJaWYgKGkgIT0gcG9zKQoJCXsKCQkJbWFwcGluZy5wYihpKTsKCQkJcmVjdXJzZShwb3MrMSwgTiwgbWFwcGluZyk7CgkJCW1hcHBpbmcucG9wX2JhY2soKTsKCQl9Cgl9Cn0KCmlubGluZSBpbnQgYmZzKGNvbnN0IHZlY3RvcjxpbnQ+ICZtYXBwaW5nLCBjb25zdCBpbnQgTikKewoJYm9vbCB2aXNpdGVkW04rMV07CglGT1JFUShpLDEsTikgeyB2aXNpdGVkW2ldID0gZmFsc2U7IH0KCWludCBjb2xvcm5bTisxXSwgY29sb3JzW04rMV07CglGT1JFUShpLDEsTikKCXsKCQljb2xvcm5baV0gPSAtMTsKCQljb2xvcnNbaV0gPSAwOwoJfQoJaW50IGNvbG9yID0gMTsKCglsaXN0PGludD4gcXVldWU7CglpbnQgbGVuID0gU1oobWFwcGluZyk7CglpZiAobGVuIDwgMSkge3JldHVybiAwO30KCUZPUihpLDAsbGVuKQoJewoJCWlmICghdmlzaXRlZFtpKzFdKQoJCXsKCQkJcXVldWUucGIoaSsxKTsKCQl9CgkJaWYgKCF2aXNpdGVkW21hcHBpbmdbaV1dKQoJCXsKCQkJcXVldWUucGIobWFwcGluZ1tpXSk7CgkJfQoKCQlib29sIGZsYWcgPSBmYWxzZTsKCQl3aGlsZSghcXVldWUuZW1wdHkoKSkKCQl7CgkJCWludCBlbGVtID0gcXVldWUuZnJvbnQoKTsKCQkJcXVldWUucG9wX2Zyb250KCk7CgkJCWlmICh2aXNpdGVkW2VsZW1dKSB7Y29udGludWU7fQoJCQljb2xvcm5bZWxlbV0gPSBjb2xvcjsKCQkJZmxhZyA9IHRydWU7CgkJCWNvbG9yc1tjb2xvcl0rKzsKCQkJdmlzaXRlZFtlbGVtXSA9IHRydWU7CgkJCUZPUihqLGkrMSxsZW4pCgkJCXsKCQkJCWlmIChlbGVtID09IChqKzEpICYmICF2aXNpdGVkW21hcHBpbmdbal1dKQoJCQkJewoJCQkJCXF1ZXVlLnBiKG1hcHBpbmdbal0pOwoJCQkJfQoJCQkJZWxzZSBpZiAoZWxlbSA9PSBtYXBwaW5nW2pdICYmICF2aXNpdGVkW2orMV0pCgkJCQl7CgkJCQkJcXVldWUucGIoaisxKTsKCQkJCX0KCQkJfQoJCX0KCQlpZiAoZmxhZykgeyBjb2xvcisrOyB9Cgl9CgoJLy8gcHJpbnRmKCJ7Iik7CgkvLyBGT1JFUShpLDEsTikKCS8vIHsKCS8vIAlwcmludGYoIiVkOiVkIiwgaSxjb2xvcm5baV0pOwoJLy8gCWlmIChpIDwgTikgeyBwcmludGYoIiwiKTsgfQoJLy8gfQoJLy8gcHJpbnRmKCJ9Iik7CgoJaW50IG1heF9zeiA9IDA7CgkvL3ByaW50ZigieyIpOwoJRk9SKGksMSxjb2xvcikKCXsKCS8vCXByaW50ZigiJWQ6JWQiLCBpLGNvbG9yc1tpXSk7CgkvLwlpZiAoaSA8IGNvbG9yLTEpIHsgcHJpbnRmKCIsIik7IH0KCQltYXhfc3ogPSBtYXgobWF4X3N6LCBjb2xvcnNbaV0pOwoJfQoJLy9wcmludGYoIn0iKTsKCXJldHVybiBtYXhfc3o7Cn0KCmludCBtYWluKCkKewoJRk9SRVEoTiw1LDUpLy8yLDkpCgl7CgkJbWFwcGluZ3MuY2xlYXIoKTsKCgkJbS5jbGVhcigpOwoJCXJlY3Vyc2UoMSwgTiwgbSk7CgoJCWludCBjbnRzW04rMV07CgkJRk9SRVEoaSwwLE4pIHsgY250c1tpXSA9IDA7IH0KCQlGT1JFQUNIKG1hcHBpbmdzLCBpdHIpCgkJewoJCQlpbnQgbGVuID0gU1ooKml0cik7CgkJCUZPUihpLDAsbGVuKQoJCQl7CgkJCS8vCXByaW50ZigiKCVkLCVkKSIsIGkrMSwoKml0cilbaV0pOwoJCQkJaWYgKGkgPCBsZW4tMSkKCQkJCXsKCQkJCS8vCXByaW50ZigiLCIpOwoJCQkJfQoJCQl9CgkJCWludCBjbnQgPSBiZnMoKml0ciwgTik7CgkJCWNudHNbY250XSsrOwoJCS8vCXByaW50ZigiOiAlZFxuIiwgY250KTsKCQl9CgoJCVVMTCBhbnNfdG9wID0gMFVMTDsKCQlzdHJpbmdzdHJlYW0gc3M7CgkJRk9SRVEoaSwxLE4pCgkJewoJCQlpZiAoY250c1tpXSA+IDApCgkJCXsKCQkJCXNzIDw8IGkgPDwgIjoiIDw8IGNudHNbaV0gPDwgIiwiOwoJCQkJYW5zX3RvcCArPSBpKmNudHNbaV07CgkJCX0KCQl9CgkJc3RyaW5nIHMgPSBzcy5zdHIoKTsKCQlzID0gcy5zdWJzdHIoMCwgU1oocyktMSk7CgoJCVVMTCBhbnNfYnRtID0gKFVMTClwb3coKE4tMSksTik7CgkJVUxMIGFuc19nY2QgPSBfX2djZChhbnNfdG9wLCBhbnNfYnRtKTsKCgkJcHJpbnRmKCJOPSVkOiB7JXN9ICVsbHUvJWxsdVxuIiwgTixzLmNfc3RyKCksYW5zX3RvcC9hbnNfZ2NkLGFuc19idG0vYW5zX2djZCk7CgkJZmZsdXNoKHN0ZG91dCk7Cgl9CglyZXR1cm4gMDsKfQo=