#include <stdio.h>
#include <string.h>
struct Core{
int skills[10];//1 to 9,skills[n]= true if core contains skill n
int skillOrder[3];//records the ordering of skills
};
struct SkillOccur {
int skill//which skill
,occur;//the amount of subjects of this skill
};
void modeOne(struct Core core[], int coreCount, int enumerate,int priority[6]);
void modeTwo(struct Core core[], int coreCount, int enumerate, int priority[6]);
int main() {
/*�ѼƳ]�w��*/
char mode = '1';/*�]�w'1'��4��6�� ,'2'�� 6��9��*/
char enumerate = '2';/*�] '1' �C�X�Ҧ���,�]'2' �C�Ĥ@�զX�G������,�]'3'�C�Ĥ@�ո� */
printf("�w��ϥη����������֤߿z�ᄍ~~\n\n");
/*�Цb�}�C��1����J�z�������֤ߡA�Ψӧ�|�֤��ޡA�H','���j*/
char s1[2000] = "123,143,125,164,136,421,435,415,451,435,431,412,412,432,413,451,652,651,621,615,632,624,623,615,653,523,546,563,562,542,361,352,362,326,356,346,364,324,354,365,264,213,245,236,214";
/*�Цb�}�C��2����J�z�������֤ߡA�Ψӧ䤻�֤E�ޡA�H','���j*/
char s2[2000] =
",629,647,687,361,317,316,368,386,378,386,328,312,394,359,321,394,387,586,549,546,564,583,518,584,538,539,532,518,572,726,768,719,786,764,783,764,746,783,762,243,257,291,476,426,459,431,468,485,459,462,496,473,439,489,429,436,497";
char *s;
if (mode == '1')s=s1;
else s=s2;
//967841
struct SkillOccur stack[10];
int a, b;
for (a = 0; a < 10; a++) { stack[a].occur = 0; stack[a].skill = a; }
struct Core core[1000];
int coreCount = 0;
char*p=s;
while (1) {
if (*p == 0)break;
if (*p == '0' || *(p + 1) == '0') {
stack[*(p + 2) - 48].occur++;
p += 4; continue;
}
else if(*p==',')p++;
for (int i = 0; i < 10; i++) {
core[coreCount].skills[i] = 0;
}
for (int i = 0; i < 3; i++) {
core[coreCount].skillOrder[i] = *(p)-48;
core[coreCount].skills[*(p)-48] = 1;
p++;
}
coreCount++;
}
/*data input done*/
/*printing cores, recording subject distribution*/
printf("�C�X�֦����֤�...\n");
for (a = 0; a < coreCount; a++) {
printf("�֤߽s��:%d, [ ", a + 1);
for (b = 0; b < 3; b++) {
printf("%d ", core[a].skillOrder[b]);
if (b == 2) { stack[core[a].skillOrder[b]].occur += 1; stack[core[a].skillOrder[b]].skill = core[a].skillOrder[b]; }
}
printf("]\n");
}
/*bubblesort the stack*/
struct SkillOccur temp;
for (a = 1; a <= 8; a++) {
for (b = 1; b <= 8 - (a-1); b++) {
if (stack[b].occur > stack[b + 1].occur) {
temp = stack[b+1];
stack[b+1] = stack[b];
stack[b] = temp;
}
}
}
/*�C�X�D���X�{����*/
printf("�C�X�D���X�{����\n");
b = 9;//the top of the sorted stack
for (a = 1; a <= b; a++) printf("�D��%d�X�{%d\n",stack[a].skill,stack[a].occur);
int priority[6];
if (mode == '1')
for (a = 0; a < 4; a++)//we want the top 4 of the stack as priority
priority[a] = stack[b - a].skill;
else for (a = 0; a <6; a++)//we want the top 6 of the stack as priority
priority[a] = stack[b - a].skill;
/*search*/
if (mode == '1')modeOne(core, coreCount,enumerate, priority);
else modeTwo(core, coreCount, enumerate, priority);
return 0;
}
void modeOne(struct Core core[],int coreCount,int enumerate, int priority[6]) {
/*
finding core combinations using brute force loops
*/
int selected[7] = { 0 };
int hold[4];
int i, j, k, l,a,b;
printf("start\n");
for (i = 0; i < coreCount; i++) {
for (a = 1; a <= 6; a++) {
if (core[i].skills[a])
selected[a] += 1;
}
hold[0] = i;/*selected 1 core*/
for (j = 0; j < coreCount; j++) {
if (j == i)continue;
for (a = 1; a <= 6; a++) {
if (core[j].skills[a])
selected[a] += 1;
}
hold[1] = j;//selected 2 cores
for (k = 0; k < coreCount; k++) {
if (k == i || k == j)continue;
int sentinel = 0;
for (a = 1; a <= 6; a++) {
if (core[k].skills[a] && 3 <= selected[a] + 1)/*if 3== selected[a] + 1, then reject subtree*/
{
sentinel = 1; break;
}
}
if (sentinel)continue;
for (a = 1; a <= 6; a++) {
if (core[k].skills[a])
selected[a] += 1;
}
hold[2] = k;//selected 3 cores
for (l = 0; l < coreCount; l++) {
if (l == i || l == j || l == k)continue;
for (a = 1; a <= 6; a++) {
if (core[l].skills[a])
selected[a] += 1;
}
hold[3] = l;//selected 4 cores, checkpoint
if (selected[1] == 2//checking condition
&& selected[2] == 2
&& selected[3] == 2
&& selected[4] == 2
&& selected[5] == 2
&& selected[6] == 2
) {
//printf("\n找到一組4核六技!\n");
int checkDup[4] = { 0,0,0,0 }, dupCount = 0;
for (a = 0; a < 4; a++) {
// printf("核心編號:%d, [ ", hold[a] + 1);
checkDup[dupCount] = core[hold[a]].skillOrder[2];
dupCount++;
// printf("]\n\n");
}
if (checkDup[0] != checkDup[1] &&
checkDup[0] != checkDup[2] &&
checkDup[0] != checkDup[3] &&
checkDup[1] != checkDup[2] &&
checkDup[1] != checkDup[3] &&
checkDup[2] != checkDup[3]
) {
int prefered = 0;
/*compare priority and checkdup*/
for (a = 0; a < 4; a++)
for (b = 0; b < 4; b++)
if (priority[a] == checkDup[b])
prefered++;
if (prefered == 4)
printf("\n找到一組四核六技!,且它的主詞符合您持有數量前四多的主詞!(%d,%d,%d,%d)\n", priority[0], priority[1], priority[2], priority[3]);
/*else
printf("\n找到一組四核六技!,但它的主詞不符合您持有數量前四多的主詞(%d,%d,%d,%d)", priority[0], priority[1], priority[2], priority[3]);*/
if (prefered != 4 && enumerate == '2') {
for (a = 1; a <= 6; a++) {
if (core[l].skills[a])
selected[a] -= 1;
}
continue;
}
printf("\n");
for (a = 0; a < 4; a++) {
printf("核心編號:%d, [ ", hold[a] + 1);
for (b = 0; b < 3; b++) {
printf("%d ", core[hold[a]].skillOrder[b]);
}
printf("]\n");
}
if (enumerate == '2'&&prefered == 4) { return; }
else if(enumerate == '3') { return; }
}
}
for (a = 1; a <= 6; a++) {
if (core[l].skills[a])
selected[a] -= 1;
}
}
for (a = 1; a <= 6; a++) {
if (core[k].skills[a])
selected[a] -= 1;
}
}
for (a = 1; a <= 6; a++) {
if (core[j].skills[a])
selected[a] -= 1;
}
}
for (a = 1; a <= 6; a++) {
if (core[i].skills[a])
selected[a] -= 1;
}
}
printf("\ndone(若都沒有出現\"找到一組4核六技!\"字樣,表示沒有發現可能的組合,請再多蒐集一些核心!)\n");
}
void modeTwo(struct Core core[], int coreCount, int enumerate, int priority[6]) {
/*
finding core combinations using brute force loops
*/
int selected[10] = { 0 };
int hold[6];
int i, j, k, l,m,n, a, b, sentinel;
printf("start\n");
for (i = 0; i < coreCount; i++) {
for (a = 1; a <= 9; a++) {
if (core[i].skills[a])
selected[a] += 1;
}
hold[0] = i;//selected 1 core
for (j = 0; j < coreCount; j++) {
if (j == i)continue;
for (a = 1; a <= 9; a++) {
if (core[j].skills[a])
selected[a] += 1;
}
hold[1] = j;//selected 2 cores
for (k = 0; k < coreCount; k++) {
if (k == i || k == j)continue;
sentinel = 0;
for (a = 1; a <= 9; a++) {
if (core[k].skills[a] && 3 == selected[a] + 1)/*if 3== selected[a] + 1, then reject subtree*/
{
sentinel = 1; break;
}
}
if (sentinel)continue;
for (a = 1; a <= 9; a++) {
if (core[k].skills[a])
selected[a] += 1;
}
hold[2] = k;//selected 3 cores
for (l = 0; l < coreCount; l++) {
if (l == i || l == j||l==k)continue;
sentinel = 0;
for (a = 1; a <= 9; a++) {
if (core[l].skills[a] && 3 == selected[a] + 1)/*if 3== selected[a] + 1, then reject subtree*/
{
sentinel = 1; break;
}
}
if (sentinel)continue;
for (a = 1; a <= 9; a++) {
if (core[l].skills[a])
selected[a] += 1;
}
hold[3] = l;//selected 4 cores
for (m = 0; m < coreCount; m++) {
if (m == i || m == j || m == k||m==l)continue;
sentinel = 0;
for (a = 1; a <= 9; a++) {
if (core[m].skills[a] && 3 == selected[a] + 1)/*if 3== selected[a] + 1, then reject subtree*/
{
sentinel = 1; break;
}
}
if (sentinel)continue;
for (a = 1; a <= 9; a++) {
if (core[m].skills[a])
selected[a] += 1;
}
hold[4] = m;//selected 5 cores
for (n = 0; n < coreCount; n++) {
if (n == i || n == j || n == k||n==l||n==m)continue;
for (a = 1; a <= 9; a++) {
if (core[n].skills[a])
selected[a] += 1;
}
hold[5] = n;//selected 6 cores
if (selected[1] == 2/*final check*/
&& selected[2] == 2
&& selected[3] == 2
&& selected[4] == 2
&& selected[5] == 2
&& selected[6] == 2
&& selected[7] == 2
&& selected[8] == 2
&& selected[9] == 2
) {
//printf("\n���@��6��9��!\n");
int checkDup[6] = { 0 }, dupCount = 0;
for (a = 0; a < 6; a++) {
// printf("�֤߽s��:%d, [ ", hold[a] + 1);
checkDup[dupCount] = core[hold[a]].skillOrder[2];
dupCount++;
// printf("]\n\n");
}
if (checkDup[0] != checkDup[1] &&
checkDup[0] != checkDup[2] &&
checkDup[0] != checkDup[3] &&
checkDup[0] != checkDup[4] &&
checkDup[0] != checkDup[5] &&
checkDup[1] != checkDup[2] &&
checkDup[1] != checkDup[3] &&
checkDup[1] != checkDup[4] &&
checkDup[1] != checkDup[5] &&
checkDup[2] != checkDup[3] &&
checkDup[2] != checkDup[4] &&
checkDup[2] != checkDup[5] &&
checkDup[3] != checkDup[4] &&
checkDup[3] != checkDup[5] &&
checkDup[4] != checkDup[5]
) {
int prefered = 0;
/*compare priority and checkdup*/
for (a = 0; a < 6; a++)
for (b = 0; b < 6; b++)
if (priority[a] == checkDup[b])
prefered++;
if (prefered == 6)
printf("\n���@�դ��֤E��!�A�B�����D���ŦX�z�����ƶq�e���h���D��!\n");
/*else
printf("\n���@�դ��֤E��!�A�������D�����ŦX�z�����ƶq�e�|�h���D��");
printf("[%d,%d,%d,", priority[0], priority[1], priority[2]);
printf("%d,%d,%d]", priority[3], priority[4], priority[5]);*/
if (prefered != 6 && enumerate == '2') {/*unselect 6th core*/
for (a = 1; a <= 9; a++) {
if (core[n].skills[a])
selected[a] -= 1;
}
continue;
}
for (a = 0; a < 6; a++) {
printf("�֤߽s��:%d, [ ", hold[a] + 1);
for (b = 0; b < 3; b++) {
printf("%d ", core[hold[a]].skillOrder[b]);
}
printf("]\n");
}
if (enumerate == '2'&&prefered == 6) { return; }
else if (enumerate == '3') { return; }
}
}
for (a = 1; a <= 9; a++) {/*unselect 6th core*/
if (core[n].skills[a])
selected[a] -= 1;
}
}
for (a = 1; a <= 9; a++) {//unselect 5th core
if (core[m].skills[a])
selected[a] -= 1;
}
}
for (a = 1; a <= 9; a++) {/*unselect 4th core*/
if (core[l].skills[a])
selected[a] -= 1;
}
}
for (a = 1; a <= 9; a++) {/*unselect 3rd core*/
if (core[k].skills[a])
selected[a] -= 1;
}
}
for (a = 1; a <= 9; a++) {/*unselect 2nd core*/
if (core[j].skills[a])
selected[a] -= 1;
}
}
for (a = 1; a <= 9; a++) {/*unselect 1st core*/
if (core[i].skills[a])
selected[a] -= 1;
}
}
printf("\ndone(若都沒有出現\"找到一組6核9技!\"字樣,表示沒有發現可能的組合,請再多蒐集一些核心!)\n");
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCgpzdHJ1Y3QgQ29yZXsKCWludCBza2lsbHNbMTBdOy8vMSB0byA5LHNraWxsc1tuXT0gdHJ1ZSBpZiBjb3JlIGNvbnRhaW5zIHNraWxsIG4KCWludCBza2lsbE9yZGVyWzNdOy8vcmVjb3JkcyB0aGUgb3JkZXJpbmcgb2Ygc2tpbGxzCn07CnN0cnVjdCBTa2lsbE9jY3VyIHsKCWludCBza2lsbC8vd2hpY2ggc2tpbGwKCQksb2NjdXI7Ly90aGUgYW1vdW50IG9mIHN1YmplY3RzIG9mIHRoaXMgc2tpbGwKfTsKdm9pZCBtb2RlT25lKHN0cnVjdCBDb3JlIGNvcmVbXSwgaW50IGNvcmVDb3VudCwgaW50IGVudW1lcmF0ZSxpbnQgcHJpb3JpdHlbNl0pOwp2b2lkIG1vZGVUd28oc3RydWN0IENvcmUgY29yZVtdLCBpbnQgY29yZUNvdW50LCBpbnQgZW51bWVyYXRlLCBpbnQgcHJpb3JpdHlbNl0pOwppbnQgbWFpbigpIHsKCS8q77+90bzGs13vv71377+977+9Ki8KCWNoYXIgbW9kZSA9ICcxJzsvKu+/vV3vv713JzEn77+977+9NO+/ve+/vTbvv73vv70gLCcyJ++/ve+/vSA277+977+9Oe+/ve+/vSovCgljaGFyIGVudW1lcmF0ZSA9ICcyJzsvKu+/vV0gJzEnIO+/vUPvv71Y77+90qbvv73vv73vv70s77+9XScyJyDvv71D77+9xKRA77+91aZY77+9R++/ve+/ve+/ve+/ve+/ve+/vSzvv71dJzMn77+9Q++/vcSkQO+/vdW477+9ICovCglwcmludGYoIu+/vXfvv73vv73Ppc6377+977+977+977+977+977+977+977+977+977+91qTfv3rvv73vvrl+flxuXG4iKTsKCS8q77+90KZi77+9fe+/vUPvv73vv70x77+977+977+977+9Su+/vXrvv73vv73vv73vv73vv73vv73vv73WpN+hQe+/vc6o06fvv71877+91qTvv73vv73eoUHvv71IJywn77+977+977+9aiovCgljaGFyIHMxWzIwMDBdID0gIjEyMywxNDMsMTI1LDE2NCwxMzYsNDIxLDQzNSw0MTUsNDUxLDQzNSw0MzEsNDEyLDQxMiw0MzIsNDEzLDQ1MSw2NTIsNjUxLDYyMSw2MTUsNjMyLDYyNCw2MjMsNjE1LDY1Myw1MjMsNTQ2LDU2Myw1NjIsNTQyLDM2MSwzNTIsMzYyLDMyNiwzNTYsMzQ2LDM2NCwzMjQsMzU0LDM2NSwyNjQsMjEzLDI0NSwyMzYsMjE0IjsKCS8q77+90KZi77+9fe+/vUPvv73vv70y77+977+977+977+9Su+/vXrvv73vv73vv73vv73vv73vv73vv73WpN+hQe+/vc6o06fkpLvvv73WpEXvv73eoUHvv71IJywn77+977+977+9aiovCgljaGFyIHMyWzIwMDBdID0gCgkJICIsNjI5LDY0Nyw2ODcsMzYxLDMxNywzMTYsMzY4LDM4NiwzNzgsMzg2LDMyOCwzMTIsMzk0LDM1OSwzMjEsMzk0LDM4Nyw1ODYsNTQ5LDU0Niw1NjQsNTgzLDUxOCw1ODQsNTM4LDUzOSw1MzIsNTE4LDU3Miw3MjYsNzY4LDcxOSw3ODYsNzY0LDc4Myw3NjQsNzQ2LDc4Myw3NjIsMjQzLDI1NywyOTEsNDc2LDQyNiw0NTksNDMxLDQ2OCw0ODUsNDU5LDQ2Miw0OTYsNDczLDQzOSw0ODksNDI5LDQzNiw0OTciOwoJY2hhciAqczsKCWlmIChtb2RlID09ICcxJylzPXMxOwoJZWxzZSBzPXMyOwoJLy85Njc4NDEKCXN0cnVjdCBTa2lsbE9jY3VyIHN0YWNrWzEwXTsKCWludCBhLCBiOwoJZm9yIChhID0gMDsgYSA8IDEwOyBhKyspIHsgc3RhY2tbYV0ub2NjdXIgPSAwOyBzdGFja1thXS5za2lsbCA9IGE7IH0KCXN0cnVjdCBDb3JlIGNvcmVbMTAwMF07CglpbnQgY29yZUNvdW50ID0gMDsKCWNoYXIqcD1zOwoJd2hpbGUgKDEpIHsKCQkKCQlpZiAoKnAgPT0gMClicmVhazsKCQlpZiAoKnAgPT0gJzAnIHx8ICoocCArIDEpID09ICcwJykgewoJCQlzdGFja1sqKHAgKyAyKSAtIDQ4XS5vY2N1cisrOwoJCQlwICs9IDQ7IGNvbnRpbnVlOwoJCX0KCQllbHNlIGlmKCpwPT0nLCcpcCsrOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewoJCQljb3JlW2NvcmVDb3VudF0uc2tpbGxzW2ldID0gMDsKCQl9CgkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKCQkJY29yZVtjb3JlQ291bnRdLnNraWxsT3JkZXJbaV0gPSAqKHApLTQ4OwoJCQkJY29yZVtjb3JlQ291bnRdLnNraWxsc1sqKHApLTQ4XSA9IDE7CgkJCQlwKys7CgkJfQoJCQoJCWNvcmVDb3VudCsrOwoJfQoJLypkYXRhIGlucHV0IGRvbmUqLwoKCS8qcHJpbnRpbmcgY29yZXMsIHJlY29yZGluZyBzdWJqZWN0IGRpc3RyaWJ1dGlvbiovCgkKCQoJcHJpbnRmKCLvv71D77+9WO+/vdam77+977+977+977+91qTvv70uLi5cbiIpOwoJZm9yIChhID0gMDsgYSA8IGNvcmVDb3VudDsgYSsrKSB7CgoJCXByaW50Zigi77+91qTfvXPvv73vv706JWQsIFsgIiwgYSArIDEpOwoKCQlmb3IgKGIgPSAwOyBiIDwgMzsgYisrKSB7CgkJCXByaW50ZigiJWQgIiwgY29yZVthXS5za2lsbE9yZGVyW2JdKTsKCQkJaWYgKGIgPT0gMikgeyBzdGFja1tjb3JlW2FdLnNraWxsT3JkZXJbYl1dLm9jY3VyICs9IDE7IHN0YWNrW2NvcmVbYV0uc2tpbGxPcmRlcltiXV0uc2tpbGwgPSBjb3JlW2FdLnNraWxsT3JkZXJbYl07IH0KCQl9CgkJcHJpbnRmKCJdXG4iKTsKCX0KCS8qYnViYmxlc29ydCB0aGUgc3RhY2sqLwoJc3RydWN0IFNraWxsT2NjdXIgdGVtcDsKCWZvciAoYSA9IDE7IGEgPD0gODsgYSsrKSB7CgkJZm9yIChiID0gMTsgYiA8PSA4IC0gKGEtMSk7IGIrKykgewoJCQlpZiAoc3RhY2tbYl0ub2NjdXIgPiBzdGFja1tiICsgMV0ub2NjdXIpIHsKCQkJCXRlbXAgPSBzdGFja1tiKzFdOwoJCQkJc3RhY2tbYisxXSA9IHN0YWNrW2JdOwoJCQkJc3RhY2tbYl0gPSB0ZW1wOwoJCQl9CgkJfQoJfQoJLyrvv71D77+9WO+/vUTvv73vv73vv71Y77+9e++/ve+/ve+/ve+/vSovCglwcmludGYoIu+/vUPvv71Y77+9RO+/ve+/ve+/vVjvv71777+977+977+977+9XG4iKTsKCWIgPSA5Oy8vdGhlIHRvcCBvZiB0aGUgc29ydGVkIHN0YWNrCglmb3IgKGEgPSAxOyBhIDw9IGI7IGErKykgcHJpbnRmKCLvv71E77+977+9JWTvv71Y77+9eyVkXG4iLHN0YWNrW2FdLnNraWxsLHN0YWNrW2FdLm9jY3VyKTsKCWludCBwcmlvcml0eVs2XTsKCWlmIChtb2RlID09ICcxJykKCQlmb3IgKGEgPSAwOyBhIDwgNDsgYSsrKS8vd2Ugd2FudCB0aGUgdG9wIDQgb2YgdGhlIHN0YWNrIGFzIHByaW9yaXR5CgkJCXByaW9yaXR5W2FdID0gc3RhY2tbYiAtIGFdLnNraWxsOwoJZWxzZSBmb3IgKGEgPSAwOyBhIDw2OyBhKyspLy93ZSB3YW50IHRoZSB0b3AgNiBvZiB0aGUgc3RhY2sgYXMgcHJpb3JpdHkKCQlwcmlvcml0eVthXSA9IHN0YWNrW2IgLSBhXS5za2lsbDsKCQoJLypzZWFyY2gqLwoJaWYgKG1vZGUgPT0gJzEnKW1vZGVPbmUoY29yZSwgY29yZUNvdW50LGVudW1lcmF0ZSwgIHByaW9yaXR5KTsKCWVsc2UgbW9kZVR3byhjb3JlLCBjb3JlQ291bnQsIGVudW1lcmF0ZSwgIHByaW9yaXR5KTsKCQoJCglyZXR1cm4gMDsKfQp2b2lkIG1vZGVPbmUoc3RydWN0IENvcmUgY29yZVtdLGludCBjb3JlQ291bnQsaW50IGVudW1lcmF0ZSwgaW50IHByaW9yaXR5WzZdKSB7CgkvKgoJZmluZGluZyBjb3JlIGNvbWJpbmF0aW9ucyB1c2luZyBicnV0ZSBmb3JjZSBsb29wcwoJKi8KCWludCBzZWxlY3RlZFs3XSA9IHsgMCB9OwoJaW50IGhvbGRbNF07CglpbnQgaSwgaiwgaywgbCxhLGI7CglwcmludGYoInN0YXJ0XG4iKTsKCWZvciAoaSA9IDA7IGkgPCBjb3JlQ291bnQ7IGkrKykgewoJCQoJCWZvciAoYSA9IDE7IGEgPD0gNjsgYSsrKSB7CgkJCWlmIChjb3JlW2ldLnNraWxsc1thXSkKCQkJCXNlbGVjdGVkW2FdICs9IDE7CgkJfQoJCWhvbGRbMF0gPSBpOy8qc2VsZWN0ZWQgMSBjb3JlKi8KCQlmb3IgKGogPSAwOyBqIDwgY29yZUNvdW50OyBqKyspIHsKCQkJaWYgKGogPT0gaSljb250aW51ZTsKCQkJZm9yIChhID0gMTsgYSA8PSA2OyBhKyspIHsKCQkJCWlmIChjb3JlW2pdLnNraWxsc1thXSkKCQkJCQlzZWxlY3RlZFthXSArPSAxOwoJCQl9CgoJCQlob2xkWzFdID0gajsvL3NlbGVjdGVkIDIgY29yZXMKCQkJZm9yIChrID0gMDsgayA8IGNvcmVDb3VudDsgaysrKSB7CgkJCQlpZiAoayA9PSBpIHx8IGsgPT0gailjb250aW51ZTsKCQkJCWludCBzZW50aW5lbCA9IDA7CgkJCQlmb3IgKGEgPSAxOyBhIDw9IDY7IGErKykgewoJCQkJCWlmIChjb3JlW2tdLnNraWxsc1thXSAmJiAzIDw9IHNlbGVjdGVkW2FdICsgMSkvKmlmIDM9PSBzZWxlY3RlZFthXSArIDEsIHRoZW4gcmVqZWN0IHN1YnRyZWUqLwoJCQkJCXsKCQkJCQkJc2VudGluZWwgPSAxOyBicmVhazsKCQkJCQl9CgoJCQkJfQoJCQkJaWYgKHNlbnRpbmVsKWNvbnRpbnVlOwoJCQkJZm9yIChhID0gMTsgYSA8PSA2OyBhKyspIHsKCQkJCQlpZiAoY29yZVtrXS5za2lsbHNbYV0pCgkJCQkJCXNlbGVjdGVkW2FdICs9IDE7CgkJCQl9CgoJCQkJaG9sZFsyXSA9IGs7Ly9zZWxlY3RlZCAzIGNvcmVzCgkJCQlmb3IgKGwgPSAwOyBsIDwgY29yZUNvdW50OyBsKyspIHsKCQkJCQlpZiAobCA9PSBpIHx8IGwgPT0gaiB8fCBsID09IGspY29udGludWU7CgkJCQkJZm9yIChhID0gMTsgYSA8PSA2OyBhKyspIHsKCQkJCQkJaWYgKGNvcmVbbF0uc2tpbGxzW2FdKQoJCQkJCQkJc2VsZWN0ZWRbYV0gKz0gMTsKCQkJCQl9CgkJCQkJaG9sZFszXSA9IGw7Ly9zZWxlY3RlZCA0IGNvcmVzLCBjaGVja3BvaW50CgkJCQkJaWYgKHNlbGVjdGVkWzFdID09IDIvL2NoZWNraW5nIGNvbmRpdGlvbgoJCQkJCQkmJiBzZWxlY3RlZFsyXSA9PSAyCgkJCQkJCSYmIHNlbGVjdGVkWzNdID09IDIKCQkJCQkJJiYgc2VsZWN0ZWRbNF0gPT0gMgoJCQkJCQkmJiBzZWxlY3RlZFs1XSA9PSAyCgkJCQkJCSYmIHNlbGVjdGVkWzZdID09IDIKCQkJCQkJKSB7CgkJCQkJCS8vcHJpbnRmKCJcbuaJvuWIsOS4gOe1hDTmoLjlha3mioAhXG4iKTsKCQkJCQkJaW50IGNoZWNrRHVwWzRdID0geyAwLDAsMCwwIH0sIGR1cENvdW50ID0gMDsKCQkJCQkJZm9yIChhID0gMDsgYSA8IDQ7IGErKykgewoJCQkJCQkJLy8JcHJpbnRmKCLmoLjlv4Pnt6jomZ86JWQsIFsgIiwgaG9sZFthXSArIDEpOwoJCQkJCQkJY2hlY2tEdXBbZHVwQ291bnRdID0gY29yZVtob2xkW2FdXS5za2lsbE9yZGVyWzJdOwoJCQkJCQkJZHVwQ291bnQrKzsKCgkJCQkJCQkvLwlwcmludGYoIl1cblxuIik7CgoJCQkJCQl9CgkJCQkJCWlmIChjaGVja0R1cFswXSAhPSBjaGVja0R1cFsxXSAmJgoJCQkJCQkJY2hlY2tEdXBbMF0gIT0gY2hlY2tEdXBbMl0gJiYKCQkJCQkJCWNoZWNrRHVwWzBdICE9IGNoZWNrRHVwWzNdICYmCgkJCQkJCQljaGVja0R1cFsxXSAhPSBjaGVja0R1cFsyXSAmJgoJCQkJCQkJY2hlY2tEdXBbMV0gIT0gY2hlY2tEdXBbM10gJiYKCQkJCQkJCWNoZWNrRHVwWzJdICE9IGNoZWNrRHVwWzNdCgkJCQkJCQkpIHsKCQkJCQkJCWludCBwcmVmZXJlZCA9IDA7CgkJCQkJCQkvKmNvbXBhcmUgcHJpb3JpdHkgYW5kIGNoZWNrZHVwKi8KCQkJCQkJCQoJCQkJCQkJZm9yIChhID0gMDsgYSA8IDQ7IGErKykKCQkJCQkJCQlmb3IgKGIgPSAwOyBiIDwgNDsgYisrKQoJCQkJCQkJCQlpZiAocHJpb3JpdHlbYV0gPT0gY2hlY2tEdXBbYl0pCgkJCQkJCQkJCQlwcmVmZXJlZCsrOwoJCQkJCQkJaWYgKHByZWZlcmVkID09IDQpCgkJCQkJCQkJcHJpbnRmKCJcbuaJvuWIsOS4gOe1hOWbm+aguOWFreaKgCHvvIzkuJTlroPnmoTkuLvoqZ7nrKblkIjmgqjmjIHmnInmlbjph4/liY3lm5vlpJrnmoTkuLvoqZ4hKCVkLCVkLCVkLCVkKVxuIiwgcHJpb3JpdHlbMF0sIHByaW9yaXR5WzFdLCBwcmlvcml0eVsyXSwgcHJpb3JpdHlbM10pOwoJCQkJCQkJLyplbHNlIAoJCQkJCQkJCXByaW50ZigiXG7mib7liLDkuIDntYTlm5vmoLjlha3mioAh77yM5L2G5a6D55qE5Li76Kme5LiN56ym5ZCI5oKo5oyB5pyJ5pW46YeP5YmN5Zub5aSa55qE5Li76KmeKCVkLCVkLCVkLCVkKSIsIHByaW9yaXR5WzBdLCBwcmlvcml0eVsxXSwgcHJpb3JpdHlbMl0sIHByaW9yaXR5WzNdKTsqLwoJCQkJCQkJCgkJCQkJCQlpZiAocHJlZmVyZWQgIT0gNCAmJiBlbnVtZXJhdGUgPT0gJzInKSB7CgkJCQkJCQkJZm9yIChhID0gMTsgYSA8PSA2OyBhKyspIHsKCQkJCQkJCQkJaWYgKGNvcmVbbF0uc2tpbGxzW2FdKQoJCQkJCQkJCQkJc2VsZWN0ZWRbYV0gLT0gMTsKCQkJCQkJCQl9CgkJCQkJCQkJY29udGludWU7CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxuIik7CgoJCQkJCQkJZm9yIChhID0gMDsgYSA8IDQ7IGErKykgewoJCQkJCQkJCXByaW50Zigi5qC45b+D57eo6JmfOiVkLCBbICIsIGhvbGRbYV0gKyAxKTsKCgkJCQkJCQkJZm9yIChiID0gMDsgYiA8IDM7IGIrKykgewoKCQkJCQkJCQkJcHJpbnRmKCIlZCAiLCBjb3JlW2hvbGRbYV1dLnNraWxsT3JkZXJbYl0pOwoKCgkJCQkJCQkJfQoJCQkJCQkJCXByaW50ZigiXVxuIik7CgoJCQkJCQkJfQkKCQkJCQkJCQoJCQkJCQkJaWYgKGVudW1lcmF0ZSA9PSAnMicmJnByZWZlcmVkID09IDQpIHsgcmV0dXJuOyB9CgkJCQkJCQllbHNlIGlmKGVudW1lcmF0ZSA9PSAnMycpIHsgcmV0dXJuOyB9CgkJCQkJCX0KCQkJCQkJCgkJCQkJfQoJCQkJCWZvciAoYSA9IDE7IGEgPD0gNjsgYSsrKSB7CgkJCQkJCWlmIChjb3JlW2xdLnNraWxsc1thXSkKCQkJCQkJCXNlbGVjdGVkW2FdIC09IDE7CgkJCQkJfQoJCQkJfQoJCQkJZm9yIChhID0gMTsgYSA8PSA2OyBhKyspIHsKCQkJCQlpZiAoY29yZVtrXS5za2lsbHNbYV0pCgkJCQkJCXNlbGVjdGVkW2FdIC09IDE7CgkJCQl9CgkJCX0KCQkJZm9yIChhID0gMTsgYSA8PSA2OyBhKyspIHsKCQkJCWlmIChjb3JlW2pdLnNraWxsc1thXSkKCQkJCQlzZWxlY3RlZFthXSAtPSAxOwoJCQl9CgkJfQoJCWZvciAoYSA9IDE7IGEgPD0gNjsgYSsrKSB7CgkJCWlmIChjb3JlW2ldLnNraWxsc1thXSkKCQkJCXNlbGVjdGVkW2FdIC09IDE7CgkJfQoJfQoJcHJpbnRmKCJcbmRvbmUo6Iul6YO95rKS5pyJ5Ye654++XCLmib7liLDkuIDntYQ05qC45YWt5oqAIVwi5a2X5qij77yM6KGo56S65rKS5pyJ55m854++5Y+v6IO955qE57WE5ZCI77yM6KuL5YaN5aSa6JKQ6ZuG5LiA5Lqb5qC45b+DISlcbiIpOwoKCiB9CnZvaWQgbW9kZVR3byhzdHJ1Y3QgQ29yZSBjb3JlW10sIGludCBjb3JlQ291bnQsIGludCBlbnVtZXJhdGUsIGludCBwcmlvcml0eVs2XSkgewoJLyoKCWZpbmRpbmcgY29yZSBjb21iaW5hdGlvbnMgdXNpbmcgYnJ1dGUgZm9yY2UgbG9vcHMKCSovCglpbnQgc2VsZWN0ZWRbMTBdID0geyAwIH07CglpbnQgaG9sZFs2XTsKCWludCBpLCBqLCBrLCBsLG0sbiwgYSwgYiwgc2VudGluZWw7CglwcmludGYoInN0YXJ0XG4iKTsKCWZvciAoaSA9IDA7IGkgPCBjb3JlQ291bnQ7IGkrKykgewoJCWZvciAoYSA9IDE7IGEgPD0gOTsgYSsrKSB7CgkJCWlmIChjb3JlW2ldLnNraWxsc1thXSkKCQkJCXNlbGVjdGVkW2FdICs9IDE7CgkJfQoJCWhvbGRbMF0gPSBpOy8vc2VsZWN0ZWQgMSBjb3JlCgkJZm9yIChqID0gMDsgaiA8IGNvcmVDb3VudDsgaisrKSB7CgkJCWlmIChqID09IGkpY29udGludWU7CgkJCWZvciAoYSA9IDE7IGEgPD0gOTsgYSsrKSB7CgkJCQlpZiAoY29yZVtqXS5za2lsbHNbYV0pCgkJCQkJc2VsZWN0ZWRbYV0gKz0gMTsKCQkJfQoJCQlob2xkWzFdID0gajsvL3NlbGVjdGVkIDIgY29yZXMKCQkJZm9yIChrID0gMDsgayA8IGNvcmVDb3VudDsgaysrKSB7CgkJCQlpZiAoayA9PSBpIHx8IGsgPT0gailjb250aW51ZTsKCQkJCXNlbnRpbmVsID0gMDsKCQkJCWZvciAoYSA9IDE7IGEgPD0gOTsgYSsrKSB7CgkJCQkJaWYgKGNvcmVba10uc2tpbGxzW2FdICYmIDMgPT0gc2VsZWN0ZWRbYV0gKyAxKS8qaWYgMz09IHNlbGVjdGVkW2FdICsgMSwgdGhlbiByZWplY3Qgc3VidHJlZSovCgkJCQkJewoJCQkJCQlzZW50aW5lbCA9IDE7IGJyZWFrOwoJCQkJCX0KCgkJCQl9CgkJCQlpZiAoc2VudGluZWwpY29udGludWU7CgkJCQlmb3IgKGEgPSAxOyBhIDw9IDk7IGErKykgewoJCQkJCWlmIChjb3JlW2tdLnNraWxsc1thXSkKCQkJCQkJc2VsZWN0ZWRbYV0gKz0gMTsKCQkJCX0KCgkJCQlob2xkWzJdID0gazsvL3NlbGVjdGVkIDMgY29yZXMKCQkJCWZvciAobCA9IDA7IGwgPCBjb3JlQ291bnQ7IGwrKykgewoJCQkJCWlmIChsID09IGkgfHwgbCA9PSBqfHxsPT1rKWNvbnRpbnVlOwoJCQkJCXNlbnRpbmVsID0gMDsKCQkJCQlmb3IgKGEgPSAxOyBhIDw9IDk7IGErKykgewoJCQkJCQlpZiAoY29yZVtsXS5za2lsbHNbYV0gJiYgMyA9PSBzZWxlY3RlZFthXSArIDEpLyppZiAzPT0gc2VsZWN0ZWRbYV0gKyAxLCB0aGVuIHJlamVjdCBzdWJ0cmVlKi8KCQkJCQkJewoJCQkJCQkJc2VudGluZWwgPSAxOyBicmVhazsKCQkJCQkJfQoKCQkJCQl9CgkJCQkJaWYgKHNlbnRpbmVsKWNvbnRpbnVlOwoJCQkJCWZvciAoYSA9IDE7IGEgPD0gOTsgYSsrKSB7CgkJCQkJCWlmIChjb3JlW2xdLnNraWxsc1thXSkKCQkJCQkJCXNlbGVjdGVkW2FdICs9IDE7CgkJCQkJfQoKCQkJCQlob2xkWzNdID0gbDsvL3NlbGVjdGVkIDQgY29yZXMKCQkJCQlmb3IgKG0gPSAwOyBtIDwgY29yZUNvdW50OyBtKyspIHsKCQkJCQkJaWYgKG0gPT0gaSB8fCBtID09IGogfHwgbSA9PSBrfHxtPT1sKWNvbnRpbnVlOwoJCQkJCQlzZW50aW5lbCA9IDA7CgkJCQkJCWZvciAoYSA9IDE7IGEgPD0gOTsgYSsrKSB7CgkJCQkJCQlpZiAoY29yZVttXS5za2lsbHNbYV0gJiYgMyA9PSBzZWxlY3RlZFthXSArIDEpLyppZiAzPT0gc2VsZWN0ZWRbYV0gKyAxLCB0aGVuIHJlamVjdCBzdWJ0cmVlKi8KCQkJCQkJCXsKCQkJCQkJCQlzZW50aW5lbCA9IDE7IGJyZWFrOwoJCQkJCQkJfQoKCQkJCQkJfQoJCQkJCQlpZiAoc2VudGluZWwpY29udGludWU7CgkJCQkJCWZvciAoYSA9IDE7IGEgPD0gOTsgYSsrKSB7CgkJCQkJCQlpZiAoY29yZVttXS5za2lsbHNbYV0pCgkJCQkJCQkJc2VsZWN0ZWRbYV0gKz0gMTsKCQkJCQkJfQoKCQkJCQkJaG9sZFs0XSA9IG07Ly9zZWxlY3RlZCA1IGNvcmVzCgkJCQkJCWZvciAobiA9IDA7IG4gPCBjb3JlQ291bnQ7IG4rKykgewoJCQkJCQkJaWYgKG4gPT0gaSB8fCBuID09IGogfHwgbiA9PSBrfHxuPT1sfHxuPT1tKWNvbnRpbnVlOwoJCQkJCQkJZm9yIChhID0gMTsgYSA8PSA5OyBhKyspIHsKCQkJCQkJCQlpZiAoY29yZVtuXS5za2lsbHNbYV0pCgkJCQkJCQkJCXNlbGVjdGVkW2FdICs9IDE7CgkJCQkJCQl9CgkJCQkJCQlob2xkWzVdID0gbjsvL3NlbGVjdGVkIDYgY29yZXMKCQkJCQkJCWlmIChzZWxlY3RlZFsxXSA9PSAyLypmaW5hbCBjaGVjayovCgkJCQkJCQkJJiYgc2VsZWN0ZWRbMl0gPT0gMgoJCQkJCQkJCSYmIHNlbGVjdGVkWzNdID09IDIKCQkJCQkJCQkmJiBzZWxlY3RlZFs0XSA9PSAyCgkJCQkJCQkJJiYgc2VsZWN0ZWRbNV0gPT0gMgoJCQkJCQkJCSYmIHNlbGVjdGVkWzZdID09IDIKCQkJCQkJCQkmJiBzZWxlY3RlZFs3XSA9PSAyCgkJCQkJCQkJJiYgc2VsZWN0ZWRbOF0gPT0gMgoJCQkJCQkJCSYmIHNlbGVjdGVkWzldID09IDIKCQkJCQkJCQkpIHsKCQkJCQkJCQkvL3ByaW50ZigiXG7vv73vv73vv71A77+977+9Nu+/ve+/vTnvv73vv70hXG4iKTsKCQkJCQkJCQlpbnQgY2hlY2tEdXBbNl0gPSB7IDAgfSwgZHVwQ291bnQgPSAwOwoJCQkJCQkJCWZvciAoYSA9IDA7IGEgPCA2OyBhKyspIHsKCQkJCQkJCQkJLy8JcHJpbnRmKCLvv73WpN+9c++/ve+/vTolZCwgWyAiLCBob2xkW2FdICsgMSk7CgkJCQkJCQkJCWNoZWNrRHVwW2R1cENvdW50XSA9IGNvcmVbaG9sZFthXV0uc2tpbGxPcmRlclsyXTsKCQkJCQkJCQkJZHVwQ291bnQrKzsKCgkJCQkJCQkJCS8vCXByaW50ZigiXVxuXG4iKTsKCgkJCQkJCQkJfQoJCQkJCQkJCWlmIChjaGVja0R1cFswXSAhPSBjaGVja0R1cFsxXSAmJgoJCQkJCQkJCQljaGVja0R1cFswXSAhPSBjaGVja0R1cFsyXSAmJgoJCQkJCQkJCQljaGVja0R1cFswXSAhPSBjaGVja0R1cFszXSAmJgoJCQkJCQkJCQljaGVja0R1cFswXSAhPSBjaGVja0R1cFs0XSAmJgoJCQkJCQkJCQljaGVja0R1cFswXSAhPSBjaGVja0R1cFs1XSAmJgoJCQkJCQkJCQljaGVja0R1cFsxXSAhPSBjaGVja0R1cFsyXSAmJgoJCQkJCQkJCQljaGVja0R1cFsxXSAhPSBjaGVja0R1cFszXSAmJgoJCQkJCQkJCQljaGVja0R1cFsxXSAhPSBjaGVja0R1cFs0XSAmJgoJCQkJCQkJCQljaGVja0R1cFsxXSAhPSBjaGVja0R1cFs1XSAmJgoJCQkJCQkJCQljaGVja0R1cFsyXSAhPSBjaGVja0R1cFszXSAmJgoJCQkJCQkJCQljaGVja0R1cFsyXSAhPSBjaGVja0R1cFs0XSAmJgoJCQkJCQkJCQljaGVja0R1cFsyXSAhPSBjaGVja0R1cFs1XSAmJgoJCQkJCQkJCQljaGVja0R1cFszXSAhPSBjaGVja0R1cFs0XSAmJgoJCQkJCQkJCQljaGVja0R1cFszXSAhPSBjaGVja0R1cFs1XSAmJgoJCQkJCQkJCQljaGVja0R1cFs0XSAhPSBjaGVja0R1cFs1XQoJCQkJCQkJCQkpIHsKCQkJCQkJCQkJaW50IHByZWZlcmVkID0gMDsKCQkJCQkJCQkJLypjb21wYXJlIHByaW9yaXR5IGFuZCBjaGVja2R1cCovCgoJCQkJCQkJCQlmb3IgKGEgPSAwOyBhIDwgNjsgYSsrKQoJCQkJCQkJCQkJZm9yIChiID0gMDsgYiA8IDY7IGIrKykKCQkJCQkJCQkJCQlpZiAocHJpb3JpdHlbYV0gPT0gY2hlY2tEdXBbYl0pCgkJCQkJCQkJCQkJCXByZWZlcmVkKys7CgkJCQkJCQkJCWlmIChwcmVmZXJlZCA9PSA2KQoJCQkJCQkJCQkJcHJpbnRmKCJcbu+/ve+/ve+/vUDvv73VpO+/ve+/vdakRe+/ve+/vSHvv71B77+9Qu+/ve+/ve+/ve+/ve+/vUTvv73vv73vv73Fpljvv71677+977+977+977+977+9xrZx77+9Ze+/ve+/ve+/vWjvv73vv73vv71E77+977+9IVxuIik7CgkJCQkJCQkJCS8qZWxzZQoJCQkJCQkJCQkJcHJpbnRmKCJcbu+/ve+/ve+/vUDvv73VpO+/ve+/vdakRe+/ve+/vSHvv71B77+977+977+977+977+977+977+9RO+/ve+/ve+/ve+/ve+/vcWmWO+/vXrvv73vv73vv73vv73vv73GtnHvv71l77+9fO+/vWjvv73vv73vv71E77+977+9Iik7CgkJCQkJCQkJCXByaW50ZigiWyVkLCVkLCVkLCIsIHByaW9yaXR5WzBdLCBwcmlvcml0eVsxXSwgcHJpb3JpdHlbMl0pOwoJCQkJCQkJCQlwcmludGYoIiVkLCVkLCVkXSIsIHByaW9yaXR5WzNdLCBwcmlvcml0eVs0XSwgcHJpb3JpdHlbNV0pOyovCgkJCQkJCQkJCQoJCQkJCQkJCQlpZiAocHJlZmVyZWQgIT0gNiAmJiBlbnVtZXJhdGUgPT0gJzInKSB7Lyp1bnNlbGVjdCA2dGggY29yZSovIAoJCQkJCQkJCQkJZm9yIChhID0gMTsgYSA8PSA5OyBhKyspIHsKCQkJCQkJCQkJCQlpZiAoY29yZVtuXS5za2lsbHNbYV0pCgkJCQkJCQkJCQkJCXNlbGVjdGVkW2FdIC09IDE7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQljb250aW51ZTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlmb3IgKGEgPSAwOyBhIDwgNjsgYSsrKSB7CgkJCQkJCQkJCQlwcmludGYoIu+/vdak371z77+977+9OiVkLCBbICIsIGhvbGRbYV0gKyAxKTsKCgkJCQkJCQkJCQlmb3IgKGIgPSAwOyBiIDwgMzsgYisrKSB7CgoJCQkJCQkJCQkJCXByaW50ZigiJWQgIiwgY29yZVtob2xkW2FdXS5za2lsbE9yZGVyW2JdKTsKCgoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJcHJpbnRmKCJdXG4iKTsKCgkJCQkJCQkJCX0KCgkJCQkJCQkJCWlmIChlbnVtZXJhdGUgPT0gJzInJiZwcmVmZXJlZCA9PSA2KSB7IHJldHVybjsgfQoJCQkJCQkJCQllbHNlIGlmIChlbnVtZXJhdGUgPT0gJzMnKSB7IHJldHVybjsgfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWZvciAoYSA9IDE7IGEgPD0gOTsgYSsrKSB7Lyp1bnNlbGVjdCA2dGggY29yZSovCgkJCQkJCQkJaWYgKGNvcmVbbl0uc2tpbGxzW2FdKQoJCQkJCQkJCQlzZWxlY3RlZFthXSAtPSAxOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWZvciAoYSA9IDE7IGEgPD0gOTsgYSsrKSB7Ly91bnNlbGVjdCA1dGggY29yZQoJCQkJCQkJaWYgKGNvcmVbbV0uc2tpbGxzW2FdKQoJCQkJCQkJCXNlbGVjdGVkW2FdIC09IDE7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZm9yIChhID0gMTsgYSA8PSA5OyBhKyspIHsvKnVuc2VsZWN0IDR0aCBjb3JlKi8KCQkJCQkJaWYgKGNvcmVbbF0uc2tpbGxzW2FdKQoJCQkJCQkJc2VsZWN0ZWRbYV0gLT0gMTsKCQkJCQl9CgkJCQl9CgkJCQlmb3IgKGEgPSAxOyBhIDw9IDk7IGErKykgey8qdW5zZWxlY3QgM3JkIGNvcmUqLwoJCQkJCWlmIChjb3JlW2tdLnNraWxsc1thXSkKCQkJCQkJc2VsZWN0ZWRbYV0gLT0gMTsKCQkJCX0KCQkJCQoJCQl9CgkJCWZvciAoYSA9IDE7IGEgPD0gOTsgYSsrKSB7Lyp1bnNlbGVjdCAybmQgY29yZSovCgkJCQlpZiAoY29yZVtqXS5za2lsbHNbYV0pCgkJCQkJc2VsZWN0ZWRbYV0gLT0gMTsKCQkJfQoJCX0KCQlmb3IgKGEgPSAxOyBhIDw9IDk7IGErKykgey8qdW5zZWxlY3QgMXN0IGNvcmUqLwoJCQlpZiAoY29yZVtpXS5za2lsbHNbYV0pCgkJCQlzZWxlY3RlZFthXSAtPSAxOwoJCX0KCX0KCXByaW50ZigiXG5kb25lKOiLpemDveaykuacieWHuuePvlwi5om+5Yiw5LiA57WENuaguDnmioAhXCLlrZfmqKPvvIzooajnpLrmspLmnInnmbznj77lj6/og73nmoTntYTlkIjvvIzoq4vlho3lpJrokpDpm4bkuIDkupvmoLjlv4MhKVxuIik7Cgp9