//********************************************************
//
// Assignment 8 - Pointers
//
// Name: Seth Hin
//
// Class: C Programming, Spring 2026
//
// Date: April 04 2026
//
// Description: Program which determines overtime, gross pay,
// state tax, federal tax, and net pay for a set of employees.
// It also calculates totals, averages, minimum, and maximum
// values for all floating point employee data.
//
//********************************************************
#include <stdio.h>
#include <string.h>
//---------------- CONSTANTS ----------------//
#define SIZE 5
#define STD_HOURS 40.0
#define OT_RATE 1.5
#define MA_TAX_RATE 0.05
#define NH_TAX_RATE 0.0
#define VT_TAX_RATE 0.06
#define CA_TAX_RATE 0.07
#define DEFAULT_TAX_RATE 0.08
#define TAX_STATE_SIZE 3
#define FED_TAX_RATE 0.25
#define FIRST_NAME_SIZE 10
#define LAST_NAME_SIZE 10
//---------------- STRUCTURES ----------------//
struct name
{
char firstName[FIRST_NAME_SIZE];
char lastName[LAST_NAME_SIZE];
};
struct employee
{
struct name empName;
char taxState[TAX_STATE_SIZE];
long int clockNumber;
float wageRate;
float hours;
float overtimeHrs;
float grossPay;
float stateTax;
float fedTax;
float netPay;
};
struct totals
{
float total_wageRate;
float total_hours;
float total_overtimeHrs;
float total_grossPay;
float total_stateTax;
float total_fedTax;
float total_netPay;
};
struct min_max
{
float min_wageRate, min_hours, min_overtimeHrs, min_grossPay, min_stateTax, min_fedTax, min_netPay;
float max_wageRate, max_hours, max_overtimeHrs, max_grossPay, max_stateTax, max_fedTax, max_netPay;
};
//---------------- FUNCTION PROTOTYPES ----------------//
void getHours(struct employee *, int);
void calcOvertimeHrs(struct employee *, int);
void calcGrossPay(struct employee *, int);
void calcStateTax(struct employee *, int);
void calcFedTax(struct employee *, int);
void calcNetPay(struct employee *, int);
void printHeader(void);
void printEmp(struct employee *, int);
void calcEmployeeTotals(struct employee *, struct totals *, int);
void calcEmployeeMinMax(struct employee *, struct min_max *, int);
void printEmpStatistics(struct totals *, struct min_max *, int);
//---------------- MAIN ----------------//
int main()
{
struct employee employeeData[SIZE] = {
{ {"Connie", "Cobol"}, "MA", 98401, 10.60},
{ {"Mary", "Apl"}, "NH", 526488, 9.75 },
{ {"Frank", "Fortran"}, "VT", 765349, 10.50 },
{ {"Jeff", "Ada"}, "NY", 34645, 12.25 },
{ {"Anton", "Pascal"},"CA",127615, 8.35 }
};
struct employee *emp_ptr = employeeData;
struct totals employeeTotals = {0};
struct totals *emp_totals_ptr = &employeeTotals;
struct min_max employeeMinMax = {0};
struct min_max *emp_minMax_ptr = &employeeMinMax;
getHours(emp_ptr, SIZE);
calcOvertimeHrs(emp_ptr, SIZE);
calcGrossPay(emp_ptr, SIZE);
calcStateTax(emp_ptr, SIZE);
calcFedTax(emp_ptr, SIZE);
calcNetPay(emp_ptr, SIZE);
calcEmployeeTotals(emp_ptr, emp_totals_ptr, SIZE);
calcEmployeeMinMax(emp_ptr, emp_minMax_ptr, SIZE);
printHeader();
printEmp(emp_ptr, SIZE);
printEmpStatistics(emp_totals_ptr, emp_minMax_ptr, SIZE);
return 0;
}
//**************************************************************
void getHours(struct employee *emp_ptr, int size)
{
for (int i = 0; i < size; i++)
{
printf("\nEnter hours worked by emp # %06li: ", (emp_ptr
+ i
)->clockNumber
); scanf("%f", &((emp_ptr
+ i
)->hours
)); }
}
//**************************************************************
void calcOvertimeHrs(struct employee *emp_ptr, int size)
{
for (int i = 0; i < size; i++)
{
if ((emp_ptr + i)->hours > STD_HOURS)
(emp_ptr + i)->overtimeHrs = (emp_ptr + i)->hours - STD_HOURS;
else
(emp_ptr + i)->overtimeHrs = 0;
}
}
//**************************************************************
void calcGrossPay(struct employee *emp_ptr, int size)
{
for (int i = 0; i < size; i++)
{
float normal = ((emp_ptr + i)->hours - (emp_ptr + i)->overtimeHrs) * (emp_ptr + i)->wageRate;
float overtime = (emp_ptr + i)->overtimeHrs * OT_RATE * (emp_ptr + i)->wageRate;
(emp_ptr + i)->grossPay = normal + overtime;
}
}
//**************************************************************
void calcStateTax(struct employee *emp_ptr, int size)
{
for (int i = 0; i < size; i++)
{
if (strcmp((emp_ptr
+ i
)->taxState
, "MA") == 0) (emp_ptr + i)->stateTax = (emp_ptr + i)->grossPay * MA_TAX_RATE;
else if (strcmp((emp_ptr
+ i
)->taxState
, "NH") == 0) (emp_ptr + i)->stateTax = (emp_ptr + i)->grossPay * NH_TAX_RATE;
else if (strcmp((emp_ptr
+ i
)->taxState
, "VT") == 0) (emp_ptr + i)->stateTax = (emp_ptr + i)->grossPay * VT_TAX_RATE;
else if (strcmp((emp_ptr
+ i
)->taxState
, "CA") == 0) (emp_ptr + i)->stateTax = (emp_ptr + i)->grossPay * CA_TAX_RATE;
else
(emp_ptr + i)->stateTax = (emp_ptr + i)->grossPay * DEFAULT_TAX_RATE;
}
}
//**************************************************************
void calcFedTax(struct employee *emp_ptr, int size)
{
for (int i = 0; i < size; i++)
{
(emp_ptr + i)->fedTax = (emp_ptr + i)->grossPay * FED_TAX_RATE;
}
}
//**************************************************************
void calcNetPay(struct employee *emp_ptr, int size)
{
for (int i = 0; i < size; i++)
{
(emp_ptr + i)->netPay = (emp_ptr + i)->grossPay -
((emp_ptr + i)->stateTax + (emp_ptr + i)->fedTax);
}
}
//**************************************************************
void printHeader(void)
{
printf("\n\n*** Pay Calculator ***\n"); printf("\n---------------------------------------------------------------------------------"); printf("\nName Tax Clock# Wage Hours OT Gross State Fed Net"); printf("\n State Pay Tax Tax Pay"); printf("\n---------------------------------------------------------------------------------"); }
//**************************************************************
void printEmp(struct employee *emp_ptr, int size)
{
char name[25];
for (int i = 0; i < size; i++)
{
strcpy(name
, (emp_ptr
+ i
)->empName.
firstName); strcat(name
, (emp_ptr
+ i
)->empName.
lastName);
printf("\n%-20s %-2s %06li %6.2f %6.1f %5.1f %7.2f %6.2f %7.2f %8.2f", name, (emp_ptr + i)->taxState, (emp_ptr + i)->clockNumber,
(emp_ptr + i)->wageRate, (emp_ptr + i)->hours,
(emp_ptr + i)->overtimeHrs, (emp_ptr + i)->grossPay,
(emp_ptr + i)->stateTax, (emp_ptr + i)->fedTax,
(emp_ptr + i)->netPay);
}
}
//**************************************************************
void calcEmployeeTotals(struct employee *emp_ptr, struct totals *tot_ptr, int size)
{
for (int i = 0; i < size; i++)
{
tot_ptr->total_wageRate += (emp_ptr + i)->wageRate;
tot_ptr->total_hours += (emp_ptr + i)->hours;
tot_ptr->total_overtimeHrs += (emp_ptr + i)->overtimeHrs;
tot_ptr->total_grossPay += (emp_ptr + i)->grossPay;
tot_ptr->total_stateTax += (emp_ptr + i)->stateTax;
tot_ptr->total_fedTax += (emp_ptr + i)->fedTax;
tot_ptr->total_netPay += (emp_ptr + i)->netPay;
}
}
//**************************************************************
void calcEmployeeMinMax(struct employee *emp_ptr, struct min_max *m, int size)
{
*m = (struct min_max){
(emp_ptr + 0)->wageRate, (emp_ptr + 0)->hours, (emp_ptr + 0)->overtimeHrs,
(emp_ptr + 0)->grossPay, (emp_ptr + 0)->stateTax, (emp_ptr + 0)->fedTax, (emp_ptr + 0)->netPay,
(emp_ptr + 0)->wageRate, (emp_ptr + 0)->hours, (emp_ptr + 0)->overtimeHrs,
(emp_ptr + 0)->grossPay, (emp_ptr + 0)->stateTax, (emp_ptr + 0)->fedTax, (emp_ptr + 0)->netPay
};
for (int i = 1; i < size; i++)
{
if ((emp_ptr + i)->wageRate < m->min_wageRate) m->min_wageRate = (emp_ptr + i)->wageRate;
if ((emp_ptr + i)->wageRate > m->max_wageRate) m->max_wageRate = (emp_ptr + i)->wageRate;
if ((emp_ptr + i)->hours < m->min_hours) m->min_hours = (emp_ptr + i)->hours;
if ((emp_ptr + i)->hours > m->max_hours) m->max_hours = (emp_ptr + i)->hours;
if ((emp_ptr + i)->overtimeHrs < m->min_overtimeHrs) m->min_overtimeHrs = (emp_ptr + i)->overtimeHrs;
if ((emp_ptr + i)->overtimeHrs > m->max_overtimeHrs) m->max_overtimeHrs = (emp_ptr + i)->overtimeHrs;
if ((emp_ptr + i)->grossPay < m->min_grossPay) m->min_grossPay = (emp_ptr + i)->grossPay;
if ((emp_ptr + i)->grossPay > m->max_grossPay) m->max_grossPay = (emp_ptr + i)->grossPay;
if ((emp_ptr + i)->stateTax < m->min_stateTax) m->min_stateTax = (emp_ptr + i)->stateTax;
if ((emp_ptr + i)->stateTax > m->max_stateTax) m->max_stateTax = (emp_ptr + i)->stateTax;
if ((emp_ptr + i)->fedTax < m->min_fedTax) m->min_fedTax = (emp_ptr + i)->fedTax;
if ((emp_ptr + i)->fedTax > m->max_fedTax) m->max_fedTax = (emp_ptr + i)->fedTax;
if ((emp_ptr + i)->netPay < m->min_netPay) m->min_netPay = (emp_ptr + i)->netPay;
if ((emp_ptr + i)->netPay > m->max_netPay) m->max_netPay = (emp_ptr + i)->netPay;
}
}
//**************************************************************
void printEmpStatistics(struct totals *t, struct min_max *m, int size)
{
printf("\n---------------------------------------------------------------------------------");
printf("\nTotals: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f", t->total_wageRate, t->total_hours, t->total_overtimeHrs,
t->total_grossPay, t->total_stateTax, t->total_fedTax, t->total_netPay);
printf("\nAverages: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f", t->total_wageRate/size, t->total_hours/size, t->total_overtimeHrs/size,
t->total_grossPay/size, t->total_stateTax/size, t->total_fedTax/size, t->total_netPay/size);
printf("\nMinimum: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f", m->min_wageRate, m->min_hours, m->min_overtimeHrs,
m->min_grossPay, m->min_stateTax, m->min_fedTax, m->min_netPay);
printf("\nMaximum: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f\n", m->max_wageRate, m->max_hours, m->max_overtimeHrs,
m->max_grossPay, m->max_stateTax, m->max_fedTax, m->max_netPay);
}
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLwovLyBBc3NpZ25tZW50IDggLSBQb2ludGVycwovLwovLyBOYW1lOiBTZXRoIEhpbgovLwovLyBDbGFzczogQyBQcm9ncmFtbWluZywgU3ByaW5nIDIwMjYKLy8KLy8gRGF0ZTogQXByaWwgMDQgMjAyNgovLwovLyBEZXNjcmlwdGlvbjogUHJvZ3JhbSB3aGljaCBkZXRlcm1pbmVzIG92ZXJ0aW1lLCBncm9zcyBwYXksCi8vIHN0YXRlIHRheCwgZmVkZXJhbCB0YXgsIGFuZCBuZXQgcGF5IGZvciBhIHNldCBvZiBlbXBsb3llZXMuCi8vIEl0IGFsc28gY2FsY3VsYXRlcyB0b3RhbHMsIGF2ZXJhZ2VzLCBtaW5pbXVtLCBhbmQgbWF4aW11bQovLyB2YWx1ZXMgZm9yIGFsbCBmbG9hdGluZyBwb2ludCBlbXBsb3llZSBkYXRhLgovLwovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLy8tLS0tLS0tLS0tLS0tLS0tIENPTlNUQU5UUyAtLS0tLS0tLS0tLS0tLS0tLy8KI2RlZmluZSBTSVpFIDUKI2RlZmluZSBTVERfSE9VUlMgNDAuMAojZGVmaW5lIE9UX1JBVEUgMS41CiNkZWZpbmUgTUFfVEFYX1JBVEUgMC4wNQojZGVmaW5lIE5IX1RBWF9SQVRFIDAuMAojZGVmaW5lIFZUX1RBWF9SQVRFIDAuMDYKI2RlZmluZSBDQV9UQVhfUkFURSAwLjA3CiNkZWZpbmUgREVGQVVMVF9UQVhfUkFURSAwLjA4CiNkZWZpbmUgVEFYX1NUQVRFX1NJWkUgMwojZGVmaW5lIEZFRF9UQVhfUkFURSAwLjI1CiNkZWZpbmUgRklSU1RfTkFNRV9TSVpFIDEwCiNkZWZpbmUgTEFTVF9OQU1FX1NJWkUgMTAKCi8vLS0tLS0tLS0tLS0tLS0tLSBTVFJVQ1RVUkVTIC0tLS0tLS0tLS0tLS0tLS0vLwpzdHJ1Y3QgbmFtZQp7CiAgICBjaGFyIGZpcnN0TmFtZVtGSVJTVF9OQU1FX1NJWkVdOwogICAgY2hhciBsYXN0TmFtZVtMQVNUX05BTUVfU0laRV07Cn07CgpzdHJ1Y3QgZW1wbG95ZWUKewogICAgc3RydWN0IG5hbWUgZW1wTmFtZTsKICAgIGNoYXIgdGF4U3RhdGVbVEFYX1NUQVRFX1NJWkVdOwogICAgbG9uZyBpbnQgY2xvY2tOdW1iZXI7CiAgICBmbG9hdCB3YWdlUmF0ZTsKICAgIGZsb2F0IGhvdXJzOwogICAgZmxvYXQgb3ZlcnRpbWVIcnM7CiAgICBmbG9hdCBncm9zc1BheTsKICAgIGZsb2F0IHN0YXRlVGF4OwogICAgZmxvYXQgZmVkVGF4OwogICAgZmxvYXQgbmV0UGF5Owp9OwoKc3RydWN0IHRvdGFscwp7CiAgICBmbG9hdCB0b3RhbF93YWdlUmF0ZTsKICAgIGZsb2F0IHRvdGFsX2hvdXJzOwogICAgZmxvYXQgdG90YWxfb3ZlcnRpbWVIcnM7CiAgICBmbG9hdCB0b3RhbF9ncm9zc1BheTsKICAgIGZsb2F0IHRvdGFsX3N0YXRlVGF4OwogICAgZmxvYXQgdG90YWxfZmVkVGF4OwogICAgZmxvYXQgdG90YWxfbmV0UGF5Owp9OwoKc3RydWN0IG1pbl9tYXgKewogICAgZmxvYXQgbWluX3dhZ2VSYXRlLCBtaW5faG91cnMsIG1pbl9vdmVydGltZUhycywgbWluX2dyb3NzUGF5LCBtaW5fc3RhdGVUYXgsIG1pbl9mZWRUYXgsIG1pbl9uZXRQYXk7CiAgICBmbG9hdCBtYXhfd2FnZVJhdGUsIG1heF9ob3VycywgbWF4X292ZXJ0aW1lSHJzLCBtYXhfZ3Jvc3NQYXksIG1heF9zdGF0ZVRheCwgbWF4X2ZlZFRheCwgbWF4X25ldFBheTsKfTsKCi8vLS0tLS0tLS0tLS0tLS0tLSBGVU5DVElPTiBQUk9UT1RZUEVTIC0tLS0tLS0tLS0tLS0tLS0vLwp2b2lkIGdldEhvdXJzKHN0cnVjdCBlbXBsb3llZSAqLCBpbnQpOwp2b2lkIGNhbGNPdmVydGltZUhycyhzdHJ1Y3QgZW1wbG95ZWUgKiwgaW50KTsKdm9pZCBjYWxjR3Jvc3NQYXkoc3RydWN0IGVtcGxveWVlICosIGludCk7CnZvaWQgY2FsY1N0YXRlVGF4KHN0cnVjdCBlbXBsb3llZSAqLCBpbnQpOwp2b2lkIGNhbGNGZWRUYXgoc3RydWN0IGVtcGxveWVlICosIGludCk7CnZvaWQgY2FsY05ldFBheShzdHJ1Y3QgZW1wbG95ZWUgKiwgaW50KTsKdm9pZCBwcmludEhlYWRlcih2b2lkKTsKdm9pZCBwcmludEVtcChzdHJ1Y3QgZW1wbG95ZWUgKiwgaW50KTsKdm9pZCBjYWxjRW1wbG95ZWVUb3RhbHMoc3RydWN0IGVtcGxveWVlICosIHN0cnVjdCB0b3RhbHMgKiwgaW50KTsKdm9pZCBjYWxjRW1wbG95ZWVNaW5NYXgoc3RydWN0IGVtcGxveWVlICosIHN0cnVjdCBtaW5fbWF4ICosIGludCk7CnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKHN0cnVjdCB0b3RhbHMgKiwgc3RydWN0IG1pbl9tYXggKiwgaW50KTsKCi8vLS0tLS0tLS0tLS0tLS0tLSBNQUlOIC0tLS0tLS0tLS0tLS0tLS0vLwppbnQgbWFpbigpCnsKICAgIHN0cnVjdCBlbXBsb3llZSBlbXBsb3llZURhdGFbU0laRV0gPSB7CiAgICAgICAgeyB7IkNvbm5pZSIsICJDb2JvbCJ9LCAiTUEiLCA5ODQwMSwgMTAuNjB9LAogICAgICAgIHsgeyJNYXJ5IiwgIkFwbCJ9LCAiTkgiLCA1MjY0ODgsIDkuNzUgfSwKICAgICAgICB7IHsiRnJhbmsiLCAiRm9ydHJhbiJ9LCAiVlQiLCA3NjUzNDksIDEwLjUwIH0sCiAgICAgICAgeyB7IkplZmYiLCAiQWRhIn0sICJOWSIsIDM0NjQ1LCAxMi4yNSB9LAogICAgICAgIHsgeyJBbnRvbiIsICJQYXNjYWwifSwiQ0EiLDEyNzYxNSwgOC4zNSB9CiAgICB9OwoKICAgIHN0cnVjdCBlbXBsb3llZSAqZW1wX3B0ciA9IGVtcGxveWVlRGF0YTsKCiAgICBzdHJ1Y3QgdG90YWxzIGVtcGxveWVlVG90YWxzID0gezB9OwogICAgc3RydWN0IHRvdGFscyAqZW1wX3RvdGFsc19wdHIgPSAmZW1wbG95ZWVUb3RhbHM7CgogICAgc3RydWN0IG1pbl9tYXggZW1wbG95ZWVNaW5NYXggPSB7MH07CiAgICBzdHJ1Y3QgbWluX21heCAqZW1wX21pbk1heF9wdHIgPSAmZW1wbG95ZWVNaW5NYXg7CgogICAgZ2V0SG91cnMoZW1wX3B0ciwgU0laRSk7CiAgICBjYWxjT3ZlcnRpbWVIcnMoZW1wX3B0ciwgU0laRSk7CiAgICBjYWxjR3Jvc3NQYXkoZW1wX3B0ciwgU0laRSk7CiAgICBjYWxjU3RhdGVUYXgoZW1wX3B0ciwgU0laRSk7CiAgICBjYWxjRmVkVGF4KGVtcF9wdHIsIFNJWkUpOwogICAgY2FsY05ldFBheShlbXBfcHRyLCBTSVpFKTsKCiAgICBjYWxjRW1wbG95ZWVUb3RhbHMoZW1wX3B0ciwgZW1wX3RvdGFsc19wdHIsIFNJWkUpOwogICAgY2FsY0VtcGxveWVlTWluTWF4KGVtcF9wdHIsIGVtcF9taW5NYXhfcHRyLCBTSVpFKTsKCiAgICBwcmludEhlYWRlcigpOwogICAgcHJpbnRFbXAoZW1wX3B0ciwgU0laRSk7CiAgICBwcmludEVtcFN0YXRpc3RpY3MoZW1wX3RvdGFsc19wdHIsIGVtcF9taW5NYXhfcHRyLCBTSVpFKTsKCiAgICByZXR1cm4gMDsKfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIGdldEhvdXJzKHN0cnVjdCBlbXBsb3llZSAqZW1wX3B0ciwgaW50IHNpemUpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgewogICAgICAgIHByaW50ZigiXG5FbnRlciBob3VycyB3b3JrZWQgYnkgZW1wICMgJTA2bGk6ICIsIChlbXBfcHRyICsgaSktPmNsb2NrTnVtYmVyKTsKICAgICAgICBzY2FuZigiJWYiLCAmKChlbXBfcHRyICsgaSktPmhvdXJzKSk7CiAgICB9Cn0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKdm9pZCBjYWxjT3ZlcnRpbWVIcnMoc3RydWN0IGVtcGxveWVlICplbXBfcHRyLCBpbnQgc2l6ZSkKewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICB7CiAgICAgICAgaWYgKChlbXBfcHRyICsgaSktPmhvdXJzID4gU1REX0hPVVJTKQogICAgICAgICAgICAoZW1wX3B0ciArIGkpLT5vdmVydGltZUhycyA9IChlbXBfcHRyICsgaSktPmhvdXJzIC0gU1REX0hPVVJTOwogICAgICAgIGVsc2UKICAgICAgICAgICAgKGVtcF9wdHIgKyBpKS0+b3ZlcnRpbWVIcnMgPSAwOwogICAgfQp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnZvaWQgY2FsY0dyb3NzUGF5KHN0cnVjdCBlbXBsb3llZSAqZW1wX3B0ciwgaW50IHNpemUpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgewogICAgICAgIGZsb2F0IG5vcm1hbCA9ICgoZW1wX3B0ciArIGkpLT5ob3VycyAtIChlbXBfcHRyICsgaSktPm92ZXJ0aW1lSHJzKSAqIChlbXBfcHRyICsgaSktPndhZ2VSYXRlOwogICAgICAgIGZsb2F0IG92ZXJ0aW1lID0gKGVtcF9wdHIgKyBpKS0+b3ZlcnRpbWVIcnMgKiBPVF9SQVRFICogKGVtcF9wdHIgKyBpKS0+d2FnZVJhdGU7CiAgICAgICAgKGVtcF9wdHIgKyBpKS0+Z3Jvc3NQYXkgPSBub3JtYWwgKyBvdmVydGltZTsKICAgIH0KfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIGNhbGNTdGF0ZVRheChzdHJ1Y3QgZW1wbG95ZWUgKmVtcF9wdHIsIGludCBzaXplKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgIHsKICAgICAgICBpZiAoc3RyY21wKChlbXBfcHRyICsgaSktPnRheFN0YXRlLCAiTUEiKSA9PSAwKQogICAgICAgICAgICAoZW1wX3B0ciArIGkpLT5zdGF0ZVRheCA9IChlbXBfcHRyICsgaSktPmdyb3NzUGF5ICogTUFfVEFYX1JBVEU7CiAgICAgICAgZWxzZSBpZiAoc3RyY21wKChlbXBfcHRyICsgaSktPnRheFN0YXRlLCAiTkgiKSA9PSAwKQogICAgICAgICAgICAoZW1wX3B0ciArIGkpLT5zdGF0ZVRheCA9IChlbXBfcHRyICsgaSktPmdyb3NzUGF5ICogTkhfVEFYX1JBVEU7CiAgICAgICAgZWxzZSBpZiAoc3RyY21wKChlbXBfcHRyICsgaSktPnRheFN0YXRlLCAiVlQiKSA9PSAwKQogICAgICAgICAgICAoZW1wX3B0ciArIGkpLT5zdGF0ZVRheCA9IChlbXBfcHRyICsgaSktPmdyb3NzUGF5ICogVlRfVEFYX1JBVEU7CiAgICAgICAgZWxzZSBpZiAoc3RyY21wKChlbXBfcHRyICsgaSktPnRheFN0YXRlLCAiQ0EiKSA9PSAwKQogICAgICAgICAgICAoZW1wX3B0ciArIGkpLT5zdGF0ZVRheCA9IChlbXBfcHRyICsgaSktPmdyb3NzUGF5ICogQ0FfVEFYX1JBVEU7CiAgICAgICAgZWxzZQogICAgICAgICAgICAoZW1wX3B0ciArIGkpLT5zdGF0ZVRheCA9IChlbXBfcHRyICsgaSktPmdyb3NzUGF5ICogREVGQVVMVF9UQVhfUkFURTsKICAgIH0KfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIGNhbGNGZWRUYXgoc3RydWN0IGVtcGxveWVlICplbXBfcHRyLCBpbnQgc2l6ZSkKewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICB7CiAgICAgICAgKGVtcF9wdHIgKyBpKS0+ZmVkVGF4ID0gKGVtcF9wdHIgKyBpKS0+Z3Jvc3NQYXkgKiBGRURfVEFYX1JBVEU7CiAgICB9Cn0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKdm9pZCBjYWxjTmV0UGF5KHN0cnVjdCBlbXBsb3llZSAqZW1wX3B0ciwgaW50IHNpemUpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgewogICAgICAgIChlbXBfcHRyICsgaSktPm5ldFBheSA9IChlbXBfcHRyICsgaSktPmdyb3NzUGF5IC0KICAgICAgICAgICAgKChlbXBfcHRyICsgaSktPnN0YXRlVGF4ICsgKGVtcF9wdHIgKyBpKS0+ZmVkVGF4KTsKICAgIH0KfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIHByaW50SGVhZGVyKHZvaWQpCnsKICAgIHByaW50ZigiXG5cbioqKiBQYXkgQ2FsY3VsYXRvciAqKipcbiIpOwogICAgcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwogICAgcHJpbnRmKCJcbk5hbWUgICAgICAgICAgICAgICAgVGF4ICBDbG9jayMgIFdhZ2UgICBIb3VycyAgT1QgICBHcm9zcyAgIFN0YXRlICBGZWQgICAgICBOZXQiKTsKICAgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5ICAgICBUYXggICAgVGF4ICAgICAgUGF5Iik7CiAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Cn0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKdm9pZCBwcmludEVtcChzdHJ1Y3QgZW1wbG95ZWUgKmVtcF9wdHIsIGludCBzaXplKQp7CiAgICBjaGFyIG5hbWVbMjVdOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgewogICAgICAgIHN0cmNweShuYW1lLCAoZW1wX3B0ciArIGkpLT5lbXBOYW1lLmZpcnN0TmFtZSk7CiAgICAgICAgc3RyY2F0KG5hbWUsICIgIik7CiAgICAgICAgc3RyY2F0KG5hbWUsIChlbXBfcHRyICsgaSktPmVtcE5hbWUubGFzdE5hbWUpOwoKICAgICAgICBwcmludGYoIlxuJS0yMHMgJS0ycyAlMDZsaSAlNi4yZiAlNi4xZiAlNS4xZiAlNy4yZiAlNi4yZiAlNy4yZiAlOC4yZiIsCiAgICAgICAgICAgICAgIG5hbWUsIChlbXBfcHRyICsgaSktPnRheFN0YXRlLCAoZW1wX3B0ciArIGkpLT5jbG9ja051bWJlciwKICAgICAgICAgICAgICAgKGVtcF9wdHIgKyBpKS0+d2FnZVJhdGUsIChlbXBfcHRyICsgaSktPmhvdXJzLAogICAgICAgICAgICAgICAoZW1wX3B0ciArIGkpLT5vdmVydGltZUhycywgKGVtcF9wdHIgKyBpKS0+Z3Jvc3NQYXksCiAgICAgICAgICAgICAgIChlbXBfcHRyICsgaSktPnN0YXRlVGF4LCAoZW1wX3B0ciArIGkpLT5mZWRUYXgsCiAgICAgICAgICAgICAgIChlbXBfcHRyICsgaSktPm5ldFBheSk7CiAgICB9Cn0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKdm9pZCBjYWxjRW1wbG95ZWVUb3RhbHMoc3RydWN0IGVtcGxveWVlICplbXBfcHRyLCBzdHJ1Y3QgdG90YWxzICp0b3RfcHRyLCBpbnQgc2l6ZSkKewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICB7CiAgICAgICAgdG90X3B0ci0+dG90YWxfd2FnZVJhdGUgKz0gKGVtcF9wdHIgKyBpKS0+d2FnZVJhdGU7CiAgICAgICAgdG90X3B0ci0+dG90YWxfaG91cnMgKz0gKGVtcF9wdHIgKyBpKS0+aG91cnM7CiAgICAgICAgdG90X3B0ci0+dG90YWxfb3ZlcnRpbWVIcnMgKz0gKGVtcF9wdHIgKyBpKS0+b3ZlcnRpbWVIcnM7CiAgICAgICAgdG90X3B0ci0+dG90YWxfZ3Jvc3NQYXkgKz0gKGVtcF9wdHIgKyBpKS0+Z3Jvc3NQYXk7CiAgICAgICAgdG90X3B0ci0+dG90YWxfc3RhdGVUYXggKz0gKGVtcF9wdHIgKyBpKS0+c3RhdGVUYXg7CiAgICAgICAgdG90X3B0ci0+dG90YWxfZmVkVGF4ICs9IChlbXBfcHRyICsgaSktPmZlZFRheDsKICAgICAgICB0b3RfcHRyLT50b3RhbF9uZXRQYXkgKz0gKGVtcF9wdHIgKyBpKS0+bmV0UGF5OwogICAgfQp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnZvaWQgY2FsY0VtcGxveWVlTWluTWF4KHN0cnVjdCBlbXBsb3llZSAqZW1wX3B0ciwgc3RydWN0IG1pbl9tYXggKm0sIGludCBzaXplKQp7CiAgICAqbSA9IChzdHJ1Y3QgbWluX21heCl7CiAgICAgICAgKGVtcF9wdHIgKyAwKS0+d2FnZVJhdGUsIChlbXBfcHRyICsgMCktPmhvdXJzLCAoZW1wX3B0ciArIDApLT5vdmVydGltZUhycywKICAgICAgICAoZW1wX3B0ciArIDApLT5ncm9zc1BheSwgKGVtcF9wdHIgKyAwKS0+c3RhdGVUYXgsIChlbXBfcHRyICsgMCktPmZlZFRheCwgKGVtcF9wdHIgKyAwKS0+bmV0UGF5LAogICAgICAgIChlbXBfcHRyICsgMCktPndhZ2VSYXRlLCAoZW1wX3B0ciArIDApLT5ob3VycywgKGVtcF9wdHIgKyAwKS0+b3ZlcnRpbWVIcnMsCiAgICAgICAgKGVtcF9wdHIgKyAwKS0+Z3Jvc3NQYXksIChlbXBfcHRyICsgMCktPnN0YXRlVGF4LCAoZW1wX3B0ciArIDApLT5mZWRUYXgsIChlbXBfcHRyICsgMCktPm5ldFBheQogICAgfTsKCiAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykKICAgIHsKICAgICAgICBpZiAoKGVtcF9wdHIgKyBpKS0+d2FnZVJhdGUgPCBtLT5taW5fd2FnZVJhdGUpIG0tPm1pbl93YWdlUmF0ZSA9IChlbXBfcHRyICsgaSktPndhZ2VSYXRlOwogICAgICAgIGlmICgoZW1wX3B0ciArIGkpLT53YWdlUmF0ZSA+IG0tPm1heF93YWdlUmF0ZSkgbS0+bWF4X3dhZ2VSYXRlID0gKGVtcF9wdHIgKyBpKS0+d2FnZVJhdGU7CgogICAgICAgIGlmICgoZW1wX3B0ciArIGkpLT5ob3VycyA8IG0tPm1pbl9ob3VycykgbS0+bWluX2hvdXJzID0gKGVtcF9wdHIgKyBpKS0+aG91cnM7CiAgICAgICAgaWYgKChlbXBfcHRyICsgaSktPmhvdXJzID4gbS0+bWF4X2hvdXJzKSBtLT5tYXhfaG91cnMgPSAoZW1wX3B0ciArIGkpLT5ob3VyczsKCiAgICAgICAgaWYgKChlbXBfcHRyICsgaSktPm92ZXJ0aW1lSHJzIDwgbS0+bWluX292ZXJ0aW1lSHJzKSBtLT5taW5fb3ZlcnRpbWVIcnMgPSAoZW1wX3B0ciArIGkpLT5vdmVydGltZUhyczsKICAgICAgICBpZiAoKGVtcF9wdHIgKyBpKS0+b3ZlcnRpbWVIcnMgPiBtLT5tYXhfb3ZlcnRpbWVIcnMpIG0tPm1heF9vdmVydGltZUhycyA9IChlbXBfcHRyICsgaSktPm92ZXJ0aW1lSHJzOwoKICAgICAgICBpZiAoKGVtcF9wdHIgKyBpKS0+Z3Jvc3NQYXkgPCBtLT5taW5fZ3Jvc3NQYXkpIG0tPm1pbl9ncm9zc1BheSA9IChlbXBfcHRyICsgaSktPmdyb3NzUGF5OwogICAgICAgIGlmICgoZW1wX3B0ciArIGkpLT5ncm9zc1BheSA+IG0tPm1heF9ncm9zc1BheSkgbS0+bWF4X2dyb3NzUGF5ID0gKGVtcF9wdHIgKyBpKS0+Z3Jvc3NQYXk7CgogICAgICAgIGlmICgoZW1wX3B0ciArIGkpLT5zdGF0ZVRheCA8IG0tPm1pbl9zdGF0ZVRheCkgbS0+bWluX3N0YXRlVGF4ID0gKGVtcF9wdHIgKyBpKS0+c3RhdGVUYXg7CiAgICAgICAgaWYgKChlbXBfcHRyICsgaSktPnN0YXRlVGF4ID4gbS0+bWF4X3N0YXRlVGF4KSBtLT5tYXhfc3RhdGVUYXggPSAoZW1wX3B0ciArIGkpLT5zdGF0ZVRheDsKCiAgICAgICAgaWYgKChlbXBfcHRyICsgaSktPmZlZFRheCA8IG0tPm1pbl9mZWRUYXgpIG0tPm1pbl9mZWRUYXggPSAoZW1wX3B0ciArIGkpLT5mZWRUYXg7CiAgICAgICAgaWYgKChlbXBfcHRyICsgaSktPmZlZFRheCA+IG0tPm1heF9mZWRUYXgpIG0tPm1heF9mZWRUYXggPSAoZW1wX3B0ciArIGkpLT5mZWRUYXg7CgogICAgICAgIGlmICgoZW1wX3B0ciArIGkpLT5uZXRQYXkgPCBtLT5taW5fbmV0UGF5KSBtLT5taW5fbmV0UGF5ID0gKGVtcF9wdHIgKyBpKS0+bmV0UGF5OwogICAgICAgIGlmICgoZW1wX3B0ciArIGkpLT5uZXRQYXkgPiBtLT5tYXhfbmV0UGF5KSBtLT5tYXhfbmV0UGF5ID0gKGVtcF9wdHIgKyBpKS0+bmV0UGF5OwogICAgfQp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKHN0cnVjdCB0b3RhbHMgKnQsIHN0cnVjdCBtaW5fbWF4ICptLCBpbnQgc2l6ZSkKewogICAgcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwoKICAgIHByaW50ZigiXG5Ub3RhbHM6ICAgICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU1LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICAgICB0LT50b3RhbF93YWdlUmF0ZSwgdC0+dG90YWxfaG91cnMsIHQtPnRvdGFsX292ZXJ0aW1lSHJzLAogICAgICAgICAgIHQtPnRvdGFsX2dyb3NzUGF5LCB0LT50b3RhbF9zdGF0ZVRheCwgdC0+dG90YWxfZmVkVGF4LCB0LT50b3RhbF9uZXRQYXkpOwoKICAgIHByaW50ZigiXG5BdmVyYWdlczogICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU1LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICAgICB0LT50b3RhbF93YWdlUmF0ZS9zaXplLCB0LT50b3RhbF9ob3Vycy9zaXplLCB0LT50b3RhbF9vdmVydGltZUhycy9zaXplLAogICAgICAgICAgIHQtPnRvdGFsX2dyb3NzUGF5L3NpemUsIHQtPnRvdGFsX3N0YXRlVGF4L3NpemUsIHQtPnRvdGFsX2ZlZFRheC9zaXplLCB0LT50b3RhbF9uZXRQYXkvc2l6ZSk7CgogICAgcHJpbnRmKCJcbk1pbmltdW06ICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgICAgIG0tPm1pbl93YWdlUmF0ZSwgbS0+bWluX2hvdXJzLCBtLT5taW5fb3ZlcnRpbWVIcnMsCiAgICAgICAgICAgbS0+bWluX2dyb3NzUGF5LCBtLT5taW5fc3RhdGVUYXgsIG0tPm1pbl9mZWRUYXgsIG0tPm1pbl9uZXRQYXkpOwoKICAgIHByaW50ZigiXG5NYXhpbXVtOiAgICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU1LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmXG4iLAogICAgICAgICAgIG0tPm1heF93YWdlUmF0ZSwgbS0+bWF4X2hvdXJzLCBtLT5tYXhfb3ZlcnRpbWVIcnMsCiAgICAgICAgICAgbS0+bWF4X2dyb3NzUGF5LCBtLT5tYXhfc3RhdGVUYXgsIG0tPm1heF9mZWRUYXgsIG0tPm1heF9uZXRQYXkpOwp9