//********************************************************
//
// Assignment 10 - Linked Lists, Typedef, and Macros
//
// Name: John Semenuk
//
// Class: C Programming, Spring 2026
//
// Date: April 20, 2026
//
//********************************************************
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#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_STATE_TAX_RATE 0.08
#define FED_TAX_RATE 0.25
#define FIRST_NAME_SIZE 10
#define LAST_NAME_SIZE 10
#define TAX_STATE_SIZE 3
// macros
#define CALC_OT_HOURS(theHours) ((theHours > STD_HOURS) ? theHours - STD_HOURS : 0)
#define CALC_STATE_TAX(thePay,theRate) (thePay * theRate)
#define CALC_FED_TAX(thePay) (thePay * FED_TAX_RATE)
#define CALC_NET_PAY(thePay,theStateTax,theFedTax) (thePay - (theStateTax + theFedTax))
#define CALC_NORMAL_PAY(rate,hours,ot) (rate * (hours - ot))
#define CALC_OT_PAY(rate,ot) (ot * (OT_RATE * rate))
// FIXED MIN/MAX
#define CALC_MIN(val,min) ((val < min) ? val : min)
#define CALC_MAX(val,max) ((val > max) ? val : max)
// name struct
struct name {
char firstName[ FIRST_NAME_SIZE] ;
char lastName[ LAST_NAME_SIZE] ;
} ;
// employee typedef
typedef 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 employee * next;
} EMPLOYEE;
// totals typedef
typedef struct totals {
float total_wageRate;
float total_hours;
float total_overtimeHrs;
float total_grossPay;
float total_stateTax;
float total_fedTax;
float total_netPay;
} TOTALS;
// MIN_MAX typedef FIXED
typedef struct min_max {
float min_wageRate;
float min_hours;
float min_overtimeHrs;
float min_grossPay;
float min_stateTax;
float min_fedTax;
float min_netPay;
float max_wageRate;
float max_hours;
float max_overtimeHrs;
float max_grossPay;
float max_stateTax;
float max_fedTax;
float max_netPay;
} MIN_MAX;
// prototypes
EMPLOYEE * getEmpData( void ) ;
int isEmployeeSize( EMPLOYEE * head_ptr) ;
void calcOvertimeHrs( EMPLOYEE * head_ptr) ;
void calcGrossPay( EMPLOYEE * head_ptr) ;
void calcStateTax( EMPLOYEE * head_ptr) ;
void calcFedTax( EMPLOYEE * head_ptr) ;
void calcNetPay( EMPLOYEE * head_ptr) ;
void calcEmployeeTotals( EMPLOYEE * head_ptr, TOTALS * totals) ;
void calcEmployeeMinMax( EMPLOYEE * head_ptr, MIN_MAX * minmax) ;
void printHeader( void ) ;
void printEmp( EMPLOYEE * head_ptr) ;
void printEmpStatistics( TOTALS * totals, MIN_MAX * minmax, int size) ;
int main( ) {
EMPLOYEE * head_ptr;
int size;
TOTALS totals = { 0 } ;
MIN_MAX minmax;
head_ptr = getEmpData( ) ;
size = isEmployeeSize( head_ptr) ;
if ( size <= 0 ) {
return 0 ;
}
calcOvertimeHrs( head_ptr) ;
calcGrossPay( head_ptr) ;
calcStateTax( head_ptr) ;
calcFedTax( head_ptr) ;
calcNetPay( head_ptr) ;
calcEmployeeTotals( head_ptr, & totals) ;
calcEmployeeMinMax( head_ptr, & minmax) ;
printHeader( ) ;
printEmp( head_ptr) ;
printEmpStatistics( & totals, & minmax, size) ;
printf ( "\n *** End of Program ***\n " ) ; return 0 ;
}
//================ FUNCTIONS =================
EMPLOYEE * getEmpData( void ) {
EMPLOYEE
* head
= malloc ( sizeof ( EMPLOYEE
) ) ; EMPLOYEE * curr = head;
char ans[ 10 ] ;
int more = 1 ;
while ( more) {
printf ( "First name: " ) ; scanf ( "%s" , curr
-> empName.
firstName ) ; printf ( "Last name: " ) ; scanf ( "%s" , curr
-> empName.
lastName ) ;
curr-> next = NULL;
more = 0 ;
} else {
curr
-> next
= malloc ( sizeof ( EMPLOYEE
) ) ; curr = curr-> next;
}
}
return head;
}
int isEmployeeSize( EMPLOYEE * head) {
int count = 0 ;
while ( head) {
count++;
head = head-> next;
}
return count;
}
void calcOvertimeHrs( EMPLOYEE * head) {
while ( head) {
head-> overtimeHrs = CALC_OT_HOURS( head-> hours) ;
head = head-> next;
}
}
void calcGrossPay( EMPLOYEE * head) {
while ( head) {
float normal = CALC_NORMAL_PAY( head-> wageRate, head-> hours, head-> overtimeHrs) ;
float ot = CALC_OT_PAY( head-> wageRate, head-> overtimeHrs) ;
head-> grossPay = normal + ot;
head = head-> next;
}
}
void calcStateTax( EMPLOYEE * head) {
while ( head) {
if ( ! strcmp ( head
-> taxState
, "MA" ) ) head-> stateTax = CALC_STATE_TAX( head-> grossPay, MA_TAX_RATE) ;
else if ( ! strcmp ( head
-> taxState
, "VT" ) ) head-> stateTax = CALC_STATE_TAX( head-> grossPay, VT_TAX_RATE) ;
else if ( ! strcmp ( head
-> taxState
, "NH" ) ) head-> stateTax = CALC_STATE_TAX( head-> grossPay, NH_TAX_RATE) ;
else if ( ! strcmp ( head
-> taxState
, "CA" ) ) head-> stateTax = CALC_STATE_TAX( head-> grossPay, CA_TAX_RATE) ;
else
head-> stateTax = CALC_STATE_TAX( head-> grossPay, DEFAULT_STATE_TAX_RATE) ;
head = head-> next;
}
}
void calcFedTax( EMPLOYEE * head) {
while ( head) {
head-> fedTax = CALC_FED_TAX( head-> grossPay) ;
head = head-> next;
}
}
void calcNetPay( EMPLOYEE * head) {
while ( head) {
head-> netPay = CALC_NET_PAY( head-> grossPay, head-> stateTax, head-> fedTax) ;
head = head-> next;
}
}
void calcEmployeeTotals( EMPLOYEE * head, TOTALS * t) {
while ( head) {
t-> total_wageRate += head-> wageRate;
t-> total_hours += head-> hours;
t-> total_overtimeHrs += head-> overtimeHrs;
t-> total_grossPay += head-> grossPay;
t-> total_stateTax += head-> stateTax;
t-> total_fedTax += head-> fedTax;
t-> total_netPay += head-> netPay;
head = head-> next;
}
}
void calcEmployeeMinMax( EMPLOYEE * head, MIN_MAX * m) {
* m = ( MIN_MAX) { head-> wageRate, head-> hours, head-> overtimeHrs,
head-> grossPay, head-> stateTax, head-> fedTax, head-> netPay,
head-> wageRate, head-> hours, head-> overtimeHrs,
head-> grossPay, head-> stateTax, head-> fedTax, head-> netPay} ;
head = head-> next;
while ( head) {
m-> min_wageRate = CALC_MIN( head-> wageRate, m-> min_wageRate) ;
m-> max_wageRate = CALC_MAX( head-> wageRate, m-> max_wageRate) ;
m-> min_hours = CALC_MIN( head-> hours, m-> min_hours) ;
m-> max_hours = CALC_MAX( head-> hours, m-> max_hours) ;
m-> min_overtimeHrs = CALC_MIN( head-> overtimeHrs, m-> min_overtimeHrs) ;
m-> max_overtimeHrs = CALC_MAX( head-> overtimeHrs, m-> max_overtimeHrs) ;
m-> min_grossPay = CALC_MIN( head-> grossPay, m-> min_grossPay) ;
m-> max_grossPay = CALC_MAX( head-> grossPay, m-> max_grossPay) ;
m-> min_stateTax = CALC_MIN( head-> stateTax, m-> min_stateTax) ;
m-> max_stateTax = CALC_MAX( head-> stateTax, m-> max_stateTax) ;
m-> min_fedTax = CALC_MIN( head-> fedTax, m-> min_fedTax) ;
m-> max_fedTax = CALC_MAX( head-> fedTax, m-> max_fedTax) ;
m-> min_netPay = CALC_MIN( head-> netPay, m-> min_netPay) ;
m-> max_netPay = CALC_MAX( head-> netPay, m-> max_netPay) ;
head = head-> next;
}
}
void printHeader( ) {
printf ( "\n *** Pay Calculator ***\n " ) ; }
void printEmp( EMPLOYEE * head) {
while ( head) {
head-> empName.firstName ,
head-> empName.lastName ,
head-> netPay) ;
head = head-> next;
}
}
void printEmpStatistics( TOTALS * t, MIN_MAX * m, int size) {
printf ( "\n Totals Gross: %.2f" , t
-> total_grossPay
) ; printf ( "\n Average Gross: %.2f" , t
-> total_grossPay
/ size
) ; printf ( "\n Min Gross: %.2f" , m
-> min_grossPay
) ; printf ( "\n Max Gross: %.2f" , m
-> max_grossPay
) ; }
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLwovLyBBc3NpZ25tZW50IDEwIC0gTGlua2VkIExpc3RzLCBUeXBlZGVmLCBhbmQgTWFjcm9zCi8vCi8vIE5hbWU6IEpvaG4gU2VtZW51awovLwovLyBDbGFzczogQyBQcm9ncmFtbWluZywgU3ByaW5nIDIwMjYKLy8KLy8gRGF0ZTogQXByaWwgMjAsIDIwMjYKLy8KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgU1REX0hPVVJTIDQwLjAKI2RlZmluZSBPVF9SQVRFIDEuNQojZGVmaW5lIE1BX1RBWF9SQVRFIDAuMDUKI2RlZmluZSBOSF9UQVhfUkFURSAwLjAKI2RlZmluZSBWVF9UQVhfUkFURSAwLjA2CiNkZWZpbmUgQ0FfVEFYX1JBVEUgMC4wNwojZGVmaW5lIERFRkFVTFRfU1RBVEVfVEFYX1JBVEUgMC4wOAojZGVmaW5lIEZFRF9UQVhfUkFURSAwLjI1CgojZGVmaW5lIEZJUlNUX05BTUVfU0laRSAxMAojZGVmaW5lIExBU1RfTkFNRV9TSVpFIDEwCiNkZWZpbmUgVEFYX1NUQVRFX1NJWkUgMwoKLy8gbWFjcm9zCiNkZWZpbmUgQ0FMQ19PVF9IT1VSUyh0aGVIb3VycykgKCh0aGVIb3VycyA+IFNURF9IT1VSUykgPyB0aGVIb3VycyAtIFNURF9IT1VSUyA6IDApCiNkZWZpbmUgQ0FMQ19TVEFURV9UQVgodGhlUGF5LHRoZVJhdGUpICh0aGVQYXkgKiB0aGVSYXRlKQojZGVmaW5lIENBTENfRkVEX1RBWCh0aGVQYXkpICh0aGVQYXkgKiBGRURfVEFYX1JBVEUpCiNkZWZpbmUgQ0FMQ19ORVRfUEFZKHRoZVBheSx0aGVTdGF0ZVRheCx0aGVGZWRUYXgpICh0aGVQYXkgLSAodGhlU3RhdGVUYXggKyB0aGVGZWRUYXgpKQojZGVmaW5lIENBTENfTk9STUFMX1BBWShyYXRlLGhvdXJzLG90KSAocmF0ZSAqIChob3VycyAtIG90KSkKI2RlZmluZSBDQUxDX09UX1BBWShyYXRlLG90KSAob3QgKiAoT1RfUkFURSAqIHJhdGUpKQoKLy8gRklYRUQgTUlOL01BWAojZGVmaW5lIENBTENfTUlOKHZhbCxtaW4pICgodmFsIDwgbWluKSA/IHZhbCA6IG1pbikKI2RlZmluZSBDQUxDX01BWCh2YWwsbWF4KSAoKHZhbCA+IG1heCkgPyB2YWwgOiBtYXgpCgovLyBuYW1lIHN0cnVjdApzdHJ1Y3QgbmFtZSB7CiAgICBjaGFyIGZpcnN0TmFtZVtGSVJTVF9OQU1FX1NJWkVdOwogICAgY2hhciBsYXN0TmFtZVtMQVNUX05BTUVfU0laRV07Cn07CgovLyBlbXBsb3llZSB0eXBlZGVmCnR5cGVkZWYgc3RydWN0IGVtcGxveWVlIHsKICAgIHN0cnVjdCBuYW1lIGVtcE5hbWU7CiAgICBjaGFyIHRheFN0YXRlW1RBWF9TVEFURV9TSVpFXTsKICAgIGxvbmcgaW50IGNsb2NrTnVtYmVyOwogICAgZmxvYXQgd2FnZVJhdGU7CiAgICBmbG9hdCBob3VyczsKICAgIGZsb2F0IG92ZXJ0aW1lSHJzOwogICAgZmxvYXQgZ3Jvc3NQYXk7CiAgICBmbG9hdCBzdGF0ZVRheDsKICAgIGZsb2F0IGZlZFRheDsKICAgIGZsb2F0IG5ldFBheTsKICAgIHN0cnVjdCBlbXBsb3llZSAqbmV4dDsKfSBFTVBMT1lFRTsKCi8vIHRvdGFscyB0eXBlZGVmCnR5cGVkZWYgc3RydWN0IHRvdGFscyB7CiAgICBmbG9hdCB0b3RhbF93YWdlUmF0ZTsKICAgIGZsb2F0IHRvdGFsX2hvdXJzOwogICAgZmxvYXQgdG90YWxfb3ZlcnRpbWVIcnM7CiAgICBmbG9hdCB0b3RhbF9ncm9zc1BheTsKICAgIGZsb2F0IHRvdGFsX3N0YXRlVGF4OwogICAgZmxvYXQgdG90YWxfZmVkVGF4OwogICAgZmxvYXQgdG90YWxfbmV0UGF5Owp9IFRPVEFMUzsKCi8vIE1JTl9NQVggdHlwZWRlZiBGSVhFRAp0eXBlZGVmIHN0cnVjdCBtaW5fbWF4IHsKICAgIGZsb2F0IG1pbl93YWdlUmF0ZTsKICAgIGZsb2F0IG1pbl9ob3VyczsKICAgIGZsb2F0IG1pbl9vdmVydGltZUhyczsKICAgIGZsb2F0IG1pbl9ncm9zc1BheTsKICAgIGZsb2F0IG1pbl9zdGF0ZVRheDsKICAgIGZsb2F0IG1pbl9mZWRUYXg7CiAgICBmbG9hdCBtaW5fbmV0UGF5OwogICAgZmxvYXQgbWF4X3dhZ2VSYXRlOwogICAgZmxvYXQgbWF4X2hvdXJzOwogICAgZmxvYXQgbWF4X292ZXJ0aW1lSHJzOwogICAgZmxvYXQgbWF4X2dyb3NzUGF5OwogICAgZmxvYXQgbWF4X3N0YXRlVGF4OwogICAgZmxvYXQgbWF4X2ZlZFRheDsKICAgIGZsb2F0IG1heF9uZXRQYXk7Cn0gTUlOX01BWDsKCi8vIHByb3RvdHlwZXMKRU1QTE9ZRUUgKiBnZXRFbXBEYXRhKHZvaWQpOwppbnQgaXNFbXBsb3llZVNpemUoRU1QTE9ZRUUgKmhlYWRfcHRyKTsKdm9pZCBjYWxjT3ZlcnRpbWVIcnMoRU1QTE9ZRUUgKmhlYWRfcHRyKTsKdm9pZCBjYWxjR3Jvc3NQYXkoRU1QTE9ZRUUgKmhlYWRfcHRyKTsKdm9pZCBjYWxjU3RhdGVUYXgoRU1QTE9ZRUUgKmhlYWRfcHRyKTsKdm9pZCBjYWxjRmVkVGF4KEVNUExPWUVFICpoZWFkX3B0cik7CnZvaWQgY2FsY05ldFBheShFTVBMT1lFRSAqaGVhZF9wdHIpOwp2b2lkIGNhbGNFbXBsb3llZVRvdGFscyhFTVBMT1lFRSAqaGVhZF9wdHIsIFRPVEFMUyAqdG90YWxzKTsKdm9pZCBjYWxjRW1wbG95ZWVNaW5NYXgoRU1QTE9ZRUUgKmhlYWRfcHRyLCBNSU5fTUFYICptaW5tYXgpOwp2b2lkIHByaW50SGVhZGVyKHZvaWQpOwp2b2lkIHByaW50RW1wKEVNUExPWUVFICpoZWFkX3B0cik7CnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKFRPVEFMUyAqdG90YWxzLCBNSU5fTUFYICptaW5tYXgsIGludCBzaXplKTsKCmludCBtYWluKCkgewoKICAgIEVNUExPWUVFICpoZWFkX3B0cjsKICAgIGludCBzaXplOwoKICAgIFRPVEFMUyB0b3RhbHMgPSB7MH07CiAgICBNSU5fTUFYIG1pbm1heDsKCiAgICBoZWFkX3B0ciA9IGdldEVtcERhdGEoKTsKICAgIHNpemUgPSBpc0VtcGxveWVlU2l6ZShoZWFkX3B0cik7CgogICAgaWYgKHNpemUgPD0gMCkgewogICAgICAgIHByaW50ZigiXG5ObyBlbXBsb3llZXMuXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBjYWxjT3ZlcnRpbWVIcnMoaGVhZF9wdHIpOwogICAgY2FsY0dyb3NzUGF5KGhlYWRfcHRyKTsKICAgIGNhbGNTdGF0ZVRheChoZWFkX3B0cik7CiAgICBjYWxjRmVkVGF4KGhlYWRfcHRyKTsKICAgIGNhbGNOZXRQYXkoaGVhZF9wdHIpOwogICAgY2FsY0VtcGxveWVlVG90YWxzKGhlYWRfcHRyLCAmdG90YWxzKTsKICAgIGNhbGNFbXBsb3llZU1pbk1heChoZWFkX3B0ciwgJm1pbm1heCk7CgogICAgcHJpbnRIZWFkZXIoKTsKICAgIHByaW50RW1wKGhlYWRfcHRyKTsKICAgIHByaW50RW1wU3RhdGlzdGljcygmdG90YWxzLCAmbWlubWF4LCBzaXplKTsKCiAgICBwcmludGYoIlxuKioqIEVuZCBvZiBQcm9ncmFtICoqKlxuIik7CiAgICByZXR1cm4gMDsKfQoKLy89PT09PT09PT09PT09PT09IEZVTkNUSU9OUyA9PT09PT09PT09PT09PT09PQoKRU1QTE9ZRUUgKiBnZXRFbXBEYXRhKHZvaWQpIHsKCiAgICBFTVBMT1lFRSAqaGVhZCA9IG1hbGxvYyhzaXplb2YoRU1QTE9ZRUUpKTsKICAgIEVNUExPWUVFICpjdXJyID0gaGVhZDsKCiAgICBjaGFyIGFuc1sxMF07CiAgICBpbnQgbW9yZSA9IDE7CgogICAgd2hpbGUgKG1vcmUpIHsKICAgICAgICBwcmludGYoIkZpcnN0IG5hbWU6ICIpOyBzY2FuZigiJXMiLCBjdXJyLT5lbXBOYW1lLmZpcnN0TmFtZSk7CiAgICAgICAgcHJpbnRmKCJMYXN0IG5hbWU6ICIpOyBzY2FuZigiJXMiLCBjdXJyLT5lbXBOYW1lLmxhc3ROYW1lKTsKICAgICAgICBwcmludGYoIlN0YXRlOiAiKTsgc2NhbmYoIiVzIiwgY3Vyci0+dGF4U3RhdGUpOwogICAgICAgIHByaW50ZigiQ2xvY2sgIzogIik7IHNjYW5mKCIlbGQiLCAmY3Vyci0+Y2xvY2tOdW1iZXIpOwogICAgICAgIHByaW50ZigiV2FnZTogIik7IHNjYW5mKCIlZiIsICZjdXJyLT53YWdlUmF0ZSk7CiAgICAgICAgcHJpbnRmKCJIb3VyczogIik7IHNjYW5mKCIlZiIsICZjdXJyLT5ob3Vycyk7CgogICAgICAgIHByaW50ZigiTW9yZT8gKHkvbik6ICIpOwogICAgICAgIHNjYW5mKCIlcyIsIGFucyk7CgogICAgICAgIGlmICh0b3VwcGVyKGFuc1swXSkgIT0gJ1knKSB7CiAgICAgICAgICAgIGN1cnItPm5leHQgPSBOVUxMOwogICAgICAgICAgICBtb3JlID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdXJyLT5uZXh0ID0gbWFsbG9jKHNpemVvZihFTVBMT1lFRSkpOwogICAgICAgICAgICBjdXJyID0gY3Vyci0+bmV4dDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gaGVhZDsKfQoKaW50IGlzRW1wbG95ZWVTaXplKEVNUExPWUVFICpoZWFkKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgd2hpbGUgKGhlYWQpIHsKICAgICAgICBjb3VudCsrOwogICAgICAgIGhlYWQgPSBoZWFkLT5uZXh0OwogICAgfQogICAgcmV0dXJuIGNvdW50Owp9Cgp2b2lkIGNhbGNPdmVydGltZUhycyhFTVBMT1lFRSAqaGVhZCkgewogICAgd2hpbGUgKGhlYWQpIHsKICAgICAgICBoZWFkLT5vdmVydGltZUhycyA9IENBTENfT1RfSE9VUlMoaGVhZC0+aG91cnMpOwogICAgICAgIGhlYWQgPSBoZWFkLT5uZXh0OwogICAgfQp9Cgp2b2lkIGNhbGNHcm9zc1BheShFTVBMT1lFRSAqaGVhZCkgewogICAgd2hpbGUgKGhlYWQpIHsKICAgICAgICBmbG9hdCBub3JtYWwgPSBDQUxDX05PUk1BTF9QQVkoaGVhZC0+d2FnZVJhdGUsIGhlYWQtPmhvdXJzLCBoZWFkLT5vdmVydGltZUhycyk7CiAgICAgICAgZmxvYXQgb3QgPSBDQUxDX09UX1BBWShoZWFkLT53YWdlUmF0ZSwgaGVhZC0+b3ZlcnRpbWVIcnMpOwogICAgICAgIGhlYWQtPmdyb3NzUGF5ID0gbm9ybWFsICsgb3Q7CiAgICAgICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICB9Cn0KCnZvaWQgY2FsY1N0YXRlVGF4KEVNUExPWUVFICpoZWFkKSB7CiAgICB3aGlsZSAoaGVhZCkgewogICAgICAgIGlmICghc3RyY21wKGhlYWQtPnRheFN0YXRlLCJNQSIpKQogICAgICAgICAgICBoZWFkLT5zdGF0ZVRheCA9IENBTENfU1RBVEVfVEFYKGhlYWQtPmdyb3NzUGF5LCBNQV9UQVhfUkFURSk7CiAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChoZWFkLT50YXhTdGF0ZSwiVlQiKSkKICAgICAgICAgICAgaGVhZC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoZWFkLT5ncm9zc1BheSwgVlRfVEFYX1JBVEUpOwogICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoaGVhZC0+dGF4U3RhdGUsIk5IIikpCiAgICAgICAgICAgIGhlYWQtPnN0YXRlVGF4ID0gQ0FMQ19TVEFURV9UQVgoaGVhZC0+Z3Jvc3NQYXksIE5IX1RBWF9SQVRFKTsKICAgICAgICBlbHNlIGlmICghc3RyY21wKGhlYWQtPnRheFN0YXRlLCJDQSIpKQogICAgICAgICAgICBoZWFkLT5zdGF0ZVRheCA9IENBTENfU1RBVEVfVEFYKGhlYWQtPmdyb3NzUGF5LCBDQV9UQVhfUkFURSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBoZWFkLT5zdGF0ZVRheCA9IENBTENfU1RBVEVfVEFYKGhlYWQtPmdyb3NzUGF5LCBERUZBVUxUX1NUQVRFX1RBWF9SQVRFKTsKCiAgICAgICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICB9Cn0KCnZvaWQgY2FsY0ZlZFRheChFTVBMT1lFRSAqaGVhZCkgewogICAgd2hpbGUgKGhlYWQpIHsKICAgICAgICBoZWFkLT5mZWRUYXggPSBDQUxDX0ZFRF9UQVgoaGVhZC0+Z3Jvc3NQYXkpOwogICAgICAgIGhlYWQgPSBoZWFkLT5uZXh0OwogICAgfQp9Cgp2b2lkIGNhbGNOZXRQYXkoRU1QTE9ZRUUgKmhlYWQpIHsKICAgIHdoaWxlIChoZWFkKSB7CiAgICAgICAgaGVhZC0+bmV0UGF5ID0gQ0FMQ19ORVRfUEFZKGhlYWQtPmdyb3NzUGF5LCBoZWFkLT5zdGF0ZVRheCwgaGVhZC0+ZmVkVGF4KTsKICAgICAgICBoZWFkID0gaGVhZC0+bmV4dDsKICAgIH0KfQoKdm9pZCBjYWxjRW1wbG95ZWVUb3RhbHMoRU1QTE9ZRUUgKmhlYWQsIFRPVEFMUyAqdCkgewogICAgd2hpbGUgKGhlYWQpIHsKICAgICAgICB0LT50b3RhbF93YWdlUmF0ZSArPSBoZWFkLT53YWdlUmF0ZTsKICAgICAgICB0LT50b3RhbF9ob3VycyArPSBoZWFkLT5ob3VyczsKICAgICAgICB0LT50b3RhbF9vdmVydGltZUhycyArPSBoZWFkLT5vdmVydGltZUhyczsKICAgICAgICB0LT50b3RhbF9ncm9zc1BheSArPSBoZWFkLT5ncm9zc1BheTsKICAgICAgICB0LT50b3RhbF9zdGF0ZVRheCArPSBoZWFkLT5zdGF0ZVRheDsKICAgICAgICB0LT50b3RhbF9mZWRUYXggKz0gaGVhZC0+ZmVkVGF4OwogICAgICAgIHQtPnRvdGFsX25ldFBheSArPSBoZWFkLT5uZXRQYXk7CiAgICAgICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICB9Cn0KCnZvaWQgY2FsY0VtcGxveWVlTWluTWF4KEVNUExPWUVFICpoZWFkLCBNSU5fTUFYICptKSB7CgogICAgKm0gPSAoTUlOX01BWCl7aGVhZC0+d2FnZVJhdGUsaGVhZC0+aG91cnMsaGVhZC0+b3ZlcnRpbWVIcnMsCiAgICAgICAgICAgICAgICAgICBoZWFkLT5ncm9zc1BheSxoZWFkLT5zdGF0ZVRheCxoZWFkLT5mZWRUYXgsaGVhZC0+bmV0UGF5LAogICAgICAgICAgICAgICAgICAgaGVhZC0+d2FnZVJhdGUsaGVhZC0+aG91cnMsaGVhZC0+b3ZlcnRpbWVIcnMsCiAgICAgICAgICAgICAgICAgICBoZWFkLT5ncm9zc1BheSxoZWFkLT5zdGF0ZVRheCxoZWFkLT5mZWRUYXgsaGVhZC0+bmV0UGF5fTsKCiAgICBoZWFkID0gaGVhZC0+bmV4dDsKCiAgICB3aGlsZSAoaGVhZCkgewogICAgICAgIG0tPm1pbl93YWdlUmF0ZSA9IENBTENfTUlOKGhlYWQtPndhZ2VSYXRlLCBtLT5taW5fd2FnZVJhdGUpOwogICAgICAgIG0tPm1heF93YWdlUmF0ZSA9IENBTENfTUFYKGhlYWQtPndhZ2VSYXRlLCBtLT5tYXhfd2FnZVJhdGUpOwoKICAgICAgICBtLT5taW5faG91cnMgPSBDQUxDX01JTihoZWFkLT5ob3VycywgbS0+bWluX2hvdXJzKTsKICAgICAgICBtLT5tYXhfaG91cnMgPSBDQUxDX01BWChoZWFkLT5ob3VycywgbS0+bWF4X2hvdXJzKTsKCiAgICAgICAgbS0+bWluX292ZXJ0aW1lSHJzID0gQ0FMQ19NSU4oaGVhZC0+b3ZlcnRpbWVIcnMsIG0tPm1pbl9vdmVydGltZUhycyk7CiAgICAgICAgbS0+bWF4X292ZXJ0aW1lSHJzID0gQ0FMQ19NQVgoaGVhZC0+b3ZlcnRpbWVIcnMsIG0tPm1heF9vdmVydGltZUhycyk7CgogICAgICAgIG0tPm1pbl9ncm9zc1BheSA9IENBTENfTUlOKGhlYWQtPmdyb3NzUGF5LCBtLT5taW5fZ3Jvc3NQYXkpOwogICAgICAgIG0tPm1heF9ncm9zc1BheSA9IENBTENfTUFYKGhlYWQtPmdyb3NzUGF5LCBtLT5tYXhfZ3Jvc3NQYXkpOwoKICAgICAgICBtLT5taW5fc3RhdGVUYXggPSBDQUxDX01JTihoZWFkLT5zdGF0ZVRheCwgbS0+bWluX3N0YXRlVGF4KTsKICAgICAgICBtLT5tYXhfc3RhdGVUYXggPSBDQUxDX01BWChoZWFkLT5zdGF0ZVRheCwgbS0+bWF4X3N0YXRlVGF4KTsKCiAgICAgICAgbS0+bWluX2ZlZFRheCA9IENBTENfTUlOKGhlYWQtPmZlZFRheCwgbS0+bWluX2ZlZFRheCk7CiAgICAgICAgbS0+bWF4X2ZlZFRheCA9IENBTENfTUFYKGhlYWQtPmZlZFRheCwgbS0+bWF4X2ZlZFRheCk7CgogICAgICAgIG0tPm1pbl9uZXRQYXkgPSBDQUxDX01JTihoZWFkLT5uZXRQYXksIG0tPm1pbl9uZXRQYXkpOwogICAgICAgIG0tPm1heF9uZXRQYXkgPSBDQUxDX01BWChoZWFkLT5uZXRQYXksIG0tPm1heF9uZXRQYXkpOwoKICAgICAgICBoZWFkID0gaGVhZC0+bmV4dDsKICAgIH0KfQoKdm9pZCBwcmludEhlYWRlcigpIHsKICAgIHByaW50ZigiXG4qKiogUGF5IENhbGN1bGF0b3IgKioqXG4iKTsKfQoKdm9pZCBwcmludEVtcChFTVBMT1lFRSAqaGVhZCkgewogICAgd2hpbGUgKGhlYWQpIHsKICAgICAgICBwcmludGYoIlxuJXMgJXMgTmV0OiAlLjJmIiwKICAgICAgICAgICAgICAgaGVhZC0+ZW1wTmFtZS5maXJzdE5hbWUsCiAgICAgICAgICAgICAgIGhlYWQtPmVtcE5hbWUubGFzdE5hbWUsCiAgICAgICAgICAgICAgIGhlYWQtPm5ldFBheSk7CiAgICAgICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICB9Cn0KCnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKFRPVEFMUyAqdCwgTUlOX01BWCAqbSwgaW50IHNpemUpIHsKCiAgICBwcmludGYoIlxuVG90YWxzIEdyb3NzOiAlLjJmIiwgdC0+dG90YWxfZ3Jvc3NQYXkpOwogICAgcHJpbnRmKCJcbkF2ZXJhZ2UgR3Jvc3M6ICUuMmYiLCB0LT50b3RhbF9ncm9zc1BheSAvIHNpemUpOwogICAgcHJpbnRmKCJcbk1pbiBHcm9zczogJS4yZiIsIG0tPm1pbl9ncm9zc1BheSk7CiAgICBwcmludGYoIlxuTWF4IEdyb3NzOiAlLjJmIiwgbS0+bWF4X2dyb3NzUGF5KTsKfQ==