# include <bits/stdc++.h>
using namespace std;
const int MAX = 1001;
int V;
int row, col;
int A[MAX][MAX];
int row_type[MAX], col_type[MAX];
void Ask(int x, int y) {
if (A[x][y]) {
return;
}
printf("1 %d %d\n", x, y);
fflush(stdout);
scanf("%d", &A[x][y]);
if (A[x][y] == V) {
// Solution found.
printf("2 %d %d\n", x, y);
exit(0);
}
}
void SolveSubRectangle(int i1, int j1, int i2, int j2) {
// The sub-rectangle has a special property. All rows are either increasing
// or decreasing. Similarly, all columns are increasing or decreasing. For
// details see the fucntions which call them and see the condition when it
// was called.
// Using the above property, ask atmost "n" questions to find if "V" exists
// in this sub-rectangle.
// The general strategy is to always ask the value present at almost
// greatest cell. This almost greatest cell should have the property that we
// can either eliminate a complete row or column after looking at this value.
// This will help us perform atmost "n" queries. For details, refer to the
// explanation of first case below. Others follow similarly. We know that
// the its index as the sorting order of rows and columns is known. If that
// value is less than "V", we either increase/decrease only row or column
// index or we increase/decrease both the index of row and column. If at any
// moment the indices are out of bounds of the subrectangle we exit.
int i, j;
if (row_type[i1] == 1) {
if (col_type[j2] == 1) {
// All rows and columns are increasing.
// We start with cell (i1, j2). If this cell is greater than "V",
// then we need to go to previous column as rows are increasing.
// If this value was smaller we must go to next row as columns are
// increasing. We should also try to increase the column index if
// possible as it will help us eliminate that full column or row in
// next iteration.
i = i1; j = j2;
while (i <= i2) {
Ask(i, j);
if (V < A[i][j]) {
if (--j < j1) return;
} else {
if (j < j2) j++;
if (++i > i2) return;
}
}
} else {
// All rows are increasing and columns are decreasing.
i = i2; j = j2;
while (i >= i1) {
Ask(i, j);
if (V < A[i][j]) {
if (--j < j1) return;
} else {
if (j < j2) j++;
if (--i < i1) return;
}
}
}
} else {
if (col_type[j2] == 1) {
// All rows are increasing and columns are decreasing.
i = i1; j = j1;
while (i <= i2) {
Ask(i, j);
if (V < A[i][j]) {
if (++j > j2) return;
} else {
if (j > j1) j--;
if (++i > i2) return;
}
}
} else {
// All rows and columns are decreasing.
i = i2; j = j1;
while (i >= i1) {
Ask(i, j);
if (V < A[i][j]) {
if (++j > j2) return;
} else {
if (j > j1) j--;
if (--i < i1) return;
}
}
}
}
}
void Resi2x2AA(int n, int i1, int j1) {
// Find subrectangles to ignore and what to query for solution.
// Refer to editorial images for how to ignore subrectangles.
int i, j;
int can[2][2] = {{1,1},{1,1}};
if (V > A[i1-1][j1-1]) {
can[0][0] = 0;
} else {
can[0][1] = can[1][0] = 0;
}
if (V > A[i1][j1]) {
can[1][1] = 0;
} else {
can[0][1] = can[1][0] = 0;
}
if (can[0][0]) {
SolveSubRectangle(1, 1, i1-1, j1-1);
}
if (can[0][1]) {
SolveSubRectangle(1, j1, i1-1, n);
}
if (can[1][0]) {
SolveSubRectangle(i1, 1, n, j1-1);
}
if (can[1][1]) {
SolveSubRectangle(i1, j1, n, n);
}
}
void Resi2x2BB(int n, int i1, int j1) {
// Find subrectangles to ignore and what to query for solution.
// Refer to editorial images for how to ignore subrectangles.
int i, j;
int can[2][2] = {{1,1},{1,1}};
if (V < A[i1-1][j1-1]) {
can[0][0] = 0;
} else {
can[0][1] = can[1][0] = 0;
}
if (V < A[i1][j1]) {
can[1][1] = 0;
} else {
can[0][1] = can[1][0] = 0;
}
if (can[0][0]) {
SolveSubRectangle(1, 1, i1-1, j1-1);
}
if (can[0][1]) {
SolveSubRectangle(1, j1, i1-1, n);
}
if (can[1][0]) {
SolveSubRectangle(i1, 1, n, j1-1);
}
if (can[1][1]) {
SolveSubRectangle(i1, j1, n, n);
}
}
void Resi2x2(int n) {
// Find the value at the 4 most important points i.e where rows and
// columns change their type.
int i, j, i1, j1, i2, j2;
i1 = 1; j1 = 1;
while (row_type[i1] == row_type[1]) i1++;
while (col_type[j1] == col_type[1]) j1++;
// Rows partition: [1, i1-1] and [i1, n]
// Columns partition: [1, j1-1] and [j1, n]
for(int x=i1; x<=n; ++x) {
assert(row_type[i1] == row_type[x]);
}
for(int y=j1; y<=n; ++y) {
assert(col_type[j1] == col_type[y]);
}
Ask(i1-1, j1-1);
Ask(i1-1, j1);
Ask(i1, j1-1);
Ask(i1, j1);
if ((row_type[1] == 1) && (col_type[1] == 1)) {
Resi2x2AA(n, i1, j1);
}
if ((row_type[1] == -1) && (col_type[1] == -1)) {
Resi2x2BB(n, i1, j1);
}
}
void SolveColumn(int n) {
// Ask atmost "n" queries to identify which sub-rectangle is a possible
// candidate to contain "V".
// Worst case: rows are alternating increasing and decreasing or vice-versa.
int found = 0;
int i, j, i1, i2;
i2 = 1;
while (i2 <= n) {
i1 = i2;
while ((i2 <= n) && (row_type[i2] == row_type[i1])) i2++;
// All rows from [i1, i2-1] are either inncreasing or decreasing.
// Based on whether rows are increasing or decreasing, select the column
// which will have the maximum element for every row. It can be
// either row "1" or "n". If for that column and row range, the
// numbers have "V" in their range, we have found a valid sub-rectangle
// which is the possible candidate to contain "V". Note that since we
// are iterating over rows in increasing order and not doing a binary
// search. So, if the previous rows were ignored, it means their value
// was either less or greater than "V". So, only the other condition is
// required to be checked.
if (col_type[1] == 1) {
// All columns are increasing.
if (row_type[i1] == -1) {
// Current set of rows are decreasing.
Ask(i2-1, 1);
if (V <= A[i2-1][1]) {
found = 1; break;
}
} else {
// Current set of rows are increasing.
Ask(i2-1, n);
if (V <= A[i2-1][n]) {
found = 1; break;
}
}
} else {
// All columns are decreasing.
if (row_type[i1] == -1) {
// Current set of rows are decreasing.
Ask(i2-1, n);
if (V >= A[i2-1][n]) {
found = 1; break;
}
} else {
// Current set of rows are increasing.
Ask(i2-1, 1);
if (V >= A[i2-1][1]) {
found = 1; break;
}
}
}
}
if (found) {
// "i2" is decremented as the valid range was [i1, i2-1] as explained
// before.
i2--;
SolveSubRectangle(i1, 1, i2, n);
}
}
void SolveRow(int n) {
// Ask atmost "n" queries to identify which sub-rectangle is a possible
// candidate to contain "V".
// Worst case: columns are alternating increasing or decreasing or
// vice-versa.
int found = 0;
int i, j, j1, j2;
j2 = 1;
while (j2 <= n) {
j1 = j2;
while ((j2 <= n) && (col_type[j2] == col_type[j1])) j2++;
// All columns are [j1, j2-1] are either increasing or decreasing.
// Based on whether columns are increasing or decreasing, select the row
// which will have the maximum element for every column. It can be
// either column "1" or "n". If for that row and column range, the
// numbers have "V" in their range, we have found a valid sub-rectangle
// which is the possible candidate to contain "V". Note that since we
// are iterating over columns in increasing order and not doing a binary
// search. So, if the previous columns were ignored, it means their value
// was either less or greater than "V". So, only the other condition is
// required to be checked.
if (row_type[1] == 1) {
// All rows are increasing.
if (col_type[j1] == -1) {
// Current set of columns are decreasing.
Ask(1, j2-1);
if (V <= A[1][j2-1]) {
found = 1; break;
}
} else {
// Current set of columns are increasing.
Ask(n, j2-1);
if (V <= A[n][j2-1]) {
found = 1; break;
}
}
} else {
// All rows are decreasing.
if (col_type[j1] == -1) {
// Current set of columns are decreasing.
Ask(n, j2-1);
if (V >= A[n][j2-1]) {
found = 1; break;
}
} else {
// Current set of columns are increasing.
Ask(1, j2-1);
if (V >= A[1][j2-1]) {
found = 1; break;
}
}
}
}
if (found) {
// "j2" is decremented as the valid range was [j1, j2-1] as explained
// before.
j2--;
SolveSubRectangle(1, j1, n, j2);
}
}
void Solve(int n, int k) {
// Ask "2n" queries to identify type of every row and column.
// Use help of diagonal element and its neighbour.
Ask(1, 1);
Ask(1, 2);
if (A[1][1] < A[1][2]) row_type[1] = 1; else row_type[1] = -1;
for (int i = 2; i < n; i++) {
Ask(i, i);
Ask(i, i+1);
if (A[i][i] < A[i][i+1]) row_type[i] = 1; else row_type[i] = -1;
if (A[i-1][i] < A[i][i]) col_type[i] = 1; else col_type[i] = -1;
}
Ask(n, n);
Ask(n, 1);
if (A[n][1] < A[n][n]) row_type[n] = 1; else row_type[n] = -1;
if (A[1][1] < A[n][1]) col_type[1] = 1; else col_type[1] = -1;
if (A[n-1][n] < A[n][n]) col_type[n] = 1; else col_type[n] = -1;
row = col = 0;
for (int i = 2; i <= n; i++) {
if (row_type[i-1] != row_type[i]) row++;
if (col_type[i-1] != col_type[i]) col++;
}
if (row == 0) {
// All rows are increasing or decreasing.
SolveRow(n);
} else if (col == 0) {
// All columns are increasing or decreasing.
SolveColumn(n);
} else {
// Initial set of rows are of one type and rest of another type.
// Initial set of columns are one type and rest of another type.
assert(row == 1);
assert(col == 1);
Resi2x2(n);
}
}
int main() {
int n, k;
scanf("%d%d%d",&n, &k, &V);
Solve(n,k);
printf("2 -1 -1\n");
fflush(stdout);
return 0;
}
IyBpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE1BWCA9IDEwMDE7CgppbnQgVjsKaW50IHJvdywgY29sOwppbnQgQVtNQVhdW01BWF07CmludCByb3dfdHlwZVtNQVhdLCBjb2xfdHlwZVtNQVhdOwoKdm9pZCBBc2soaW50IHgsIGludCB5KSB7CglpZiAoQVt4XVt5XSkgewoJCXJldHVybjsKCX0KCXByaW50ZigiMSAlZCAlZFxuIiwgeCwgeSk7CglmZmx1c2goc3Rkb3V0KTsKCXNjYW5mKCIlZCIsICZBW3hdW3ldKTsKCWlmIChBW3hdW3ldID09IFYpIHsKCQkvLyBTb2x1dGlvbiBmb3VuZC4KCQlwcmludGYoIjIgJWQgJWRcbiIsIHgsIHkpOwoJCWV4aXQoMCk7Cgl9Cn0KCnZvaWQgU29sdmVTdWJSZWN0YW5nbGUoaW50IGkxLCBpbnQgajEsIGludCBpMiwgaW50IGoyKSB7CgkvLyBUaGUgc3ViLXJlY3RhbmdsZSBoYXMgYSBzcGVjaWFsIHByb3BlcnR5LiBBbGwgcm93cyBhcmUgZWl0aGVyIGluY3JlYXNpbmcKCS8vIG9yIGRlY3JlYXNpbmcuIFNpbWlsYXJseSwgYWxsIGNvbHVtbnMgYXJlIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZy4gRm9yCgkvLyBkZXRhaWxzIHNlZSB0aGUgZnVjbnRpb25zIHdoaWNoIGNhbGwgdGhlbSBhbmQgc2VlIHRoZSBjb25kaXRpb24gd2hlbiBpdAoJLy8gd2FzIGNhbGxlZC4KCS8vIFVzaW5nIHRoZSBhYm92ZSBwcm9wZXJ0eSwgYXNrIGF0bW9zdCAibiIgcXVlc3Rpb25zIHRvIGZpbmQgaWYgIlYiIGV4aXN0cwoJLy8gaW4gdGhpcyBzdWItcmVjdGFuZ2xlLgoJLy8gVGhlIGdlbmVyYWwgc3RyYXRlZ3kgaXMgdG8gYWx3YXlzIGFzayB0aGUgdmFsdWUgcHJlc2VudCBhdCBhbG1vc3QKCS8vIGdyZWF0ZXN0IGNlbGwuIFRoaXMgYWxtb3N0IGdyZWF0ZXN0IGNlbGwgc2hvdWxkIGhhdmUgdGhlIHByb3BlcnR5IHRoYXQgd2UKCS8vIGNhbiBlaXRoZXIgZWxpbWluYXRlIGEgY29tcGxldGUgcm93IG9yIGNvbHVtbiBhZnRlciBsb29raW5nIGF0IHRoaXMgdmFsdWUuCgkvLyBUaGlzIHdpbGwgaGVscCB1cyBwZXJmb3JtIGF0bW9zdCAibiIgcXVlcmllcy4gRm9yIGRldGFpbHMsIHJlZmVyIHRvIHRoZQoJLy8gZXhwbGFuYXRpb24gb2YgZmlyc3QgY2FzZSBiZWxvdy4gT3RoZXJzIGZvbGxvdyBzaW1pbGFybHkuIFdlIGtub3cgdGhhdAoJLy8gdGhlIGl0cyBpbmRleCBhcyB0aGUgc29ydGluZyBvcmRlciBvZiByb3dzIGFuZCBjb2x1bW5zIGlzIGtub3duLiBJZiB0aGF0CgkvLyB2YWx1ZSBpcyBsZXNzIHRoYW4gIlYiLCB3ZSBlaXRoZXIgaW5jcmVhc2UvZGVjcmVhc2Ugb25seSByb3cgb3IgY29sdW1uCgkvLyBpbmRleCBvciB3ZSBpbmNyZWFzZS9kZWNyZWFzZSBib3RoIHRoZSBpbmRleCBvZiByb3cgYW5kIGNvbHVtbi4gSWYgYXQgYW55CgkvLyBtb21lbnQgdGhlIGluZGljZXMgYXJlIG91dCBvZiBib3VuZHMgb2YgdGhlIHN1YnJlY3RhbmdsZSB3ZSBleGl0LgoJaW50IGksIGo7CglpZiAocm93X3R5cGVbaTFdID09IDEpIHsKCQlpZiAoY29sX3R5cGVbajJdID09IDEpIHsKCQkJLy8gQWxsIHJvd3MgYW5kIGNvbHVtbnMgYXJlIGluY3JlYXNpbmcuCgkJCS8vIFdlIHN0YXJ0IHdpdGggY2VsbCAoaTEsIGoyKS4gSWYgdGhpcyBjZWxsIGlzIGdyZWF0ZXIgdGhhbiAiViIsCgkJCS8vIHRoZW4gd2UgbmVlZCB0byBnbyB0byBwcmV2aW91cyBjb2x1bW4gYXMgcm93cyBhcmUgaW5jcmVhc2luZy4KCQkJLy8gSWYgdGhpcyB2YWx1ZSB3YXMgc21hbGxlciB3ZSBtdXN0IGdvIHRvIG5leHQgcm93IGFzIGNvbHVtbnMgYXJlCgkJCS8vIGluY3JlYXNpbmcuIFdlIHNob3VsZCBhbHNvIHRyeSB0byBpbmNyZWFzZSB0aGUgY29sdW1uIGluZGV4IGlmCgkJCS8vIHBvc3NpYmxlIGFzIGl0IHdpbGwgaGVscCB1cyBlbGltaW5hdGUgdGhhdCBmdWxsIGNvbHVtbiBvciByb3cgaW4KCQkJLy8gbmV4dCBpdGVyYXRpb24uCgkJCWkgPSBpMTsgaiA9IGoyOwoJCQl3aGlsZSAoaSA8PSBpMikgewoJCQkJQXNrKGksIGopOwoJCQkJaWYgKFYgPCBBW2ldW2pdKSB7CgkJCQkJaWYgKC0taiA8IGoxKSByZXR1cm47CgkJCQl9IGVsc2UgewoJCQkJCWlmIChqIDwgajIpIGorKzsKCQkJCQlpZiAoKytpID4gaTIpIHJldHVybjsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCS8vIEFsbCByb3dzIGFyZSBpbmNyZWFzaW5nIGFuZCBjb2x1bW5zIGFyZSBkZWNyZWFzaW5nLgoJCQlpID0gaTI7IGogPSBqMjsKCQkJd2hpbGUgKGkgPj0gaTEpIHsKCQkJCUFzayhpLCBqKTsKCQkJCWlmIChWIDwgQVtpXVtqXSkgewoJCQkJCWlmICgtLWogPCBqMSkgcmV0dXJuOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoaiA8IGoyKSBqKys7CgkJCQkJaWYgKC0taSA8IGkxKSByZXR1cm47CgkJCQl9CgkJCX0KCQl9Cgl9IGVsc2UgewoJCWlmIChjb2xfdHlwZVtqMl0gPT0gMSkgewoJCQkvLyBBbGwgcm93cyBhcmUgaW5jcmVhc2luZyBhbmQgY29sdW1ucyBhcmUgZGVjcmVhc2luZy4KCQkJaSA9IGkxOyBqID0gajE7CgkJCXdoaWxlIChpIDw9IGkyKSB7CgkJCQlBc2soaSwgaik7CgkJCQlpZiAoViA8IEFbaV1bal0pIHsKCQkJCQlpZiAoKytqID4gajIpIHJldHVybjsKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKGogPiBqMSkgai0tOwoJCQkJCWlmICgrK2kgPiBpMikgcmV0dXJuOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gQWxsIHJvd3MgYW5kIGNvbHVtbnMgYXJlIGRlY3JlYXNpbmcuCgkJCWkgPSBpMjsgaiA9IGoxOwoJCQl3aGlsZSAoaSA+PSBpMSkgewoJCQkJQXNrKGksIGopOwoJCQkJaWYgKFYgPCBBW2ldW2pdKSB7CgkJCQkJaWYgKCsraiA+IGoyKSByZXR1cm47CgkJCQl9IGVsc2UgewoJCQkJCWlmIChqID4gajEpIGotLTsKCQkJCQlpZiAoLS1pIDwgaTEpIHJldHVybjsKCQkJCX0KCQkJfQoJCX0KCX0KfQoKdm9pZCBSZXNpMngyQUEoaW50IG4sIGludCBpMSwgaW50IGoxKSB7CgkvLyBGaW5kIHN1YnJlY3RhbmdsZXMgdG8gaWdub3JlIGFuZCB3aGF0IHRvIHF1ZXJ5IGZvciBzb2x1dGlvbi4KCS8vIFJlZmVyIHRvIGVkaXRvcmlhbCBpbWFnZXMgZm9yIGhvdyB0byBpZ25vcmUgc3VicmVjdGFuZ2xlcy4KCWludCBpLCBqOwoJaW50IGNhblsyXVsyXSA9IHt7MSwxfSx7MSwxfX07CglpZiAoViA+IEFbaTEtMV1bajEtMV0pIHsKCQljYW5bMF1bMF0gPSAwOwoJfSBlbHNlIHsKCQljYW5bMF1bMV0gPSBjYW5bMV1bMF0gPSAwOwoJfQoJaWYgKFYgPiBBW2kxXVtqMV0pIHsKCQljYW5bMV1bMV0gPSAwOwoJfSBlbHNlIHsKCQljYW5bMF1bMV0gPSBjYW5bMV1bMF0gPSAwOwoJfQoJaWYgKGNhblswXVswXSkgewoJCVNvbHZlU3ViUmVjdGFuZ2xlKDEsIDEsIGkxLTEsIGoxLTEpOwoJfQoJaWYgKGNhblswXVsxXSkgewoJCVNvbHZlU3ViUmVjdGFuZ2xlKDEsIGoxLCBpMS0xLCBuKTsKCX0KCWlmIChjYW5bMV1bMF0pIHsKCQlTb2x2ZVN1YlJlY3RhbmdsZShpMSwgMSwgbiwgajEtMSk7Cgl9CglpZiAoY2FuWzFdWzFdKSB7CgkJU29sdmVTdWJSZWN0YW5nbGUoaTEsIGoxLCBuLCBuKTsKCX0KfQoKCnZvaWQgUmVzaTJ4MkJCKGludCBuLCBpbnQgaTEsIGludCBqMSkgewoJLy8gRmluZCBzdWJyZWN0YW5nbGVzIHRvIGlnbm9yZSBhbmQgd2hhdCB0byBxdWVyeSBmb3Igc29sdXRpb24uCgkvLyBSZWZlciB0byBlZGl0b3JpYWwgaW1hZ2VzIGZvciBob3cgdG8gaWdub3JlIHN1YnJlY3RhbmdsZXMuCglpbnQgaSwgajsKCWludCBjYW5bMl1bMl0gPSB7ezEsMX0sezEsMX19OwoJaWYgKFYgPCBBW2kxLTFdW2oxLTFdKSB7CgkJY2FuWzBdWzBdID0gMDsKCX0gZWxzZSB7CgkJY2FuWzBdWzFdID0gY2FuWzFdWzBdID0gMDsKCX0KCWlmIChWIDwgQVtpMV1bajFdKSB7CgkJY2FuWzFdWzFdID0gMDsKCX0gZWxzZSB7CgkJY2FuWzBdWzFdID0gY2FuWzFdWzBdID0gMDsKCX0KCWlmIChjYW5bMF1bMF0pIHsKCQlTb2x2ZVN1YlJlY3RhbmdsZSgxLCAxLCBpMS0xLCBqMS0xKTsKCX0KCWlmIChjYW5bMF1bMV0pIHsKCQlTb2x2ZVN1YlJlY3RhbmdsZSgxLCBqMSwgaTEtMSwgbik7Cgl9CglpZiAoY2FuWzFdWzBdKSB7CgkJU29sdmVTdWJSZWN0YW5nbGUoaTEsIDEsIG4sIGoxLTEpOwoJfQoJaWYgKGNhblsxXVsxXSkgewoJCVNvbHZlU3ViUmVjdGFuZ2xlKGkxLCBqMSwgbiwgbik7Cgl9Cn0KCnZvaWQgUmVzaTJ4MihpbnQgbikgewoJLy8gRmluZCB0aGUgdmFsdWUgYXQgdGhlIDQgbW9zdCBpbXBvcnRhbnQgcG9pbnRzIGkuZSB3aGVyZSByb3dzIGFuZAoJLy8gY29sdW1ucyBjaGFuZ2UgdGhlaXIgdHlwZS4KCWludCBpLCBqLCBpMSwgajEsIGkyLCBqMjsKCWkxID0gMTsgajEgPSAxOwoJd2hpbGUgKHJvd190eXBlW2kxXSA9PSByb3dfdHlwZVsxXSkgaTErKzsKCXdoaWxlIChjb2xfdHlwZVtqMV0gPT0gY29sX3R5cGVbMV0pIGoxKys7CgkvLyBSb3dzIHBhcnRpdGlvbjogWzEsIGkxLTFdIGFuZCBbaTEsIG5dCgkvLyBDb2x1bW5zIHBhcnRpdGlvbjogWzEsIGoxLTFdIGFuZCBbajEsIG5dCglmb3IoaW50IHg9aTE7IHg8PW47ICsreCkgewoJCWFzc2VydChyb3dfdHlwZVtpMV0gPT0gcm93X3R5cGVbeF0pOwoJfQoJZm9yKGludCB5PWoxOyB5PD1uOyArK3kpIHsKCQlhc3NlcnQoY29sX3R5cGVbajFdID09IGNvbF90eXBlW3ldKTsKCX0KCUFzayhpMS0xLCBqMS0xKTsKCUFzayhpMS0xLCBqMSk7CglBc2soaTEsIGoxLTEpOwoJQXNrKGkxLCBqMSk7CglpZiAoKHJvd190eXBlWzFdID09IDEpICYmIChjb2xfdHlwZVsxXSA9PSAxKSkgewoJCVJlc2kyeDJBQShuLCBpMSwgajEpOwoJfQoJaWYgKChyb3dfdHlwZVsxXSA9PSAtMSkgJiYgKGNvbF90eXBlWzFdID09IC0xKSkgewoJCVJlc2kyeDJCQihuLCBpMSwgajEpOwoJfQp9Cgp2b2lkIFNvbHZlQ29sdW1uKGludCBuKSB7CgkvLyBBc2sgYXRtb3N0ICJuIiBxdWVyaWVzIHRvIGlkZW50aWZ5IHdoaWNoIHN1Yi1yZWN0YW5nbGUgaXMgYSBwb3NzaWJsZQoJLy8gY2FuZGlkYXRlIHRvIGNvbnRhaW4gIlYiLgoJLy8gV29yc3QgY2FzZTogcm93cyBhcmUgYWx0ZXJuYXRpbmcgaW5jcmVhc2luZyBhbmQgZGVjcmVhc2luZyBvciB2aWNlLXZlcnNhLgoJaW50IGZvdW5kID0gMDsKCWludCBpLCBqLCBpMSwgaTI7CglpMiA9IDE7Cgl3aGlsZSAoaTIgPD0gbikgewoJCWkxID0gaTI7CgkJd2hpbGUgKChpMiA8PSBuKSAmJiAocm93X3R5cGVbaTJdID09IHJvd190eXBlW2kxXSkpIGkyKys7CgkJLy8gQWxsIHJvd3MgZnJvbSBbaTEsIGkyLTFdIGFyZSBlaXRoZXIgaW5uY3JlYXNpbmcgb3IgZGVjcmVhc2luZy4KCQkvLyBCYXNlZCBvbiB3aGV0aGVyIHJvd3MgYXJlIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZywgc2VsZWN0IHRoZSBjb2x1bW4KCQkvLyB3aGljaCB3aWxsIGhhdmUgdGhlIG1heGltdW0gZWxlbWVudCBmb3IgZXZlcnkgcm93LiBJdCBjYW4gYmUKCQkvLyBlaXRoZXIgcm93ICIxIiBvciAibiIuIElmIGZvciB0aGF0IGNvbHVtbiBhbmQgcm93IHJhbmdlLCB0aGUKCQkvLyBudW1iZXJzIGhhdmUgIlYiIGluIHRoZWlyIHJhbmdlLCB3ZSBoYXZlIGZvdW5kIGEgdmFsaWQgc3ViLXJlY3RhbmdsZQoJCS8vIHdoaWNoIGlzIHRoZSBwb3NzaWJsZSBjYW5kaWRhdGUgdG8gY29udGFpbiAiViIuIE5vdGUgdGhhdCBzaW5jZSB3ZQoJCS8vIGFyZSBpdGVyYXRpbmcgb3ZlciByb3dzIGluIGluY3JlYXNpbmcgb3JkZXIgYW5kIG5vdCBkb2luZyBhIGJpbmFyeQoJCS8vIHNlYXJjaC4gU28sIGlmIHRoZSBwcmV2aW91cyByb3dzIHdlcmUgaWdub3JlZCwgaXQgbWVhbnMgdGhlaXIgdmFsdWUKCQkvLyB3YXMgZWl0aGVyIGxlc3Mgb3IgZ3JlYXRlciB0aGFuICJWIi4gU28sIG9ubHkgdGhlIG90aGVyIGNvbmRpdGlvbiBpcwoJCS8vIHJlcXVpcmVkIHRvIGJlIGNoZWNrZWQuCgkJaWYgKGNvbF90eXBlWzFdID09IDEpIHsKCQkJLy8gQWxsIGNvbHVtbnMgYXJlIGluY3JlYXNpbmcuCgkJCWlmIChyb3dfdHlwZVtpMV0gPT0gLTEpIHsKCQkJCS8vIEN1cnJlbnQgc2V0IG9mIHJvd3MgYXJlIGRlY3JlYXNpbmcuCgkJCQlBc2soaTItMSwgMSk7CgkJCQlpZiAoViA8PSBBW2kyLTFdWzFdKSB7CgkJCQkJZm91bmQgPSAxOyBicmVhazsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIEN1cnJlbnQgc2V0IG9mIHJvd3MgYXJlIGluY3JlYXNpbmcuCgkJCQlBc2soaTItMSwgbik7CgkJCQlpZiAoViA8PSBBW2kyLTFdW25dKSB7CgkJCQkJZm91bmQgPSAxOyBicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCS8vIEFsbCBjb2x1bW5zIGFyZSBkZWNyZWFzaW5nLgoJCQlpZiAocm93X3R5cGVbaTFdID09IC0xKSB7CgkJCQkvLyBDdXJyZW50IHNldCBvZiByb3dzIGFyZSBkZWNyZWFzaW5nLgoJCQkJQXNrKGkyLTEsIG4pOwoJCQkJaWYgKFYgPj0gQVtpMi0xXVtuXSkgewoJCQkJCWZvdW5kID0gMTsgYnJlYWs7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyBDdXJyZW50IHNldCBvZiByb3dzIGFyZSBpbmNyZWFzaW5nLgoJCQkJQXNrKGkyLTEsIDEpOwoJCQkJaWYgKFYgPj0gQVtpMi0xXVsxXSkgewoJCQkJCWZvdW5kID0gMTsgYnJlYWs7CgkJCQl9CgkJCX0KCQl9Cgl9CglpZiAoZm91bmQpIHsKCQkvLyAiaTIiIGlzIGRlY3JlbWVudGVkIGFzIHRoZSB2YWxpZCByYW5nZSB3YXMgW2kxLCBpMi0xXSBhcyBleHBsYWluZWQKCQkvLyBiZWZvcmUuCgkJaTItLTsKCQlTb2x2ZVN1YlJlY3RhbmdsZShpMSwgMSwgaTIsIG4pOwoJfQp9Cgp2b2lkIFNvbHZlUm93KGludCBuKSB7CgkvLyBBc2sgYXRtb3N0ICJuIiBxdWVyaWVzIHRvIGlkZW50aWZ5IHdoaWNoIHN1Yi1yZWN0YW5nbGUgaXMgYSBwb3NzaWJsZQoJLy8gY2FuZGlkYXRlIHRvIGNvbnRhaW4gIlYiLgoJLy8gV29yc3QgY2FzZTogY29sdW1ucyBhcmUgYWx0ZXJuYXRpbmcgaW5jcmVhc2luZyBvciBkZWNyZWFzaW5nIG9yCgkvLyB2aWNlLXZlcnNhLgoJaW50IGZvdW5kID0gMDsKCWludCBpLCBqLCBqMSwgajI7CglqMiA9IDE7Cgl3aGlsZSAoajIgPD0gbikgewoJCWoxID0gajI7CgkJd2hpbGUgKChqMiA8PSBuKSAmJiAoY29sX3R5cGVbajJdID09IGNvbF90eXBlW2oxXSkpIGoyKys7CgkJLy8gQWxsIGNvbHVtbnMgYXJlIFtqMSwgajItMV0gYXJlIGVpdGhlciBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcuCgkJLy8gQmFzZWQgb24gd2hldGhlciBjb2x1bW5zIGFyZSBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcsIHNlbGVjdCB0aGUgcm93CgkJLy8gd2hpY2ggd2lsbCBoYXZlIHRoZSBtYXhpbXVtIGVsZW1lbnQgZm9yIGV2ZXJ5IGNvbHVtbi4gSXQgY2FuIGJlCgkJLy8gZWl0aGVyIGNvbHVtbiAiMSIgb3IgIm4iLiBJZiBmb3IgdGhhdCByb3cgYW5kIGNvbHVtbiByYW5nZSwgdGhlCgkJLy8gbnVtYmVycyBoYXZlICJWIiBpbiB0aGVpciByYW5nZSwgd2UgaGF2ZSBmb3VuZCBhIHZhbGlkIHN1Yi1yZWN0YW5nbGUKCQkvLyB3aGljaCBpcyB0aGUgcG9zc2libGUgY2FuZGlkYXRlIHRvIGNvbnRhaW4gIlYiLiBOb3RlIHRoYXQgc2luY2Ugd2UKCQkvLyBhcmUgaXRlcmF0aW5nIG92ZXIgY29sdW1ucyBpbiBpbmNyZWFzaW5nIG9yZGVyIGFuZCBub3QgZG9pbmcgYSBiaW5hcnkKCQkvLyBzZWFyY2guIFNvLCBpZiB0aGUgcHJldmlvdXMgY29sdW1ucyB3ZXJlIGlnbm9yZWQsIGl0IG1lYW5zIHRoZWlyIHZhbHVlCgkJLy8gd2FzIGVpdGhlciBsZXNzIG9yIGdyZWF0ZXIgdGhhbiAiViIuIFNvLCBvbmx5IHRoZSBvdGhlciBjb25kaXRpb24gaXMKCQkvLyByZXF1aXJlZCB0byBiZSBjaGVja2VkLgoJCWlmIChyb3dfdHlwZVsxXSA9PSAxKSB7CgkJCS8vIEFsbCByb3dzIGFyZSBpbmNyZWFzaW5nLgoJCQlpZiAoY29sX3R5cGVbajFdID09IC0xKSB7CgkJCQkvLyBDdXJyZW50IHNldCBvZiBjb2x1bW5zIGFyZSBkZWNyZWFzaW5nLgoJCQkJQXNrKDEsIGoyLTEpOwoJCQkJaWYgKFYgPD0gQVsxXVtqMi0xXSkgewoJCQkJCWZvdW5kID0gMTsgYnJlYWs7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyBDdXJyZW50IHNldCBvZiBjb2x1bW5zIGFyZSBpbmNyZWFzaW5nLgoJCQkJQXNrKG4sIGoyLTEpOwoJCQkJaWYgKFYgPD0gQVtuXVtqMi0xXSkgewoJCQkJCWZvdW5kID0gMTsgYnJlYWs7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQkvLyBBbGwgcm93cyBhcmUgZGVjcmVhc2luZy4KCQkJaWYgKGNvbF90eXBlW2oxXSA9PSAtMSkgewoJCQkJLy8gQ3VycmVudCBzZXQgb2YgY29sdW1ucyBhcmUgZGVjcmVhc2luZy4KCQkJCUFzayhuLCBqMi0xKTsKCQkJCWlmIChWID49IEFbbl1bajItMV0pIHsKCQkJCQlmb3VuZCA9IDE7IGJyZWFrOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gQ3VycmVudCBzZXQgb2YgY29sdW1ucyBhcmUgaW5jcmVhc2luZy4KCQkJCUFzaygxLCBqMi0xKTsKCQkJCWlmIChWID49IEFbMV1bajItMV0pIHsKCQkJCQlmb3VuZCA9IDE7IGJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoJaWYgKGZvdW5kKSB7CgkJLy8gImoyIiBpcyBkZWNyZW1lbnRlZCBhcyB0aGUgdmFsaWQgcmFuZ2Ugd2FzIFtqMSwgajItMV0gYXMgZXhwbGFpbmVkCgkJLy8gYmVmb3JlLgoJCWoyLS07CgkJU29sdmVTdWJSZWN0YW5nbGUoMSwgajEsIG4sIGoyKTsKCX0KfQoKCnZvaWQgU29sdmUoaW50IG4sIGludCBrKSB7CgkvLyBBc2sgIjJuIiBxdWVyaWVzIHRvIGlkZW50aWZ5IHR5cGUgb2YgZXZlcnkgcm93IGFuZCBjb2x1bW4uCgkvLyBVc2UgaGVscCBvZiBkaWFnb25hbCBlbGVtZW50IGFuZCBpdHMgbmVpZ2hib3VyLgoJQXNrKDEsIDEpOwoJQXNrKDEsIDIpOwoJaWYgKEFbMV1bMV0gPCBBWzFdWzJdKSByb3dfdHlwZVsxXSA9IDE7IGVsc2Ugcm93X3R5cGVbMV0gPSAtMTsKCWZvciAoaW50IGkgPSAyOyBpIDwgbjsgaSsrKSB7CgkJQXNrKGksIGkpOwoJCUFzayhpLCBpKzEpOwoJCWlmIChBW2ldW2ldIDwgQVtpXVtpKzFdKSByb3dfdHlwZVtpXSA9IDE7IGVsc2Ugcm93X3R5cGVbaV0gPSAtMTsKCQlpZiAoQVtpLTFdW2ldIDwgQVtpXVtpXSkgY29sX3R5cGVbaV0gPSAxOyBlbHNlIGNvbF90eXBlW2ldID0gLTE7Cgl9CglBc2sobiwgbik7CglBc2sobiwgMSk7CglpZiAoQVtuXVsxXSA8IEFbbl1bbl0pCXJvd190eXBlW25dID0gMTsgZWxzZSByb3dfdHlwZVtuXSA9IC0xOwoJaWYgKEFbMV1bMV0gPCBBW25dWzFdKQljb2xfdHlwZVsxXSA9IDE7IGVsc2UgY29sX3R5cGVbMV0gPSAtMTsKCWlmIChBW24tMV1bbl0gPCBBW25dW25dKSBjb2xfdHlwZVtuXSA9IDE7IGVsc2UgY29sX3R5cGVbbl0gPSAtMTsKCXJvdyA9IGNvbCA9IDA7Cglmb3IgKGludCBpID0gMjsgaSA8PSBuOyBpKyspIHsKCQlpZiAocm93X3R5cGVbaS0xXSAhPSByb3dfdHlwZVtpXSkgcm93Kys7CgkJaWYgKGNvbF90eXBlW2ktMV0gIT0gY29sX3R5cGVbaV0pIGNvbCsrOwoJfQoJaWYgKHJvdyA9PSAwKSB7CgkJLy8gQWxsIHJvd3MgYXJlIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZy4KCQlTb2x2ZVJvdyhuKTsKCX0gZWxzZSBpZiAoY29sID09IDApIHsKCQkvLyBBbGwgY29sdW1ucyBhcmUgaW5jcmVhc2luZyBvciBkZWNyZWFzaW5nLgoJCVNvbHZlQ29sdW1uKG4pOwoJfSBlbHNlIHsKCQkvLyBJbml0aWFsIHNldCBvZiByb3dzIGFyZSBvZiBvbmUgdHlwZSBhbmQgcmVzdCBvZiBhbm90aGVyIHR5cGUuCgkJLy8gSW5pdGlhbCBzZXQgb2YgY29sdW1ucyBhcmUgb25lIHR5cGUgYW5kIHJlc3Qgb2YgYW5vdGhlciB0eXBlLgoJCWFzc2VydChyb3cgPT0gMSk7CgkJYXNzZXJ0KGNvbCA9PSAxKTsKCQlSZXNpMngyKG4pOwoJfQp9CgppbnQgbWFpbigpIHsKCWludCBuLCBrOwoJc2NhbmYoIiVkJWQlZCIsJm4sICZrLCAmVik7CglTb2x2ZShuLGspOwoJcHJpbnRmKCIyIC0xIC0xXG4iKTsKCWZmbHVzaChzdGRvdXQpOwoJcmV0dXJuIDA7Cn0=