//********************************************************
//
// Assignment 10 - Linked Lists, Typedef, and Macros
//
// Name Seth Hin
//
// Class: C Programming, Spring 2026
//
// Date: April 18, 2026
//
// Description: Program which determines overtime and
// gross pay for a set of employees with outputs sent
// to standard output (the screen).
//
// This assignment also adds the employee name, their tax state,
// and calculates the state tax, federal tax, and net pay. It
// also calculates totals, averages, minimum, and maximum values.
//
// Array and Structure references have all been replaced with
// pointer references to speed up the processing of this code.
// A linked list has been created and deployed to dynamically
// allocate and process employees as needed.
//
// It will also take advantage of the C Preprocessor features,
// in particular with using macros, and will replace all
// struct type references in the code with a typedef alias
// reference.
//
// Call by Reference design (using pointers)
//
//********************************************************
// necessary header files
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
//---------------- CONSTANTS ----------------
#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(h) ((h > STD_HOURS) ? (h - STD_HOURS) : 0)
#define CALC_STATE_TAX(pay, rate) (pay * rate)
#define CALC_FED_TAX(pay) (pay * FED_TAX_RATE)
#define CALC_NET_PAY(pay, st, ft) (pay - (st + ft))
// FIXED MIN/MAX MACROS (REQUIRED)
#define CALC_MIN(theValue, currentMin) ((theValue < currentMin) ? theValue : currentMin)
#define CALC_MAX(theValue, currentMax) ((theValue > currentMax) ? theValue : currentMax)
//---------------- STRUCT DEFINITIONS ----------------
typedef struct name {
char firstName[ FIRST_NAME_SIZE] ;
char lastName[ FIRST_NAME_SIZE] ;
} NAME;
typedef struct employee {
NAME empName;
char taxState[ TAX_STATE_SIZE] ;
long clockNumber;
float wageRate;
float hours;
float overtimeHrs;
float grossPay;
float stateTax;
float fedTax;
float netPay;
struct employee * next;
} EMPLOYEE;
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;
// FIXED typedef usage already correct
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) ;
void calcOvertimeHrs( EMPLOYEE * head) ;
void calcGrossPay( EMPLOYEE * head) ;
void calcStateTax( EMPLOYEE * head) ;
void calcFedTax( EMPLOYEE * head) ;
void calcNetPay( EMPLOYEE * head) ;
void calcEmployeeTotals( EMPLOYEE * head, TOTALS * t) ;
void calcEmployeeMinMax( EMPLOYEE * head, MIN_MAX * m) ;
void printHeader( void ) ;
void printEmp( EMPLOYEE * head) ;
void printEmpStatistics( TOTALS * t, MIN_MAX * m, int size) ;
//---------------- MAIN ----------------
int main( ) {
EMPLOYEE * head_ptr;
int size;
TOTALS totals = { 0 } ;
MIN_MAX minmax = { 0 } ;
head_ptr = getEmpData( ) ;
size = isEmployeeSize( head_ptr) ;
if ( size > 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 \n *** End of Program *** \n " ) ; return 0 ;
}
//---------------- INPUT FUNCTION ----------------
EMPLOYEE * getEmpData( void ) {
EMPLOYEE * head = NULL, * current = NULL;
char ans;
while ( 1 ) {
EMPLOYEE
* node
= malloc ( sizeof ( EMPLOYEE
) ) ;
scanf ( "%s" , node
-> empName.
firstName ) ; scanf ( "%s" , node
-> empName.
lastName ) ; scanf ( "%s" , node
-> taxState
) ; scanf ( "%ld" , & node
-> clockNumber
) ; scanf ( "%f" , & node
-> wageRate
) ; scanf ( "%f" , & node
-> hours
) ;
node-> next = NULL;
if ( ! head)
head = node;
else
current-> next = node;
current = node;
break ;
}
return head;
}
//---------------- SIZE ----------------
int isEmployeeSize( EMPLOYEE * head) {
int count = 0 ;
while ( head) {
count++;
head = head-> next;
}
return count;
}
//---------------- CALCULATIONS ----------------
void calcOvertimeHrs( EMPLOYEE * h) {
while ( h) {
h-> overtimeHrs = CALC_OT_HOURS( h-> hours) ;
h = h-> next;
}
}
void calcGrossPay( EMPLOYEE * h) {
while ( h) {
float normal = h-> wageRate * ( h-> hours - h-> overtimeHrs) ;
float ot = h-> overtimeHrs * ( h-> wageRate * OT_RATE) ;
h-> grossPay = normal + ot;
h = h-> next;
}
}
void calcStateTax( EMPLOYEE * h) {
while ( h) {
if ( strcmp ( h
-> taxState
, "MA" ) == 0 ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, MA_TAX_RATE) ;
else if ( strcmp ( h
-> taxState
, "NH" ) == 0 ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, NH_TAX_RATE) ;
else if ( strcmp ( h
-> taxState
, "VT" ) == 0 ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, VT_TAX_RATE) ;
else if ( strcmp ( h
-> taxState
, "CA" ) == 0 ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, CA_TAX_RATE) ;
else
h-> stateTax = CALC_STATE_TAX( h-> grossPay, DEFAULT_STATE_TAX_RATE) ;
h = h-> next;
}
}
// FIXED: macro used correctly
void calcFedTax( EMPLOYEE * h) {
while ( h) {
h-> fedTax = CALC_FED_TAX( h-> grossPay) ;
h = h-> next;
}
}
void calcNetPay( EMPLOYEE * h) {
while ( h) {
h-> netPay = CALC_NET_PAY( h-> grossPay, h-> stateTax, h-> fedTax) ;
h = h-> next;
}
}
//---------------- TOTALS ----------------
void calcEmployeeTotals( EMPLOYEE * h, TOTALS * t) {
while ( h) {
t-> total_wageRate += h-> wageRate;
t-> total_hours += h-> hours;
t-> total_overtimeHrs += h-> overtimeHrs;
t-> total_grossPay += h-> grossPay;
t-> total_stateTax += h-> stateTax;
t-> total_fedTax += h-> fedTax;
t-> total_netPay += h-> netPay;
h = h-> next;
}
}
//---------------- MIN/MAX FIXED ----------------
void calcEmployeeMinMax( EMPLOYEE * h, MIN_MAX * m) {
EMPLOYEE * p = h;
m-> min_wageRate = m-> max_wageRate = p-> wageRate;
m-> min_hours = m-> max_hours = p-> hours;
m-> min_overtimeHrs = m-> max_overtimeHrs = p-> overtimeHrs;
m-> min_grossPay = m-> max_grossPay = p-> grossPay;
m-> min_stateTax = m-> max_stateTax = p-> stateTax;
m-> min_fedTax = m-> max_fedTax = p-> fedTax;
m-> min_netPay = m-> max_netPay = p-> netPay;
p = p-> next;
while ( p) {
m-> min_wageRate = CALC_MIN( p-> wageRate, m-> min_wageRate) ;
m-> max_wageRate = CALC_MAX( p-> wageRate, m-> max_wageRate) ;
m-> min_hours = CALC_MIN( p-> hours, m-> min_hours) ;
m-> max_hours = CALC_MAX( p-> hours, m-> max_hours) ;
m-> min_overtimeHrs = CALC_MIN( p-> overtimeHrs, m-> min_overtimeHrs) ;
m-> max_overtimeHrs = CALC_MAX( p-> overtimeHrs, m-> max_overtimeHrs) ;
m-> min_grossPay = CALC_MIN( p-> grossPay, m-> min_grossPay) ;
m-> max_grossPay = CALC_MAX( p-> grossPay, m-> max_grossPay) ;
m-> min_stateTax = CALC_MIN( p-> stateTax, m-> min_stateTax) ;
m-> max_stateTax = CALC_MAX( p-> stateTax, m-> max_stateTax) ;
m-> min_fedTax = CALC_MIN( p-> fedTax, m-> min_fedTax) ;
m-> max_fedTax = CALC_MAX( p-> fedTax, m-> max_fedTax) ;
m-> min_netPay = CALC_MIN( p-> netPay, m-> min_netPay) ;
m-> max_netPay = CALC_MAX( p-> netPay, m-> max_netPay) ;
p = p-> next;
}
}
//---------------- OUTPUT ----------------
void printHeader( void ) {
printf ( "\n *** Pay Calculator ***\n " ) ;
printf ( "\n ---------------------------------------------------------------------------------" ) ; printf ( "\n Name Tax Clock# Wage Hours OT Gross State Fed Net" ) ; printf ( "\n State Pay Tax Tax Pay" ) ; printf ( "\n ---------------------------------------------------------------------------------" ) ; }
void printEmp( EMPLOYEE * h) {
while ( h) {
char name[ 25 ] ;
strcpy ( name
, h
-> empName.
firstName ) ; strcat ( name
, h
-> empName.
lastName ) ;
printf ( "\n %-20.20s %-2.2s %06ld %5.2f %4.1f %4.1f %7.2f %6.2f %7.2f %8.2f" , name, h-> taxState, h-> clockNumber,
h-> wageRate, h-> hours, h-> overtimeHrs,
h-> grossPay, h-> stateTax, h-> fedTax, h-> netPay) ;
h = h-> next;
}
}
void printEmpStatistics( TOTALS * t, MIN_MAX * m, int size) {
printf ( "\n ---------------------------------------------------------------------------------" ) ;
printf ( "\n Totals: %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 ( "\n Averages: %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 ( "\n Minimum: %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 ( "\n Maximum: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f" , m-> max_wageRate,
m-> max_hours,
m-> max_overtimeHrs,
m-> max_grossPay,
m-> max_stateTax,
m-> max_fedTax,
m-> max_netPay) ;
printf ( "\n \n The total employees processed was: %d\n " , size
) ; }
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLwovLyBBc3NpZ25tZW50IDEwIC0gTGlua2VkIExpc3RzLCBUeXBlZGVmLCBhbmQgTWFjcm9zCi8vCi8vIE5hbWUgU2V0aCBIaW4KLy8KLy8gQ2xhc3M6IEMgUHJvZ3JhbW1pbmcsIFNwcmluZyAyMDI2Ci8vCi8vIERhdGU6IEFwcmlsIDE4LCAyMDI2Ci8vCi8vIERlc2NyaXB0aW9uOiBQcm9ncmFtIHdoaWNoIGRldGVybWluZXMgb3ZlcnRpbWUgYW5kIAovLyBncm9zcyBwYXkgZm9yIGEgc2V0IG9mIGVtcGxveWVlcyB3aXRoIG91dHB1dHMgc2VudCAKLy8gdG8gc3RhbmRhcmQgb3V0cHV0ICh0aGUgc2NyZWVuKS4KLy8KLy8gVGhpcyBhc3NpZ25tZW50IGFsc28gYWRkcyB0aGUgZW1wbG95ZWUgbmFtZSwgdGhlaXIgdGF4IHN0YXRlLAovLyBhbmQgY2FsY3VsYXRlcyB0aGUgc3RhdGUgdGF4LCBmZWRlcmFsIHRheCwgYW5kIG5ldCBwYXkuICAgSXQKLy8gYWxzbyBjYWxjdWxhdGVzIHRvdGFscywgYXZlcmFnZXMsIG1pbmltdW0sIGFuZCBtYXhpbXVtIHZhbHVlcy4KLy8KLy8gQXJyYXkgYW5kIFN0cnVjdHVyZSByZWZlcmVuY2VzIGhhdmUgYWxsIGJlZW4gcmVwbGFjZWQgd2l0aAovLyBwb2ludGVyIHJlZmVyZW5jZXMgdG8gc3BlZWQgdXAgdGhlIHByb2Nlc3Npbmcgb2YgdGhpcyBjb2RlLgovLyBBIGxpbmtlZCBsaXN0IGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGRlcGxveWVkIHRvIGR5bmFtaWNhbGx5Ci8vIGFsbG9jYXRlIGFuZCBwcm9jZXNzIGVtcGxveWVlcyBhcyBuZWVkZWQuCi8vCi8vIEl0IHdpbGwgYWxzbyB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQyBQcmVwcm9jZXNzb3IgZmVhdHVyZXMsCi8vIGluIHBhcnRpY3VsYXIgd2l0aCB1c2luZyBtYWNyb3MsIGFuZCB3aWxsIHJlcGxhY2UgYWxsIAovLyBzdHJ1Y3QgdHlwZSByZWZlcmVuY2VzIGluIHRoZSBjb2RlIHdpdGggYSB0eXBlZGVmIGFsaWFzCi8vIHJlZmVyZW5jZS4KLy8KLy8gQ2FsbCBieSBSZWZlcmVuY2UgZGVzaWduICh1c2luZyBwb2ludGVycykKLy8KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKLy8gbmVjZXNzYXJ5IGhlYWRlciBmaWxlcwojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKLy8tLS0tLS0tLS0tLS0tLS0tIENPTlNUQU5UUyAtLS0tLS0tLS0tLS0tLS0tCgojZGVmaW5lIFNURF9IT1VSUyA0MC4wCiNkZWZpbmUgT1RfUkFURSAxLjUKCiNkZWZpbmUgTUFfVEFYX1JBVEUgMC4wNQojZGVmaW5lIE5IX1RBWF9SQVRFIDAuMAojZGVmaW5lIFZUX1RBWF9SQVRFIDAuMDYKI2RlZmluZSBDQV9UQVhfUkFURSAwLjA3CiNkZWZpbmUgREVGQVVMVF9TVEFURV9UQVhfUkFURSAwLjA4CgojZGVmaW5lIEZFRF9UQVhfUkFURSAwLjI1CgojZGVmaW5lIEZJUlNUX05BTUVfU0laRSAxMAojZGVmaW5lIExBU1RfTkFNRV9TSVpFIDEwCiNkZWZpbmUgVEFYX1NUQVRFX1NJWkUgMwoKLy8tLS0tLS0tLS0tLS0tLS0tIE1BQ1JPUyAtLS0tLS0tLS0tLS0tLS0tCgojZGVmaW5lIENBTENfT1RfSE9VUlMoaCkgKChoID4gU1REX0hPVVJTKSA/IChoIC0gU1REX0hPVVJTKSA6IDApCiNkZWZpbmUgQ0FMQ19TVEFURV9UQVgocGF5LCByYXRlKSAocGF5ICogcmF0ZSkKI2RlZmluZSBDQUxDX0ZFRF9UQVgocGF5KSAocGF5ICogRkVEX1RBWF9SQVRFKQojZGVmaW5lIENBTENfTkVUX1BBWShwYXksIHN0LCBmdCkgKHBheSAtIChzdCArIGZ0KSkKCi8vIEZJWEVEIE1JTi9NQVggTUFDUk9TIChSRVFVSVJFRCkKI2RlZmluZSBDQUxDX01JTih0aGVWYWx1ZSwgY3VycmVudE1pbikgKCh0aGVWYWx1ZSA8IGN1cnJlbnRNaW4pID8gdGhlVmFsdWUgOiBjdXJyZW50TWluKQojZGVmaW5lIENBTENfTUFYKHRoZVZhbHVlLCBjdXJyZW50TWF4KSAoKHRoZVZhbHVlID4gY3VycmVudE1heCkgPyB0aGVWYWx1ZSA6IGN1cnJlbnRNYXgpCgovLy0tLS0tLS0tLS0tLS0tLS0gU1RSVUNUIERFRklOSVRJT05TIC0tLS0tLS0tLS0tLS0tLS0KCnR5cGVkZWYgc3RydWN0IG5hbWUgewogICAgY2hhciBmaXJzdE5hbWVbRklSU1RfTkFNRV9TSVpFXTsKICAgIGNoYXIgbGFzdE5hbWVbRklSU1RfTkFNRV9TSVpFXTsKfSBOQU1FOwoKdHlwZWRlZiBzdHJ1Y3QgZW1wbG95ZWUgewogICAgTkFNRSBlbXBOYW1lOwogICAgY2hhciB0YXhTdGF0ZVtUQVhfU1RBVEVfU0laRV07CiAgICBsb25nIGNsb2NrTnVtYmVyOwogICAgZmxvYXQgd2FnZVJhdGU7CiAgICBmbG9hdCBob3VyczsKICAgIGZsb2F0IG92ZXJ0aW1lSHJzOwogICAgZmxvYXQgZ3Jvc3NQYXk7CiAgICBmbG9hdCBzdGF0ZVRheDsKICAgIGZsb2F0IGZlZFRheDsKICAgIGZsb2F0IG5ldFBheTsKICAgIHN0cnVjdCBlbXBsb3llZSAqbmV4dDsKfSBFTVBMT1lFRTsKCnR5cGVkZWYgc3RydWN0IHRvdGFscyB7CiAgICBmbG9hdCB0b3RhbF93YWdlUmF0ZTsKICAgIGZsb2F0IHRvdGFsX2hvdXJzOwogICAgZmxvYXQgdG90YWxfb3ZlcnRpbWVIcnM7CiAgICBmbG9hdCB0b3RhbF9ncm9zc1BheTsKICAgIGZsb2F0IHRvdGFsX3N0YXRlVGF4OwogICAgZmxvYXQgdG90YWxfZmVkVGF4OwogICAgZmxvYXQgdG90YWxfbmV0UGF5Owp9IFRPVEFMUzsKCi8vIEZJWEVEIHR5cGVkZWYgdXNhZ2UgYWxyZWFkeSBjb3JyZWN0CnR5cGVkZWYgc3RydWN0IG1pbl9tYXggewogICAgZmxvYXQgbWluX3dhZ2VSYXRlOwogICAgZmxvYXQgbWluX2hvdXJzOwogICAgZmxvYXQgbWluX292ZXJ0aW1lSHJzOwogICAgZmxvYXQgbWluX2dyb3NzUGF5OwogICAgZmxvYXQgbWluX3N0YXRlVGF4OwogICAgZmxvYXQgbWluX2ZlZFRheDsKICAgIGZsb2F0IG1pbl9uZXRQYXk7CgogICAgZmxvYXQgbWF4X3dhZ2VSYXRlOwogICAgZmxvYXQgbWF4X2hvdXJzOwogICAgZmxvYXQgbWF4X292ZXJ0aW1lSHJzOwogICAgZmxvYXQgbWF4X2dyb3NzUGF5OwogICAgZmxvYXQgbWF4X3N0YXRlVGF4OwogICAgZmxvYXQgbWF4X2ZlZFRheDsKICAgIGZsb2F0IG1heF9uZXRQYXk7Cn0gTUlOX01BWDsKCi8vLS0tLS0tLS0tLS0tLS0tLSBQUk9UT1RZUEVTIC0tLS0tLS0tLS0tLS0tLS0KCkVNUExPWUVFICpnZXRFbXBEYXRhKHZvaWQpOwppbnQgaXNFbXBsb3llZVNpemUoRU1QTE9ZRUUgKmhlYWQpOwp2b2lkIGNhbGNPdmVydGltZUhycyhFTVBMT1lFRSAqaGVhZCk7CnZvaWQgY2FsY0dyb3NzUGF5KEVNUExPWUVFICpoZWFkKTsKdm9pZCBjYWxjU3RhdGVUYXgoRU1QTE9ZRUUgKmhlYWQpOwp2b2lkIGNhbGNGZWRUYXgoRU1QTE9ZRUUgKmhlYWQpOwp2b2lkIGNhbGNOZXRQYXkoRU1QTE9ZRUUgKmhlYWQpOwp2b2lkIGNhbGNFbXBsb3llZVRvdGFscyhFTVBMT1lFRSAqaGVhZCwgVE9UQUxTICp0KTsKdm9pZCBjYWxjRW1wbG95ZWVNaW5NYXgoRU1QTE9ZRUUgKmhlYWQsIE1JTl9NQVggKm0pOwp2b2lkIHByaW50SGVhZGVyKHZvaWQpOwp2b2lkIHByaW50RW1wKEVNUExPWUVFICpoZWFkKTsKdm9pZCBwcmludEVtcFN0YXRpc3RpY3MoVE9UQUxTICp0LCBNSU5fTUFYICptLCBpbnQgc2l6ZSk7CgovLy0tLS0tLS0tLS0tLS0tLS0gTUFJTiAtLS0tLS0tLS0tLS0tLS0tCgppbnQgbWFpbigpIHsKCiAgICBFTVBMT1lFRSAqaGVhZF9wdHI7CiAgICBpbnQgc2l6ZTsKCiAgICBUT1RBTFMgdG90YWxzID0gezB9OwogICAgTUlOX01BWCBtaW5tYXggPSB7MH07CgogICAgaGVhZF9wdHIgPSBnZXRFbXBEYXRhKCk7CiAgICBzaXplID0gaXNFbXBsb3llZVNpemUoaGVhZF9wdHIpOwoKICAgIGlmIChzaXplID4gMCkgewoKICAgICAgICBjYWxjT3ZlcnRpbWVIcnMoaGVhZF9wdHIpOwogICAgICAgIGNhbGNHcm9zc1BheShoZWFkX3B0cik7CiAgICAgICAgY2FsY1N0YXRlVGF4KGhlYWRfcHRyKTsKICAgICAgICBjYWxjRmVkVGF4KGhlYWRfcHRyKTsKICAgICAgICBjYWxjTmV0UGF5KGhlYWRfcHRyKTsKCiAgICAgICAgY2FsY0VtcGxveWVlVG90YWxzKGhlYWRfcHRyLCAmdG90YWxzKTsKICAgICAgICBjYWxjRW1wbG95ZWVNaW5NYXgoaGVhZF9wdHIsICZtaW5tYXgpOwoKICAgICAgICBwcmludEhlYWRlcigpOwogICAgICAgIHByaW50RW1wKGhlYWRfcHRyKTsKICAgICAgICBwcmludEVtcFN0YXRpc3RpY3MoJnRvdGFscywgJm1pbm1heCwgc2l6ZSk7CiAgICB9CgogICAgcHJpbnRmKCJcblxuICoqKiBFbmQgb2YgUHJvZ3JhbSAqKiogXG4iKTsKICAgIHJldHVybiAwOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0gSU5QVVQgRlVOQ1RJT04gLS0tLS0tLS0tLS0tLS0tLQoKRU1QTE9ZRUUgKmdldEVtcERhdGEodm9pZCkgewoKICAgIEVNUExPWUVFICpoZWFkID0gTlVMTCwgKmN1cnJlbnQgPSBOVUxMOwogICAgY2hhciBhbnM7CgogICAgd2hpbGUgKDEpIHsKCiAgICAgICAgRU1QTE9ZRUUgKm5vZGUgPSBtYWxsb2Moc2l6ZW9mKEVNUExPWUVFKSk7CgogICAgICAgIHNjYW5mKCIlcyIsIG5vZGUtPmVtcE5hbWUuZmlyc3ROYW1lKTsKICAgICAgICBzY2FuZigiJXMiLCBub2RlLT5lbXBOYW1lLmxhc3ROYW1lKTsKICAgICAgICBzY2FuZigiJXMiLCBub2RlLT50YXhTdGF0ZSk7CiAgICAgICAgc2NhbmYoIiVsZCIsICZub2RlLT5jbG9ja051bWJlcik7CiAgICAgICAgc2NhbmYoIiVmIiwgJm5vZGUtPndhZ2VSYXRlKTsKICAgICAgICBzY2FuZigiJWYiLCAmbm9kZS0+aG91cnMpOwoKICAgICAgICBub2RlLT5uZXh0ID0gTlVMTDsKCiAgICAgICAgaWYgKCFoZWFkKQogICAgICAgICAgICBoZWFkID0gbm9kZTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGN1cnJlbnQtPm5leHQgPSBub2RlOwoKICAgICAgICBjdXJyZW50ID0gbm9kZTsKCiAgICAgICAgc2NhbmYoIiAlYyIsICZhbnMpOwogICAgICAgIGlmICh0b3VwcGVyKGFucykgIT0gJ1knKQogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gaGVhZDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tIFNJWkUgLS0tLS0tLS0tLS0tLS0tLQoKaW50IGlzRW1wbG95ZWVTaXplKEVNUExPWUVFICpoZWFkKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgd2hpbGUgKGhlYWQpIHsKICAgICAgICBjb3VudCsrOwogICAgICAgIGhlYWQgPSBoZWFkLT5uZXh0OwogICAgfQogICAgcmV0dXJuIGNvdW50Owp9CgovLy0tLS0tLS0tLS0tLS0tLS0gQ0FMQ1VMQVRJT05TIC0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgY2FsY092ZXJ0aW1lSHJzKEVNUExPWUVFICpoKSB7CiAgICB3aGlsZSAoaCkgewogICAgICAgIGgtPm92ZXJ0aW1lSHJzID0gQ0FMQ19PVF9IT1VSUyhoLT5ob3Vycyk7CiAgICAgICAgaCA9IGgtPm5leHQ7CiAgICB9Cn0KCnZvaWQgY2FsY0dyb3NzUGF5KEVNUExPWUVFICpoKSB7CiAgICB3aGlsZSAoaCkgewogICAgICAgIGZsb2F0IG5vcm1hbCA9IGgtPndhZ2VSYXRlICogKGgtPmhvdXJzIC0gaC0+b3ZlcnRpbWVIcnMpOwogICAgICAgIGZsb2F0IG90ID0gaC0+b3ZlcnRpbWVIcnMgKiAoaC0+d2FnZVJhdGUgKiBPVF9SQVRFKTsKICAgICAgICBoLT5ncm9zc1BheSA9IG5vcm1hbCArIG90OwogICAgICAgIGggPSBoLT5uZXh0OwogICAgfQp9Cgp2b2lkIGNhbGNTdGF0ZVRheChFTVBMT1lFRSAqaCkgewogICAgd2hpbGUgKGgpIHsKCiAgICAgICAgaWYgKHN0cmNtcChoLT50YXhTdGF0ZSwgIk1BIikgPT0gMCkKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSwgTUFfVEFYX1JBVEUpOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcChoLT50YXhTdGF0ZSwgIk5IIikgPT0gMCkKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSwgTkhfVEFYX1JBVEUpOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcChoLT50YXhTdGF0ZSwgIlZUIikgPT0gMCkKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSwgVlRfVEFYX1JBVEUpOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcChoLT50YXhTdGF0ZSwgIkNBIikgPT0gMCkKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSwgQ0FfVEFYX1JBVEUpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSwgREVGQVVMVF9TVEFURV9UQVhfUkFURSk7CgogICAgICAgIGggPSBoLT5uZXh0OwogICAgfQp9CgovLyBGSVhFRDogbWFjcm8gdXNlZCBjb3JyZWN0bHkKdm9pZCBjYWxjRmVkVGF4KEVNUExPWUVFICpoKSB7CiAgICB3aGlsZSAoaCkgewogICAgICAgIGgtPmZlZFRheCA9IENBTENfRkVEX1RBWChoLT5ncm9zc1BheSk7CiAgICAgICAgaCA9IGgtPm5leHQ7CiAgICB9Cn0KCnZvaWQgY2FsY05ldFBheShFTVBMT1lFRSAqaCkgewogICAgd2hpbGUgKGgpIHsKICAgICAgICBoLT5uZXRQYXkgPSBDQUxDX05FVF9QQVkoaC0+Z3Jvc3NQYXksIGgtPnN0YXRlVGF4LCBoLT5mZWRUYXgpOwogICAgICAgIGggPSBoLT5uZXh0OwogICAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0gVE9UQUxTIC0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgY2FsY0VtcGxveWVlVG90YWxzKEVNUExPWUVFICpoLCBUT1RBTFMgKnQpIHsKICAgIHdoaWxlIChoKSB7CiAgICAgICAgdC0+dG90YWxfd2FnZVJhdGUgKz0gaC0+d2FnZVJhdGU7CiAgICAgICAgdC0+dG90YWxfaG91cnMgKz0gaC0+aG91cnM7CiAgICAgICAgdC0+dG90YWxfb3ZlcnRpbWVIcnMgKz0gaC0+b3ZlcnRpbWVIcnM7CiAgICAgICAgdC0+dG90YWxfZ3Jvc3NQYXkgKz0gaC0+Z3Jvc3NQYXk7CiAgICAgICAgdC0+dG90YWxfc3RhdGVUYXggKz0gaC0+c3RhdGVUYXg7CiAgICAgICAgdC0+dG90YWxfZmVkVGF4ICs9IGgtPmZlZFRheDsKICAgICAgICB0LT50b3RhbF9uZXRQYXkgKz0gaC0+bmV0UGF5OwogICAgICAgIGggPSBoLT5uZXh0OwogICAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0gTUlOL01BWCBGSVhFRCAtLS0tLS0tLS0tLS0tLS0tCgp2b2lkIGNhbGNFbXBsb3llZU1pbk1heChFTVBMT1lFRSAqaCwgTUlOX01BWCAqbSkgewoKICAgIEVNUExPWUVFICpwID0gaDsKCiAgICBtLT5taW5fd2FnZVJhdGUgPSBtLT5tYXhfd2FnZVJhdGUgPSBwLT53YWdlUmF0ZTsKICAgIG0tPm1pbl9ob3VycyA9IG0tPm1heF9ob3VycyA9IHAtPmhvdXJzOwogICAgbS0+bWluX292ZXJ0aW1lSHJzID0gbS0+bWF4X292ZXJ0aW1lSHJzID0gcC0+b3ZlcnRpbWVIcnM7CiAgICBtLT5taW5fZ3Jvc3NQYXkgPSBtLT5tYXhfZ3Jvc3NQYXkgPSBwLT5ncm9zc1BheTsKICAgIG0tPm1pbl9zdGF0ZVRheCA9IG0tPm1heF9zdGF0ZVRheCA9IHAtPnN0YXRlVGF4OwogICAgbS0+bWluX2ZlZFRheCA9IG0tPm1heF9mZWRUYXggPSBwLT5mZWRUYXg7CiAgICBtLT5taW5fbmV0UGF5ID0gbS0+bWF4X25ldFBheSA9IHAtPm5ldFBheTsKCiAgICBwID0gcC0+bmV4dDsKCiAgICB3aGlsZSAocCkgewoKICAgICAgICBtLT5taW5fd2FnZVJhdGUgPSBDQUxDX01JTihwLT53YWdlUmF0ZSwgbS0+bWluX3dhZ2VSYXRlKTsKICAgICAgICBtLT5tYXhfd2FnZVJhdGUgPSBDQUxDX01BWChwLT53YWdlUmF0ZSwgbS0+bWF4X3dhZ2VSYXRlKTsKCiAgICAgICAgbS0+bWluX2hvdXJzID0gQ0FMQ19NSU4ocC0+aG91cnMsIG0tPm1pbl9ob3Vycyk7CiAgICAgICAgbS0+bWF4X2hvdXJzID0gQ0FMQ19NQVgocC0+aG91cnMsIG0tPm1heF9ob3Vycyk7CgogICAgICAgIG0tPm1pbl9vdmVydGltZUhycyA9IENBTENfTUlOKHAtPm92ZXJ0aW1lSHJzLCBtLT5taW5fb3ZlcnRpbWVIcnMpOwogICAgICAgIG0tPm1heF9vdmVydGltZUhycyA9IENBTENfTUFYKHAtPm92ZXJ0aW1lSHJzLCBtLT5tYXhfb3ZlcnRpbWVIcnMpOwoKICAgICAgICBtLT5taW5fZ3Jvc3NQYXkgPSBDQUxDX01JTihwLT5ncm9zc1BheSwgbS0+bWluX2dyb3NzUGF5KTsKICAgICAgICBtLT5tYXhfZ3Jvc3NQYXkgPSBDQUxDX01BWChwLT5ncm9zc1BheSwgbS0+bWF4X2dyb3NzUGF5KTsKCiAgICAgICAgbS0+bWluX3N0YXRlVGF4ID0gQ0FMQ19NSU4ocC0+c3RhdGVUYXgsIG0tPm1pbl9zdGF0ZVRheCk7CiAgICAgICAgbS0+bWF4X3N0YXRlVGF4ID0gQ0FMQ19NQVgocC0+c3RhdGVUYXgsIG0tPm1heF9zdGF0ZVRheCk7CgogICAgICAgIG0tPm1pbl9mZWRUYXggPSBDQUxDX01JTihwLT5mZWRUYXgsIG0tPm1pbl9mZWRUYXgpOwogICAgICAgIG0tPm1heF9mZWRUYXggPSBDQUxDX01BWChwLT5mZWRUYXgsIG0tPm1heF9mZWRUYXgpOwoKICAgICAgICBtLT5taW5fbmV0UGF5ID0gQ0FMQ19NSU4ocC0+bmV0UGF5LCBtLT5taW5fbmV0UGF5KTsKICAgICAgICBtLT5tYXhfbmV0UGF5ID0gQ0FMQ19NQVgocC0+bmV0UGF5LCBtLT5tYXhfbmV0UGF5KTsKCiAgICAgICAgcCA9IHAtPm5leHQ7CiAgICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLSBPVVRQVVQgLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBwcmludEhlYWRlcih2b2lkKSB7CgogICAgcHJpbnRmKCJcbioqKiBQYXkgQ2FsY3VsYXRvciAqKipcbiIpOwoKICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKICAgIHByaW50ZigiXG5OYW1lICAgICAgICAgICAgICAgIFRheCAgQ2xvY2sjICBXYWdlICAgSG91cnMgIE9UICAgR3Jvc3MgICBTdGF0ZSAgRmVkICAgICAgTmV0Iik7CiAgICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheSAgICAgVGF4ICAgIFRheCAgICAgIFBheSIpOwogICAgcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwp9Cgp2b2lkIHByaW50RW1wKEVNUExPWUVFICpoKSB7CgogICAgd2hpbGUgKGgpIHsKCiAgICAgICAgY2hhciBuYW1lWzI1XTsKICAgICAgICBzdHJjcHkobmFtZSwgaC0+ZW1wTmFtZS5maXJzdE5hbWUpOwogICAgICAgIHN0cmNhdChuYW1lLCAiICIpOwogICAgICAgIHN0cmNhdChuYW1lLCBoLT5lbXBOYW1lLmxhc3ROYW1lKTsKCiAgICAgICAgcHJpbnRmKCJcbiUtMjAuMjBzICUtMi4ycyAgJTA2bGQgICU1LjJmICAlNC4xZiAgJTQuMWYgICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICAgICAgbmFtZSwgaC0+dGF4U3RhdGUsIGgtPmNsb2NrTnVtYmVyLAogICAgICAgICAgICBoLT53YWdlUmF0ZSwgaC0+aG91cnMsIGgtPm92ZXJ0aW1lSHJzLAogICAgICAgICAgICBoLT5ncm9zc1BheSwgaC0+c3RhdGVUYXgsIGgtPmZlZFRheCwgaC0+bmV0UGF5KTsKCiAgICAgICAgaCA9IGgtPm5leHQ7CiAgICB9Cn0KCnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKFRPVEFMUyAqdCwgTUlOX01BWCAqbSwgaW50IHNpemUpIHsKCiAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CgogICAgcHJpbnRmKCJcblRvdGFsczogICAgICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU1LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICB0LT50b3RhbF93YWdlUmF0ZSwKICAgICAgICB0LT50b3RhbF9ob3VycywKICAgICAgICB0LT50b3RhbF9vdmVydGltZUhycywKICAgICAgICB0LT50b3RhbF9ncm9zc1BheSwKICAgICAgICB0LT50b3RhbF9zdGF0ZVRheCwKICAgICAgICB0LT50b3RhbF9mZWRUYXgsCiAgICAgICAgdC0+dG90YWxfbmV0UGF5KTsKCiAgICBwcmludGYoIlxuQXZlcmFnZXM6ICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgIHQtPnRvdGFsX3dhZ2VSYXRlL3NpemUsCiAgICAgICAgdC0+dG90YWxfaG91cnMvc2l6ZSwKICAgICAgICB0LT50b3RhbF9vdmVydGltZUhycy9zaXplLAogICAgICAgIHQtPnRvdGFsX2dyb3NzUGF5L3NpemUsCiAgICAgICAgdC0+dG90YWxfc3RhdGVUYXgvc2l6ZSwKICAgICAgICB0LT50b3RhbF9mZWRUYXgvc2l6ZSwKICAgICAgICB0LT50b3RhbF9uZXRQYXkvc2l6ZSk7CgogICAgcHJpbnRmKCJcbk1pbmltdW06ICAgICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU1LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICBtLT5taW5fd2FnZVJhdGUsCiAgICAgICAgbS0+bWluX2hvdXJzLAogICAgICAgIG0tPm1pbl9vdmVydGltZUhycywKICAgICAgICBtLT5taW5fZ3Jvc3NQYXksCiAgICAgICAgbS0+bWluX3N0YXRlVGF4LAogICAgICAgIG0tPm1pbl9mZWRUYXgsCiAgICAgICAgbS0+bWluX25ldFBheSk7CgogICAgcHJpbnRmKCJcbk1heGltdW06ICAgICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU1LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICBtLT5tYXhfd2FnZVJhdGUsCiAgICAgICAgbS0+bWF4X2hvdXJzLAogICAgICAgIG0tPm1heF9vdmVydGltZUhycywKICAgICAgICBtLT5tYXhfZ3Jvc3NQYXksCiAgICAgICAgbS0+bWF4X3N0YXRlVGF4LAogICAgICAgIG0tPm1heF9mZWRUYXgsCiAgICAgICAgbS0+bWF4X25ldFBheSk7CgogICAgcHJpbnRmKCJcblxuVGhlIHRvdGFsIGVtcGxveWVlcyBwcm9jZXNzZWQgd2FzOiAlZFxuIiwgc2l6ZSk7Cn0=