//********************************************************
//
// Assignment 8 - Structures and Strings and Pointers
//
// Name: <replace with your name>
//
// Class: C Programming, <replace with Semester and Year>
//
// Date: <replace with the current date>
//
// 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 are to be replaced with
// pointer references to speed up the processing of this code.
//
// Call by Reference design (using pointers)
//
//********************************************************
// necessary header files
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h> // for exit()
// define 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 NAME_SIZE 20
#define TAX_STATE_SIZE 3
#define FED_TAX_RATE 0.25
#define FIRST_NAME_SIZE 10
#define LAST_NAME_SIZE 10
// Define a structure type to store an employee name
struct name
{
char firstName[ FIRST_NAME_SIZE] ;
char lastName [ LAST_NAME_SIZE] ;
} ;
// Define a structure type to pass employee data between functions
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;
} ;
// Function prototypes
void inputData( struct employee * empPtr) ;
void calculatePay( struct employee * empPtr) ;
void calculateTaxes( struct employee * empPtr) ;
void outputData( const struct employee * empPtr) ;
void calculateStats( const struct employee * emps, float * totalGrossPayPtr, float * avgGrossPayPtr,
float * minGrossPayPtr, float * maxGrossPayPtr) ;
void outputStats( float totalGrossPay, float avgGrossPay, float minGrossPay, float maxGrossPay) ;
int main( )
{
struct employee employees[ SIZE] ;
float totalGrossPay = 0.0 , avgGrossPay = 0.0 , minGrossPay = 0.0 , maxGrossPay = 0.0 ;
int i;
// Loop to input data for each employee
for ( i = 0 ; i < SIZE; i++ )
{
printf ( "--- Enter data for Employee %d ---\n " , i
+ 1 ) ; inputData( & employees[ i] ) ;
calculatePay( & employees[ i] ) ;
calculateTaxes( & employees[ i] ) ;
}
// Output header
printf ( "\n \n ------------------------------------------------------------------------------------------------------------------\n " ) ; printf ( "| Name | Clock # | Wage | Hours | OT Hrs | Gross Pay | State Tax | Fed Tax | Net Pay |\n " ) ; printf ( "------------------------------------------------------------------------------------------------------------------\n " ) ;
// Loop to output data for each employee
for ( i = 0 ; i < SIZE; i++ )
{
outputData( & employees[ i] ) ;
}
printf ( "------------------------------------------------------------------------------------------------------------------\n " ) ;
// Calculate and output statistics
calculateStats( employees, & totalGrossPay, & avgGrossPay, & minGrossPay, & maxGrossPay) ;
outputStats( totalGrossPay, avgGrossPay, minGrossPay, maxGrossPay) ;
return 0 ;
}
// Function to input employee data using pointers
void inputData( struct employee * empPtr)
{
scanf ( "%s" , empPtr
-> empName.
firstName ) ; scanf ( "%s" , empPtr
-> empName.
lastName ) ; printf ( "Enter tax state (MA, NH, VT, CA, or Other): " ) ; scanf ( "%s" , empPtr
-> taxState
) ; printf ( "Enter clock number: " ) ; scanf ( "%ld" , & empPtr
-> clockNumber
) ; scanf ( "%f" , & empPtr
-> wageRate
) ; printf ( "Enter hours worked: " ) ; scanf ( "%f" , & empPtr
-> hours
) ; }
// Function to calculate overtime hours and gross pay using pointers
void calculatePay( struct employee * empPtr)
{
if ( empPtr-> hours > STD_HOURS)
{
empPtr-> overtimeHrs = empPtr-> hours - STD_HOURS;
empPtr-> grossPay = ( STD_HOURS * empPtr-> wageRate) +
( empPtr-> overtimeHrs * empPtr-> wageRate * OT_RATE) ;
}
else
{
empPtr-> overtimeHrs = 0.0 ;
empPtr-> grossPay = empPtr-> hours * empPtr-> wageRate;
}
}
// Function to calculate taxes using pointers and string comparison
void calculateTaxes( struct employee * empPtr)
{
float stateTaxRate;
// Convert state input to uppercase for comparison
empPtr
-> taxState
[ 0 ] = toupper ( empPtr
-> taxState
[ 0 ] ) ; empPtr
-> taxState
[ 1 ] = toupper ( empPtr
-> taxState
[ 1 ] ) ;
if ( strcmp ( empPtr
-> taxState
, "MA" ) == 0 ) {
stateTaxRate = MA_TAX_RATE;
}
else if ( strcmp ( empPtr
-> taxState
, "NH" ) == 0 ) {
stateTaxRate = NH_TAX_RATE;
}
else if ( strcmp ( empPtr
-> taxState
, "VT" ) == 0 ) {
stateTaxRate = VT_TAX_RATE;
}
else if ( strcmp ( empPtr
-> taxState
, "CA" ) == 0 ) {
stateTaxRate = CA_TAX_RATE;
}
else
{
stateTaxRate = DEFAULT_TAX_RATE;
}
empPtr-> stateTax = empPtr-> grossPay * stateTaxRate;
empPtr-> fedTax = empPtr-> grossPay * FED_TAX_RATE;
empPtr-> netPay = empPtr-> grossPay - empPtr-> stateTax - empPtr-> fedTax;
}
// Function to output employee data using pointers
void outputData( const struct employee * empPtr)
{
char fullName[ NAME_SIZE] ;
sprintf ( fullName
, "%s %s" , empPtr
-> empName.
firstName , empPtr
-> empName.
lastName ) ;
printf ( "| %-20s | %-9ld | %-4.2f | %-5.2f | %-6.2f | %-9.2f | %-9.2f | %-9.2f | %-9.2f |\n " , fullName,
empPtr-> clockNumber,
empPtr-> wageRate,
empPtr-> hours,
empPtr-> overtimeHrs,
empPtr-> grossPay,
empPtr-> stateTax,
empPtr-> fedTax,
empPtr-> netPay) ;
}
// Function to calculate total, average, min, and max gross pay using pointers
void calculateStats( const struct employee * emps, float * totalGrossPayPtr, float * avgGrossPayPtr,
float * minGrossPayPtr, float * maxGrossPayPtr)
{
int i;
* totalGrossPayPtr = 0.0 ;
* minGrossPayPtr = emps[ 0 ] .grossPay ; // Initialize min/max with the first employee's data
* maxGrossPayPtr = emps[ 0 ] .grossPay ;
for ( i = 0 ; i < SIZE; i++ )
{
* totalGrossPayPtr += emps[ i] .grossPay ;
if ( emps[ i] .grossPay < * minGrossPayPtr)
{
* minGrossPayPtr = emps[ i] .grossPay ;
}
if ( emps[ i] .grossPay > * maxGrossPayPtr)
{
* maxGrossPayPtr = emps[ i] .grossPay ;
}
}
* avgGrossPayPtr = * totalGrossPayPtr / SIZE;
}
// Function to output statistics
void outputStats( float totalGrossPay, float avgGrossPay, float minGrossPay, float maxGrossPay)
{
printf ( "\n Payroll Statistics:\n " ) ; printf ( "Total Gross Pay: $%.2f\n " , totalGrossPay
) ; printf ( "Average Gross Pay: $%.2f\n " , avgGrossPay
) ; printf ( "Minimum Gross Pay: $%.2f\n " , minGrossPay
) ; printf ( "Maximum Gross Pay: $%.2f\n " , maxGrossPay
) ; }
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLwovLyBBc3NpZ25tZW50IDggLSBTdHJ1Y3R1cmVzIGFuZCBTdHJpbmdzIGFuZCBQb2ludGVycwovLwovLyBOYW1lOiA8cmVwbGFjZSB3aXRoIHlvdXIgbmFtZT4KLy8KLy8gQ2xhc3M6IEMgUHJvZ3JhbW1pbmcsIDxyZXBsYWNlIHdpdGggU2VtZXN0ZXIgYW5kIFllYXI+Ci8vCi8vIERhdGU6IDxyZXBsYWNlIHdpdGggdGhlIGN1cnJlbnQgZGF0ZT4KLy8KLy8gRGVzY3JpcHRpb246IFByb2dyYW0gd2hpY2ggZGV0ZXJtaW5lcyBvdmVydGltZSBhbmQgCi8vIGdyb3NzIHBheSBmb3IgYSBzZXQgb2YgZW1wbG95ZWVzIHdpdGggb3V0cHV0cyBzZW50IAovLyB0byBzdGFuZGFyZCBvdXRwdXQgKHRoZSBzY3JlZW4pLgovLwovLyBUaGlzIGFzc2lnbm1lbnQgYWxzbyBhZGRzIHRoZSBlbXBsb3llZSBuYW1lLCB0aGVpciB0YXggc3RhdGUsCi8vIGFuZCBjYWxjdWxhdGVzIHRoZSBzdGF0ZSB0YXgsIGZlZGVyYWwgdGF4LCBhbmQgbmV0IHBheS4gICBJdAovLyBhbHNvIGNhbGN1bGF0ZXMgdG90YWxzLCBhdmVyYWdlcywgbWluaW11bSwgYW5kIG1heGltdW0gdmFsdWVzLgovLwovLyBBcnJheSBhbmQgU3RydWN0dXJlIHJlZmVyZW5jZXMgYXJlIHRvIGJlIHJlcGxhY2VkIHdpdGgKLy8gcG9pbnRlciByZWZlcmVuY2VzIHRvIHNwZWVkIHVwIHRoZSBwcm9jZXNzaW5nIG9mIHRoaXMgY29kZS4KLy8KLy8gQ2FsbCBieSBSZWZlcmVuY2UgZGVzaWduICh1c2luZyBwb2ludGVycykKLy8KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKLy8gbmVjZXNzYXJ5IGhlYWRlciBmaWxlcwojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPiAvLyBmb3IgZXhpdCgpCgovLyBkZWZpbmUgY29uc3RhbnRzCiNkZWZpbmUgU0laRSA1CiNkZWZpbmUgU1REX0hPVVJTIDQwLjAKI2RlZmluZSBPVF9SQVRFIDEuNQojZGVmaW5lIE1BX1RBWF9SQVRFIDAuMDUKI2RlZmluZSBOSF9UQVhfUkFURSAwLjAKI2RlZmluZSBWVF9UQVhfUkFURSAwLjA2CiNkZWZpbmUgQ0FfVEFYX1JBVEUgMC4wNwojZGVmaW5lIERFRkFVTFRfVEFYX1JBVEUgMC4wOAojZGVmaW5lIE5BTUVfU0laRSAyMAojZGVmaW5lIFRBWF9TVEFURV9TSVpFIDMKI2RlZmluZSBGRURfVEFYX1JBVEUgMC4yNQojZGVmaW5lIEZJUlNUX05BTUVfU0laRSAxMAojZGVmaW5lIExBU1RfTkFNRV9TSVpFIDEwCgovLyBEZWZpbmUgYSBzdHJ1Y3R1cmUgdHlwZSB0byBzdG9yZSBhbiBlbXBsb3llZSBuYW1lCnN0cnVjdCBuYW1lCnsKICAgIGNoYXIgZmlyc3ROYW1lW0ZJUlNUX05BTUVfU0laRV07CiAgICBjaGFyIGxhc3ROYW1lIFtMQVNUX05BTUVfU0laRV07Cn07CgovLyBEZWZpbmUgYSBzdHJ1Y3R1cmUgdHlwZSB0byBwYXNzIGVtcGxveWVlIGRhdGEgYmV0d2VlbiBmdW5jdGlvbnMKc3RydWN0IGVtcGxveWVlCnsKICAgIHN0cnVjdCBuYW1lIGVtcE5hbWU7CiAgICBjaGFyIHRheFN0YXRlIFtUQVhfU1RBVEVfU0laRV07CiAgICBsb25nIGludCBjbG9ja051bWJlcjsKICAgIGZsb2F0IHdhZ2VSYXRlOwogICAgZmxvYXQgaG91cnM7CiAgICBmbG9hdCBvdmVydGltZUhyczsKICAgIGZsb2F0IGdyb3NzUGF5OwogICAgZmxvYXQgc3RhdGVUYXg7CiAgICBmbG9hdCBmZWRUYXg7CiAgICBmbG9hdCBuZXRQYXk7Cn07CgovLyBGdW5jdGlvbiBwcm90b3R5cGVzCnZvaWQgaW5wdXREYXRhKHN0cnVjdCBlbXBsb3llZSAqZW1wUHRyKTsKdm9pZCBjYWxjdWxhdGVQYXkoc3RydWN0IGVtcGxveWVlICplbXBQdHIpOwp2b2lkIGNhbGN1bGF0ZVRheGVzKHN0cnVjdCBlbXBsb3llZSAqZW1wUHRyKTsKdm9pZCBvdXRwdXREYXRhKGNvbnN0IHN0cnVjdCBlbXBsb3llZSAqZW1wUHRyKTsKdm9pZCBjYWxjdWxhdGVTdGF0cyhjb25zdCBzdHJ1Y3QgZW1wbG95ZWUgKmVtcHMsIGZsb2F0ICp0b3RhbEdyb3NzUGF5UHRyLCBmbG9hdCAqYXZnR3Jvc3NQYXlQdHIsCiAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm1pbkdyb3NzUGF5UHRyLCBmbG9hdCAqbWF4R3Jvc3NQYXlQdHIpOwp2b2lkIG91dHB1dFN0YXRzKGZsb2F0IHRvdGFsR3Jvc3NQYXksIGZsb2F0IGF2Z0dyb3NzUGF5LCBmbG9hdCBtaW5Hcm9zc1BheSwgZmxvYXQgbWF4R3Jvc3NQYXkpOwoKaW50IG1haW4oKQp7CiAgICBzdHJ1Y3QgZW1wbG95ZWUgZW1wbG95ZWVzW1NJWkVdOwogICAgZmxvYXQgdG90YWxHcm9zc1BheSA9IDAuMCwgYXZnR3Jvc3NQYXkgPSAwLjAsIG1pbkdyb3NzUGF5ID0gMC4wLCBtYXhHcm9zc1BheSA9IDAuMDsKICAgIGludCBpOwoKICAgIC8vIExvb3AgdG8gaW5wdXQgZGF0YSBmb3IgZWFjaCBlbXBsb3llZQogICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykKICAgIHsKICAgICAgICBwcmludGYoIi0tLSBFbnRlciBkYXRhIGZvciBFbXBsb3llZSAlZCAtLS1cbiIsIGkgKyAxKTsKICAgICAgICBpbnB1dERhdGEoJmVtcGxveWVlc1tpXSk7CiAgICAgICAgY2FsY3VsYXRlUGF5KCZlbXBsb3llZXNbaV0pOwogICAgICAgIGNhbGN1bGF0ZVRheGVzKCZlbXBsb3llZXNbaV0pOwogICAgfQoKICAgIC8vIE91dHB1dCBoZWFkZXIKICAgIHByaW50ZigiXG5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICBwcmludGYoInwgTmFtZSAgICAgICAgICAgICAgICAgfCBDbG9jayAjICAgfCBXYWdlIHwgSG91cnMgfCBPVCBIcnMgfCBHcm9zcyBQYXkgfCBTdGF0ZSBUYXggfCBGZWQgVGF4ICAgfCBOZXQgUGF5ICAgfFxuIik7CiAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CgogICAgLy8gTG9vcCB0byBvdXRwdXQgZGF0YSBmb3IgZWFjaCBlbXBsb3llZQogICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykKICAgIHsKICAgICAgICBvdXRwdXREYXRhKCZlbXBsb3llZXNbaV0pOwogICAgfQogICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwoKICAgIC8vIENhbGN1bGF0ZSBhbmQgb3V0cHV0IHN0YXRpc3RpY3MKICAgIGNhbGN1bGF0ZVN0YXRzKGVtcGxveWVlcywgJnRvdGFsR3Jvc3NQYXksICZhdmdHcm9zc1BheSwgJm1pbkdyb3NzUGF5LCAmbWF4R3Jvc3NQYXkpOwogICAgb3V0cHV0U3RhdHModG90YWxHcm9zc1BheSwgYXZnR3Jvc3NQYXksIG1pbkdyb3NzUGF5LCBtYXhHcm9zc1BheSk7CgogICAgcmV0dXJuIDA7Cn0KCi8vIEZ1bmN0aW9uIHRvIGlucHV0IGVtcGxveWVlIGRhdGEgdXNpbmcgcG9pbnRlcnMKdm9pZCBpbnB1dERhdGEoc3RydWN0IGVtcGxveWVlICplbXBQdHIpCnsKICAgIHByaW50ZigiRW50ZXIgZmlyc3QgbmFtZTogIik7CiAgICBzY2FuZigiJXMiLCBlbXBQdHItPmVtcE5hbWUuZmlyc3ROYW1lKTsKICAgIHByaW50ZigiRW50ZXIgbGFzdCBuYW1lOiAiKTsKICAgIHNjYW5mKCIlcyIsIGVtcFB0ci0+ZW1wTmFtZS5sYXN0TmFtZSk7CiAgICBwcmludGYoIkVudGVyIHRheCBzdGF0ZSAoTUEsIE5ILCBWVCwgQ0EsIG9yIE90aGVyKTogIik7CiAgICBzY2FuZigiJXMiLCBlbXBQdHItPnRheFN0YXRlKTsKICAgIHByaW50ZigiRW50ZXIgY2xvY2sgbnVtYmVyOiAiKTsKICAgIHNjYW5mKCIlbGQiLCAmZW1wUHRyLT5jbG9ja051bWJlcik7CiAgICBwcmludGYoIkVudGVyIHdhZ2UgcmF0ZTogIik7CiAgICBzY2FuZigiJWYiLCAmZW1wUHRyLT53YWdlUmF0ZSk7CiAgICBwcmludGYoIkVudGVyIGhvdXJzIHdvcmtlZDogIik7CiAgICBzY2FuZigiJWYiLCAmZW1wUHRyLT5ob3Vycyk7Cn0KCi8vIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBvdmVydGltZSBob3VycyBhbmQgZ3Jvc3MgcGF5IHVzaW5nIHBvaW50ZXJzCnZvaWQgY2FsY3VsYXRlUGF5KHN0cnVjdCBlbXBsb3llZSAqZW1wUHRyKQp7CiAgICBpZiAoZW1wUHRyLT5ob3VycyA+IFNURF9IT1VSUykKICAgIHsKICAgICAgICBlbXBQdHItPm92ZXJ0aW1lSHJzID0gZW1wUHRyLT5ob3VycyAtIFNURF9IT1VSUzsKICAgICAgICBlbXBQdHItPmdyb3NzUGF5ID0gKFNURF9IT1VSUyAqIGVtcFB0ci0+d2FnZVJhdGUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVtcFB0ci0+b3ZlcnRpbWVIcnMgKiBlbXBQdHItPndhZ2VSYXRlICogT1RfUkFURSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZW1wUHRyLT5vdmVydGltZUhycyA9IDAuMDsKICAgICAgICBlbXBQdHItPmdyb3NzUGF5ID0gZW1wUHRyLT5ob3VycyAqIGVtcFB0ci0+d2FnZVJhdGU7CiAgICB9Cn0KCi8vIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0YXhlcyB1c2luZyBwb2ludGVycyBhbmQgc3RyaW5nIGNvbXBhcmlzb24Kdm9pZCBjYWxjdWxhdGVUYXhlcyhzdHJ1Y3QgZW1wbG95ZWUgKmVtcFB0cikKewogICAgZmxvYXQgc3RhdGVUYXhSYXRlOwoKICAgIC8vIENvbnZlcnQgc3RhdGUgaW5wdXQgdG8gdXBwZXJjYXNlIGZvciBjb21wYXJpc29uCiAgICBlbXBQdHItPnRheFN0YXRlWzBdID0gdG91cHBlcihlbXBQdHItPnRheFN0YXRlWzBdKTsKICAgIGVtcFB0ci0+dGF4U3RhdGVbMV0gPSB0b3VwcGVyKGVtcFB0ci0+dGF4U3RhdGVbMV0pOwoKICAgIGlmIChzdHJjbXAoZW1wUHRyLT50YXhTdGF0ZSwgIk1BIikgPT0gMCkKICAgIHsKICAgICAgICBzdGF0ZVRheFJhdGUgPSBNQV9UQVhfUkFURTsKICAgIH0KICAgIGVsc2UgaWYgKHN0cmNtcChlbXBQdHItPnRheFN0YXRlLCAiTkgiKSA9PSAwKQogICAgewogICAgICAgIHN0YXRlVGF4UmF0ZSA9IE5IX1RBWF9SQVRFOwogICAgfQogICAgZWxzZSBpZiAoc3RyY21wKGVtcFB0ci0+dGF4U3RhdGUsICJWVCIpID09IDApCiAgICB7CiAgICAgICAgc3RhdGVUYXhSYXRlID0gVlRfVEFYX1JBVEU7CiAgICB9CiAgICBlbHNlIGlmIChzdHJjbXAoZW1wUHRyLT50YXhTdGF0ZSwgIkNBIikgPT0gMCkKICAgIHsKICAgICAgICBzdGF0ZVRheFJhdGUgPSBDQV9UQVhfUkFURTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzdGF0ZVRheFJhdGUgPSBERUZBVUxUX1RBWF9SQVRFOwogICAgfQoKICAgIGVtcFB0ci0+c3RhdGVUYXggPSBlbXBQdHItPmdyb3NzUGF5ICogc3RhdGVUYXhSYXRlOwogICAgZW1wUHRyLT5mZWRUYXggPSBlbXBQdHItPmdyb3NzUGF5ICogRkVEX1RBWF9SQVRFOwogICAgZW1wUHRyLT5uZXRQYXkgPSBlbXBQdHItPmdyb3NzUGF5IC0gZW1wUHRyLT5zdGF0ZVRheCAtIGVtcFB0ci0+ZmVkVGF4Owp9CgovLyBGdW5jdGlvbiB0byBvdXRwdXQgZW1wbG95ZWUgZGF0YSB1c2luZyBwb2ludGVycwp2b2lkIG91dHB1dERhdGEoY29uc3Qgc3RydWN0IGVtcGxveWVlICplbXBQdHIpCnsKICAgIGNoYXIgZnVsbE5hbWVbTkFNRV9TSVpFXTsKICAgIHNwcmludGYoZnVsbE5hbWUsICIlcyAlcyIsIGVtcFB0ci0+ZW1wTmFtZS5maXJzdE5hbWUsIGVtcFB0ci0+ZW1wTmFtZS5sYXN0TmFtZSk7CgogICAgcHJpbnRmKCJ8ICUtMjBzIHwgJS05bGQgfCAlLTQuMmYgfCAlLTUuMmYgfCAlLTYuMmYgfCAlLTkuMmYgfCAlLTkuMmYgfCAlLTkuMmYgfCAlLTkuMmYgfFxuIiwKICAgICAgICAgICBmdWxsTmFtZSwKICAgICAgICAgICBlbXBQdHItPmNsb2NrTnVtYmVyLAogICAgICAgICAgIGVtcFB0ci0+d2FnZVJhdGUsCiAgICAgICAgICAgZW1wUHRyLT5ob3VycywKICAgICAgICAgICBlbXBQdHItPm92ZXJ0aW1lSHJzLAogICAgICAgICAgIGVtcFB0ci0+Z3Jvc3NQYXksCiAgICAgICAgICAgZW1wUHRyLT5zdGF0ZVRheCwKICAgICAgICAgICBlbXBQdHItPmZlZFRheCwKICAgICAgICAgICBlbXBQdHItPm5ldFBheSk7Cn0KCi8vIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0b3RhbCwgYXZlcmFnZSwgbWluLCBhbmQgbWF4IGdyb3NzIHBheSB1c2luZyBwb2ludGVycwp2b2lkIGNhbGN1bGF0ZVN0YXRzKGNvbnN0IHN0cnVjdCBlbXBsb3llZSAqZW1wcywgZmxvYXQgKnRvdGFsR3Jvc3NQYXlQdHIsIGZsb2F0ICphdmdHcm9zc1BheVB0ciwKICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbWluR3Jvc3NQYXlQdHIsIGZsb2F0ICptYXhHcm9zc1BheVB0cikKewogICAgaW50IGk7CiAgICAqdG90YWxHcm9zc1BheVB0ciA9IDAuMDsKICAgICptaW5Hcm9zc1BheVB0ciA9IGVtcHNbMF0uZ3Jvc3NQYXk7IC8vIEluaXRpYWxpemUgbWluL21heCB3aXRoIHRoZSBmaXJzdCBlbXBsb3llZSdzIGRhdGEKICAgICptYXhHcm9zc1BheVB0ciA9IGVtcHNbMF0uZ3Jvc3NQYXk7CgogICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykKICAgIHsKICAgICAgICAqdG90YWxHcm9zc1BheVB0ciArPSBlbXBzW2ldLmdyb3NzUGF5OwoKICAgICAgICBpZiAoZW1wc1tpXS5ncm9zc1BheSA8ICptaW5Hcm9zc1BheVB0cikKICAgICAgICB7CiAgICAgICAgICAgICptaW5Hcm9zc1BheVB0ciA9IGVtcHNbaV0uZ3Jvc3NQYXk7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW1wc1tpXS5ncm9zc1BheSA+ICptYXhHcm9zc1BheVB0cikKICAgICAgICB7CiAgICAgICAgICAgICptYXhHcm9zc1BheVB0ciA9IGVtcHNbaV0uZ3Jvc3NQYXk7CiAgICAgICAgfQogICAgfQoKICAgICphdmdHcm9zc1BheVB0ciA9ICp0b3RhbEdyb3NzUGF5UHRyIC8gU0laRTsKfQoKLy8gRnVuY3Rpb24gdG8gb3V0cHV0IHN0YXRpc3RpY3MKdm9pZCBvdXRwdXRTdGF0cyhmbG9hdCB0b3RhbEdyb3NzUGF5LCBmbG9hdCBhdmdHcm9zc1BheSwgZmxvYXQgbWluR3Jvc3NQYXksIGZsb2F0IG1heEdyb3NzUGF5KQp7CiAgICBwcmludGYoIlxuUGF5cm9sbCBTdGF0aXN0aWNzOlxuIik7CiAgICBwcmludGYoIlRvdGFsIEdyb3NzIFBheTogJCUuMmZcbiIsIHRvdGFsR3Jvc3NQYXkpOwogICAgcHJpbnRmKCJBdmVyYWdlIEdyb3NzIFBheTogJCUuMmZcbiIsIGF2Z0dyb3NzUGF5KTsKICAgIHByaW50ZigiTWluaW11bSBHcm9zcyBQYXk6ICQlLjJmXG4iLCBtaW5Hcm9zc1BheSk7CiAgICBwcmludGYoIk1heGltdW0gR3Jvc3MgUGF5OiAkJS4yZlxuIiwgbWF4R3Jvc3NQYXkpOwp9Cg==