/**
* Problem : QTREE - Query on a tree
* Problem URL : https://w...content-available-to-author-only...j.com/problems/QTREE/
*/
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair < int, int >;
// This section is for Policy Based Data Structure, more precisely Ordered Set.
// All Functions of set works here, in addition we have order_of_key() and find_by_order() function. find_by_order() returns iterator
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include<functional>
using namespace __gnu_pbds;
// 1. Custom Set
template < class T, class COMP >
using custom_set = tree < T, null_type, COMP, rb_tree_tag, tree_order_statistics_node_update >;
// 2. Ordered Set
template < class T >
using ordered_set = tree < T, null_type, less < T >, rb_tree_tag, tree_order_statistics_node_update >;
// 3. Ordered Multi Set
// For storing multiple occurance of same value we need to use pair. In pair first value is our key and second is useless count variable.
// order_of_key(make_pair(key, 0)) returns first occurance of a value, order_of_key(make_pair(key, INT_MAX)) returns last occurance.
template < class T >
using ordered_multiset = tree < pair < T, int >, null_type, less < pair < T, int > >, rb_tree_tag, tree_order_statistics_node_update >;
// 4. Ordered Map
template < class T, class U >
using ordered_map = tree < T, U, less < T >, rb_tree_tag, tree_order_statistics_node_update >;
// Policy End
const int mx = 10005;
const int BITS = 14;
vector < pii > adj[mx];
pii edges[mx];
int SA[mx], ST[6 * mx];
int nodes[mx][5];
int edgeCount, currentChain, n, chainHeads[mx];
int tin[mx], tout[mx], up[mx][BITS], timer;
void addEdge (int id, int u, int v, int w) {
adj[u].emplace_back (v, id);
adj[v].emplace_back (u, id);
edges[id].first = w;
}
void dfs (int u, int p, int d) {
nodes[u][0] = p, nodes[u][1] = d, nodes[u][2] = 1;
tin[u] = timer++;
if (p == -1)
up[u][0] = u;
else
up[u][0] = p;
for (int i = 1; i < BITS; i++) {
up[u][i] = up[up[u][i - 1]][i - 1];
}
for (pii & pi : adj[u]) {
if (pi.first != p) {
dfs (pi.first, u, d + 1);
nodes[u][2]++;
edges[pi.second].second = pi.first;
}
}
tout[u] = timer;
}
void HLD (int u, int id) {
if (chainHeads[currentChain] == -1) {
chainHeads[currentChain] = u;
}
nodes[u][4] = currentChain;
nodes[u][3] = edgeCount;
SA[edgeCount++] = edges[id].first;
int sc = -1, si;
for (pii & pi : adj[u]) {
if (pi.first != nodes[u][0]) {
if (sc == -1 || nodes[sc][2] < nodes[pi.first][2]) {
sc = pi.first; si = pi.second;
}
}
}
if (sc != -1) {
HLD (sc, si);
}
for (pii & pi : adj[u]) {
if (pi.first != nodes[u][0] && pi.first != sc) {
currentChain++;
HLD (pi.first, pi.second);
}
}
}
bool is_ancestor (int u, int v) {
return tin[u] <= tin[v] && tout[u] >= tout[v];
}
int LCA (int u, int v) {
if (is_ancestor (u, v)) return u;
if (is_ancestor (v, u)) return v;
for (int i = BITS - 1; i >= 0; i--) {
if (!is_ancestor (up[u][i], v))
u = up[u][i];
}
return up[u][0];
}
void build (int low, int high, int pos) {
if (low == high) {
ST[pos] = SA[low];
return;
}
int mid = low + high;
mid >>= 1;
int pos1 = (pos << 1) + 1;
int pos2 = pos1 + 1;
build (low, mid, pos1);
build (mid + 1, high, pos2);
ST[pos] = ST[pos1] > ST[pos2] ? ST[pos1] : ST[pos2];
}
void updateUtil (int low, int high, int index, int value, int pos) {
if (low > index || high < index) return;
if (low == high) {
ST[pos] = value;
return;
}
int mid = low + high;
mid >>= 1;
int pos1 = (pos << 1) + 1;
int pos2 = pos1 + 1;
updateUtil (low, mid, index, value, pos1);
updateUtil (mid + 1, high, index, value, pos2);
ST[pos] = ST[pos1] > ST[pos2] ? ST[pos1] : ST[pos2];
}
void update (int id, int value) {
updateUtil (0, n - 1, nodes[edges[id].second][3], value, 0);
}
int queryUtil (int low, int high, int left, int right, int pos) {
if (left <= low && right >= high) return ST[pos];
if (left > high || low > right) return -1;
int mid = low + high;
mid >>= 1;
int pos1 = (pos << 1) + 1;
int pos2 = pos1 + 1;
int a = queryUtil (low, mid, left, right, pos1);
int b = queryUtil (mid + 1, high, left, right, pos2);
return a > b ? a : b;
}
int query (int left, int right) {
return queryUtil (0, n - 1, left, right, 0);
}
int crawlTree (int u, int v) {
int cu, cv = nodes[v][4], ans = 0;
while (true) {
cu = nodes[u][4];
if (cu == cv) {
if (u != v) {
int a = query (nodes[v][3] + 1, nodes[u][3]);
if (ans < a) ans = a;
}
break;
} else {
int a = query (nodes[chainHeads[cu]][3], nodes[u][3]);
if (ans < a) ans = a;
u = nodes[chainHeads[cu]][0];
}
}
return ans;
}
int maxEdge (int u, int v) {
int lca = LCA (u, v);
// cerr << "LCA (" << u + 1 << ", " << v + 1 << ") = " << lca + 1 << endl;
int a = crawlTree (u, lca);
int b = crawlTree (v, lca);
return a > b ? a : b;
}
void solve () {
scanf ("%d", &n);
/**
vector < pii > adj[mx];
pii edges[mx];
SegmentTree S;
TreeNode node[mx];
int edgeCount, currentChain, n, chainHeads[mx];
int tin[mx], tout[mx], up[mx][BITS];
*/
for (int i = 0; i < n; i++) {
adj[i].clear();
}
memset (chainHeads, -1, sizeof (chainHeads));
edgeCount = currentChain = timer = 0;
int u, v, w;
for (int i = 0; i < n - 1; i++) {
// cin >> u >> v >> w;
scanf ("%d %d %d", &u, &v, &w);
u--, v--;
addEdge (i, u, v, w);
}
int root = 0, p = -1, d = 0;
dfs (root, p, d);
edges[n - 1] = {-1, -1};
HLD (root, n - 1);
build (0, edgeCount - 1, 0);
// for (int i = 0; i < n; i++) {
// for (int j = 0; j < n; j++) {
// cerr << i << " -- " << j << " => " << maxEdge (i, j) << endl;
// }
// }
// for (int i = 0; i < n - 1; i++) {
// update (i, 1);
// }
// string s;
while (true) {
char s[10];
scanf ("%s", s);
// cin >> s;
if (s[0] == 'D') {
break;
}
if (s[0] == 'C') {
// cin >> u >> v;
scanf ("%d %d", &u, &v);
u--;
update (u, v);
} else {
// cin >> u >> v;
scanf ("%d %d", &u, &v);
u--, v--;
cout << maxEdge (u, v) << endl;
}
}
}
int main() {
// ios_base::sync_with_stdio (false);
// cin.tie (nullptr); cout.tie(nullptr);
int t = 1;
scanf ("%d", &t);
while (t--) {
solve();
}
return 0;
}
LyoqCiAqIFByb2JsZW0gOiBRVFJFRSAtIFF1ZXJ5IG9uIGEgdHJlZQogKiBQcm9ibGVtIFVSTCA6IGh0dHBzOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uai5jb20vcHJvYmxlbXMvUVRSRUUvCiAqLwoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwp1c2luZyBwaWkgPSBwYWlyIDwgaW50LCBpbnQgPjsKCi8vIFRoaXMgc2VjdGlvbiBpcyBmb3IgUG9saWN5IEJhc2VkIERhdGEgU3RydWN0dXJlLCBtb3JlIHByZWNpc2VseSBPcmRlcmVkIFNldC4KLy8gQWxsIEZ1bmN0aW9ucyBvZiBzZXQgd29ya3MgaGVyZSwgaW4gYWRkaXRpb24gd2UgaGF2ZSBvcmRlcl9vZl9rZXkoKSBhbmQgZmluZF9ieV9vcmRlcigpIGZ1bmN0aW9uLiBmaW5kX2J5X29yZGVyKCkgcmV0dXJucyBpdGVyYXRvcgojaW5jbHVkZTxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KI2luY2x1ZGU8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KI2luY2x1ZGU8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CgovLyAxLiBDdXN0b20gU2V0CnRlbXBsYXRlIDwgY2xhc3MgVCwgY2xhc3MgQ09NUCA+CnVzaW5nIGN1c3RvbV9zZXQgPSB0cmVlIDwgVCwgbnVsbF90eXBlLCBDT01QLCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlID47CgovLyAyLiBPcmRlcmVkIFNldAp0ZW1wbGF0ZSA8IGNsYXNzIFQgPgp1c2luZyBvcmRlcmVkX3NldCA9IHRyZWUgPCBULCBudWxsX3R5cGUsIGxlc3MgPCBUID4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGUgPjsKCi8vIDMuIE9yZGVyZWQgTXVsdGkgU2V0Ci8vIEZvciBzdG9yaW5nIG11bHRpcGxlIG9jY3VyYW5jZSBvZiBzYW1lIHZhbHVlIHdlIG5lZWQgdG8gdXNlIHBhaXIuIEluIHBhaXIgZmlyc3QgdmFsdWUgaXMgb3VyIGtleSBhbmQgc2Vjb25kIGlzIHVzZWxlc3MgY291bnQgdmFyaWFibGUuCi8vIG9yZGVyX29mX2tleShtYWtlX3BhaXIoa2V5LCAwKSkgcmV0dXJucyBmaXJzdCBvY2N1cmFuY2Ugb2YgYSB2YWx1ZSwgb3JkZXJfb2Zfa2V5KG1ha2VfcGFpcihrZXksIElOVF9NQVgpKSByZXR1cm5zIGxhc3Qgb2NjdXJhbmNlLgp0ZW1wbGF0ZSA8IGNsYXNzIFQgPgp1c2luZyBvcmRlcmVkX211bHRpc2V0ID0gdHJlZSA8IHBhaXIgPCBULCBpbnQgPiwgbnVsbF90eXBlLCBsZXNzIDwgcGFpciA8IFQsIGludCA+ID4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGUgPjsKCi8vIDQuIE9yZGVyZWQgTWFwCnRlbXBsYXRlIDwgY2xhc3MgVCwgY2xhc3MgVSA+CnVzaW5nIG9yZGVyZWRfbWFwID0gdHJlZSA8IFQsIFUsIGxlc3MgPCBUID4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGUgPjsKLy8gUG9saWN5IEVuZAoKY29uc3QgaW50IG14ID0gMTAwMDU7CmNvbnN0IGludCBCSVRTID0gMTQ7Cgp2ZWN0b3IgPCBwaWkgPiBhZGpbbXhdOwpwaWkgZWRnZXNbbXhdOwppbnQgU0FbbXhdLCBTVFs2ICogbXhdOwppbnQgbm9kZXNbbXhdWzVdOwppbnQgZWRnZUNvdW50LCBjdXJyZW50Q2hhaW4sIG4sIGNoYWluSGVhZHNbbXhdOwppbnQgdGluW214XSwgdG91dFtteF0sIHVwW214XVtCSVRTXSwgdGltZXI7Cgp2b2lkIGFkZEVkZ2UgKGludCBpZCwgaW50IHUsIGludCB2LCBpbnQgdykgewoJYWRqW3VdLmVtcGxhY2VfYmFjayAodiwgaWQpOwoJYWRqW3ZdLmVtcGxhY2VfYmFjayAodSwgaWQpOwoJZWRnZXNbaWRdLmZpcnN0ID0gdzsKfQoKdm9pZCBkZnMgKGludCB1LCBpbnQgcCwgaW50IGQpIHsKCW5vZGVzW3VdWzBdID0gcCwgbm9kZXNbdV1bMV0gPSBkLCBub2Rlc1t1XVsyXSA9IDE7Cgl0aW5bdV0gPSB0aW1lcisrOwoJaWYgKHAgPT0gLTEpCgkJdXBbdV1bMF0gPSB1OwoJZWxzZQoJCXVwW3VdWzBdID0gcDsKCWZvciAoaW50IGkgPSAxOyBpIDwgQklUUzsgaSsrKSB7CgkJdXBbdV1baV0gPSB1cFt1cFt1XVtpIC0gMV1dW2kgLSAxXTsKCX0KCWZvciAocGlpICYgcGkgOiBhZGpbdV0pIHsKCQlpZiAocGkuZmlyc3QgIT0gcCkgewoJCQlkZnMgKHBpLmZpcnN0LCB1LCBkICsgMSk7CgkJCW5vZGVzW3VdWzJdKys7CgkJCWVkZ2VzW3BpLnNlY29uZF0uc2Vjb25kID0gcGkuZmlyc3Q7CgkJfQoJfQoJdG91dFt1XSA9IHRpbWVyOwp9Cgp2b2lkIEhMRCAoaW50IHUsIGludCBpZCkgewoJaWYgKGNoYWluSGVhZHNbY3VycmVudENoYWluXSA9PSAtMSkgewoJCWNoYWluSGVhZHNbY3VycmVudENoYWluXSA9IHU7Cgl9Cglub2Rlc1t1XVs0XSA9IGN1cnJlbnRDaGFpbjsKCW5vZGVzW3VdWzNdID0gZWRnZUNvdW50OwoJU0FbZWRnZUNvdW50KytdID0gZWRnZXNbaWRdLmZpcnN0OwoJaW50IHNjID0gLTEsIHNpOwoJZm9yIChwaWkgJiBwaSA6IGFkalt1XSkgewoJCWlmIChwaS5maXJzdCAhPSBub2Rlc1t1XVswXSkgewoJCQlpZiAoc2MgPT0gLTEgfHwgbm9kZXNbc2NdWzJdIDwgbm9kZXNbcGkuZmlyc3RdWzJdKSB7CgkJCQlzYyA9IHBpLmZpcnN0OyBzaSA9IHBpLnNlY29uZDsKCQkJfQoJCX0KCX0KCWlmIChzYyAhPSAtMSkgewoJCUhMRCAoc2MsIHNpKTsKCX0KCQoJZm9yIChwaWkgJiBwaSA6IGFkalt1XSkgewoJCWlmIChwaS5maXJzdCAhPSBub2Rlc1t1XVswXSAmJiBwaS5maXJzdCAhPSBzYykgewoJCQljdXJyZW50Q2hhaW4rKzsKCQkJSExEIChwaS5maXJzdCwgcGkuc2Vjb25kKTsKCQl9Cgl9Cn0KCmJvb2wgaXNfYW5jZXN0b3IgKGludCB1LCBpbnQgdikgewoJcmV0dXJuIHRpblt1XSA8PSB0aW5bdl0gJiYgdG91dFt1XSA+PSB0b3V0W3ZdOwp9CgppbnQgTENBIChpbnQgdSwgaW50IHYpIHsKCWlmIChpc19hbmNlc3RvciAodSwgdikpIHJldHVybiB1OwoJaWYgKGlzX2FuY2VzdG9yICh2LCB1KSkgcmV0dXJuIHY7Cglmb3IgKGludCBpID0gQklUUyAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJaWYgKCFpc19hbmNlc3RvciAodXBbdV1baV0sIHYpKQoJCQl1ID0gdXBbdV1baV07Cgl9CglyZXR1cm4gdXBbdV1bMF07Cn0KCnZvaWQgYnVpbGQgKGludCBsb3csIGludCBoaWdoLCBpbnQgcG9zKSB7CglpZiAobG93ID09IGhpZ2gpIHsKCQlTVFtwb3NdID0gU0FbbG93XTsKCQlyZXR1cm47Cgl9CglpbnQgbWlkID0gbG93ICsgaGlnaDsKCW1pZCA+Pj0gMTsKCWludCBwb3MxID0gKHBvcyA8PCAxKSArIDE7CglpbnQgcG9zMiA9IHBvczEgKyAxOwoJYnVpbGQgKGxvdywgbWlkLCBwb3MxKTsKCWJ1aWxkIChtaWQgKyAxLCBoaWdoLCBwb3MyKTsKCVNUW3Bvc10gPSBTVFtwb3MxXSA+IFNUW3BvczJdID8gU1RbcG9zMV0gOiBTVFtwb3MyXTsKfQoKdm9pZCB1cGRhdGVVdGlsIChpbnQgbG93LCBpbnQgaGlnaCwgaW50IGluZGV4LCBpbnQgdmFsdWUsIGludCBwb3MpIHsKCWlmIChsb3cgPiBpbmRleCB8fCBoaWdoIDwgaW5kZXgpIHJldHVybjsJCglpZiAobG93ID09IGhpZ2gpIHsKCQlTVFtwb3NdID0gdmFsdWU7CgkJcmV0dXJuOwoJfQoJaW50IG1pZCA9IGxvdyArIGhpZ2g7CgltaWQgPj49IDE7CglpbnQgcG9zMSA9IChwb3MgPDwgMSkgICsgMTsKCWludCBwb3MyID0gcG9zMSArIDE7Cgl1cGRhdGVVdGlsIChsb3csIG1pZCwgaW5kZXgsIHZhbHVlLCBwb3MxKTsKCXVwZGF0ZVV0aWwgKG1pZCArIDEsIGhpZ2gsIGluZGV4LCB2YWx1ZSwgcG9zMik7CglTVFtwb3NdID0gU1RbcG9zMV0gPiBTVFtwb3MyXSA/IFNUW3BvczFdIDogU1RbcG9zMl07Cn0KCnZvaWQgdXBkYXRlIChpbnQgaWQsIGludCB2YWx1ZSkgewoJdXBkYXRlVXRpbCAoMCwgbiAtIDEsIG5vZGVzW2VkZ2VzW2lkXS5zZWNvbmRdWzNdLCB2YWx1ZSwgMCk7Cn0KCmludCBxdWVyeVV0aWwgKGludCBsb3csIGludCBoaWdoLCBpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgcG9zKSB7CglpZiAobGVmdCA8PSBsb3cgJiYgcmlnaHQgPj0gaGlnaCkgcmV0dXJuIFNUW3Bvc107CglpZiAobGVmdCA+IGhpZ2ggfHwgbG93ID4gcmlnaHQpIHJldHVybiAtMTsKCWludCBtaWQgPSBsb3cgKyBoaWdoOwoJbWlkID4+PSAxOwoJaW50IHBvczEgPSAocG9zIDw8IDEpICArIDE7CglpbnQgcG9zMiA9IHBvczEgKyAxOwoJaW50IGEgPSBxdWVyeVV0aWwgKGxvdywgbWlkLCBsZWZ0LCByaWdodCwgcG9zMSk7CglpbnQgYiA9IHF1ZXJ5VXRpbCAobWlkICsgMSwgaGlnaCwgbGVmdCwgcmlnaHQsIHBvczIpOwoJcmV0dXJuIGEgPiBiID8gYSA6IGI7Cn0KCmludCBxdWVyeSAoaW50IGxlZnQsIGludCByaWdodCkgewoJcmV0dXJuIHF1ZXJ5VXRpbCAoMCwgbiAtIDEsIGxlZnQsIHJpZ2h0LCAwKTsKfQoKaW50IGNyYXdsVHJlZSAoaW50IHUsIGludCB2KSB7CglpbnQgY3UsIGN2ID0gbm9kZXNbdl1bNF0sIGFucyA9IDA7Cgl3aGlsZSAodHJ1ZSkgewoJCWN1ID0gbm9kZXNbdV1bNF07CgkJaWYgKGN1ID09IGN2KSB7CgkJCWlmICh1ICE9IHYpIHsKCQkJCWludCBhID0gcXVlcnkgKG5vZGVzW3ZdWzNdICsgMSwgbm9kZXNbdV1bM10pOwoJCQkJaWYgKGFucyA8IGEpIGFucyA9IGE7CgkJCX0KCQkJYnJlYWs7CgkJfSBlbHNlIHsKCQkJaW50IGEgPSBxdWVyeSAobm9kZXNbY2hhaW5IZWFkc1tjdV1dWzNdLCBub2Rlc1t1XVszXSk7CgkJCWlmIChhbnMgPCBhKSBhbnMgPSBhOwoJCQl1ID0gbm9kZXNbY2hhaW5IZWFkc1tjdV1dWzBdOwoJCX0KCX0KCXJldHVybiBhbnM7Cn0KCmludCBtYXhFZGdlIChpbnQgdSwgaW50IHYpIHsKCWludCBsY2EgPSBMQ0EgKHUsIHYpOwoJLy8gY2VyciA8PCAiTENBICgiIDw8IHUgKyAxIDw8ICIsICIgPDwgdiArIDEgPDwgIikgPSAiIDw8IGxjYSArIDEgPDwgZW5kbDsKCWludCBhID0gY3Jhd2xUcmVlICh1LCBsY2EpOwoJaW50IGIgPSBjcmF3bFRyZWUgKHYsIGxjYSk7CglyZXR1cm4gYSA+IGIgPyBhIDogYjsKfQoKdm9pZCBzb2x2ZSAoKSB7CglzY2FuZiAoIiVkIiwgJm4pOwoJLyoqCgkJdmVjdG9yIDwgcGlpID4gYWRqW214XTsKCQlwaWkgZWRnZXNbbXhdOwoJCVNlZ21lbnRUcmVlIFM7CgkJVHJlZU5vZGUgbm9kZVtteF07CgkJaW50IGVkZ2VDb3VudCwgY3VycmVudENoYWluLCBuLCBjaGFpbkhlYWRzW214XTsKCQlpbnQgdGluW214XSwgdG91dFtteF0sIHVwW214XVtCSVRTXTsKCSovCglmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewoJCWFkaltpXS5jbGVhcigpOwoJfQoJbWVtc2V0IChjaGFpbkhlYWRzLCAtMSwgc2l6ZW9mIChjaGFpbkhlYWRzKSk7CgllZGdlQ291bnQgPSBjdXJyZW50Q2hhaW4gPSB0aW1lciA9IDA7CglpbnQgdSwgdiwgdzsKCWZvciAoaW50IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykgewoJCS8vIGNpbiA+PiB1ID4+IHYgPj4gdzsKCQlzY2FuZiAoIiVkICVkICVkIiwgJnUsICZ2LCAmdyk7CgkJdS0tLCB2LS07CgkJYWRkRWRnZSAoaSwgdSwgdiwgdyk7Cgl9CglpbnQgcm9vdCA9IDAsIHAgPSAtMSwgZCA9IDA7CglkZnMgKHJvb3QsIHAsIGQpOwoJZWRnZXNbbiAtIDFdID0gey0xLCAtMX07CglITEQgKHJvb3QsIG4gLSAxKTsKCWJ1aWxkICgwLCBlZGdlQ291bnQgLSAxLCAwKTsKCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJLy8gZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKCQkJLy8gY2VyciA8PCBpIDw8ICIgLS0gIiA8PCBqIDw8ICIgPT4gIiA8PCBtYXhFZGdlIChpLCBqKSA8PCBlbmRsOwoJCS8vIH0KCS8vIH0KCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykgewoJCS8vIHVwZGF0ZSAoaSwgMSk7CgkvLyB9CgkvLyBzdHJpbmcgczsKCXdoaWxlICh0cnVlKSB7CgkJY2hhciBzWzEwXTsKCQlzY2FuZiAoIiVzIiwgcyk7CgkJLy8gY2luID4+IHM7CgkJaWYgKHNbMF0gPT0gJ0QnKSB7CgkJCWJyZWFrOwoJCX0KCQlpZiAoc1swXSA9PSAnQycpIHsKCQkJLy8gY2luID4+IHUgPj4gdjsKCQkJc2NhbmYgKCIlZCAlZCIsICZ1LCAmdik7CgkJCXUtLTsKCQkJdXBkYXRlICh1LCB2KTsKCQl9IGVsc2UgewoJCQkvLyBjaW4gPj4gdSA+PiB2OwoJCQlzY2FuZiAoIiVkICVkIiwgJnUsICZ2KTsKCQkJdS0tLCB2LS07CgkJCWNvdXQgPDwgbWF4RWRnZSAodSwgdikgPDwgZW5kbDsKCQl9Cgl9Cn0KCmludCBtYWluKCkgewoJLy8gaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyAoZmFsc2UpOwoJLy8gY2luLnRpZSAobnVsbHB0cik7IGNvdXQudGllKG51bGxwdHIpOwoJaW50IHQgPSAxOwoJc2NhbmYgKCIlZCIsICZ0KTsKCXdoaWxlICh0LS0pIHsKCQlzb2x2ZSgpOwoJfQoJcmV0dXJuIDA7Cn0KCg==