ETH Price: $3,290.59 (-1.19%)
Gas: 4.55 Gwei

Token

Creation Engine Token (CET)
 

Overview

Max Total Supply

1,000 CET

Holders

9

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
63.76256423 CET

Value
$0.00
0x99a0105ef836f330c121dadbf8c316e60b68306b
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CreationEngine

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 15: CreationEngine.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

import './CreationEngineDAO.sol';
import './CreationEngineDApp.sol';

/// Creation Engine is a full suite ERC20 token compatible with all modern functionalities.
/// Staking, Farming, NFTs, DAO, DApps, Burn function, Governance. This token does it all.
/// Will you explore the stars with your very own Creation Engine?
/// t.me/CreationEngine
/// t.me/CreationEngineCommunity
///
///                                  ...,...                                  
///                             .......:o;........                               
///                         ..........;dko'............                         
///                    ...............cxdd:................                     
///                ..................;ol:oo,.................                 
///               ..................'lo,':oc...................               
///            .....................:o:..'co;....................             
///          ......................;ol'...,ol'.....................           
///        .......................,oo;,:c;,:dc'......................         
///       .......................,lo::ooool;cdc'......................        
///      ..............;,'......,odccol,,;oo:ldl'......';,..............      
///     ...............cddl:,...;lloddc,,;ldollc,..',cldd;..............      
///    .................:ddollc:;,,:ddddododd:,,;:llooxd;.................    
///    ..................:dl;;:lodlodllxOxcodllool:;;oo;..................    
///   ...................':dl,,:odlldooxkxlodcldl;';lo;....................   
///  ................';cc,':ddooxxoodxolcldddooxxoodo;',cc,................   
///  ............';clloodc,,ldl:oxl:coo:;:oo::odl:ldc,,ldollc:;'............  
///........';:cclllc:;:lddooooooddl:;:ooodo:;:oddooooloddl:;:cllccc:,'....... 
///.';:ccllllc:,'..;lolcclddoodddlloooodddoooolldddodddc:lloc,..';:cllllcc:;'.
///.,:cloollc:;'...;lolc:cddddddocloooddddooolccdxddddoc:cool,...,;cclloolc;'.
///.......',:cccccc:;;:lddooooooddl:;:odddl:;coddooooooddl:;;:cclcc:;,'...... 
///  ...........';:clllodc,;loc:odc;:oo:;col;;ldl:loc;,ldolllc:,'............ 
///   ...............,:ol,':ddooxxooddoc:cdxoldxxoodo;';ll:'................  
///   ...................':ol,,:ddcldooxxxoddcldo:,;oo;....................   
///   ...................:ol,,;lddoodllxOdcodlodoc;,;oo;...................   
///    .................:ddllllc:,,cddddddddo;,,:cllloxo;................     
///     ...............:ddoc;'.';cllddc;,;lddllc,..';coxd;...............     
///      .............':;,......;dxccol,';lo:lxl,......,:;..............      
///      ........................,oo::ooloo::dl'.......................       
///         ......................,ol,,cc:,;ol'.......................        
///          ......................;oc'...'lo,.....................           
///            .....................co;...co;.....................            
///             ....................'ol,';oc...................               
///                 .................:ol;lo,................                  
///                    ..............'ldddc...............                    
///                         ..........;dko,..........                         
///                             .  ....co:.....                               
///                                  ..';'..     
///
contract CreationEngine is CreationEngineDAO, CreationEngineDApp {

  /// @notice Declare a public constant of type string
  ///
  /// @return The smart contract author
  ///
  string public constant CREATOR = "t.me/CreationEngine";
}

File 1 of 15: Address.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

/// Know more: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol

library Address {
  function isContract(
    address account
  ) internal view returns (bool) {
    uint256 size;
    assembly { size := extcodesize(account) }
    return size > 0;
  }

  function sendValue(
    address payable recipient,
    uint256 amount
  ) internal {
    require(address(this).balance >= amount, "Address: insufficient balance");

    (bool success, ) = recipient.call{ value: amount }("");
    require(success, "Address: unable to send value, recipient may have reverted");
  }

  function functionCall(
    address target,
    bytes memory data
  ) internal returns (bytes memory) {
    return functionCall(target, data, "Address: low-level call failed");
  }

  function functionCall(
    address target,
    bytes memory data,
    string memory errorMessage
  ) internal returns (bytes memory) {
    return _functionCallWithValue(target, data, 0, errorMessage);
  }

  function functionCallWithValue(
    address target,
    bytes memory data,
    uint256 value
  ) internal returns (bytes memory) {
    return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
  }

  function functionCallWithValue(
    address target,
    bytes memory data,
    uint256 value,
    string memory errorMessage
  ) internal returns (bytes memory) {
    require(address(this).balance >= value, "Address: insufficient balance for call");
    return _functionCallWithValue(target, data, value, errorMessage);
  }

  function _functionCallWithValue(
    address target,
    bytes memory data,
    uint256 weiValue,
    string memory errorMessage
  ) private returns (bytes memory) {
    require(isContract(target), "Address: call to non-contract");

    (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
    if (success) {
      return returndata;
    } else {
      if (returndata.length > 0) {
        assembly {
          let returndata_size := mload(returndata)
          revert(add(32, returndata), returndata_size)
        }
      } else {
        revert(errorMessage);
      }
    }
  }
}

File 2 of 15: Burnable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

/// @title Burnable
///
/// @notice This contract covers everything related
/// to the burn functions
///
contract Burnable {
  /// @dev Declare a private bool {_burningEnabled}
  ///
  bool private _burningEnabled;

  /// @dev Declare a public constant of type bytes32
  ///
  /// @return The bytes32 string of the role
  ///
  bytes32 public constant ROLE_BURNER = keccak256("BURNER");

  /// @dev Declare two events to expose when burning
  /// is enabled or disabled, take the event's sender
  /// as argument
  ///
  event BurningEnabled(address indexed _from);
  event BurningDisabled(address indexed _from);

  /// @dev Verify if the sender can burn, if yes,
  /// enable burning
  /// 
  /// Requirements:
  /// {_hasRole} should be true
  /// {_amount} should be superior to 0
  /// {_burningEnabled} should be true
  ///
  modifier isBurnable(
    uint256 _amount,
    bool _hasRole
  ) {
    require(
      _hasRole,
      "BC:500"
    );

    require(
      _amount > 0,
      "BC:30"
    );

    _enableBurning();

    require(
      burningEnabled(),
      "BC:210"
    );
    _;
  }

  /// @dev By default, burning is disabled
  ///
  constructor()
  internal {
    _burningEnabled = false;
  }

  /// @notice Expose the state of {_burningEnabled}
  ///
  /// @return The state as a bool
  ///
  function burningEnabled()
  public view returns (bool) {
    return _burningEnabled;
  }

  /// @dev Enable burning by setting {_burningEnabled}
  /// to true, then emit the related event
  ///
  function _enableBurning()
  internal virtual {
    _burningEnabled = true;
    emit BurningEnabled(msg.sender);
  }

  /// @dev Disable burning by setting {_burningEnabled}
  /// to false, then emit the related event
  ///
  function _disableBurning()
  internal virtual {
    _burningEnabled = false;
    emit BurningDisabled(msg.sender);
  }
}

File 4 of 15: CreationEngineDAO.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

import './Voteable.sol';
import './CreationEngineDApp.sol';

/// @title CreationEngineDAO
///
/// @notice This contract covers everything related
/// to the organization of Creation Engine
///
/// @dev Inehrit {Voteable} and {CreationEngineToken}
///
abstract contract CreationEngineDAO is Voteable, CreationEngineToken {
  
  /// @notice ROLE_CHAIRPERSON is granted to the
  /// original contract deployer
  ///
  /// @dev See {Roleplay::grantRole()}
  ///
  constructor() public {
    grantRole(ROLE_CHAIRPERSON, msg.sender);
  }

  /// @notice This function allows the sender to vote
  /// for a proposal, the vote can be positive or negative.
  /// The sender has to complete the requirements to be
  /// able to vote for a proposal.
  ///
  /// @dev Depending on the value of {_isPositiveVote}, add a
  /// *positive/negative* vote to the proposal, identified
  /// by its {_id}, then push the sender address into the
  /// voters pool of the proposal
  ///
  /// Requirements:
  /// See {Voteable::isValidVoter()} 
  /// See {Voteable::isVoteEnabled()} 
  ///
  /// @param _id - Represent the proposal id
  /// @param _isPositiveVote - Represent the vote type
  ///
  function voteForProposal(
    uint256 _id,
    bool _isPositiveVote
  ) public virtual isValidVoter(
    _id,
    balanceOf(msg.sender)
  ) isVoteEnabled(
    _id
  ) {
    if (_isPositiveVote) {
      proposals[_id].positiveVote += 1;
      proposals[_id].positiveVoters.push(msg.sender);
    }

    if (!_isPositiveVote) {
      proposals[_id].negativeVote += 1;
      proposals[_id].negativeVoters.push(msg.sender);
    }
  }
}

File 5 of 15: CreationEngineDApp.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

import './Stakeable.sol';
import './Roleplay.sol';
import './CreationEngineToken.sol';

/// @title CreationEngineDApp
///
/// @notice This contract covers everything related
/// to the DApp of Creation Engine
///
/// @dev Inehrit {Stakeable} and {CreationEngineToken}
///
abstract contract CreationEngineDApp is Roleplay, Stakeable, CreationEngineToken {

  /// @notice This function allows the sender to stake
  /// an amount (maximum 10) of CreationEngineToken, when the
  /// token is staked, it is burned from the circulating
  /// supply and placed into the staking pool
  /// 
  /// @dev The function iterate through {stakeholders} to
  /// know if the sender is already a stakeholder. If the
  /// sender is already a stakeholder, then the requested amount
  /// is staked into the pool and then burned from the sender wallet.
  /// If the sender isn't a stakeholer, a new stakeholder is created,
  /// and then the function is recall to stake the requested amount
  ///
  /// Requirements:
  /// See {Stakeable::isAmountValid()}
  ///
  /// @param _amount - Represent the amount of token to be staked
  ///
  function stake(
    uint256 _amount
  ) public virtual isAmountValid(
    _amount,
    balanceOf(msg.sender)
  ) isAmountNotZero(
    _amount
  ) {
    uint256 i = 0;
    bool isStakeholder = false;
    uint256 len = stakeholders.length;
    while (i < len) {
      if (stakeholders[i].owner == msg.sender) {
        isStakeholder = true;
        break;
      }
      i++;
    }

    if (isStakeholder) {
      stakeholders[i].stake += _amount;
      _burn(msg.sender, (_amount * (10**8)));
      _totalStakedSupply += (_amount * (10**8));
      emit Staked(msg.sender, _amount);
    }

    if (!isStakeholder) {
      _createStakeholder(msg.sender);
      stake(_amount);
    }
  }
  
  /// @notice This function unstacks the sender staked
  /// balance depending on the requested {_amount}, if the
  /// {_amount} exceeded the staked supply of the sender,
  /// the whole staked supply of the sender will be unstacked
  /// and withdrawn to the sender wallet without exceeding it.
  ///
  /// @dev Like stake() function do, this function iterate
  /// over the stakeholders to identify if the sender is one 
  /// of them, in the case of the sender is identified as a
  /// stakeholder, then the {_amount} is minted to the sender
  /// wallet and sub from the staked supply.
  ///
  /// Requirements:
  /// See {Stakeable::isAmountNotZero}
  /// See {Stakeable::isAbleToUnstake}
  ///
  /// @param _amount - Represent the amount of token to be unstack
  ///
  function unstake(
    uint256 _amount
  ) public virtual isAmountNotZero(
    _amount
  ) isAbleToUnstake(
    _amount
  ) {
    uint256 i = 0;
    bool isStakeholder = false;
    uint256 len = stakeholders.length;
    while (i < len) {
      if (stakeholders[i].owner == msg.sender) {
        isStakeholder = true;
        break;
      }
      i++;
    }

    require(
      isStakeholder,
      "SC:650"
    );

    if (isStakeholder) {
      if (_amount <= stakeholders[i].stake) {
        stakeholders[i].stake -= _amount;
        _mint(msg.sender, (_amount * (10**8)));
        _totalStakedSupply -= (_amount * (10**8));
        emit Unstaked(msg.sender, _amount);
      }
    }
  }
  
  /// @notice This function allows the sender to compute
  /// his reward earned by staking {UnissouToken}. When you
  /// request a withdraw, the function updates the reward's
  /// value of the sender stakeholding onto the Ethereum
  /// blockchain, allowing him to spend the reward for NFTs.
  ///
  /// @dev The same principe as other functions is applied here,
  /// iteration over stakeholders, when found, execute the action.
  /// See {Stakeable::_computeReward()}
  ///
  function withdraw()
  public virtual {
    uint256 i = 0;
    bool isStakeholder = false;
    uint256 len = stakeholders.length;
    while (i < len) {
      if (stakeholders[i].owner == msg.sender) {
        isStakeholder = true;
        break;
      }
      i++;
    }

    require(
      isStakeholder,
      "SC:650"
    );

    if (isStakeholder) {
      _computeReward(i);
    }
  }

  /// @notice This function allows the owner to spend {_amount} 
  /// of the target rewards gained from his stake.
  ///
  /// @dev To reduce the potential numbers of transaction, the
  /// {_computeReward()} function is also executed into this function.
  ///
  /// @param _amount - Represent the amount of reward to spend
  /// @param _target - Represent the address of the stakeholder owner
  ///
  function spend(
    uint256 _amount,
    address _target
  ) public virtual onlyOwner() {
    uint256 i = 0;
    bool isStakeholder = false;
    uint256 len = stakeholders.length;
    while (i < len) {
      if (stakeholders[i].owner == _target) {
        isStakeholder = true;
        break;
      }
      i++;
    }

    require(
      isStakeholder,
      "SC:650"
    );

    if (isStakeholder) {
      _computeReward(i);
      require(
        _amount <= stakeholders[i].availableReward,
        "SC:660"
      );

      stakeholders[i].availableReward -= _amount;
      stakeholders[i].totalRewardSpent += _amount;
    }
  }
}

File 6 of 15: CreationEngineToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

import './ERC20.sol';
import './Roleplay.sol';
import './Pauseable.sol';
import './Mintable.sol';
import './Burnable.sol';

/// @title CreationEngineToken
///
/// @notice This contract covers everything related
/// to the Creation Engine ERC20
///
/// @dev Inehrit {ERC20}, {Roleplay}, {Pauseable},
/// {Mintable} and {Burnable}
///
abstract contract CreationEngineToken is 
ERC20, Roleplay, Pauseable, Minteable, Burnable {

  /// @notice Original contract's deployer are granted
  /// with Owner role and Manager role and the initial
  /// supply are minted onto his wallet.
  ///
  /// @dev See {ERC20}
  ///
  constructor()
  public ERC20(
    "Creation Engine Token",
    "CET",
    40000 * (10**8),
    1000 * (10**8)
  ) {
    _setupRole(ROLE_OWNER, msg.sender);
    _setupRole(ROLE_MANAGER, msg.sender);
    _mint(msg.sender, initialSupply());
  }
  
  /// @notice This function allows to transfer tokens to multiple
  /// addresses in only one transaction, that help to reduce fees.
  /// The amount cannot be dynamic and is constant for all transfer
  ///
  /// @param _receivers - Represent an array of address
  /// @param _amount - Represent the amount of token to transfer
  ///
  function transferBatch(
    address[] memory _receivers,
    uint256 _amount
  ) public virtual {
    uint256 i = 0;
    uint256 len = _receivers.length;

    require(
      balanceOf(msg.sender) >= (_amount * len),
      "UT:470"
    );

    while (i < len) {
      transfer(_receivers[i], _amount);
      i++;
    }
  } 

  /// @notice This function allows the sender to mint
  /// an {_amount} of token unless the {_amount}
  /// exceed the total supply cap
  ///
  /// @dev Once the minting is down, minting is disabled
  ///
  /// Requirements:
  /// See {Mintable::isMintable()}
  ///
  /// @param _amount - Represent the amount of token
  /// to be minted
  ///
  function mint(
    uint256 _amount
  ) public virtual isMintable(
    _amount,
    hasRole(ROLE_MINTER, msg.sender)
  ) {
    _mint(msg.sender, _amount);
    _disableMinting();
  }

  /// @notice This function allows the sender to mint
  /// an {_amount} of token directly onto the address {_to}
  /// unless the {_amount} exceed the total supply cap
  ///
  /// @dev Once the minting is down, minting is disabled
  ///
  /// Requirements:
  /// See {Minteable::isMinteable()}
  ///
  /// @param _to - Represent the token's receiver
  /// @param _amount - Represent the amount of token
  /// to be minted
  ///
  function mintTo(
    address _to,
    uint256 _amount
  ) public virtual isMintable(
    _amount,
    hasRole(ROLE_MINTER, msg.sender)
  ) {
    _mint(_to, _amount);
    _disableMinting();
  }

  /// @notice This function allows the sender to burn
  /// an {_amount} of token
  ///
  /// @dev Once the burning is down, burning is disabled
  ///
  /// Requirements:
  /// See {Burneable::isBurneable()}
  ///
  /// @param _amount - Represent the amount of token
  /// to be burned
  ///
  function burn(
    uint256 _amount
  ) public virtual isBurnable(
    _amount,
    hasRole(ROLE_BURNER, msg.sender)
  ) {
    _burn(msg.sender, _amount);
    _disableBurning();
  }

  /// @notice This function allows the sender to burn
  /// an {_amount} of token directly from the address {_from}
  /// only if the token allowance is superior or equal
  /// to the requested {_amount}
  ///
  /// @dev Once the burning is down, burning is disabled
  ///
  /// Requirements:
  /// See {Burneable::isBurneable()}
  ///
  /// @param _from - Represent the token's receiver
  /// @param _amount - Represent the amount of token
  /// to be burned
  ///
  function burnFrom(
    address _from,
    uint256 _amount
  ) public virtual isBurnable(
    _amount,
    hasRole(ROLE_BURNER, msg.sender)
  ) {
    uint256 decreasedAllowance = allowance(_from, msg.sender).sub(_amount);
    _approve(_from, msg.sender, decreasedAllowance);
    _burn(_from, _amount);
    _disableBurning();
  }

  /// @notice This function does verification before
  /// any token transfer. The actual verification are:
  /// - If the total supply don't exceed the total
  /// supply cap (for example, when token are minted),
  /// - If the token's transfer are not paused
  ///
  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 amount
  ) internal virtual override {
    super._beforeTokenTransfer(from, to, amount);

    if (from == address(0)) {
      require(
        totalSupply().add(amount) <= totalSupplyCap(),
        "UT:20"
      );
    }

    require(
      !paused(),
      "UT:400"
    );
  }
}

File 7 of 15: EnumerableSet.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

/// Know more: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/EnumerableSet.sol

library EnumerableSet {
  struct Set {
    bytes32[] _values;
    mapping (bytes32 => uint256) _indexes;
  }

  function _add(
    Set storage set,
    bytes32 value
  ) private returns (bool) {
    if (!_contains(set, value)) {
      set._values.push(value);
      set._indexes[value] = set._values.length;
      return true;
    } else {
      return false;
    }
  }

  function _remove(
    Set storage set,
    bytes32 value
  ) private returns (bool) {
    uint256 valueIndex = set._indexes[value];

    if (valueIndex != 0) {
      uint256 toDeleteIndex = valueIndex - 1;
      uint256 lastIndex = set._values.length - 1;
      bytes32 lastvalue = set._values[lastIndex];
      set._values[toDeleteIndex] = lastvalue;
      set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
      set._values.pop();
      delete set._indexes[value];
      return true;
    } else {
      return false;
    }
  }

  function _contains(
    Set storage set,
    bytes32 value
  ) private view returns (bool) {
    return set._indexes[value] != 0;
  }

  function _length(
    Set storage set
  ) private view returns (uint256) {
    return set._values.length;
  }

  function _at(
    Set storage set,
    uint256 index
  ) private view returns (bytes32) {
    require(set._values.length > index, "EnumerableSet: index out of bounds");
    return set._values[index];
  }

  struct AddressSet {
    Set _inner;
  }

  function add(
    AddressSet storage set,
    address value
  ) internal returns (bool) {
    return _add(set._inner, bytes32(uint256(value)));
  }

  function remove(
    AddressSet storage set,
    address value
  ) internal returns (bool) {
    return _remove(set._inner, bytes32(uint256(value)));
  }

  function contains(
    AddressSet storage set,
    address value
  ) internal view returns (bool) {
    return _contains(set._inner, bytes32(uint256(value)));
  }

  function length(
    AddressSet storage set
  ) internal view returns (uint256) {
    return _length(set._inner);
  }

  function at(
    AddressSet storage set,
    uint256 index
  ) internal view returns (address) {
    return address(uint256(_at(set._inner, index)));
  }

  struct UintSet {
    Set _inner;
  }

  function add(
    UintSet storage set,
    uint256 value
  ) internal returns (bool) {
    return _add(set._inner, bytes32(value));
  }

  function remove(
    UintSet storage set,
    uint256 value
  ) internal returns (bool) {
    return _remove(set._inner, bytes32(value));
  }

  function contains(
    UintSet storage set,
    uint256 value
  ) internal view returns (bool) {
    return _contains(set._inner, bytes32(value));
  }

  function length(
    UintSet storage set
  ) internal view returns (uint256) {
    return _length(set._inner);
  }

  function at(
    UintSet storage set,
    uint256 index
  ) internal view returns (uint256) {
    return uint256(_at(set._inner, index));
  }
}

File 8 of 15: ERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

import "./IERC20.sol";
import "./SafeMath.sol";
import "./Address.sol";

/// Know more: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol

abstract contract ERC20 is IERC20 {
  using SafeMath for uint256;
  using Address for address;

  mapping (address => uint256) private _balances;

  mapping (address => mapping (address => uint256)) private _allowances;

  uint256 private _initialSupply;
  uint256 private _totalSupply;
  uint256 private _totalSupplyCap;

  string private _name;
  string private _symbol;
  uint8 private _decimals;

  constructor (
    string memory name,
    string memory symbol,
    uint256 totalSupplyCap,
    uint256 initialSupply
  ) public {
    _decimals = 8;

    _name = name;
    _symbol = symbol;
    _totalSupplyCap = totalSupplyCap;
    _initialSupply = initialSupply;
  }

  function name()
  public view returns (string memory) {
    return _name;
  }

  function symbol()
  public view returns (string memory) {
    return _symbol;
  }

  function decimals()
  public view returns (uint8) {
    return _decimals;
  }

  function initialSupply()
  public view override returns (uint256) {
    return _initialSupply;
  }

  function totalSupply()
  public view override returns (uint256) {
    return _totalSupply;
  }

  function totalSupplyCap()
  public view override returns (uint256) {
    return _totalSupplyCap;
  }

  function balanceOf(
    address account
  ) public view override returns (uint256) {
    return _balances[account];
  }

  function transfer(
    address recipient,
    uint256 amount
  ) public virtual override returns (bool) {
    _transfer(msg.sender, recipient, amount);
    return true;
  }

  function allowance(
    address owner,
    address spender
  ) public view virtual override returns (uint256) {
    return _allowances[owner][spender];
  }

  function approve(
    address spender,
    uint256 amount
  ) public virtual override returns (bool) {
    _approve(msg.sender, spender, (amount * (10**8)));
    return true;
  }

  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) public virtual override returns (bool) {
    _transfer(sender, recipient, amount);
    _approve(sender, msg.sender, _allowances[sender][msg.sender].sub((amount * (10**8)), "ERC20:490"));
    return true;
  }

  function increaseAllowance(
    address spender,
    uint256 addedValue
  ) public virtual returns (bool) {
    _approve(msg.sender, spender, _allowances[msg.sender][spender].add((addedValue * (10**8))));
    return true;
  }

  function decreaseAllowance(
    address spender,
    uint256 subtractedValue
  ) public virtual returns (bool) {
    _approve(msg.sender, spender, _allowances[msg.sender][spender].sub((subtractedValue * (10**8)), "ERC20:495"));
    return true;
  }

  function _transfer(
    address sender,
    address recipient,
    uint256 amount
  ) internal virtual {
    require(
      sender != address(0),
      "ERC20:410"
    );

    require(
      recipient != address(0),
      "ERC20:420"
    );

    require(
      amount > 0,
      "ERC20:480"
    );

    _beforeTokenTransfer(sender, recipient, amount);

    _balances[sender] = _balances[sender].sub(amount, "ERC20:470");
    _balances[recipient] = _balances[recipient].add(amount);
    emit Transfer(sender, recipient, amount);
  }

  function _mint(
    address account,
    uint256 amount
  ) internal virtual {
    require(
      account != address(0),
      "ERC20:120"
    );

    _beforeTokenTransfer(address(0), account, amount);

    _totalSupply = _totalSupply.add(amount);
    _balances[account] = _balances[account].add(amount);
    emit Transfer(address(0), account, amount);
  }

  function _burn(
    address account,
    uint256 amount
  ) internal virtual {
    require(
      account != address(0),
      "ERC20:220"
    );

    _beforeTokenTransfer(account, address(0), amount);

    _balances[account] = _balances[account].sub(amount, "ERC20:230");
    _totalSupply = _totalSupply.sub(amount);
    emit Transfer(account, address(0), amount);
  }

  function _approve(
    address owner,
    address spender,
    uint256 amount
  ) internal virtual {
    require(
      owner != address(0),
      "ERC20:450"
    );
    require(
      spender != address(0),
      "ERC20:460"
    );

    _allowances[owner][spender] = amount;
    emit Approval(owner, spender, amount);
  }

  function _setupDecimals(
    uint8 decimals_
  ) internal {
    _decimals = decimals_;
  }

  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 amount
  ) internal virtual {}
}

File 9 of 15: IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

/// Know more: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol

interface IERC20 {
  function initialSupply()
  external view returns (uint256);

  function totalSupply()
  external view returns (uint256);

  function totalSupplyCap()
  external view returns (uint256);

  function balanceOf(
    address account
  ) external view returns (uint256);

  function transfer(
    address recipient,
    uint256 amount
  ) external returns (bool);

  function allowance(
    address owner,
    address spender
  ) external view returns (uint256);

  function approve(
    address spender,
    uint256 amount
  ) external returns (bool);

  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) external returns (bool);

  event Transfer(
    address indexed from,
    address indexed to,
    uint256 value
  );

  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

File 10 of 15: Mintable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

/// @title Mintable
///
/// @notice This contract covers everything related
/// to the mint functions
///
contract Minteable {
  /// @dev Declare a private bool {_mintingEnabled}
  ///
  bool private _mintingEnabled;

  /// @dev Declare a public constant of type bytes32
  ///
  /// @return The bytes32 string of the role
  ///
  bytes32 public constant ROLE_MINTER = keccak256("MINTER");

  /// @dev Declare two events to expose when minting
  /// is enabled or disabled, take the event's sender
  /// as argument
  ///
  event MintingEnabled(address indexed _from);
  event MintingDisabled(address indexed _from);

  /// @dev Verify if the sender can mint, if yes,
  /// enable minting
  /// 
  /// Requirements:
  /// {_hasRole} should be true
  /// {_amount} should be superior to 0
  /// {_mintingEnabled} should be true
  ///
  modifier isMintable(
    uint256 _amount,
    bool _hasRole
  ) {
    require(
      _hasRole,
      "MC:500"
    );

    require(
      _amount > 0,
      "MC:30"
    );

    _enableMinting();

    require(
      mintingEnabled(),
      "MC:110"
    );
    _;
  }

  /// @dev By default, minting is disabled
  ///
  constructor()
  internal {
    _mintingEnabled = false;
  }

  /// @notice Expose the state of {_mintingEnabled}
  ///
  /// @return The state as a bool
  ///
  function mintingEnabled()
  public view returns (bool) {
    return _mintingEnabled;
  }

  /// @dev Enable minting by setting {_mintingEnabled}
  /// to true, then emit the related event
  ///
  function _enableMinting()
  internal virtual {
    _mintingEnabled = true;
    emit MintingEnabled(msg.sender);
  }

  /// @dev Disable minting by setting {_mintingEnabled}
  /// to false, then emit the related event
  ///
  function _disableMinting()
  internal virtual {
    _mintingEnabled = false;
    emit MintingDisabled(msg.sender);
  }
}

File 11 of 15: Pauseable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

import './Roleplay.sol';

/// @title Pauseable
///
/// @notice This contract covers everything related
/// to the pause functions
///
/// @dev Inehrit {Roleplay}
///
contract Pauseable is Roleplay {
  /// @dev Declare a private bool {_paused}
  ///
  bool private _paused;
  
  /// @dev Declare two events to expose when pause
  /// is enabled or disabled, take the event's sender
  /// as argument
  ///
  event Paused(address indexed _from);
  event Unpaused(address indexed _from);

  /// @dev Verify if the contract is not paused
  /// 
  /// Requirements:
  /// {_paused} should be false
  ///
  modifier whenNotPaused() {
    require(
      !_paused,
      "PC:300"
    );
    _;
  }

  /// @dev Verify if the contract is paused
  /// 
  /// Requirements:
  /// {_paused} should be true
  ///
  modifier whenPaused() {
    require(
      _paused,
      "PC:310"
    );
    _;
  }

  /// @dev By default, pause is disabled
  ///
  constructor ()
  internal {
    _paused = false;
  }

  /// @notice Expose the state of {_paused}
  ///
  /// @return The state as a bool
  ///
  function paused()
  public view returns (bool) {
    return _paused;
  }
  
  /// @dev Enable pause by setting {_paused}
  /// to true, then emit the related event
  ///
  function pause()
  public virtual whenNotPaused() onlyOwner() {
    _paused = true;
    emit Paused(msg.sender);
  }

  /// @dev Disable pause by setting {_paused}
  /// to false, then emit the related event
  ///
  function unpause()
  public virtual whenPaused() onlyOwner() {
    _paused = false;
    emit Unpaused(msg.sender);
  }
}

File 12 of 15: Roleplay.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

import "./EnumerableSet.sol";

/// @title Roleplay
///
/// @notice This contract covers most functions about
/// role and permission's managment
///
abstract contract Roleplay {
  using EnumerableSet for EnumerableSet.AddressSet;

  /// @dev Structure declaration of {RoleData} data model
  ///
  struct RoleData {
    EnumerableSet.AddressSet members;
    bytes32 ownerRole;
  }

  mapping (bytes32 => RoleData) private _roles;

  /// @dev Declare a public constant of type bytes32
  ///
  /// @return The bytes32 string of the role
  ///
  bytes32 public constant ROLE_OWNER = 0x00;

  /// @dev Declare a public constant of type bytes32
  ///
  /// @return The bytes32 string of the role
  ///
  bytes32 public constant ROLE_MANAGER = keccak256("MANAGER");

  /// @dev Declare two events to expose role
  /// modifications
  ///
  event RoleGranted(bytes32 indexed _role, address indexed _from, address indexed _sender);
  event RoleRevoked(bytes32 indexed role, address indexed _from, address indexed _sender);

  /// @dev Verify if the sender have Owner's role
  /// 
  /// Requirements:
  /// {_hasRole()} should be true
  ///
  modifier onlyOwner() {
    require(
      hasRole(ROLE_OWNER, msg.sender),
      "RPC:500"
    );
    _;
  }

  /// @notice This function verify is the {_account}
  /// has role {_role}
  ///
  /// @param _role - The bytes32 string of the role
  /// @param _account - The address to verify
  ///
  /// @return true/false depending the result 
  ///
  function hasRole(
    bytes32 _role,
    address _account
  ) public view returns (bool) {
    return _roles[_role].members.contains(_account);
  }

  /// @notice Expose the length of members[] for
  /// a given {_role}
  ///
  /// @param _role - The bytes32 string of the role
  ///
  /// @return - The length of members
  ///
  function getRoleMembersLength(
    bytes32 _role
  ) public view returns (uint256) {
    return _roles[_role].members.length();
  }


  /// @notice Expose the member address for
  /// a given {_role} at the {_id} index
  ///
  /// @param _id - Index to watch for
  /// @param _role - The bytes32 string of the role
  ///
  /// @return - The address of the member at {_id} index
  ///
  function exposeRoleMember(
    bytes32 _role,
    uint256 _id
  ) public view returns (address) {
    return _roles[_role].members.at(_id);
  }

  /// @notice This function allow the current Owner
  /// to transfer his ownership
  ///
  /// @dev Requirements:
  /// See {Roleplay::onlyOwner()}
  ///
  /// @param _to - Represent address of the receiver
  ///
  function transferOwnerRole(
    address _to
  ) public virtual onlyOwner() {
    _grantRole(ROLE_OWNER, _to);
    _revokeRole(ROLE_OWNER, msg.sender);
  }

  /// @notice This function allow the current Owner
  /// to give the Manager Role to {_to} address
  ///
  /// @dev Requirements:
  /// See {Roleplay::onlyOwner()}
  ///
  /// @param _to - Represent address of the receiver
  ///
  function grantManagerRole(
    address _to
  ) public virtual onlyOwner() {
    _grantRole(ROLE_MANAGER, _to);
  }

  /// @notice This function allow a Manager to grant
  /// role to a given address, it can't grant Owner role
  ///
  /// @dev Requirements:
  /// {_hasRole()} should be true
  /// {_role} should be different of ROLE_OWNER
  ///
  /// @param _role - The bytes32 string of the role
  /// @param _to - Represent address of the receiver
  ///
  function grantRole(
    bytes32 _role,
    address _to
  ) public virtual {
    require(
      hasRole(ROLE_MANAGER, msg.sender),
      "RPC:510"
    );

    require(
      _role != ROLE_OWNER,
      "RPC:520"
    );

    if (!hasRole(ROLE_OWNER, msg.sender)) {
      require(
        _role == keccak256("CHAIRPERSON"),
        "RPC:530"
      );
    }

    _grantRole(_role, _to);
  }

  /// @notice This function allow a Manager to revoke
  /// role to a given address, it can't revoke Owner role
  ///
  /// @dev Requirements:
  /// {_hasRole()} should be true
  /// {_role} should be different of ROLE_OWNER
  ///
  /// @param _role - The bytes32 string of the role
  /// @param _to - Represent address of the receiver
  ///
  function revokeRole(
    bytes32 _role,
    address _to
  ) public virtual {
    require(
      hasRole(ROLE_MANAGER, msg.sender),
      "RPC:550"
    );

    require(
      _role != ROLE_OWNER,
      "RPC:540"
    );

    if (!hasRole(ROLE_OWNER, msg.sender)) {
      require(
        _role == keccak256("CHAIRPERSON"),
        "RPC:530"
      );
    }

    _revokeRole(_role, _to);
  }

  /// @notice This function allow anyone to revoke his
  /// own role, even an Owner, use it carefully!
  ///
  /// @param _role - The bytes32 string of the role
  ///
  function renounceRole(
    bytes32 _role
  ) public virtual {
    require(
      _role != ROLE_OWNER,
      "RPC:540"
    );

    require(
      hasRole(_role, msg.sender),
      "RPC:570"
    );

    _revokeRole(_role, msg.sender);
  }

  function _setupRole(
    bytes32 _role,
    address _to
  ) internal virtual {
    _grantRole(_role, _to);
  }

  function _grantRole(
    bytes32 _role,
    address _to
  ) private {
    if (_roles[_role].members.add(_to)) {
      emit RoleGranted(_role, _to, msg.sender);
    }
  }

  function _revokeRole(
    bytes32 _role,
    address _to
  ) private {
    if (_roles[_role].members.remove(_to)) {
      emit RoleRevoked(_role, _to, msg.sender);
    }
  }
}

File 13 of 15: SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

/// Know more: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol

library SafeMath {
  function add(
    uint256 a,
    uint256 b
  ) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, "SafeMath: addition overflow");

    return c;
  }

  function sub(
    uint256 a,
    uint256 b
  ) internal pure returns (uint256) {
    return sub(a, b, "SafeMath: subtraction overflow");
  }

  function sub(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b <= a, errorMessage);
    uint256 c = a - b;

    return c;
  }

  function mul(
    uint256 a,
    uint256 b
  ) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b, "SafeMath: multiplication overflow");

    return c;
  }

  function div(
    uint256 a,
    uint256 b
  ) internal pure returns (uint256) {
    return div(a, b, "SafeMath: division by zero");
  }

  function div(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b > 0, errorMessage);
    uint256 c = a / b;

    return c;
  }

  function mod(
    uint256 a,
    uint256 b
  ) internal pure returns (uint256) {
    return mod(a, b, "SafeMath: modulo by zero");
  }

  function mod(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b != 0, errorMessage);
    return a % b;
  }
}

File 14 of 15: Stakeable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

import './Roleplay.sol';

/// @title Stakeable
///
/// @notice This contract covers most functions about
/// staking and rewards
///
abstract contract Stakeable is Roleplay {
  /// @dev Declare an internal variable of type uint256
  ///
  uint256 internal _totalStakedSupply;

  /// @dev Declare an internal variable of type uint256
  ///
  uint256 internal _maxRewardRatio;
  
  /// @dev Structure declaration of {Stakeholder} data model
  ///
  struct Stakeholder {
    address owner;
    uint256 stake;
    uint256 availableReward;
    uint256 totalRewardEarned;
    uint256 totalRewardSpent;
    uint256 createdAt;
    uint256 lastRewardCalculatedAt;
  }

  /// @dev Declare two events to expose when stake
  /// or unstake is requested, take the event's
  /// sender as argument and the requested amount
  ///
  event Staked(address indexed _from, uint256 _amount);
  event Unstaked(address indexed _from, uint256 _amount);

  /// @dev Declare an array of {Stakeholder}
  ///
  Stakeholder[] stakeholders;
  
  /// @dev Verify if the amount is superior to 0
  /// 
  /// Requirements:
  /// {_amount} should be superior to 0
  ///
  /// @param _amount - Represent the requested amount
  ///
  modifier isAmountNotZero(uint256 _amount) {
    require(
      _amount > 0,
      "SC:630"
    );
    _;
  }

  /// @dev Verify if the amount is a valid amount
  /// 
  /// Requirements:
  /// {_amount} should be inferior or equal to 10
  ///
  /// @param _amount - Represent the requested amount
  /// @param _balance - Represent the sender balance
  ///
  modifier isAmountValid(uint256 _amount, uint256 _balance) {
    require(
      (_amount * (10**8)) <= _balance,
      "SC:640"
    );
    _;
  }

  /// @dev Verify if the amount is a valid amount to unstake
  /// 
  /// Requirements:
  /// {_amount} should be inferior or equal to staked value
  ///
  /// @param _amount - Represent the requested amount
  ///
  modifier isAbleToUnstake(uint256 _amount) {
    Stakeholder memory stakeholder = exposeStakeholder(msg.sender); 
    require(
      _amount <= stakeholder.stake,
      "SC:640"
    );
    _;
  }

  constructor() public {
    _maxRewardRatio = 10;
  }

  /// @notice Expose the total staked supply
  ///
  /// @return The uint256 value of {_totalStakedSupply}
  ///
  function totalStakedSupply()
  public view returns (uint256) {
    return _totalStakedSupply;
  }

  /// @notice Expose the max reward ratio
  ///
  /// @return The uint256 value of {_maxRewardRatio}
  ///
  function maxRewardRatio()
  public view returns (uint256) {
    return _maxRewardRatio;
  }

  /// @notice Expose every Stakeholders
  ///
  /// @return A tuple of Stakeholders
  ///
  function exposeStakeholders()
  public view returns (Stakeholder[] memory) {
    return stakeholders;
  }

  /// @notice Expose a Stakeholder from the Owner address
  ///
  /// @param _owner - Represent the address of the stakeholder owner
  ///
  /// @return A tuple of Stakeholder
  ///
  function exposeStakeholder(
    address _owner
  ) public view returns (Stakeholder memory) {
    uint256 i = 0;
    uint256 len = stakeholders.length;
    while (i < len) {
      if (stakeholders[i].owner == _owner) {
        return stakeholders[i];
      }
      i++;
    }
  }

  /// @notice Set the {_maxRewardRatio}
  ///
  /// @dev Only owner can use this function
  ///
  /// @param _amount - Represent the requested ratio
  ///
  function setMaxRewardRatio(
    uint256 _amount
  ) public virtual onlyOwner() {
    _maxRewardRatio = _amount;
  }

  /// @notice Create a new {Stakeholder}
  ///
  /// @dev Owner is the sender
  ///
  /// @param _owner - Represent the owner of the Stakeholder
  ///
  function _createStakeholder(
    address _owner
  ) internal virtual {
    stakeholders.push(Stakeholder({
      owner: _owner,
      stake: 0,
      createdAt: now,
      availableReward: 0,
      totalRewardEarned: 0,
      totalRewardSpent: 0,
      lastRewardCalculatedAt: 0
    }));
  }

  /// @notice This function compute the reward gained from staking
  /// CreationEngineToken
  ///
  /// @dev The calculation is pretty simple, a {Stakeholder}
  /// holds the date of the {Stakeholder}'s creation. If the
  /// reward hasn't been computed since the creation, the
  /// algorithm will calculate them based on the number of
  /// days passed since the creation of the stakeholding.
  /// Then the calculation's date will be saved onto the
  /// {Stakeholder} and when {_computeReward} will be called
  /// again, the reward calculation will take this date in 
  /// consideration to compute the reward.
  /// 
  /// The actual ratio is 1 Stake = 1 Reward.
  /// With a maximum of 10 tokens per stake,
  /// you can obtain a total of 10 rewards per day
  ///
  /// @param _id - Represent the Stakeholder index
  ///
  function _computeReward(
    uint256 _id
  ) internal virtual {
    uint256 stake = stakeholders[_id].stake;
    uint256 lastCalculatedReward = stakeholders[_id].lastRewardCalculatedAt;
    uint256 createdAt = stakeholders[_id].createdAt;

    if (lastCalculatedReward == 0) {
      if (createdAt < now) {
        if ((now - createdAt) >= 1 days) {
          stakeholders[_id].availableReward += (((now - createdAt) / 1 days) * (
            stake <= _maxRewardRatio ?
            stake : _maxRewardRatio
          ));
          stakeholders[_id].totalRewardEarned += (((now - createdAt) / 1 days) * (
            stake <= _maxRewardRatio ?
            stake : _maxRewardRatio
          ));
          stakeholders[_id].lastRewardCalculatedAt = now;
          return;
        }
      }
    }

    if (lastCalculatedReward != 0) {
      if (lastCalculatedReward < now) {
        if ((now - lastCalculatedReward) >= 1 days) {
          stakeholders[_id].availableReward += (((now - lastCalculatedReward) / 1 days) * (
            stake <= _maxRewardRatio ?
            stake : _maxRewardRatio
          ));
          stakeholders[_id].totalRewardEarned += (((now - lastCalculatedReward) / 1 days) * (
            stake <= _maxRewardRatio ?
            stake : _maxRewardRatio
          ));
          stakeholders[_id].lastRewardCalculatedAt = now;
          return;
        }
      }
    }
  }
}

File 15 of 15: Voteable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

import './Roleplay.sol';

/// @title Voteable
///
/// @notice This contract covers most functions about
/// proposals and votings
///
/// @dev Inehrit {Roleplay}
///
abstract contract Voteable is Roleplay {
  /// @dev Declare an internal variable of type uint256
  ///
  uint256 internal _minVoteBalance;

  /// @dev Structure declaration of {Proposal} data model
  ///
  struct Proposal {
    address creator;
    string name;
    string metadataURI;
    bool votingEnabled;
    uint256 positiveVote;
    uint256 negativeVote;
    address[] positiveVoters;
    address[] negativeVoters;
  }

  /// @dev Declare a public constant of type bytes32
  ///
  /// @return The bytes32 string of the role
  ///
  bytes32 public constant ROLE_CHAIRPERSON = keccak256("CHAIRPERSON");

  /// @dev Declare an array of {Proposal}
  ///
  Proposal[] proposals;

  /// @dev Verify if the sender have the chairperson role
  /// 
  /// Requirements:
  /// {_hasRole} should be true
  ///
  modifier isChairperson() {
    require(
      hasRole(ROLE_CHAIRPERSON, msg.sender),
      "VC:500"
    );
    _;
  }

  /// @dev Verify if the sender is a valid voter
  ///
  /// Requirements:
  /// {_balance} should be superior to 1
  /// {_voter} should haven't already voted
  ///
  /// @param _id - Represent the proposal index
  /// @param _balance - Represent the sender balance
  ///
  modifier isValidVoter(
    uint256 _id,
    uint256 _balance
  ) {
    require(
      _balance >= (_minVoteBalance * (10**8)),
      "VC:1010"
    );

    bool positiveVote = _checkSenderHasVoted(proposals[_id].positiveVoters, msg.sender);
    bool negativeVote = _checkSenderHasVoted(proposals[_id].negativeVoters, msg.sender);

    require(
      !positiveVote && !negativeVote,
      "VC:1020"
    );
    _;
  }

  /// @dev Verify if the proposal have voting enabled
  ///
  /// Requirements:
  /// {proposals[_id]} should have voting enabled
  ///
  /// @param _id - Represent the proposal index
  ///
  modifier isVoteEnabled(
    uint256 _id
  ) {
    require(
      proposals[_id].votingEnabled,
      "VC:1030"
    );
    _;
  }

  constructor() public {
    _minVoteBalance = 100;
  }

  /// @notice Expose the min balance required to vote
  ///
  /// @return The uint256 value of {_minVoteBalance}
  ///
  function minVoteBalance()
  public view returns (uint256) {
    return _minVoteBalance;
  }

  /// @notice Set the {_minVoteBalance}
  ///
  /// @dev Only owner can use this function
  ///
  /// @param _amount - Represent the requested ratio
  ///
  function setMinVoteBalance(
    uint256 _amount
  ) public virtual onlyOwner() {
    _minVoteBalance = _amount;
  }

  /// @notice Allow a chairperson to create a new {Proposal}
  ///
  /// @dev Sender should be a chairperson
  ///
  /// Requirements:
  /// See {Voteable::isChairperson()}
  ///
  /// @param _name - Represent the Proposal name
  /// @param _uri - Represent the Proposal metadata uri
  /// @param _enable - Represent if vote is enable/disable
  ///
  function createProposal(
    string memory _name,
    string memory _uri,
    bool _enable
  ) public virtual isChairperson() {
    proposals.push(
      Proposal({
        creator: msg.sender,
        name: _name,
        metadataURI: _uri,
        votingEnabled: _enable,
        positiveVote: 0,
        negativeVote: 0,
        positiveVoters: new address[](0),
        negativeVoters: new address[](0)
      })
    );
  }
  
  /// @notice Allow a chairperson to enable/disable voting
  /// for a proposal
  ///
  /// @dev Sender should be a chairperson
  ///
  /// Requirements:
  /// See {Voteable::isChairperson()}
  ///
  /// @param _id - Represent a proposal index
  ///
  function enableProposal(
    uint256 _id
  ) public virtual isChairperson() {
    proposals[_id].votingEnabled ?
    proposals[_id].votingEnabled = false :
    proposals[_id].votingEnabled = true;
  }

  /// @notice Expose all proposals
  ///
  /// @return A tuple of Proposal
  ///
  function exposeProposals()
  public view returns (Proposal[] memory) {
    return proposals;
  }

  /// @notice Verify if the sender have already voted
  /// for a proposal
  ///
  /// @dev The function iterate hover the {_voters}
  /// to know if the sender have already voted
  ///
  /// @param _voters - Represent the positive/negative
  /// voters of a proposal
  ///
  function _checkSenderHasVoted(
    address[] memory _voters,
    address _voter
  ) private pure returns (bool) {
    uint256 i = 0;
    bool voted = false;
    uint256 len = _voters.length;
    while (i < len) {
      if (_voters[i] == _voter) {
        voted = true;
        break;
      }
      i++;
    }

    return voted;
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"}],"name":"BurningDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"}],"name":"BurningEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"}],"name":"MintingDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"}],"name":"MintingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"CREATOR","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_BURNER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_CHAIRPERSON","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_MANAGER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_MINTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_OWNER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burningEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"createProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"enableProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exposeProposals","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"metadataURI","type":"string"},{"internalType":"bool","name":"votingEnabled","type":"bool"},{"internalType":"uint256","name":"positiveVote","type":"uint256"},{"internalType":"uint256","name":"negativeVote","type":"uint256"},{"internalType":"address[]","name":"positiveVoters","type":"address[]"},{"internalType":"address[]","name":"negativeVoters","type":"address[]"}],"internalType":"struct Voteable.Proposal[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"exposeRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"exposeStakeholder","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"availableReward","type":"uint256"},{"internalType":"uint256","name":"totalRewardEarned","type":"uint256"},{"internalType":"uint256","name":"totalRewardSpent","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"lastRewardCalculatedAt","type":"uint256"}],"internalType":"struct Stakeable.Stakeholder","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exposeStakeholders","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"availableReward","type":"uint256"},{"internalType":"uint256","name":"totalRewardEarned","type":"uint256"},{"internalType":"uint256","name":"totalRewardSpent","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"lastRewardCalculatedAt","type":"uint256"}],"internalType":"struct Stakeable.Stakeholder[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"}],"name":"getRoleMembersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"grantManagerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRewardRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minVoteBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxRewardRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMinVoteBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_target","type":"address"}],"name":"spend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_receivers","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferOwnerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bool","name":"_isPositiveVote","type":"bool"}],"name":"voteForProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280601581526020017f4372656174696f6e20456e67696e6520546f6b656e00000000000000000000008152506040518060400160405280600381526020017f43455400000000000000000000000000000000000000000000000000000000008152506503a35294400064174876e8006008600760006101000a81548160ff021916908360ff1602179055508360059080519060200190620000bf92919062000895565b508260069080519060200190620000d892919062000895565b508160048190555080600281905550505050506064600981905550600a600c819055506000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506000600e60026101000a81548160ff021916908315150217905550620001616000801b33620001ec60201b60201c565b620001937faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c33620001ec60201b60201c565b620001b433620001a86200020260201b60201c565b6200020c60201b60201c565b620001e67f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b38233620003bb60201b60201c565b62000c40565b620001fe82826200050e60201b60201c565b5050565b6000600254905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200027f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002769062000ba2565b60405180910390fd5b6200029360008383620005a360201b60201c565b620002af81600354620006c760201b62002fff1790919060201c565b6003819055506200030d816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620006c760201b62002fff1790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003af919062000c08565b60405180910390a35050565b620003ed7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336200071f60201b60201c565b6200042f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004269062000b3c565b60405180910390fd5b6000801b82141562000478576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046f9062000be6565b60405180910390fd5b6200048d6000801b336200071f60201b60201c565b620004f8577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214620004f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ee9062000b1a565b60405180910390fd5b5b6200050a82826200050e60201b60201c565b5050565b6200053d81600860008581526020019081526020016000206000016200075860201b620030541790919060201c565b156200059f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b620005bb8383836200079060201b620030841760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200066f57620006016200079560201b60201c565b6200062a82620006166200079f60201b60201c565b620006c760201b62002fff1790919060201c565b11156200066e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006659062000b5e565b60405180910390fd5b5b6200067f620007a960201b60201c565b15620006c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006b99062000bc4565b60405180910390fd5b505050565b60008082840190508381101562000715576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200070c9062000b80565b60405180910390fd5b8091505092915050565b6000620007508260086000868152602001908152602001600020600001620007c060201b620030891790919060201c565b905092915050565b600062000788836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620007f860201b60201c565b905092915050565b505050565b6000600454905090565b6000600354905090565b6000600e60009054906101000a900460ff16905090565b6000620007f0836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200087260201b60201c565b905092915050565b60006200080c83836200087260201b60201c565b620008675782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200086c565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620008d857805160ff191683800117855562000909565b8280016001018555821562000909579182015b8281111562000908578251825591602001919060010190620008eb565b5b5090506200091891906200091c565b5090565b5b80821115620009375760008160009055506001016200091d565b5090565b60006200094a60078362000c25565b91507f5250433a353330000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006200098c60078362000c25565b91507f5250433a353130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000620009ce60058362000c25565b91507f55543a32300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600062000a10601b8362000c25565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600062000a5260098362000c25565b91507f45524332303a31323000000000000000000000000000000000000000000000006000830152602082019050919050565b600062000a9460068362000c25565b91507f55543a34303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600062000ad660078362000c25565b91507f5250433a353230000000000000000000000000000000000000000000000000006000830152602082019050919050565b62000b148162000c36565b82525050565b6000602082019050818103600083015262000b35816200093b565b9050919050565b6000602082019050818103600083015262000b57816200097d565b9050919050565b6000602082019050818103600083015262000b7981620009bf565b9050919050565b6000602082019050818103600083015262000b9b8162000a01565b9050919050565b6000602082019050818103600083015262000bbd8162000a43565b9050919050565b6000602082019050818103600083015262000bdf8162000a85565b9050919050565b6000602082019050818103600083015262000c018162000ac7565b9050919050565b600060208201905062000c1f600083018462000b09565b92915050565b600082825260208201905092915050565b6000819050919050565b615e308062000c506000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c806379cc67901161019d578063a694fc3a116100e9578063d547741f116100a2578063e4fbb6091161007c578063e4fbb6091461091b578063ed7c1b2014610939578063f5b944eb14610955578063fefaef3f146109735761030c565b8063d547741f146108b3578063dd62ed3e146108cf578063e487948d146108ff5761030c565b8063a694fc3a146107dd578063a89e0b89146107f9578063a9059cbb14610829578063bb102aea14610859578063bcdc3cfc14610877578063c6d4831a146108955761030c565b806391d14854116101565780639aded223116101305780639aded223146107435780639fd6db1214610773578063a0712d6814610791578063a457c2d7146107ad5761030c565b806391d14854146106d757806392afc33a1461070757806395d89b41146107255761030c565b806379cc67901461063d5780637cca542914610659578063806e085e146106775780638456cb59146106935780638ad682af1461069d5780638bb9c5bf146106bb5761030c565b8063395093511161025c57806354ff02d8116102155780636505e8e8116101ef5780636505e8e8146105b75780636d50838e146105d357806370a08231146105ef57806372ddc50e1461061f5761030c565b806354ff02d81461055d5780635a5c313e1461057b5780635c975abb146105995761030c565b806339509351146104c35780633ccfd60b146104f35780633f4ba83a146104fd57806342966c6814610507578063449a52f8146105235780634d7547151461053f5761030c565b806326e885e3116102c95780632f2ff15d116102a35780632f2ff15d1461043b578063313ce56714610457578063378dc3dc146104755780633884e621146104935761030c565b806326e885e3146103e75780632cdd626b146104035780632e17de781461041f5761030c565b806306fdde0314610311578063095ea7b31461032f5780630a8503bc1461035f57806318160ddd1461037d5780631e9f59db1461039b57806323b872dd146103b7575b600080fd5b61031961098f565b60405161032691906156c0565b60405180910390f35b610349600480360381019061034491906146b4565b610a31565b604051610356919061568a565b60405180910390f35b610367610a4e565b6040516103749190615668565b60405180910390f35b610385610b3f565b6040516103929190615b5d565b60405180910390f35b6103b560048036038101906103b0919061488d565b610b49565b005b6103d160048036038101906103cc9190614665565b610d43565b6040516103de919061568a565b60405180910390f35b61040160048036038101906103fc9190614600565b610e31565b005b61041d60048036038101906104189190614864565b610eaa565b005b61043960048036038101906104349190614864565b610f00565b005b6104556004803603810190610450919061476d565b611153565b005b61045f611284565b60405161046c9190615b78565b60405180910390f35b61047d61129b565b60405161048a9190615b5d565b60405180910390f35b6104ad60048036038101906104a89190614744565b6112a5565b6040516104ba9190615b5d565b60405180910390f35b6104dd60048036038101906104d891906146b4565b6112cc565b6040516104ea919061568a565b60405180910390f35b6104fb611377565b005b61050561146a565b005b610521600480360381019061051c9190614864565b611565565b005b61053d600480360381019061053891906146b4565b611679565b005b61054761178e565b604051610554919061568a565b60405180910390f35b6105656117a5565b60405161057291906156a5565b60405180910390f35b6105836117c9565b60405161059091906156a5565b60405180910390f35b6105a16117ed565b6040516105ae919061568a565b60405180910390f35b6105d160048036038101906105cc91906148c9565b611804565b005b6105ed60048036038101906105e89190614864565b611bde565b005b61060960048036038101906106049190614600565b611ced565b6040516106169190615b5d565b60405180910390f35b610627611d35565b6040516106349190615b5d565b60405180910390f35b610657600480360381019061065291906146b4565b611d3f565b005b610661611e80565b60405161066e9190615b5d565b60405180910390f35b610691600480360381019061068c91906146f0565b611e8a565b005b61069b611f18565b005b6106a5612014565b6040516106b291906156a5565b60405180910390f35b6106d560048036038101906106d09190614744565b61201b565b005b6106f160048036038101906106ec919061476d565b6120b7565b6040516106fe919061568a565b60405180910390f35b61070f6120e9565b60405161071c91906156a5565b60405180910390f35b61072d61210d565b60405161073a91906156c0565b60405180910390f35b61075d600480360381019061075891906147a9565b6121af565b60405161076a919061562b565b60405180910390f35b61077b6121e1565b604051610788919061568a565b60405180910390f35b6107ab60048036038101906107a69190614864565b6121f8565b005b6107c760048036038101906107c291906146b4565b61230c565b6040516107d4919061568a565b60405180910390f35b6107f760048036038101906107f29190614864565b6123ee565b005b610813600480360381019061080e9190614600565b6125eb565b6040516108209190615b42565b60405180910390f35b610843600480360381019061083e91906146b4565b61274f565b604051610850919061568a565b60405180910390f35b610861612766565b60405161086e9190615b5d565b60405180910390f35b61087f612770565b60405161088c9190615b5d565b60405180910390f35b61089d61277a565b6040516108aa9190615646565b60405180910390f35b6108cd60048036038101906108c8919061476d565b612abf565b005b6108e960048036038101906108e49190614629565b612bf0565b6040516108f69190615b5d565b60405180910390f35b61091960048036038101906109149190614864565b612c77565b005b610923612ccd565b60405161093091906156c0565b60405180910390f35b610953600480360381019061094e9190614600565b612d06565b005b61095d612d6f565b60405161096a91906156a5565b60405180910390f35b61098d600480360381019061098891906147e5565b612d93565b005b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a275780601f106109fc57610100808354040283529160200191610a27565b820191906000526020600020905b815481529060010190602001808311610a0a57829003601f168201915b5050505050905090565b6000610a4433846305f5e10085026130b9565b6001905092915050565b6060600d805480602002602001604051908101604052809291908181526020016000905b82821015610b3657838290600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505081526020019060010190610a72565b50505050905090565b6000600354905090565b610b566000801b336120b7565b610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c906158a2565b60405180910390fd5b6000806000600d8054905090505b80831015610c33578373ffffffffffffffffffffffffffffffffffffffff16600d8481548110610bcf57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c265760019150610c33565b8280600101935050610ba3565b81610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90615782565b60405180910390fd5b8115610d3c57610c8283613284565b600d8381548110610c8f57fe5b906000526020600020906007020160020154851115610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda90615a42565b60405180910390fd5b84600d8481548110610cf157fe5b90600052602060002090600702016002016000828254039250508190555084600d8481548110610d1d57fe5b9060005260206000209060070201600401600082825401925050819055505b5050505050565b6000610d508484846134c3565b610e268433610e216305f5e10086026040518060400160405280600981526020017f45524332303a3439300000000000000000000000000000000000000000000000815250600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6130b9565b600190509392505050565b610e3e6000801b336120b7565b610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e74906158a2565b60405180910390fd5b610ea77faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c82613813565b50565b610eb76000801b336120b7565b610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906158a2565b60405180910390fd5b8060098190555050565b8060008111610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906157e2565b60405180910390fd5b81610f4d614320565b610f56336125eb565b90508060200151821115610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690615922565b60405180910390fd5b6000806000600d8054905090505b8083101561103d573373ffffffffffffffffffffffffffffffffffffffff16600d8481548110610fd957fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611030576001915061103d565b8280600101935050610fad565b8161107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490615782565b60405180910390fd5b811561114a57600d838154811061109057fe5b90600052602060002090600702016001015487116111495786600d84815481106110b657fe5b9060005260206000209060070201600101600082825403925050819055506110e4336305f5e10089026138a0565b6305f5e1008702600b600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75886040516111409190615b5d565b60405180910390a25b5b50505050505050565b61117d7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336120b7565b6111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390615762565b60405180910390fd5b6000801b821415611202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f9906159a2565b60405180910390fd5b61120f6000801b336120b7565b611276577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126c906156e2565b60405180910390fd5b5b6112808282613813565b5050565b6000600760009054906101000a900460ff16905090565b6000600254905090565b60006112c560086000848152602001908152602001600020600001613a34565b9050919050565b600061136d33846113686305f5e1008602600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6130b9565b6001905092915050565b6000806000600d8054905090505b80831015611415573373ffffffffffffffffffffffffffffffffffffffff16600d84815481106113b157fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156114085760019150611415565b8280600101935050611385565b81611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90615782565b60405180910390fd5b81156114655761146483613284565b5b505050565b600e60009054906101000a900460ff166114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b090615ac2565b60405180910390fd5b6114c66000801b336120b7565b611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc906158a2565b60405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa60405160405180910390a2565b806115907f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336120b7565b806115d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c790615702565b60405180910390fd5b60008211611613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160a90615a02565b60405180910390fd5b61161b613a49565b61162361178e565b611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165990615822565b60405180910390fd5b61166c3384613aa9565b611674613c74565b505050565b806116a47ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336120b7565b806116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db906159e2565b60405180910390fd5b60008211611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90615aa2565b60405180910390fd5b61172f613cd4565b6117376121e1565b611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90615942565b60405180910390fd5b61178084846138a0565b611788613d34565b50505050565b6000600e60029054906101000a900460ff16905090565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b7f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b38281565b6000600e60009054906101000a900460ff16905090565b8161180e33611ced565b6305f5e10060095402811015611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090615882565b60405180910390fd5b6000611907600a848154811061186b57fe5b90600052602060002090600802016006018054806020026020016040519081016040528092919081815260200182805480156118fc57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116118b2575b505050505033613d94565b905060006119b7600a858154811061191b57fe5b90600052602060002090600802016007018054806020026020016040519081016040528092919081815260200182805480156119ac57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611962575b505050505033613d94565b9050811580156119c5575080155b611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb906158c2565b60405180910390fd5b85600a8181548110611a1257fe5b906000526020600020906008020160030160009054906101000a900460ff16611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790615b22565b60405180910390fd5b8515611b23576001600a8881548110611a8557fe5b906000526020600020906008020160040160008282540192505081905550600a8781548110611ab057fe5b9060005260206000209060080201600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b85611bd5576001600a8881548110611b3757fe5b906000526020600020906008020160050160008282540192505081905550600a8781548110611b6257fe5b9060005260206000209060080201600701339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50505050505050565b611c087f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b382336120b7565b611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e90615ae2565b60405180910390fd5b600a8181548110611c5457fe5b906000526020600020906008020160030160009054906101000a900460ff16611cb2576001600a8281548110611c8657fe5b906000526020600020906008020160030160006101000a81548160ff0219169083151502179055611ce9565b6000600a8281548110611cc157fe5b906000526020600020906008020160030160006101000a81548160ff02191690831515021790555b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600954905090565b80611d6a7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336120b7565b80611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da190615702565b60405180910390fd5b60008211611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490615a02565b60405180910390fd5b611df5613a49565b611dfd61178e565b611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3390615822565b60405180910390fd5b6000611e5a84611e4c8733612bf0565b613e1490919063ffffffff16565b9050611e678533836130b9565b611e718585613aa9565b611e79613c74565b5050505050565b6000600c54905090565b60008083519050808302611e9d33611ced565b1015611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590615842565b60405180910390fd5b5b80821015611f1257611f04848381518110611ef657fe5b60200260200101518461274f565b508180600101925050611edf565b50505050565b600e60009054906101000a900460ff1615611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90615982565b60405180910390fd5b611f756000801b336120b7565b611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab906158a2565b60405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860405160405180910390a2565b6000801b81565b6000801b811415612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205890615742565b60405180910390fd5b61206b81336120b7565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a1906159c2565b60405180910390fd5b6120b48133613e5e565b50565b60006120e1826008600086815260200190815260200160002060000161308990919063ffffffff16565b905092915050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121a55780601f1061217a576101008083540402835291602001916121a5565b820191906000526020600020905b81548152906001019060200180831161218857829003601f168201915b5050505050905090565b60006121d98260086000868152602001908152602001600020600001613eeb90919063ffffffff16565b905092915050565b6000600e60019054906101000a900460ff16905090565b806122237ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336120b7565b80612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225a906159e2565b60405180910390fd5b600082116122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90615aa2565b60405180910390fd5b6122ae613cd4565b6122b66121e1565b6122f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ec90615942565b60405180910390fd5b6122ff33846138a0565b612307613d34565b505050565b60006123e433846123df6305f5e10086026040518060400160405280600981526020017f45524332303a3439350000000000000000000000000000000000000000000000815250600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6130b9565b6001905092915050565b806123f833611ced565b806305f5e10083021115612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890615922565b60405180910390fd5b8260008111612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c906157e2565b60405180910390fd5b6000806000600d8054905090505b80831015612523573373ffffffffffffffffffffffffffffffffffffffff16600d84815481106124bf57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125165760019150612523565b8280600101935050612493565b81156125ca5786600d848154811061253757fe5b906000526020600020906007020160010160008282540192505081905550612565336305f5e1008902613aa9565b6305f5e1008702600b600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516125c19190615b5d565b60405180910390a25b816125e2576125d833613f05565b6125e1876123ee565b5b50505050505050565b6125f3614320565b600080600d8054905090505b80821015612747578373ffffffffffffffffffffffffffffffffffffffff16600d838154811061262b57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561273a57600d828154811061268657fe5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509250505061274a565b81806001019250506125ff565b50505b919050565b600061275c3384846134c3565b6001905092915050565b6000600454905090565b6000600b54905090565b6060600a805480602002602001604051908101604052809291908181526020016000905b82821015612ab65783829060005260206000209060080201604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128b15780601f10612886576101008083540402835291602001916128b1565b820191906000526020600020905b81548152906001019060200180831161289457829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129535780601f1061292857610100808354040283529160200191612953565b820191906000526020600020905b81548152906001019060200180831161293657829003601f168201915b505050505081526020016003820160009054906101000a900460ff16151515158152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015612a1057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116129c6575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015612a9e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612a54575b5050505050815250508152602001906001019061279e565b50505050905090565b612ae97faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336120b7565b612b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1f90615a22565b60405180910390fd5b6000801b821415612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6590615742565b60405180910390fd5b612b7b6000801b336120b7565b612be2577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd8906156e2565b60405180910390fd5b5b612bec8282613e5e565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612c846000801b336120b7565b612cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cba906158a2565b60405180910390fd5b80600c8190555050565b6040518060400160405280601381526020017f742e6d652f4372656174696f6e456e67696e650000000000000000000000000081525081565b612d136000801b336120b7565b612d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d49906158a2565b60405180910390fd5b612d5f6000801b82613813565b612d6c6000801b33613e5e565b50565b7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c81565b612dbd7f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b382336120b7565b612dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df390615ae2565b60405180910390fd5b600a6040518061010001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183151581526020016000815260200160008152602001600067ffffffffffffffff81118015612e6057600080fd5b50604051908082528060200260200182016040528015612e8f5781602001602082028036833780820191505090505b508152602001600067ffffffffffffffff81118015612ead57600080fd5b50604051908082528060200260200182016040528015612edc5781602001602082028036833780820191505090505b50815250908060018154018082558091505060019003906000526020600020906008020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019080519060200190612f6c929190614373565b506040820151816002019080519060200190612f89929190614373565b5060608201518160030160006101000a81548160ff0219169083151502179055506080820151816004015560a0820151816005015560c0820151816006019080519060200190612fda9291906143f3565b5060e0820151816007019080519060200190612ff79291906143f3565b505050505050565b60008082840190508381101561304a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304190615802565b60405180910390fd5b8091505092915050565b600061307c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614006565b905092915050565b505050565b60006130b1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614076565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312090615902565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613199576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613190906158e2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516132779190615b5d565b60405180910390a3505050565b6000600d828154811061329357fe5b90600052602060002090600702016001015490506000600d83815481106132b657fe5b90600052602060002090600702016006015490506000600d84815481106132d957fe5b906000526020600020906007020160050154905060008214156133d557428110156133d45762015180814203106133d357600c5483111561331c57600c5461331e565b825b620151808242038161332c57fe5b0402600d858154811061333b57fe5b906000526020600020906007020160020160008282540192505081905550600c5483111561336b57600c5461336d565b825b620151808242038161337b57fe5b0402600d858154811061338a57fe5b90600052602060002090600702016003016000828254019250508190555042600d85815481106133b657fe5b9060005260206000209060070201600601819055505050506134c0565b5b5b600082146134bc57428210156134bb5762015180824203106134ba57600c5483111561340357600c54613405565b825b620151808342038161341357fe5b0402600d858154811061342257fe5b906000526020600020906007020160020160008282540192505081905550600c5483111561345257600c54613454565b825b620151808342038161346257fe5b0402600d858154811061347157fe5b90600052602060002090600702016003016000828254019250508190555042600d858154811061349d57fe5b9060005260206000209060070201600601819055505050506134c0565b5b5b5050505b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a90615b02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359a90615a82565b60405180910390fd5b600081116135e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dd906157a2565b60405180910390fd5b6135f1838383614099565b613679816040518060400160405280600981526020017f45524332303a34373000000000000000000000000000000000000000000000008152506000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061370c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137ab9190615b5d565b60405180910390a3505050565b6000838311158290613800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f791906156c0565b60405180910390fd5b5060008385039050809150509392505050565b61383b816008600085815260200190815260200160002060000161305490919063ffffffff16565b1561389c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390790615862565b60405180910390fd5b61391c60008383614099565b61393181600354612fff90919063ffffffff16565b600381905550613988816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613a289190615b5d565b60405180910390a35050565b6000613a428260000161418a565b9050919050565b6001600e60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f0846bb88ff3b4abf3ada7790ae6fc103385a19b2aed99f8e450648b9e1374a3660405160405180910390a2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1090615a62565b60405180910390fd5b613b2582600083614099565b613bad816040518060400160405280600981526020017f45524332303a32333000000000000000000000000000000000000000000000008152506000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c0481600354613e1490919063ffffffff16565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c689190615b5d565b60405180910390a35050565b6000600e60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fc21bebfeff90d942c9009e0eca370a1ab9ddc28e67af48c2a213e3e9ad65fe0860405160405180910390a2565b6001600e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f04fe8ec10fc27a3eb74bc6484c1010613b3354832dd9c927827d71388ee2677a60405160405180910390a2565b6000600e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f340bf1b235fa0bbed4b1b74504c172953a38e3ef4bd71a7042fd2a0057455b7360405160405180910390a2565b60008060009050600080855190505b80831015613e08578473ffffffffffffffffffffffffffffffffffffffff16868481518110613dce57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415613dfb5760019150613e08565b8280600101935050613da3565b81935050505092915050565b6000613e5683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137b8565b905092915050565b613e86816008600085815260200190815260200160002060000161419b90919063ffffffff16565b15613ee7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000613efa83600001836141cb565b60001c905092915050565b600d6040518060e001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020014281526020016000815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505050565b60006140128383614076565b61406b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050614070565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6140a4838383613084565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561413d576140e1612766565b6140fb826140ed610b3f565b612fff90919063ffffffff16565b111561413c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614133906157c2565b60405180910390fd5b5b6141456117ed565b15614185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161417c90615962565b60405180910390fd5b505050565b600081600001805490509050919050565b60006141c3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614238565b905092915050565b600081836000018054905011614216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161420d90615722565b60405180910390fd5b82600001828154811061422557fe5b9060005260206000200154905092915050565b60008083600101600084815260200190815260200160002054905060008114614314576000600182039050600060018660000180549050039050600086600001828154811061428357fe5b90600052602060002001549050808760000184815481106142a057fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806142d857fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061431a565b60009150505b92915050565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106143b457805160ff19168380011785556143e2565b828001600101855582156143e2579182015b828111156143e15782518255916020019190600101906143c6565b5b5090506143ef919061447d565b5090565b82805482825590600052602060002090810192821561446c579160200282015b8281111561446b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190614413565b5b509050614479919061449a565b5090565b5b8082111561449657600081600090555060010161447e565b5090565b5b808211156144d157600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010161449b565b5090565b6000813590506144e481615d9e565b92915050565b600082601f8301126144fb57600080fd5b813561450e61450982615bc0565b615b93565b9150818183526020840193506020810190508385602084028201111561453357600080fd5b60005b83811015614563578161454988826144d5565b845260208401935060208301925050600181019050614536565b5050505092915050565b60008135905061457c81615db5565b92915050565b60008135905061459181615dcc565b92915050565b600082601f8301126145a857600080fd5b81356145bb6145b682615be8565b615b93565b915080825260208301602083018583830111156145d757600080fd5b6145e2838284615d4b565b50505092915050565b6000813590506145fa81615de3565b92915050565b60006020828403121561461257600080fd5b6000614620848285016144d5565b91505092915050565b6000806040838503121561463c57600080fd5b600061464a858286016144d5565b925050602061465b858286016144d5565b9150509250929050565b60008060006060848603121561467a57600080fd5b6000614688868287016144d5565b9350506020614699868287016144d5565b92505060406146aa868287016145eb565b9150509250925092565b600080604083850312156146c757600080fd5b60006146d5858286016144d5565b92505060206146e6858286016145eb565b9150509250929050565b6000806040838503121561470357600080fd5b600083013567ffffffffffffffff81111561471d57600080fd5b614729858286016144ea565b925050602061473a858286016145eb565b9150509250929050565b60006020828403121561475657600080fd5b600061476484828501614582565b91505092915050565b6000806040838503121561478057600080fd5b600061478e85828601614582565b925050602061479f858286016144d5565b9150509250929050565b600080604083850312156147bc57600080fd5b60006147ca85828601614582565b92505060206147db858286016145eb565b9150509250929050565b6000806000606084860312156147fa57600080fd5b600084013567ffffffffffffffff81111561481457600080fd5b61482086828701614597565b935050602084013567ffffffffffffffff81111561483d57600080fd5b61484986828701614597565b925050604061485a8682870161456d565b9150509250925092565b60006020828403121561487657600080fd5b6000614884848285016145eb565b91505092915050565b600080604083850312156148a057600080fd5b60006148ae858286016145eb565b92505060206148bf858286016144d5565b9150509250929050565b600080604083850312156148dc57600080fd5b60006148ea858286016145eb565b92505060206148fb8582860161456d565b9150509250929050565b60006149118383614949565b60208301905092915050565b6000614929838361541d565b905092915050565b600061493d83836154e2565b60e08301905092915050565b61495281615cec565b82525050565b61496181615cec565b82525050565b600061497282615c44565b61497c8185615c97565b935061498783615c14565b8060005b838110156149b857815161499f8882614905565b97506149aa83615c70565b92505060018101905061498b565b5085935050505092915050565b60006149d082615c4f565b6149da8185615ca8565b9350836020820285016149ec85615c24565b8060005b85811015614a285784840389528151614a09858261491d565b9450614a1483615c7d565b925060208a019950506001810190506149f0565b50829750879550505050505092915050565b6000614a4582615c5a565b614a4f8185615cb9565b9350614a5a83615c34565b8060005b83811015614a8b578151614a728882614931565b9750614a7d83615c8a565b925050600181019050614a5e565b5085935050505092915050565b614aa181615cfe565b82525050565b614ab081615cfe565b82525050565b614abf81615d0a565b82525050565b6000614ad082615c65565b614ada8185615cca565b9350614aea818560208601615d5a565b614af381615d8d565b840191505092915050565b6000614b0982615c65565b614b138185615cdb565b9350614b23818560208601615d5a565b614b2c81615d8d565b840191505092915050565b6000614b44600783615cdb565b91507f5250433a353330000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614b84600683615cdb565b91507f42433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614bc4602283615cdb565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c2a600783615cdb565b91507f5250433a353430000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614c6a600783615cdb565b91507f5250433a353130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614caa600683615cdb565b91507f53433a36353000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614cea600983615cdb565b91507f45524332303a34383000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d2a600583615cdb565b91507f55543a32300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d6a600683615cdb565b91507f53433a36333000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614daa601b83615cdb565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614dea600683615cdb565b91507f42433a32313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614e2a600683615cdb565b91507f55543a34373000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614e6a600983615cdb565b91507f45524332303a31323000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614eaa600783615cdb565b91507f56433a31303130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614eea600783615cdb565b91507f5250433a353030000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f2a600783615cdb565b91507f56433a31303230000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f6a600983615cdb565b91507f45524332303a34363000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614faa600983615cdb565b91507f45524332303a34353000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614fea600683615cdb565b91507f53433a36343000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061502a600683615cdb565b91507f4d433a31313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061506a600683615cdb565b91507f55543a34303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006150aa600683615cdb565b91507f50433a33303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006150ea600783615cdb565b91507f5250433a353230000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061512a600783615cdb565b91507f5250433a353730000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061516a600683615cdb565b91507f4d433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151aa600583615cdb565b91507f42433a33300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151ea600783615cdb565b91507f5250433a353530000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061522a600683615cdb565b91507f53433a36363000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061526a600983615cdb565b91507f45524332303a32323000000000000000000000000000000000000000000000006000830152602082019050919050565b60006152aa600983615cdb565b91507f45524332303a34323000000000000000000000000000000000000000000000006000830152602082019050919050565b60006152ea600583615cdb565b91507f4d433a33300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061532a600683615cdb565b91507f50433a33313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061536a600683615cdb565b91507f56433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006153aa600983615cdb565b91507f45524332303a34313000000000000000000000000000000000000000000000006000830152602082019050919050565b60006153ea600783615cdb565b91507f56433a31303330000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000610100830160008301516154366000860182614949565b506020830151848203602086015261544e8282614ac5565b915050604083015184820360408601526154688282614ac5565b915050606083015161547d6060860182614a98565b50608083015161549060808601826155fe565b5060a08301516154a360a08601826155fe565b5060c083015184820360c08601526154bb8282614967565b91505060e083015184820360e08601526154d58282614967565b9150508091505092915050565b60e0820160008201516154f86000850182614949565b50602082015161550b60208501826155fe565b50604082015161551e60408501826155fe565b50606082015161553160608501826155fe565b50608082015161554460808501826155fe565b5060a082015161555760a08501826155fe565b5060c082015161556a60c08501826155fe565b50505050565b60e0820160008201516155866000850182614949565b50602082015161559960208501826155fe565b5060408201516155ac60408501826155fe565b5060608201516155bf60608501826155fe565b5060808201516155d260808501826155fe565b5060a08201516155e560a08501826155fe565b5060c08201516155f860c08501826155fe565b50505050565b61560781615d34565b82525050565b61561681615d34565b82525050565b61562581615d3e565b82525050565b60006020820190506156406000830184614958565b92915050565b6000602082019050818103600083015261566081846149c5565b905092915050565b600060208201905081810360008301526156828184614a3a565b905092915050565b600060208201905061569f6000830184614aa7565b92915050565b60006020820190506156ba6000830184614ab6565b92915050565b600060208201905081810360008301526156da8184614afe565b905092915050565b600060208201905081810360008301526156fb81614b37565b9050919050565b6000602082019050818103600083015261571b81614b77565b9050919050565b6000602082019050818103600083015261573b81614bb7565b9050919050565b6000602082019050818103600083015261575b81614c1d565b9050919050565b6000602082019050818103600083015261577b81614c5d565b9050919050565b6000602082019050818103600083015261579b81614c9d565b9050919050565b600060208201905081810360008301526157bb81614cdd565b9050919050565b600060208201905081810360008301526157db81614d1d565b9050919050565b600060208201905081810360008301526157fb81614d5d565b9050919050565b6000602082019050818103600083015261581b81614d9d565b9050919050565b6000602082019050818103600083015261583b81614ddd565b9050919050565b6000602082019050818103600083015261585b81614e1d565b9050919050565b6000602082019050818103600083015261587b81614e5d565b9050919050565b6000602082019050818103600083015261589b81614e9d565b9050919050565b600060208201905081810360008301526158bb81614edd565b9050919050565b600060208201905081810360008301526158db81614f1d565b9050919050565b600060208201905081810360008301526158fb81614f5d565b9050919050565b6000602082019050818103600083015261591b81614f9d565b9050919050565b6000602082019050818103600083015261593b81614fdd565b9050919050565b6000602082019050818103600083015261595b8161501d565b9050919050565b6000602082019050818103600083015261597b8161505d565b9050919050565b6000602082019050818103600083015261599b8161509d565b9050919050565b600060208201905081810360008301526159bb816150dd565b9050919050565b600060208201905081810360008301526159db8161511d565b9050919050565b600060208201905081810360008301526159fb8161515d565b9050919050565b60006020820190508181036000830152615a1b8161519d565b9050919050565b60006020820190508181036000830152615a3b816151dd565b9050919050565b60006020820190508181036000830152615a5b8161521d565b9050919050565b60006020820190508181036000830152615a7b8161525d565b9050919050565b60006020820190508181036000830152615a9b8161529d565b9050919050565b60006020820190508181036000830152615abb816152dd565b9050919050565b60006020820190508181036000830152615adb8161531d565b9050919050565b60006020820190508181036000830152615afb8161535d565b9050919050565b60006020820190508181036000830152615b1b8161539d565b9050919050565b60006020820190508181036000830152615b3b816153dd565b9050919050565b600060e082019050615b576000830184615570565b92915050565b6000602082019050615b72600083018461560d565b92915050565b6000602082019050615b8d600083018461561c565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615bb657600080fd5b8060405250919050565b600067ffffffffffffffff821115615bd757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115615bff57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615cf782615d14565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615d78578082015181840152602081019050615d5d565b83811115615d87576000848401525b50505050565b6000601f19601f8301169050919050565b615da781615cec565b8114615db257600080fd5b50565b615dbe81615cfe565b8114615dc957600080fd5b50565b615dd581615d0a565b8114615de057600080fd5b50565b615dec81615d34565b8114615df757600080fd5b5056fea2646970667358221220d4f3e80dd8feab818af785f712fa3c5060f951b5944ea729ecc6902b0e81613964736f6c634300060c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061030c5760003560e01c806379cc67901161019d578063a694fc3a116100e9578063d547741f116100a2578063e4fbb6091161007c578063e4fbb6091461091b578063ed7c1b2014610939578063f5b944eb14610955578063fefaef3f146109735761030c565b8063d547741f146108b3578063dd62ed3e146108cf578063e487948d146108ff5761030c565b8063a694fc3a146107dd578063a89e0b89146107f9578063a9059cbb14610829578063bb102aea14610859578063bcdc3cfc14610877578063c6d4831a146108955761030c565b806391d14854116101565780639aded223116101305780639aded223146107435780639fd6db1214610773578063a0712d6814610791578063a457c2d7146107ad5761030c565b806391d14854146106d757806392afc33a1461070757806395d89b41146107255761030c565b806379cc67901461063d5780637cca542914610659578063806e085e146106775780638456cb59146106935780638ad682af1461069d5780638bb9c5bf146106bb5761030c565b8063395093511161025c57806354ff02d8116102155780636505e8e8116101ef5780636505e8e8146105b75780636d50838e146105d357806370a08231146105ef57806372ddc50e1461061f5761030c565b806354ff02d81461055d5780635a5c313e1461057b5780635c975abb146105995761030c565b806339509351146104c35780633ccfd60b146104f35780633f4ba83a146104fd57806342966c6814610507578063449a52f8146105235780634d7547151461053f5761030c565b806326e885e3116102c95780632f2ff15d116102a35780632f2ff15d1461043b578063313ce56714610457578063378dc3dc146104755780633884e621146104935761030c565b806326e885e3146103e75780632cdd626b146104035780632e17de781461041f5761030c565b806306fdde0314610311578063095ea7b31461032f5780630a8503bc1461035f57806318160ddd1461037d5780631e9f59db1461039b57806323b872dd146103b7575b600080fd5b61031961098f565b60405161032691906156c0565b60405180910390f35b610349600480360381019061034491906146b4565b610a31565b604051610356919061568a565b60405180910390f35b610367610a4e565b6040516103749190615668565b60405180910390f35b610385610b3f565b6040516103929190615b5d565b60405180910390f35b6103b560048036038101906103b0919061488d565b610b49565b005b6103d160048036038101906103cc9190614665565b610d43565b6040516103de919061568a565b60405180910390f35b61040160048036038101906103fc9190614600565b610e31565b005b61041d60048036038101906104189190614864565b610eaa565b005b61043960048036038101906104349190614864565b610f00565b005b6104556004803603810190610450919061476d565b611153565b005b61045f611284565b60405161046c9190615b78565b60405180910390f35b61047d61129b565b60405161048a9190615b5d565b60405180910390f35b6104ad60048036038101906104a89190614744565b6112a5565b6040516104ba9190615b5d565b60405180910390f35b6104dd60048036038101906104d891906146b4565b6112cc565b6040516104ea919061568a565b60405180910390f35b6104fb611377565b005b61050561146a565b005b610521600480360381019061051c9190614864565b611565565b005b61053d600480360381019061053891906146b4565b611679565b005b61054761178e565b604051610554919061568a565b60405180910390f35b6105656117a5565b60405161057291906156a5565b60405180910390f35b6105836117c9565b60405161059091906156a5565b60405180910390f35b6105a16117ed565b6040516105ae919061568a565b60405180910390f35b6105d160048036038101906105cc91906148c9565b611804565b005b6105ed60048036038101906105e89190614864565b611bde565b005b61060960048036038101906106049190614600565b611ced565b6040516106169190615b5d565b60405180910390f35b610627611d35565b6040516106349190615b5d565b60405180910390f35b610657600480360381019061065291906146b4565b611d3f565b005b610661611e80565b60405161066e9190615b5d565b60405180910390f35b610691600480360381019061068c91906146f0565b611e8a565b005b61069b611f18565b005b6106a5612014565b6040516106b291906156a5565b60405180910390f35b6106d560048036038101906106d09190614744565b61201b565b005b6106f160048036038101906106ec919061476d565b6120b7565b6040516106fe919061568a565b60405180910390f35b61070f6120e9565b60405161071c91906156a5565b60405180910390f35b61072d61210d565b60405161073a91906156c0565b60405180910390f35b61075d600480360381019061075891906147a9565b6121af565b60405161076a919061562b565b60405180910390f35b61077b6121e1565b604051610788919061568a565b60405180910390f35b6107ab60048036038101906107a69190614864565b6121f8565b005b6107c760048036038101906107c291906146b4565b61230c565b6040516107d4919061568a565b60405180910390f35b6107f760048036038101906107f29190614864565b6123ee565b005b610813600480360381019061080e9190614600565b6125eb565b6040516108209190615b42565b60405180910390f35b610843600480360381019061083e91906146b4565b61274f565b604051610850919061568a565b60405180910390f35b610861612766565b60405161086e9190615b5d565b60405180910390f35b61087f612770565b60405161088c9190615b5d565b60405180910390f35b61089d61277a565b6040516108aa9190615646565b60405180910390f35b6108cd60048036038101906108c8919061476d565b612abf565b005b6108e960048036038101906108e49190614629565b612bf0565b6040516108f69190615b5d565b60405180910390f35b61091960048036038101906109149190614864565b612c77565b005b610923612ccd565b60405161093091906156c0565b60405180910390f35b610953600480360381019061094e9190614600565b612d06565b005b61095d612d6f565b60405161096a91906156a5565b60405180910390f35b61098d600480360381019061098891906147e5565b612d93565b005b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a275780601f106109fc57610100808354040283529160200191610a27565b820191906000526020600020905b815481529060010190602001808311610a0a57829003601f168201915b5050505050905090565b6000610a4433846305f5e10085026130b9565b6001905092915050565b6060600d805480602002602001604051908101604052809291908181526020016000905b82821015610b3657838290600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505081526020019060010190610a72565b50505050905090565b6000600354905090565b610b566000801b336120b7565b610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c906158a2565b60405180910390fd5b6000806000600d8054905090505b80831015610c33578373ffffffffffffffffffffffffffffffffffffffff16600d8481548110610bcf57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c265760019150610c33565b8280600101935050610ba3565b81610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90615782565b60405180910390fd5b8115610d3c57610c8283613284565b600d8381548110610c8f57fe5b906000526020600020906007020160020154851115610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda90615a42565b60405180910390fd5b84600d8481548110610cf157fe5b90600052602060002090600702016002016000828254039250508190555084600d8481548110610d1d57fe5b9060005260206000209060070201600401600082825401925050819055505b5050505050565b6000610d508484846134c3565b610e268433610e216305f5e10086026040518060400160405280600981526020017f45524332303a3439300000000000000000000000000000000000000000000000815250600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6130b9565b600190509392505050565b610e3e6000801b336120b7565b610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e74906158a2565b60405180910390fd5b610ea77faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c82613813565b50565b610eb76000801b336120b7565b610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906158a2565b60405180910390fd5b8060098190555050565b8060008111610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906157e2565b60405180910390fd5b81610f4d614320565b610f56336125eb565b90508060200151821115610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690615922565b60405180910390fd5b6000806000600d8054905090505b8083101561103d573373ffffffffffffffffffffffffffffffffffffffff16600d8481548110610fd957fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611030576001915061103d565b8280600101935050610fad565b8161107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490615782565b60405180910390fd5b811561114a57600d838154811061109057fe5b90600052602060002090600702016001015487116111495786600d84815481106110b657fe5b9060005260206000209060070201600101600082825403925050819055506110e4336305f5e10089026138a0565b6305f5e1008702600b600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75886040516111409190615b5d565b60405180910390a25b5b50505050505050565b61117d7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336120b7565b6111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390615762565b60405180910390fd5b6000801b821415611202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f9906159a2565b60405180910390fd5b61120f6000801b336120b7565b611276577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126c906156e2565b60405180910390fd5b5b6112808282613813565b5050565b6000600760009054906101000a900460ff16905090565b6000600254905090565b60006112c560086000848152602001908152602001600020600001613a34565b9050919050565b600061136d33846113686305f5e1008602600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6130b9565b6001905092915050565b6000806000600d8054905090505b80831015611415573373ffffffffffffffffffffffffffffffffffffffff16600d84815481106113b157fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156114085760019150611415565b8280600101935050611385565b81611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90615782565b60405180910390fd5b81156114655761146483613284565b5b505050565b600e60009054906101000a900460ff166114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b090615ac2565b60405180910390fd5b6114c66000801b336120b7565b611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc906158a2565b60405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa60405160405180910390a2565b806115907f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336120b7565b806115d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c790615702565b60405180910390fd5b60008211611613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160a90615a02565b60405180910390fd5b61161b613a49565b61162361178e565b611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165990615822565b60405180910390fd5b61166c3384613aa9565b611674613c74565b505050565b806116a47ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336120b7565b806116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db906159e2565b60405180910390fd5b60008211611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90615aa2565b60405180910390fd5b61172f613cd4565b6117376121e1565b611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90615942565b60405180910390fd5b61178084846138a0565b611788613d34565b50505050565b6000600e60029054906101000a900460ff16905090565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b7f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b38281565b6000600e60009054906101000a900460ff16905090565b8161180e33611ced565b6305f5e10060095402811015611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090615882565b60405180910390fd5b6000611907600a848154811061186b57fe5b90600052602060002090600802016006018054806020026020016040519081016040528092919081815260200182805480156118fc57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116118b2575b505050505033613d94565b905060006119b7600a858154811061191b57fe5b90600052602060002090600802016007018054806020026020016040519081016040528092919081815260200182805480156119ac57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611962575b505050505033613d94565b9050811580156119c5575080155b611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb906158c2565b60405180910390fd5b85600a8181548110611a1257fe5b906000526020600020906008020160030160009054906101000a900460ff16611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790615b22565b60405180910390fd5b8515611b23576001600a8881548110611a8557fe5b906000526020600020906008020160040160008282540192505081905550600a8781548110611ab057fe5b9060005260206000209060080201600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b85611bd5576001600a8881548110611b3757fe5b906000526020600020906008020160050160008282540192505081905550600a8781548110611b6257fe5b9060005260206000209060080201600701339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50505050505050565b611c087f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b382336120b7565b611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e90615ae2565b60405180910390fd5b600a8181548110611c5457fe5b906000526020600020906008020160030160009054906101000a900460ff16611cb2576001600a8281548110611c8657fe5b906000526020600020906008020160030160006101000a81548160ff0219169083151502179055611ce9565b6000600a8281548110611cc157fe5b906000526020600020906008020160030160006101000a81548160ff02191690831515021790555b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600954905090565b80611d6a7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336120b7565b80611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da190615702565b60405180910390fd5b60008211611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490615a02565b60405180910390fd5b611df5613a49565b611dfd61178e565b611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3390615822565b60405180910390fd5b6000611e5a84611e4c8733612bf0565b613e1490919063ffffffff16565b9050611e678533836130b9565b611e718585613aa9565b611e79613c74565b5050505050565b6000600c54905090565b60008083519050808302611e9d33611ced565b1015611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590615842565b60405180910390fd5b5b80821015611f1257611f04848381518110611ef657fe5b60200260200101518461274f565b508180600101925050611edf565b50505050565b600e60009054906101000a900460ff1615611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90615982565b60405180910390fd5b611f756000801b336120b7565b611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab906158a2565b60405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860405160405180910390a2565b6000801b81565b6000801b811415612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205890615742565b60405180910390fd5b61206b81336120b7565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a1906159c2565b60405180910390fd5b6120b48133613e5e565b50565b60006120e1826008600086815260200190815260200160002060000161308990919063ffffffff16565b905092915050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121a55780601f1061217a576101008083540402835291602001916121a5565b820191906000526020600020905b81548152906001019060200180831161218857829003601f168201915b5050505050905090565b60006121d98260086000868152602001908152602001600020600001613eeb90919063ffffffff16565b905092915050565b6000600e60019054906101000a900460ff16905090565b806122237ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336120b7565b80612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225a906159e2565b60405180910390fd5b600082116122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90615aa2565b60405180910390fd5b6122ae613cd4565b6122b66121e1565b6122f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ec90615942565b60405180910390fd5b6122ff33846138a0565b612307613d34565b505050565b60006123e433846123df6305f5e10086026040518060400160405280600981526020017f45524332303a3439350000000000000000000000000000000000000000000000815250600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6130b9565b6001905092915050565b806123f833611ced565b806305f5e10083021115612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890615922565b60405180910390fd5b8260008111612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c906157e2565b60405180910390fd5b6000806000600d8054905090505b80831015612523573373ffffffffffffffffffffffffffffffffffffffff16600d84815481106124bf57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125165760019150612523565b8280600101935050612493565b81156125ca5786600d848154811061253757fe5b906000526020600020906007020160010160008282540192505081905550612565336305f5e1008902613aa9565b6305f5e1008702600b600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516125c19190615b5d565b60405180910390a25b816125e2576125d833613f05565b6125e1876123ee565b5b50505050505050565b6125f3614320565b600080600d8054905090505b80821015612747578373ffffffffffffffffffffffffffffffffffffffff16600d838154811061262b57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561273a57600d828154811061268657fe5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509250505061274a565b81806001019250506125ff565b50505b919050565b600061275c3384846134c3565b6001905092915050565b6000600454905090565b6000600b54905090565b6060600a805480602002602001604051908101604052809291908181526020016000905b82821015612ab65783829060005260206000209060080201604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128b15780601f10612886576101008083540402835291602001916128b1565b820191906000526020600020905b81548152906001019060200180831161289457829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129535780601f1061292857610100808354040283529160200191612953565b820191906000526020600020905b81548152906001019060200180831161293657829003601f168201915b505050505081526020016003820160009054906101000a900460ff16151515158152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015612a1057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116129c6575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015612a9e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612a54575b5050505050815250508152602001906001019061279e565b50505050905090565b612ae97faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336120b7565b612b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1f90615a22565b60405180910390fd5b6000801b821415612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6590615742565b60405180910390fd5b612b7b6000801b336120b7565b612be2577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd8906156e2565b60405180910390fd5b5b612bec8282613e5e565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612c846000801b336120b7565b612cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cba906158a2565b60405180910390fd5b80600c8190555050565b6040518060400160405280601381526020017f742e6d652f4372656174696f6e456e67696e650000000000000000000000000081525081565b612d136000801b336120b7565b612d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d49906158a2565b60405180910390fd5b612d5f6000801b82613813565b612d6c6000801b33613e5e565b50565b7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c81565b612dbd7f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b382336120b7565b612dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df390615ae2565b60405180910390fd5b600a6040518061010001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183151581526020016000815260200160008152602001600067ffffffffffffffff81118015612e6057600080fd5b50604051908082528060200260200182016040528015612e8f5781602001602082028036833780820191505090505b508152602001600067ffffffffffffffff81118015612ead57600080fd5b50604051908082528060200260200182016040528015612edc5781602001602082028036833780820191505090505b50815250908060018154018082558091505060019003906000526020600020906008020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019080519060200190612f6c929190614373565b506040820151816002019080519060200190612f89929190614373565b5060608201518160030160006101000a81548160ff0219169083151502179055506080820151816004015560a0820151816005015560c0820151816006019080519060200190612fda9291906143f3565b5060e0820151816007019080519060200190612ff79291906143f3565b505050505050565b60008082840190508381101561304a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304190615802565b60405180910390fd5b8091505092915050565b600061307c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614006565b905092915050565b505050565b60006130b1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614076565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312090615902565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613199576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613190906158e2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516132779190615b5d565b60405180910390a3505050565b6000600d828154811061329357fe5b90600052602060002090600702016001015490506000600d83815481106132b657fe5b90600052602060002090600702016006015490506000600d84815481106132d957fe5b906000526020600020906007020160050154905060008214156133d557428110156133d45762015180814203106133d357600c5483111561331c57600c5461331e565b825b620151808242038161332c57fe5b0402600d858154811061333b57fe5b906000526020600020906007020160020160008282540192505081905550600c5483111561336b57600c5461336d565b825b620151808242038161337b57fe5b0402600d858154811061338a57fe5b90600052602060002090600702016003016000828254019250508190555042600d85815481106133b657fe5b9060005260206000209060070201600601819055505050506134c0565b5b5b600082146134bc57428210156134bb5762015180824203106134ba57600c5483111561340357600c54613405565b825b620151808342038161341357fe5b0402600d858154811061342257fe5b906000526020600020906007020160020160008282540192505081905550600c5483111561345257600c54613454565b825b620151808342038161346257fe5b0402600d858154811061347157fe5b90600052602060002090600702016003016000828254019250508190555042600d858154811061349d57fe5b9060005260206000209060070201600601819055505050506134c0565b5b5b5050505b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a90615b02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359a90615a82565b60405180910390fd5b600081116135e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dd906157a2565b60405180910390fd5b6135f1838383614099565b613679816040518060400160405280600981526020017f45524332303a34373000000000000000000000000000000000000000000000008152506000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061370c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137ab9190615b5d565b60405180910390a3505050565b6000838311158290613800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f791906156c0565b60405180910390fd5b5060008385039050809150509392505050565b61383b816008600085815260200190815260200160002060000161305490919063ffffffff16565b1561389c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390790615862565b60405180910390fd5b61391c60008383614099565b61393181600354612fff90919063ffffffff16565b600381905550613988816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613a289190615b5d565b60405180910390a35050565b6000613a428260000161418a565b9050919050565b6001600e60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f0846bb88ff3b4abf3ada7790ae6fc103385a19b2aed99f8e450648b9e1374a3660405160405180910390a2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1090615a62565b60405180910390fd5b613b2582600083614099565b613bad816040518060400160405280600981526020017f45524332303a32333000000000000000000000000000000000000000000000008152506000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c0481600354613e1490919063ffffffff16565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c689190615b5d565b60405180910390a35050565b6000600e60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fc21bebfeff90d942c9009e0eca370a1ab9ddc28e67af48c2a213e3e9ad65fe0860405160405180910390a2565b6001600e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f04fe8ec10fc27a3eb74bc6484c1010613b3354832dd9c927827d71388ee2677a60405160405180910390a2565b6000600e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f340bf1b235fa0bbed4b1b74504c172953a38e3ef4bd71a7042fd2a0057455b7360405160405180910390a2565b60008060009050600080855190505b80831015613e08578473ffffffffffffffffffffffffffffffffffffffff16868481518110613dce57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415613dfb5760019150613e08565b8280600101935050613da3565b81935050505092915050565b6000613e5683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137b8565b905092915050565b613e86816008600085815260200190815260200160002060000161419b90919063ffffffff16565b15613ee7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000613efa83600001836141cb565b60001c905092915050565b600d6040518060e001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020014281526020016000815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505050565b60006140128383614076565b61406b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050614070565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6140a4838383613084565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561413d576140e1612766565b6140fb826140ed610b3f565b612fff90919063ffffffff16565b111561413c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614133906157c2565b60405180910390fd5b5b6141456117ed565b15614185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161417c90615962565b60405180910390fd5b505050565b600081600001805490509050919050565b60006141c3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614238565b905092915050565b600081836000018054905011614216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161420d90615722565b60405180910390fd5b82600001828154811061422557fe5b9060005260206000200154905092915050565b60008083600101600084815260200190815260200160002054905060008114614314576000600182039050600060018660000180549050039050600086600001828154811061428357fe5b90600052602060002001549050808760000184815481106142a057fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806142d857fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061431a565b60009150505b92915050565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106143b457805160ff19168380011785556143e2565b828001600101855582156143e2579182015b828111156143e15782518255916020019190600101906143c6565b5b5090506143ef919061447d565b5090565b82805482825590600052602060002090810192821561446c579160200282015b8281111561446b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190614413565b5b509050614479919061449a565b5090565b5b8082111561449657600081600090555060010161447e565b5090565b5b808211156144d157600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010161449b565b5090565b6000813590506144e481615d9e565b92915050565b600082601f8301126144fb57600080fd5b813561450e61450982615bc0565b615b93565b9150818183526020840193506020810190508385602084028201111561453357600080fd5b60005b83811015614563578161454988826144d5565b845260208401935060208301925050600181019050614536565b5050505092915050565b60008135905061457c81615db5565b92915050565b60008135905061459181615dcc565b92915050565b600082601f8301126145a857600080fd5b81356145bb6145b682615be8565b615b93565b915080825260208301602083018583830111156145d757600080fd5b6145e2838284615d4b565b50505092915050565b6000813590506145fa81615de3565b92915050565b60006020828403121561461257600080fd5b6000614620848285016144d5565b91505092915050565b6000806040838503121561463c57600080fd5b600061464a858286016144d5565b925050602061465b858286016144d5565b9150509250929050565b60008060006060848603121561467a57600080fd5b6000614688868287016144d5565b9350506020614699868287016144d5565b92505060406146aa868287016145eb565b9150509250925092565b600080604083850312156146c757600080fd5b60006146d5858286016144d5565b92505060206146e6858286016145eb565b9150509250929050565b6000806040838503121561470357600080fd5b600083013567ffffffffffffffff81111561471d57600080fd5b614729858286016144ea565b925050602061473a858286016145eb565b9150509250929050565b60006020828403121561475657600080fd5b600061476484828501614582565b91505092915050565b6000806040838503121561478057600080fd5b600061478e85828601614582565b925050602061479f858286016144d5565b9150509250929050565b600080604083850312156147bc57600080fd5b60006147ca85828601614582565b92505060206147db858286016145eb565b9150509250929050565b6000806000606084860312156147fa57600080fd5b600084013567ffffffffffffffff81111561481457600080fd5b61482086828701614597565b935050602084013567ffffffffffffffff81111561483d57600080fd5b61484986828701614597565b925050604061485a8682870161456d565b9150509250925092565b60006020828403121561487657600080fd5b6000614884848285016145eb565b91505092915050565b600080604083850312156148a057600080fd5b60006148ae858286016145eb565b92505060206148bf858286016144d5565b9150509250929050565b600080604083850312156148dc57600080fd5b60006148ea858286016145eb565b92505060206148fb8582860161456d565b9150509250929050565b60006149118383614949565b60208301905092915050565b6000614929838361541d565b905092915050565b600061493d83836154e2565b60e08301905092915050565b61495281615cec565b82525050565b61496181615cec565b82525050565b600061497282615c44565b61497c8185615c97565b935061498783615c14565b8060005b838110156149b857815161499f8882614905565b97506149aa83615c70565b92505060018101905061498b565b5085935050505092915050565b60006149d082615c4f565b6149da8185615ca8565b9350836020820285016149ec85615c24565b8060005b85811015614a285784840389528151614a09858261491d565b9450614a1483615c7d565b925060208a019950506001810190506149f0565b50829750879550505050505092915050565b6000614a4582615c5a565b614a4f8185615cb9565b9350614a5a83615c34565b8060005b83811015614a8b578151614a728882614931565b9750614a7d83615c8a565b925050600181019050614a5e565b5085935050505092915050565b614aa181615cfe565b82525050565b614ab081615cfe565b82525050565b614abf81615d0a565b82525050565b6000614ad082615c65565b614ada8185615cca565b9350614aea818560208601615d5a565b614af381615d8d565b840191505092915050565b6000614b0982615c65565b614b138185615cdb565b9350614b23818560208601615d5a565b614b2c81615d8d565b840191505092915050565b6000614b44600783615cdb565b91507f5250433a353330000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614b84600683615cdb565b91507f42433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614bc4602283615cdb565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c2a600783615cdb565b91507f5250433a353430000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614c6a600783615cdb565b91507f5250433a353130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614caa600683615cdb565b91507f53433a36353000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614cea600983615cdb565b91507f45524332303a34383000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d2a600583615cdb565b91507f55543a32300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d6a600683615cdb565b91507f53433a36333000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614daa601b83615cdb565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614dea600683615cdb565b91507f42433a32313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614e2a600683615cdb565b91507f55543a34373000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614e6a600983615cdb565b91507f45524332303a31323000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614eaa600783615cdb565b91507f56433a31303130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614eea600783615cdb565b91507f5250433a353030000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f2a600783615cdb565b91507f56433a31303230000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f6a600983615cdb565b91507f45524332303a34363000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614faa600983615cdb565b91507f45524332303a34353000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614fea600683615cdb565b91507f53433a36343000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061502a600683615cdb565b91507f4d433a31313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061506a600683615cdb565b91507f55543a34303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006150aa600683615cdb565b91507f50433a33303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006150ea600783615cdb565b91507f5250433a353230000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061512a600783615cdb565b91507f5250433a353730000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061516a600683615cdb565b91507f4d433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151aa600583615cdb565b91507f42433a33300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151ea600783615cdb565b91507f5250433a353530000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061522a600683615cdb565b91507f53433a36363000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061526a600983615cdb565b91507f45524332303a32323000000000000000000000000000000000000000000000006000830152602082019050919050565b60006152aa600983615cdb565b91507f45524332303a34323000000000000000000000000000000000000000000000006000830152602082019050919050565b60006152ea600583615cdb565b91507f4d433a33300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061532a600683615cdb565b91507f50433a33313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061536a600683615cdb565b91507f56433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006153aa600983615cdb565b91507f45524332303a34313000000000000000000000000000000000000000000000006000830152602082019050919050565b60006153ea600783615cdb565b91507f56433a31303330000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000610100830160008301516154366000860182614949565b506020830151848203602086015261544e8282614ac5565b915050604083015184820360408601526154688282614ac5565b915050606083015161547d6060860182614a98565b50608083015161549060808601826155fe565b5060a08301516154a360a08601826155fe565b5060c083015184820360c08601526154bb8282614967565b91505060e083015184820360e08601526154d58282614967565b9150508091505092915050565b60e0820160008201516154f86000850182614949565b50602082015161550b60208501826155fe565b50604082015161551e60408501826155fe565b50606082015161553160608501826155fe565b50608082015161554460808501826155fe565b5060a082015161555760a08501826155fe565b5060c082015161556a60c08501826155fe565b50505050565b60e0820160008201516155866000850182614949565b50602082015161559960208501826155fe565b5060408201516155ac60408501826155fe565b5060608201516155bf60608501826155fe565b5060808201516155d260808501826155fe565b5060a08201516155e560a08501826155fe565b5060c08201516155f860c08501826155fe565b50505050565b61560781615d34565b82525050565b61561681615d34565b82525050565b61562581615d3e565b82525050565b60006020820190506156406000830184614958565b92915050565b6000602082019050818103600083015261566081846149c5565b905092915050565b600060208201905081810360008301526156828184614a3a565b905092915050565b600060208201905061569f6000830184614aa7565b92915050565b60006020820190506156ba6000830184614ab6565b92915050565b600060208201905081810360008301526156da8184614afe565b905092915050565b600060208201905081810360008301526156fb81614b37565b9050919050565b6000602082019050818103600083015261571b81614b77565b9050919050565b6000602082019050818103600083015261573b81614bb7565b9050919050565b6000602082019050818103600083015261575b81614c1d565b9050919050565b6000602082019050818103600083015261577b81614c5d565b9050919050565b6000602082019050818103600083015261579b81614c9d565b9050919050565b600060208201905081810360008301526157bb81614cdd565b9050919050565b600060208201905081810360008301526157db81614d1d565b9050919050565b600060208201905081810360008301526157fb81614d5d565b9050919050565b6000602082019050818103600083015261581b81614d9d565b9050919050565b6000602082019050818103600083015261583b81614ddd565b9050919050565b6000602082019050818103600083015261585b81614e1d565b9050919050565b6000602082019050818103600083015261587b81614e5d565b9050919050565b6000602082019050818103600083015261589b81614e9d565b9050919050565b600060208201905081810360008301526158bb81614edd565b9050919050565b600060208201905081810360008301526158db81614f1d565b9050919050565b600060208201905081810360008301526158fb81614f5d565b9050919050565b6000602082019050818103600083015261591b81614f9d565b9050919050565b6000602082019050818103600083015261593b81614fdd565b9050919050565b6000602082019050818103600083015261595b8161501d565b9050919050565b6000602082019050818103600083015261597b8161505d565b9050919050565b6000602082019050818103600083015261599b8161509d565b9050919050565b600060208201905081810360008301526159bb816150dd565b9050919050565b600060208201905081810360008301526159db8161511d565b9050919050565b600060208201905081810360008301526159fb8161515d565b9050919050565b60006020820190508181036000830152615a1b8161519d565b9050919050565b60006020820190508181036000830152615a3b816151dd565b9050919050565b60006020820190508181036000830152615a5b8161521d565b9050919050565b60006020820190508181036000830152615a7b8161525d565b9050919050565b60006020820190508181036000830152615a9b8161529d565b9050919050565b60006020820190508181036000830152615abb816152dd565b9050919050565b60006020820190508181036000830152615adb8161531d565b9050919050565b60006020820190508181036000830152615afb8161535d565b9050919050565b60006020820190508181036000830152615b1b8161539d565b9050919050565b60006020820190508181036000830152615b3b816153dd565b9050919050565b600060e082019050615b576000830184615570565b92915050565b6000602082019050615b72600083018461560d565b92915050565b6000602082019050615b8d600083018461561c565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615bb657600080fd5b8060405250919050565b600067ffffffffffffffff821115615bd757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115615bff57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615cf782615d14565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615d78578082015181840152602081019050615d5d565b83811115615d87576000848401525b50505050565b6000601f19601f8301169050919050565b615da781615cec565b8114615db257600080fd5b50565b615dbe81615cfe565b8114615dc957600080fd5b50565b615dd581615d0a565b8114615de057600080fd5b50565b615dec81615d34565b8114615df757600080fd5b5056fea2646970667358221220d4f3e80dd8feab818af785f712fa3c5060f951b5944ea729ecc6902b0e81613964736f6c634300060c0033

Deployed Bytecode Sourcemap

3508:241:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;959:80:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2019:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2885:108:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1328:97:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4793:660:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2209:304:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3127:118:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2742:119:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2754:718:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3601:407:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1135:80:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1221:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1947:135:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2519:231:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3969:408:4;;;:::i;:::-;;1605:122:10;;;:::i;:::-;;3144:188:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2634:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1436:91:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;403:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;831:67:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1200:75:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1307:446:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3938:206:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1540:123:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2481:94:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3818:338:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2691:94:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1297:337:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1380:120:10;;;:::i;:::-;;625:41:11;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4954:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1603:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;404:57:9;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1045:84:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2348:148:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1437:91:9;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1998:188:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2756:254:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1242:712:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3187:290:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1669:178:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1431:103;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2474:100:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4235:99:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4366:409:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1853:160:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3644:119:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3691:54:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2724:159:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;787:59;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3227:443:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;959:80:6;999:13;1028:5;1021:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;959:80;:::o;2019:184::-;2117:4;2130:49;2139:10;2151:7;2171:5;2161:6;:16;2130:8;:49::i;:::-;2193:4;2186:11;;2019:184;;;;:::o;2885:108:13:-;2939:20;2975:12;2968:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2885:108;:::o;1328:97:6:-;1384:7;1407:12;;1400:19;;1328:97;:::o;4793:660:4:-;1280:31:11;662:4;1288:10;;1300;1280:7;:31::i;:::-;1264:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;4891:9:4::1;4911:18:::0;4944:11:::1;4958:12;:19;;;;4944:33;;4984:139;4995:3;4991:1;:7;4984:139;;;5038:7;5013:32;;:12;5026:1;5013:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:32;;;5009:95;;;5074:4;5058:20;;5089:5;;5009:95;5112:3;;;;;;;4984:139;;;5147:13;5131:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;5197:13;5193:255;;;5221:17;5236:1;5221:14;:17::i;:::-;5276:12;5289:1;5276:15;;;;;;;;;;;;;;;;;;:31;;;5265:7;:42;;5247:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;5381:7;5346:12;5359:1;5346:15;;;;;;;;;;;;;;;;;;:31;;;:42;;;;;;;;;;;5433:7;5397:12;5410:1;5397:15;;;;;;;;;;;;;;;;;;:32;;;:43;;;;;;;;;;;5193:255;1343:1:11;;;4793:660:4::0;;:::o;2209:304:6:-;2335:4;2348:36;2358:6;2366:9;2377:6;2348:9;:36::i;:::-;2391:98;2400:6;2408:10;2420:68;2467:5;2457:6;:16;2420:68;;;;;;;;;;;;;;;;;:11;:19;2432:6;2420:19;;;;;;;;;;;;;;;:31;2440:10;2420:31;;;;;;;;;;;;;;;;:35;;:68;;;;;:::i;:::-;2391:8;:98::i;:::-;2503:4;2496:11;;2209:304;;;;;:::o;3127:118:11:-;1280:31;662:4;1288:10;;1300;1280:7;:31::i;:::-;1264:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;3210:29:::1;826:20;3235:3;3210:10;:29::i;:::-;3127:118:::0;:::o;2742:119:14:-;1280:31:11;662:4;1288:10;;1300;1280:7;:31::i;:::-;1264:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;2848:7:14::1;2830:15;:25;;;;2742:119:::0;:::o;2754:718:4:-;2835:7;1414:1:13;1404:7;:11;1388:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;2870:7:4::1;2139:30:13;;:::i;:::-;2172:29;2190:10;2172:17;:29::i;:::-;2139:62;;2236:11;:17;;;2225:7;:28;;2209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2890:9:4::2;2910:18:::0;2943:11:::2;2957:12;:19;;;;2943:33;;2983:142;2994:3;2990:1;:7;2983:142;;;3037:10;3012:35;;:12;3025:1;3012:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:35;;;3008:98;;;3076:4;3060:20;;3091:5;;3008:98;3114:3;;;;;;;2983:142;;;3149:13;3133:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3199:13;3195:272;;;3238:12;3251:1;3238:15;;;;;;;;;;;;;;;;;;:21;;;3227:7;:32;3223:237;;3297:7;3272:12;3285:1;3272:15;;;;;;;;;;;;;;;;;;:21;;;:32;;;;;;;;;;;3315:38;3321:10;3345:5;3334:7;:17;3315:5;:38::i;:::-;3398:5;3387:7;:17;3364:18;;:41;;;;;;;;;;;3430:10;3421:29;;;3442:7;3421:29;;;;;;:::i;:::-;;;;;;;;3223:237;3195:272;2284:1:13;;;1446::::1;;2754:718:4::0;;:::o;3601:407:11:-;3701:33;826:20;3723:10;3701:7;:33::i;:::-;3685:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;662:4;3793:10;;3784:5;:19;;3768:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;3842:31;662:4;3850:10;;3862;3842:7;:31::i;:::-;3837:135;;3911:24;3902:5;:33;3884:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;3837:135;3980:22;3991:5;3998:3;3980:10;:22::i;:::-;3601:407;;:::o;1135:80:6:-;1179:5;1200:9;;;;;;;;;;;1193:16;;1135:80;:::o;1221:101::-;1279:7;1302:14;;1295:21;;1221:101;:::o;1947:135:11:-;2023:7;2046:30;:6;:13;2053:5;2046:13;;;;;;;;;;;:21;;:28;:30::i;:::-;2039:37;;1947:135;;;:::o;2519:231:6:-;2622:4;2635:91;2644:10;2656:7;2665:60;2717:5;2703:10;:20;2665:11;:23;2677:10;2665:23;;;;;;;;;;;;;;;:32;2689:7;2665:32;;;;;;;;;;;;;;;;:36;;:60;;;;:::i;:::-;2635:8;:91::i;:::-;2740:4;2733:11;;2519:231;;;;:::o;3969:408:4:-;4014:9;4034:18;4067:11;4081:12;:19;;;;4067:33;;4107:142;4118:3;4114:1;:7;4107:142;;;4161:10;4136:35;;:12;4149:1;4136:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:35;;;4132:98;;;4200:4;4184:20;;4215:5;;4132:98;4238:3;;;;;;;4107:142;;;4273:13;4257:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;4323:13;4319:53;;;4347:17;4362:1;4347:14;:17::i;:::-;4319:53;3969:408;;;:::o;1605:122:10:-;945:7;;;;;;;;;;;929:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1280:31:11::1;662:4;1288:10:::0;::::1;1300;1280:7;:31::i;:::-;1264:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;1684:5:10::2;1674:7;;:15;;;;;;;;;;;;;;;;;;1710:10;1701:20;;;;;;;;;;;;1605:122::o:0;3144:188:5:-;3217:7;3231:32;441:19:1;3252:10:5;3231:7;:32::i;:::-;1014:8:1;998:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1081:1;1071:7;:11;1055:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;1114:16;:14;:16::i;:::-;1155;:14;:16::i;:::-;1139:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3276:26:5::1;3282:10;3294:7;3276:5;:26::i;:::-;3309:17;:15;:17::i;:::-;3144:188:::0;;;:::o;2634:201::-;2727:7;2741:32;442:19:9;2762:10:5;2741:7;:32::i;:::-;1015:8:9;999:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1082:1;1072:7;:11;1056:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;1115:16;:14;:16::i;:::-;1156;:14;:16::i;:::-;1140:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2786:19:5::1;2792:3;2797:7;2786:5;:19::i;:::-;2812:17;:15;:17::i;:::-;2634:201:::0;;;;:::o;1436:91:1:-;1486:4;1506:15;;;;;;;;;;;1499:22;;1436:91;:::o;403:57::-;441:19;403:57;:::o;831:67:14:-;874:24;831:67;:::o;1200:75:10:-;1242:4;1262:7;;;;;;;;;;;1255:14;;1200:75;:::o;1307:446:3:-;1416:3;1426:21;1436:10;1426:9;:21::i;:::-;1644:5:14;1625:15;;:25;1612:8;:39;;1596:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;1685:17;1705:63;1726:9;1736:3;1726:14;;;;;;;;;;;;;;;;;;:29;;1705:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1757:10;1705:20;:63::i;:::-;1685:83;;1775:17;1795:63;1816:9;1826:3;1816:14;;;;;;;;;;;;;;;;;;:29;;1795:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1847:10;1795:20;:63::i;:::-;1775:83;;1884:12;1883:13;:30;;;;;1901:12;1900:13;1883:30;1867:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;1473:3:3::1;2224:9:14;2234:3;2224:14;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;2208:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1493:15:3::2;1489:125;;;1550:1;1519:9;1529:3;1519:14;;;;;;;;;;;;;;;;;;:27;;;:32;;;;;;;;;;;1560:9;1570:3;1560:14;;;;;;;;;;;;;;;;;;:29;;1595:10;1560:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1489:125;1627:15;1622:126;;1684:1;1653:9;1663:3;1653:14;;;;;;;;;;;;;;;;;;:27;;;:32;;;;;;;;;;;1694:9;1704:3;1694:14;;;;;;;;;;;;;;;;;;:29;;1729:10;1694:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1622:126;1945:1:14::1;1307:446:3::0;;;;;;:::o;3938:206:14:-;1158:37;874:24;1184:10;1158:7;:37::i;:::-;1142:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;4023:9:::1;4033:3;4023:14;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;:115;;4134:4;4103:9;4113:3;4103:14;;;;;;;;;;;;;;;;;;:28;;;:35;;;;;;;;;;;;;;;;;4023:115;;;4090:5;4059:9;4069:3;4059:14;;;;;;;;;;;;;;;;;;:28;;;:36;;;;;;;;;;;;;;;;;4023:115;;3938:206:::0;:::o;1540:123:6:-;1616:7;1639:9;:18;1649:7;1639:18;;;;;;;;;;;;;;;;1632:25;;1540:123;;;:::o;2481:94:14:-;2531:7;2554:15;;2547:22;;2481:94;:::o;3818:338:5:-;3915:7;3929:32;441:19:1;3950:10:5;3929:7;:32::i;:::-;1014:8:1;998:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1081:1;1071:7;:11;1055:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;1114:16;:14;:16::i;:::-;1155;:14;:16::i;:::-;1139:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3974:26:5::1;4003:41;4036:7;4003:28;4013:5;4020:10;4003:9;:28::i;:::-;:32;;:41;;;;:::i;:::-;3974:70;;4051:47;4060:5;4067:10;4079:18;4051:8;:47::i;:::-;4105:21;4111:5;4118:7;4105:5;:21::i;:::-;4133:17;:15;:17::i;:::-;1202:1:1;3818:338:5::0;;;;:::o;2691:94:13:-;2741:7;2764:15;;2757:22;;2691:94;:::o;1297:337:5:-;1403:9;1423:11;1437:10;:17;1423:31;;1515:3;1505:7;:13;1479:21;1489:10;1479:9;:21::i;:::-;:40;;1463:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;1552:77;1563:3;1559:1;:7;1552:77;;;1577:32;1586:10;1597:1;1586:13;;;;;;;;;;;;;;1601:7;1577:8;:32::i;:::-;;1618:3;;;;;;;1552:77;;;1297:337;;;;:::o;1380:120:10:-;736:7;;;;;;;;;;;735:8;719:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1280:31:11::1;662:4;1288:10:::0;::::1;1300;1280:7;:31::i;:::-;1264:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;1460:4:10::2;1450:7;;:14;;;;;;;;;;;;;;;;;;1483:10;1476:18;;;;;;;;;;;;1380:120::o:0;625:41:11:-;662:4;625:41;;;:::o;4954:250::-;662:4;5048:10;;5039:5;:19;;5023:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5108:26;5116:5;5123:10;5108:7;:26::i;:::-;5092:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5168:30;5180:5;5187:10;5168:11;:30::i;:::-;4954:250;:::o;1603:152::-;1689:4;1709:40;1740:8;1709:6;:13;1716:5;1709:13;;;;;;;;;;;:21;;:30;;:40;;;;:::i;:::-;1702:47;;1603:152;;;;:::o;404:57:9:-;442:19;404:57;:::o;1045:84:6:-;1087:13;1116:7;1109:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1045:84;:::o;2348:148:11:-;2438:7;2461:29;2486:3;2461:6;:13;2468:5;2461:13;;;;;;;;;;;:21;;:24;;:29;;;;:::i;:::-;2454:36;;2348:148;;;;:::o;1437:91:9:-;1487:4;1507:15;;;;;;;;;;;1500:22;;1437:91;:::o;1998:188:5:-;2071:7;2085:32;442:19:9;2106:10:5;2085:7;:32::i;:::-;1015:8:9;999:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1082:1;1072:7;:11;1056:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;1115:16;:14;:16::i;:::-;1156;:14;:16::i;:::-;1140:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2130:26:5::1;2136:10;2148:7;2130:5;:26::i;:::-;2163:17;:15;:17::i;:::-;1998:188:::0;;;:::o;2756:254:6:-;2864:4;2877:109;2886:10;2898:7;2907:78;2964:5;2945:15;:25;2907:78;;;;;;;;;;;;;;;;;:11;:23;2919:10;2907:23;;;;;;;;;;;;;;;:32;2931:7;2907:32;;;;;;;;;;;;;;;;:36;;:78;;;;;:::i;:::-;2877:8;:109::i;:::-;3000:4;2993:11;;2756:254;;;;:::o;1242:712:4:-;1319:7;1333:21;1343:10;1333:9;:21::i;:::-;1817:8:13;1806:5;1795:7;:17;1794:31;;1778:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;1382:7:4::1;1414:1:13;1404:7;:11;1388:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;1402:9:4::2;1422:18:::0;1455:11:::2;1469:12;:19;;;;1455:33;;1495:142;1506:3;1502:1;:7;1495:142;;;1549:10;1524:35;;:12;1537:1;1524:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:35;;;1520:98;;;1588:4;1572:20;;1603:5;;1520:98;1626:3;;;;;;;1495:142;;;1649:13;1645:206;;;1698:7;1673:12;1686:1;1673:15;;;;;;;;;;;;;;;;;;:21;;;:32;;;;;;;;;;;1714:38;1720:10;1744:5;1733:7;:17;1714:5;:38::i;:::-;1795:5;1784:7;:17;1761:18;;:41;;;;;;;;;;;1823:10;1816:27;;;1835:7;1816:27;;;;;;:::i;:::-;;;;;;;;1645:206;1864:13;1859:90;;1888:30;1907:10;1888:18;:30::i;:::-;1927:14;1933:7;1927:5;:14::i;:::-;1859:90;1446:1:13;;;1856::::1;1242:712:4::0;;;:::o;3187:290:13:-;3261:18;;:::i;:::-;3288:9;3308:11;3322:12;:19;;;;3308:33;;3348:124;3359:3;3355:1;:7;3348:124;;;3402:6;3377:31;;:12;3390:1;3377:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:31;;;3373:80;;;3428:12;3441:1;3428:15;;;;;;;;;;;;;;;;;;3421:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3373:80;3461:3;;;;;;;3348:124;;;3187:290;;;;;;:::o;1669:178:6:-;1770:4;1783:40;1793:10;1805:9;1816:6;1783:9;:40::i;:::-;1837:4;1830:11;;1669:178;;;;:::o;1431:103::-;1490:7;1513:15;;1506:22;;1431:103;:::o;2474:100:13:-;2527:7;2550:18;;2543:25;;2474:100;:::o;4235:99:14:-;4286:17;4319:9;4312:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4235:99;:::o;4366:409:11:-;4467:33;826:20;4489:10;4467:7;:33::i;:::-;4451:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;662:4;4559:10;;4550:5;:19;;4534:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;4608:31;662:4;4616:10;;4628;4608:7;:31::i;:::-;4603:135;;4677:24;4668:5;:33;4650:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;4603:135;4746:23;4758:5;4765:3;4746:11;:23::i;:::-;4366:409;;:::o;1853:160:6:-;1957:7;1980:11;:18;1992:5;1980:18;;;;;;;;;;;;;;;:27;1999:7;1980:27;;;;;;;;;;;;;;;;1973:34;;1853:160;;;;:::o;3644:119:13:-;1280:31:11;662:4;1288:10;;1300;1280:7;:31::i;:::-;1264:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;3750:7:13::1;3732:15;:25;;;;3644:119:::0;:::o;3691:54:2:-;;;;;;;;;;;;;;;;;;;:::o;2724:159:11:-;1280:31;662:4;1288:10;;1300;1280:7;:31::i;:::-;1264:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;2808:27:::1;662:4;2819:10:::0;::::1;2831:3;2808:10;:27::i;:::-;2842:35;662:4;2854:10:::0;::::1;2866;2842:11;:35::i;:::-;2724:159:::0;:::o;787:59::-;826:20;787:59;:::o;3227:443:14:-;1158:37;874:24;1184:10;1158:7;:37::i;:::-;1142:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;3364:9:::1;3387:270;;;;;;;;3416:10;3387:270;;;;;;3443:5;3387:270;;;;3472:4;3387:270;;;;3502:7;3387:270;;;;;;3534:1;3387:270;;;;3560:1;3387:270;;;;3602:1;3588:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3387:270;;;;3645:1;3631:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3387:270;;::::0;3364:300:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;3227:443:::0;;;:::o;195:182:12:-;268:7;284:9;300:1;296;:5;284:17;;321:1;316;:6;;308:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;370:1;363:8;;;195:182;;;;:::o;1670:152:7:-;1755:4;1775:41;1780:3;:10;;1808:5;1800:14;;1792:23;;1775:4;:41::i;:::-;1768:48;;1670:152;;;;:::o;4787:111:6:-;;;;:::o;1992:167:7:-;2087:4;2107:46;2117:3;:10;;2145:5;2137:14;;2129:23;;2107:9;:46::i;:::-;2100:53;;1992:167;;;;:::o;4343:338:6:-;4486:1;4469:19;;:5;:19;;;;4453:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4557:1;4538:21;;:7;:21;;;;4522:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4625:6;4595:11;:18;4607:5;4595:18;;;;;;;;;;;;;;;:27;4614:7;4595:27;;;;;;;;;;;;;;;:36;;;;4659:7;4643:32;;4652:5;4643:32;;;4668:6;4643:32;;;;;;:::i;:::-;;;;;;;;4343:338;;;:::o;5083:1430:13:-;5154:13;5170:12;5183:3;5170:17;;;;;;;;;;;;;;;;;;:23;;;5154:39;;5200:28;5231:12;5244:3;5231:17;;;;;;;;;;;;;;;;;;:40;;;5200:71;;5278:17;5298:12;5311:3;5298:17;;;;;;;;;;;;;;;;;;:27;;;5278:47;;5362:1;5338:20;:25;5334:561;;;5390:3;5378:9;:15;5374:514;;;5431:6;5417:9;5411:3;:15;5410:27;5406:473;;5545:15;;5536:5;:24;;:63;;5584:15;;5536:63;;;5576:5;5536:63;5511:6;5498:9;5492:3;:15;5491:26;;;;;;5490:122;5452:12;5465:3;5452:17;;;;;;;;;;;;;;;;;;:33;;;:161;;;;;;;;;;;5721:15;;5712:5;:24;;:63;;5760:15;;5712:63;;;5752:5;5712:63;5687:6;5674:9;5668:3;:15;5667:26;;;;;;5666:122;5626:12;5639:3;5626:17;;;;;;;;;;;;;;;;;;:35;;;:163;;;;;;;;;;;5845:3;5802:12;5815:3;5802:17;;;;;;;;;;;;;;;;;;:40;;:46;;;;5861:7;;;;;5406:473;5374:514;5334:561;5931:1;5907:20;:25;5903:605;;5970:3;5947:20;:26;5943:558;;;6022:6;5997:20;5991:3;:26;5990:38;5986:506;;6147:15;;6138:5;:24;;:63;;6186:15;;6138:63;;;6178:5;6138:63;6113:6;6089:20;6083:3;:26;6082:37;;;;;;6081:133;6043:12;6056:3;6043:17;;;;;;;;;;;;;;;;;;:33;;;:172;;;;;;;;;;;6334:15;;6325:5;:24;;:63;;6373:15;;6325:63;;;6365:5;6325:63;6300:6;6276:20;6270:3;:26;6269:37;;;;;;6268:133;6228:12;6241:3;6228:17;;;;;;;;;;;;;;;;;;:35;;;:174;;;;;;;;;;;6458:3;6415:12;6428:3;6415:17;;;;;;;;;;;;;;;;;;:40;;:46;;;;6474:7;;;;;5986:506;5943:558;5903:605;5083:1430;;;;;:::o;3016:556:6:-;3164:1;3146:20;;:6;:20;;;;3130:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3239:1;3218:23;;:9;:23;;;;3202:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;3302:1;3293:6;:10;3277:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3339:47;3360:6;3368:9;3379:6;3339:20;:47::i;:::-;3415:42;3437:6;3415:42;;;;;;;;;;;;;;;;;:9;:17;3425:6;3415:17;;;;;;;;;;;;;;;;:21;;:42;;;;;:::i;:::-;3395:9;:17;3405:6;3395:17;;;;;;;;;;;;;;;:62;;;;3487:32;3512:6;3487:9;:20;3497:9;3487:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;3464:9;:20;3474:9;3464:20;;;;;;;;;;;;;;;:55;;;;3548:9;3531:35;;3540:6;3531:35;;;3559:6;3531:35;;;;;;:::i;:::-;;;;;;;;3016:556;;;:::o;534:198:12:-;640:7;669:1;664;:6;;672:12;656:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;692:9;708:1;704;:5;692:17;;725:1;718:8;;;534:198;;;;;:::o;5331:176:11:-;5413:30;5439:3;5413:6;:13;5420:5;5413:13;;;;;;;;;;;:21;;:25;;:30;;;;:::i;:::-;5409:93;;;5483:10;5459:35;;5478:3;5459:35;;5471:5;5459:35;;;;;;;;;;5409:93;5331:176;;:::o;3578:370:6:-;3700:1;3681:21;;:7;:21;;;;3665:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;3738:49;3767:1;3771:7;3780:6;3738:20;:49::i;:::-;3811:24;3828:6;3811:12;;:16;;:24;;;;:::i;:::-;3796:12;:39;;;;3863:30;3886:6;3863:9;:18;3873:7;3863:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;3842:9;:18;3852:7;3842:18;;;;;;;;;;;;;;;:51;;;;3926:7;3905:37;;3922:1;3905:37;;;3935:6;3905:37;;;;;;:::i;:::-;;;;;;;;3578:370;;:::o;2165:121:7:-;2238:7;2261:19;2269:3;:10;;2261:7;:19::i;:::-;2254:26;;2165:121;;;:::o;1640:119:1:-;1711:4;1693:15;;:22;;;;;;;;;;;;;;;;;;1742:10;1727:26;;;;;;;;;;;;1640:119::o;3954:383:6:-;4076:1;4057:21;;:7;:21;;;;4041:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4114:49;4135:7;4152:1;4156:6;4114:20;:49::i;:::-;4193:43;4216:6;4193:43;;;;;;;;;;;;;;;;;:9;:18;4203:7;4193:18;;;;;;;;;;;;;;;;:22;;:43;;;;;:::i;:::-;4172:9;:18;4182:7;4172:18;;;;;;;;;;;;;;;:64;;;;4258:24;4275:6;4258:12;;:16;;:24;;;;:::i;:::-;4243:12;:39;;;;4320:1;4294:37;;4303:7;4294:37;;;4324:6;4294:37;;;;;;:::i;:::-;;;;;;;;3954:383;;:::o;1874:122:1:-;1946:5;1928:15;;:23;;;;;;;;;;;;;;;;;;1979:10;1963:27;;;;;;;;;;;;1874:122::o;1641:119:9:-;1712:4;1694:15;;:22;;;;;;;;;;;;;;;;;;1743:10;1728:26;;;;;;;;;;;;1641:119::o;1875:122::-;1947:5;1929:15;;:23;;;;;;;;;;;;;;;;;;1980:10;1964:27;;;;;;;;;;;;1875:122::o;4623:347:14:-;4732:4;4745:9;4757:1;4745:13;;4765:10;4790:11;4804:7;:14;4790:28;;4825:119;4836:3;4832:1;:7;4825:119;;;4868:6;4854:20;;:7;4862:1;4854:10;;;;;;;;;;;;;;:20;;;4850:75;;;4895:4;4887:12;;4910:5;;4850:75;4933:3;;;;;;;4825:119;;;4959:5;4952:12;;;;;4623:347;;;;:::o;383:145:12:-;456:7;479:43;483:1;486;479:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;472:50;;383:145;;;;:::o;5513:180:11:-;5596:33;5625:3;5596:6;:13;5603:5;5596:13;;;;;;;;;;;:21;;:28;;:33;;;;:::i;:::-;5592:96;;;5669:10;5645:35;;5664:3;5645:35;;5657:5;5645:35;;;;;;;;;;5592:96;5513:180;;:::o;2292:158:7:-;2381:7;2420:22;2424:3;:10;;2436:5;2420:3;:22::i;:::-;2412:31;;2397:47;;2292:158;;;;:::o;3926:303:13:-;4004:12;4022:200;;;;;;;;4050:6;4022:200;;;;;;4072:1;4022:200;;;;4122:1;4022:200;;;;4151:1;4022:200;;;;4179:1;4022:200;;;;4093:3;4022:200;;;;4213:1;4022:200;;;4004:219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3926:303;:::o;297:268:7:-;375:4;393:21;403:3;408:5;393:9;:21::i;:::-;388:172;;425:3;:11;;442:5;425:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;479:3;:11;;:18;;;;457:3;:12;;:19;470:5;457:19;;;;;;;;;;;:40;;;;513:4;506:11;;;;388:172;547:5;540:12;;297:268;;;;;:::o;1145:138::-;1233:4;1276:1;1253:3;:12;;:19;1266:5;1253:19;;;;;;;;;;;;:24;;1246:31;;1145:138;;;;:::o;4435:372:5:-;4560:44;4587:4;4593:2;4597:6;4560:26;:44::i;:::-;4633:1;4617:18;;:4;:18;;;4613:131;;;4693:16;:14;:16::i;:::-;4664:25;4682:6;4664:13;:11;:13::i;:::-;:17;;:25;;;;:::i;:::-;:45;;4646:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;4613:131;4769:8;:6;:8::i;:::-;4768:9;4752:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;4435:372;;;:::o;1289:113:7:-;1355:7;1378:3;:11;;:18;;;;1371:25;;1289:113;;;:::o;1828:158::-;1916:4;1936:44;1944:3;:10;;1972:5;1964:14;;1956:23;;1936:7;:44::i;:::-;1929:51;;1828:158;;;;:::o;1408:209::-;1490:7;1535:5;1514:3;:11;;:18;;;;:26;1506:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1593:3;:11;;1605:5;1593:18;;;;;;;;;;;;;;;;1586:25;;1408:209;;;;:::o;571:568::-;652:4;665:18;686:3;:12;;:19;699:5;686:19;;;;;;;;;;;;665:40;;732:1;718:10;:15;714:420;;744:21;781:1;768:10;:14;744:38;;791:17;832:1;811:3;:11;;:18;;;;:22;791:42;;842:17;862:3;:11;;874:9;862:22;;;;;;;;;;;;;;;;842:42;;922:9;893:3;:11;;905:13;893:26;;;;;;;;;;;;;;;:38;;;;982:1;966:13;:17;940:3;:12;;:23;953:9;940:23;;;;;;;;;;;:43;;;;1019:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;1052:3;:12;;:19;1065:5;1052:19;;;;;;;;;;;1045:26;;;1087:4;1080:11;;;;;;;;714:420;1121:5;1114:12;;;571:568;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;160:707::-;;277:3;270:4;262:6;258:17;254:27;244:2;;295:1;292;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;:::i;:::-;354:80;:::i;:::-;345:89;;451:5;476:6;469:5;462:21;506:4;498:6;494:17;484:27;;528:4;523:3;519:14;512:21;;581:6;628:3;620:4;612:6;608:17;603:3;599:27;596:36;593:2;;;645:1;642;635:12;593:2;670:1;655:206;680:6;677:1;674:13;655:206;;;738:3;760:37;793:3;781:10;760:37;:::i;:::-;755:3;748:50;821:4;816:3;812:14;805:21;;849:4;844:3;840:14;833:21;;712:149;702:1;699;695:9;690:14;;655:206;;;659:14;237:630;;;;;;;:::o;875:124::-;;952:6;939:20;930:29;;964:30;988:5;964:30;:::i;:::-;924:75;;;;:::o;1006:130::-;;1086:6;1073:20;1064:29;;1098:33;1125:5;1098:33;:::i;:::-;1058:78;;;;:::o;1144:442::-;;1246:3;1239:4;1231:6;1227:17;1223:27;1213:2;;1264:1;1261;1254:12;1213:2;1301:6;1288:20;1323:65;1338:49;1380:6;1338:49;:::i;:::-;1323:65;:::i;:::-;1314:74;;1408:6;1401:5;1394:21;1444:4;1436:6;1432:17;1477:4;1470:5;1466:16;1512:3;1503:6;1498:3;1494:16;1491:25;1488:2;;;1529:1;1526;1519:12;1488:2;1539:41;1573:6;1568:3;1563;1539:41;:::i;:::-;1206:380;;;;;;;:::o;1594:130::-;;1674:6;1661:20;1652:29;;1686:33;1713:5;1686:33;:::i;:::-;1646:78;;;;:::o;1731:241::-;;1835:2;1823:9;1814:7;1810:23;1806:32;1803:2;;;1851:1;1848;1841:12;1803:2;1886:1;1903:53;1948:7;1939:6;1928:9;1924:22;1903:53;:::i;:::-;1893:63;;1865:97;1797:175;;;;:::o;1979:366::-;;;2100:2;2088:9;2079:7;2075:23;2071:32;2068:2;;;2116:1;2113;2106:12;2068:2;2151:1;2168:53;2213:7;2204:6;2193:9;2189:22;2168:53;:::i;:::-;2158:63;;2130:97;2258:2;2276:53;2321:7;2312:6;2301:9;2297:22;2276:53;:::i;:::-;2266:63;;2237:98;2062:283;;;;;:::o;2352:491::-;;;;2490:2;2478:9;2469:7;2465:23;2461:32;2458:2;;;2506:1;2503;2496:12;2458:2;2541:1;2558:53;2603:7;2594:6;2583:9;2579:22;2558:53;:::i;:::-;2548:63;;2520:97;2648:2;2666:53;2711:7;2702:6;2691:9;2687:22;2666:53;:::i;:::-;2656:63;;2627:98;2756:2;2774:53;2819:7;2810:6;2799:9;2795:22;2774:53;:::i;:::-;2764:63;;2735:98;2452:391;;;;;:::o;2850:366::-;;;2971:2;2959:9;2950:7;2946:23;2942:32;2939:2;;;2987:1;2984;2977:12;2939:2;3022:1;3039:53;3084:7;3075:6;3064:9;3060:22;3039:53;:::i;:::-;3029:63;;3001:97;3129:2;3147:53;3192:7;3183:6;3172:9;3168:22;3147:53;:::i;:::-;3137:63;;3108:98;2933:283;;;;;:::o;3223:502::-;;;3369:2;3357:9;3348:7;3344:23;3340:32;3337:2;;;3385:1;3382;3375:12;3337:2;3448:1;3437:9;3433:17;3420:31;3471:18;3463:6;3460:30;3457:2;;;3503:1;3500;3493:12;3457:2;3523:78;3593:7;3584:6;3573:9;3569:22;3523:78;:::i;:::-;3513:88;;3399:208;3638:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3617:98;3331:394;;;;;:::o;3732:241::-;;3836:2;3824:9;3815:7;3811:23;3807:32;3804:2;;;3852:1;3849;3842:12;3804:2;3887:1;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3866:97;3798:175;;;;:::o;3980:366::-;;;4101:2;4089:9;4080:7;4076:23;4072:32;4069:2;;;4117:1;4114;4107:12;4069:2;4152:1;4169:53;4214:7;4205:6;4194:9;4190:22;4169:53;:::i;:::-;4159:63;;4131:97;4259:2;4277:53;4322:7;4313:6;4302:9;4298:22;4277:53;:::i;:::-;4267:63;;4238:98;4063:283;;;;;:::o;4353:366::-;;;4474:2;4462:9;4453:7;4449:23;4445:32;4442:2;;;4490:1;4487;4480:12;4442:2;4525:1;4542:53;4587:7;4578:6;4567:9;4563:22;4542:53;:::i;:::-;4532:63;;4504:97;4632:2;4650:53;4695:7;4686:6;4675:9;4671:22;4650:53;:::i;:::-;4640:63;;4611:98;4436:283;;;;;:::o;4726:697::-;;;;4881:2;4869:9;4860:7;4856:23;4852:32;4849:2;;;4897:1;4894;4887:12;4849:2;4960:1;4949:9;4945:17;4932:31;4983:18;4975:6;4972:30;4969:2;;;5015:1;5012;5005:12;4969:2;5035:63;5090:7;5081:6;5070:9;5066:22;5035:63;:::i;:::-;5025:73;;4911:193;5163:2;5152:9;5148:18;5135:32;5187:18;5179:6;5176:30;5173:2;;;5219:1;5216;5209:12;5173:2;5239:63;5294:7;5285:6;5274:9;5270:22;5239:63;:::i;:::-;5229:73;;5114:194;5339:2;5357:50;5399:7;5390:6;5379:9;5375:22;5357:50;:::i;:::-;5347:60;;5318:95;4843:580;;;;;:::o;5430:241::-;;5534:2;5522:9;5513:7;5509:23;5505:32;5502:2;;;5550:1;5547;5540:12;5502:2;5585:1;5602:53;5647:7;5638:6;5627:9;5623:22;5602:53;:::i;:::-;5592:63;;5564:97;5496:175;;;;:::o;5678:366::-;;;5799:2;5787:9;5778:7;5774:23;5770:32;5767:2;;;5815:1;5812;5805:12;5767:2;5850:1;5867:53;5912:7;5903:6;5892:9;5888:22;5867:53;:::i;:::-;5857:63;;5829:97;5957:2;5975:53;6020:7;6011:6;6000:9;5996:22;5975:53;:::i;:::-;5965:63;;5936:98;5761:283;;;;;:::o;6051:360::-;;;6169:2;6157:9;6148:7;6144:23;6140:32;6137:2;;;6185:1;6182;6175:12;6137:2;6220:1;6237:53;6282:7;6273:6;6262:9;6258:22;6237:53;:::i;:::-;6227:63;;6199:97;6327:2;6345:50;6387:7;6378:6;6367:9;6363:22;6345:50;:::i;:::-;6335:60;;6306:95;6131:280;;;;;:::o;6419:173::-;;6506:46;6548:3;6540:6;6506:46;:::i;:::-;6581:4;6576:3;6572:14;6558:28;;6499:93;;;;:::o;6601:257::-;;6754:98;6848:3;6840:6;6754:98;:::i;:::-;6740:112;;6733:125;;;;:::o;6867:289::-;;7012:104;7112:3;7104:6;7012:104;:::i;:::-;7145:4;7140:3;7136:14;7122:28;;7005:151;;;;:::o;7164:103::-;7237:24;7255:5;7237:24;:::i;:::-;7232:3;7225:37;7219:48;;:::o;7274:113::-;7357:24;7375:5;7357:24;:::i;:::-;7352:3;7345:37;7339:48;;:::o;7425:670::-;;7560:54;7608:5;7560:54;:::i;:::-;7627:76;7696:6;7691:3;7627:76;:::i;:::-;7620:83;;7724:56;7774:5;7724:56;:::i;:::-;7800:7;7828:1;7813:260;7838:6;7835:1;7832:13;7813:260;;;7905:6;7899:13;7926:63;7985:3;7970:13;7926:63;:::i;:::-;7919:70;;8006:60;8059:6;8006:60;:::i;:::-;7996:70;;7870:203;7860:1;7857;7853:9;7848:14;;7813:260;;;7817:14;8086:3;8079:10;;7539:556;;;;;;;:::o;8168:1056::-;;8365:80;8439:5;8365:80;:::i;:::-;8458:112;8563:6;8558:3;8458:112;:::i;:::-;8451:119;;8593:3;8635:4;8627:6;8623:17;8618:3;8614:27;8662:82;8738:5;8662:82;:::i;:::-;8764:7;8792:1;8777:408;8802:6;8799:1;8796:13;8777:408;;;8864:9;8858:4;8854:20;8849:3;8842:33;8909:6;8903:13;8931:116;9042:4;9027:13;8931:116;:::i;:::-;8923:124;;9064:86;9143:6;9064:86;:::i;:::-;9054:96;;9173:4;9168:3;9164:14;9157:21;;8834:351;8824:1;8821;8817:9;8812:14;;8777:408;;;8781:14;9198:4;9191:11;;9215:3;9208:10;;8344:880;;;;;;;;;:::o;9305:922::-;;9508:83;9585:5;9508:83;:::i;:::-;9604:115;9712:6;9707:3;9604:115;:::i;:::-;9597:122;;9740:85;9819:5;9740:85;:::i;:::-;9845:7;9873:1;9858:347;9883:6;9880:1;9877:13;9858:347;;;9950:6;9944:13;9971:121;10088:3;10073:13;9971:121;:::i;:::-;9964:128;;10109:89;10191:6;10109:89;:::i;:::-;10099:99;;9915:290;9905:1;9902;9898:9;9893:14;;9858:347;;;9862:14;10218:3;10211:10;;9487:740;;;;;;;:::o;10235:94::-;10302:21;10317:5;10302:21;:::i;:::-;10297:3;10290:34;10284:45;;:::o;10336:104::-;10413:21;10428:5;10413:21;:::i;:::-;10408:3;10401:34;10395:45;;:::o;10447:113::-;10530:24;10548:5;10530:24;:::i;:::-;10525:3;10518:37;10512:48;;:::o;10567:327::-;;10669:39;10702:5;10669:39;:::i;:::-;10720:61;10774:6;10769:3;10720:61;:::i;:::-;10713:68;;10786:52;10831:6;10826:3;10819:4;10812:5;10808:16;10786:52;:::i;:::-;10859:29;10881:6;10859:29;:::i;:::-;10854:3;10850:39;10843:46;;10649:245;;;;;:::o;10901:347::-;;11013:39;11046:5;11013:39;:::i;:::-;11064:71;11128:6;11123:3;11064:71;:::i;:::-;11057:78;;11140:52;11185:6;11180:3;11173:4;11166:5;11162:16;11140:52;:::i;:::-;11213:29;11235:6;11213:29;:::i;:::-;11208:3;11204:39;11197:46;;10993:255;;;;;:::o;11256:306::-;;11416:66;11480:1;11475:3;11416:66;:::i;:::-;11409:73;;11515:9;11511:1;11506:3;11502:11;11495:30;11553:2;11548:3;11544:12;11537:19;;11402:160;;;:::o;11571:305::-;;11731:66;11795:1;11790:3;11731:66;:::i;:::-;11724:73;;11830:8;11826:1;11821:3;11817:11;11810:29;11867:2;11862:3;11858:12;11851:19;;11717:159;;;:::o;11885:371::-;;12045:67;12109:2;12104:3;12045:67;:::i;:::-;12038:74;;12145:34;12141:1;12136:3;12132:11;12125:55;12214:4;12209:2;12204:3;12200:12;12193:26;12247:2;12242:3;12238:12;12231:19;;12031:225;;;:::o;12265:306::-;;12425:66;12489:1;12484:3;12425:66;:::i;:::-;12418:73;;12524:9;12520:1;12515:3;12511:11;12504:30;12562:2;12557:3;12553:12;12546:19;;12411:160;;;:::o;12580:306::-;;12740:66;12804:1;12799:3;12740:66;:::i;:::-;12733:73;;12839:9;12835:1;12830:3;12826:11;12819:30;12877:2;12872:3;12868:12;12861:19;;12726:160;;;:::o;12895:305::-;;13055:66;13119:1;13114:3;13055:66;:::i;:::-;13048:73;;13154:8;13150:1;13145:3;13141:11;13134:29;13191:2;13186:3;13182:12;13175:19;;13041:159;;;:::o;13209:308::-;;13369:66;13433:1;13428:3;13369:66;:::i;:::-;13362:73;;13468:11;13464:1;13459:3;13455:11;13448:32;13508:2;13503:3;13499:12;13492:19;;13355:162;;;:::o;13526:304::-;;13686:66;13750:1;13745:3;13686:66;:::i;:::-;13679:73;;13785:7;13781:1;13776:3;13772:11;13765:28;13821:2;13816:3;13812:12;13805:19;;13672:158;;;:::o;13839:305::-;;13999:66;14063:1;14058:3;13999:66;:::i;:::-;13992:73;;14098:8;14094:1;14089:3;14085:11;14078:29;14135:2;14130:3;14126:12;14119:19;;13985:159;;;:::o;14153:327::-;;14313:67;14377:2;14372:3;14313:67;:::i;:::-;14306:74;;14413:29;14409:1;14404:3;14400:11;14393:50;14471:2;14466:3;14462:12;14455:19;;14299:181;;;:::o;14489:305::-;;14649:66;14713:1;14708:3;14649:66;:::i;:::-;14642:73;;14748:8;14744:1;14739:3;14735:11;14728:29;14785:2;14780:3;14776:12;14769:19;;14635:159;;;:::o;14803:305::-;;14963:66;15027:1;15022:3;14963:66;:::i;:::-;14956:73;;15062:8;15058:1;15053:3;15049:11;15042:29;15099:2;15094:3;15090:12;15083:19;;14949:159;;;:::o;15117:308::-;;15277:66;15341:1;15336:3;15277:66;:::i;:::-;15270:73;;15376:11;15372:1;15367:3;15363:11;15356:32;15416:2;15411:3;15407:12;15400:19;;15263:162;;;:::o;15434:306::-;;15594:66;15658:1;15653:3;15594:66;:::i;:::-;15587:73;;15693:9;15689:1;15684:3;15680:11;15673:30;15731:2;15726:3;15722:12;15715:19;;15580:160;;;:::o;15749:306::-;;15909:66;15973:1;15968:3;15909:66;:::i;:::-;15902:73;;16008:9;16004:1;15999:3;15995:11;15988:30;16046:2;16041:3;16037:12;16030:19;;15895:160;;;:::o;16064:306::-;;16224:66;16288:1;16283:3;16224:66;:::i;:::-;16217:73;;16323:9;16319:1;16314:3;16310:11;16303:30;16361:2;16356:3;16352:12;16345:19;;16210:160;;;:::o;16379:308::-;;16539:66;16603:1;16598:3;16539:66;:::i;:::-;16532:73;;16638:11;16634:1;16629:3;16625:11;16618:32;16678:2;16673:3;16669:12;16662:19;;16525:162;;;:::o;16696:308::-;;16856:66;16920:1;16915:3;16856:66;:::i;:::-;16849:73;;16955:11;16951:1;16946:3;16942:11;16935:32;16995:2;16990:3;16986:12;16979:19;;16842:162;;;:::o;17013:305::-;;17173:66;17237:1;17232:3;17173:66;:::i;:::-;17166:73;;17272:8;17268:1;17263:3;17259:11;17252:29;17309:2;17304:3;17300:12;17293:19;;17159:159;;;:::o;17327:305::-;;17487:66;17551:1;17546:3;17487:66;:::i;:::-;17480:73;;17586:8;17582:1;17577:3;17573:11;17566:29;17623:2;17618:3;17614:12;17607:19;;17473:159;;;:::o;17641:305::-;;17801:66;17865:1;17860:3;17801:66;:::i;:::-;17794:73;;17900:8;17896:1;17891:3;17887:11;17880:29;17937:2;17932:3;17928:12;17921:19;;17787:159;;;:::o;17955:305::-;;18115:66;18179:1;18174:3;18115:66;:::i;:::-;18108:73;;18214:8;18210:1;18205:3;18201:11;18194:29;18251:2;18246:3;18242:12;18235:19;;18101:159;;;:::o;18269:306::-;;18429:66;18493:1;18488:3;18429:66;:::i;:::-;18422:73;;18528:9;18524:1;18519:3;18515:11;18508:30;18566:2;18561:3;18557:12;18550:19;;18415:160;;;:::o;18584:306::-;;18744:66;18808:1;18803:3;18744:66;:::i;:::-;18737:73;;18843:9;18839:1;18834:3;18830:11;18823:30;18881:2;18876:3;18872:12;18865:19;;18730:160;;;:::o;18899:305::-;;19059:66;19123:1;19118:3;19059:66;:::i;:::-;19052:73;;19158:8;19154:1;19149:3;19145:11;19138:29;19195:2;19190:3;19186:12;19179:19;;19045:159;;;:::o;19213:304::-;;19373:66;19437:1;19432:3;19373:66;:::i;:::-;19366:73;;19472:7;19468:1;19463:3;19459:11;19452:28;19508:2;19503:3;19499:12;19492:19;;19359:158;;;:::o;19526:306::-;;19686:66;19750:1;19745:3;19686:66;:::i;:::-;19679:73;;19785:9;19781:1;19776:3;19772:11;19765:30;19823:2;19818:3;19814:12;19807:19;;19672:160;;;:::o;19841:305::-;;20001:66;20065:1;20060:3;20001:66;:::i;:::-;19994:73;;20100:8;20096:1;20091:3;20087:11;20080:29;20137:2;20132:3;20128:12;20121:19;;19987:159;;;:::o;20155:308::-;;20315:66;20379:1;20374:3;20315:66;:::i;:::-;20308:73;;20414:11;20410:1;20405:3;20401:11;20394:32;20454:2;20449:3;20445:12;20438:19;;20301:162;;;:::o;20472:308::-;;20632:66;20696:1;20691:3;20632:66;:::i;:::-;20625:73;;20731:11;20727:1;20722:3;20718:11;20711:32;20771:2;20766:3;20762:12;20755:19;;20618:162;;;:::o;20789:304::-;;20949:66;21013:1;21008:3;20949:66;:::i;:::-;20942:73;;21048:7;21044:1;21039:3;21035:11;21028:28;21084:2;21079:3;21075:12;21068:19;;20935:158;;;:::o;21102:305::-;;21262:66;21326:1;21321:3;21262:66;:::i;:::-;21255:73;;21361:8;21357:1;21352:3;21348:11;21341:29;21398:2;21393:3;21389:12;21382:19;;21248:159;;;:::o;21416:305::-;;21576:66;21640:1;21635:3;21576:66;:::i;:::-;21569:73;;21675:8;21671:1;21666:3;21662:11;21655:29;21712:2;21707:3;21703:12;21696:19;;21562:159;;;:::o;21730:308::-;;21890:66;21954:1;21949:3;21890:66;:::i;:::-;21883:73;;21989:11;21985:1;21980:3;21976:11;21969:32;22029:2;22024:3;22020:12;22013:19;;21876:162;;;:::o;22047:306::-;;22207:66;22271:1;22266:3;22207:66;:::i;:::-;22200:73;;22306:9;22302:1;22297:3;22293:11;22286:30;22344:2;22339:3;22335:12;22328:19;;22193:160;;;:::o;22420:1826::-;;22563:6;22558:3;22554:16;22651:4;22644:5;22640:16;22634:23;22663:63;22720:4;22715:3;22711:14;22697:12;22663:63;:::i;:::-;22585:147;22805:4;22798:5;22794:16;22788:23;22857:3;22851:4;22847:14;22840:4;22835:3;22831:14;22824:38;22877:73;22945:4;22931:12;22877:73;:::i;:::-;22869:81;;22742:220;23042:4;23035:5;23031:16;23025:23;23094:3;23088:4;23084:14;23077:4;23072:3;23068:14;23061:38;23114:73;23182:4;23168:12;23114:73;:::i;:::-;23106:81;;22972:227;23281:4;23274:5;23270:16;23264:23;23293:57;23344:4;23339:3;23335:14;23321:12;23293:57;:::i;:::-;23209:147;23437:4;23430:5;23426:16;23420:23;23449:63;23506:4;23501:3;23497:14;23483:12;23449:63;:::i;:::-;23366:152;23599:4;23592:5;23588:16;23582:23;23611:63;23668:4;23663:3;23659:14;23645:12;23611:63;:::i;:::-;23528:152;23763:4;23756:5;23752:16;23746:23;23815:3;23809:4;23805:14;23798:4;23793:3;23789:14;23782:38;23835:103;23933:4;23919:12;23835:103;:::i;:::-;23827:111;;23690:260;24033:4;24026:5;24022:16;24016:23;24085:3;24079:4;24075:14;24068:4;24063:3;24059:14;24052:38;24105:103;24203:4;24189:12;24105:103;:::i;:::-;24097:111;;23960:260;24237:4;24230:11;;22536:1710;;;;;:::o;24320:1305::-;24461:4;24456:3;24452:14;24545:4;24538:5;24534:16;24528:23;24557:63;24614:4;24609:3;24605:14;24591:12;24557:63;:::i;:::-;24481:145;24700:4;24693:5;24689:16;24683:23;24712:63;24769:4;24764:3;24760:14;24746:12;24712:63;:::i;:::-;24636:145;24865:4;24858:5;24854:16;24848:23;24877:63;24934:4;24929:3;24925:14;24911:12;24877:63;:::i;:::-;24791:155;25032:4;25025:5;25021:16;25015:23;25044:63;25101:4;25096:3;25092:14;25078:12;25044:63;:::i;:::-;24956:157;25198:4;25191:5;25187:16;25181:23;25210:63;25267:4;25262:3;25258:14;25244:12;25210:63;:::i;:::-;25123:156;25357:4;25350:5;25346:16;25340:23;25369:63;25426:4;25421:3;25417:14;25403:12;25369:63;:::i;:::-;25289:149;25529:4;25522:5;25518:16;25512:23;25541:63;25598:4;25593:3;25589:14;25575:12;25541:63;:::i;:::-;25448:162;24434:1191;;;:::o;25699:1315::-;25850:4;25845:3;25841:14;25934:4;25927:5;25923:16;25917:23;25946:63;26003:4;25998:3;25994:14;25980:12;25946:63;:::i;:::-;25870:145;26089:4;26082:5;26078:16;26072:23;26101:63;26158:4;26153:3;26149:14;26135:12;26101:63;:::i;:::-;26025:145;26254:4;26247:5;26243:16;26237:23;26266:63;26323:4;26318:3;26314:14;26300:12;26266:63;:::i;:::-;26180:155;26421:4;26414:5;26410:16;26404:23;26433:63;26490:4;26485:3;26481:14;26467:12;26433:63;:::i;:::-;26345:157;26587:4;26580:5;26576:16;26570:23;26599:63;26656:4;26651:3;26647:14;26633:12;26599:63;:::i;:::-;26512:156;26746:4;26739:5;26735:16;26729:23;26758:63;26815:4;26810:3;26806:14;26792:12;26758:63;:::i;:::-;26678:149;26918:4;26911:5;26907:16;26901:23;26930:63;26987:4;26982:3;26978:14;26964:12;26930:63;:::i;:::-;26837:162;25823:1191;;;:::o;27021:103::-;27094:24;27112:5;27094:24;:::i;:::-;27089:3;27082:37;27076:48;;:::o;27131:113::-;27214:24;27232:5;27214:24;:::i;:::-;27209:3;27202:37;27196:48;;:::o;27251:107::-;27330:22;27346:5;27330:22;:::i;:::-;27325:3;27318:35;27312:46;;:::o;27365:222::-;;27492:2;27481:9;27477:18;27469:26;;27506:71;27574:1;27563:9;27559:17;27550:6;27506:71;:::i;:::-;27463:124;;;;:::o;27594:474::-;;27823:2;27812:9;27808:18;27800:26;;27873:9;27867:4;27863:20;27859:1;27848:9;27844:17;27837:47;27898:160;28053:4;28044:6;27898:160;:::i;:::-;27890:168;;27794:274;;;;:::o;28075:486::-;;28310:2;28299:9;28295:18;28287:26;;28360:9;28354:4;28350:20;28346:1;28335:9;28331:17;28324:47;28385:166;28546:4;28537:6;28385:166;:::i;:::-;28377:174;;28281:280;;;;:::o;28568:210::-;;28689:2;28678:9;28674:18;28666:26;;28703:65;28765:1;28754:9;28750:17;28741:6;28703:65;:::i;:::-;28660:118;;;;:::o;28785:222::-;;28912:2;28901:9;28897:18;28889:26;;28926:71;28994:1;28983:9;28979:17;28970:6;28926:71;:::i;:::-;28883:124;;;;:::o;29014:310::-;;29161:2;29150:9;29146:18;29138:26;;29211:9;29205:4;29201:20;29197:1;29186:9;29182:17;29175:47;29236:78;29309:4;29300:6;29236:78;:::i;:::-;29228:86;;29132:192;;;;:::o;29331:416::-;;29531:2;29520:9;29516:18;29508:26;;29581:9;29575:4;29571:20;29567:1;29556:9;29552:17;29545:47;29606:131;29732:4;29606:131;:::i;:::-;29598:139;;29502:245;;;:::o;29754:416::-;;29954:2;29943:9;29939:18;29931:26;;30004:9;29998:4;29994:20;29990:1;29979:9;29975:17;29968:47;30029:131;30155:4;30029:131;:::i;:::-;30021:139;;29925:245;;;:::o;30177:416::-;;30377:2;30366:9;30362:18;30354:26;;30427:9;30421:4;30417:20;30413:1;30402:9;30398:17;30391:47;30452:131;30578:4;30452:131;:::i;:::-;30444:139;;30348:245;;;:::o;30600:416::-;;30800:2;30789:9;30785:18;30777:26;;30850:9;30844:4;30840:20;30836:1;30825:9;30821:17;30814:47;30875:131;31001:4;30875:131;:::i;:::-;30867:139;;30771:245;;;:::o;31023:416::-;;31223:2;31212:9;31208:18;31200:26;;31273:9;31267:4;31263:20;31259:1;31248:9;31244:17;31237:47;31298:131;31424:4;31298:131;:::i;:::-;31290:139;;31194:245;;;:::o;31446:416::-;;31646:2;31635:9;31631:18;31623:26;;31696:9;31690:4;31686:20;31682:1;31671:9;31667:17;31660:47;31721:131;31847:4;31721:131;:::i;:::-;31713:139;;31617:245;;;:::o;31869:416::-;;32069:2;32058:9;32054:18;32046:26;;32119:9;32113:4;32109:20;32105:1;32094:9;32090:17;32083:47;32144:131;32270:4;32144:131;:::i;:::-;32136:139;;32040:245;;;:::o;32292:416::-;;32492:2;32481:9;32477:18;32469:26;;32542:9;32536:4;32532:20;32528:1;32517:9;32513:17;32506:47;32567:131;32693:4;32567:131;:::i;:::-;32559:139;;32463:245;;;:::o;32715:416::-;;32915:2;32904:9;32900:18;32892:26;;32965:9;32959:4;32955:20;32951:1;32940:9;32936:17;32929:47;32990:131;33116:4;32990:131;:::i;:::-;32982:139;;32886:245;;;:::o;33138:416::-;;33338:2;33327:9;33323:18;33315:26;;33388:9;33382:4;33378:20;33374:1;33363:9;33359:17;33352:47;33413:131;33539:4;33413:131;:::i;:::-;33405:139;;33309:245;;;:::o;33561:416::-;;33761:2;33750:9;33746:18;33738:26;;33811:9;33805:4;33801:20;33797:1;33786:9;33782:17;33775:47;33836:131;33962:4;33836:131;:::i;:::-;33828:139;;33732:245;;;:::o;33984:416::-;;34184:2;34173:9;34169:18;34161:26;;34234:9;34228:4;34224:20;34220:1;34209:9;34205:17;34198:47;34259:131;34385:4;34259:131;:::i;:::-;34251:139;;34155:245;;;:::o;34407:416::-;;34607:2;34596:9;34592:18;34584:26;;34657:9;34651:4;34647:20;34643:1;34632:9;34628:17;34621:47;34682:131;34808:4;34682:131;:::i;:::-;34674:139;;34578:245;;;:::o;34830:416::-;;35030:2;35019:9;35015:18;35007:26;;35080:9;35074:4;35070:20;35066:1;35055:9;35051:17;35044:47;35105:131;35231:4;35105:131;:::i;:::-;35097:139;;35001:245;;;:::o;35253:416::-;;35453:2;35442:9;35438:18;35430:26;;35503:9;35497:4;35493:20;35489:1;35478:9;35474:17;35467:47;35528:131;35654:4;35528:131;:::i;:::-;35520:139;;35424:245;;;:::o;35676:416::-;;35876:2;35865:9;35861:18;35853:26;;35926:9;35920:4;35916:20;35912:1;35901:9;35897:17;35890:47;35951:131;36077:4;35951:131;:::i;:::-;35943:139;;35847:245;;;:::o;36099:416::-;;36299:2;36288:9;36284:18;36276:26;;36349:9;36343:4;36339:20;36335:1;36324:9;36320:17;36313:47;36374:131;36500:4;36374:131;:::i;:::-;36366:139;;36270:245;;;:::o;36522:416::-;;36722:2;36711:9;36707:18;36699:26;;36772:9;36766:4;36762:20;36758:1;36747:9;36743:17;36736:47;36797:131;36923:4;36797:131;:::i;:::-;36789:139;;36693:245;;;:::o;36945:416::-;;37145:2;37134:9;37130:18;37122:26;;37195:9;37189:4;37185:20;37181:1;37170:9;37166:17;37159:47;37220:131;37346:4;37220:131;:::i;:::-;37212:139;;37116:245;;;:::o;37368:416::-;;37568:2;37557:9;37553:18;37545:26;;37618:9;37612:4;37608:20;37604:1;37593:9;37589:17;37582:47;37643:131;37769:4;37643:131;:::i;:::-;37635:139;;37539:245;;;:::o;37791:416::-;;37991:2;37980:9;37976:18;37968:26;;38041:9;38035:4;38031:20;38027:1;38016:9;38012:17;38005:47;38066:131;38192:4;38066:131;:::i;:::-;38058:139;;37962:245;;;:::o;38214:416::-;;38414:2;38403:9;38399:18;38391:26;;38464:9;38458:4;38454:20;38450:1;38439:9;38435:17;38428:47;38489:131;38615:4;38489:131;:::i;:::-;38481:139;;38385:245;;;:::o;38637:416::-;;38837:2;38826:9;38822:18;38814:26;;38887:9;38881:4;38877:20;38873:1;38862:9;38858:17;38851:47;38912:131;39038:4;38912:131;:::i;:::-;38904:139;;38808:245;;;:::o;39060:416::-;;39260:2;39249:9;39245:18;39237:26;;39310:9;39304:4;39300:20;39296:1;39285:9;39281:17;39274:47;39335:131;39461:4;39335:131;:::i;:::-;39327:139;;39231:245;;;:::o;39483:416::-;;39683:2;39672:9;39668:18;39660:26;;39733:9;39727:4;39723:20;39719:1;39708:9;39704:17;39697:47;39758:131;39884:4;39758:131;:::i;:::-;39750:139;;39654:245;;;:::o;39906:416::-;;40106:2;40095:9;40091:18;40083:26;;40156:9;40150:4;40146:20;40142:1;40131:9;40127:17;40120:47;40181:131;40307:4;40181:131;:::i;:::-;40173:139;;40077:245;;;:::o;40329:416::-;;40529:2;40518:9;40514:18;40506:26;;40579:9;40573:4;40569:20;40565:1;40554:9;40550:17;40543:47;40604:131;40730:4;40604:131;:::i;:::-;40596:139;;40500:245;;;:::o;40752:416::-;;40952:2;40941:9;40937:18;40929:26;;41002:9;40996:4;40992:20;40988:1;40977:9;40973:17;40966:47;41027:131;41153:4;41027:131;:::i;:::-;41019:139;;40923:245;;;:::o;41175:416::-;;41375:2;41364:9;41360:18;41352:26;;41425:9;41419:4;41415:20;41411:1;41400:9;41396:17;41389:47;41450:131;41576:4;41450:131;:::i;:::-;41442:139;;41346:245;;;:::o;41598:416::-;;41798:2;41787:9;41783:18;41775:26;;41848:9;41842:4;41838:20;41834:1;41823:9;41819:17;41812:47;41873:131;41999:4;41873:131;:::i;:::-;41865:139;;41769:245;;;:::o;42021:416::-;;42221:2;42210:9;42206:18;42198:26;;42271:9;42265:4;42261:20;42257:1;42246:9;42242:17;42235:47;42296:131;42422:4;42296:131;:::i;:::-;42288:139;;42192:245;;;:::o;42444:416::-;;42644:2;42633:9;42629:18;42621:26;;42694:9;42688:4;42684:20;42680:1;42669:9;42665:17;42658:47;42719:131;42845:4;42719:131;:::i;:::-;42711:139;;42615:245;;;:::o;42867:416::-;;43067:2;43056:9;43052:18;43044:26;;43117:9;43111:4;43107:20;43103:1;43092:9;43088:17;43081:47;43142:131;43268:4;43142:131;:::i;:::-;43134:139;;43038:245;;;:::o;43290:416::-;;43490:2;43479:9;43475:18;43467:26;;43540:9;43534:4;43530:20;43526:1;43515:9;43511:17;43504:47;43565:131;43691:4;43565:131;:::i;:::-;43557:139;;43461:245;;;:::o;43713:416::-;;43913:2;43902:9;43898:18;43890:26;;43963:9;43957:4;43953:20;43949:1;43938:9;43934:17;43927:47;43988:131;44114:4;43988:131;:::i;:::-;43980:139;;43884:245;;;:::o;44136:339::-;;44321:3;44310:9;44306:19;44298:27;;44336:129;44462:1;44451:9;44447:17;44438:6;44336:129;:::i;:::-;44292:183;;;;:::o;44482:222::-;;44609:2;44598:9;44594:18;44586:26;;44623:71;44691:1;44680:9;44676:17;44667:6;44623:71;:::i;:::-;44580:124;;;;:::o;44711:214::-;;44834:2;44823:9;44819:18;44811:26;;44848:67;44912:1;44901:9;44897:17;44888:6;44848:67;:::i;:::-;44805:120;;;;:::o;44932:256::-;;44994:2;44988:9;44978:19;;45032:4;45024:6;45020:17;45131:6;45119:10;45116:22;45095:18;45083:10;45080:34;45077:62;45074:2;;;45152:1;45149;45142:12;45074:2;45172:10;45168:2;45161:22;44972:216;;;;:::o;45195:304::-;;45354:18;45346:6;45343:30;45340:2;;;45386:1;45383;45376:12;45340:2;45421:4;45413:6;45409:17;45401:25;;45484:4;45478;45474:15;45466:23;;45277:222;;;:::o;45506:322::-;;45650:18;45642:6;45639:30;45636:2;;;45682:1;45679;45672:12;45636:2;45749:4;45745:9;45738:4;45730:6;45726:17;45722:33;45714:41;;45813:4;45807;45803:15;45795:23;;45573:255;;;:::o;45835:151::-;;45921:3;45913:11;;45959:4;45954:3;45950:14;45942:22;;45907:79;;;:::o;45993:177::-;;46105:3;46097:11;;46143:4;46138:3;46134:14;46126:22;;46091:79;;;:::o;46177:180::-;;46292:3;46284:11;;46330:4;46325:3;46321:14;46313:22;;46278:79;;;:::o;46364:137::-;;46473:5;46467:12;46457:22;;46438:63;;;:::o;46508:163::-;;46643:5;46637:12;46627:22;;46608:63;;;:::o;46678:166::-;;46816:5;46810:12;46800:22;;46781:63;;;:::o;46851:122::-;;46945:5;46939:12;46929:22;;46910:63;;;:::o;46980:108::-;;47078:4;47073:3;47069:14;47061:22;;47055:33;;;:::o;47095:134::-;;47219:4;47214:3;47210:14;47202:22;;47196:33;;;:::o;47236:137::-;;47363:4;47358:3;47354:14;47346:22;;47340:33;;;:::o;47381:168::-;;47501:6;47496:3;47489:19;47538:4;47533:3;47529:14;47514:29;;47482:67;;;;:::o;47558:204::-;;47714:6;47709:3;47702:19;47751:4;47746:3;47742:14;47727:29;;47695:67;;;;:::o;47771:207::-;;47930:6;47925:3;47918:19;47967:4;47962:3;47958:14;47943:29;;47911:67;;;;:::o;47987:153::-;;48092:6;48087:3;48080:19;48129:4;48124:3;48120:14;48105:29;;48073:67;;;;:::o;48149:163::-;;48264:6;48259:3;48252:19;48301:4;48296:3;48292:14;48277:29;;48245:67;;;;:::o;48320:91::-;;48382:24;48400:5;48382:24;:::i;:::-;48371:35;;48365:46;;;:::o;48418:85::-;;48491:5;48484:13;48477:21;48466:32;;48460:43;;;:::o;48510:72::-;;48572:5;48561:16;;48555:27;;;:::o;48589:121::-;;48662:42;48655:5;48651:54;48640:65;;48634:76;;;:::o;48717:72::-;;48779:5;48768:16;;48762:27;;;:::o;48796:81::-;;48867:4;48860:5;48856:16;48845:27;;48839:38;;;:::o;48885:145::-;48966:6;48961:3;48956;48943:30;49022:1;49013:6;49008:3;49004:16;48997:27;48936:94;;;:::o;49039:268::-;49104:1;49111:101;49125:6;49122:1;49119:13;49111:101;;;49201:1;49196:3;49192:11;49186:18;49182:1;49177:3;49173:11;49166:39;49147:2;49144:1;49140:10;49135:15;;49111:101;;;49227:6;49224:1;49221:13;49218:2;;;49292:1;49283:6;49278:3;49274:16;49267:27;49218:2;49088:219;;;;:::o;49315:97::-;;49403:2;49399:7;49394:2;49387:5;49383:14;49379:28;49369:38;;49363:49;;;:::o;49420:117::-;49489:24;49507:5;49489:24;:::i;:::-;49482:5;49479:35;49469:2;;49528:1;49525;49518:12;49469:2;49463:74;:::o;49544:111::-;49610:21;49625:5;49610:21;:::i;:::-;49603:5;49600:32;49590:2;;49646:1;49643;49636:12;49590:2;49584:71;:::o;49662:117::-;49731:24;49749:5;49731:24;:::i;:::-;49724:5;49721:35;49711:2;;49770:1;49767;49760:12;49711:2;49705:74;:::o;49786:117::-;49855:24;49873:5;49855:24;:::i;:::-;49848:5;49845:35;49835:2;;49894:1;49891;49884:12;49835:2;49829:74;:::o

Swarm Source

ipfs://d4f3e80dd8feab818af785f712fa3c5060f951b5944ea729ecc6902b0e816139
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.