<?php
namespace Airavata\Model\User;

/**
 * Autogenerated by Thrift Compiler (0.9.3)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;


final class Status {
  const ACTIVE = 0;
  const CONFIRMED = 1;
  const APPROVED = 2;
  const DELETED = 3;
  const DUPLICATE = 4;
  const GRACE_PERIOD = 5;
  const INVITED = 6;
  const DENIED = 7;
  const PENDING = 8;
  const PENDING_APPROVAL = 9;
  const PENDING_CONFIRMATION = 10;
  const SUSPENDED = 11;
  const DECLINED = 12;
  const EXPIRED = 13;
  static public $__names = array(
    0 => 'ACTIVE',
    1 => 'CONFIRMED',
    2 => 'APPROVED',
    3 => 'DELETED',
    4 => 'DUPLICATE',
    5 => 'GRACE_PERIOD',
    6 => 'INVITED',
    7 => 'DENIED',
    8 => 'PENDING',
    9 => 'PENDING_APPROVAL',
    10 => 'PENDING_CONFIRMATION',
    11 => 'SUSPENDED',
    12 => 'DECLINED',
    13 => 'EXPIRED',
  );
}

/**
 * U.S. Citizen (see: http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
 * 
 */
final class USCitizenship {
  const US_CITIZEN = 0;
  const US_PERMANENT_RESIDENT = 1;
  const OTHER_NON_US_CITIZEN = 2;
  static public $__names = array(
    0 => 'US_CITIZEN',
    1 => 'US_PERMANENT_RESIDENT',
    2 => 'OTHER_NON_US_CITIZEN',
  );
}

/**
 * Hispanic or Latino - a person of Mexican, Puerto Rican, Cuban, South or
 *  Central American, or other Spanish culture or origin, regardless of race.
 * 
 */
final class ethnicity {
  const HISPANIC_LATINO = 0;
  const NOT_HISPANIC_LATINO = 1;
  static public $__names = array(
    0 => 'HISPANIC_LATINO',
    1 => 'NOT_HISPANIC_LATINO',
  );
}

/**
 * * Asian - a person having origins in any of the original peoples of the Far East,
 * *      Southeast Asia, or the Indian subcontinent including, for example, Cambodia,
 *  *      China, India, Japan, Korea, Malaysia, Pakistan, the Philippine Islands,
 *  *      Thailand, and Vietnam.
 * * American Indian or Alaskan Native - a person having origins in any of the original
 *  *     peoples of North and South America (including Central America), and who maintains
 *   *     tribal affiliation or community attachment.
 * * Black or African American - a person having origins in any of the black racial groups
 * *      of Africa.
 * * Native Hawaiian or Pacific Islander - a person having origins in any of the original
 * *      peoples of Hawaii, Guan, Samoa, or other Pacific Islands.
 * * White - a person having origins in any of the original peoples of Europe, the Middle East, or North Africa.
 * *
 */
final class race {
  const ASIAN = 0;
  const AMERICAN_INDIAN_OR_ALASKAN_NATIVE = 1;
  const BLACK_OR_AFRICAN_AMERICAN = 2;
  const NATIVE_HAWAIIAN_OR_PACIFIC_ISLANDER = 3;
  const WHITE = 4;
  static public $__names = array(
    0 => 'ASIAN',
    1 => 'AMERICAN_INDIAN_OR_ALASKAN_NATIVE',
    2 => 'BLACK_OR_AFRICAN_AMERICAN',
    3 => 'NATIVE_HAWAIIAN_OR_PACIFIC_ISLANDER',
    4 => 'WHITE',
  );
}

final class disability {
  const HEARING_IMAPAIRED = 0;
  const VISUAL_IMPAIRED = 1;
  const MOBILITY_OR_ORTHOPEDIC_IMPAIRMENT = 2;
  const OTHER_IMPAIRMENT = 3;
  static public $__names = array(
    0 => 'HEARING_IMAPAIRED',
    1 => 'VISUAL_IMPAIRED',
    2 => 'MOBILITY_OR_ORTHOPEDIC_IMPAIRMENT',
    3 => 'OTHER_IMPAIRMENT',
  );
}

/**
 * A structure holding the NSF Demographic information.
 * 
 * 
 */
class NSFDemographics {
  static $_TSPEC;

  /**
   * @var string
   */
  public $airavataInternalUserId = "DO_NOT_SET_AT_CLIENTS";
  /**
   * @var string
   */
  public $gender = null;
  /**
   * @var int
   */
  public $usCitizenship = null;
  /**
   * @var int[]
   */
  public $ethnicities = null;
  /**
   * @var int[]
   */
  public $races = null;
  /**
   * @var int[]
   */
  public $disabilities = null;

  public function __construct($vals=null) {
    if (!isset(self::$_TSPEC)) {
      self::$_TSPEC = array(
        1 => array(
          'var' => 'airavataInternalUserId',
          'type' => TType::STRING,
          ),
        2 => array(
          'var' => 'gender',
          'type' => TType::STRING,
          ),
        3 => array(
          'var' => 'usCitizenship',
          'type' => TType::I32,
          ),
        4 => array(
          'var' => 'ethnicities',
          'type' => TType::LST,
          'etype' => TType::I32,
          'elem' => array(
            'type' => TType::I32,
            ),
          ),
        5 => array(
          'var' => 'races',
          'type' => TType::LST,
          'etype' => TType::I32,
          'elem' => array(
            'type' => TType::I32,
            ),
          ),
        6 => array(
          'var' => 'disabilities',
          'type' => TType::LST,
          'etype' => TType::I32,
          'elem' => array(
            'type' => TType::I32,
            ),
          ),
        );
    }
    if (is_array($vals)) {
      if (isset($vals['airavataInternalUserId'])) {
        $this->airavataInternalUserId = $vals['airavataInternalUserId'];
      }
      if (isset($vals['gender'])) {
        $this->gender = $vals['gender'];
      }
      if (isset($vals['usCitizenship'])) {
        $this->usCitizenship = $vals['usCitizenship'];
      }
      if (isset($vals['ethnicities'])) {
        $this->ethnicities = $vals['ethnicities'];
      }
      if (isset($vals['races'])) {
        $this->races = $vals['races'];
      }
      if (isset($vals['disabilities'])) {
        $this->disabilities = $vals['disabilities'];
      }
    }
  }

  public function getName() {
    return 'NSFDemographics';
  }

  public function read($input)
  {
    $xfer = 0;
    $fname = null;
    $ftype = 0;
    $fid = 0;
    $xfer += $input->readStructBegin($fname);
    while (true)
    {
      $xfer += $input->readFieldBegin($fname, $ftype, $fid);
      if ($ftype == TType::STOP) {
        break;
      }
      switch ($fid)
      {
        case 1:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->airavataInternalUserId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 2:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->gender);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 3:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->usCitizenship);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 4:
          if ($ftype == TType::LST) {
            $this->ethnicities = array();
            $_size0 = 0;
            $_etype3 = 0;
            $xfer += $input->readListBegin($_etype3, $_size0);
            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
            {
              $elem5 = null;
              $xfer += $input->readI32($elem5);
              $this->ethnicities []= $elem5;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 5:
          if ($ftype == TType::LST) {
            $this->races = array();
            $_size6 = 0;
            $_etype9 = 0;
            $xfer += $input->readListBegin($_etype9, $_size6);
            for ($_i10 = 0; $_i10 < $_size6; ++$_i10)
            {
              $elem11 = null;
              $xfer += $input->readI32($elem11);
              $this->races []= $elem11;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 6:
          if ($ftype == TType::LST) {
            $this->disabilities = array();
            $_size12 = 0;
            $_etype15 = 0;
            $xfer += $input->readListBegin($_etype15, $_size12);
            for ($_i16 = 0; $_i16 < $_size12; ++$_i16)
            {
              $elem17 = null;
              $xfer += $input->readI32($elem17);
              $this->disabilities []= $elem17;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        default:
          $xfer += $input->skip($ftype);
          break;
      }
      $xfer += $input->readFieldEnd();
    }
    $xfer += $input->readStructEnd();
    return $xfer;
  }

  public function write($output) {
    $xfer = 0;
    $xfer += $output->writeStructBegin('NSFDemographics');
    if ($this->airavataInternalUserId !== null) {
      $xfer += $output->writeFieldBegin('airavataInternalUserId', TType::STRING, 1);
      $xfer += $output->writeString($this->airavataInternalUserId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->gender !== null) {
      $xfer += $output->writeFieldBegin('gender', TType::STRING, 2);
      $xfer += $output->writeString($this->gender);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->usCitizenship !== null) {
      $xfer += $output->writeFieldBegin('usCitizenship', TType::I32, 3);
      $xfer += $output->writeI32($this->usCitizenship);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->ethnicities !== null) {
      if (!is_array($this->ethnicities)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('ethnicities', TType::LST, 4);
      {
        $output->writeListBegin(TType::I32, count($this->ethnicities));
        {
          foreach ($this->ethnicities as $iter18)
          {
            $xfer += $output->writeI32($iter18);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    if ($this->races !== null) {
      if (!is_array($this->races)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('races', TType::LST, 5);
      {
        $output->writeListBegin(TType::I32, count($this->races));
        {
          foreach ($this->races as $iter19)
          {
            $xfer += $output->writeI32($iter19);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    if ($this->disabilities !== null) {
      if (!is_array($this->disabilities)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('disabilities', TType::LST, 6);
      {
        $output->writeListBegin(TType::I32, count($this->disabilities));
        {
          foreach ($this->disabilities as $iter20)
          {
            $xfer += $output->writeI32($iter20);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    $xfer += $output->writeFieldStop();
    $xfer += $output->writeStructEnd();
    return $xfer;
  }

}

/**
 * * A structure holding the user profile and its child models.
 * *
 * * Notes:
 * *  The model does not include passwords as it is assumed an external identity provider is used to authenticate user.
 * *  References:
 * *     NSF Demographic Information - http://www.nsf.gov/pubs/2000/00form1225/00form1225.doc
 * *     LDAP Schema - https://tools.ietf.org/html/rfc4519
 * *     SCIM 2.0 - https://tools.ietf.org/html/rfc7643
 * *
 * * userModelVersion:
 * *  Version number of profile
 * *
 * * airavataInternalUserId:
 * *  internal to Airavata, not intended to be used outside of the Airavata platform or possibly by gateways
 * *  (that is, never shown to users), never reassigned, REQUIRED
 * *
 * * userId:
 * *  Externally assertable unique identifier. SAML (primarly in higher education, academic) tends to keep
 * *   user name less opaque. OpenID Connect maintains them to be opaque.
 * *
 * * firstName, middleName, lastName:
 * *  First and Last names as assertede by the user
 * *
 * * namePrefix, nameSuffix:
 * *  prefix and suffix to the users name as asserted by the user
 * *
 * * emails:
 * *   Email identifier are Verified, REQUIRED and MULTIVALUED
 * *
 * * userName:
 * *  Name-based identifiers can be multivalues. To keep it simple, Airavata will make it a string.
 * *   In the future these can be enumerated as:
 *     *   Official name (as asserted possibly by some external identity provider)
 *     *   Prefered name (as asserted or suggested by user directly)
 *     *   Components:
 *     *      givenName
 *     *      surname (familyName)
 *     *      displayName (often asserted by user to handle things like middle names, suffix, prefix, and the like)
 * *
 * * orcidId: ORCID ID - http://orcid.org/about/what-is-orcid)
 * *
 * * phones: Telephone MULTIVALUED
 * *
 * * country: Country of Residance
 * *
 * * nationality Countries of citizenship
 * *
 * * comments:
 * *   Free-form information (treated as opaque by Airavata and simply passed to resource).
 * *
 * * labeledURI:
 *   * Google Scholar, Web of Science, ACS, e.t.c
 * *
 * * timeZone:
 * *  User’s preferred timezone - IANA Timezone Databases - http://www.iana.org/time-zones.
 * *
 */
class UserProfile {
  static $_TSPEC;

  /**
   * @var string
   */
  public $userModelVersion = "1.0";
  /**
   * @var string
   */
  public $airavataInternalUserId = "DO_NOT_SET_AT_CLIENTS";
  /**
   * @var string
   */
  public $userId = null;
  /**
   * @var string
   */
  public $gatewayId = null;
  /**
   * @var string[]
   */
  public $emails = null;
  /**
   * @var string
   */
  public $firstName = null;
  /**
   * @var string
   */
  public $lastName = null;
  /**
   * @var string
   */
  public $middleName = null;
  /**
   * @var string
   */
  public $namePrefix = null;
  /**
   * @var string
   */
  public $nameSuffix = null;
  /**
   * @var string
   */
  public $orcidId = null;
  /**
   * @var string[]
   */
  public $phones = null;
  /**
   * @var string
   */
  public $country = null;
  /**
   * @var string[]
   */
  public $nationality = null;
  /**
   * @var string
   */
  public $homeOrganization = null;
  /**
   * @var string
   */
  public $orginationAffiliation = null;
  /**
   * @var int
   */
  public $creationTime = null;
  /**
   * @var int
   */
  public $lastAccessTime = null;
  /**
   * @var int
   */
  public $validUntil = null;
  /**
   * @var int
   */
  public $State = null;
  /**
   * @var string
   */
  public $comments = null;
  /**
   * @var string[]
   */
  public $labeledURI = null;
  /**
   * @var string
   */
  public $gpgKey = null;
  /**
   * @var string
   */
  public $timeZone = null;
  /**
   * @var \Airavata\Model\User\NSFDemographics
   */
  public $nsfDemographics = null;

  public function __construct($vals=null) {
    if (!isset(self::$_TSPEC)) {
      self::$_TSPEC = array(
        1 => array(
          'var' => 'userModelVersion',
          'type' => TType::STRING,
          ),
        2 => array(
          'var' => 'airavataInternalUserId',
          'type' => TType::STRING,
          ),
        3 => array(
          'var' => 'userId',
          'type' => TType::STRING,
          ),
        4 => array(
          'var' => 'gatewayId',
          'type' => TType::STRING,
          ),
        5 => array(
          'var' => 'emails',
          'type' => TType::LST,
          'etype' => TType::STRING,
          'elem' => array(
            'type' => TType::STRING,
            ),
          ),
        6 => array(
          'var' => 'firstName',
          'type' => TType::STRING,
          ),
        7 => array(
          'var' => 'lastName',
          'type' => TType::STRING,
          ),
        8 => array(
          'var' => 'middleName',
          'type' => TType::STRING,
          ),
        9 => array(
          'var' => 'namePrefix',
          'type' => TType::STRING,
          ),
        10 => array(
          'var' => 'nameSuffix',
          'type' => TType::STRING,
          ),
        11 => array(
          'var' => 'orcidId',
          'type' => TType::STRING,
          ),
        12 => array(
          'var' => 'phones',
          'type' => TType::LST,
          'etype' => TType::STRING,
          'elem' => array(
            'type' => TType::STRING,
            ),
          ),
        13 => array(
          'var' => 'country',
          'type' => TType::STRING,
          ),
        14 => array(
          'var' => 'nationality',
          'type' => TType::LST,
          'etype' => TType::STRING,
          'elem' => array(
            'type' => TType::STRING,
            ),
          ),
        15 => array(
          'var' => 'homeOrganization',
          'type' => TType::STRING,
          ),
        16 => array(
          'var' => 'orginationAffiliation',
          'type' => TType::STRING,
          ),
        17 => array(
          'var' => 'creationTime',
          'type' => TType::I64,
          ),
        18 => array(
          'var' => 'lastAccessTime',
          'type' => TType::I64,
          ),
        19 => array(
          'var' => 'validUntil',
          'type' => TType::I64,
          ),
        20 => array(
          'var' => 'State',
          'type' => TType::I32,
          ),
        21 => array(
          'var' => 'comments',
          'type' => TType::STRING,
          ),
        22 => array(
          'var' => 'labeledURI',
          'type' => TType::LST,
          'etype' => TType::STRING,
          'elem' => array(
            'type' => TType::STRING,
            ),
          ),
        23 => array(
          'var' => 'gpgKey',
          'type' => TType::STRING,
          ),
        24 => array(
          'var' => 'timeZone',
          'type' => TType::STRING,
          ),
        25 => array(
          'var' => 'nsfDemographics',
          'type' => TType::STRUCT,
          'class' => '\Airavata\Model\User\NSFDemographics',
          ),
        );
    }
    if (is_array($vals)) {
      if (isset($vals['userModelVersion'])) {
        $this->userModelVersion = $vals['userModelVersion'];
      }
      if (isset($vals['airavataInternalUserId'])) {
        $this->airavataInternalUserId = $vals['airavataInternalUserId'];
      }
      if (isset($vals['userId'])) {
        $this->userId = $vals['userId'];
      }
      if (isset($vals['gatewayId'])) {
        $this->gatewayId = $vals['gatewayId'];
      }
      if (isset($vals['emails'])) {
        $this->emails = $vals['emails'];
      }
      if (isset($vals['firstName'])) {
        $this->firstName = $vals['firstName'];
      }
      if (isset($vals['lastName'])) {
        $this->lastName = $vals['lastName'];
      }
      if (isset($vals['middleName'])) {
        $this->middleName = $vals['middleName'];
      }
      if (isset($vals['namePrefix'])) {
        $this->namePrefix = $vals['namePrefix'];
      }
      if (isset($vals['nameSuffix'])) {
        $this->nameSuffix = $vals['nameSuffix'];
      }
      if (isset($vals['orcidId'])) {
        $this->orcidId = $vals['orcidId'];
      }
      if (isset($vals['phones'])) {
        $this->phones = $vals['phones'];
      }
      if (isset($vals['country'])) {
        $this->country = $vals['country'];
      }
      if (isset($vals['nationality'])) {
        $this->nationality = $vals['nationality'];
      }
      if (isset($vals['homeOrganization'])) {
        $this->homeOrganization = $vals['homeOrganization'];
      }
      if (isset($vals['orginationAffiliation'])) {
        $this->orginationAffiliation = $vals['orginationAffiliation'];
      }
      if (isset($vals['creationTime'])) {
        $this->creationTime = $vals['creationTime'];
      }
      if (isset($vals['lastAccessTime'])) {
        $this->lastAccessTime = $vals['lastAccessTime'];
      }
      if (isset($vals['validUntil'])) {
        $this->validUntil = $vals['validUntil'];
      }
      if (isset($vals['State'])) {
        $this->State = $vals['State'];
      }
      if (isset($vals['comments'])) {
        $this->comments = $vals['comments'];
      }
      if (isset($vals['labeledURI'])) {
        $this->labeledURI = $vals['labeledURI'];
      }
      if (isset($vals['gpgKey'])) {
        $this->gpgKey = $vals['gpgKey'];
      }
      if (isset($vals['timeZone'])) {
        $this->timeZone = $vals['timeZone'];
      }
      if (isset($vals['nsfDemographics'])) {
        $this->nsfDemographics = $vals['nsfDemographics'];
      }
    }
  }

  public function getName() {
    return 'UserProfile';
  }

  public function read($input)
  {
    $xfer = 0;
    $fname = null;
    $ftype = 0;
    $fid = 0;
    $xfer += $input->readStructBegin($fname);
    while (true)
    {
      $xfer += $input->readFieldBegin($fname, $ftype, $fid);
      if ($ftype == TType::STOP) {
        break;
      }
      switch ($fid)
      {
        case 1:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->userModelVersion);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 2:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->airavataInternalUserId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 3:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->userId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 4:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->gatewayId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 5:
          if ($ftype == TType::LST) {
            $this->emails = array();
            $_size21 = 0;
            $_etype24 = 0;
            $xfer += $input->readListBegin($_etype24, $_size21);
            for ($_i25 = 0; $_i25 < $_size21; ++$_i25)
            {
              $elem26 = null;
              $xfer += $input->readString($elem26);
              $this->emails []= $elem26;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 6:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->firstName);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 7:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->lastName);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 8:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->middleName);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 9:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->namePrefix);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 10:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->nameSuffix);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 11:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->orcidId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 12:
          if ($ftype == TType::LST) {
            $this->phones = array();
            $_size27 = 0;
            $_etype30 = 0;
            $xfer += $input->readListBegin($_etype30, $_size27);
            for ($_i31 = 0; $_i31 < $_size27; ++$_i31)
            {
              $elem32 = null;
              $xfer += $input->readString($elem32);
              $this->phones []= $elem32;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 13:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->country);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 14:
          if ($ftype == TType::LST) {
            $this->nationality = array();
            $_size33 = 0;
            $_etype36 = 0;
            $xfer += $input->readListBegin($_etype36, $_size33);
            for ($_i37 = 0; $_i37 < $_size33; ++$_i37)
            {
              $elem38 = null;
              $xfer += $input->readString($elem38);
              $this->nationality []= $elem38;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 15:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->homeOrganization);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 16:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->orginationAffiliation);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 17:
          if ($ftype == TType::I64) {
            $xfer += $input->readI64($this->creationTime);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 18:
          if ($ftype == TType::I64) {
            $xfer += $input->readI64($this->lastAccessTime);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 19:
          if ($ftype == TType::I64) {
            $xfer += $input->readI64($this->validUntil);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 20:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->State);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 21:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->comments);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 22:
          if ($ftype == TType::LST) {
            $this->labeledURI = array();
            $_size39 = 0;
            $_etype42 = 0;
            $xfer += $input->readListBegin($_etype42, $_size39);
            for ($_i43 = 0; $_i43 < $_size39; ++$_i43)
            {
              $elem44 = null;
              $xfer += $input->readString($elem44);
              $this->labeledURI []= $elem44;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 23:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->gpgKey);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 24:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->timeZone);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 25:
          if ($ftype == TType::STRUCT) {
            $this->nsfDemographics = new \Airavata\Model\User\NSFDemographics();
            $xfer += $this->nsfDemographics->read($input);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        default:
          $xfer += $input->skip($ftype);
          break;
      }
      $xfer += $input->readFieldEnd();
    }
    $xfer += $input->readStructEnd();
    return $xfer;
  }

  public function write($output) {
    $xfer = 0;
    $xfer += $output->writeStructBegin('UserProfile');
    if ($this->userModelVersion !== null) {
      $xfer += $output->writeFieldBegin('userModelVersion', TType::STRING, 1);
      $xfer += $output->writeString($this->userModelVersion);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->airavataInternalUserId !== null) {
      $xfer += $output->writeFieldBegin('airavataInternalUserId', TType::STRING, 2);
      $xfer += $output->writeString($this->airavataInternalUserId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->userId !== null) {
      $xfer += $output->writeFieldBegin('userId', TType::STRING, 3);
      $xfer += $output->writeString($this->userId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->gatewayId !== null) {
      $xfer += $output->writeFieldBegin('gatewayId', TType::STRING, 4);
      $xfer += $output->writeString($this->gatewayId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->emails !== null) {
      if (!is_array($this->emails)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('emails', TType::LST, 5);
      {
        $output->writeListBegin(TType::STRING, count($this->emails));
        {
          foreach ($this->emails as $iter45)
          {
            $xfer += $output->writeString($iter45);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    if ($this->firstName !== null) {
      $xfer += $output->writeFieldBegin('firstName', TType::STRING, 6);
      $xfer += $output->writeString($this->firstName);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->lastName !== null) {
      $xfer += $output->writeFieldBegin('lastName', TType::STRING, 7);
      $xfer += $output->writeString($this->lastName);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->middleName !== null) {
      $xfer += $output->writeFieldBegin('middleName', TType::STRING, 8);
      $xfer += $output->writeString($this->middleName);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->namePrefix !== null) {
      $xfer += $output->writeFieldBegin('namePrefix', TType::STRING, 9);
      $xfer += $output->writeString($this->namePrefix);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->nameSuffix !== null) {
      $xfer += $output->writeFieldBegin('nameSuffix', TType::STRING, 10);
      $xfer += $output->writeString($this->nameSuffix);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->orcidId !== null) {
      $xfer += $output->writeFieldBegin('orcidId', TType::STRING, 11);
      $xfer += $output->writeString($this->orcidId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->phones !== null) {
      if (!is_array($this->phones)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('phones', TType::LST, 12);
      {
        $output->writeListBegin(TType::STRING, count($this->phones));
        {
          foreach ($this->phones as $iter46)
          {
            $xfer += $output->writeString($iter46);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    if ($this->country !== null) {
      $xfer += $output->writeFieldBegin('country', TType::STRING, 13);
      $xfer += $output->writeString($this->country);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->nationality !== null) {
      if (!is_array($this->nationality)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('nationality', TType::LST, 14);
      {
        $output->writeListBegin(TType::STRING, count($this->nationality));
        {
          foreach ($this->nationality as $iter47)
          {
            $xfer += $output->writeString($iter47);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    if ($this->homeOrganization !== null) {
      $xfer += $output->writeFieldBegin('homeOrganization', TType::STRING, 15);
      $xfer += $output->writeString($this->homeOrganization);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->orginationAffiliation !== null) {
      $xfer += $output->writeFieldBegin('orginationAffiliation', TType::STRING, 16);
      $xfer += $output->writeString($this->orginationAffiliation);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->creationTime !== null) {
      $xfer += $output->writeFieldBegin('creationTime', TType::I64, 17);
      $xfer += $output->writeI64($this->creationTime);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->lastAccessTime !== null) {
      $xfer += $output->writeFieldBegin('lastAccessTime', TType::I64, 18);
      $xfer += $output->writeI64($this->lastAccessTime);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->validUntil !== null) {
      $xfer += $output->writeFieldBegin('validUntil', TType::I64, 19);
      $xfer += $output->writeI64($this->validUntil);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->State !== null) {
      $xfer += $output->writeFieldBegin('State', TType::I32, 20);
      $xfer += $output->writeI32($this->State);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->comments !== null) {
      $xfer += $output->writeFieldBegin('comments', TType::STRING, 21);
      $xfer += $output->writeString($this->comments);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->labeledURI !== null) {
      if (!is_array($this->labeledURI)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('labeledURI', TType::LST, 22);
      {
        $output->writeListBegin(TType::STRING, count($this->labeledURI));
        {
          foreach ($this->labeledURI as $iter48)
          {
            $xfer += $output->writeString($iter48);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    if ($this->gpgKey !== null) {
      $xfer += $output->writeFieldBegin('gpgKey', TType::STRING, 23);
      $xfer += $output->writeString($this->gpgKey);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->timeZone !== null) {
      $xfer += $output->writeFieldBegin('timeZone', TType::STRING, 24);
      $xfer += $output->writeString($this->timeZone);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->nsfDemographics !== null) {
      if (!is_object($this->nsfDemographics)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('nsfDemographics', TType::STRUCT, 25);
      $xfer += $this->nsfDemographics->write($output);
      $xfer += $output->writeFieldEnd();
    }
    $xfer += $output->writeFieldStop();
    $xfer += $output->writeStructEnd();
    return $xfer;
  }

}

final class Constant extends \Thrift\Type\TConstant {
  static protected $USER_PROFILE_VERSION;

  static protected function init_USER_PROFILE_VERSION() {
    return "1.0";
  }
}


