#include <stdio.h>
#include <string.h>
#define MAX 100
typedef struct {
int id;
char studentID[20];
char name[50];
char department[30];
char message[200];
int resolved;
char solution[200];
} Complaint;
Complaint complaints[MAX];
int count = 0;
void trimNewline
(char *s
) { s
[strcspn(s
, "\n")] = '\0'; }
int validDepartment(const char *dept) {
return (strcmp(dept
, "CSE") == 0 || strcmp(dept
, "EEE") == 0 || strcmp(dept
, "CCE") == 0 || strcmp(dept
, "Other") == 0); }
void addComplaint(void) {
if (count
>= MAX
) { puts("⚠️ Complaint list is full!"); return; }
complaints[count].id = count + 1;
fgets(complaints
[count
].
studentID, sizeof(complaints
[count
].
studentID), stdin
); trimNewline(complaints[count].studentID);
while(1) {
printf("Department (CSE/EEE/CCE/Other): "); fgets(complaints
[count
].
department, sizeof(complaints
[count
].
department), stdin
); trimNewline(complaints[count].department);
if (validDepartment(complaints[count].department)) break;
else printf("❌ Invalid department! Please enter one of: CSE, EEE, CCE, Other.\n"); }
char anon;
printf("Do you want to keep your name anonymous? (Y/N): ");
if (anon == 'Y' || anon == 'y') {
strcpy(complaints
[count
].
name, "Anonymous"); } else {
fgets(complaints
[count
].
name, sizeof(complaints
[count
].
name), stdin
); trimNewline(complaints[count].name);
}
printf("Complaint message : "); fgets(complaints
[count
].
message, sizeof(complaints
[count
].
message), stdin
); trimNewline(complaints[count].message);
complaints[count].resolved = 0;
complaints[count].solution[0] = '\0';
printf("✅ Complaint submitted with ID #%d\n", complaints
[count
].
id); count++;
}
void viewAll(void) {
if (count
== 0) { puts("No complaints yet."); return; }
puts("\n--- Pending Complaints ---"); for (int i = 0; i < count; i++) {
if (!complaints[i].resolved) {
printf("\nID : %d\n", complaints
[i
].
id);
if (strcmp(complaints
[i
].
name, "Anonymous") == 0) { printf("Student ID: Hidden\n"); } else {
printf("Student ID: %s\n", complaints
[i
].
studentID); printf("Name : %s\n", complaints
[i
].
name); }
printf("Dept : %s\n", complaints
[i
].
department); printf("Message : %s\n", complaints
[i
].
message); }
}
puts("\n--- Resolved Complaints ---"); for (int i = 0; i < count; i++) {
if (complaints[i].resolved) {
printf("\nID : %d\n", complaints
[i
].
id);
if (strcmp(complaints
[i
].
name, "Anonymous") == 0) { printf("Student ID: Hidden\n"); } else {
printf("Student ID: %s\n", complaints
[i
].
studentID); printf("Name : %s\n", complaints
[i
].
name); }
printf("Dept : %s\n", complaints
[i
].
department); printf("Message : %s\n", complaints
[i
].
message); complaints[i].solution[0] ? complaints[i].solution : "(no details)");
}
}
}
void viewDepartmentComplaints(void) {
if (count
== 0) { puts("No complaints yet."); return; }
char dept[30];
while(1) {
printf("Enter department to view (CSE/EEE/CCE/Other): "); fgets(dept
, sizeof(dept
), stdin
); trimNewline(dept);
if (validDepartment(dept)) break;
else printf("❌ Invalid department! Please enter one of: CSE, EEE, CCE, Other.\n"); }
int found = 0;
printf("\n--- Complaints for %s Department ---\n", dept
); for (int i = 0; i < count; i++) {
if (strcmp(complaints
[i
].
department, dept
) == 0) { found = 1;
printf("\nID : %d\n", complaints
[i
].
id); if (strcmp(complaints
[i
].
name, "Anonymous") == 0) { printf("Student ID: Hidden\n"); } else {
printf("Student ID: %s\n", complaints
[i
].
studentID); printf("Name : %s\n", complaints
[i
].
name); }
printf("Status : %s\n", complaints
[i
].
resolved ? "Resolved" : "Pending"); printf("Message : %s\n", complaints
[i
].
message); if (complaints[i].resolved) {
printf("Solution : %s\n", complaints
[i
].
solution[0] ? complaints
[i
].
solution : "(no details)"); }
}
}
if (!found) {
printf("No complaints found for department %s.\n", dept
); }
}
void solveComplaint(void) {
if (count
== 0) { puts("No complaints to solve."); return; }
int id;
printf("Enter complaint ID to mark solved: "); if (scanf("%d", &id
) != 1) { puts("Invalid input."); return; }
if (id
< 1 || id
> count
) { puts("❌ Invalid ID."); return; } if (complaints
[id
- 1].
resolved) { puts("Already resolved."); return; }
printf("Enter solution description (optional): "); fgets(complaints
[id
- 1].
solution, sizeof(complaints[id - 1].solution), stdin);
trimNewline(complaints[id - 1].solution);
complaints[id - 1].resolved = 1;
puts("Complaint marked as solved."); }
void noticeBoard(void) {
if (count == 0) {
puts("No complaints yet."); return;
}
puts("\n==== NOTICE BOARD ====");
const char *departments[] = {"CSE", "EEE", "CCE", "Other"};
int numDept = 4;
for (int d = 0; d < numDept; d++) {
const char *dept = departments[d];
int pendingCount = 0, resolvedCount = 0;
// Check complaints count by status
for (int i = 0; i < count; i++) {
if (strcmp(complaints
[i
].
department, dept
) == 0) { if (!complaints[i].resolved) pendingCount++;
else resolvedCount++;
}
}
if (pendingCount == 0 && resolvedCount == 0) {
printf("\n-- %s Department --\nNo complaints found.\n", dept
); continue;
}
printf("\n-- %s Department --\n", dept
);
if (pendingCount > 0) {
puts("Pending Complaints:"); for (int i = 0; i < count; i++) {
if (strcmp(complaints
[i
].
department, dept
) == 0 && !complaints
[i
].
resolved) { printf("#%d | %s\n", complaints
[i
].
id, complaints
[i
].
message); }
}
} else {
puts("No pending complaints."); }
if (resolvedCount > 0) {
puts("Resolved Complaints:"); for (int i = 0; i < count; i++) {
if (strcmp(complaints
[i
].
department, dept
) == 0 && complaints
[i
].
resolved) { printf("#%d | %s\n", complaints
[i
].
id, complaints
[i
].
message); }
}
} else {
puts("No resolved complaints."); }
}
}
int main(void) {
int choice;
while (1) {
puts("\n===== Complaint Routing System ====="); puts("1. Submit Complaint"); puts("2. View All Complaints"); puts("3. View Complaints by Department"); puts("4. Solve Complaint"); if (scanf("%d", &choice
) != 1) break;
switch (choice) {
case 1: addComplaint(); break;
case 2: viewAll(); break;
case 3: viewDepartmentComplaints(); break;
case 4: solveComplaint(); break;
case 5: noticeBoard(); break;
case 6: puts("Goodbye!"); return 0; default: puts("Invalid choice!"); }
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTUFYIDEwMAoKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50ICBpZDsgICAgICAgICAgICAgICAgIAogICAgY2hhciBzdHVkZW50SURbMjBdOyAgICAgIAogICAgY2hhciBuYW1lWzUwXTsgICAgICAgICAgIAogICAgY2hhciBkZXBhcnRtZW50WzMwXTsgICAgIAogICAgY2hhciBtZXNzYWdlWzIwMF07ICAgICAgIAogICAgaW50ICByZXNvbHZlZDsgICAgICAgICAgIAogICAgY2hhciBzb2x1dGlvblsyMDBdOyAgICAgIAp9IENvbXBsYWludDsKCkNvbXBsYWludCBjb21wbGFpbnRzW01BWF07CmludCBjb3VudCA9IDA7Cgp2b2lkIHRyaW1OZXdsaW5lKGNoYXIgKnMpIHsgc1tzdHJjc3BuKHMsICJcbiIpXSA9ICdcMCc7IH0KCmludCB2YWxpZERlcGFydG1lbnQoY29uc3QgY2hhciAqZGVwdCkgewogICAgcmV0dXJuIChzdHJjbXAoZGVwdCwgIkNTRSIpID09IDAgfHwgc3RyY21wKGRlcHQsICJFRUUiKSA9PSAwIHx8IHN0cmNtcChkZXB0LCAiQ0NFIikgPT0gMCB8fCBzdHJjbXAoZGVwdCwgIk90aGVyIikgPT0gMCk7Cn0KCnZvaWQgYWRkQ29tcGxhaW50KHZvaWQpIHsKICAgIGlmIChjb3VudCA+PSBNQVgpIHsgcHV0cygi4pqg77iPIENvbXBsYWludCBsaXN0IGlzIGZ1bGwhIik7IHJldHVybjsgfQogICAgZ2V0Y2hhcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgY29tcGxhaW50c1tjb3VudF0uaWQgPSBjb3VudCArIDE7ICAgICAgCgogICAgcHJpbnRmKCJTdHVkZW50IElEICAgICAgICAgIDogIik7CiAgICBmZ2V0cyhjb21wbGFpbnRzW2NvdW50XS5zdHVkZW50SUQsIHNpemVvZihjb21wbGFpbnRzW2NvdW50XS5zdHVkZW50SUQpLCBzdGRpbik7CiAgICB0cmltTmV3bGluZShjb21wbGFpbnRzW2NvdW50XS5zdHVkZW50SUQpOwoKICAgIHdoaWxlKDEpIHsKICAgICAgICBwcmludGYoIkRlcGFydG1lbnQgKENTRS9FRUUvQ0NFL090aGVyKTogIik7CiAgICAgICAgZmdldHMoY29tcGxhaW50c1tjb3VudF0uZGVwYXJ0bWVudCwgc2l6ZW9mKGNvbXBsYWludHNbY291bnRdLmRlcGFydG1lbnQpLCBzdGRpbik7CiAgICAgICAgdHJpbU5ld2xpbmUoY29tcGxhaW50c1tjb3VudF0uZGVwYXJ0bWVudCk7CgogICAgICAgIGlmICh2YWxpZERlcGFydG1lbnQoY29tcGxhaW50c1tjb3VudF0uZGVwYXJ0bWVudCkpIGJyZWFrOwogICAgICAgIGVsc2UgcHJpbnRmKCLinYwgSW52YWxpZCBkZXBhcnRtZW50ISBQbGVhc2UgZW50ZXIgb25lIG9mOiBDU0UsIEVFRSwgQ0NFLCBPdGhlci5cbiIpOwogICAgfQoKICAgIGNoYXIgYW5vbjsKICAgIHByaW50ZigiRG8geW91IHdhbnQgdG8ga2VlcCB5b3VyIG5hbWUgYW5vbnltb3VzPyAoWS9OKTogIik7CiAgICBzY2FuZigiICVjIiwgJmFub24pOyAgICAgICAgICAgICAgICAgICAKICAgIGdldGNoYXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgIGlmIChhbm9uID09ICdZJyB8fCBhbm9uID09ICd5JykgewogICAgICAgIHN0cmNweShjb21wbGFpbnRzW2NvdW50XS5uYW1lLCAiQW5vbnltb3VzIik7CiAgICB9IGVsc2UgewogICAgICAgIHByaW50ZigiWW91ciBOYW1lICAgICAgICAgIDogIik7CiAgICAgICAgZmdldHMoY29tcGxhaW50c1tjb3VudF0ubmFtZSwgc2l6ZW9mKGNvbXBsYWludHNbY291bnRdLm5hbWUpLCBzdGRpbik7CiAgICAgICAgdHJpbU5ld2xpbmUoY29tcGxhaW50c1tjb3VudF0ubmFtZSk7CiAgICB9CgogICAgcHJpbnRmKCJDb21wbGFpbnQgbWVzc2FnZSAgIDogIik7CiAgICBmZ2V0cyhjb21wbGFpbnRzW2NvdW50XS5tZXNzYWdlLCBzaXplb2YoY29tcGxhaW50c1tjb3VudF0ubWVzc2FnZSksIHN0ZGluKTsKICAgIHRyaW1OZXdsaW5lKGNvbXBsYWludHNbY291bnRdLm1lc3NhZ2UpOwoKICAgIGNvbXBsYWludHNbY291bnRdLnJlc29sdmVkID0gMDsKICAgIGNvbXBsYWludHNbY291bnRdLnNvbHV0aW9uWzBdID0gJ1wwJzsKCiAgICBwcmludGYoIuKchSBDb21wbGFpbnQgc3VibWl0dGVkIHdpdGggSUQgIyVkXG4iLCBjb21wbGFpbnRzW2NvdW50XS5pZCk7CiAgICBjb3VudCsrOwp9Cgp2b2lkIHZpZXdBbGwodm9pZCkgewogICAgaWYgKGNvdW50ID09IDApIHsgcHV0cygiTm8gY29tcGxhaW50cyB5ZXQuIik7IHJldHVybjsgfQoKICAgIHB1dHMoIlxuLS0tIFBlbmRpbmcgQ29tcGxhaW50cyAtLS0iKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIGlmICghY29tcGxhaW50c1tpXS5yZXNvbHZlZCkgewogICAgICAgICAgICBwcmludGYoIlxuSUQgICAgICAgIDogJWRcbiIsIGNvbXBsYWludHNbaV0uaWQpOwoKICAgICAgICAgICAgaWYgKHN0cmNtcChjb21wbGFpbnRzW2ldLm5hbWUsICJBbm9ueW1vdXMiKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIlN0dWRlbnQgSUQ6IEhpZGRlblxuIik7CiAgICAgICAgICAgICAgICBwcmludGYoIk5hbWUgICAgICA6IEFub255bW91c1xuIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwcmludGYoIlN0dWRlbnQgSUQ6ICVzXG4iLCBjb21wbGFpbnRzW2ldLnN0dWRlbnRJRCk7CiAgICAgICAgICAgICAgICBwcmludGYoIk5hbWUgICAgICA6ICVzXG4iLCBjb21wbGFpbnRzW2ldLm5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwcmludGYoIkRlcHQgICAgICA6ICVzXG4iLCBjb21wbGFpbnRzW2ldLmRlcGFydG1lbnQpOwogICAgICAgICAgICBwcmludGYoIk1lc3NhZ2UgICA6ICVzXG4iLCBjb21wbGFpbnRzW2ldLm1lc3NhZ2UpOwogICAgICAgIH0KICAgIH0KCiAgICBwdXRzKCJcbi0tLSBSZXNvbHZlZCBDb21wbGFpbnRzIC0tLSIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgaWYgKGNvbXBsYWludHNbaV0ucmVzb2x2ZWQpIHsKICAgICAgICAgICAgcHJpbnRmKCJcbklEICAgICAgICA6ICVkXG4iLCBjb21wbGFpbnRzW2ldLmlkKTsKCiAgICAgICAgICAgIGlmIChzdHJjbXAoY29tcGxhaW50c1tpXS5uYW1lLCAiQW5vbnltb3VzIikgPT0gMCkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJTdHVkZW50IElEOiBIaWRkZW5cbiIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJOYW1lICAgICAgOiBBbm9ueW1vdXNcbiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcHJpbnRmKCJTdHVkZW50IElEOiAlc1xuIiwgY29tcGxhaW50c1tpXS5zdHVkZW50SUQpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJOYW1lICAgICAgOiAlc1xuIiwgY29tcGxhaW50c1tpXS5uYW1lKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHJpbnRmKCJEZXB0ICAgICAgOiAlc1xuIiwgY29tcGxhaW50c1tpXS5kZXBhcnRtZW50KTsKICAgICAgICAgICAgcHJpbnRmKCJNZXNzYWdlICAgOiAlc1xuIiwgY29tcGxhaW50c1tpXS5tZXNzYWdlKTsKICAgICAgICAgICAgcHJpbnRmKCJTb2x1dGlvbiAgOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgIGNvbXBsYWludHNbaV0uc29sdXRpb25bMF0gPyBjb21wbGFpbnRzW2ldLnNvbHV0aW9uIDogIihubyBkZXRhaWxzKSIpOwogICAgICAgIH0KICAgIH0KfQoKdm9pZCB2aWV3RGVwYXJ0bWVudENvbXBsYWludHModm9pZCkgewogICAgaWYgKGNvdW50ID09IDApIHsgcHV0cygiTm8gY29tcGxhaW50cyB5ZXQuIik7IHJldHVybjsgfQoKICAgIGNoYXIgZGVwdFszMF07CiAgICBnZXRjaGFyKCk7IC8vIGZsdXNoIG5ld2xpbmUKICAgIHdoaWxlKDEpIHsKICAgICAgICBwcmludGYoIkVudGVyIGRlcGFydG1lbnQgdG8gdmlldyAoQ1NFL0VFRS9DQ0UvT3RoZXIpOiAiKTsKICAgICAgICBmZ2V0cyhkZXB0LCBzaXplb2YoZGVwdCksIHN0ZGluKTsKICAgICAgICB0cmltTmV3bGluZShkZXB0KTsKICAgICAgICBpZiAodmFsaWREZXBhcnRtZW50KGRlcHQpKSBicmVhazsKICAgICAgICBlbHNlIHByaW50Zigi4p2MIEludmFsaWQgZGVwYXJ0bWVudCEgUGxlYXNlIGVudGVyIG9uZSBvZjogQ1NFLCBFRUUsIENDRSwgT3RoZXIuXG4iKTsKICAgIH0KCiAgICBpbnQgZm91bmQgPSAwOwogICAgcHJpbnRmKCJcbi0tLSBDb21wbGFpbnRzIGZvciAlcyBEZXBhcnRtZW50IC0tLVxuIiwgZGVwdCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICBpZiAoc3RyY21wKGNvbXBsYWludHNbaV0uZGVwYXJ0bWVudCwgZGVwdCkgPT0gMCkgewogICAgICAgICAgICBmb3VuZCA9IDE7CiAgICAgICAgICAgIHByaW50ZigiXG5JRCAgICAgICAgOiAlZFxuIiwgY29tcGxhaW50c1tpXS5pZCk7CiAgICAgICAgICAgIGlmIChzdHJjbXAoY29tcGxhaW50c1tpXS5uYW1lLCAiQW5vbnltb3VzIikgPT0gMCkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJTdHVkZW50IElEOiBIaWRkZW5cbiIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJOYW1lICAgICAgOiBBbm9ueW1vdXNcbiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcHJpbnRmKCJTdHVkZW50IElEOiAlc1xuIiwgY29tcGxhaW50c1tpXS5zdHVkZW50SUQpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJOYW1lICAgICAgOiAlc1xuIiwgY29tcGxhaW50c1tpXS5uYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGYoIlN0YXR1cyAgICA6ICVzXG4iLCBjb21wbGFpbnRzW2ldLnJlc29sdmVkID8gIlJlc29sdmVkIiA6ICJQZW5kaW5nIik7CiAgICAgICAgICAgIHByaW50ZigiTWVzc2FnZSAgIDogJXNcbiIsIGNvbXBsYWludHNbaV0ubWVzc2FnZSk7CiAgICAgICAgICAgIGlmIChjb21wbGFpbnRzW2ldLnJlc29sdmVkKSB7CiAgICAgICAgICAgICAgICBwcmludGYoIlNvbHV0aW9uICA6ICVzXG4iLCBjb21wbGFpbnRzW2ldLnNvbHV0aW9uWzBdID8gY29tcGxhaW50c1tpXS5zb2x1dGlvbiA6ICIobm8gZGV0YWlscykiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICghZm91bmQpIHsKICAgICAgICBwcmludGYoIk5vIGNvbXBsYWludHMgZm91bmQgZm9yIGRlcGFydG1lbnQgJXMuXG4iLCBkZXB0KTsKICAgIH0KfQoKdm9pZCBzb2x2ZUNvbXBsYWludCh2b2lkKSB7CiAgICBpZiAoY291bnQgPT0gMCkgeyBwdXRzKCJObyBjb21wbGFpbnRzIHRvIHNvbHZlLiIpOyByZXR1cm47IH0KCiAgICBpbnQgaWQ7CiAgICBwcmludGYoIkVudGVyIGNvbXBsYWludCBJRCB0byBtYXJrIHNvbHZlZDogIik7CiAgICBpZiAoc2NhbmYoIiVkIiwgJmlkKSAhPSAxKSB7IHB1dHMoIkludmFsaWQgaW5wdXQuIik7IHJldHVybjsgfQogICAgZ2V0Y2hhcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICBpZiAoaWQgPCAxIHx8IGlkID4gY291bnQpIHsgcHV0cygi4p2MIEludmFsaWQgSUQuIik7IHJldHVybjsgfQogICAgaWYgKGNvbXBsYWludHNbaWQgLSAxXS5yZXNvbHZlZCkgeyBwdXRzKCJBbHJlYWR5IHJlc29sdmVkLiIpOyByZXR1cm47IH0KCiAgICBwcmludGYoIkVudGVyIHNvbHV0aW9uIGRlc2NyaXB0aW9uIChvcHRpb25hbCk6ICIpOwogICAgZmdldHMoY29tcGxhaW50c1tpZCAtIDFdLnNvbHV0aW9uLAogICAgICAgICAgc2l6ZW9mKGNvbXBsYWludHNbaWQgLSAxXS5zb2x1dGlvbiksIHN0ZGluKTsKICAgIHRyaW1OZXdsaW5lKGNvbXBsYWludHNbaWQgLSAxXS5zb2x1dGlvbik7CgogICAgY29tcGxhaW50c1tpZCAtIDFdLnJlc29sdmVkID0gMTsKICAgIHB1dHMoIkNvbXBsYWludCBtYXJrZWQgYXMgc29sdmVkLiIpOwp9Cgp2b2lkIG5vdGljZUJvYXJkKHZvaWQpIHsKICAgIGlmIChjb3VudCA9PSAwKSB7IAogICAgICAgIHB1dHMoIk5vIGNvbXBsYWludHMgeWV0LiIpOyAKICAgICAgICByZXR1cm47IAogICAgfQoKICAgIHB1dHMoIlxuPT09PSBOT1RJQ0UgQk9BUkQgPT09PSIpOwoKICAgIGNvbnN0IGNoYXIgKmRlcGFydG1lbnRzW10gPSB7IkNTRSIsICJFRUUiLCAiQ0NFIiwgIk90aGVyIn07CiAgICBpbnQgbnVtRGVwdCA9IDQ7CgogICAgZm9yIChpbnQgZCA9IDA7IGQgPCBudW1EZXB0OyBkKyspIHsKICAgICAgICBjb25zdCBjaGFyICpkZXB0ID0gZGVwYXJ0bWVudHNbZF07CiAgICAgICAgaW50IHBlbmRpbmdDb3VudCA9IDAsIHJlc29sdmVkQ291bnQgPSAwOwoKICAgICAgICAvLyBDaGVjayBjb21wbGFpbnRzIGNvdW50IGJ5IHN0YXR1cwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICBpZiAoc3RyY21wKGNvbXBsYWludHNbaV0uZGVwYXJ0bWVudCwgZGVwdCkgPT0gMCkgewogICAgICAgICAgICAgICAgaWYgKCFjb21wbGFpbnRzW2ldLnJlc29sdmVkKSBwZW5kaW5nQ291bnQrKzsKICAgICAgICAgICAgICAgIGVsc2UgcmVzb2x2ZWRDb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAocGVuZGluZ0NvdW50ID09IDAgJiYgcmVzb2x2ZWRDb3VudCA9PSAwKSB7CiAgICAgICAgICAgIHByaW50ZigiXG4tLSAlcyBEZXBhcnRtZW50IC0tXG5ObyBjb21wbGFpbnRzIGZvdW5kLlxuIiwgZGVwdCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgcHJpbnRmKCJcbi0tICVzIERlcGFydG1lbnQgLS1cbiIsIGRlcHQpOwoKICAgICAgICBpZiAocGVuZGluZ0NvdW50ID4gMCkgewogICAgICAgICAgICBwdXRzKCJQZW5kaW5nIENvbXBsYWludHM6Iik7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChjb21wbGFpbnRzW2ldLmRlcGFydG1lbnQsIGRlcHQpID09IDAgJiYgIWNvbXBsYWludHNbaV0ucmVzb2x2ZWQpIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiMlZCB8ICVzXG4iLCBjb21wbGFpbnRzW2ldLmlkLCBjb21wbGFpbnRzW2ldLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHV0cygiTm8gcGVuZGluZyBjb21wbGFpbnRzLiIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHJlc29sdmVkQ291bnQgPiAwKSB7CiAgICAgICAgICAgIHB1dHMoIlJlc29sdmVkIENvbXBsYWludHM6Iik7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChjb21wbGFpbnRzW2ldLmRlcGFydG1lbnQsIGRlcHQpID09IDAgJiYgY29tcGxhaW50c1tpXS5yZXNvbHZlZCkgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiIyVkIHwgJXNcbiIsIGNvbXBsYWludHNbaV0uaWQsIGNvbXBsYWludHNbaV0ubWVzc2FnZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwdXRzKCJObyByZXNvbHZlZCBjb21wbGFpbnRzLiIpOwogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4odm9pZCkgewogICAgaW50IGNob2ljZTsKICAgIHdoaWxlICgxKSB7CiAgICAgICAgcHV0cygiXG49PT09PSBDb21wbGFpbnQgUm91dGluZyBTeXN0ZW0gPT09PT0iKTsKICAgICAgICBwdXRzKCIxLiBTdWJtaXQgQ29tcGxhaW50Iik7CiAgICAgICAgcHV0cygiMi4gVmlldyBBbGwgQ29tcGxhaW50cyIpOwogICAgICAgIHB1dHMoIjMuIFZpZXcgQ29tcGxhaW50cyBieSBEZXBhcnRtZW50Iik7CiAgICAgICAgcHV0cygiNC4gU29sdmUgQ29tcGxhaW50Iik7CiAgICAgICAgcHV0cygiNS4gTm90aWNlIEJvYXJkIik7CiAgICAgICAgcHV0cygiNi4gRXhpdCIpOwogICAgICAgIHByaW50ZigiRW50ZXIgY2hvaWNlOiAiKTsKICAgICAgICBpZiAoc2NhbmYoIiVkIiwgJmNob2ljZSkgIT0gMSkgYnJlYWs7CgogICAgICAgIHN3aXRjaCAoY2hvaWNlKSB7CiAgICAgICAgICAgIGNhc2UgMTogYWRkQ29tcGxhaW50KCk7ICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOiB2aWV3QWxsKCk7ICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM6IHZpZXdEZXBhcnRtZW50Q29tcGxhaW50cygpOyBicmVhazsKICAgICAgICAgICAgY2FzZSA0OiBzb2x2ZUNvbXBsYWludCgpOyAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDU6IG5vdGljZUJvYXJkKCk7ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNjogcHV0cygiR29vZGJ5ZSEiKTsgcmV0dXJuIDA7CiAgICAgICAgICAgIGRlZmF1bHQ6IHB1dHMoIkludmFsaWQgY2hvaWNlISIpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9Cg==