<?php
/*********************************************************************************
 *
 * TimeTrex is a Workforce Management program developed by
 * TimeTrex Software Inc. Copyright (C) 2003 - 2021 TimeTrex Software Inc.
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by
 * the Free Software Foundation with the addition of the following permission
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
 * WORK IN WHICH THE COPYRIGHT IS OWNED BY TIMETREX, TIMETREX DISCLAIMS THE
 * WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
 * details.
 *
 *
 * You should have received a copy of the GNU Affero General Public License along
 * with this program; if not, see http://www.gnu.org/licenses or write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA.
 *
 *
 * You can contact TimeTrex headquarters at Unit 22 - 2475 Dobbin Rd. Suite
 * #292 West Kelowna, BC V4T 2E9, Canada or at email address info@timetrex.com.
 *
 *
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 *
 *
 * In accordance with Section 7(b) of the GNU Affero General Public License
 * version 3, these Appropriate Legal Notices must retain the display of the
 * "Powered by TimeTrex" logo. If the display of the logo is not reasonably
 * feasible for technical reasons, the Appropriate Legal Notices must display
 * the words "Powered by TimeTrex".
 *
 ********************************************************************************/


include_once( 'US.class.php' );

/*
Concise list to all the states W2 eFile Format Specifications:
	https://www.realtaxtools.com/state-w2-efile-frequently-asked-questions/
*/

/**
 * @package GovernmentForms
 */
class GovernmentForms_US_W2C extends GovernmentForms_US {
	public $xml_schema = '1040/IndividualIncomeTax/Common/IRSW2/IRSW2C.xsd';
	public $pdf_template = 'w2c.pdf';

	public $page_margins = [ 0, 5 ];    //**NOTE: When printing be sure turn *off* "Fit to Page" or any scaling: x, y - 43pt = 15mm Absolute margins that affect all drawing and templates.

	private $w2_obj = null; //Prevent __set() from sticking this into the data property.

	function getW2Object() {
		if ( !isset( $this->w2_obj ) ) {
			$gf = new GovernmentForms();
			$this->w2_obj = $gf->getFormObject( 'w2', 'US' );
		}

		return $this->w2_obj;
	}

	function getOptions( $name ) {
		$retval = null;
		switch ( $name ) {
			case 'type':
				$retval = [
						'government' => TTi18n::gettext( 'Government' ),
						'employee'   => TTi18n::gettext( 'Employee' ),
				];
				break;
		}

		return $retval;
	}

	//Set the type of form to display/print. Typically this would be:
	// government or employee.
	function getType() {
		if ( isset( $this->type ) ) {
			return $this->type;
		}

		return false;
	}

	function setType( $value ) {
		$this->type = trim( $value );

		return true;
	}

	function getShowInstructionPage() {
		if ( isset( $this->show_instruction_page ) ) {
			return $this->show_instruction_page;
		}

		return false;
	}

	function setShowInstructionPage( $value ) {
		$this->show_instruction_page = (bool)trim( $value );

		return true;
	}

	public function getTemplateSchema( $name = null ) {
		$template_schema = [
				[
				  'value'              => $this->year,
				  'on_background'      => true,
				  'coordinates'        => [
						  'x'          => 325,
						  'y'          => 130,
						  'h'          => 6,
						  'w'          => 19,
						  'halign'     => 'C',
						  'fill_color' => [ 255, 255, 255 ],
				  ],
				  'font'               => [
						  'size' => 7,
						  'type' => '',
				  ],
				],

				//Finish initializing page 1.
				'previous_ssn'             => [
						'function'    => [ 'draw' => [ 'formatSSN', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 303,
								'y'      => 185,
								'h'      => 15,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'ssn'             => [
						'function'    => [ 'draw' => [ 'formatSSN', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 435,
								'y'      => 125,
								'h'      => 15,
								'w'      => 125,
								'halign' => 'C',
						],
				],
				'ein'             => [
						'function'    => [ 'prefilter' => [ 'stripNonNumeric', 'isNumeric' ], 'draw' => [ 'formatEIN', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 38,
								'y'      => 208,
								'h'      => 15,
								'w'      => 240,
								'halign' => 'L',
						],
				],

				'trade_name'      => [
						'coordinates' => [
								'x'      => 38,  //Make sure there is enough spacing to fit in double windowed envelope with buffer.
								'y'      => 120, //Make sure there is enough spacing to fit in double windowed envelope with buffer.
								'h'      => 15,
								'w'      => 260,
								'halign' => 'L',
						],
				],
				'company_address' => [
						'function'    => [ 'draw' => [ 'filterCompanyAddress', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 38,
								'y'      => 140,
								'h'      => 48,
								'w'      => 260,
								'halign' => 'L',
						],
						'font'        => [
								'size' => 8,
								'type' => '',
						],
						'multicell'   => true,
				],



				'previous_name'  => [
						'function'    => [ 'draw' => [ 'filterPreviousName', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 303,
								'y'      => 209,
								'h'      => 15,
								'w'      => 100,
								'halign' => 'L',
						],
				],

				'first_name'  => [
						'coordinates' => [
								'x'      => 303,
								'y'      => 231,
								'h'      => 15,
								'w'      => 100,
								'halign' => 'L',
						],
				],
				'middle_name' => [
						'function'    => [ 'draw' => [ 'filterMiddleName', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 418,
								'y'      => 231,
								'h'      => 15,
								'w'      => 15,
								'halign' => 'L',
						],
				],
				'last_name'   => [
						'coordinates' => [
								'x'      => 435,
								'y'      => 231,
								'h'      => 15,
								'w'      => 100,
								'halign' => 'L',
						],
				],

				'le'          => [
						'function'    => [ 'draw' => [ 'filterLe', 'drawCheckBox' ] ],
						'coordinates' => [
								[
										'x'      => 545.5,
										'y'      => 151.5,
										'h'      => 11,
										'w'      => 10,
										'halign' => 'C',
								]
						],
				],

				'address'     => [
						'function'    => [ 'draw' => [ 'filterAddress', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 303,  //Make sure there is enough spacing to fit in double windowed envelope with buffer.
								'y'      => 248, //Make sure there is enough spacing to fit in double windowed envelope with buffer.
								'h'      => 32,
								'w'      => 250,
								'halign' => 'L',
						],
						'font'        => [
								'size' => 8,
								'type' => '',
						],
						'multicell'   => true,
				],


				'previous_l1'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 38,
								'y'      => 315,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],
				'l1'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 171,
								'y'      => 315,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],

				'previous_l2'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 305,
								'y'      => 315,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],
				'l2'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 438,
								'y'      => 315,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],

				'previous_l3'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 38,
								'y'      => 340,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],
				'l3'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 171,
								'y'      => 340,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],

				'previous_l4'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 305,
								'y'      => 340,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],
				'l4'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 438,
								'y'      => 340,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],

				'previous_l5'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 38,
								'y'      => 362,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],
				'l5'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 171,
								'y'      => 362,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],

				'previous_l6'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 305,
								'y'      => 362,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],
				'l6'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 438,
								'y'      => 362,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],

				'previous_l7'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 38,
								'y'      => 385,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],
				'l7'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 171,
								'y'      => 385,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],

				'previous_l8'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 305,
								'y'      => 385,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],
				'l8'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 438,
								'y'      => 385,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],

				'previous_l10'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 305,
								'y'      => 407,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],
				'l10'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 438,
								'y'      => 407,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],

				'previous_l11'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 38,
								'y'      => 433,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],
				'l11'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 171,
								'y'      => 433,
								'h'      => 10,
								'w'      => 115,
								'halign' => 'L',
						],
				],

				'previous_l12a_code'          => [
						'function'    => [ 'draw' => [ 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 310,
								'y'      => 433,
								'h'      => 10,
								'w'      => 25,
								'halign' => 'C',
						],
				],
				'previous_l12a'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 337,
								'y'      => 433,
								'h'      => 10,
								'w'      => 95,
								'halign' => 'L',
						],
				],

				'l12a_code'          => [
						'function'    => [ 'draw' => [ 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 443,
								'y'      => 433,
								'h'      => 10,
								'w'      => 25,
								'halign' => 'C',
						],
				],
				'l12a'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 470,
								'y'      => 433,
								'h'      => 10,
								'w'      => 88,
								'halign' => 'L',
						],
				],

				'previous_l12b_code'          => [
						'function'    => [ 'draw' => [ 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 310,
								'y'      => 457,
								'h'      => 10,
								'w'      => 25,
								'halign' => 'C',
						],
				],
				'previous_l12b'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 337,
								'y'      => 457,
								'h'      => 10,
								'w'      => 95,
								'halign' => 'L',
						],
				],

				'l12b_code'          => [
						'function'    => [ 'draw' => [ 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 443,
								'y'      => 457,
								'h'      => 10,
								'w'      => 25,
								'halign' => 'C',
						],
				],
				'l12b'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 470,
								'y'      => 457,
								'h'      => 10,
								'w'      => 88,
								'halign' => 'L',
						],
				],

				'previous_l12c_code'          => [
						'function'    => [ 'draw' => [ 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 310,
								'y'      => 480,
								'h'      => 10,
								'w'      => 25,
								'halign' => 'C',
						],
				],
				'previous_l12c'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 337,
								'y'      => 480,
								'h'      => 10,
								'w'      => 95,
								'halign' => 'L',
						],
				],

				'l12c_code'          => [
						'function'    => [ 'draw' => [ 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 443,
								'y'      => 480,
								'h'      => 10,
								'w'      => 25,
								'halign' => 'C',
						],
				],
				'l12c'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 470,
								'y'      => 480,
								'h'      => 10,
								'w'      => 88,
								'halign' => 'L',
						],
				],

				'previous_l12d_code'          => [
						'function'    => [ 'draw' => [ 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 310,
								'y'      => 515,
								'h'      => 10,
								'w'      => 25,
								'halign' => 'C',
						],
				],
				'previous_l12d'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 337,
								'y'      => 515,
								'h'      => 10,
								'w'      => 95,
								'halign' => 'L',
						],
				],

				'l12d_code'          => [
						'function'    => [ 'draw' => [ 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 443,
								'y'      => 515,
								'h'      => 10,
								'w'      => 25,
								'halign' => 'C',
						],
				],
				'l12d'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 470,
								'y'      => 515,
								'h'      => 10,
								'w'      => 88,
								'halign' => 'L',
						],
				],

				'previous_l13a'          => [
						'function'    => [ 'draw' => [ 'drawCheckBox' ] ],
						'coordinates' => [
								[
									'x'      => 49,
									'y'      => 456,
									'h'      => 11,
									'w'      => 10,
									'halign' => 'C',
								]
						],
				],
				'l13a'          => [
						'function'    => [ 'draw' => [ 'drawCheckBox' ] ],
						'coordinates' => [
								[
									'x'      => 182,
									'y'      => 456,
									'h'      => 11,
									'w'      => 10,
									'halign' => 'C',
								]
						],
				],

				'previous_l13b'          => [
						'function'    => [ 'draw' => [ 'drawCheckBox' ] ],
						'coordinates' => [
								[
										'x'      => 84,
										'y'      => 456,
										'h'      => 11,
										'w'      => 10,
										'halign' => 'C',
								]
						],
				],
				'l13b'          => [
						'function'    => [ 'draw' => [ 'drawCheckBox' ] ],
						'coordinates' => [
								[
										'x'      => 217,
										'y'      => 456,
										'h'      => 11,
										'w'      => 10,
										'halign' => 'C',
								]
						],
				],

				'previous_l13c'          => [
						'function'    => [ 'draw' => [ 'drawCheckBox' ] ],
						'coordinates' => [
								[
										'x'      => 125,
										'y'      => 456,
										'h'      => 11,
										'w'      => 10,
										'halign' => 'C',
								]
						],
				],
				'l13c'          => [
						'function'    => [ 'draw' => [ 'drawCheckBox' ] ],
						'coordinates' => [
								[
										'x'      => 258,
										'y'      => 456,
										'h'      => 11,
										'w'      => 10,
										'halign' => 'C',
								]
						],
				],


				'previous_l14a_name'          => [
						'coordinates' => [
								'x'      => 38,
								'y'      => 478,
								'h'      => 12,
								'w'      => 92,
								'halign' => 'L',
						],
				],
				'previous_l14a'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 130,
								'y'      => 478,
								'h'      => 12,
								'w'      => 35,
								'halign' => 'R',
						],
				],
				'l14a_name'          => [
						'coordinates' => [
								'x'      => 170,
								'y'      => 478,
								'h'      => 12,
								'w'      => 92,
								'halign' => 'L',
						],
				],
				'l14a'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 262,
								'y'      => 478,
								'h'      => 12,
								'w'      => 35,
								'halign' => 'R',
						],
				],

				'previous_l14b_name'          => [
						'coordinates' => [
								'x'      => 38,
								'y'      => 490,
								'h'      => 12,
								'w'      => 92,
								'halign' => 'L',
						],
				],
				'previous_l14b'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 130,
								'y'      => 490,
								'h'      => 12,
								'w'      => 35,
								'halign' => 'R',
						],
				],
				'l14b_name'          => [
						'coordinates' => [
								'x'      => 170,
								'y'      => 490,
								'h'      => 12,
								'w'      => 92,
								'halign' => 'L',
						],
				],
				'l14b'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 262,
								'y'      => 490,
								'h'      => 12,
								'w'      => 35,
								'halign' => 'R',
						],
				],

				'previous_l14c_name'          => [
						'coordinates' => [
								'x'      => 38,
								'y'      => 502,
								'h'      => 12,
								'w'      => 92,
								'halign' => 'L',
						],
				],
				'previous_l14c'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 130,
								'y'      => 502,
								'h'      => 12,
								'w'      => 35,
								'halign' => 'R',
						],
				],
				'l14c_name'          => [
						'coordinates' => [
								'x'      => 170,
								'y'      => 502,
								'h'      => 12,
								'w'      => 92,
								'halign' => 'L',
						],
				],
				'l14c'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 262,
								'y'      => 502,
								'h'      => 12,
								'w'      => 35,
								'halign' => 'R',
						],
				],

				'previous_l14d_name'          => [
						'coordinates' => [
								'x'      => 38,
								'y'      => 514,
								'h'      => 12,
								'w'      => 92,
								'halign' => 'L',
						],
				],
				'previous_l14d'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 130,
								'y'      => 514,
								'h'      => 12,
								'w'      => 35,
								'halign' => 'R',
						],
				],
				'l14d_name'          => [
						'coordinates' => [
								'x'      => 170,
								'y'      => 514,
								'h'      => 12,
								'w'      => 92,
								'halign' => 'L',
						],
				],
				'l14d'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 262,
								'y'      => 514,
								'h'      => 12,
								'w'      => 35,
								'halign' => 'R',
						],
				],

				//State (Line 1)
				'previous_l15a_state'    => [
						'coordinates' => [
								'x'      => 38,
								'y'      => 560,
								'h'      => 12,
								'w'      => 27,
								'halign' => 'L',
						],
				],
				'l15a_state'    => [
						'coordinates' => [
								'x'      => 170,
								'y'      => 560,
								'h'      => 12,
								'w'      => 27,
								'halign' => 'L',
						],
				],
				'previous_l15a_state_id' => [
						'coordinates' => [
								'x'      => 38,
								'y'      => 583,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'l15a_state_id' => [
						'coordinates' => [
								'x'      => 170,
								'y'      => 583,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'previous_l16a'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 38,
								'y'      => 605,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'l16a'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 170,
								'y'      => 605,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],

				'previous_l17a'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 38,
								'y'      => 630,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'l17a'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 170,
								'y'      => 630,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'previous_l18a'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 38,
								'y'      => 675,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'l18a'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 170,
								'y'      => 675,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'previous_l19a'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 38,
								'y'      => 700,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'l19a'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 170,
								'y'      => 700,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'previous_l20a_district' => [
						'coordinates' => [
								'x'      => 38,
								'y'      => 723,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'l20a_district' => [
						'coordinates' => [
								'x'      => 170,
								'y'      => 723,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],



				//State (Line 2)
				'previous_l15b_state'    => [
						'coordinates' => [
								'x'      => 305,
								'y'      => 560,
								'h'      => 12,
								'w'      => 27,
								'halign' => 'L',
						],
				],
				'l15b_state'    => [
						'coordinates' => [
								'x'      => 438,
								'y'      => 560,
								'h'      => 12,
								'w'      => 27,
								'halign' => 'L',
						],
				],
				'previous_l15b_state_id' => [
						'coordinates' => [
								'x'      => 305,
								'y'      => 583,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'l15b_state_id' => [
						'coordinates' => [
								'x'      => 438,
								'y'      => 583,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'previous_l16b'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 305,
								'y'      => 605,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'l16b'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 438,
								'y'      => 605,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],

				'previous_l17b'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 305,
								'y'      => 630,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'l17b'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 438,
								'y'      => 630,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'previous_l18b'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 305,
								'y'      => 675,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'l18b'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 438,
								'y'      => 675,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'previous_l19b'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 305,
								'y'      => 700,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'l19b'          => [
						'function'    => [ 'draw' => [ 'MoneyFormat', 'drawNormal' ] ],
						'coordinates' => [
								'x'      => 438,
								'y'      => 700,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'previous_l20b_district' => [
						'coordinates' => [
								'x'      => 305,
								'y'      => 723,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
				'l20b_district' => [
						'coordinates' => [
								'x'      => 438,
								'y'      => 723,
								'h'      => 12,
								'w'      => 125,
								'halign' => 'L',
						],
				],
		];

		if ( isset( $template_schema[$name] ) ) {
			return $name;
		} else {
			return $template_schema;
		}
	}

	function filterLe( $value ) {
		//Corrected SSN and/or name (check this box)
		if ( $this->previous_ssn != '' || $this->previous_first_name != '' || $this->previous_middle_name != '' || $this->previous_last_name != '' ) {
			Debug::Text( 'Name or SSN changed!', __FILE__, __LINE__, __METHOD__, 10 );
			return true;
		}

		return false;
	}

	function filterMiddleName( $value ) {
		//Return just initial
		$value = substr( $value, 0, 1 );

		return $value;
	}

	function filterCompanyAddress( $value ) {
		//Debug::Text('Filtering company address: '. $value, __FILE__, __LINE__, __METHOD__, 10);

		//Combine company address for multicell display.
		$retarr[] = $this->company_address1;
		if ( $this->company_address2 != '' ) {
			$retarr[] = $this->company_address2;
		}
		$retarr[] = $this->company_city . ', ' . $this->company_state . ' ' . $this->company_zip_code;

		return implode( "\n", $retarr );
	}

	function filterPreviousName( $value ) {
		$retval = $this->previous_first_name .' '. $this->previous_middle_name .' '. $this->previous_last_name;

		return $retval;
	}

	function filterAddress( $value ) {
		//Combine company address for multicell display.
		$retarr[] = $this->address1;
		if ( $this->address2 != '' ) {
			$retarr[] = $this->address2;
		}
		$retarr[] = $this->city . ', ' . $this->state . ' ' . $this->zip_code;

		return implode( "\n", $retarr );
	}

	function _getStateName( $state ) {
		return $this->getW2Object()->_getStateName( $state );
	}

	function _getStateNumericCode( $state ) {
		return $this->getW2Object()->_getStateNumericCode( $state );
	}

	function _getL12AmountByCode( $code ) {
		Debug::Text( 'Checking for Code:' . $code, __FILE__, __LINE__, __METHOD__, 10 );
		foreach ( range( 'a', 'z' ) as $z ) {
			if ( isset( $this->{'l12' . $z . '_code'} ) && $this->{'l12' . $z . '_code'} == $code ) {
				Debug::Text( 'Found amount for Code:' . $code, __FILE__, __LINE__, __METHOD__, 10 );

				return $this->{'l12' . $z};
			}
		}

		//Debug::Text( 'No amount found, Code:' . $code, __FILE__, __LINE__, __METHOD__, 10 );

		return false;
	}

	function _compileRA() { //RA (Submitter) Record
		if ( in_array( strtoupper( $this->efile_state ), [ 'AL' ] ) ) { //Skip for eFiling in these states.
			return false;
		}

		$line[] = 'RA';                                                                                                                                                        //RA Record

		Debug::Text( 'RA Record State: ' . $this->efile_state, __FILE__, __LINE__, __METHOD__, 10 );
		switch ( strtolower( $this->efile_state ) ) {
			case 'ny': //New York
				$efile_user_id = null;
				$is_resub = null;

				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' );                                                                                     //EIN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $efile_user_id ), 8, 'AN' );                                                                           //User ID
				$line[] = $this->padRecord( '', 4, 'AN' );                                                                                                                      //Software Vendor code
				$line[] = $this->padRecord( '', 5, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( $is_resub, 1, 'AN' );                                                                                                               //Resub
				$line[] = $this->padRecord( '', 6, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( '', 2, 'AN' );                                                                                                                      //Software Code
				$line[] = $this->padRecord( '', 57, 'AN' );                                                                                                                     //Company Name
				$line[] = $this->padRecord( '', 22, 'AN' );                                                                                                                     //Company Location Address
				$line[] = $this->padRecord( '', 22, 'AN' );                                                                                                                     //Company Delivery Address
				$line[] = $this->padRecord( '', 22, 'AN' );                                                                                                                     //Company City
				$line[] = $this->padRecord( '', 2, 'AN' );                                                                                                                      //Company State
				$line[] = $this->padRecord( '', 5, 'AN' );                                                                                                                      //Company Zip Code
				$line[] = $this->padRecord( '', 4, 'AN' );                                                                                                                      //Company Zip Code Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                                                                                     //Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                                                                                     //Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                                                                                      //Company Country, fill with blanks if its the US
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->trade_name ), 57, 'AN' );                                                                       //Submitter organization.
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( ( $this->company_address2 != '' ) ? $this->company_address2 : $this->company_address1 ), 22, 'AN' );   //Submitter Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address1 ), 22, 'AN' );                                                                 //Submitter Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_city ), 22, 'AN' );                                                                     //Submitter City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_state ), 2, 'AN' );                                                                     //Submitter State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_zip_code ), 5, 'AN' );                                                                  //Submitter Zip Code
				$line[] = $this->padRecord( '', 4, 'AN' );                                                                                                                      //Submitter Zip Code Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                                                                                     //Submitter Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                                                                                     //Submitter Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                                                                                      //Submitter Country, fill with blanks if its the US
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->contact_name ), 27, 'AN' );                                                                     //Contact Name
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_phone ), 15, 'AN' );                                                                         //Contact Phone
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_phone_ext ), 5, 'AN' );                                                                      //Contact Phone Ext
				$line[] = $this->padRecord( '', 3, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( $this->contact_email, 40, 'AN' );                                                                                                   //Contact Email
				$line[] = $this->padRecord( '', 3, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_fax ), 10, 'AN' );                                                                           //Contact Fax
				$line[] = $this->padRecord( '', 1, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( '', 1, 'AN' );                                                                                                                      //PreParers Code
				$line[] = $this->padRecord( '', 12, 'AN' );                                                                                                                     //Blank
				break;
			default:
				$is_resub = 0;

				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' );                                                                                     //EIN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->efile_user_id ), 8, 'AN' );                                                                     //User ID
				$line[] = $this->padRecord( '', 4, 'AN' );                                                                                                                      //Software Vendor code
				$line[] = $this->padRecord( '', 5, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( $is_resub, 1, 'AN' );                                                                                                               //Resub
				$line[] = $this->padRecord( '', 6, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( '98', 2, 'AN' );                                                                                                                    //Software Code
				$line[] = $this->padRecord( $this->trade_name, 57, 'AN' );                                                                                                      //Company Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address2 ), 22, 'AN' );                                                                 //Company Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address1 ), 22, 'AN' );                                                                 //Company Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_city ), 22, 'AN' );                                                                     //Company City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_state ), 2, 'AN' );                                                                     //Company State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_zip_code ), 5, 'AN' );                                                                  //Company Zip Code
				$line[] = $this->padRecord( '', 4, 'AN' );                                                                                                                      //Company Zip Code Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                                                                                     //Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                                                                                     //Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                                                                                      //Company Country, fill with blanks if its the US
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->trade_name ), 57, 'AN' );                                                                       //Submitter organization.
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( ( $this->company_address2 != '' ) ? $this->company_address2 : $this->company_address1 ), 22, 'AN' );   //Submitter Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address1 ), 22, 'AN' );                                                                 //Submitter Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_city ), 22, 'AN' );                                                                     //Submitter City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_state ), 2, 'AN' );                                                                     //Submitter State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_zip_code ), 5, 'AN' );                                                                  //Submitter Zip Code
				$line[] = $this->padRecord( '', 4, 'AN' );                                                                                                                      //Submitter Zip Code Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                                                                                     //Submitter Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                                                                                     //Submitter Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                                                                                      //Submitter Country, fill with blanks if its the US
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->contact_name ), 27, 'AN' );                                                                     //Contact Name
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_phone ), 15, 'AN' );                                                                         //Contact Phone
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_phone_ext ), 5, 'AN' );                                                                      //Contact Phone Ext
				$line[] = $this->padRecord( '', 3, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( $this->contact_email, 40, 'AN' );                                                                                                   //Contact Email
				$line[] = $this->padRecord( '', 3, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_fax ), 10, 'AN' );                                                                           //Contact Fax
				$line[] = $this->padRecord( '', 1, 'AN' );                                                                                                                      //Blank
				$line[] = $this->padRecord( 'L', 1, 'AN' );                                                                                                                     //PreParers Code
				$line[] = $this->padRecord( '', 12, 'AN' );                                                                                                                     //Blank
				break;
		}

		$retval = implode( ( $this->debug == true ) ? ',' : '', $line );

		if ( $this->debug == false && strlen( $retval ) != 512 ) {
			Debug::Text( 'ERROR! RA Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 );

			return false;
		}

		Debug::Text( 'RA Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 );

		return $retval;
	}

	function _compileRE() {  //RE (Employer) Record
		if ( in_array( strtoupper( $this->efile_state ), [ 'AL' ] ) ) { //Skip for eFiling in these states.
			return false;
		}

		switch ( strtolower( $this->efile_state ) ) {
			case 'ny': //New York
				$line[] = 'RE';                                                                                   //(1-2) RE Record
				$line[] = $this->padRecord( '', 4, 'AN' );                                                        //(3-6) Tax Year
				$line[] = $this->padRecord( '', 1, 'AN' );                                                        //(7) Agent Indicator
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' );                       //(8-16 ) EIN
				$line[] = $this->padRecord( '', 9, 'AN' );                                                        //(17-25) Agent for EIN
				$line[] = $this->padRecord( '', 1, 'AN' );                                                        //(26) Terminating Business
				$line[] = $this->padRecord( '', 4, 'AN' );                                                        //(27-30) Establishment Number
				$line[] = $this->padRecord( '', 9, 'AN' );                                                        //(31-39) Other EIN
				$line[] = $this->padRecord( $this->trade_name, 57, 'AN' );                                        //(40-96) Company Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address2 ), 22, 'AN' );   //(97-118) Company Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address1 ), 22, 'AN' );   //(119-140) Company Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_city ), 22, 'AN' );       //(141-162) Company City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_state ), 2, 'AN' );       //(163-164) Company State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_zip_code ), 5, 'AN' );    //(165-169) Company Zip Code
				$line[] = $this->padRecord( '', 4, 'AN' );                                                        //(170-173) Company Zip Code Extension
				$line[] = $this->padRecord( '42020', 5, 'AN' );                                                   //(174) Kind of Employer ???????
				//$line[] = $this->padRecord( '', 4, 'AN' );                                                      //(175-178) Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                       //(179-201) Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                       //(202-216) Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                        //(217-218) Country, fill with blanks if its the US
				$line[] = $this->padRecord( '', 1, 'AN' );                                                        //(219) Employment Code - 941 Form
				$line[] = $this->padRecord( '', 1, 'AN' );                                                        //(220) Tax Jurisdiction
				$line[] = $this->padRecord( '', 1, 'AN' );                                                        //(221) Third Party Sick Pay
				$line[] = $this->padRecord( '', 27, 'AN' );                                                       //(222-248) Contact Name
				$line[] = $this->padRecord( '', 15, 'AN' );                                                       //(249-263) Contact Phone
				$line[] = $this->padRecord( '', 5, 'AN' );                                                        //(264-268) Contact Phone Ext
				$line[] = $this->padRecord( '', 10, 'AN' );                                                       //(269-278) Contact Fax
				$line[] = $this->padRecord( '', 40, 'AN' );                                                       //(279-318) Contact Email
				$line[] = $this->padRecord( '', 194, 'AN' );                                                      //(319-512) Blank
				break;
			default:
				$line[] = 'RE';                                                                                 //(1-2) RE Record
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->year ), 4, 'N' );                    //(3-6) Tax Year
				$line[] = $this->padRecord( '', 1, 'AN' );                                                      //(7) Agent Indicator
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' );                     //(8-16 ) EIN
				$line[] = $this->padRecord( '', 9, 'AN' );                                                      //(17-25) Agent for EIN
				$line[] = $this->padRecord( '0', 1, 'N' );                                                      //(26) Terminating Business
				$line[] = $this->padRecord( '', 4, 'AN' );                                                      //(27-30) Establishment Number
				$line[] = $this->padRecord( '', 9, 'AN' );                                                      //(31-39) Other EIN
				$line[] = $this->padRecord( $this->trade_name, 57, 'AN' );                                      //(40-96) Company Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address2 ), 22, 'AN' ); //(97-118) Company Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address1 ), 22, 'AN' ); //(119-140) Company Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_city ), 22, 'AN' );     //(141-162) Company City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_state ), 2, 'AN' );     //(163-164) Company State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_zip_code ), 5, 'AN' );  //(165-169) Company Zip Code
				$line[] = $this->padRecord( '', 4, 'AN' );                                                      //(170-173) Company Zip Code Extension
				$line[] = $this->padRecord( strtoupper( $this->kind_of_employer ), 1, 'AN' );                   //(174) Kind of Employer
				$line[] = $this->padRecord( '', 4, 'AN' );                                                      //(175-178) Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                     //(179-201) Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                     //(202-216) Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                      //(217-218) Country, fill with blanks if its the US
				$line[] = $this->padRecord( 'R', 1, 'AN' );                                                     //(219) Employment Code - 941 Form
				$line[] = $this->padRecord( '', 1, 'AN' );                                                      //(220) Tax Jurisdiction
				$line[] = $this->padRecord( ( $this->l13c == '' ) ? 0 : 1, 1, 'N' );                            //(221) Third Party Sick Pay
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->contact_name ), 27, 'AN' );     //(222-248) Contact Name
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_phone ), 15, 'AN' );         //(249-263) Contact Phone
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_phone_ext ), 5, 'AN' );      //(264-268) Contact Phone Ext
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->contact_fax ), 10, 'AN' );           //(269-278) Contact Fax
				$line[] = $this->padRecord( $this->contact_email, 40, 'AN' );                                   //(279-318) Contact Email
				$line[] = $this->padRecord( '', 194, 'AN' );                                                    //(319-512) Blank
				break;
		}

		$retval = implode( ( $this->debug == true ) ? ',' : '', $line );

		if ( $this->debug == false && strlen( $retval ) != 512 ) {
			Debug::Text( 'ERROR! RE Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 );

			return false;
		}

		Debug::Text( 'RE Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 );

		return $retval;
	}

	function _compileRW() { //RW (Employee) Record
		if ( in_array( strtoupper( $this->efile_state ), [ 'NY', 'AL', 'CO', 'CT', 'DE', 'MA', 'PA', 'VA' ] ) ) { //Skip for eFiling in these states.
			return false;
		}

		switch ( strtolower( $this->efile_state ) ) {
			default:
				$line[] = 'RW';                                                                                    //RW Record
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' );                        //SSN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' );          //First Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' );         //Middle Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' );           //Last Name
				$line[] = $this->padRecord( '', 4, 'AN' );                                                         //Suffix
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' );            //Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' );            //Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' );                //City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' );                //State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' );             //Zip
				$line[] = $this->padRecord( '', 4, 'AN' );                                                         //Zip Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                         //Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                        //Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                        //Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                         //Country, fill with blanks if its the US
				$line[] = $this->padRecord( $this->removeDecimal( $this->l1 ), 11, 'N' );                          //(188-198) Wages, Tips and Other Compensation
				$line[] = $this->padRecord( $this->removeDecimal( $this->l2 ), 11, 'N' );                          //(199-209) Federal Income Tax
				$line[] = $this->padRecord( $this->removeDecimal( $this->l3 ), 11, 'N' );                          //(210-220) Social Security Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->l4 ), 11, 'N' );                          //(221-231) Social Security Tax
				$line[] = $this->padRecord( $this->removeDecimal( $this->l5 ), 11, 'N' );                          //(232-242) Medicare Wages and Tips
				$line[] = $this->padRecord( $this->removeDecimal( $this->l6 ), 11, 'N' );                          //(243-253) Medicare Tax
				$line[] = $this->padRecord( $this->removeDecimal( $this->l7 ), 11, 'N' );                          //(254-264) Social Security Tips
				$line[] = $this->padRecord( '', 11, 'AN' );                                                        //(265-275) Blank
				$line[] = $this->padRecord( $this->removeDecimal( $this->l10 ), 11, 'N' );                         //(276-286) Dependant Care Benefits
				$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'D' ) ), 11, 'N' );  //Deferred Compensation Contributions to 401K //Code D in any of the Box 12(a throug d).
				$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'E' ) ), 11, 'N' );  //Deferred Compensation Contributions to 403(b) //Code E in any of the Box 12(a throug d).
				$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'F' ) ), 11, 'N' );  //Deferred Compensation Contributions to 408(k)(6) //Code F in any of the Box 12(a throug d).
				$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'G' ) ), 11, 'N' );  //Deferred Compensation Contributions to 457(b) //Code G in any of the Box 12(a throug d).
				$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'H' ) ), 11, 'N' );  //(331-341) Deferred Compensation Contributions to 501(c)(18)(D) //Code H in any of the Box 12(a throug d).
				$line[] = $this->padRecord( '', 11, 'AN' );                                                        //(342-352) Blank
				$line[] = $this->padRecord( $this->removeDecimal( $this->l11 ), 11, 'N' );                         //(353-363) Non-qualified Plan Section 457
				$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'W' ) ), 11, 'N' );  //(364-374) Employer Contributions to Health Savings Account //Code W in any of the Box 12(a throug d).
				$line[] = $this->padRecord( '', 11, 'N' );                                                         //Non-qualified NOT Plan Section 457
				$line[] = $this->padRecord( '', 11, 'N' );                                                         //Non taxable combat pay
				$line[] = $this->padRecord( '', 11, 'AN' );                                                        //Blank
				$line[] = $this->padRecord( '', 11, 'N' );                                                         //Employer Cost of Premiums for Group Term Life Insurance over $50K
				$line[] = $this->padRecord( '', 11, 'N' );                                                         //Income from the Exercise of Nonstatutory Stock Options
				$line[] = $this->padRecord( '', 11, 'N' );                                                         //Deferrals Under a Section 409A non-qualified plan
				$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'AA' ) ), 11, 'N' ); //(441-451) Desiginated Roth Contributions under a section 401K //Code AA in any of the Box 12(a throug d).
				$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'BB' ) ), 11, 'N' ); //(452-462) Desiginated Roth Contributions under a section 403B //Code BB in any of the Box 12(a throug d).
				$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'DD' ) ), 11, 'N' ); //(463-473) Cost of Employer Sponsored Health Coverage //Code DD in any of the Box 12(a throug d).
				$line[] = $this->padRecord( '', 11, 'N' );                                                         //(474-484) Blank
				$line[] = $this->padRecord( '', 1, 'AN' );                                                         //(485) Blank
				$line[] = $this->padRecord( ( ( $this->l13a == '' ) ? 0 : 1 ), 1, 'N' );                           //(486) Statutory Employee
				$line[] = $this->padRecord( '', 1, 'AN' );                                                         //(487) Blank
				$line[] = $this->padRecord( ( ( $this->l13b == '' ) ? 0 : 1 ), 1, 'N' );                           //(488) Retirement Plan Indicator
				$line[] = $this->padRecord( ( ( $this->l13c == '' ) ? 0 : 1 ), 1, 'N' );                           //(489) 3rd Party Sick Pay Indicator
				$line[] = $this->padRecord( '', 23, 'AN' );                                                        //(490-512) Blank
				break;
		}

		$retval = implode( ( $this->debug == true ) ? ',' : '', $line );

		if ( $this->debug == false && strlen( $retval ) != 512 ) {
			Debug::Text( 'ERROR! RW Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 );

			return false;
		}

		Debug::Text( 'RW Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 );

		return $retval;
	}

	//ID is the state identifier like: a, b, c, d,...
	function _compileRS( $id ) { //RS (State) Record
		if ( $this->efile_state == '' ) { //Federal filing does not need any RS record at all.
			return false;
		}

		$l15_state = 'l15' . $id . '_state';
		$l15_state_id = 'l15' . $id . '_state_id';
		$l15_state_control_number = 'l15' . $id . '_state_control_number';

		$l16 = 'l16' . $id;
		$l17 = 'l17' . $id;
		$l18 = 'l18' . $id;
		$l19 = 'l19' . $id;
		$l20 = 'l20' . $id . '_district';

		if ( !isset( $this->$l15_state ) ) {
			return false;
		}

		if ( strtolower( $this->efile_state ) != strtolower( $this->$l15_state ) ) {
			Debug::Text( ' eFile Format for State: ' . $this->efile_state . ' Employee Record State: ' . $this->$l15_state, __FILE__, __LINE__, __METHOD__, 10 );

			return false;
		}

		Debug::Text( 'RS Record State: ' . $this->efile_state, __FILE__, __LINE__, __METHOD__, 10 );
		switch ( strtolower( $this->efile_state ) ) {
			case 'al': //Alabama
				//Withholding Number for State format is the State ID number.
				$line[] = 'RS';                                                                               //(1-2)[2]: RS Record
				$line[] = $this->padRecord( '', 2, 'AN' );                                                    //(3-4)[2]: State Code
				$line[] = $this->padRecord( '', 5, 'AN' );                                                    //(5-9)[5]: Tax Entity Code [Leave Blank]
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' );                   //(10-18)[9]: SSN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' );     //(19-33)[15]: First Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' );    //(34-48)[15]: Middle Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' );      //(49-68)[20]: Last Name
				$line[] = $this->padRecord( '', 4, 'AN' );                                                    //(69-72)[4]: Suffix
				$line[] = $this->padRecord( '', 22, 'AN' );                                                   //(73-94)[22]: Location Address
				$line[] = $this->padRecord( '', 22, 'AN' );                                                   //(95-116)[22]: Delivery Address
				$line[] = $this->padRecord( '', 22, 'AN' );                                                   //(117-138)[22]: City
				$line[] = $this->padRecord( '', 2, 'AN' );                                                    //(139-140)[2]: State
				$line[] = $this->padRecord( '', 5, 'AN' );                                                    //(141-145)[5]: Zip
				$line[] = $this->padRecord( '', 4, 'AN' );                                                    //(146-149)[4]: Zip Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                    //(150-154)[5]: Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                   //(155-177)[23]: Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                   //(178-192)[15]: Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                    //(193-194)[2]: Country, fill with blanks if its the US

				//Unemployment reporting
				$line[] = $this->padRecord( '', 2, 'AN' );                                                    //(195-196)[2]: Optional Code
				$line[] = $this->padRecord( '', 6, 'AN' );                                                    //(197-202)[6]: Reporting Period
				$line[] = $this->padRecord( '', 11, 'AN' );                                                   //(203-213)[11]: State Quarterly Unemployment Total
				$line[] = $this->padRecord( '', 11, 'AN' );                                                   //(214-224)[11]: State Quarterly Unemployment Insurance
				$line[] = $this->padRecord( '', 2, 'AN' );                                                    //(225-226)[2]: Number of weeks worked
				$line[] = $this->padRecord( '', 8, 'AN' );                                                    //(227-234)[8]: Date first employed
				$line[] = $this->padRecord( '', 8, 'AN' );                                                    //(235-242)[8]: Date of separation
				$line[] = $this->padRecord( '', 5, 'AN' );                                                    //(243-247)[5]: Blank
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 10, 'N' );        //(248-257)[10]: State Employer Account Number - For AL: Numbers below 700000 – right justify and zero fill. Numbers 700000 and above – R followed by nine digits.
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' );                   //(258-266)[9]: FEIN
				$line[] = $this->padRecord( '', 7, 'AN' );                                                    //(267-273)[7]: Blank

				//Income Tax Reporting
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );       //(274-275)[2]: State Code
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' );                   //(276-286)[11]: State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' );                   //(287-297)[11]: State income tax
				$line[] = $this->padRecord( $this->removeDecimal( $this->l2 ), 10, 'N' );                     //(298-307)[10]: AL: Federal Income Tax Withheld
				$line[] = $this->padRecord( '', 1, 'AN' );                                                    //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other]
				$line[] = $this->padRecord( '', 11, 'AN' );                                                   //(309-319)[11]: Local Wages
				$line[] = $this->padRecord( '', 11, 'AN' );                                                   //(320-330)[11]: Local Income Tax
				$line[] = $this->padRecord( '', 7, 'AN' );                                                    //(331-337)[7]: State Control Number
				$line[] = $this->padRecord( 0, 11, 'N' );                                                     //(338-348)[11]: AL: Other income (1099, W2G, etc.), columns 338-348. (Only use this field to report other income reported on 1099, W2G, etc. from which Alabama tax was withheld. Zero fill if not applicable.)
				$line[] = $this->padRecord( '', 44, 'AN' );                                                   //(349-392)[44]: Supplemental Data 1
				$line[] = $this->padRecord( $this->year, 4, 'N' );                                            //(393-396)[4]: AL: Payment Year
				$line[] = $this->padRecord( '', 116, 'AN' );                                                  //(397-512)[116]: Supplemental Data 1
				break;
			case 'ar': //Arkansas - https://www.dfa.arkansas.gov/images/uploads/incomeTaxOffice/Mag_Media.pdf
				//Withholding Number for State format is the State ID number.
				$line[] = 'RS';                                                                               //(1-2)[2]: RS Record
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );       //(3-4)[2]: State Code
				$line[] = $this->padRecord( '', 5, 'AN' );                                                    //(5-9)[5]: Tax Entity Code [Leave Blank]
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' );                   //(10-18)[9]: SSN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' );     //(19-33)[15]: First Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' );    //(34-48)[15]: Middle Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' );      //(49-68)[20]: Last Name
				$line[] = $this->padRecord( '', 4, 'AN' );                                                    //(69-72)[4]: Suffix
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' );       //(73-94)[22]: Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' );       //(95-116)[22]: Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' );           //(117-138)[22]: City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' );           //(139-140)[2]: State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' );        //(141-145)[5]: Zip
				$line[] = $this->padRecord( '', 4, 'AN' );                                                    //(146-149)[4]: Zip Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                    //(150-154)[5]: Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                   //(155-177)[23]: Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                   //(178-192)[15]: Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                    //(193-194)[2]: Country, fill with blanks if its the US

				//Unemployment reporting
				$line[] = $this->padRecord( '', 2, 'AN' );                                                    //(195-196)[2]: Optional Code
				$line[] = $this->padRecord( '122020', 6, 'AN' );                                              //(197-202)[6]: AR: Last month and four digit year for the calendar quarter. Unemployment only, but might be required?
				$line[] = $this->padRecord( '', 11, 'N' );                                                    //(203-213)[11]: State Quarterly Unemployment Total
				$line[] = $this->padRecord( '', 11, 'N' );                                                    //(214-224)[11]: State Quarterly Unemployment Insurance
				$line[] = $this->padRecord( '', 2, 'N' );                                                     //(225-226)[2]: Number of weeks worked
				$line[] = $this->padRecord( '', 8, 'AN' );                                                    //(227-234)[8]: Date first employed
				$line[] = $this->padRecord( '', 8, 'AN' );                                                    //(235-242)[8]: Date of separation
				$line[] = $this->padRecord( '', 5, 'AN' );                                                    //(243-247)[5]: Blank
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 20, 'AN' );                 //(248-267)[20]: AR: FEIN
				$line[] = $this->padRecord( '', 6, 'AN' );                                                    //(268-273)[6]: Blank

				//Income Tax Reporting
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );       //(274-275)[2]: State Code
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' );                   //(276-286)[11]: State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' );                   //(287-297)[11]: State income tax
				$line[] = $this->padRecord( '', 10, 'AN' );                                                   //(298-307)[10]: Other State Data
				$line[] = $this->padRecord( '', 1, 'AN' );                                                    //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other]
				$line[] = $this->padRecord( '', 11, 'AN' );                                                   //(309-319)[11]: Local Wages
				$line[] = $this->padRecord( '', 11, 'AN' );                                                   //(320-330)[11]: Local Income Tax
				$line[] = $this->padRecord( '', 7, 'AN' );                                                    //(331-337)[7]: State Control Number
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 75, 'AN' );                 //(338-412)[75]: AR: Same as 248-267. EIN from RE Record.
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 75, 'AN' );       //(413-487)[75]: AR: 11 digit State of Arkansas ID number. Omit hypens.
				$line[] = $this->padRecord( '', 25, 'AN' );                                                   //(488-512)[25]: Blank
				break;
			case 'ga': //Georgia -- Has Local Taxes
				// File Format Specifications: https://dor.georgia.gov/sites/dor.georgia.gov/files/related_files/document/Federal%20Format%20Specs%202015.pdf
				$line[] = 'RS';                                                                                             //RS Record
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );                     //State Code
				$line[] = $this->padRecord( '', 5, 'AN' );                                                                  //Tax Entity Code (Leave Blank)
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' );                                 //SSN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' );                   //First Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' );                  //Middle Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' );                    //Last Name
				$line[] = $this->padRecord( '', 4, 'AN' );                                                                  //Suffix
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' );                     //Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' );                     //Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' );                         //City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' );                         //State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' );                      //Zip
				$line[] = $this->padRecord( '', 4, 'AN' );                                                                  //Zip Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                                  //Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                                 //Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                                 //Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                                  //Country, fill with blanks if its the US

				//Unemployment reporting
				$line[] = $this->padRecord( '', 2, 'AN' );                                                                  //Optional Code
				$line[] = $this->padRecord( '', 6, 'AN' );                                                                  //Reporting Period
				$line[] = $this->padRecord( '', 11, 'N' );                                                                  //State Quarterly Unemployment Total
				$line[] = $this->padRecord( '', 11, 'N' );                                                                  //State Quarterly Unemployment Insurance
				$line[] = $this->padRecord( '', 2, 'AN' );                                                                  //Number of weeks worked
				$line[] = $this->padRecord( '', 8, 'AN' );                                                                  //Date first employed
				$line[] = $this->padRecord( '', 8, 'AN' );                                                                  //Date of separation
				$line[] = $this->padRecord( '', 5, 'AN' );                                                                  //Blank
				$line[] = $this->padRecord( '', 20, 'AN' );                                                                 //State Employer Account Number
				$line[] = $this->padRecord( '', 6, 'AN' );                                                                  //Blank

				//Income Tax Reporting
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );                     //State Code
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' );                                 //State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' );                                 //State income tax
				$line[] = $this->padRecord( '12/31/' . $this->year, 10, 'AN' );                                             //Period End Date (last day of the year)
				$line[] = $this->padRecord( '', 1, 'AN' );                                                                  //Tax Type Code
				$line[] = $this->padRecord( '', 11, 'AN' );                                                                 //Local Wages (blank)
				$line[] = $this->padRecord( '', 11, 'AN' );                                                                 //Local Income Tax (blank)
				$line[] = $this->padRecord( str_replace( [ '-', ' ' ], '', strtoupper( $this->$l15_state_id ) ), 9, 'AN' ); //Withholding Number, no hyphen and upper case alpha
				$line[] = $this->padRecord( $this->trade_name, 57, 'AN' );                                                  //Company Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address2 ), 22, 'AN' );             //Company Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_address1 ), 22, 'AN' );             //Company Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_city ), 22, 'AN' );                 //Company City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_state ), 2, 'AN' );                 //Company State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->company_zip_code ), 5, 'AN' );              //Company Zip Code
				$line[] = $this->padRecord( '', 4, 'AN' );                                                                  //Company Zip Code Extension
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' );                                 //EIN
				$line[] = $this->padRecord( '', 5, 'AN' );                                                                  //Blank
				$line[] = $this->padRecord( '', 25, 'AN' );                                                                 //Blank

				break;
			case 'ks': //Kansas - https://www.ksrevenue.org/pdf/K-2MT.pdf
				$line[] = 'RS';                                                                                      //(1-2)[2]: RS Record
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );              //(3-4)[2]: State Code
				$line[] = $this->padRecord( '', 5, 'AN' );                                                           //(5-9)[5]: Tax Entity Code [Leave Blank]
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' );                          //(10-18)[9]: SSN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' );            //(19-33)[15]: First Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' );           //(34-48)[15]: Middle Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' );             //(49-68)[20]: Last Name
				$line[] = $this->padRecord( '', 4, 'AN' );                                                           //(69-72)[4]: Suffix
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' );              //(73-94)[22]: Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' );              //(95-116)[22]: Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' );                  //(117-138)[22]: City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' );                  //(139-140)[2]: State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' );               //(141-145)[5]: Zip
				$line[] = $this->padRecord( '', 4, 'AN' );                                                           //(146-149)[4]: Zip Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                           //(150-154)[5]: Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                          //(155-177)[23]: Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                          //(178-192)[15]: Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                           //(193-194)[2]: Country, fill with blanks if its the US

				//Unemployment reporting
				$line[] = $this->padRecord( '', 2, 'AN' );                                                           //(195-196)[2]: Optional Code
				$line[] = $this->padRecord( '', 6, 'AN' );                                                           //(197-202)[6]: Reporting Period
				$line[] = $this->padRecord( '', 11, 'N' );                                                           //(203-213)[11]: State Quarterly Unemployment Total
				$line[] = $this->padRecord( '', 11, 'N' );                                                           //(214-224)[11]: State Quarterly Unemployment Insurance
				$line[] = $this->padRecord( '', 2, 'AN' );                                                           //(225-226)[2]: Number of weeks worked
				$line[] = $this->padRecord( '', 8, 'AN' );                                                           //(227-234)[8]: Date first employed
				$line[] = $this->padRecord( '', 8, 'AN' );                                                           //(235-242)[8]: Date of separation
				$line[] = $this->padRecord( '', 5, 'AN' );                                                           //(243-247)[5]: Blank
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->$l15_state_id ), 20, 'AN' );         //(248-267)[20]: State Employer Account Number
				$line[] = $this->padRecord( '', 6, 'AN' );                                                           //(268-273)[6]: Blank


				//Income Tax Reporting
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );              //(274-275)[2]: State Code
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' );                          //(276-286)[11]: State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' );                          //(287-297)[11]: State income tax
				$line[] = $this->padRecord( '', 10, 'AN' );                                                          //(298-307)[10]: Other State Data
				$line[] = $this->padRecord( '', 1, 'AN' );                                                           //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other]
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' );                          //(309-319)[11]: Local Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' );                          //(320-330)[11]: Local Income Tax
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_control_number ), 7, 'AN' );   //(331-337)[7]: State Control Number
				$line[] = $this->padRecord( $this->removeDecimal( $this->getL14AmountByName( 'KPER' ) ), 11, 'N' );  //(338-348)[11]: KS: Employee Contribution to KPERS, KP & F and Judges - "KPER" or "KPERS" should appear on W2 under Box 14. - https://www.ksrevenue.org/kpers.html
				$line[] = $this->padRecord( '', 64, 'AN' );                                                          //(349-412)[64]: Supplemental Data 1
				$line[] = $this->padRecord( '', 75, 'AN' );                                                          //(413-487)[75]: Supplemental Data 2
				$line[] = $this->padRecord( '', 25, 'AN' );                                                          //(488-512)[25]: Blank
				break;
			case 'ma': //Massachusetts
				//Withholding Number for State format is the State ID number.
				$line[] = 'RS';                                                                            //(1-2)[2]: RS Record
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );    //(3-4)[2]: State Code
				$line[] = $this->padRecord( '', 5, 'AN' );                                                 //(5-9)[5]: Tax Entity Code [Leave Blank]
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' );                //(10-18)[9]: SSN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' );  //(19-33)[15]: First Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' );   //(49-68)[20]: Last Name
				$line[] = $this->padRecord( '', 4, 'AN' );                                                 //(69-72)[4]: Suffix
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' );    //(73-94)[22]: Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' );    //(95-116)[22]: Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' );        //(117-138)[22]: City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' );        //(139-140)[2]: State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' );     //(141-145)[5]: Zip
				$line[] = $this->padRecord( '', 4, 'AN' );                                                 //(146-149)[4]: Zip Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                 //(150-154)[5]: Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                //(155-177)[23]: Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                //(178-192)[15]: Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                 //(193-194)[2]: Country, fill with blanks if its the US

				//Unemployment reporting
				$line[] = $this->padRecord( '', 2, 'AN' );                                                 //(195-196)[2]: Optional Code
				$line[] = $this->padRecord( '', 6, 'AN' );                                                 //(197-202)[6]: Reporting Period
				$line[] = $this->padRecord( '', 11, 'AN' );                                                //(203-213)[11]: State Quarterly Unemployment Total
				$line[] = $this->padRecord( '', 11, 'AN' );                                                //(214-224)[11]: State Quarterly Unemployment Insurance
				$line[] = $this->padRecord( '', 2, 'AN' );                                                 //(225-226)[2]: Number of weeks worked
				$line[] = $this->padRecord( '', 8, 'AN' );                                                 //(227-234)[8]: Date first employed
				$line[] = $this->padRecord( '', 8, 'AN' );                                                 //(235-242)[8]: Date of separation
				$line[] = $this->padRecord( '', 5, 'AN' );                                                 //(243-247)[5]: Blank
				$line[] = $this->padRecord( '', 20, 'AN' );                                                //(248-267)[20]: State Employer Account Number
				$line[] = $this->padRecord( '', 6, 'AN' );                                                 //(268-273)[6]: Blank

				//Income Tax Reporting
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );    //(274-275)[2]: State Code
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' );                //(276-286)[11]: State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' );                //(287-297)[11]: State income tax
				$line[] = $this->padRecord( '', 10, 'AN' );                                                //(298-307)[10]: Other State Data
				$line[] = $this->padRecord( '', 1, 'AN' );                                                 //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other]
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' );                //(309-319)[11]: Local Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' );                //(320-330)[11]: Local Income Tax
				$line[] = $this->padRecord( '', 7, 'AN' );                                                 //(331-337)[7]: State Control Number
				$line[] = $this->padRecord( '', 75, 'AN' );                                                //(338-412)[75]: Supplemental Data 1
				$line[] = $this->padRecord( '', 75, 'AN' );                                                //(413-487)[75]: Supplemental Data 2
				$line[] = $this->padRecord( '', 25, 'AN' );                                                //(488-512)[25]: Blank
				break;
			case 'oh': //Ohio - They share with Federal SSA. This is for RITA/Local format instead. It does not include school district taxes.
				//File format specifications: https://www.tax.ohio.gov/Portals/0/employer_withholding/2019%20tax%20year/2018_W2_Specs_v3.pdf
				//Ohio Regional for City reporting.
				//File format specifications: https://cdn.ritaohio.com/Media/700682/2018%20W-2%20SPECS.pdf
				$municipality_code = false;
				$municipality_name = null;
				$tax_type = 'C';

				//District/City Name must contain: [NNNA] or [NNNNA] ie: [123R] or [1234R] or [123C] -- Where R is tax based on residence location and C is tax based on work location.
				$municipality_match = preg_match( '/\[([0-9]{3,4})([RCDEF]{1})\]/i', $this->$l20, $matches );
				if ( isset( $matches[0] ) ) {
					if ( isset( $matches[1] ) ) {
						$municipality_code = str_pad( trim( $matches[1] ), 4, '0', STR_PAD_LEFT );
					}
					if ( isset( $matches[2] ) ) {
						$tax_type = trim( $matches[2] );
					}
				}

				$municipality_name = strtoupper( trim( preg_replace( '/\[.*\]/', '', $this->$l20 ) ) ); //Strip off the square brackets []

				if ( $municipality_code != '' && $tax_type != '' ) {
					//Withholding Number for State format is the State ID number.
					$line[] = 'RS';                                                                            //RS Record
					$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );    //State Code
					$line[] = $this->padRecord( 'R' . $municipality_code, 5, 'AN' );                           //Tax Entity Code (Leave Blank) [5-9]
					$line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' );                //SSN [10-18]
					$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' );  //First Name
					$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //Middle Name
					$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' );   //Last Name
					$line[] = $this->padRecord( '', 4, 'AN' );                                                 //Suffix
					$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' );    //Location Address
					$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' );    //Delivery Address
					$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' );        //City
					$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' );        //State
					$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' );     //Zip
					$line[] = $this->padRecord( '', 4, 'AN' );                                                 //Zip Extension [146-149]
					$line[] = $this->padRecord( '', 5, 'AN' );                                                 //Blank
					$line[] = $this->padRecord( '', 23, 'AN' );                                                //Foreign State/Province
					$line[] = $this->padRecord( '', 15, 'AN' );                                                //Foreign Postal Code
					$line[] = $this->padRecord( '', 2, 'AN' );                                                 //Country, fill with blanks if its the US

					//Unemployment reporting: Starts at 194
					$line[] = $this->padRecord( '', 2, 'AN' );                                                 //Optional Code
					$line[] = $this->padRecord( '', 6, 'AN' );                                                 //Reporting Period
					$line[] = $this->padRecord( '', 11, 'N' );                                                 //State Quarterly Unemployment Total
					$line[] = $this->padRecord( '', 11, 'N' );                                                 //State Quarterly Unemployment Insurance
					$line[] = $this->padRecord( '', 2, 'AN' );                                                 //Number of weeks worked
					$line[] = $this->padRecord( '', 8, 'AN' );                                                 //Date first employed
					$line[] = $this->padRecord( '', 8, 'AN' );                                                 //Date of separation
					$line[] = $this->padRecord( '', 5, 'AN' );                                                 //Blank
					$line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 20, 'N' );     //State Employer Account Number
					$line[] = $this->padRecord( '', 6, 'AN' );                                                 //Blank

					//Income Tax Reporting: Starts at 273
					$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );    //State Code [273-275]
					$line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' );                //State Taxable Wages [276-286]
					$line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' );                //State income tax [287-297]
					$line[] = $this->padRecord( '', 10, 'AN' );                                                //Other State Data [298-307]
					$line[] = $this->padRecord( strtoupper( $tax_type ), 1, 'AN' );                            //Tax Type Code [308] //C=City, D=County, E=School District, F=Other -- For City: R=Residence C=Company/Work Location
					$line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' );                //Local Wages [309-319]
					$line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' );                //Local Income Tax [320-330]
					$line[] = $this->padRecord( '', 7, 'AN' );                                                 //State Control Number

					if ( isset( $this->efile_agency_id ) && $this->efile_agency_id == '30:US:OH:00:0010' ) {
						$line[] = $this->padRecord( $municipality_name, 75, 'AN' );                                      //Supplemental Data 1
						$line[] = $this->padRecord( strtoupper( $this->_getStateName( $this->$l15_state ) ), 75, 'AN' ); //Supplemental Data 2
					} else {
						$line[] = $this->padRecord( '', 75, 'AN' ); //Supplemental Data 1
						$line[] = $this->padRecord( '', 75, 'AN' ); //Supplemental Data 2
					}
					$line[] = $this->padRecord( '', 25, 'AN' ); //Blank
				} else {
					Debug::Text( 'Skipping RS Record due to incorrect Municipality Code: ' . $municipality_code . ' Tax Type: ' . $tax_type, __FILE__, __LINE__, __METHOD__, 10 );
				}
				break;
			case 'ok': //https://www.ok.gov/tax/documents/What%20is%20the%20purpose%20of%20the%20RS.pdf
				$line[] = 'RS';                                                                            //(1-2)[2]: RS Record
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );    //(3-4)[2]: State Code
				$line[] = $this->padRecord( '', 5, 'AN' );                                                 //(5-9)[5]: Tax Entity Code [Leave Blank]
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' );                //(10-18)[9]: SSN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' );  //(19-33)[15]: First Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' );   //(49-68)[20]: Last Name
				$line[] = $this->padRecord( '', 4, 'AN' );                                                 //(69-72)[4]: Suffix
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' );    //(73-94)[22]: Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' );    //(95-116)[22]: Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' );        //(117-138)[22]: City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' );        //(139-140)[2]: State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' );     //(141-145)[5]: Zip
				$line[] = $this->padRecord( '', 4, 'AN' );                                                 //(146-149)[4]: Zip Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                 //(150-154)[5]: Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                //(155-177)[23]: Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                //(178-192)[15]: Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                 //(193-194)[2]: Country, fill with blanks if its the US

				//Unemployment reporting
				$line[] = $this->padRecord( '', 2, 'AN' );                                                 //(195-196)[2]: Optional Code
				$line[] = $this->padRecord( '', 6, 'AN' );                                                 //(197-202)[6]: Reporting Period
				$line[] = $this->padRecord( '', 11, 'AN' );                                                //(203-213)[11]: State Quarterly Unemployment Total
				$line[] = $this->padRecord( '', 11, 'AN' );                                                //(214-224)[11]: State Quarterly Unemployment Insurance
				$line[] = $this->padRecord( '', 2, 'AN' );                                                 //(225-226)[2]: Number of weeks worked
				$line[] = $this->padRecord( '', 8, 'AN' );                                                 //(227-234)[8]: Date first employed
				$line[] = $this->padRecord( '', 8, 'AN' );                                                 //(235-242)[8]: Date of separation
				$line[] = $this->padRecord( '', 5, 'AN' );                                                 //(243-247)[5]: Blank
				$line[] = $this->padRecord( '', 20, 'AN' );                                                //(248-267)[20]: UI: State Employer Account Number
				$line[] = $this->padRecord( '', 6, 'AN' );                                                 //(268-273)[6]: Blank

				//Income Tax Reporting
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );    //(274-275)[2]: State Code
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' );                //(276-286)[11]: State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' );                //(287-297)[11]: State income tax
				$line[] = $this->padRecord( '', 10, 'AN' );                                                //(298-307)[10]: Other State Data
				$line[] = $this->padRecord( '', 1, 'AN' );                                                 //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other]
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' );                //(309-319)[11]: Local Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' );                //(320-330)[11]: Local Income Tax
				$line[] = $this->padRecord( '', 7, 'AN' );                                                 //(331-337)[7]: State Control Number
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 15, 'AN' );    //(338-352)[15]: OK: Oklahoma withholding (WTH) Account Number
				$line[] = $this->padRecord( '', 60, 'AN' );                                                //(353-412)[60]: Supplemental Data 1
				$line[] = $this->padRecord( '', 75, 'AN' );                                                //(413-487)[75]: Supplemental Data 2
				$line[] = $this->padRecord( '', 25, 'AN' );                                                //(488-512)[25]: Blank
				break;
			case 'or': //https://www.oregon.gov/dor/programs/businesses/Documents/iWire-w2-specifications.pdf
				$line[] = 'RS';                                                                            //(1-2)[2]: RS Record
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );    //(3-4)[2]: State Code
				$line[] = $this->padRecord( '', 5, 'AN' );                                                 //(5-9)[5]: Tax Entity Code [Leave Blank]
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' );                //(10-18)[9]: SSN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' );  //(19-33)[15]: First Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' );   //(49-68)[20]: Last Name
				$line[] = $this->padRecord( '', 4, 'AN' );                                                 //(69-72)[4]: Suffix
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' );    //(73-94)[22]: Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' );    //(95-116)[22]: Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' );        //(117-138)[22]: City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' );        //(139-140)[2]: State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' );     //(141-145)[5]: Zip
				$line[] = $this->padRecord( '', 4, 'AN' );                                                 //(146-149)[4]: Zip Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                 //(150-154)[5]: Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                //(155-177)[23]: Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                //(178-192)[15]: Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                 //(193-194)[2]: Country, fill with blanks if its the US

				//Unemployment reporting
				$line[] = $this->padRecord( '', 2, 'AN' );                                                 //(195-196)[2]: Optional Code
				$line[] = $this->padRecord( '', 6, 'AN' );                                                 //(197-202)[6]: Reporting Period
				$line[] = $this->padRecord( '', 11, 'AN' );                                                //(203-213)[11]: State Quarterly Unemployment Total
				$line[] = $this->padRecord( '', 11, 'AN' );                                                //(214-224)[11]: State Quarterly Unemployment Insurance
				$line[] = $this->padRecord( '', 2, 'AN' );                                                 //(225-226)[2]: Number of weeks worked
				$line[] = $this->padRecord( '', 8, 'N' );                                                  //(227-234)[8]: Date first employed
				$line[] = $this->padRecord( '', 8, 'N' );                                                  //(235-242)[8]: Date of separation
				$line[] = $this->padRecord( '', 5, 'AN' );                                                 //(243-247)[5]: Blank
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 20, 'N' );     //(248-267)[20]: State Employer Account Number
				$line[] = $this->padRecord( '', 6, 'AN' );                                                 //(268-273)[6]: Blank

				//Income Tax Reporting
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );    //(274-275)[2]: State Code
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' );                //(276-286)[11]: State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' );                //(287-297)[11]: State income tax
				$line[] = $this->padRecord( '', 50, 'AN' );                                                //(298-347)[50]: OR: Other State Data
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' );                //(348-358)[11]: Statewide Transit Tax Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' );                //(359-369)[11]: Statewide Transit Tax Income Tax Withheld
				$line[] = $this->padRecord( '', 143, 'AN' );                                               //(370-512)[143]: Blank
				break;
			case 'pa': //https://www.revenue.pa.gov/GeneralTaxInformation/Tax%20Types%20and%20Information/EmployerWithholding/Documents/EFW2-EFW2C_reporting_inst_and_specs.pdf
				$line[] = 'RS';                                                                            //(1-2)[2]: RS Record
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );    //(3-4)[2]: State Code
				$line[] = $this->padRecord( '', 5, 'AN' );                                                 //(5-9)[5]: Tax Entity Code [Leave Blank]
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' );                //(10-18)[9]: SSN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' );  //(19-33)[15]: First Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' ); //(34-48)[15]: Middle Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' );   //(49-68)[20]: Last Name
				$line[] = $this->padRecord( '', 4, 'AN' );                                                 //(69-72)[4]: Suffix
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' );    //(73-94)[22]: Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' );    //(95-116)[22]: Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' );        //(117-138)[22]: City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' );        //(139-140)[2]: State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' );     //(141-145)[5]: Zip
				$line[] = $this->padRecord( '', 4, 'AN' );                                                 //(146-149)[4]: Zip Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                 //(150-154)[5]: Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                //(155-177)[23]: Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                //(178-192)[15]: Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                 //(193-194)[2]: Country, fill with blanks if its the US

				//Unemployment reporting
				$line[] = $this->padRecord( '', 2, 'AN' );                                                 //(195-196)[2]: Optional Code
				$line[] = $this->padRecord( '', 6, 'AN' );                                                 //(197-202)[6]: Reporting Period
				$line[] = $this->padRecord( '', 11, 'N' );                                                 //(203-213)[11]: State Quarterly Unemployment Total
				$line[] = $this->padRecord( '', 11, 'N' );                                                 //(214-224)[11]: State Quarterly Unemployment Insurance
				$line[] = $this->padRecord( '', 2, 'AN' );                                                 //(225-226)[2]: Number of weeks worked
				$line[] = $this->padRecord( '', 8, 'AN' );                                                 //(227-234)[8]: Date first employed
				$line[] = $this->padRecord( '', 8, 'AN' );                                                 //(235-242)[8]: Date of separation
				$line[] = $this->padRecord( '', 5, 'AN' );                                                 //(243-247)[5]: Blank
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 8, 'N' );      //(248-255)[8]: State Employer Account Number
				$line[] = $this->padRecord( '', 12, 'AN' );                                                //(256-267)[12]: Blank
				$line[] = $this->padRecord( '', 6, 'AN' );                                                 //(268-273)[6]: Blank

				//Income Tax Reporting
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );    //(274-275)[2]: State Code
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' );                //(276-286)[11]: State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' );                //(287-297)[11]: State income tax
				$line[] = $this->padRecord( '', 10, 'AN' );                                                //(298-307)[10]: Other State Data
				$line[] = $this->padRecord( '', 1, 'AN' );                                                 //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other]
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' );                //(309-319)[11]: Local Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' );                //(320-330)[11]: Local Income Tax
				$line[] = $this->padRecord( '', 7, 'AN' );                                                 //(331-337)[7]: State Control Number
				$line[] = $this->padRecord( 0, 9, 'N' );                                                   //(338-346)[9]: Employees ITIN as shown on card issued by SSA
				$line[] = $this->padRecord( '', 166, 'AN' );                                               //(347-512)[166]: Blank
				break;
			case 'in': // Indiana - Has Local Taxes - https://www.in.gov/dor/files/w-2book.pdf
				$line[] = 'RS';                                                                                          //(1-2)[2]: RS Record
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );                  //(3-4)[2]: State Code
				$line[] = $this->padRecord( '', 5, 'AN' );                                                               //(5-9)[5]: Tax Entity Code [Leave Blank]
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' );                              //(10-18)[9]: SSN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' );                //(19-33)[15]: First Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' );               //(34-48)[15]: Middle Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' );                 //(49-68)[20]: Last Name
				$line[] = $this->padRecord( '', 4, 'AN' );                                                               //(69-72)[4]: Suffix
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' );                  //(73-94)[22]: Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' );                  //(95-116)[22]: Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' );                      //(117-138)[22]: City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' );                      //(139-140)[2]: State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' );                   //(141-145)[5]: Zip
				$line[] = $this->padRecord( '', 4, 'AN' );                                                               //(146-149)[4]: Zip Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                               //(150-154)[5]: Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                              //(155-177)[23]: Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                              //(178-192)[15]: Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                               //(193-194)[2]: Country, fill with blanks if its the US

				//Unemployment reporting
				$line[] = $this->padRecord( '', 2, 'AN' );                                                               //(195-196)[2]: Optional Code
				$line[] = $this->padRecord( '', 6, 'AN' );                                                               //(197-202)[6]: Reporting Period
				$line[] = $this->padRecord( '', 11, 'N' );                                                               //(203-213)[11]: State Quarterly Unemployment Total
				$line[] = $this->padRecord( '', 11, 'N' );                                                               //(214-224)[11]: State Quarterly Unemployment Insurance
				$line[] = $this->padRecord( '', 2, 'AN' );                                                               //(225-226)[2]: Number of weeks worked
				$line[] = $this->padRecord( '', 8, 'AN' );                                                               //(227-234)[8]: Date first employed
				$line[] = $this->padRecord( '', 8, 'AN' );                                                               //(235-242)[8]: Date of separation
				$line[] = $this->padRecord( '', 5, 'AN' );                                                               //(243-247)[5]: Blank
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 20, 'N' );                   //(248-267)[20]: State Employer Account Number
				$line[] = $this->padRecord( '', 6, 'AN' );                                                               //(268-273)[6]: Blank

				//Income Tax Reporting
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );                  //(274-275)[2]: State Code
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' );                              //(276-286)[11]: State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' );                              //(287-297)[11]: State income tax
				$line[] = $this->padRecord( '', 10, 'AN' );                                                              //(298-307)[10]: Other State Data
				$line[] = $this->padRecord( '', 1, 'AN' );                                                               //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other]
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' );                              //(309-319)[11]: Local Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' );                              //(320-330)[11]: Local Income Tax
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 10, 'N' );                   //(331-340)[10]: IN: Indiana Employer Taxpayer ID (TID). Does not include the 3 digit location.
				$line[] = $this->padRecord( $this->stripNonNumeric( substr( $this->$l15_state_id, -3 ) ), 3, 'N' );      //(341-343)[3]: IN: Indiana Employer Taxpayer ID (TID) Location. Last 3 digits of the State ID.
				$line[] = $this->padRecord( '', 169, 'AN' );                                                             //(444-512)[169]: Blank
				break;
			default: //Federal
				//Withholding Number for State format is the State ID number.
				$line[] = 'RS';                                                                                    //(1-2)[2]: RS Record
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );            //(3-4)[2]: State Code
				$line[] = $this->padRecord( '', 5, 'AN' );                                                         //(5-9)[5]: Tax Entity Code [Leave Blank]
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->ssn ), 9, 'N' );                        //(10-18)[9]: SSN
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->first_name ), 15, 'AN' );          //(19-33)[15]: First Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->middle_name ), 15, 'AN' );         //(34-48)[15]: Middle Name
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->last_name ), 20, 'AN' );           //(49-68)[20]: Last Name
				$line[] = $this->padRecord( '', 4, 'AN' );                                                         //(69-72)[4]: Suffix
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address2 ), 22, 'AN' );            //(73-94)[22]: Location Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->address1 ), 22, 'AN' );            //(95-116)[22]: Delivery Address
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->city ), 22, 'AN' );                //(117-138)[22]: City
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->state ), 2, 'AN' );                //(139-140)[2]: State
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->zip_code ), 5, 'AN' );             //(141-145)[5]: Zip
				$line[] = $this->padRecord( '', 4, 'AN' );                                                         //(146-149)[4]: Zip Extension
				$line[] = $this->padRecord( '', 5, 'AN' );                                                         //(150-154)[5]: Blank
				$line[] = $this->padRecord( '', 23, 'AN' );                                                        //(155-177)[23]: Foreign State/Province
				$line[] = $this->padRecord( '', 15, 'AN' );                                                        //(178-192)[15]: Foreign Postal Code
				$line[] = $this->padRecord( '', 2, 'AN' );                                                         //(193-194)[2]: Country, fill with blanks if its the US

				//Unemployment reporting
				$line[] = $this->padRecord( '', 2, 'AN' );                                                         //(195-196)[2]: Optional Code
				$line[] = $this->padRecord( '', 6, 'AN' );                                                         //(197-202)[6]: Reporting Period
				$line[] = $this->padRecord( '', 11, 'N' );                                                         //(203-213)[11]: State Quarterly Unemployment Total
				$line[] = $this->padRecord( '', 11, 'N' );                                                         //(214-224)[11]: State Quarterly Unemployment Insurance
				$line[] = $this->padRecord( '', 2, 'AN' );                                                         //(225-226)[2]: Number of weeks worked
				$line[] = $this->padRecord( '', 8, 'AN' );                                                         //(227-234)[8]: Date first employed
				$line[] = $this->padRecord( '', 8, 'AN' );                                                         //(235-242)[8]: Date of separation
				$line[] = $this->padRecord( '', 5, 'AN' );                                                         //(243-247)[5]: Blank
				$line[] = $this->padRecord( $this->stripNonAlphaNumeric( $this->$l15_state_id ), 20, 'AN' );       //(248-267)[20]: State Employer Account Number
				$line[] = $this->padRecord( '', 6, 'AN' );                                                         //(268-273)[6]: Blank

				//Income Tax Reporting
				$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );            //(274-275)[2]: State Code
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l16 ), 11, 'N' );                        //(276-286)[11]: State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l17 ), 11, 'N' );                        //(287-297)[11]: State income tax
				$line[] = $this->padRecord( '', 10, 'AN' );                                                        //(298-307)[10]: Other State Data
				$line[] = $this->padRecord( '', 1, 'AN' );                                                         //(308)[1]: Tax Type Code [C=City, D=County, E=School District, F=Other]
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l18 ), 11, 'N' );                        //(309-319)[11]: Local Wages
				$line[] = $this->padRecord( $this->removeDecimal( $this->$l19 ), 11, 'N' );                        //(320-330)[11]: Local Income Tax
				$line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_control_number ), 7, 'AN' ); //(331-337)[7]: State Control Number
				$line[] = $this->padRecord( '', 75, 'AN' );                                                        //(338-412)[75]: Supplemental Data 1
				$line[] = $this->padRecord( '', 75, 'AN' );                                                        //(413-487)[75]: Supplemental Data 2
				$line[] = $this->padRecord( '', 25, 'AN' );                                                        //(488-512)[25]: Blank
				break;
		}

		if ( isset( $line ) ) {
			$retval = implode( ( $this->debug == true ) ? ',' : '', $line );
			if ( $this->debug == false && strlen( $retval ) != 512 ) {
				Debug::Text( 'ERROR! RS Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 );

				return false;
			}

			Debug::Text( 'RS Record: ' . $retval, __FILE__, __LINE__, __METHOD__, 10 );

			return $retval;
		} else {
			Debug::Text( 'Skipping RS Record... ', __FILE__, __LINE__, __METHOD__, 10 );
		}
	}

	function _compileRO() { //RO (Employee Optional)
		if ( in_array( strtoupper( $this->efile_state ), [ 'NY', 'AL', 'CO', 'CT', 'DE', 'KS', 'MA', 'PA', 'VA' ] ) ) { //Skip for eFiling in these states.
			return false;
		}

		$line[] = 'RO';                                                                                                                                //Employee Optional
		$line[] = $this->padRecord( '', 9, 'AN' );                                                                                                     //Blanks
		$line[] = $this->padRecord( $this->removeDecimal( $this->l8 ), 11, 'N' );                                                                      //(12-22) Allocated Tips
		$line[] = $this->padRecord( $this->removeDecimal( bcadd( $this->_getL12AmountByCode( 'A' ), $this->_getL12AmountByCode( 'B' ) ) ), 11, 'N' );  //(23-33) Uncollected Employee Tax on Tips (Codes A and B)
		$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'R' ) ), 11, 'N' );                                              //(34-44) Medical Savings Account (Code R)
		$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'S' ) ), 11, 'N' );                                              //(45-55) Simple Retirement Account (Code S)
		$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'T' ) ), 11, 'N' );                                              //(56-66) Qualified Adoption Expenses (Code T)
		$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'M' ) ), 11, 'N' );                                              //(67-77) Uncollected Social Security or RRTA Tax on Cost ofGroup Term Life Insurance Over $50,000 (Code M)
		$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'N' ) ), 11, 'N' );                                              //(78-88) Uncollected Medicare Tax on Cost of Group TermLife Insurance Over$50,000 (Code N)
		$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'Z' ) ), 11, 'N' );                                              //(89-99) Income Under a NonqualifiedDeferredCompensation PlanThat Fails to SatisfySection 409A (Code Z)
		$line[] = $this->padRecord( '', 11, 'AN' );                                                                                                    //(100-110) Blank
		$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'EE' ) ), 11, 'N' );                                             //(111-121) Designated Roth Contributions Under a Governmental Section 457(b) Plan (Code EE)
		$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'GG' ) ), 11, 'N' );                                             //(122-132) Income from Qualified Equity Grants Under Section 83(i) (Code GG)
		$line[] = $this->padRecord( $this->removeDecimal( $this->_getL12AmountByCode( 'HH' ) ), 11, 'N' );                                             //(133-143) Aggregate Deferrals Under Section 83(i) Elections as of theClose of the CalendarYear (Code HH)
		$line[] = $this->padRecord( '', 131, 'AN' );                                                                                                   //(144-274) Blank
		$line[] = $this->padRecord( 0, 11, 'N' );                                                                                                      //(275-285) Wages Subject to Puerto Rico Tax
		$line[] = $this->padRecord( 0, 11, 'N' );                                                                                                      //(286-296) Commissions Subject to Puerto Rico Tax
		$line[] = $this->padRecord( 0, 11, 'N' );                                                                                                      //(297-307) Allowances Subject to Puerto Rico Tax
		$line[] = $this->padRecord( 0, 11, 'N' );                                                                                                      //(308-318) Tips Subject to Puerto Rico Tax
		$line[] = $this->padRecord( 0, 11, 'N' );                                                                                                      //(319-329) Total Wages, Commissions, Tips  and Allowances Subject to Puerto Rico Tax
		$line[] = $this->padRecord( 0, 11, 'N' );                                                                                                      //(330-340) Puerto Rico Tax Withheld
		$line[] = $this->padRecord( 0, 11, 'N' );                                                                                                      //(341-351) Retirement Fund Annual Contributions
		$line[] = $this->padRecord( '', 11, 'AN' );                                                                                                    //(352-362) Blank
		$line[] = $this->padRecord( 0, 11, 'N' );                                                                                                      //(363-373) Total Wages, Tips and Other Compensation Subject to Virgin Islands, Guam, American Samoa or Northern Mariana Islands Income Tax
		$line[] = $this->padRecord( 0, 11, 'N' );                                                                                                      //(374-384) Virgin Islands, Guam, American Samoa or  Northern Mariana Islands Income Tax Withheld
		$line[] = $this->padRecord( '', 128, 'AN' );                                                                                                   //Blank

		$retval = implode( ( $this->debug == true ) ? ',' : '', $line );

		if ( $this->debug == false && strlen( $retval ) != 512 ) {
			Debug::Text( 'ERROR! RO Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 );

			return false;
		}

		Debug::Text( 'RO Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 );

		return $retval;
	}

	function _compileRU( $total ) { //RU (Total Optional) Record
		if ( in_array( strtoupper( $this->efile_state ), [ 'AL', 'CO', 'CT', 'DE', 'KS', 'MA', 'PA', 'VA' ] ) ) { //Skip for eFiling in these states.
			return false;
		}

		$line[] = 'RU';                                                                                           //Employee Optional
		$line[] = $this->padRecord( $total->total, 7, 'N' );                                                      //(3-9) Total Number of RO Records

		switch ( strtolower( $this->efile_state ) ) {
			case 'ny':
				$line[] = $this->padRecord( '', 503, 'AN' );                                                          //(10-512) Blank
				break;
			default:
				$line[] = $this->padRecord( $this->removeDecimal( $total->l8 ), 15, 'N' );                            //(10-24) Total Allocated Tips
				$line[] = $this->padRecord( $this->removeDecimal( bcadd( $total->l12a, $total->l12b ) ), 15, 'N' );   //(25-39) Total Uncollected Employee Tax on Tips (Codes A and B)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12r ), 15, 'N' );                          //(40-54) Total Medica Savings Account (Code R)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12s ), 15, 'N' );                          //(55-69) Total Simpl Retirement Account (Code S)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12t ), 15, 'N' );                          //(70-84) Total Qualified Adoption Expenses (Code T)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12m ), 15, 'N' );                          //(85-99) Total Uncollected Social Security or RRTA Tax on Cost of Group Term Life Insurance Over $50,000 (Code M)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12n ), 15, 'N' );                          //(100-114) Total Uncollected Medicare Tax on Cost of Group Term Life Insurance Over $50,000 (Code N)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12z ), 15, 'N' );                          //(115-129) Total Income Under a Nonqualified Deferred Compensation Plan That Fails to Satisfy Section 409A (Code Z)
				$line[] = $this->padRecord( '', 15, 'AN' );                                                           //(130-144) Blank
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12ee ), 15, 'N' );                         //(145-159) Total Designated Roth Contributions Under a Governmental Section 457(b) Plan (Code EE)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12gg ), 15, 'N' );                         //(160-174) Total Income from Qualified Equity Grants Under Section 83(i) (Code GG)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12hh ), 15, 'N' );                         //(175-189) Total Aggregate Deferrals Under Section 83(i) Elections as of the Close of the Calendar Year(Code HH)
				$line[] = $this->padRecord( '', 165, 'AN' );                                                          //(190-354) Blank
				$line[] = $this->padRecord( 0, 15, 'N' );                                                             //(355-369) Wages Subject to Puerto Rico Tax
				$line[] = $this->padRecord( 0, 15, 'N' );                                                             //(370-384) Commissions Subject to Puerto Rico Tax
				$line[] = $this->padRecord( 0, 15, 'N' );                                                             //(385-399) Allowances Subject to Puerto Rico Tax
				$line[] = $this->padRecord( 0, 15, 'N' );                                                             //(400-414) Tips Subject to Puerto Rico Tax
				$line[] = $this->padRecord( 0, 15, 'N' );                                                             //(415-429) Total Wages, Commissions, Tips  and Allowances Subject to Puerto Rico Tax
				$line[] = $this->padRecord( 0, 15, 'N' );                                                             //(430-444) Puerto Rico Tax Withheld
				$line[] = $this->padRecord( 0, 15, 'N' );                                                             //(445-459) Retirement Fund Annual Contributions
				$line[] = $this->padRecord( 0, 15, 'N' );                                                             //(460-474) Total Wages, Tips and Other Compensation Subject to Virgin Islands, Guam, American Samoa or Northern Mariana Islands Income Tax
				$line[] = $this->padRecord( 0, 15, 'N' );                                                             //(475-489) Virgin Islands, Guam, American Samoa or  Northern Mariana Islands Income Tax Withheld
				$line[] = $this->padRecord( '', 23, 'AN' );                                                           //(490-512) Blank
				break;
		}

		$retval = implode( ( $this->debug == true ) ? ',' : '', $line );

		if ( $this->debug == false && strlen( $retval ) != 512 ) {
			Debug::Text( 'ERROR! RU Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 );

			return false;
		}

		Debug::Text( 'RU Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 );

		return $retval;
	}

	function _compileRT( $total ) { //RT (Total) Record - Total number of RW records reported since the last RE (Employer) record.
		if ( in_array( strtoupper( $this->efile_state ), [ 'NY', 'AL', 'CO', 'DE', 'PA', 'VA' ] ) ) { //Skip for eFiling in these states.
			return false;
		}

		$line[] = 'RT';                                                               //(1-2)[2]: RT Record

		switch ( strtolower( $this->efile_state ) ) {
			case 'ct':
				$line[] = $this->padRecord( $total->total, 7, 'N' );                                          //(3-9)[7]: Total RS records.
				$line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 15, 'N' );   //(10-24)[15]: CT: State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 15, 'N' );      //(25-39)[15]: CT: State Tax Withheld
				$line[] = $this->padRecord( '', 473, 'AN' );                                                  //(40-512)[473]: Blank
				break;
			case 'ma':
				$line[] = $this->padRecord( $total->total, 7, 'N' );                                          //(3-9)[7]: Total RS records.
				$line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 15, 'N' );   //(10-24)[15]: MA: State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 15, 'N' );      //(25-39)[15]: MA: State Tax Withheld
				$line[] = $this->padRecord( '', 473, 'AN' );                                                  //(40-512)[473]: Blank
				break;
			default:
				$line[] = $this->padRecord( $total->total, 7, 'N' );                          //(3-9)[7]: Total RW records.
				$line[] = $this->padRecord( $this->removeDecimal( $total->l1 ), 15, 'N' );    //(10-24)[15]: Wages, Tips and Other Compensation
				$line[] = $this->padRecord( $this->removeDecimal( $total->l2 ), 15, 'N' );    //(25-39)[15]: Federal Income Tax
				$line[] = $this->padRecord( $this->removeDecimal( $total->l3 ), 15, 'N' );    //(40-54)[15]: Social Security Wages
				$line[] = $this->padRecord( $this->removeDecimal( $total->l4 ), 15, 'N' );    //(55-69)[15]: Social Security Tax
				$line[] = $this->padRecord( $this->removeDecimal( $total->l5 ), 15, 'N' );    //(70-84)[15]: Medicare Wages and Tips
				$line[] = $this->padRecord( $this->removeDecimal( $total->l6 ), 15, 'N' );    //(85-99)[15]: Medicare Tax
				$line[] = $this->padRecord( $this->removeDecimal( $total->l7 ), 15, 'N' );    //(100-114)[15]: Social Security Tips
				$line[] = $this->padRecord( '', 15, 'AN' );                                   //(115-129)[15]: Blank
				$line[] = $this->padRecord( $this->removeDecimal( $total->l10 ), 15, 'N' );   //(130-144)[15]: Dependant Care Benefits
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12d ), 15, 'N' );  //(145-159)[15]: Deferred Compensation Contributions to 401K (Code D)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12e ), 15, 'N' );  //(160-174)[15]: Deferred Compensation Contributions to 403(b) (Code E)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12f ), 15, 'N' );  //(175-189)[15]: Deferred Compensation Contributions to 408(k)(6) (Code F)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12g ), 15, 'N' );  //(190-204)[15]: Deferred Compensation Contributions to 457(b) (Code G)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12h ), 15, 'N' );  //(205-219)[15]: Deferred Compensation Contributions to 501(c)(18)(D) (Code H)
				$line[] = $this->padRecord( '', 15, 'AN' );                                   //(220-234)[15]: Blank
				$line[] = $this->padRecord( $this->removeDecimal( $total->l11 ), 15, 'N' );   //(235-249)[15]: Non-qualified Plan Section 457
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12w ), 15, 'N' );  //(250-264)[15]: Employer Contributions to Health Savings Account (Code W)
				$line[] = $this->padRecord( 0, 15, 'N' );                                     //(265-279)[15]: Non-qualified NOT Plan Section 457
				$line[] = $this->padRecord( 0, 15, 'N' );                                     //(280-294)[15]: Non taxable combat pay
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12dd ), 15, 'N' ); //(295-309)[15]: Cost of Employer Sponsored Health Coverage (Code DD)
				$line[] = $this->padRecord( 0, 15, 'N' );                                     //(310-324)[15]: Employer Cost of Premiums for Group Term Life Insurance over $50K
				$line[] = $this->padRecord( 0, 15, 'N' );                                     //(325-339)[15]: 3rd party sick pay.
				$line[] = $this->padRecord( 0, 15, 'N' );                                     //(340-354)[15]: Income from the Exercise of Nonstatutory Stock Options
				$line[] = $this->padRecord( 0, 15, 'N' );                                     //(355-369)[15]: Deferrals Under a Section 409A non-qualified plan
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12aa ), 15, 'N' ); //(370-384)[15]: Desiginated Roth Contributions under a section 401K (Code AA)
				$line[] = $this->padRecord( $this->removeDecimal( $total->l12bb ), 15, 'N' ); //(385-399)[15]: Desiginated Roth Contributions under a section 403B (Code BB)
				$line[] = $this->padRecord( 0, 15, 'N' );                                     //(400-414)[15]: Permitted Benefits Under a Qualified Small Employer Health Reimbursement (Code FF)
				$line[] = $this->padRecord( '', 98, 'AN' );                                   //(415-512)[98]: Blank
				break;
		}

		$retval = implode( ( $this->debug == true ) ? ',' : '', $line );

		if ( $this->debug == false && strlen( $retval ) != 512 ) {
			Debug::Text( 'ERROR! RT Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 );

			return false;
		}

		Debug::Text( 'RT Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 );

		return $retval;
	}

	function _compileRV( $total ) { //RV (State Total) Record - **OPTIONAL** Not processed or shared by SSA or IRS. Custom to each state.
		if ( $this->efile_state == '' ) { //Federal filing does not need any RS record at all.
			return false;
		}

		if ( $this->efile_state == '' || !in_array( strtoupper( $this->efile_state ), [ 'IL', 'MO', 'MT', 'ND', 'NE', 'OK', 'OR', 'PA' ] ) ) { //**THIS IS OPPOSITE AS OTHER FUNCTIONS** - Skip for eFiling in these states.
			return false;
		}


		if ( $total->total > 0 ) {
			$line[] = 'RV';                                                                             //RT Record

			switch ( strtolower( $this->efile_state ) ) {
				case 'mo': // https://dor.mo.gov/business/withhold/documents/MissouriAnnualW-2FilingGuidelines.pdf
					foreach ( range( 'a', 'z' ) as $z ) {
						$l15_state = 'l15' . $z . '_state';
						if ( strtolower( $this->$l15_state ) == strtolower( $this->efile_state ) ) {
							$l15_state_id = 'l15' . $z . '_state_id';
							break;
						}
					}

					$line[] = $this->padRecord( $this->year, 4, 'N' );                                                       //(3-6)[4]: Tax Year
					$line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' );                              //(7-15)[9]: FEIN
					$line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 8, 'N' );                    //(16-23)[8]: State ID Number
					$line[] = $this->padRecord( $this->trade_name, 57, 'AN' );                                               //(24-80)[57]: Employer Name
					$line[] = $this->padRecord( $total->total, 6, 'N' );                                                     //(81-86)[6]: Employer Number of W2's
					$line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 12, 'N' );                 //(87-98)[12]: Employer TOtal Tax Withheld as shown on W2s
					$line[] = $this->padRecord( '', 414, 'AN' );                                                             //(99-512)[414]: Blank
					break;
				case 'ok': // https://www.ok.gov/tax/documents/What%20is%20the%20purpose%20of%20the%20RV.pdf
					foreach ( range( 'a', 'z' ) as $z ) {
						$l15_state = 'l15' . $z . '_state';
						if ( strtolower( $this->$l15_state ) == strtolower( $this->efile_state ) ) {
							$l15_state_id = 'l15' . $z . '_state_id';
							break;
						}
					}

					$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );                     //(3-4)[2]: State Code
					$line[] = $this->padRecord( $total->total, 7, 'N' );                                                        //(5-11)[7]: Total RS records.
					$line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' );                                 //(12-20)[9]: FEIN
					$line[] = $this->padRecord( '', 21, 'AN' );                                                                 //(21-41)[21]: Blank
					$line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 15, 'N' );                 //(42-56)[15]: State Taxable Wages
					$line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 15, 'N' );                    //(57-71)[15]: State Income Tax Withheld
					$line[] = $this->padRecord( $this->removeDecimal( $total->local_taxable_wages ), 15, 'N' );                 //(72-86)[15]: Local Taxable Wages
					$line[] = $this->padRecord( $this->removeDecimal( $total->local_income_tax ), 15, 'N' );                    //(87-101)[15]: Local Income Tax Withheld
					$line[] = $this->padRecord( '', 411, 'AN' );                                                                //(102-512)[411]: Blank
					break;
				case 'or': // https://www.oregon.gov/dor/programs/businesses/Documents/iWire-w2-specifications.pdf
					$line[] = $this->padRecord( $total->total, 7, 'N' );                                                     //(3-9)[2]: Total RS records.
					$line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 15, 'N' );              //(10-24)[15]: State Taxable Wages
					$line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 15, 'N' );                 //(25-39)[15]: State Income Tax Withheld
					$line[] = $this->padRecord( $this->removeDecimal( $total->local_taxable_wages ), 15, 'N' );              //(40-54)[15]: OR: Satewide Transit Taxable Wages
					$line[] = $this->padRecord( $this->removeDecimal( $total->local_income_tax ), 15, 'N' );                 //(55-69)[15]: OR: Satewide Transit Tax Withheld
					$line[] = $this->padRecord( '', 443, 'AN' );                                                             //(70-512)[443]: Blank
					break;
				case 'pa': // https://www.revenue.pa.gov/GeneralTaxInformation/Tax%20Types%20and%20Information/EmployerWithholding/Documents/EFW2-EFW2C_reporting_inst_and_specs.pdf
					foreach ( range( 'a', 'z' ) as $z ) {
						$l15_state = 'l15' . $z . '_state';
						if ( strtolower( $this->$l15_state ) == strtolower( $this->efile_state ) ) {
							$l15_state_id = 'l15' . $z . '_state_id';
							break;
						}
					}

					$line[] = $this->padRecord( $this->_getStateNumericCode( $this->$l15_state ), 2, 'N' );                  //(3-4)[2]: State Code
					$line[] = $this->padRecord( $this->year, 4, 'N' );                                                       //(5-8)[4]: Tax Year
					$line[] = $this->padRecord( $this->stripNonNumeric( $this->$l15_state_id ), 8, 'N' );                    //(9-16)[8]: PA Employer Account ID
					$line[] = $this->padRecord( $this->stripNonNumeric( $this->ein ), 9, 'N' );                              //(17-25)[9]: Employer Entity ID
					$line[] = $this->padRecord( $total->total, 7, 'N' );                                                     //(26-32)[7]: Total RS records.
					$line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 15, 'N' );              //(33-47)[15]: State Taxable Wages
					$line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 15, 'N' );                 //(48-62)[15]: State Income Tax Withheld
					$line[] = $this->padRecord( '', 450, 'AN' );                                                             //(63-512)[450]: Blank
					break;
				default:
					//SSA specifications state RV records are optional and not processed or shared anyways.
					//$retval = false;

					$line[] = $this->padRecord( $total->total, 7, 'N' );                                        //Total RW records.
					$line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 15, 'N' ); //State Wages, Tips and Other Compensation
					$line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 15, 'N' );    //State Income Tax
					$line[] = $this->padRecord( '', 473, 'AN' );                                                //Blank

					break;
			}

			$retval = implode( ( $this->debug == true ) ? ',' : '', $line );

			if ( $this->debug == false && strlen( $retval ) != 512 ) {
				Debug::Text( 'ERROR! RV Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 );

				return false;
			}

			Debug::Text( 'RV Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 );

			return $retval;
		}

		return false;
	}

	function _compileRF( $total ) { //RF (Final) Record - Total number of RW (Employee) Records reported on the entire file.
		if ( in_array( strtoupper( $this->efile_state ), [ 'AL' ] ) ) { //Skip for eFiling in these states.
			return false;
		}

		$line[] = 'RF';                                          //RF Record

		switch ( strtolower( $this->efile_state ) ) {
			case 'ct':
				$line[] = $this->padRecord( $total->total, 9, 'N' );                                          //(3-11)[9]: Total RS records.
				$line[] = $this->padRecord( $this->removeDecimal( $total->state_taxable_wages ), 16, 'N' );   //(12-27)[16]: CT: State Taxable Wages
				$line[] = $this->padRecord( $this->removeDecimal( $total->state_income_tax ), 16, 'N' );      //(28-43)[16]: CT: State Tax Withheld
				$line[] = $this->padRecord( '', 469, 'AN' );                                                  //(44-512)[469]: Blank
				break;
			case 'ny':
			case 'pa':
				$line[] = $this->padRecord( '', 510, 'AN' );          //Blank
				break;
			default:
				$line[] = $this->padRecord( '', 5, 'AN' );            //Blank
				$line[] = $this->padRecord( $total->total, 9, 'N' );  //Total RW records.
				$line[] = $this->padRecord( '', 496, 'AN' );          //Blank
				break;
		}

		$retval = implode( ( $this->debug == true ) ? ',' : '', $line );

		if ( $this->debug == false && strlen( $retval ) != 512 ) {
			Debug::Text( 'ERROR! RF Record length is incorrect, should be 512 is: ' . strlen( $retval ), __FILE__, __LINE__, __METHOD__, 10 );

			return false;
		}
		Debug::Text( 'RF Record:' . $retval, __FILE__, __LINE__, __METHOD__, 10 );

		return $retval;
	}

	//Fixed length field EFW2C format
	function _outputEFILE( $type = null ) {
		//DISABLED FOR NOW as it hasn't been implemented yet!
		return false;


		/*
		 Submitter Record (RA)
		 Employer Record (RE)
		 Employee Wage Records (RW AND RO)
		 State Wage Record (RS)
		 Total Records (RT and RU)
		 State Total Record (RV) - Page 64
		 Final Record (RF)

		 Publication 42-007: http://www.ssa.gov/employer/EFW2&EFW2C.htm

		 Download: AccuWage from the bottom of this website for testing: http://www.socialsecurity.gov/employer/accuwage/index.html
		 */

		$records = $this->getRecords();

		//Debug::Arr($records, 'Output EFILE Records: ',__FILE__, __LINE__, __METHOD__, 10);

		if ( is_array( $records ) && count( $records ) > 0 ) {
			$retval = $this->padLine( $this->_compileRA() );
			$retval .= $this->padLine( $this->_compileRE() );

			$rt_total = Misc::preSetArrayValues( new stdClass(), [ 'total', 'l1', 'l2', 'l3', 'l4', 'l5', 'l6', 'l7', 'l10', 'l11', 'l12d', 'l12e', 'l12f', 'l12g', 'l12h', 'l12w', 'l12aa', 'l12bb', 'l12dd' ], 0 );
			$rw_total = Misc::preSetArrayValues( new stdClass(), [ 'total' ], 0 );
			$ro_total = Misc::preSetArrayValues( new stdClass(), [ 'total', 'l8', 'l12a', 'l12b', 'l12r', 'l12s', 'l12t', 'l12m', 'l12n', 'l12z', 'l12ee', 'l12gg', 'l12hh' ], 0 );

			$i = 0;
			foreach ( $records as $w2_data ) {
				$this->arrayToObject( $w2_data ); //Convert record array to object


				$compile_rw_retval = $this->padLine( $this->_compileRW() );
				if ( $compile_rw_retval != '' ) {
					$retval .= $compile_rw_retval;
					$rw_total->total += 1;
				}

				$retval .= $this->padLine( $this->_compileRO() );

				$state_total = Misc::preSetArrayValues( new stdClass(), [ 'total', 'state_taxable_wages', 'state_income_tax', 'local_taxable_wages', 'local_income_tax' ], 0 );
				foreach ( range( 'a', 'z' ) as $z ) {
					$compile_rs_retval = $this->padLine( $this->_compileRS( $z ) );

					if ( $compile_rs_retval != '' ) {
						$retval .= $compile_rs_retval;

						$state_total->total += 1;
						$state_total->state_taxable_wages += $this->{'l16' . $z};
						$state_total->state_income_tax += $this->{'l17' . $z};
						$state_total->local_taxable_wages += $this->{'l18' . $z};
						$state_total->local_income_tax += $this->{'l19' . $z};
					}
				}

				$rt_total->total += 1;
				$rt_total->l1 += $this->l1;
				$rt_total->l2 += $this->l2;
				$rt_total->l3 += $this->l3;
				$rt_total->l4 += $this->l4;
				$rt_total->l5 += $this->l5;
				$rt_total->l6 += $this->l6;
				$rt_total->l7 += $this->l7;
				$rt_total->l10 += $this->l10;
				$rt_total->l11 += $this->l11;
				$rt_total->l12d += $this->_getL12AmountByCode( 'D' );
				$rt_total->l12e += $this->_getL12AmountByCode( 'E' );
				$rt_total->l12f += $this->_getL12AmountByCode( 'F' );
				$rt_total->l12g += $this->_getL12AmountByCode( 'G' );
				$rt_total->l12h += $this->_getL12AmountByCode( 'H' );
				$rt_total->l12w += $this->_getL12AmountByCode( 'W' );
				$rt_total->l12aa += $this->_getL12AmountByCode( 'AA' );
				$rt_total->l12bb += $this->_getL12AmountByCode( 'BB' );
				$rt_total->l12dd += $this->_getL12AmountByCode( 'DD' );

				$ro_total->total += 1;
				$ro_total->l8 += $this->l8;
				$ro_total->l12a += $this->_getL12AmountByCode( 'A' );
				$ro_total->l12b += $this->_getL12AmountByCode( 'B' );
				$ro_total->l12r += $this->_getL12AmountByCode( 'R' );
				$ro_total->l12s += $this->_getL12AmountByCode( 'S' );
				$ro_total->l12t += $this->_getL12AmountByCode( 'T' );
				$ro_total->l12m += $this->_getL12AmountByCode( 'M' );
				$ro_total->l12n += $this->_getL12AmountByCode( 'N' );
				$ro_total->l12z += $this->_getL12AmountByCode( 'Z' );
				$ro_total->l12ee += $this->_getL12AmountByCode( 'EE' );
				$ro_total->l12gg += $this->_getL12AmountByCode( 'GG' );
				$ro_total->l12hh += $this->_getL12AmountByCode( 'HH' );

				$this->revertToOriginalDataState();

				$i++;
			}

			if ( in_array( $this->efile_state, [ 'CT', 'MA' ] ) ) {
				$retval .= $this->padLine( $this->_compileRT( $state_total ) ); //CT uses the RT record like an RV record, showing state totals.
			} else {
				$retval .= $this->padLine( $this->_compileRT( $rt_total ) );
			}
			$retval .= $this->padLine( $this->_compileRU( $ro_total ) );
			$retval .= $this->padLine( $this->_compileRV( $state_total ) ); //State Total Record

			if ( in_array( $this->efile_state, [ 'CT', 'MA', 'VA' ] ) ) {
				$retval .= $this->padLine( $this->_compileRF( $state_total ) );
			} else {
				$retval .= $this->padLine( $this->_compileRF( $rw_total ) );
			}
		}

		if ( isset( $retval ) ) {
			return $retval;
		}

		return false;
	}

	//Gets Line 14 amount by the name associated with that Line.
	function getL14AmountByName( $name ) {
		$name = trim( $name );

		$retval = 0;
		if ( $name != '' ) {
			foreach ( range( 'a', 'd' ) as $z ) {
				$l14_field = 'l14' . $z;
				$l14_name_field = 'l14' . $z . '_name';
				if ( strtolower( trim( $this->$l14_name_field ) ) == strtolower( $name ) ) {
					$retval = $this->$l14_field;
					break;
				}
			}
		}

		return $retval;
	}

	//This takes a single employee record and moves state/locality data from rows c, d, e, f, ... into rows a,b.
	// Because it changes the data, it can be run multiple times on the same input data.
	function handleThreeOrMoreStateData( $data ) {
		//FIXME: Add support for more than two states.
		return false;
	}

	//Return just array elements that *do not* match in each record. Always keep mandatory elements too though.
	function comparePreviousAndCorrectRecords( $previous_record, $correct_record ) {
		//Always keep these elements in the correct record.
		$mandatory_elements_to_keep = [ 'user_id', 'ssn', 'first_name', 'middle_name', 'last_name', 'address1', 'address2', 'city', 'province', 'postal_code' ];
		$previous_record_elements_to_remove = [ 'ssn', 'first_name', 'middle_name', 'last_name' ];

		foreach( $correct_record as $correct_record_key => $correct_record_value ) {
			if ( in_array( $correct_record_key, $mandatory_elements_to_keep ) ) {
				if ( in_array( $correct_record_key, $previous_record_elements_to_remove ) && isset( $previous_record[$correct_record_key] ) && $previous_record[$correct_record_key] == $correct_record_value ) {
					unset( $previous_record[$correct_record_key] );
				}
			} else {
				if ( isset( $previous_record[$correct_record_key] ) && $previous_record[$correct_record_key] == $correct_record_value ) {
					unset( $previous_record[$correct_record_key], $correct_record[$correct_record_key] );
				}
			}
		}

		return [ $previous_record, $correct_record ];
	}

	function convertW2ObjectToPrevious( $previous_record ) {
		if ( is_array( $previous_record ) && !empty( $previous_record ) ) {
			$retarr = [];
			foreach( $previous_record as $key => $value ) {
				$retarr['previous_'.$key] = $value;
			}

			return $retarr;
		}

		return [];
	}

	function mergeCorrectAndPreviousW2Objects( $correct_fw2_obj, $previous_fw2_obj ) {
		//Loop over previos records, and find matching correct records to merge in.

		$this->year = $correct_fw2_obj->year;
		$this->ein = $correct_fw2_obj->ein;
		$this->name = $correct_fw2_obj->name;
		$this->trade_name = $correct_fw2_obj->trade_name;
		$this->company_address1 = $correct_fw2_obj->company_address1;
		$this->company_address2 = $correct_fw2_obj->company_address2;
		$this->company_city = $correct_fw2_obj->company_city;
		$this->company_state = $correct_fw2_obj->company_state;
		$this->company_zip_code = $correct_fw2_obj->company_zip_code;


		//Get array of both sets of records.
		$previous_records = $previous_fw2_obj->getRecords();
		$correct_records = $correct_fw2_obj->getRecords();

		if ( is_array( $previous_records ) && !empty( $previous_records ) ) {
			foreach( $previous_records as $previous_record ) {
				//Find matching correct record.
				if ( is_array( $correct_records ) && !empty( $correct_records ) ) {
					foreach ( $correct_records as $correct_record_key => $correct_record ) {
						if ( isset($previous_record['user_id']) && isset( $correct_record['user_id'] ) && $previous_record['user_id'] == $correct_record['user_id'] ) {
							//Find only the differences between each record.
							[ $previous_record, $correct_record ] = $this->comparePreviousAndCorrectRecords( $previous_record, $correct_record );

							//Merge both records.
							$this->addRecord( array_merge( $this->convertW2ObjectToPrevious( $previous_record ), $correct_record ) );
							unset( $correct_records[$correct_record_key] ); //Remove correct record from list now thats it been used.

							break;
						}
					}
				}
			}

			return true;
		}

		return false;
	}

	//This takes a single employee record that has three or more states/localities and splits them into multiple records to simplify generating the PDFs.
	function handleMultipleForms( $records ) {
		$tmp_records = [];
		if ( is_array( $records ) && count( $records ) > 0 ) {
			foreach ( $records as $employee_data ) {
				$tmp_records[] = $employee_data;

				$tmp_record = $employee_data;
				do {
					$tmp_record = $this->handleThreeOrMoreStateData( $tmp_record );
					if ( is_array( $tmp_record ) ) {
						$tmp_records[] = $tmp_record;
					}
				} while ( is_array( $tmp_record ) );
			}
		}

		$this->clearRecords();
		$this->setRecords( $tmp_records );

		return $this->getRecords();
	}

	function _outputPDF( $type ) {
		//Initialize PDF with template.
		$pdf = $this->getPDFObject();

		if ( $this->getShowBackground() == true ) {
			$pdf->setSourceFile( $this->getTemplateDirectory() . DIRECTORY_SEPARATOR . $this->pdf_template );

			for ( $tp = 1; $tp <= 9; $tp++ ) {
				$this->template_index[$tp] = $pdf->ImportPage( $tp );
			}
		}

		if ( $this->year == '' ) {
			$this->year = $this->getYear();
		}

		if ( $this->getType() == 'government' ) {
			if ( $this->efile_state != '' ) { //When doing state filing, only include the state copy of the W2.
				$form_template_pages = [ 3 ]; //Template pages to use.
			} else {
				$form_template_pages = [ 2, 3, 8 ]; //Template pages to use. 2=SSA, 3=State, City, Local, 10=Employer
			}
		} else {
			$form_template_pages = [ 4, 5, 7 ]; //Template pages to use. 4=Employee Federal Return, 6=Employee Records, 7=Employee State, City Local
		}

		//Get location map, start looping over each variable and drawing
		$records = $this->handleMultipleForms( $this->getRecords() );

		if ( is_array( $records ) && count( $records ) > 0 ) {
			$template_schema = $this->getTemplateSchema();

			foreach ( $form_template_pages as $key => $form_template_page ) {
				//Set the template used.
				$template_schema[0]['template_page'] = $form_template_page;

				$e = 0;
				foreach ( $records as $employee_data ) {
					//Debug::Arr($employee_data, 'Employee Data: ', __FILE__, __LINE__, __METHOD__,10);
					$this->arrayToObject( $employee_data ); //Convert record array to object

					$this->setTempPageOffsets( $this->getPageOffsets( 'x' ), $this->getPageOffsets( 'y' ) );

					foreach ( $template_schema as $field => $schema ) {
						$this->Draw( $this->$field, $schema );
					}

					$this->resetTemplatePage();

					$this->revertToOriginalDataState();

					$e++;
				}
			}
		}

		return true;
	}
}

?>