//*******************************************************
//
// Assignment 4 - Arrays and Structures
//
// Name: John Semenuk
//
// Class: C Programming, Spring 2026
//
// Date: 29-Mar-2026
//
// Description: Program calculates pay for employees, including
// overtime, taxes, and tracks totals, averages, min, and max.
//
//********************************************************
#include <stdio.h>
#include <string.h>
#define SIZE 5
#define FIRST_NAME_SIZE 15
#define LAST_NAME_SIZE 15
#define STATE_SIZE 3
// Employee structure
struct employee {
char firstName[FIRST_NAME_SIZE];
char lastName[LAST_NAME_SIZE];
char state[STATE_SIZE];
long int clockNumber;
float wageRate;
float hours;
float overtimeHrs;
float grossPay;
float stateTax;
float fedTax;
float netPay;
};
// Totals structure
struct totals {
float total_wageRate;
float total_hours;
float total_overtimeHrs;
float total_grossPay;
float total_stateTax;
float total_fedTax;
float total_netPay;
};
// Min/Max structure
struct min_max {
float min_wageRate;
float max_wageRate;
float min_hours;
float max_hours;
float min_overtimeHrs;
float max_overtimeHrs;
float min_grossPay;
float max_grossPay;
float min_stateTax;
float max_stateTax;
float min_fedTax;
float max_fedTax;
float min_netPay;
float max_netPay;
};
// Function prototypes
void printHeader(void);
void printEmp(char[], char[], char[], long int, float, float, float, float, float, float, float);
void printEmpStatistics(struct totals, struct min_max, int);
void updateTotals(struct totals *, struct employee);
void updateMinMax(struct min_max *, struct employee);
int main() {
struct employee empList[SIZE];
struct totals totalStats = {0};
struct min_max minMaxStats = {0};
int i;
// Sample input for demonstration
char firstNames[SIZE][FIRST_NAME_SIZE] = {"John", "Alice", "Mark", "Laura", "James"};
char lastNames[SIZE][LAST_NAME_SIZE] = {"Smith", "Brown", "Taylor", "Wilson", "Kirk"};
char states[SIZE][STATE_SIZE] = {"IA","CA","NY","TX","FL"};
long clocks[SIZE] = {100001, 100002, 100003, 100004, 100005};
float wages[SIZE] = {20.0, 25.0, 22.5, 30.0, 28.0};
float hoursWorked[SIZE] = {40.0, 45.0, 38.0, 50.0, 42.5};
// Input loop and calculations
for(i=0; i<SIZE; i++) {
strcpy(empList
[i
].
firstName, firstNames
[i
]); strcpy(empList
[i
].
lastName, lastNames
[i
]); strcpy(empList
[i
].
state, states
[i
]); empList[i].clockNumber = clocks[i];
empList[i].wageRate = wages[i];
empList[i].hours = hoursWorked[i];
empList[i].overtimeHrs = (hoursWorked[i] > 40) ? hoursWorked[i] - 40 : 0;
empList[i].grossPay = (hoursWorked[i] <= 40) ? wages[i] * hoursWorked[i] : wages[i]*40 + wages[i]*1.5*empList[i].overtimeHrs;
empList[i].stateTax = empList[i].grossPay * 0.05f; // 5% state tax
empList[i].fedTax = empList[i].grossPay * 0.15f; // 15% federal tax
empList[i].netPay = empList[i].grossPay - empList[i].stateTax - empList[i].fedTax;
// Update totals and min/max
updateTotals(&totalStats, empList[i]);
updateMinMax(&minMaxStats, empList[i]);
}
// Print
printHeader();
for(i=0; i<SIZE; i++)
printEmp(empList[i].firstName, empList[i].lastName, empList[i].state, empList[i].clockNumber,
empList[i].wageRate, empList[i].hours, empList[i].overtimeHrs, empList[i].grossPay,
empList[i].stateTax, empList[i].fedTax, empList[i].netPay);
printEmpStatistics(totalStats, minMaxStats, SIZE);
return 0;
}
// Function definitions
void printHeader(void) {
printf("\n\n*** Pay Calculator ***\n"); printf("--------------------------------------------------------------------\n"); printf("Name Tax Clock# Wage Hours OT Gross State Fed Net\n"); printf("--------------------------------------------------------------------\n"); }
void printEmp(char firstName[], char lastName[], char taxState[], long int clockNumber, float wageRate,
float hours, float overtimeHrs, float grossPay, float stateTax, float fedTax, float netPay) {
char name[FIRST_NAME_SIZE + LAST_NAME_SIZE + 2];
printf("%-20.20s %-2.2s %06li %6.2f %5.1f %4.1f %7.2f %6.2f %7.2f %8.2f\n", name, taxState, clockNumber, wageRate, hours, overtimeHrs, grossPay, stateTax, fedTax, netPay);
}
void updateTotals(struct totals *totalsPtr, struct employee emp) {
totalsPtr->total_wageRate += emp.wageRate;
totalsPtr->total_hours += emp.hours;
totalsPtr->total_overtimeHrs += emp.overtimeHrs;
totalsPtr->total_grossPay += emp.grossPay;
totalsPtr->total_stateTax += emp.stateTax;
totalsPtr->total_fedTax += emp.fedTax;
totalsPtr->total_netPay += emp.netPay;
}
void updateMinMax(struct min_max *minMaxPtr, struct employee emp) {
static int firstCall = 1;
if(firstCall) {
minMaxPtr->min_wageRate = minMaxPtr->max_wageRate = emp.wageRate;
minMaxPtr->min_hours = minMaxPtr->max_hours = emp.hours;
minMaxPtr->min_overtimeHrs = minMaxPtr->max_overtimeHrs = emp.overtimeHrs;
minMaxPtr->min_grossPay = minMaxPtr->max_grossPay = emp.grossPay;
minMaxPtr->min_stateTax = minMaxPtr->max_stateTax = emp.stateTax;
minMaxPtr->min_fedTax = minMaxPtr->max_fedTax = emp.fedTax;
minMaxPtr->min_netPay = minMaxPtr->max_netPay = emp.netPay;
firstCall = 0;
return;
}
if(emp.wageRate < minMaxPtr->min_wageRate) minMaxPtr->min_wageRate = emp.wageRate;
if(emp.wageRate > minMaxPtr->max_wageRate) minMaxPtr->max_wageRate = emp.wageRate;
if(emp.hours < minMaxPtr->min_hours) minMaxPtr->min_hours = emp.hours;
if(emp.hours > minMaxPtr->max_hours) minMaxPtr->max_hours = emp.hours;
if(emp.overtimeHrs < minMaxPtr->min_overtimeHrs) minMaxPtr->min_overtimeHrs = emp.overtimeHrs;
if(emp.overtimeHrs > minMaxPtr->max_overtimeHrs) minMaxPtr->max_overtimeHrs = emp.overtimeHrs;
if(emp.grossPay < minMaxPtr->min_grossPay) minMaxPtr->min_grossPay = emp.grossPay;
if(emp.grossPay > minMaxPtr->max_grossPay) minMaxPtr->max_grossPay = emp.grossPay;
if(emp.stateTax < minMaxPtr->min_stateTax) minMaxPtr->min_stateTax = emp.stateTax;
if(emp.stateTax > minMaxPtr->max_stateTax) minMaxPtr->max_stateTax = emp.stateTax;
if(emp.fedTax < minMaxPtr->min_fedTax) minMaxPtr->min_fedTax = emp.fedTax;
if(emp.fedTax > minMaxPtr->max_fedTax) minMaxPtr->max_fedTax = emp.fedTax;
if(emp.netPay < minMaxPtr->min_netPay) minMaxPtr->min_netPay = emp.netPay;
if(emp.netPay > minMaxPtr->max_netPay) minMaxPtr->max_netPay = emp.netPay;
}
void printEmpStatistics(struct totals totalsData, struct min_max minMaxData, int theSize) {
printf("--------------------------------------------------------------------\n");
// Totals
printf("%-20s %6s %6.2f %5.1f %4.1f %7.2f %6.2f %7.2f %8.2f\n", "Totals:", "",
totalsData.total_wageRate,
totalsData.total_hours,
totalsData.total_overtimeHrs,
totalsData.total_grossPay,
totalsData.total_stateTax,
totalsData.total_fedTax,
totalsData.total_netPay);
// Averages
if(theSize > 0) {
printf("%-20s %6s %6.2f %5.1f %4.1f %7.2f %6.2f %7.2f %8.2f\n", "Averages:", "",
totalsData.total_wageRate/theSize,
totalsData.total_hours/theSize,
totalsData.total_overtimeHrs/theSize,
totalsData.total_grossPay/theSize,
totalsData.total_stateTax/theSize,
totalsData.total_fedTax/theSize,
totalsData.total_netPay/theSize);
}
// Minimums
printf("%-20s %6s %6.2f %5.1f %4.1f %7.2f %6.2f %7.2f %8.2f\n", "Minimum:", "",
minMaxData.min_wageRate,
minMaxData.min_hours,
minMaxData.min_overtimeHrs,
minMaxData.min_grossPay,
minMaxData.min_stateTax,
minMaxData.min_fedTax,
minMaxData.min_netPay);
// Maximums
printf("%-20s %6s %6.2f %5.1f %4.1f %7.2f %6.2f %7.2f %8.2f\n", "Maximum:", "",
minMaxData.max_wageRate,
minMaxData.max_hours,
minMaxData.max_overtimeHrs,
minMaxData.max_grossPay,
minMaxData.max_stateTax,
minMaxData.max_fedTax,
minMaxData.max_netPay);
printf("--------------------------------------------------------------------\n"); }
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vCi8vIEFzc2lnbm1lbnQgNCAtIEFycmF5cyBhbmQgU3RydWN0dXJlcwovLwovLyBOYW1lOiBKb2huIFNlbWVudWsKLy8KLy8gQ2xhc3M6IEMgUHJvZ3JhbW1pbmcsIFNwcmluZyAyMDI2Ci8vCi8vIERhdGU6IDI5LU1hci0yMDI2Ci8vCi8vIERlc2NyaXB0aW9uOiBQcm9ncmFtIGNhbGN1bGF0ZXMgcGF5IGZvciBlbXBsb3llZXMsIGluY2x1ZGluZwovLyBvdmVydGltZSwgdGF4ZXMsIGFuZCB0cmFja3MgdG90YWxzLCBhdmVyYWdlcywgbWluLCBhbmQgbWF4LgovLwovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBTSVpFIDUKI2RlZmluZSBGSVJTVF9OQU1FX1NJWkUgMTUKI2RlZmluZSBMQVNUX05BTUVfU0laRSAxNQojZGVmaW5lIFNUQVRFX1NJWkUgMwoKLy8gRW1wbG95ZWUgc3RydWN0dXJlCnN0cnVjdCBlbXBsb3llZSB7CiAgICBjaGFyIGZpcnN0TmFtZVtGSVJTVF9OQU1FX1NJWkVdOwogICAgY2hhciBsYXN0TmFtZVtMQVNUX05BTUVfU0laRV07CiAgICBjaGFyIHN0YXRlW1NUQVRFX1NJWkVdOwogICAgbG9uZyBpbnQgY2xvY2tOdW1iZXI7CiAgICBmbG9hdCB3YWdlUmF0ZTsKICAgIGZsb2F0IGhvdXJzOwogICAgZmxvYXQgb3ZlcnRpbWVIcnM7CiAgICBmbG9hdCBncm9zc1BheTsKICAgIGZsb2F0IHN0YXRlVGF4OwogICAgZmxvYXQgZmVkVGF4OwogICAgZmxvYXQgbmV0UGF5Owp9OwoKLy8gVG90YWxzIHN0cnVjdHVyZQpzdHJ1Y3QgdG90YWxzIHsKICAgIGZsb2F0IHRvdGFsX3dhZ2VSYXRlOwogICAgZmxvYXQgdG90YWxfaG91cnM7CiAgICBmbG9hdCB0b3RhbF9vdmVydGltZUhyczsKICAgIGZsb2F0IHRvdGFsX2dyb3NzUGF5OwogICAgZmxvYXQgdG90YWxfc3RhdGVUYXg7CiAgICBmbG9hdCB0b3RhbF9mZWRUYXg7CiAgICBmbG9hdCB0b3RhbF9uZXRQYXk7Cn07CgovLyBNaW4vTWF4IHN0cnVjdHVyZQpzdHJ1Y3QgbWluX21heCB7CiAgICBmbG9hdCBtaW5fd2FnZVJhdGU7CiAgICBmbG9hdCBtYXhfd2FnZVJhdGU7CiAgICBmbG9hdCBtaW5faG91cnM7CiAgICBmbG9hdCBtYXhfaG91cnM7CiAgICBmbG9hdCBtaW5fb3ZlcnRpbWVIcnM7CiAgICBmbG9hdCBtYXhfb3ZlcnRpbWVIcnM7CiAgICBmbG9hdCBtaW5fZ3Jvc3NQYXk7CiAgICBmbG9hdCBtYXhfZ3Jvc3NQYXk7CiAgICBmbG9hdCBtaW5fc3RhdGVUYXg7CiAgICBmbG9hdCBtYXhfc3RhdGVUYXg7CiAgICBmbG9hdCBtaW5fZmVkVGF4OwogICAgZmxvYXQgbWF4X2ZlZFRheDsKICAgIGZsb2F0IG1pbl9uZXRQYXk7CiAgICBmbG9hdCBtYXhfbmV0UGF5Owp9OwoKLy8gRnVuY3Rpb24gcHJvdG90eXBlcwp2b2lkIHByaW50SGVhZGVyKHZvaWQpOwp2b2lkIHByaW50RW1wKGNoYXJbXSwgY2hhcltdLCBjaGFyW10sIGxvbmcgaW50LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKHN0cnVjdCB0b3RhbHMsIHN0cnVjdCBtaW5fbWF4LCBpbnQpOwp2b2lkIHVwZGF0ZVRvdGFscyhzdHJ1Y3QgdG90YWxzICosIHN0cnVjdCBlbXBsb3llZSk7CnZvaWQgdXBkYXRlTWluTWF4KHN0cnVjdCBtaW5fbWF4ICosIHN0cnVjdCBlbXBsb3llZSk7CgppbnQgbWFpbigpIHsKICAgIHN0cnVjdCBlbXBsb3llZSBlbXBMaXN0W1NJWkVdOwogICAgc3RydWN0IHRvdGFscyB0b3RhbFN0YXRzID0gezB9OwogICAgc3RydWN0IG1pbl9tYXggbWluTWF4U3RhdHMgPSB7MH07CiAgICBpbnQgaTsKCiAgICAvLyBTYW1wbGUgaW5wdXQgZm9yIGRlbW9uc3RyYXRpb24KICAgIGNoYXIgZmlyc3ROYW1lc1tTSVpFXVtGSVJTVF9OQU1FX1NJWkVdID0geyJKb2huIiwgIkFsaWNlIiwgIk1hcmsiLCAiTGF1cmEiLCAiSmFtZXMifTsKICAgIGNoYXIgbGFzdE5hbWVzW1NJWkVdW0xBU1RfTkFNRV9TSVpFXSA9IHsiU21pdGgiLCAiQnJvd24iLCAiVGF5bG9yIiwgIldpbHNvbiIsICJLaXJrIn07CiAgICBjaGFyIHN0YXRlc1tTSVpFXVtTVEFURV9TSVpFXSA9IHsiSUEiLCJDQSIsIk5ZIiwiVFgiLCJGTCJ9OwogICAgbG9uZyBjbG9ja3NbU0laRV0gPSB7MTAwMDAxLCAxMDAwMDIsIDEwMDAwMywgMTAwMDA0LCAxMDAwMDV9OwogICAgZmxvYXQgd2FnZXNbU0laRV0gPSB7MjAuMCwgMjUuMCwgMjIuNSwgMzAuMCwgMjguMH07CiAgICBmbG9hdCBob3Vyc1dvcmtlZFtTSVpFXSA9IHs0MC4wLCA0NS4wLCAzOC4wLCA1MC4wLCA0Mi41fTsKCiAgICAvLyBJbnB1dCBsb29wIGFuZCBjYWxjdWxhdGlvbnMKICAgIGZvcihpPTA7IGk8U0laRTsgaSsrKSB7CiAgICAgICAgc3RyY3B5KGVtcExpc3RbaV0uZmlyc3ROYW1lLCBmaXJzdE5hbWVzW2ldKTsKICAgICAgICBzdHJjcHkoZW1wTGlzdFtpXS5sYXN0TmFtZSwgbGFzdE5hbWVzW2ldKTsKICAgICAgICBzdHJjcHkoZW1wTGlzdFtpXS5zdGF0ZSwgc3RhdGVzW2ldKTsKICAgICAgICBlbXBMaXN0W2ldLmNsb2NrTnVtYmVyID0gY2xvY2tzW2ldOwogICAgICAgIGVtcExpc3RbaV0ud2FnZVJhdGUgPSB3YWdlc1tpXTsKICAgICAgICBlbXBMaXN0W2ldLmhvdXJzID0gaG91cnNXb3JrZWRbaV07CiAgICAgICAgZW1wTGlzdFtpXS5vdmVydGltZUhycyA9IChob3Vyc1dvcmtlZFtpXSA+IDQwKSA/IGhvdXJzV29ya2VkW2ldIC0gNDAgOiAwOwogICAgICAgIGVtcExpc3RbaV0uZ3Jvc3NQYXkgPSAoaG91cnNXb3JrZWRbaV0gPD0gNDApID8gd2FnZXNbaV0gKiBob3Vyc1dvcmtlZFtpXSA6IHdhZ2VzW2ldKjQwICsgd2FnZXNbaV0qMS41KmVtcExpc3RbaV0ub3ZlcnRpbWVIcnM7CiAgICAgICAgZW1wTGlzdFtpXS5zdGF0ZVRheCA9IGVtcExpc3RbaV0uZ3Jvc3NQYXkgKiAwLjA1ZjsgIC8vIDUlIHN0YXRlIHRheAogICAgICAgIGVtcExpc3RbaV0uZmVkVGF4ID0gZW1wTGlzdFtpXS5ncm9zc1BheSAqIDAuMTVmOyAgICAvLyAxNSUgZmVkZXJhbCB0YXgKICAgICAgICBlbXBMaXN0W2ldLm5ldFBheSA9IGVtcExpc3RbaV0uZ3Jvc3NQYXkgLSBlbXBMaXN0W2ldLnN0YXRlVGF4IC0gZW1wTGlzdFtpXS5mZWRUYXg7CgogICAgICAgIC8vIFVwZGF0ZSB0b3RhbHMgYW5kIG1pbi9tYXgKICAgICAgICB1cGRhdGVUb3RhbHMoJnRvdGFsU3RhdHMsIGVtcExpc3RbaV0pOwogICAgICAgIHVwZGF0ZU1pbk1heCgmbWluTWF4U3RhdHMsIGVtcExpc3RbaV0pOwogICAgfQoKICAgIC8vIFByaW50CiAgICBwcmludEhlYWRlcigpOwogICAgZm9yKGk9MDsgaTxTSVpFOyBpKyspCiAgICAgICAgcHJpbnRFbXAoZW1wTGlzdFtpXS5maXJzdE5hbWUsIGVtcExpc3RbaV0ubGFzdE5hbWUsIGVtcExpc3RbaV0uc3RhdGUsIGVtcExpc3RbaV0uY2xvY2tOdW1iZXIsCiAgICAgICAgICAgICAgICAgZW1wTGlzdFtpXS53YWdlUmF0ZSwgZW1wTGlzdFtpXS5ob3VycywgZW1wTGlzdFtpXS5vdmVydGltZUhycywgZW1wTGlzdFtpXS5ncm9zc1BheSwKICAgICAgICAgICAgICAgICBlbXBMaXN0W2ldLnN0YXRlVGF4LCBlbXBMaXN0W2ldLmZlZFRheCwgZW1wTGlzdFtpXS5uZXRQYXkpOwoKICAgIHByaW50RW1wU3RhdGlzdGljcyh0b3RhbFN0YXRzLCBtaW5NYXhTdGF0cywgU0laRSk7CgogICAgcmV0dXJuIDA7Cn0KCi8vIEZ1bmN0aW9uIGRlZmluaXRpb25zCnZvaWQgcHJpbnRIZWFkZXIodm9pZCkgewogICAgcHJpbnRmKCJcblxuKioqIFBheSBDYWxjdWxhdG9yICoqKlxuIik7CiAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgIHByaW50ZigiTmFtZSAgICAgICAgICAgICAgICAgVGF4ICBDbG9jayMgIFdhZ2UgICBIb3VycyAgIE9UICAgIEdyb3NzICAgU3RhdGUgICBGZWQgICAgIE5ldFxuIik7CiAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKfQoKdm9pZCBwcmludEVtcChjaGFyIGZpcnN0TmFtZVtdLCBjaGFyIGxhc3ROYW1lW10sIGNoYXIgdGF4U3RhdGVbXSwgbG9uZyBpbnQgY2xvY2tOdW1iZXIsIGZsb2F0IHdhZ2VSYXRlLAogICAgICAgICAgICAgIGZsb2F0IGhvdXJzLCBmbG9hdCBvdmVydGltZUhycywgZmxvYXQgZ3Jvc3NQYXksIGZsb2F0IHN0YXRlVGF4LCBmbG9hdCBmZWRUYXgsIGZsb2F0IG5ldFBheSkgewoKICAgIGNoYXIgbmFtZVtGSVJTVF9OQU1FX1NJWkUgKyBMQVNUX05BTUVfU0laRSArIDJdOwogICAgc3RyY3B5KG5hbWUsIGZpcnN0TmFtZSk7CiAgICBzdHJjYXQobmFtZSwgIiAiKTsKICAgIHN0cmNhdChuYW1lLCBsYXN0TmFtZSk7CgogICAgcHJpbnRmKCIlLTIwLjIwcyAlLTIuMnMgICUwNmxpICU2LjJmICAlNS4xZiAgJTQuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmZcbiIsCiAgICAgICAgICAgbmFtZSwgdGF4U3RhdGUsIGNsb2NrTnVtYmVyLCB3YWdlUmF0ZSwgaG91cnMsIG92ZXJ0aW1lSHJzLCBncm9zc1BheSwgc3RhdGVUYXgsIGZlZFRheCwgbmV0UGF5KTsKfQoKdm9pZCB1cGRhdGVUb3RhbHMoc3RydWN0IHRvdGFscyAqdG90YWxzUHRyLCBzdHJ1Y3QgZW1wbG95ZWUgZW1wKSB7CiAgICB0b3RhbHNQdHItPnRvdGFsX3dhZ2VSYXRlICs9IGVtcC53YWdlUmF0ZTsKICAgIHRvdGFsc1B0ci0+dG90YWxfaG91cnMgKz0gZW1wLmhvdXJzOwogICAgdG90YWxzUHRyLT50b3RhbF9vdmVydGltZUhycyArPSBlbXAub3ZlcnRpbWVIcnM7CiAgICB0b3RhbHNQdHItPnRvdGFsX2dyb3NzUGF5ICs9IGVtcC5ncm9zc1BheTsKICAgIHRvdGFsc1B0ci0+dG90YWxfc3RhdGVUYXggKz0gZW1wLnN0YXRlVGF4OwogICAgdG90YWxzUHRyLT50b3RhbF9mZWRUYXggKz0gZW1wLmZlZFRheDsKICAgIHRvdGFsc1B0ci0+dG90YWxfbmV0UGF5ICs9IGVtcC5uZXRQYXk7Cn0KCnZvaWQgdXBkYXRlTWluTWF4KHN0cnVjdCBtaW5fbWF4ICptaW5NYXhQdHIsIHN0cnVjdCBlbXBsb3llZSBlbXApIHsKICAgIHN0YXRpYyBpbnQgZmlyc3RDYWxsID0gMTsKCiAgICBpZihmaXJzdENhbGwpIHsKICAgICAgICBtaW5NYXhQdHItPm1pbl93YWdlUmF0ZSA9IG1pbk1heFB0ci0+bWF4X3dhZ2VSYXRlID0gZW1wLndhZ2VSYXRlOwogICAgICAgIG1pbk1heFB0ci0+bWluX2hvdXJzID0gbWluTWF4UHRyLT5tYXhfaG91cnMgPSBlbXAuaG91cnM7CiAgICAgICAgbWluTWF4UHRyLT5taW5fb3ZlcnRpbWVIcnMgPSBtaW5NYXhQdHItPm1heF9vdmVydGltZUhycyA9IGVtcC5vdmVydGltZUhyczsKICAgICAgICBtaW5NYXhQdHItPm1pbl9ncm9zc1BheSA9IG1pbk1heFB0ci0+bWF4X2dyb3NzUGF5ID0gZW1wLmdyb3NzUGF5OwogICAgICAgIG1pbk1heFB0ci0+bWluX3N0YXRlVGF4ID0gbWluTWF4UHRyLT5tYXhfc3RhdGVUYXggPSBlbXAuc3RhdGVUYXg7CiAgICAgICAgbWluTWF4UHRyLT5taW5fZmVkVGF4ID0gbWluTWF4UHRyLT5tYXhfZmVkVGF4ID0gZW1wLmZlZFRheDsKICAgICAgICBtaW5NYXhQdHItPm1pbl9uZXRQYXkgPSBtaW5NYXhQdHItPm1heF9uZXRQYXkgPSBlbXAubmV0UGF5OwogICAgICAgIGZpcnN0Q2FsbCA9IDA7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmKGVtcC53YWdlUmF0ZSA8IG1pbk1heFB0ci0+bWluX3dhZ2VSYXRlKSBtaW5NYXhQdHItPm1pbl93YWdlUmF0ZSA9IGVtcC53YWdlUmF0ZTsKICAgIGlmKGVtcC53YWdlUmF0ZSA+IG1pbk1heFB0ci0+bWF4X3dhZ2VSYXRlKSBtaW5NYXhQdHItPm1heF93YWdlUmF0ZSA9IGVtcC53YWdlUmF0ZTsKCiAgICBpZihlbXAuaG91cnMgPCBtaW5NYXhQdHItPm1pbl9ob3VycykgbWluTWF4UHRyLT5taW5faG91cnMgPSBlbXAuaG91cnM7CiAgICBpZihlbXAuaG91cnMgPiBtaW5NYXhQdHItPm1heF9ob3VycykgbWluTWF4UHRyLT5tYXhfaG91cnMgPSBlbXAuaG91cnM7CgogICAgaWYoZW1wLm92ZXJ0aW1lSHJzIDwgbWluTWF4UHRyLT5taW5fb3ZlcnRpbWVIcnMpIG1pbk1heFB0ci0+bWluX292ZXJ0aW1lSHJzID0gZW1wLm92ZXJ0aW1lSHJzOwogICAgaWYoZW1wLm92ZXJ0aW1lSHJzID4gbWluTWF4UHRyLT5tYXhfb3ZlcnRpbWVIcnMpIG1pbk1heFB0ci0+bWF4X292ZXJ0aW1lSHJzID0gZW1wLm92ZXJ0aW1lSHJzOwoKICAgIGlmKGVtcC5ncm9zc1BheSA8IG1pbk1heFB0ci0+bWluX2dyb3NzUGF5KSBtaW5NYXhQdHItPm1pbl9ncm9zc1BheSA9IGVtcC5ncm9zc1BheTsKICAgIGlmKGVtcC5ncm9zc1BheSA+IG1pbk1heFB0ci0+bWF4X2dyb3NzUGF5KSBtaW5NYXhQdHItPm1heF9ncm9zc1BheSA9IGVtcC5ncm9zc1BheTsKCiAgICBpZihlbXAuc3RhdGVUYXggPCBtaW5NYXhQdHItPm1pbl9zdGF0ZVRheCkgbWluTWF4UHRyLT5taW5fc3RhdGVUYXggPSBlbXAuc3RhdGVUYXg7CiAgICBpZihlbXAuc3RhdGVUYXggPiBtaW5NYXhQdHItPm1heF9zdGF0ZVRheCkgbWluTWF4UHRyLT5tYXhfc3RhdGVUYXggPSBlbXAuc3RhdGVUYXg7CgogICAgaWYoZW1wLmZlZFRheCA8IG1pbk1heFB0ci0+bWluX2ZlZFRheCkgbWluTWF4UHRyLT5taW5fZmVkVGF4ID0gZW1wLmZlZFRheDsKICAgIGlmKGVtcC5mZWRUYXggPiBtaW5NYXhQdHItPm1heF9mZWRUYXgpIG1pbk1heFB0ci0+bWF4X2ZlZFRheCA9IGVtcC5mZWRUYXg7CgogICAgaWYoZW1wLm5ldFBheSA8IG1pbk1heFB0ci0+bWluX25ldFBheSkgbWluTWF4UHRyLT5taW5fbmV0UGF5ID0gZW1wLm5ldFBheTsKICAgIGlmKGVtcC5uZXRQYXkgPiBtaW5NYXhQdHItPm1heF9uZXRQYXkpIG1pbk1heFB0ci0+bWF4X25ldFBheSA9IGVtcC5uZXRQYXk7Cn0KCnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKHN0cnVjdCB0b3RhbHMgdG90YWxzRGF0YSwgc3RydWN0IG1pbl9tYXggbWluTWF4RGF0YSwgaW50IHRoZVNpemUpIHsKICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwoKICAgIC8vIFRvdGFscwogICAgcHJpbnRmKCIlLTIwcyAgICAgICAlNnMgJTYuMmYgJTUuMWYgJTQuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmZcbiIsCiAgICAgICAgICAgIlRvdGFsczoiLCAiIiwKICAgICAgICAgICB0b3RhbHNEYXRhLnRvdGFsX3dhZ2VSYXRlLAogICAgICAgICAgIHRvdGFsc0RhdGEudG90YWxfaG91cnMsCiAgICAgICAgICAgdG90YWxzRGF0YS50b3RhbF9vdmVydGltZUhycywKICAgICAgICAgICB0b3RhbHNEYXRhLnRvdGFsX2dyb3NzUGF5LAogICAgICAgICAgIHRvdGFsc0RhdGEudG90YWxfc3RhdGVUYXgsCiAgICAgICAgICAgdG90YWxzRGF0YS50b3RhbF9mZWRUYXgsCiAgICAgICAgICAgdG90YWxzRGF0YS50b3RhbF9uZXRQYXkpOwoKICAgIC8vIEF2ZXJhZ2VzCiAgICBpZih0aGVTaXplID4gMCkgewogICAgICAgIHByaW50ZigiJS0yMHMgICAgICAgJTZzICU2LjJmICU1LjFmICU0LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmXG4iLAogICAgICAgICAgICAgICAiQXZlcmFnZXM6IiwgIiIsCiAgICAgICAgICAgICAgIHRvdGFsc0RhdGEudG90YWxfd2FnZVJhdGUvdGhlU2l6ZSwKICAgICAgICAgICAgICAgdG90YWxzRGF0YS50b3RhbF9ob3Vycy90aGVTaXplLAogICAgICAgICAgICAgICB0b3RhbHNEYXRhLnRvdGFsX292ZXJ0aW1lSHJzL3RoZVNpemUsCiAgICAgICAgICAgICAgIHRvdGFsc0RhdGEudG90YWxfZ3Jvc3NQYXkvdGhlU2l6ZSwKICAgICAgICAgICAgICAgdG90YWxzRGF0YS50b3RhbF9zdGF0ZVRheC90aGVTaXplLAogICAgICAgICAgICAgICB0b3RhbHNEYXRhLnRvdGFsX2ZlZFRheC90aGVTaXplLAogICAgICAgICAgICAgICB0b3RhbHNEYXRhLnRvdGFsX25ldFBheS90aGVTaXplKTsKICAgIH0KCiAgICAvLyBNaW5pbXVtcwogICAgcHJpbnRmKCIlLTIwcyAgICAgICAlNnMgJTYuMmYgJTUuMWYgJTQuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmZcbiIsCiAgICAgICAgICAgIk1pbmltdW06IiwgIiIsCiAgICAgICAgICAgbWluTWF4RGF0YS5taW5fd2FnZVJhdGUsCiAgICAgICAgICAgbWluTWF4RGF0YS5taW5faG91cnMsCiAgICAgICAgICAgbWluTWF4RGF0YS5taW5fb3ZlcnRpbWVIcnMsCiAgICAgICAgICAgbWluTWF4RGF0YS5taW5fZ3Jvc3NQYXksCiAgICAgICAgICAgbWluTWF4RGF0YS5taW5fc3RhdGVUYXgsCiAgICAgICAgICAgbWluTWF4RGF0YS5taW5fZmVkVGF4LAogICAgICAgICAgIG1pbk1heERhdGEubWluX25ldFBheSk7CgogICAgLy8gTWF4aW11bXMKICAgIHByaW50ZigiJS0yMHMgICAgICAgJTZzICU2LjJmICU1LjFmICU0LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmXG4iLAogICAgICAgICAgICJNYXhpbXVtOiIsICIiLAogICAgICAgICAgIG1pbk1heERhdGEubWF4X3dhZ2VSYXRlLAogICAgICAgICAgIG1pbk1heERhdGEubWF4X2hvdXJzLAogICAgICAgICAgIG1pbk1heERhdGEubWF4X292ZXJ0aW1lSHJzLAogICAgICAgICAgIG1pbk1heERhdGEubWF4X2dyb3NzUGF5LAogICAgICAgICAgIG1pbk1heERhdGEubWF4X3N0YXRlVGF4LAogICAgICAgICAgIG1pbk1heERhdGEubWF4X2ZlZFRheCwKICAgICAgICAgICBtaW5NYXhEYXRhLm1heF9uZXRQYXkpOwoKICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwp9