#include <bits/stdc++.h>
using namespace std;
#define MASK(i) (1LL<<(i))
#define BIT(n,i) ((n>>i)&1)
#define SQR(n) (1LL*n*n)
const int INF = 1e9+7;
template<class _, class __>
bool minimize(_ &x, const __ y){
if(x > y){
x = y;
return true;
} else return false;
}
template<class _, class __>
bool maximize(_ &x, const __ y){
if(x < y){
x = y;
return true;
} else return false;
}
const int N = 63; // Số tỉnh nước Việt Nam
const int MaxM = 35; // Số lượng tỉnh tối đa sau khi sáp nhập
const int Log = 16; // Số lượng tỉnh cần quản lí trong một trạng thái
const long long Min_Population = 1200000;
const int Min_Area = 6500;
const int Max_Area = 25000;
string Province[N] = {"Lang Son", "Quang Ninh", "Hai Duong", "Hai Phong", "Cao Bang",
"Bac Kan", "Thai Nguyen", "Bac Giang", "Bac Ninh", "Hung Yen",
"Thai Binh", "Ha Giang", "Tuyen Quang", "Vinh Phuc", "Ha Noi",
"Ha Nam", "Nam Dinh", "Lao Cai", "Yen Bai", "Phu Tho",
"Hoa Binh", "Ninh Binh", "Lai Chau", "Dien Bien", "Son La",
"Thanh Hoa","Nghe An", "Ha Tinh", "Quang Binh", "Quang Tri",
"Hue", "Da Nang", "Quang Nam", "Kom Tum", "Quang Ngai",
"Gia Lai", "Binh Dinh", "Dak Lak", "Phu Yen", "Khanh Hoa",
"Ninh Thuan", "Lam Dong", "Dak Nong", "Binh Phuoc", "Binh Thuan",
"Dong Nai", "Binh Duong", "Tay Ninh", "Sai Gon", "BRVT",
"Long An", "Tien Giang", "Dong Thap", "Ben Tre", "Tra Vinh",
"Vinh Long", "Can Tho", "An Giang", "Kien Giang", "Hau Giang",
"Soc Trang", "Bac Lieu", "Ca Mau"};
int Real_ID[N] = {
35, 47, 25, 26, 13, 3, 53, 2, 5, 29, 52, 21, 59, 61, 23, 22, 38, 36, 62, 42,
28, 40, 33, 17, 50, 54, 39, 24, 44, 48, 55, 14, 45, 32, 46, 20, 10, 15, 43, 30,
41, 34, 16, 8, 9, 18, 7, 51, 57, 1, 37, 56, 19, 6, 58, 60, 12, 0, 31, 27,
49, 4, 11
};
vector<int> Edge[N] = {
{1, 7, 6, 5, 4}, // 0 - Lang Son
{3, 2, 7, 0}, // 1 - Quang Ninh
{1, 3, 7, 8, 9, 10}, // 2 - Hai Duong
{1, 2, 10}, // 3 - Hai Phong
{0, 5, 12, 11}, // 4 - Cao Bang
{0, 6, 12,4}, // 5 - Bac Kan
{0,7,14,13,12,5}, // 6 - Thai Nguyen
{0,1,2,8,14,6}, // 7 - Bac Giang
{7,2,9,14}, // 8 - Bac Ninh
{8,2,10,15,14}, // 9 - Hung Yen
{3,2,9,15,16}, // 10 - Thai Binh
{4,12,17}, // 11 - Ha Giang
{4,5,6,13,19,18,11}, // 12 - Tuyen Quang
{6,14,19,12}, // 13 - Vinh Phuc
{6,7,8,9,15,20,19,13}, // 14 - Ha Noi
{9,10,16,21,20,14}, // 15 - Ha Nam
{10,15,21}, // 16 - Nam Dinh
{11,18,22}, // 17 - Lao Cai
{12,19,24,22}, // 18 - Yen Bai
{12,13,14,20,24,18}, // 19 - Phu Tho
{14,15,21,25,24,19}, // 20 - Hoa Binh
{15,16,20,25}, // 21 - Ninh Binh
{17,18,24}, // 22 - Lai Chau
{24}, // 23 - Dien Bien
{23,22,18,19,20,25}, // 24 - Son La
{21,20,24,26}, // 25 - Thanh Hoa
{25,27}, // 26 - Nghe An
{26, 28}, // 27 - Ha Tinh
{27, 29}, // 28 - Quang Binh
{28, 30}, // 29 - Quang Tri
{29, 31, 32}, // 30 - Hue
{30, 32}, // 31 - Da Nang
{30, 31, 33, 34}, // 32 - Quang Nam
{32, 35}, // 33 - Kom Tum
{32, 36}, // 34 - Quang Ngai
{33, 36, 37}, // 35 - Gia Lai
{34, 35, 38}, // 36 - Binh Dinh
{35, 38, 41, 42}, // 37 - Dak Lak
{36, 37, 39}, // 38 - Phu Yen
{38, 40, 41}, // 39 - Khanh Hoa
{39, 41, 44}, // 40 - Ninh Thuan
{37, 39, 40, 42, 44, 43, 45}, // 41 - Lam Dong
{37, 41, 43}, // 42 - Dak Nong
{41, 42, 45, 46, 47}, // 43 - Binh Phuoc
{40, 41, 45, 49}, // 44 - Binh Thuan
{44,41,43,49,48,46}, // 45 - Dong Nai
{43,47,48,45}, // 46 - Binh Duong
{43, 46, 48, 50}, // 47 - Tay Ninh
{47,46,45,49,50}, // 48 - Sai Gon
{44, 45, 48}, // 49 - BRVT
{47, 48, 51, 52}, // 50 - Long An
{53, 55, 52, 50}, // 51 - Tien Giang
{50, 51, 55, 56, 57}, // 52 - Dong Thap
{51, 54, 55}, // 53 - Ben Tre
{53, 55, 60}, // 54 - Tra Vinh
{53, 51, 52, 54, 56, 59}, // 55 - Vinh Long
{52, 55, 57, 58, 59}, // 56 - Can Tho
{52, 56, 58}, // 57 - An Giang
{56, 57, 59, 61, 62}, // 58 - Kien Giang
{55, 56, 60, 61, 58}, // 59 - Hau Giang
{54, 59, 61}, // 60 - Soc Trang
{60, 59, 58, 62}, // 61 - Bac Lieu
{58, 61} // 62 - Ca Mau
};
/*
Khác với danh sách kề đã liệt kê ở câu 3: Một số cặp đỉnh sẽ không được coi
không kề nhauvì đường giáp ranh giữa hai tỉnh khá nhỏ.
Quãng Ngãi - Gia Lai
TP HCM - Tiền Giang
Soc Trang - Vinh Long
Đường đi hiểm trở
// if (IsAppear(33,ds) && IsAppear(34,ds)) return false;
// if (IsAppear(22,ds) && IsAppear(23,ds)) return false;
// if (IsAppear(18,ds) && IsAppear(11,ds)) return false;
// if (IsAppear(35,ds) && IsAppear(38,ds)) return false;
// if (IsAppear(37,ds) && IsAppear(39,ds)) return false;
*/
int Area[N] = {
8310, // Lang Son
6208, // Quang Ninh
1668, // Hai Duong
1527, // Hai Phong
6700, // Cao Bang
4860, // Bac Kan
3522, // Thai Nguyen
3896, // Bac Giang
823, // Bac Ninh
930, // Hung Yen
1585, // Thai Binh
7928, // Ha Giang
5868, // Tuyen Quang
1236, // Vinh Phuc
3360, // Ha Noi
862, // Ha Nam
1669, // Nam Dinh
6364, // Lao Cai
6893, // Yen Bai
3535, // Phu Tho
4590, // Hoa Binh
1412, // Ninh Binh
9069, // Lai Chau
9540, // Dien Bien
14110, // Son La
11115, // Thanh Hoa
16486, // Nghe An
5994, // Ha Tinh
7999, // Quang Binh
4701, // Quang Tri
4947, // Hue
1285, // Da Nang
10575, // Quang Nam
9677, // Kom Tum
5155, // Quang Ngai
15510, // Gia Lai
6066, // Binh Dinh
13070, // Dak Lak
5026, // Phu Yen
5200, // Khanh Hoa
3356, // Ninh Thuan
9781, // Lam Dong
6509, // Dak Nong
6874, // Binh Phuoc
7943, // Binh Thuan
5864, // Dong Nai
2695, // Binh Duong
4042, // Tay Ninh
2095, // Sai Gon
1983, // BRVT
4495, // Long An
2556, // Tien Giang
3382, // Dong Thap
2380, // Ben Tre
2391, // Tra Vinh
1526, // Vinh Long
1440, // Can Tho
3537, // An Giang
6353, // Kien Giang
1622, // Hau Giang
3298, // Soc Trang
2668, // Bac Lieu
5275 // Ca Mau
};
int Population[N] = {
813978, // Lang Son
1393702, // Quang Ninh
1971326, // Hai Duong
2121841, // Hai Phong
555809, // Cao Bang
328609, // Bac Kan
1361474, // Thai Nguyen
1950615, // Bac Giang
1543529, // Bac Ninh
1313798, // Hung Yen
1888184, // Thai Binh
908263, // Ha Giang
820054, // Tuyen Quang
1221803, // Vinh Phuc
8685607, // Ha Noi
892755, // Ha Nam
1892427, // Nam Dinh
787066, // Lao Cai
863338, // Yen Bai
1540608, // Phu Tho
892373, // Hoa Binh
1027030, // Ninh Binh
494626, // Lai Chau
653422, // Dien Bien
1327430, // Son La
3760650, // Thanh Hoa
3470988, // Nghe An
1329365, // Ha Tinh
924169, // Quang Binh
658619, // Quang Tri
1177624, // Hue
1269070, // Da Nang
1539468, // Quang Nam
598201, // Kom Tum
1256952, // Quang Ngai
1630311, // Gia Lai
1515422, // Binh Dinh
1944821, // Dak Lak
883298, // Phu Yen
1267443, // Khanh Hoa
609820, // Ninh Thuan
1361129, // Lam Dong
692896, // Dak Nong
1060448, // Binh Phuoc
1266240, // Binh Thuan
3341716, // Dong Nai
2858815, // Binh Duong
1201736, // Tay Ninh
9521886, // Sai Gon (TP. HCM)
1192863, // BRVT
1753041, // Long An
1795251, // Tien Giang
1600963, // Dong Thap
1305281, // Ben Tre
1022887, // Tra Vinh
1035362, // Vinh Long
1268514, // Can Tho
1911002, // An Giang
1763826, // Kien Giang
728924, // Hau Giang
1203705, // Soc Trang
929439, // Bac Lieu
1210843 // Ca Mau
};
int GRDP[N] = {
50, // Lang Son
348, // Quang Ninh
212, // Hai Duong
446, // Hai Phong
25, // Cao Bang
19, // Bac Kan
167, // Thai Nguyen
207, // Bac Giang
232, // Bac Ninh
160, // Hung Yen
71, // Thai Binh
36, // Ha Giang
50, // Tuyen Quang
173, // Vinh Phuc
1430, // Ha Noi
56, // Ha Nam
113, // Nam Dinh
77, // Lao Cai
49, // Yen Bai
107, // Phu Tho
72, // Hoa Binh
99, // Ninh Binh
31, // Lai Chau
32, // Dien Bien
77, // Son La
319, // Thanh Hoa
217, // Nghe An
113, // Ha Tinh
60, // Quang Binh
54, // Quang Tri
80, // Hue
151, // Da Nang
129, // Quang Nam
41, // Kom Tum
133, // Quang Ngai
111, // Gia Lai
131, // Binh Dinh
141, // Dak Lak
63, // Phu Yen
129, // Khanh Hoa
60, // Ninh Thuan
13, // Lam Dong
56, // Dak Nong
115, // Binh Phuoc
121, // Binh Thuan
494, // Dong Nai
520, // Binh Duong
124, // Tay Ninh
1778, // Sai Gon (TP. Ho Chi Minh)
417, // BRVT
189, // Long An
137, // Tien Giang
124, // Dong Thap
74, // Ben Tre
97, // Tra Vinh
84, // Vinh Long
133, // Can Tho
127, // An Giang
144, // Kien Giang
68, // Hau Giang
80, // Soc Trang
66, // Bac Lieu
88 // Ca Mau
};
int trace[N][MaxM][MASK(Log)];
int f[N][MaxM][MASK(Log)];
int sumGRDP = 0;
void prepare() {
for (int i=0;i<N;i++) {
for (int j=0;j<MASK(Log);j++) {
for (int m=0;m<MaxM;m++) {
f[i][m][j] = INF; // Đặt tất cả giá trị về dương vô cùng vì hàm mục tiêu là MIN
trace[i][m][j] = 0;
}
}
}
f[0][0][0] = 0;
}
bool IsAppear(int u,vector<int> & ds) {
// Kiểm tra đỉnh thứ u có nằm trong cụm tỉnh [ds] không
for (int x : ds) {
if (x == u) return true;
}
return false;
}
bool Check(vector<int> ds) {
//Kiểm tra khả năng sáp nhập của cụm tỉnh [ds]
// Cao Bang không sáp nhập với tỉnh nào khác
if (IsAppear(4,ds)) return ds.size() == 1;
// Hà Nội sáp nhập với nhiều nhất 1 tỉnh
if (IsAppear(14,ds)) return ds.size() <= 2;
// Các cặp tỉnh không thể sáp nhập vì vấn đề về giao thông
// if (IsAppear(33,ds) && IsAppear(34,ds)) return false;
// if (IsAppear(22,ds) && IsAppear(23,ds)) return false;
// if (IsAppear(18,ds) && IsAppear(11,ds)) return false;
// if (IsAppear(35,ds) && IsAppear(38,ds)) return false;
// if (IsAppear(37,ds) && IsAppear(39,ds)) return false;
// Xét các điều kiện về diện tích và dân số
int Sum_Area = 0;
long long Sum_Population = 0;
for (int x : ds) {
Sum_Area += Area[x];
Sum_Population += Population[x];
}
return Sum_Area >= Min_Area && Sum_Population >= Min_Population && Sum_Area <= Max_Area;
}
int SumGRDP(vector<int> & ds) {
int sum = 0;
for (int x : ds) {
sum += GRDP[x];
}
return sum;
}
void Push(int pos,int m,int OldMask,vector<int> ds) {
// Cập nhật giá trị tối ưu và lưu vết cho trạng thái mới khi sáp nhập cụm tỉnh [ds]
if (!Check(ds)) return;
for (int x : ds) if (BIT(OldMask,x - pos)) return;
int NewMask = OldMask;
for (int x : ds) NewMask |= MASK(x - pos);
if (minimize(f[pos][m+1][NewMask],f[pos][m][OldMask] + SQR(SumGRDP(ds)))) {
trace[pos][m+1][NewMask] = 0;
for (int x : ds) trace[pos][m+1][NewMask] |= MASK(x-pos);
}
}
void Update_To_Next_Province(int pos) {
//Cập nhật cửa sổ để xét tỉnh tiếp theo
for (int m=0;m<MaxM;m++) {
for (int mask=0;mask<MASK(Log);mask++) {
if (BIT(mask,0) && f[pos][m][mask] < INF) minimize(f[pos+1][m][mask>>1],f[pos][m][mask]);
}
}
}
void sol() {
// Quy hoạch động bitmask, duyệt theo ý tưởng đã nêu
for (int x=0;x<N;x++) {
for (int m=0;m<MaxM;m++) {
for (int mask=0;mask<MASK(Log);mask++) {
if (BIT(mask,0) || f[x][m][mask] >= INF) continue;
Push(x,m,mask,{x}); // tỉnh x không sáp nhập
for (int y:Edge[x]) {
if (y <= x) continue;
Push(x,m,mask,{x,y}); // tỉnh x sáp nhập với 1 tỉnh
// Tỉnh x sáp nhập với 2 tỉnh
for (int z:Edge[y]) {
if (z <= x) continue;
Push(x,m,mask,{x,y,z});
}
for (int z:Edge[x]) {
if (z <= x || z == y) continue;
Push(x,m,mask,{x,y,z});
}
}
}
}
if (x == N - 1) continue;
// Cập nhật cửa sổ tiếp theo
Update_To_Next_Province(x);
}
// Đặt S = sumGRDP^2
for (int i=0;i<N;i++) sumGRDP += GRDP[i];
int S = SQR(sumGRDP);
int M = 0; // Lượng tỉnh sao cho phương án tối ưu nhất
for (int i=0;i<MaxM;i++) {
if (f[N-1][i][1] >= INF) continue; // Nếu trường hợp số tỉnh là i không có phương án thì bỏ qua
if (M == 0) M = i; // Tạo cho M giá trị ban đầu
// Lấy sổ lượng tối ưu cho hàm mục tiêu giữa M và i
if (1LL*(i*f[N-1][i][1]-S)*SQR(M) < 1LL*(M*f[N-1][M][1]-S)*SQR(i)) {
M = i;
}
}
// Truy vết
int pos = N-1;
int mask = 1;
while (M != 0) {
if (trace[pos][M][mask] == 0) {
pos--;
mask = mask << 1 | 1;
}
else {
int tmpp = trace[pos][M][mask];
for (int i=0;i<Log;i++) {
if (BIT(tmpp,i)) {
cout << Real_ID[i+pos] << ' ';
mask ^= MASK(i);
}
}
M--;
cout << '\n';
}
}
}
int main() {
// freopen("YeuCau_6_So.out","w",stdout);
prepare();
sol();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIE1BU0soaSkgKDFMTDw8KGkpKQojZGVmaW5lIEJJVChuLGkpICgobj4+aSkmMSkKI2RlZmluZSBTUVIobikgKDFMTCpuKm4pCgpjb25zdCBpbnQgSU5GID0gMWU5Kzc7Cgp0ZW1wbGF0ZTxjbGFzcyBfLCBjbGFzcyBfXz4KICAgIGJvb2wgbWluaW1pemUoXyAmeCwgY29uc3QgX18geSl7CiAgICAgICAgaWYoeCA+IHkpewogICAgICAgICAgICB4ID0geTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHJldHVybiBmYWxzZTsKICAgIH0KdGVtcGxhdGU8Y2xhc3MgXywgY2xhc3MgX18+CiAgICBib29sIG1heGltaXplKF8gJngsIGNvbnN0IF9fIHkpewogICAgICAgIGlmKHggPCB5KXsKICAgICAgICAgICAgeCA9IHk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSByZXR1cm4gZmFsc2U7CiAgICB9Cgpjb25zdCBpbnQgTiA9IDYzOyAvLyBT4buRIHThu4luaCBuxrDhu5tjIFZp4buHdCBOYW0KY29uc3QgaW50IE1heE0gPSAzNTsgLy8gU+G7kSBsxrDhu6NuZyB04buJbmggdOG7kWkgxJFhIHNhdSBraGkgc8OhcCBuaOG6rXAKY29uc3QgaW50IExvZyA9IDE2OyAvLyBT4buRIGzGsOG7o25nIHThu4luaCBj4bqnbiBxdeG6o24gbMOtIHRyb25nIG3hu5l0IHRy4bqhbmcgdGjDoWkKY29uc3QgbG9uZyBsb25nIE1pbl9Qb3B1bGF0aW9uID0gMTIwMDAwMDsKY29uc3QgaW50IE1pbl9BcmVhID0gNjUwMDsKY29uc3QgaW50IE1heF9BcmVhID0gMjUwMDA7CgpzdHJpbmcgUHJvdmluY2VbTl0gPSB7IkxhbmcgU29uIiwgIlF1YW5nIE5pbmgiLCAiSGFpIER1b25nIiwgIkhhaSBQaG9uZyIsICJDYW8gQmFuZyIsCiAgICAgICAgICAgICAgICAiQmFjIEthbiIsICJUaGFpIE5ndXllbiIsICJCYWMgR2lhbmciLCAiQmFjIE5pbmgiLCAiSHVuZyBZZW4iLAogICAgICAgICAgICAgICAgIlRoYWkgQmluaCIsICJIYSBHaWFuZyIsICJUdXllbiBRdWFuZyIsICJWaW5oIFBodWMiLCAiSGEgTm9pIiwKICAgICAgICAgICAgICAgICJIYSBOYW0iLCAiTmFtIERpbmgiLCAiTGFvIENhaSIsICJZZW4gQmFpIiwgIlBodSBUaG8iLAogICAgICAgICAgICAgICAgIkhvYSBCaW5oIiwgIk5pbmggQmluaCIsICJMYWkgQ2hhdSIsICJEaWVuIEJpZW4iLCAiU29uIExhIiwKICAgICAgICAgICAgICAgICJUaGFuaCBIb2EiLCJOZ2hlIEFuIiwgIkhhIFRpbmgiLCAiUXVhbmcgQmluaCIsICJRdWFuZyBUcmkiLAogICAgICAgICAgICAgICAgIkh1ZSIsICJEYSBOYW5nIiwgIlF1YW5nIE5hbSIsICJLb20gVHVtIiwgIlF1YW5nIE5nYWkiLAogICAgICAgICAgICAgICAgIkdpYSBMYWkiLCAiQmluaCBEaW5oIiwgIkRhayBMYWsiLCAiUGh1IFllbiIsICJLaGFuaCBIb2EiLAogICAgICAgICAgICAgICAgIk5pbmggVGh1YW4iLCAiTGFtIERvbmciLCAiRGFrIE5vbmciLCAiQmluaCBQaHVvYyIsICJCaW5oIFRodWFuIiwKICAgICAgICAgICAgICAgICJEb25nIE5haSIsICJCaW5oIER1b25nIiwgIlRheSBOaW5oIiwgIlNhaSBHb24iLCAiQlJWVCIsCiAgICAgICAgICAgICAgICAiTG9uZyBBbiIsICJUaWVuIEdpYW5nIiwgIkRvbmcgVGhhcCIsICJCZW4gVHJlIiwgIlRyYSBWaW5oIiwKICAgICAgICAgICAgICAgICJWaW5oIExvbmciLCAiQ2FuIFRobyIsICJBbiBHaWFuZyIsICJLaWVuIEdpYW5nIiwgIkhhdSBHaWFuZyIsCiAgICAgICAgICAgICAgICAiU29jIFRyYW5nIiwgIkJhYyBMaWV1IiwgIkNhIE1hdSJ9OwoKaW50IFJlYWxfSURbTl0gPSB7CiAgICAzNSwgNDcsIDI1LCAyNiwgMTMsIDMsIDUzLCAyLCA1LCAyOSwgNTIsIDIxLCA1OSwgNjEsIDIzLCAyMiwgMzgsIDM2LCA2MiwgNDIsCiAgICAyOCwgNDAsIDMzLCAxNywgNTAsIDU0LCAzOSwgMjQsIDQ0LCA0OCwgNTUsIDE0LCA0NSwgMzIsIDQ2LCAyMCwgMTAsIDE1LCA0MywgMzAsCiAgICA0MSwgMzQsIDE2LCA4LCA5LCAxOCwgNywgNTEsIDU3LCAxLCAzNywgNTYsIDE5LCA2LCA1OCwgNjAsIDEyLCAwLCAzMSwgMjcsCiAgICA0OSwgNCwgMTEKfTsKCnZlY3RvcjxpbnQ+IEVkZ2VbTl0gPSB7CiAgICB7MSwgNywgNiwgNSwgNH0sICAgICAgICAgICAgIC8vIDAgLSBMYW5nIFNvbgogICAgezMsIDIsIDcsIDB9LCAgICAgICAgICAgICAgICAvLyAxIC0gUXVhbmcgTmluaAogICAgezEsIDMsIDcsIDgsIDksIDEwfSwgICAgICAgICAgICAgLy8gMiAtIEhhaSBEdW9uZwogICAgezEsIDIsIDEwfSwgICAgICAgICAgICAgLy8gMyAtIEhhaSBQaG9uZwogICAgezAsIDUsIDEyLCAxMX0sICAgICAgICAgICAgICAgICAgIC8vIDQgLSBDYW8gQmFuZwogICAgezAsIDYsIDEyLDR9LCAgICAgIC8vIDUgLSBCYWMgS2FuCiAgICB7MCw3LDE0LDEzLDEyLDV9LCAvLyA2IC0gVGhhaSBOZ3V5ZW4KICAgIHswLDEsMiw4LDE0LDZ9LCAgICAgICAgICAgIC8vIDcgLSBCYWMgR2lhbmcKICAgIHs3LDIsOSwxNH0sICAgICAgIC8vIDggLSBCYWMgTmluaAogICAgezgsMiwxMCwxNSwxNH0sICAgIC8vIDkgLSBIdW5nIFllbgogICAgezMsMiw5LDE1LDE2fSwgICAgLy8gMTAgLSBUaGFpIEJpbmgKICAgIHs0LDEyLDE3fSwgICAgICAgICAgLy8gMTEgLSBIYSBHaWFuZwogICAgezQsNSw2LDEzLDE5LDE4LDExfSwgICAgLy8gMTIgLSBUdXllbiBRdWFuZwogICAgezYsMTQsMTksMTJ9LCAgLy8gMTMgLSBWaW5oIFBodWMKICAgIHs2LDcsOCw5LDE1LDIwLDE5LDEzfSwgICAgICAgICAgLy8gMTQgLSBIYSBOb2kKICAgIHs5LDEwLDE2LDIxLDIwLDE0fSwgIC8vIDE1IC0gSGEgTmFtCiAgICB7MTAsMTUsMjF9LCAvLyAxNiAtIE5hbSBEaW5oCiAgICB7MTEsMTgsMjJ9LCAgICAgICAgIC8vIDE3IC0gTGFvIENhaQogICAgezEyLDE5LDI0LDIyfSwgICAgIC8vIDE4IC0gWWVuIEJhaQogICAgezEyLDEzLDE0LDIwLDI0LDE4fSwgLy8gMTkgLSBQaHUgVGhvCiAgICB7MTQsMTUsMjEsMjUsMjQsMTl9LCAgICAgICAgIC8vIDIwIC0gSG9hIEJpbmgKICAgIHsxNSwxNiwyMCwyNX0sICAgICAgICAgICAgIC8vIDIxIC0gTmluaCBCaW5oCiAgICB7MTcsMTgsMjR9LCAgICAgLy8gMjIgLSBMYWkgQ2hhdQogICAgezI0fSwgICAgICAgICAgICAgLy8gMjMgLSBEaWVuIEJpZW4KICAgIHsyMywyMiwxOCwxOSwyMCwyNX0sIC8vIDI0IC0gU29uIExhCiAgICB7MjEsMjAsMjQsMjZ9LCAgICAgICAgICAvLyAyNSAtIFRoYW5oIEhvYQogICAgezI1LDI3fSwgICAgICAgICAgICAgICAgICAgIC8vIDI2IC0gTmdoZSBBbgogICAgezI2LCAyOH0sICAgICAgICAgICAgICAgIC8vIDI3IC0gSGEgVGluaAogICAgezI3LCAyOX0sICAgICAgICAgICAgICAgIC8vIDI4IC0gUXVhbmcgQmluaAogICAgezI4LCAzMH0sICAgICAgICAgICAgICAgIC8vIDI5IC0gUXVhbmcgVHJpCiAgICB7MjksIDMxLCAzMn0sICAgICAgICAgICAgLy8gMzAgLSBIdWUKICAgIHszMCwgMzJ9LCAgICAgICAgICAgICAgICAvLyAzMSAtIERhIE5hbmcKICAgIHszMCwgMzEsIDMzLCAzNH0sICAgICAgICAgICAgLy8gMzIgLSBRdWFuZyBOYW0KICAgIHszMiwgMzV9LCAgICAgICAgICAgIC8vIDMzIC0gS29tIFR1bQogICAgezMyLCAzNn0sICAgICAgICAvLyAzNCAtIFF1YW5nIE5nYWkKICAgIHszMywgMzYsIDM3fSwgICAgLy8gMzUgLSBHaWEgTGFpCiAgICB7MzQsIDM1LCAzOH0sICAgICAgICAgICAgLy8gMzYgLSBCaW5oIERpbmgKICAgIHszNSwgMzgsIDQxLCA0Mn0sICAgIC8vIDM3IC0gRGFrIExhawogICAgezM2LCAzNywgMzl9LCAgICAgICAgLy8gMzggLSBQaHUgWWVuCiAgICB7MzgsIDQwLCA0MX0sICAgICAgICAvLyAzOSAtIEtoYW5oIEhvYQogICAgezM5LCA0MSwgNDR9LCAgICAgICAgICAgIC8vIDQwIC0gTmluaCBUaHVhbgogICAgezM3LCAzOSwgNDAsIDQyLCA0NCwgNDMsIDQ1fSwgICAgLy8gNDEgLSBMYW0gRG9uZwogICAgezM3LCA0MSwgNDN9LCAgICAgICAgICAgIC8vIDQyIC0gRGFrIE5vbmcKICAgIHs0MSwgNDIsIDQ1LCA0NiwgNDd9LCAgICAvLyA0MyAtIEJpbmggUGh1b2MKICAgIHs0MCwgNDEsIDQ1LCA0OX0sICAgIC8vIDQ0IC0gQmluaCBUaHVhbgogICAgezQ0LDQxLDQzLDQ5LDQ4LDQ2fSwgICAgICAgIC8vIDQ1IC0gRG9uZyBOYWkKICAgIHs0Myw0Nyw0OCw0NX0sIC8vIDQ2IC0gQmluaCBEdW9uZwogICAgezQzLCA0NiwgNDgsIDUwfSwgICAgICAgIC8vIDQ3IC0gVGF5IE5pbmgKICAgIHs0Nyw0Niw0NSw0OSw1MH0sICAgICAgICAvLyA0OCAtIFNhaSBHb24KICAgIHs0NCwgNDUsIDQ4fSwgICAgLy8gNDkgLSBCUlZUCiAgICB7NDcsIDQ4LCA1MSwgNTJ9LCAgICAgICAgICAgIC8vIDUwIC0gTG9uZyBBbgogICAgezUzLCA1NSwgNTIsIDUwfSwgICAgICAgIC8vIDUxIC0gVGllbiBHaWFuZwogICAgezUwLCA1MSwgNTUsIDU2LCA1N30sICAgICAgICAvLyA1MiAtIERvbmcgVGhhcAogICAgezUxLCA1NCwgNTV9LCAgICAvLyA1MyAtIEJlbiBUcmUKICAgIHs1MywgNTUsIDYwfSwgICAgICAgICAgICAvLyA1NCAtIFRyYSBWaW5oCiAgICB7NTMsIDUxLCA1MiwgNTQsIDU2LCA1OX0sICAgICAgICAgICAgLy8gNTUgLSBWaW5oIExvbmcKICAgIHs1MiwgNTUsIDU3LCA1OCwgNTl9LCAvLyA1NiAtIENhbiBUaG8KICAgIHs1MiwgNTYsIDU4fSwgICAgLy8gNTcgLSBBbiBHaWFuZwogICAgezU2LCA1NywgNTksIDYxLCA2Mn0sICAgICAgICAgICAgLy8gNTggLSBLaWVuIEdpYW5nCiAgICB7NTUsIDU2LCA2MCwgNjEsIDU4fSwgICAgLy8gNTkgLSBIYXUgR2lhbmcKICAgIHs1NCwgNTksIDYxfSwgICAgLy8gNjAgLSBTb2MgVHJhbmcKICAgIHs2MCwgNTksIDU4LCA2Mn0sICAgICAgICAvLyA2MSAtIEJhYyBMaWV1CiAgICB7NTgsIDYxfSAgICAgICAgICAgICAgICAgLy8gNjIgLSBDYSBNYXUKfTsKLyoKICAgICAgICBLaMOhYyB24bubaSBkYW5oIHPDoWNoIGvhu4EgxJHDoyBsaeG7h3Qga8OqIOG7nyBjw6J1IDM6IE3hu5l0IHPhu5EgY+G6t3AgxJHhu4luaCBz4bq9IGtow7RuZyDEkcaw4bujYyBjb2kKICAgIGtow7RuZyBr4buBIG5oYXV2w6wgxJHGsOG7nW5nIGdpw6FwIHJhbmggZ2nhu69hIGhhaSB04buJbmgga2jDoSBuaOG7jy4KICAgICAgICAgICAgUXXDo25nIE5nw6NpIC0gR2lhIExhaQogICAgICAgICAgICBUUCBIQ00gLSBUaeG7gW4gR2lhbmcKICAgICAgICAgICAgU29jIFRyYW5nIC0gVmluaCBMb25nCiAgICAgICAgxJDGsOG7nW5nIMSRaSBoaeG7g20gdHLhu58KICAgICAgICAgICAgLy8gICAgaWYgKElzQXBwZWFyKDMzLGRzKSAmJiBJc0FwcGVhcigzNCxkcykpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgLy8gICAgaWYgKElzQXBwZWFyKDIyLGRzKSAmJiBJc0FwcGVhcigyMyxkcykpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgLy8gICAgaWYgKElzQXBwZWFyKDE4LGRzKSAmJiBJc0FwcGVhcigxMSxkcykpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgLy8gICAgaWYgKElzQXBwZWFyKDM1LGRzKSAmJiBJc0FwcGVhcigzOCxkcykpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgLy8gICAgaWYgKElzQXBwZWFyKDM3LGRzKSAmJiBJc0FwcGVhcigzOSxkcykpIHJldHVybiBmYWxzZTsKKi8KCmludCBBcmVhW05dID0gewogICAgODMxMCwgICAvLyBMYW5nIFNvbgogICAgNjIwOCwgICAvLyBRdWFuZyBOaW5oCiAgICAxNjY4LCAgIC8vIEhhaSBEdW9uZwogICAgMTUyNywgICAvLyBIYWkgUGhvbmcKICAgIDY3MDAsICAgLy8gQ2FvIEJhbmcKICAgIDQ4NjAsICAgLy8gQmFjIEthbgogICAgMzUyMiwgICAvLyBUaGFpIE5ndXllbgogICAgMzg5NiwgICAvLyBCYWMgR2lhbmcKICAgIDgyMywgICAgLy8gQmFjIE5pbmgKICAgIDkzMCwgICAgLy8gSHVuZyBZZW4KICAgIDE1ODUsICAgLy8gVGhhaSBCaW5oCiAgICA3OTI4LCAgIC8vIEhhIEdpYW5nCiAgICA1ODY4LCAgIC8vIFR1eWVuIFF1YW5nCiAgICAxMjM2LCAgIC8vIFZpbmggUGh1YwogICAgMzM2MCwgICAvLyBIYSBOb2kKICAgIDg2MiwgICAgLy8gSGEgTmFtCiAgICAxNjY5LCAgIC8vIE5hbSBEaW5oCiAgICA2MzY0LCAgIC8vIExhbyBDYWkKICAgIDY4OTMsICAgLy8gWWVuIEJhaQogICAgMzUzNSwgICAvLyBQaHUgVGhvCiAgICA0NTkwLCAgIC8vIEhvYSBCaW5oCiAgICAxNDEyLCAgIC8vIE5pbmggQmluaAogICAgOTA2OSwgICAvLyBMYWkgQ2hhdQogICAgOTU0MCwgICAvLyBEaWVuIEJpZW4KICAgIDE0MTEwLCAgLy8gU29uIExhCiAgICAxMTExNSwgIC8vIFRoYW5oIEhvYQogICAgMTY0ODYsICAvLyBOZ2hlIEFuCiAgICA1OTk0LCAgIC8vIEhhIFRpbmgKICAgIDc5OTksICAgLy8gUXVhbmcgQmluaAogICAgNDcwMSwgICAvLyBRdWFuZyBUcmkKICAgIDQ5NDcsICAgLy8gSHVlCiAgICAxMjg1LCAgIC8vIERhIE5hbmcKICAgIDEwNTc1LCAgLy8gUXVhbmcgTmFtCiAgICA5Njc3LCAgIC8vIEtvbSBUdW0KICAgIDUxNTUsICAgLy8gUXVhbmcgTmdhaQogICAgMTU1MTAsICAvLyBHaWEgTGFpCiAgICA2MDY2LCAgIC8vIEJpbmggRGluaAogICAgMTMwNzAsICAvLyBEYWsgTGFrCiAgICA1MDI2LCAgIC8vIFBodSBZZW4KICAgIDUyMDAsICAgLy8gS2hhbmggSG9hCiAgICAzMzU2LCAgIC8vIE5pbmggVGh1YW4KICAgIDk3ODEsICAgLy8gTGFtIERvbmcKICAgIDY1MDksICAgLy8gRGFrIE5vbmcKICAgIDY4NzQsICAgLy8gQmluaCBQaHVvYwogICAgNzk0MywgICAvLyBCaW5oIFRodWFuCiAgICA1ODY0LCAgIC8vIERvbmcgTmFpCiAgICAyNjk1LCAgIC8vIEJpbmggRHVvbmcKICAgIDQwNDIsICAgLy8gVGF5IE5pbmgKICAgIDIwOTUsICAgLy8gU2FpIEdvbgogICAgMTk4MywgICAvLyBCUlZUCiAgICA0NDk1LCAgIC8vIExvbmcgQW4KICAgIDI1NTYsICAgLy8gVGllbiBHaWFuZwogICAgMzM4MiwgICAvLyBEb25nIFRoYXAKICAgIDIzODAsICAgLy8gQmVuIFRyZQogICAgMjM5MSwgICAvLyBUcmEgVmluaAogICAgMTUyNiwgICAvLyBWaW5oIExvbmcKICAgIDE0NDAsICAgLy8gQ2FuIFRobwogICAgMzUzNywgICAvLyBBbiBHaWFuZwogICAgNjM1MywgICAvLyBLaWVuIEdpYW5nCiAgICAxNjIyLCAgIC8vIEhhdSBHaWFuZwogICAgMzI5OCwgICAvLyBTb2MgVHJhbmcKICAgIDI2NjgsICAgLy8gQmFjIExpZXUKICAgIDUyNzUgICAgLy8gQ2EgTWF1Cn07CgppbnQgUG9wdWxhdGlvbltOXSA9IHsKICAgIDgxMzk3OCwgICAgIC8vIExhbmcgU29uCiAgICAxMzkzNzAyLCAgICAvLyBRdWFuZyBOaW5oCiAgICAxOTcxMzI2LCAgICAvLyBIYWkgRHVvbmcKICAgIDIxMjE4NDEsICAgIC8vIEhhaSBQaG9uZwogICAgNTU1ODA5LCAgICAgLy8gQ2FvIEJhbmcKICAgIDMyODYwOSwgICAgIC8vIEJhYyBLYW4KICAgIDEzNjE0NzQsICAgIC8vIFRoYWkgTmd1eWVuCiAgICAxOTUwNjE1LCAgICAvLyBCYWMgR2lhbmcKICAgIDE1NDM1MjksICAgIC8vIEJhYyBOaW5oCiAgICAxMzEzNzk4LCAgICAvLyBIdW5nIFllbgogICAgMTg4ODE4NCwgICAgLy8gVGhhaSBCaW5oCiAgICA5MDgyNjMsICAgICAvLyBIYSBHaWFuZwogICAgODIwMDU0LCAgICAgLy8gVHV5ZW4gUXVhbmcKICAgIDEyMjE4MDMsICAgIC8vIFZpbmggUGh1YwogICAgODY4NTYwNywgICAgLy8gSGEgTm9pCiAgICA4OTI3NTUsICAgICAvLyBIYSBOYW0KICAgIDE4OTI0MjcsICAgIC8vIE5hbSBEaW5oCiAgICA3ODcwNjYsICAgICAvLyBMYW8gQ2FpCiAgICA4NjMzMzgsICAgICAvLyBZZW4gQmFpCiAgICAxNTQwNjA4LCAgICAvLyBQaHUgVGhvCiAgICA4OTIzNzMsICAgICAvLyBIb2EgQmluaAogICAgMTAyNzAzMCwgICAgLy8gTmluaCBCaW5oCiAgICA0OTQ2MjYsICAgICAvLyBMYWkgQ2hhdQogICAgNjUzNDIyLCAgICAgLy8gRGllbiBCaWVuCiAgICAxMzI3NDMwLCAgICAvLyBTb24gTGEKICAgIDM3NjA2NTAsICAgIC8vIFRoYW5oIEhvYQogICAgMzQ3MDk4OCwgICAgLy8gTmdoZSBBbgogICAgMTMyOTM2NSwgICAgLy8gSGEgVGluaAogICAgOTI0MTY5LCAgICAgLy8gUXVhbmcgQmluaAogICAgNjU4NjE5LCAgICAgLy8gUXVhbmcgVHJpCiAgICAxMTc3NjI0LCAgICAvLyBIdWUKICAgIDEyNjkwNzAsICAgIC8vIERhIE5hbmcKICAgIDE1Mzk0NjgsICAgIC8vIFF1YW5nIE5hbQogICAgNTk4MjAxLCAgICAgLy8gS29tIFR1bQogICAgMTI1Njk1MiwgICAgLy8gUXVhbmcgTmdhaQogICAgMTYzMDMxMSwgICAgLy8gR2lhIExhaQogICAgMTUxNTQyMiwgICAgLy8gQmluaCBEaW5oCiAgICAxOTQ0ODIxLCAgICAvLyBEYWsgTGFrCiAgICA4ODMyOTgsICAgICAvLyBQaHUgWWVuCiAgICAxMjY3NDQzLCAgICAvLyBLaGFuaCBIb2EKICAgIDYwOTgyMCwgICAgIC8vIE5pbmggVGh1YW4KICAgIDEzNjExMjksICAgIC8vIExhbSBEb25nCiAgICA2OTI4OTYsICAgICAvLyBEYWsgTm9uZwogICAgMTA2MDQ0OCwgICAgLy8gQmluaCBQaHVvYwogICAgMTI2NjI0MCwgICAgLy8gQmluaCBUaHVhbgogICAgMzM0MTcxNiwgICAgLy8gRG9uZyBOYWkKICAgIDI4NTg4MTUsICAgIC8vIEJpbmggRHVvbmcKICAgIDEyMDE3MzYsICAgIC8vIFRheSBOaW5oCiAgICA5NTIxODg2LCAgICAvLyBTYWkgR29uIChUUC4gSENNKQogICAgMTE5Mjg2MywgICAgLy8gQlJWVAogICAgMTc1MzA0MSwgICAgLy8gTG9uZyBBbgogICAgMTc5NTI1MSwgICAgLy8gVGllbiBHaWFuZwogICAgMTYwMDk2MywgICAgLy8gRG9uZyBUaGFwCiAgICAxMzA1MjgxLCAgICAvLyBCZW4gVHJlCiAgICAxMDIyODg3LCAgICAvLyBUcmEgVmluaAogICAgMTAzNTM2MiwgICAgLy8gVmluaCBMb25nCiAgICAxMjY4NTE0LCAgICAvLyBDYW4gVGhvCiAgICAxOTExMDAyLCAgICAvLyBBbiBHaWFuZwogICAgMTc2MzgyNiwgICAgLy8gS2llbiBHaWFuZwogICAgNzI4OTI0LCAgICAgLy8gSGF1IEdpYW5nCiAgICAxMjAzNzA1LCAgICAvLyBTb2MgVHJhbmcKICAgIDkyOTQzOSwgICAgIC8vIEJhYyBMaWV1CiAgICAxMjEwODQzICAgICAvLyBDYSBNYXUKfTsKCmludCBHUkRQW05dID0gewogICAgNTAsICAvLyBMYW5nIFNvbgogICAgMzQ4LCAvLyBRdWFuZyBOaW5oCiAgICAyMTIsIC8vIEhhaSBEdW9uZwogICAgNDQ2LCAvLyBIYWkgUGhvbmcKICAgIDI1LCAgLy8gQ2FvIEJhbmcKICAgIDE5LCAgLy8gQmFjIEthbgogICAgMTY3LCAvLyBUaGFpIE5ndXllbgogICAgMjA3LCAvLyBCYWMgR2lhbmcKICAgIDIzMiwgLy8gQmFjIE5pbmgKICAgIDE2MCwgLy8gSHVuZyBZZW4KICAgIDcxLCAgLy8gVGhhaSBCaW5oCiAgICAzNiwgIC8vIEhhIEdpYW5nCiAgICA1MCwgIC8vIFR1eWVuIFF1YW5nCiAgICAxNzMsIC8vIFZpbmggUGh1YwogICAgMTQzMCwgLy8gSGEgTm9pCiAgICA1NiwgIC8vIEhhIE5hbQogICAgMTEzLCAvLyBOYW0gRGluaAogICAgNzcsICAvLyBMYW8gQ2FpCiAgICA0OSwgIC8vIFllbiBCYWkKICAgIDEwNywgLy8gUGh1IFRobwogICAgNzIsICAvLyBIb2EgQmluaAogICAgOTksICAvLyBOaW5oIEJpbmgKICAgIDMxLCAgLy8gTGFpIENoYXUKICAgIDMyLCAgLy8gRGllbiBCaWVuCiAgICA3NywgIC8vIFNvbiBMYQogICAgMzE5LCAvLyBUaGFuaCBIb2EKICAgIDIxNywgLy8gTmdoZSBBbgogICAgMTEzLCAvLyBIYSBUaW5oCiAgICA2MCwgIC8vIFF1YW5nIEJpbmgKICAgIDU0LCAgLy8gUXVhbmcgVHJpCiAgICA4MCwgIC8vIEh1ZQogICAgMTUxLCAvLyBEYSBOYW5nCiAgICAxMjksIC8vIFF1YW5nIE5hbQogICAgNDEsICAvLyBLb20gVHVtCiAgICAxMzMsIC8vIFF1YW5nIE5nYWkKICAgIDExMSwgLy8gR2lhIExhaQogICAgMTMxLCAvLyBCaW5oIERpbmgKICAgIDE0MSwgLy8gRGFrIExhawogICAgNjMsICAvLyBQaHUgWWVuCiAgICAxMjksIC8vIEtoYW5oIEhvYQogICAgNjAsICAvLyBOaW5oIFRodWFuCiAgICAxMywgIC8vIExhbSBEb25nCiAgICA1NiwgIC8vIERhayBOb25nCiAgICAxMTUsIC8vIEJpbmggUGh1b2MKICAgIDEyMSwgLy8gQmluaCBUaHVhbgogICAgNDk0LCAvLyBEb25nIE5haQogICAgNTIwLCAvLyBCaW5oIER1b25nCiAgICAxMjQsIC8vIFRheSBOaW5oCiAgICAxNzc4LCAvLyBTYWkgR29uIChUUC4gSG8gQ2hpIE1pbmgpCiAgICA0MTcsIC8vIEJSVlQKICAgIDE4OSwgLy8gTG9uZyBBbgogICAgMTM3LCAvLyBUaWVuIEdpYW5nCiAgICAxMjQsIC8vIERvbmcgVGhhcAogICAgNzQsICAvLyBCZW4gVHJlCiAgICA5NywgIC8vIFRyYSBWaW5oCiAgICA4NCwgIC8vIFZpbmggTG9uZwogICAgMTMzLCAvLyBDYW4gVGhvCiAgICAxMjcsIC8vIEFuIEdpYW5nCiAgICAxNDQsIC8vIEtpZW4gR2lhbmcKICAgIDY4LCAgLy8gSGF1IEdpYW5nCiAgICA4MCwgIC8vIFNvYyBUcmFuZwogICAgNjYsICAvLyBCYWMgTGlldQogICAgODggICAvLyBDYSBNYXUKfTsKCmludCB0cmFjZVtOXVtNYXhNXVtNQVNLKExvZyldOwoKaW50IGZbTl1bTWF4TV1bTUFTSyhMb2cpXTsKCmludCBzdW1HUkRQID0gMDsKCnZvaWQgcHJlcGFyZSgpIHsKICAgIGZvciAoaW50IGk9MDtpPE47aSsrKSB7CiAgICAgICAgZm9yIChpbnQgaj0wO2o8TUFTSyhMb2cpO2orKykgewogICAgICAgICAgICBmb3IgKGludCBtPTA7bTxNYXhNO20rKykgewogICAgICAgICAgICAgICAgZltpXVttXVtqXSA9IElORjsgLy8gxJDhurd0IHThuqV0IGPhuqMgZ2nDoSB0cuG7iyB24buBIGTGsMahbmcgdsO0IGPDuW5nIHbDrCBow6BtIG3hu6VjIHRpw6p1IGzDoCBNSU4KICAgICAgICAgICAgICAgIHRyYWNlW2ldW21dW2pdID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZbMF1bMF1bMF0gPSAwOwp9Cgpib29sIElzQXBwZWFyKGludCB1LHZlY3RvcjxpbnQ+ICYgZHMpICB7CiAgICAvLyBLaeG7g20gdHJhIMSR4buJbmggdGjhu6kgdSBjw7MgbuG6sW0gdHJvbmcgY+G7pW0gdOG7iW5oIFtkc10ga2jDtG5nCiAgICBmb3IgKGludCB4IDogZHMpIHsKICAgICAgICBpZiAoeCA9PSB1KSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKYm9vbCBDaGVjayh2ZWN0b3I8aW50PiBkcykgewovL0tp4buDbSB0cmEga2jhuqMgbsSDbmcgc8OhcCBuaOG6rXAgY+G7p2EgY+G7pW0gdOG7iW5oIFtkc10KCiAgICAvLyBDYW8gQmFuZyBraMO0bmcgc8OhcCBuaOG6rXAgduG7m2kgdOG7iW5oIG7DoG8ga2jDoWMKICAgIGlmIChJc0FwcGVhcig0LGRzKSkgcmV0dXJuIGRzLnNpemUoKSA9PSAxOwoKICAgIC8vIEjDoCBO4buZaSBzw6FwIG5o4bqtcCB24bubaSBuaGnhu4F1IG5o4bqldCAxIHThu4luaAogICAgaWYgKElzQXBwZWFyKDE0LGRzKSkgcmV0dXJuIGRzLnNpemUoKSA8PSAyOwoKICAgIC8vIEPDoWMgY+G6t3AgdOG7iW5oIGtow7RuZyB0aOG7gyBzw6FwIG5o4bqtcCB2w6wgduG6pW4gxJHhu4EgduG7gSBnaWFvIHRow7RuZwovLyAgICBpZiAoSXNBcHBlYXIoMzMsZHMpICYmIElzQXBwZWFyKDM0LGRzKSkgcmV0dXJuIGZhbHNlOwovLyAgICBpZiAoSXNBcHBlYXIoMjIsZHMpICYmIElzQXBwZWFyKDIzLGRzKSkgcmV0dXJuIGZhbHNlOwovLyAgICBpZiAoSXNBcHBlYXIoMTgsZHMpICYmIElzQXBwZWFyKDExLGRzKSkgcmV0dXJuIGZhbHNlOwovLyAgICBpZiAoSXNBcHBlYXIoMzUsZHMpICYmIElzQXBwZWFyKDM4LGRzKSkgcmV0dXJuIGZhbHNlOwovLyAgICBpZiAoSXNBcHBlYXIoMzcsZHMpICYmIElzQXBwZWFyKDM5LGRzKSkgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFjDqXQgY8OhYyDEkWnhu4F1IGtp4buHbiB24buBIGRp4buHbiB0w61jaCB2w6AgZMOibiBz4buRCiAgICBpbnQgU3VtX0FyZWEgPSAwOwogICAgbG9uZyBsb25nIFN1bV9Qb3B1bGF0aW9uID0gMDsKICAgIGZvciAoaW50IHggOiBkcykgewogICAgICAgIFN1bV9BcmVhICs9IEFyZWFbeF07CiAgICAgICAgU3VtX1BvcHVsYXRpb24gKz0gUG9wdWxhdGlvblt4XTsKICAgIH0KICAgIHJldHVybiBTdW1fQXJlYSA+PSBNaW5fQXJlYSAmJiBTdW1fUG9wdWxhdGlvbiA+PSBNaW5fUG9wdWxhdGlvbiAmJiBTdW1fQXJlYSA8PSBNYXhfQXJlYTsKfQoKaW50IFN1bUdSRFAodmVjdG9yPGludD4gJiBkcykgewogICAgaW50IHN1bSA9IDA7CiAgICBmb3IgKGludCB4IDogZHMpIHsKICAgICAgICBzdW0gKz0gR1JEUFt4XTsKICAgIH0KICAgIHJldHVybiBzdW07Cn0KCnZvaWQgUHVzaChpbnQgcG9zLGludCBtLGludCBPbGRNYXNrLHZlY3RvcjxpbnQ+IGRzKSB7Ci8vIEPhuq1wIG5o4bqtdCBnacOhIHRy4buLIHThu5FpIMawdSB2w6AgbMawdSB24bq/dCBjaG8gdHLhuqFuZyB0aMOhaSBt4bubaSBraGkgc8OhcCBuaOG6rXAgY+G7pW0gdOG7iW5oIFtkc10KICAgIGlmICghQ2hlY2soZHMpKSByZXR1cm47CiAgICBmb3IgKGludCB4IDogZHMpIGlmIChCSVQoT2xkTWFzayx4IC0gcG9zKSkgcmV0dXJuOwogICAgaW50IE5ld01hc2sgPSBPbGRNYXNrOwogICAgZm9yIChpbnQgeCA6IGRzKSBOZXdNYXNrIHw9IE1BU0soeCAtIHBvcyk7CiAgICBpZiAobWluaW1pemUoZltwb3NdW20rMV1bTmV3TWFza10sZltwb3NdW21dW09sZE1hc2tdICsgU1FSKFN1bUdSRFAoZHMpKSkpIHsKICAgICAgICB0cmFjZVtwb3NdW20rMV1bTmV3TWFza10gPSAwOwogICAgICAgIGZvciAoaW50IHggOiBkcykgdHJhY2VbcG9zXVttKzFdW05ld01hc2tdIHw9IE1BU0soeC1wb3MpOwogICAgfQp9Cgp2b2lkIFVwZGF0ZV9Ub19OZXh0X1Byb3ZpbmNlKGludCBwb3MpIHsKLy9D4bqtcCBuaOG6rXQgY+G7rWEgc+G7lSDEkeG7gyB4w6l0IHThu4luaCB0aeG6v3AgdGhlbwogICAgZm9yIChpbnQgbT0wO208TWF4TTttKyspIHsKICAgICAgICBmb3IgKGludCBtYXNrPTA7bWFzazxNQVNLKExvZyk7bWFzaysrKSB7CiAgICAgICAgICAgIGlmIChCSVQobWFzaywwKSAmJiBmW3Bvc11bbV1bbWFza10gPCBJTkYpIG1pbmltaXplKGZbcG9zKzFdW21dW21hc2s+PjFdLGZbcG9zXVttXVttYXNrXSk7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHNvbCgpIHsKICAgIC8vIFF1eSBob+G6oWNoIMSR4buZbmcgYml0bWFzaywgZHV54buHdCB0aGVvIMO9IHTGsOG7n25nIMSRw6MgbsOqdQogICAgZm9yIChpbnQgeD0wO3g8Tjt4KyspIHsKICAgICAgICBmb3IgKGludCBtPTA7bTxNYXhNO20rKykgewogICAgICAgICAgICBmb3IgKGludCBtYXNrPTA7bWFzazxNQVNLKExvZyk7bWFzaysrKSB7CiAgICAgICAgICAgICAgICBpZiAoQklUKG1hc2ssMCkgfHwgZlt4XVttXVttYXNrXSA+PSBJTkYpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgUHVzaCh4LG0sbWFzayx7eH0pOyAvLyB04buJbmggeCBraMO0bmcgc8OhcCBuaOG6rXAKICAgICAgICAgICAgICAgIGZvciAoaW50IHk6RWRnZVt4XSkgewogICAgICAgICAgICAgICAgICAgIGlmICh5IDw9IHgpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIFB1c2goeCxtLG1hc2sse3gseX0pOyAvLyB04buJbmggeCBzw6FwIG5o4bqtcCB24bubaSAxIHThu4luaAoKICAgICAgICAgICAgICAgICAgICAvLyBU4buJbmggeCBzw6FwIG5o4bqtcCB24bubaSAyIHThu4luaAogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHo6RWRnZVt5XSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeiA8PSB4KSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHVzaCh4LG0sbWFzayx7eCx5LHp9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgejpFZGdlW3hdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6IDw9IHggfHwgeiA9PSB5KSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHVzaCh4LG0sbWFzayx7eCx5LHp9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHggPT0gTiAtIDEpIGNvbnRpbnVlOwogICAgICAgIC8vIEPhuq1wIG5o4bqtdCBj4butYSBz4buVIHRp4bq/cCB0aGVvCiAgICAgICAgVXBkYXRlX1RvX05leHRfUHJvdmluY2UoeCk7CiAgICB9CiAgICAvLyDEkOG6t3QgUyA9IHN1bUdSRFBeMgogICAgZm9yIChpbnQgaT0wO2k8TjtpKyspIHN1bUdSRFAgKz0gR1JEUFtpXTsKICAgIGludCBTID0gU1FSKHN1bUdSRFApOwoKICAgIGludCBNID0gMDsgLy8gTMaw4bujbmcgdOG7iW5oIHNhbyBjaG8gcGjGsMahbmcgw6FuIHThu5FpIMawdSBuaOG6pXQKICAgIGZvciAoaW50IGk9MDtpPE1heE07aSsrKSB7CiAgICAgICAgaWYgKGZbTi0xXVtpXVsxXSA+PSBJTkYpIGNvbnRpbnVlOyAvLyBO4bq/dSB0csaw4budbmcgaOG7o3Agc+G7kSB04buJbmggbMOgIGkga2jDtG5nIGPDsyBwaMawxqFuZyDDoW4gdGjDrCBi4buPIHF1YQogICAgICAgIGlmIChNID09IDApIE0gPSBpOyAvLyBU4bqhbyBjaG8gTSBnacOhIHRy4buLIGJhbiDEkeG6p3UKCiAgICAgICAgLy8gTOG6pXkgc+G7lSBsxrDhu6NuZyB04buRaSDGsHUgY2hvIGjDoG0gbeG7pWMgdGnDqnUgZ2nhu69hIE0gdsOgIGkKICAgICAgICBpZiAoMUxMKihpKmZbTi0xXVtpXVsxXS1TKSpTUVIoTSkgPCAxTEwqKE0qZltOLTFdW01dWzFdLVMpKlNRUihpKSkgewogICAgICAgICAgICBNID0gaTsKICAgICAgICB9CiAgICB9CgogICAgLy8gVHJ1eSB24bq/dAogICAgaW50IHBvcyA9IE4tMTsKICAgIGludCBtYXNrID0gMTsKICAgIHdoaWxlIChNICE9IDApIHsKICAgICAgICBpZiAodHJhY2VbcG9zXVtNXVttYXNrXSA9PSAwKSB7CiAgICAgICAgICAgIHBvcy0tOwogICAgICAgICAgICBtYXNrID0gbWFzayA8PCAxIHwgMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGludCB0bXBwID0gdHJhY2VbcG9zXVtNXVttYXNrXTsKICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8TG9nO2krKykgewogICAgICAgICAgICAgICAgaWYgKEJJVCh0bXBwLGkpKSB7CiAgICAgICAgICAgICAgICAgICAgY291dCA8PCBSZWFsX0lEW2krcG9zXSA8PCAnICc7CiAgICAgICAgICAgICAgICAgICAgbWFzayBePSBNQVNLKGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIE0tLTsKICAgICAgICAgICAgY291dCA8PCAnXG4nOwogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICAvLyBmcmVvcGVuKCJZZXVDYXVfNl9Tby5vdXQiLCJ3IixzdGRvdXQpOwogICAgcHJlcGFyZSgpOwogICAgc29sKCk7Cn0K