ETH Price: $2,274.45 (+2.42%)

Token

Unissou (YTG)
 

Overview

Max Total Supply

300,504 YTG

Holders

200 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
400 YTG

Value
$0.00
0xf550f641f67000ecc54ebc03e77dd08b67835a5d
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Unissou is an experimental decentralized staking protocol, rewarding farmers with plentiful NFTs. Pronounce the magic formula to stake your YTG and start to farm.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Unissou

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 11 of 15: Unissou.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

import './UnissouDAO.sol';
import './UnissouDApp.sol';

/// @title Unissou
///
/// @notice This is the main contract
///
/// @dev Inehrit {UnissouDAO} and {UnissouDApp}
///
contract Unissou is UnissouDAO, UnissouDApp {

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

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: Burneable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

/// @title Burneable
///
/// @notice This contract covers everything related
/// to the burn functions
///
contract Burneable {
  /// @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 isBurneable(
    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 3 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 4 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 5 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 6 of 15: Minteable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

/// @title Minteable
///
/// @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 isMinteable(
    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 7 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 8 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 9 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 10 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
  /// UnissouToken
  ///
  /// @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 12 of 15: UnissouDAO.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

import './Voteable.sol';
import './UnissouDApp.sol';

/// @title UnissouDAO
///
/// @notice This contract covers everything related
/// to the organization of Unissou
///
/// @dev Inehrit {Voteable} and {UnissouToken}
///
abstract contract UnissouDAO is Voteable, UnissouToken {
  
  /// @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 13 of 15: UnissouDApp.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

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

/// @title UnissouDApp
///
/// @notice This contract covers everything related
/// to the DApp of Unissou
///
/// @dev Inehrit {Stakeable} and {UnissouToken}
///
abstract contract UnissouDApp is Roleplay, Stakeable, UnissouToken {

  /// @notice This function allows the sender to stake
  /// an amount (maximum 10) of UnissouToken, 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 14 of 15: UnissouToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

import './ERC20.sol';
import './Roleplay.sol';
import './Pauseable.sol';
import './Minteable.sol';
import './Burneable.sol';

/// @title UnissouToken
///
/// @notice This contract covers everything related
/// to the Unissou ERC20
///
/// @dev Inehrit {ERC20}, {Roleplay}, {Pauseable},
/// {Minteable} and {Burneable}
///
abstract contract UnissouToken is 
ERC20, Roleplay, Pauseable, Minteable, Burneable {

  /// @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(
    "Unissou",
    "YTG",
    384400 * (10**8),
    96100 * (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 {Minteable::isMinteable()}
  ///
  /// @param _amount - Represent the amount of token
  /// to be minted
  ///
  function mint(
    uint256 _amount
  ) public virtual isMinteable(
    _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 isMinteable(
    _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 isBurneable(
    _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 isBurneable(
    _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 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"}]

60806040523480156200001157600080fd5b506040518060400160405280600781526020017f556e6973736f75000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f59544700000000000000000000000000000000000000000000000000000000008152506522f6028b90006508bd80a2e4006008600760006101000a81548160ff021916908360ff1602179055508360059080519060200190620000c092919062000896565b508260069080519060200190620000d992919062000896565b508160048190555080600281905550505050506064600981905550600a600c819055506000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506000600e60026101000a81548160ff021916908315150217905550620001626000801b33620001ed60201b60201c565b620001947faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c33620001ed60201b60201c565b620001b533620001a96200020360201b60201c565b6200020d60201b60201c565b620001e77f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b38233620003bc60201b60201c565b62000c41565b620001ff82826200050f60201b60201c565b5050565b6000600254905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000280576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002779062000ba3565b60405180910390fd5b6200029460008383620005a460201b60201c565b620002b081600354620006c860201b62002fff1790919060201c565b6003819055506200030e816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620006c860201b62002fff1790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003b0919062000c09565b60405180910390a35050565b620003ee7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336200072060201b60201c565b62000430576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004279062000b3d565b60405180910390fd5b6000801b82141562000479576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004709062000be7565b60405180910390fd5b6200048e6000801b336200072060201b60201c565b620004f9577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214620004f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ef9062000b1b565b60405180910390fd5b5b6200050b82826200050f60201b60201c565b5050565b6200053e81600860008581526020019081526020016000206000016200075960201b620030541790919060201c565b15620005a0573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b620005bc8383836200079160201b620030841760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200067057620006026200079660201b60201c565b6200062b8262000617620007a060201b60201c565b620006c860201b62002fff1790919060201c565b11156200066f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006669062000b5f565b60405180910390fd5b5b62000680620007aa60201b60201c565b15620006c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006ba9062000bc5565b60405180910390fd5b505050565b60008082840190508381101562000716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200070d9062000b81565b60405180910390fd5b8091505092915050565b6000620007518260086000868152602001908152602001600020600001620007c160201b620030891790919060201c565b905092915050565b600062000789836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620007f960201b60201c565b905092915050565b505050565b6000600454905090565b6000600354905090565b6000600e60009054906101000a900460ff16905090565b6000620007f1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200087360201b60201c565b905092915050565b60006200080d83836200087360201b60201c565b620008685782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200086d565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620008d957805160ff19168380011785556200090a565b828001600101855582156200090a579182015b8281111562000909578251825591602001919060010190620008ec565b5b5090506200091991906200091d565b5090565b5b80821115620009385760008160009055506001016200091e565b5090565b60006200094b60078362000c26565b91507f5250433a353330000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006200098d60078362000c26565b91507f5250433a353130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000620009cf60058362000c26565b91507f55543a32300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600062000a11601b8362000c26565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600062000a5360098362000c26565b91507f45524332303a31323000000000000000000000000000000000000000000000006000830152602082019050919050565b600062000a9560068362000c26565b91507f55543a34303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600062000ad760078362000c26565b91507f5250433a353230000000000000000000000000000000000000000000000000006000830152602082019050919050565b62000b158162000c37565b82525050565b6000602082019050818103600083015262000b36816200093c565b9050919050565b6000602082019050818103600083015262000b58816200097e565b9050919050565b6000602082019050818103600083015262000b7a81620009c0565b9050919050565b6000602082019050818103600083015262000b9c8162000a02565b9050919050565b6000602082019050818103600083015262000bbe8162000a44565b9050919050565b6000602082019050818103600083015262000be08162000a86565b9050919050565b6000602082019050818103600083015262000c028162000ac8565b9050919050565b600060208201905062000c20600083018462000b0a565b92915050565b600082825260208201905092915050565b6000819050919050565b615e308062000c516000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c806379cc67901161019d578063a694fc3a116100e9578063d547741f116100a2578063e4fbb6091161007c578063e4fbb6091461091b578063ed7c1b2014610939578063f5b944eb14610955578063fefaef3f146109735761030c565b8063d547741f146108b3578063dd62ed3e146108cf578063e487948d146108ff5761030c565b8063a694fc3a146107dd578063a89e0b89146107f9578063a9059cbb14610829578063bb102aea14610859578063bcdc3cfc14610877578063c6d4831a146108955761030c565b806391d14854116101565780639aded223116101305780639aded223146107435780639fd6db1214610773578063a0712d6814610791578063a457c2d7146107ad5761030c565b806391d14854146106d757806392afc33a1461070757806395d89b41146107255761030c565b806379cc67901461063d5780637cca542914610659578063806e085e146106775780638456cb59146106935780638ad682af1461069d5780638bb9c5bf146106bb5761030c565b8063395093511161025c57806354ff02d8116102155780636505e8e8116101ef5780636505e8e8146105b75780636d50838e146105d357806370a08231146105ef57806372ddc50e1461061f5761030c565b806354ff02d81461055d5780635a5c313e1461057b5780635c975abb146105995761030c565b806339509351146104c35780633ccfd60b146104f35780633f4ba83a146104fd57806342966c6814610507578063449a52f8146105235780634d7547151461053f5761030c565b806326e885e3116102c95780632f2ff15d116102a35780632f2ff15d1461043b578063313ce56714610457578063378dc3dc146104755780633884e621146104935761030c565b806326e885e3146103e75780632cdd626b146104035780632e17de781461041f5761030c565b806306fdde0314610311578063095ea7b31461032f5780630a8503bc1461035f57806318160ddd1461037d5780631e9f59db1461039b57806323b872dd146103b7575b600080fd5b61031961098f565b60405161032691906156c0565b60405180910390f35b610349600480360381019061034491906146b4565b610a31565b604051610356919061568a565b60405180910390f35b610367610a4e565b6040516103749190615668565b60405180910390f35b610385610b3f565b6040516103929190615b5d565b60405180910390f35b6103b560048036038101906103b0919061488d565b610b49565b005b6103d160048036038101906103cc9190614665565b610d43565b6040516103de919061568a565b60405180910390f35b61040160048036038101906103fc9190614600565b610e31565b005b61041d60048036038101906104189190614864565b610eaa565b005b61043960048036038101906104349190614864565b610f00565b005b6104556004803603810190610450919061476d565b611153565b005b61045f611284565b60405161046c9190615b78565b60405180910390f35b61047d61129b565b60405161048a9190615b5d565b60405180910390f35b6104ad60048036038101906104a89190614744565b6112a5565b6040516104ba9190615b5d565b60405180910390f35b6104dd60048036038101906104d891906146b4565b6112cc565b6040516104ea919061568a565b60405180910390f35b6104fb611377565b005b61050561146a565b005b610521600480360381019061051c9190614864565b611565565b005b61053d600480360381019061053891906146b4565b611679565b005b61054761178e565b604051610554919061568a565b60405180910390f35b6105656117a5565b60405161057291906156a5565b60405180910390f35b6105836117c9565b60405161059091906156a5565b60405180910390f35b6105a16117ed565b6040516105ae919061568a565b60405180910390f35b6105d160048036038101906105cc91906148c9565b611804565b005b6105ed60048036038101906105e89190614864565b611bde565b005b61060960048036038101906106049190614600565b611ced565b6040516106169190615b5d565b60405180910390f35b610627611d35565b6040516106349190615b5d565b60405180910390f35b610657600480360381019061065291906146b4565b611d3f565b005b610661611e80565b60405161066e9190615b5d565b60405180910390f35b610691600480360381019061068c91906146f0565b611e8a565b005b61069b611f18565b005b6106a5612014565b6040516106b291906156a5565b60405180910390f35b6106d560048036038101906106d09190614744565b61201b565b005b6106f160048036038101906106ec919061476d565b6120b7565b6040516106fe919061568a565b60405180910390f35b61070f6120e9565b60405161071c91906156a5565b60405180910390f35b61072d61210d565b60405161073a91906156c0565b60405180910390f35b61075d600480360381019061075891906147a9565b6121af565b60405161076a919061562b565b60405180910390f35b61077b6121e1565b604051610788919061568a565b60405180910390f35b6107ab60048036038101906107a69190614864565b6121f8565b005b6107c760048036038101906107c291906146b4565b61230c565b6040516107d4919061568a565b60405180910390f35b6107f760048036038101906107f29190614864565b6123ee565b005b610813600480360381019061080e9190614600565b6125eb565b6040516108209190615b42565b60405180910390f35b610843600480360381019061083e91906146b4565b61274f565b604051610850919061568a565b60405180910390f35b610861612766565b60405161086e9190615b5d565b60405180910390f35b61087f612770565b60405161088c9190615b5d565b60405180910390f35b61089d61277a565b6040516108aa9190615646565b60405180910390f35b6108cd60048036038101906108c8919061476d565b612abf565b005b6108e960048036038101906108e49190614629565b612bf0565b6040516108f69190615b5d565b60405180910390f35b61091960048036038101906109149190614864565b612c77565b005b610923612ccd565b60405161093091906156c0565b60405180910390f35b610953600480360381019061094e9190614600565b612d06565b005b61095d612d6f565b60405161096a91906156a5565b60405180910390f35b61098d600480360381019061098891906147e5565b612d93565b005b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a275780601f106109fc57610100808354040283529160200191610a27565b820191906000526020600020905b815481529060010190602001808311610a0a57829003601f168201915b5050505050905090565b6000610a4433846305f5e10085026130b9565b6001905092915050565b6060600d805480602002602001604051908101604052809291908181526020016000905b82821015610b3657838290600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505081526020019060010190610a72565b50505050905090565b6000600354905090565b610b566000801b336120b7565b610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c906158a2565b60405180910390fd5b6000806000600d8054905090505b80831015610c33578373ffffffffffffffffffffffffffffffffffffffff16600d8481548110610bcf57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c265760019150610c33565b8280600101935050610ba3565b81610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90615782565b60405180910390fd5b8115610d3c57610c8283613284565b600d8381548110610c8f57fe5b906000526020600020906007020160020154851115610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda90615a42565b60405180910390fd5b84600d8481548110610cf157fe5b90600052602060002090600702016002016000828254039250508190555084600d8481548110610d1d57fe5b9060005260206000209060070201600401600082825401925050819055505b5050505050565b6000610d508484846134c3565b610e268433610e216305f5e10086026040518060400160405280600981526020017f45524332303a3439300000000000000000000000000000000000000000000000815250600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6130b9565b600190509392505050565b610e3e6000801b336120b7565b610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e74906158a2565b60405180910390fd5b610ea77faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c82613813565b50565b610eb76000801b336120b7565b610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906158a2565b60405180910390fd5b8060098190555050565b8060008111610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906157e2565b60405180910390fd5b81610f4d614320565b610f56336125eb565b90508060200151821115610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690615922565b60405180910390fd5b6000806000600d8054905090505b8083101561103d573373ffffffffffffffffffffffffffffffffffffffff16600d8481548110610fd957fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611030576001915061103d565b8280600101935050610fad565b8161107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490615782565b60405180910390fd5b811561114a57600d838154811061109057fe5b90600052602060002090600702016001015487116111495786600d84815481106110b657fe5b9060005260206000209060070201600101600082825403925050819055506110e4336305f5e10089026138a0565b6305f5e1008702600b600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75886040516111409190615b5d565b60405180910390a25b5b50505050505050565b61117d7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336120b7565b6111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390615762565b60405180910390fd5b6000801b821415611202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f9906159a2565b60405180910390fd5b61120f6000801b336120b7565b611276577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126c906156e2565b60405180910390fd5b5b6112808282613813565b5050565b6000600760009054906101000a900460ff16905090565b6000600254905090565b60006112c560086000848152602001908152602001600020600001613a34565b9050919050565b600061136d33846113686305f5e1008602600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6130b9565b6001905092915050565b6000806000600d8054905090505b80831015611415573373ffffffffffffffffffffffffffffffffffffffff16600d84815481106113b157fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156114085760019150611415565b8280600101935050611385565b81611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90615782565b60405180910390fd5b81156114655761146483613284565b5b505050565b600e60009054906101000a900460ff166114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b090615ac2565b60405180910390fd5b6114c66000801b336120b7565b611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc906158a2565b60405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa60405160405180910390a2565b806115907f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336120b7565b806115d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c790615702565b60405180910390fd5b60008211611613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160a90615a02565b60405180910390fd5b61161b613a49565b61162361178e565b611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165990615822565b60405180910390fd5b61166c3384613aa9565b611674613c74565b505050565b806116a47ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336120b7565b806116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db906159e2565b60405180910390fd5b60008211611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90615aa2565b60405180910390fd5b61172f613cd4565b6117376121e1565b611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90615942565b60405180910390fd5b61178084846138a0565b611788613d34565b50505050565b6000600e60029054906101000a900460ff16905090565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b7f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b38281565b6000600e60009054906101000a900460ff16905090565b8161180e33611ced565b6305f5e10060095402811015611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090615882565b60405180910390fd5b6000611907600a848154811061186b57fe5b90600052602060002090600802016006018054806020026020016040519081016040528092919081815260200182805480156118fc57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116118b2575b505050505033613d94565b905060006119b7600a858154811061191b57fe5b90600052602060002090600802016007018054806020026020016040519081016040528092919081815260200182805480156119ac57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611962575b505050505033613d94565b9050811580156119c5575080155b611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb906158c2565b60405180910390fd5b85600a8181548110611a1257fe5b906000526020600020906008020160030160009054906101000a900460ff16611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790615b22565b60405180910390fd5b8515611b23576001600a8881548110611a8557fe5b906000526020600020906008020160040160008282540192505081905550600a8781548110611ab057fe5b9060005260206000209060080201600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b85611bd5576001600a8881548110611b3757fe5b906000526020600020906008020160050160008282540192505081905550600a8781548110611b6257fe5b9060005260206000209060080201600701339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50505050505050565b611c087f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b382336120b7565b611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e90615ae2565b60405180910390fd5b600a8181548110611c5457fe5b906000526020600020906008020160030160009054906101000a900460ff16611cb2576001600a8281548110611c8657fe5b906000526020600020906008020160030160006101000a81548160ff0219169083151502179055611ce9565b6000600a8281548110611cc157fe5b906000526020600020906008020160030160006101000a81548160ff02191690831515021790555b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600954905090565b80611d6a7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336120b7565b80611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da190615702565b60405180910390fd5b60008211611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490615a02565b60405180910390fd5b611df5613a49565b611dfd61178e565b611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3390615822565b60405180910390fd5b6000611e5a84611e4c8733612bf0565b613e1490919063ffffffff16565b9050611e678533836130b9565b611e718585613aa9565b611e79613c74565b5050505050565b6000600c54905090565b60008083519050808302611e9d33611ced565b1015611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590615842565b60405180910390fd5b5b80821015611f1257611f04848381518110611ef657fe5b60200260200101518461274f565b508180600101925050611edf565b50505050565b600e60009054906101000a900460ff1615611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90615982565b60405180910390fd5b611f756000801b336120b7565b611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab906158a2565b60405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860405160405180910390a2565b6000801b81565b6000801b811415612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205890615742565b60405180910390fd5b61206b81336120b7565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a1906159c2565b60405180910390fd5b6120b48133613e5e565b50565b60006120e1826008600086815260200190815260200160002060000161308990919063ffffffff16565b905092915050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121a55780601f1061217a576101008083540402835291602001916121a5565b820191906000526020600020905b81548152906001019060200180831161218857829003601f168201915b5050505050905090565b60006121d98260086000868152602001908152602001600020600001613eeb90919063ffffffff16565b905092915050565b6000600e60019054906101000a900460ff16905090565b806122237ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336120b7565b80612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225a906159e2565b60405180910390fd5b600082116122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90615aa2565b60405180910390fd5b6122ae613cd4565b6122b66121e1565b6122f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ec90615942565b60405180910390fd5b6122ff33846138a0565b612307613d34565b505050565b60006123e433846123df6305f5e10086026040518060400160405280600981526020017f45524332303a3439350000000000000000000000000000000000000000000000815250600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6130b9565b6001905092915050565b806123f833611ced565b806305f5e10083021115612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890615922565b60405180910390fd5b8260008111612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c906157e2565b60405180910390fd5b6000806000600d8054905090505b80831015612523573373ffffffffffffffffffffffffffffffffffffffff16600d84815481106124bf57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125165760019150612523565b8280600101935050612493565b81156125ca5786600d848154811061253757fe5b906000526020600020906007020160010160008282540192505081905550612565336305f5e1008902613aa9565b6305f5e1008702600b600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516125c19190615b5d565b60405180910390a25b816125e2576125d833613f05565b6125e1876123ee565b5b50505050505050565b6125f3614320565b600080600d8054905090505b80821015612747578373ffffffffffffffffffffffffffffffffffffffff16600d838154811061262b57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561273a57600d828154811061268657fe5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509250505061274a565b81806001019250506125ff565b50505b919050565b600061275c3384846134c3565b6001905092915050565b6000600454905090565b6000600b54905090565b6060600a805480602002602001604051908101604052809291908181526020016000905b82821015612ab65783829060005260206000209060080201604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128b15780601f10612886576101008083540402835291602001916128b1565b820191906000526020600020905b81548152906001019060200180831161289457829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129535780601f1061292857610100808354040283529160200191612953565b820191906000526020600020905b81548152906001019060200180831161293657829003601f168201915b505050505081526020016003820160009054906101000a900460ff16151515158152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015612a1057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116129c6575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015612a9e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612a54575b5050505050815250508152602001906001019061279e565b50505050905090565b612ae97faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336120b7565b612b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1f90615a22565b60405180910390fd5b6000801b821415612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6590615742565b60405180910390fd5b612b7b6000801b336120b7565b612be2577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd8906156e2565b60405180910390fd5b5b612bec8282613e5e565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612c846000801b336120b7565b612cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cba906158a2565b60405180910390fd5b80600c8190555050565b6040518060400160405280600b81526020017f756e6973736f752e636f6d00000000000000000000000000000000000000000081525081565b612d136000801b336120b7565b612d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d49906158a2565b60405180910390fd5b612d5f6000801b82613813565b612d6c6000801b33613e5e565b50565b7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c81565b612dbd7f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b382336120b7565b612dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df390615ae2565b60405180910390fd5b600a6040518061010001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183151581526020016000815260200160008152602001600067ffffffffffffffff81118015612e6057600080fd5b50604051908082528060200260200182016040528015612e8f5781602001602082028036833780820191505090505b508152602001600067ffffffffffffffff81118015612ead57600080fd5b50604051908082528060200260200182016040528015612edc5781602001602082028036833780820191505090505b50815250908060018154018082558091505060019003906000526020600020906008020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019080519060200190612f6c929190614373565b506040820151816002019080519060200190612f89929190614373565b5060608201518160030160006101000a81548160ff0219169083151502179055506080820151816004015560a0820151816005015560c0820151816006019080519060200190612fda9291906143f3565b5060e0820151816007019080519060200190612ff79291906143f3565b505050505050565b60008082840190508381101561304a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304190615802565b60405180910390fd5b8091505092915050565b600061307c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614006565b905092915050565b505050565b60006130b1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614076565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312090615902565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613199576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613190906158e2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516132779190615b5d565b60405180910390a3505050565b6000600d828154811061329357fe5b90600052602060002090600702016001015490506000600d83815481106132b657fe5b90600052602060002090600702016006015490506000600d84815481106132d957fe5b906000526020600020906007020160050154905060008214156133d557428110156133d45762015180814203106133d357600c5483111561331c57600c5461331e565b825b620151808242038161332c57fe5b0402600d858154811061333b57fe5b906000526020600020906007020160020160008282540192505081905550600c5483111561336b57600c5461336d565b825b620151808242038161337b57fe5b0402600d858154811061338a57fe5b90600052602060002090600702016003016000828254019250508190555042600d85815481106133b657fe5b9060005260206000209060070201600601819055505050506134c0565b5b5b600082146134bc57428210156134bb5762015180824203106134ba57600c5483111561340357600c54613405565b825b620151808342038161341357fe5b0402600d858154811061342257fe5b906000526020600020906007020160020160008282540192505081905550600c5483111561345257600c54613454565b825b620151808342038161346257fe5b0402600d858154811061347157fe5b90600052602060002090600702016003016000828254019250508190555042600d858154811061349d57fe5b9060005260206000209060070201600601819055505050506134c0565b5b5b5050505b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a90615b02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359a90615a82565b60405180910390fd5b600081116135e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dd906157a2565b60405180910390fd5b6135f1838383614099565b613679816040518060400160405280600981526020017f45524332303a34373000000000000000000000000000000000000000000000008152506000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061370c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137ab9190615b5d565b60405180910390a3505050565b6000838311158290613800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f791906156c0565b60405180910390fd5b5060008385039050809150509392505050565b61383b816008600085815260200190815260200160002060000161305490919063ffffffff16565b1561389c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390790615862565b60405180910390fd5b61391c60008383614099565b61393181600354612fff90919063ffffffff16565b600381905550613988816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613a289190615b5d565b60405180910390a35050565b6000613a428260000161418a565b9050919050565b6001600e60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f0846bb88ff3b4abf3ada7790ae6fc103385a19b2aed99f8e450648b9e1374a3660405160405180910390a2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1090615a62565b60405180910390fd5b613b2582600083614099565b613bad816040518060400160405280600981526020017f45524332303a32333000000000000000000000000000000000000000000000008152506000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c0481600354613e1490919063ffffffff16565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c689190615b5d565b60405180910390a35050565b6000600e60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fc21bebfeff90d942c9009e0eca370a1ab9ddc28e67af48c2a213e3e9ad65fe0860405160405180910390a2565b6001600e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f04fe8ec10fc27a3eb74bc6484c1010613b3354832dd9c927827d71388ee2677a60405160405180910390a2565b6000600e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f340bf1b235fa0bbed4b1b74504c172953a38e3ef4bd71a7042fd2a0057455b7360405160405180910390a2565b60008060009050600080855190505b80831015613e08578473ffffffffffffffffffffffffffffffffffffffff16868481518110613dce57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415613dfb5760019150613e08565b8280600101935050613da3565b81935050505092915050565b6000613e5683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137b8565b905092915050565b613e86816008600085815260200190815260200160002060000161419b90919063ffffffff16565b15613ee7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000613efa83600001836141cb565b60001c905092915050565b600d6040518060e001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020014281526020016000815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505050565b60006140128383614076565b61406b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050614070565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6140a4838383613084565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561413d576140e1612766565b6140fb826140ed610b3f565b612fff90919063ffffffff16565b111561413c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614133906157c2565b60405180910390fd5b5b6141456117ed565b15614185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161417c90615962565b60405180910390fd5b505050565b600081600001805490509050919050565b60006141c3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614238565b905092915050565b600081836000018054905011614216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161420d90615722565b60405180910390fd5b82600001828154811061422557fe5b9060005260206000200154905092915050565b60008083600101600084815260200190815260200160002054905060008114614314576000600182039050600060018660000180549050039050600086600001828154811061428357fe5b90600052602060002001549050808760000184815481106142a057fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806142d857fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061431a565b60009150505b92915050565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106143b457805160ff19168380011785556143e2565b828001600101855582156143e2579182015b828111156143e15782518255916020019190600101906143c6565b5b5090506143ef919061447d565b5090565b82805482825590600052602060002090810192821561446c579160200282015b8281111561446b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190614413565b5b509050614479919061449a565b5090565b5b8082111561449657600081600090555060010161447e565b5090565b5b808211156144d157600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010161449b565b5090565b6000813590506144e481615d9e565b92915050565b600082601f8301126144fb57600080fd5b813561450e61450982615bc0565b615b93565b9150818183526020840193506020810190508385602084028201111561453357600080fd5b60005b83811015614563578161454988826144d5565b845260208401935060208301925050600181019050614536565b5050505092915050565b60008135905061457c81615db5565b92915050565b60008135905061459181615dcc565b92915050565b600082601f8301126145a857600080fd5b81356145bb6145b682615be8565b615b93565b915080825260208301602083018583830111156145d757600080fd5b6145e2838284615d4b565b50505092915050565b6000813590506145fa81615de3565b92915050565b60006020828403121561461257600080fd5b6000614620848285016144d5565b91505092915050565b6000806040838503121561463c57600080fd5b600061464a858286016144d5565b925050602061465b858286016144d5565b9150509250929050565b60008060006060848603121561467a57600080fd5b6000614688868287016144d5565b9350506020614699868287016144d5565b92505060406146aa868287016145eb565b9150509250925092565b600080604083850312156146c757600080fd5b60006146d5858286016144d5565b92505060206146e6858286016145eb565b9150509250929050565b6000806040838503121561470357600080fd5b600083013567ffffffffffffffff81111561471d57600080fd5b614729858286016144ea565b925050602061473a858286016145eb565b9150509250929050565b60006020828403121561475657600080fd5b600061476484828501614582565b91505092915050565b6000806040838503121561478057600080fd5b600061478e85828601614582565b925050602061479f858286016144d5565b9150509250929050565b600080604083850312156147bc57600080fd5b60006147ca85828601614582565b92505060206147db858286016145eb565b9150509250929050565b6000806000606084860312156147fa57600080fd5b600084013567ffffffffffffffff81111561481457600080fd5b61482086828701614597565b935050602084013567ffffffffffffffff81111561483d57600080fd5b61484986828701614597565b925050604061485a8682870161456d565b9150509250925092565b60006020828403121561487657600080fd5b6000614884848285016145eb565b91505092915050565b600080604083850312156148a057600080fd5b60006148ae858286016145eb565b92505060206148bf858286016144d5565b9150509250929050565b600080604083850312156148dc57600080fd5b60006148ea858286016145eb565b92505060206148fb8582860161456d565b9150509250929050565b60006149118383614949565b60208301905092915050565b6000614929838361541d565b905092915050565b600061493d83836154e2565b60e08301905092915050565b61495281615cec565b82525050565b61496181615cec565b82525050565b600061497282615c44565b61497c8185615c97565b935061498783615c14565b8060005b838110156149b857815161499f8882614905565b97506149aa83615c70565b92505060018101905061498b565b5085935050505092915050565b60006149d082615c4f565b6149da8185615ca8565b9350836020820285016149ec85615c24565b8060005b85811015614a285784840389528151614a09858261491d565b9450614a1483615c7d565b925060208a019950506001810190506149f0565b50829750879550505050505092915050565b6000614a4582615c5a565b614a4f8185615cb9565b9350614a5a83615c34565b8060005b83811015614a8b578151614a728882614931565b9750614a7d83615c8a565b925050600181019050614a5e565b5085935050505092915050565b614aa181615cfe565b82525050565b614ab081615cfe565b82525050565b614abf81615d0a565b82525050565b6000614ad082615c65565b614ada8185615cca565b9350614aea818560208601615d5a565b614af381615d8d565b840191505092915050565b6000614b0982615c65565b614b138185615cdb565b9350614b23818560208601615d5a565b614b2c81615d8d565b840191505092915050565b6000614b44600783615cdb565b91507f5250433a353330000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614b84600683615cdb565b91507f42433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614bc4602283615cdb565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c2a600783615cdb565b91507f5250433a353430000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614c6a600783615cdb565b91507f5250433a353130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614caa600683615cdb565b91507f53433a36353000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614cea600983615cdb565b91507f45524332303a34383000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d2a600583615cdb565b91507f55543a32300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d6a600683615cdb565b91507f53433a36333000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614daa601b83615cdb565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614dea600683615cdb565b91507f42433a32313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614e2a600683615cdb565b91507f55543a34373000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614e6a600983615cdb565b91507f45524332303a31323000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614eaa600783615cdb565b91507f56433a31303130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614eea600783615cdb565b91507f5250433a353030000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f2a600783615cdb565b91507f56433a31303230000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f6a600983615cdb565b91507f45524332303a34363000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614faa600983615cdb565b91507f45524332303a34353000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614fea600683615cdb565b91507f53433a36343000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061502a600683615cdb565b91507f4d433a31313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061506a600683615cdb565b91507f55543a34303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006150aa600683615cdb565b91507f50433a33303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006150ea600783615cdb565b91507f5250433a353230000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061512a600783615cdb565b91507f5250433a353730000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061516a600683615cdb565b91507f4d433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151aa600583615cdb565b91507f42433a33300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151ea600783615cdb565b91507f5250433a353530000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061522a600683615cdb565b91507f53433a36363000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061526a600983615cdb565b91507f45524332303a32323000000000000000000000000000000000000000000000006000830152602082019050919050565b60006152aa600983615cdb565b91507f45524332303a34323000000000000000000000000000000000000000000000006000830152602082019050919050565b60006152ea600583615cdb565b91507f4d433a33300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061532a600683615cdb565b91507f50433a33313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061536a600683615cdb565b91507f56433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006153aa600983615cdb565b91507f45524332303a34313000000000000000000000000000000000000000000000006000830152602082019050919050565b60006153ea600783615cdb565b91507f56433a31303330000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000610100830160008301516154366000860182614949565b506020830151848203602086015261544e8282614ac5565b915050604083015184820360408601526154688282614ac5565b915050606083015161547d6060860182614a98565b50608083015161549060808601826155fe565b5060a08301516154a360a08601826155fe565b5060c083015184820360c08601526154bb8282614967565b91505060e083015184820360e08601526154d58282614967565b9150508091505092915050565b60e0820160008201516154f86000850182614949565b50602082015161550b60208501826155fe565b50604082015161551e60408501826155fe565b50606082015161553160608501826155fe565b50608082015161554460808501826155fe565b5060a082015161555760a08501826155fe565b5060c082015161556a60c08501826155fe565b50505050565b60e0820160008201516155866000850182614949565b50602082015161559960208501826155fe565b5060408201516155ac60408501826155fe565b5060608201516155bf60608501826155fe565b5060808201516155d260808501826155fe565b5060a08201516155e560a08501826155fe565b5060c08201516155f860c08501826155fe565b50505050565b61560781615d34565b82525050565b61561681615d34565b82525050565b61562581615d3e565b82525050565b60006020820190506156406000830184614958565b92915050565b6000602082019050818103600083015261566081846149c5565b905092915050565b600060208201905081810360008301526156828184614a3a565b905092915050565b600060208201905061569f6000830184614aa7565b92915050565b60006020820190506156ba6000830184614ab6565b92915050565b600060208201905081810360008301526156da8184614afe565b905092915050565b600060208201905081810360008301526156fb81614b37565b9050919050565b6000602082019050818103600083015261571b81614b77565b9050919050565b6000602082019050818103600083015261573b81614bb7565b9050919050565b6000602082019050818103600083015261575b81614c1d565b9050919050565b6000602082019050818103600083015261577b81614c5d565b9050919050565b6000602082019050818103600083015261579b81614c9d565b9050919050565b600060208201905081810360008301526157bb81614cdd565b9050919050565b600060208201905081810360008301526157db81614d1d565b9050919050565b600060208201905081810360008301526157fb81614d5d565b9050919050565b6000602082019050818103600083015261581b81614d9d565b9050919050565b6000602082019050818103600083015261583b81614ddd565b9050919050565b6000602082019050818103600083015261585b81614e1d565b9050919050565b6000602082019050818103600083015261587b81614e5d565b9050919050565b6000602082019050818103600083015261589b81614e9d565b9050919050565b600060208201905081810360008301526158bb81614edd565b9050919050565b600060208201905081810360008301526158db81614f1d565b9050919050565b600060208201905081810360008301526158fb81614f5d565b9050919050565b6000602082019050818103600083015261591b81614f9d565b9050919050565b6000602082019050818103600083015261593b81614fdd565b9050919050565b6000602082019050818103600083015261595b8161501d565b9050919050565b6000602082019050818103600083015261597b8161505d565b9050919050565b6000602082019050818103600083015261599b8161509d565b9050919050565b600060208201905081810360008301526159bb816150dd565b9050919050565b600060208201905081810360008301526159db8161511d565b9050919050565b600060208201905081810360008301526159fb8161515d565b9050919050565b60006020820190508181036000830152615a1b8161519d565b9050919050565b60006020820190508181036000830152615a3b816151dd565b9050919050565b60006020820190508181036000830152615a5b8161521d565b9050919050565b60006020820190508181036000830152615a7b8161525d565b9050919050565b60006020820190508181036000830152615a9b8161529d565b9050919050565b60006020820190508181036000830152615abb816152dd565b9050919050565b60006020820190508181036000830152615adb8161531d565b9050919050565b60006020820190508181036000830152615afb8161535d565b9050919050565b60006020820190508181036000830152615b1b8161539d565b9050919050565b60006020820190508181036000830152615b3b816153dd565b9050919050565b600060e082019050615b576000830184615570565b92915050565b6000602082019050615b72600083018461560d565b92915050565b6000602082019050615b8d600083018461561c565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615bb657600080fd5b8060405250919050565b600067ffffffffffffffff821115615bd757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115615bff57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615cf782615d14565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615d78578082015181840152602081019050615d5d565b83811115615d87576000848401525b50505050565b6000601f19601f8301169050919050565b615da781615cec565b8114615db257600080fd5b50565b615dbe81615cfe565b8114615dc957600080fd5b50565b615dd581615d0a565b8114615de057600080fd5b50565b615dec81615d34565b8114615df757600080fd5b5056fea2646970667358221220ba2fad7ffcf3442a88d6c70a050b97bd7e084781fe1f72ae119f153f4077855664736f6c634300060c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061030c5760003560e01c806379cc67901161019d578063a694fc3a116100e9578063d547741f116100a2578063e4fbb6091161007c578063e4fbb6091461091b578063ed7c1b2014610939578063f5b944eb14610955578063fefaef3f146109735761030c565b8063d547741f146108b3578063dd62ed3e146108cf578063e487948d146108ff5761030c565b8063a694fc3a146107dd578063a89e0b89146107f9578063a9059cbb14610829578063bb102aea14610859578063bcdc3cfc14610877578063c6d4831a146108955761030c565b806391d14854116101565780639aded223116101305780639aded223146107435780639fd6db1214610773578063a0712d6814610791578063a457c2d7146107ad5761030c565b806391d14854146106d757806392afc33a1461070757806395d89b41146107255761030c565b806379cc67901461063d5780637cca542914610659578063806e085e146106775780638456cb59146106935780638ad682af1461069d5780638bb9c5bf146106bb5761030c565b8063395093511161025c57806354ff02d8116102155780636505e8e8116101ef5780636505e8e8146105b75780636d50838e146105d357806370a08231146105ef57806372ddc50e1461061f5761030c565b806354ff02d81461055d5780635a5c313e1461057b5780635c975abb146105995761030c565b806339509351146104c35780633ccfd60b146104f35780633f4ba83a146104fd57806342966c6814610507578063449a52f8146105235780634d7547151461053f5761030c565b806326e885e3116102c95780632f2ff15d116102a35780632f2ff15d1461043b578063313ce56714610457578063378dc3dc146104755780633884e621146104935761030c565b806326e885e3146103e75780632cdd626b146104035780632e17de781461041f5761030c565b806306fdde0314610311578063095ea7b31461032f5780630a8503bc1461035f57806318160ddd1461037d5780631e9f59db1461039b57806323b872dd146103b7575b600080fd5b61031961098f565b60405161032691906156c0565b60405180910390f35b610349600480360381019061034491906146b4565b610a31565b604051610356919061568a565b60405180910390f35b610367610a4e565b6040516103749190615668565b60405180910390f35b610385610b3f565b6040516103929190615b5d565b60405180910390f35b6103b560048036038101906103b0919061488d565b610b49565b005b6103d160048036038101906103cc9190614665565b610d43565b6040516103de919061568a565b60405180910390f35b61040160048036038101906103fc9190614600565b610e31565b005b61041d60048036038101906104189190614864565b610eaa565b005b61043960048036038101906104349190614864565b610f00565b005b6104556004803603810190610450919061476d565b611153565b005b61045f611284565b60405161046c9190615b78565b60405180910390f35b61047d61129b565b60405161048a9190615b5d565b60405180910390f35b6104ad60048036038101906104a89190614744565b6112a5565b6040516104ba9190615b5d565b60405180910390f35b6104dd60048036038101906104d891906146b4565b6112cc565b6040516104ea919061568a565b60405180910390f35b6104fb611377565b005b61050561146a565b005b610521600480360381019061051c9190614864565b611565565b005b61053d600480360381019061053891906146b4565b611679565b005b61054761178e565b604051610554919061568a565b60405180910390f35b6105656117a5565b60405161057291906156a5565b60405180910390f35b6105836117c9565b60405161059091906156a5565b60405180910390f35b6105a16117ed565b6040516105ae919061568a565b60405180910390f35b6105d160048036038101906105cc91906148c9565b611804565b005b6105ed60048036038101906105e89190614864565b611bde565b005b61060960048036038101906106049190614600565b611ced565b6040516106169190615b5d565b60405180910390f35b610627611d35565b6040516106349190615b5d565b60405180910390f35b610657600480360381019061065291906146b4565b611d3f565b005b610661611e80565b60405161066e9190615b5d565b60405180910390f35b610691600480360381019061068c91906146f0565b611e8a565b005b61069b611f18565b005b6106a5612014565b6040516106b291906156a5565b60405180910390f35b6106d560048036038101906106d09190614744565b61201b565b005b6106f160048036038101906106ec919061476d565b6120b7565b6040516106fe919061568a565b60405180910390f35b61070f6120e9565b60405161071c91906156a5565b60405180910390f35b61072d61210d565b60405161073a91906156c0565b60405180910390f35b61075d600480360381019061075891906147a9565b6121af565b60405161076a919061562b565b60405180910390f35b61077b6121e1565b604051610788919061568a565b60405180910390f35b6107ab60048036038101906107a69190614864565b6121f8565b005b6107c760048036038101906107c291906146b4565b61230c565b6040516107d4919061568a565b60405180910390f35b6107f760048036038101906107f29190614864565b6123ee565b005b610813600480360381019061080e9190614600565b6125eb565b6040516108209190615b42565b60405180910390f35b610843600480360381019061083e91906146b4565b61274f565b604051610850919061568a565b60405180910390f35b610861612766565b60405161086e9190615b5d565b60405180910390f35b61087f612770565b60405161088c9190615b5d565b60405180910390f35b61089d61277a565b6040516108aa9190615646565b60405180910390f35b6108cd60048036038101906108c8919061476d565b612abf565b005b6108e960048036038101906108e49190614629565b612bf0565b6040516108f69190615b5d565b60405180910390f35b61091960048036038101906109149190614864565b612c77565b005b610923612ccd565b60405161093091906156c0565b60405180910390f35b610953600480360381019061094e9190614600565b612d06565b005b61095d612d6f565b60405161096a91906156a5565b60405180910390f35b61098d600480360381019061098891906147e5565b612d93565b005b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a275780601f106109fc57610100808354040283529160200191610a27565b820191906000526020600020905b815481529060010190602001808311610a0a57829003601f168201915b5050505050905090565b6000610a4433846305f5e10085026130b9565b6001905092915050565b6060600d805480602002602001604051908101604052809291908181526020016000905b82821015610b3657838290600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505081526020019060010190610a72565b50505050905090565b6000600354905090565b610b566000801b336120b7565b610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c906158a2565b60405180910390fd5b6000806000600d8054905090505b80831015610c33578373ffffffffffffffffffffffffffffffffffffffff16600d8481548110610bcf57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c265760019150610c33565b8280600101935050610ba3565b81610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90615782565b60405180910390fd5b8115610d3c57610c8283613284565b600d8381548110610c8f57fe5b906000526020600020906007020160020154851115610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda90615a42565b60405180910390fd5b84600d8481548110610cf157fe5b90600052602060002090600702016002016000828254039250508190555084600d8481548110610d1d57fe5b9060005260206000209060070201600401600082825401925050819055505b5050505050565b6000610d508484846134c3565b610e268433610e216305f5e10086026040518060400160405280600981526020017f45524332303a3439300000000000000000000000000000000000000000000000815250600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6130b9565b600190509392505050565b610e3e6000801b336120b7565b610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e74906158a2565b60405180910390fd5b610ea77faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c82613813565b50565b610eb76000801b336120b7565b610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906158a2565b60405180910390fd5b8060098190555050565b8060008111610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906157e2565b60405180910390fd5b81610f4d614320565b610f56336125eb565b90508060200151821115610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690615922565b60405180910390fd5b6000806000600d8054905090505b8083101561103d573373ffffffffffffffffffffffffffffffffffffffff16600d8481548110610fd957fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611030576001915061103d565b8280600101935050610fad565b8161107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490615782565b60405180910390fd5b811561114a57600d838154811061109057fe5b90600052602060002090600702016001015487116111495786600d84815481106110b657fe5b9060005260206000209060070201600101600082825403925050819055506110e4336305f5e10089026138a0565b6305f5e1008702600b600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75886040516111409190615b5d565b60405180910390a25b5b50505050505050565b61117d7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336120b7565b6111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390615762565b60405180910390fd5b6000801b821415611202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f9906159a2565b60405180910390fd5b61120f6000801b336120b7565b611276577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126c906156e2565b60405180910390fd5b5b6112808282613813565b5050565b6000600760009054906101000a900460ff16905090565b6000600254905090565b60006112c560086000848152602001908152602001600020600001613a34565b9050919050565b600061136d33846113686305f5e1008602600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6130b9565b6001905092915050565b6000806000600d8054905090505b80831015611415573373ffffffffffffffffffffffffffffffffffffffff16600d84815481106113b157fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156114085760019150611415565b8280600101935050611385565b81611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90615782565b60405180910390fd5b81156114655761146483613284565b5b505050565b600e60009054906101000a900460ff166114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b090615ac2565b60405180910390fd5b6114c66000801b336120b7565b611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc906158a2565b60405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa60405160405180910390a2565b806115907f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336120b7565b806115d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c790615702565b60405180910390fd5b60008211611613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160a90615a02565b60405180910390fd5b61161b613a49565b61162361178e565b611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165990615822565b60405180910390fd5b61166c3384613aa9565b611674613c74565b505050565b806116a47ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336120b7565b806116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db906159e2565b60405180910390fd5b60008211611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90615aa2565b60405180910390fd5b61172f613cd4565b6117376121e1565b611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90615942565b60405180910390fd5b61178084846138a0565b611788613d34565b50505050565b6000600e60029054906101000a900460ff16905090565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b7f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b38281565b6000600e60009054906101000a900460ff16905090565b8161180e33611ced565b6305f5e10060095402811015611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090615882565b60405180910390fd5b6000611907600a848154811061186b57fe5b90600052602060002090600802016006018054806020026020016040519081016040528092919081815260200182805480156118fc57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116118b2575b505050505033613d94565b905060006119b7600a858154811061191b57fe5b90600052602060002090600802016007018054806020026020016040519081016040528092919081815260200182805480156119ac57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611962575b505050505033613d94565b9050811580156119c5575080155b611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb906158c2565b60405180910390fd5b85600a8181548110611a1257fe5b906000526020600020906008020160030160009054906101000a900460ff16611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790615b22565b60405180910390fd5b8515611b23576001600a8881548110611a8557fe5b906000526020600020906008020160040160008282540192505081905550600a8781548110611ab057fe5b9060005260206000209060080201600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b85611bd5576001600a8881548110611b3757fe5b906000526020600020906008020160050160008282540192505081905550600a8781548110611b6257fe5b9060005260206000209060080201600701339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50505050505050565b611c087f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b382336120b7565b611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e90615ae2565b60405180910390fd5b600a8181548110611c5457fe5b906000526020600020906008020160030160009054906101000a900460ff16611cb2576001600a8281548110611c8657fe5b906000526020600020906008020160030160006101000a81548160ff0219169083151502179055611ce9565b6000600a8281548110611cc157fe5b906000526020600020906008020160030160006101000a81548160ff02191690831515021790555b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600954905090565b80611d6a7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336120b7565b80611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da190615702565b60405180910390fd5b60008211611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490615a02565b60405180910390fd5b611df5613a49565b611dfd61178e565b611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3390615822565b60405180910390fd5b6000611e5a84611e4c8733612bf0565b613e1490919063ffffffff16565b9050611e678533836130b9565b611e718585613aa9565b611e79613c74565b5050505050565b6000600c54905090565b60008083519050808302611e9d33611ced565b1015611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590615842565b60405180910390fd5b5b80821015611f1257611f04848381518110611ef657fe5b60200260200101518461274f565b508180600101925050611edf565b50505050565b600e60009054906101000a900460ff1615611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90615982565b60405180910390fd5b611f756000801b336120b7565b611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab906158a2565b60405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860405160405180910390a2565b6000801b81565b6000801b811415612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205890615742565b60405180910390fd5b61206b81336120b7565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a1906159c2565b60405180910390fd5b6120b48133613e5e565b50565b60006120e1826008600086815260200190815260200160002060000161308990919063ffffffff16565b905092915050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121a55780601f1061217a576101008083540402835291602001916121a5565b820191906000526020600020905b81548152906001019060200180831161218857829003601f168201915b5050505050905090565b60006121d98260086000868152602001908152602001600020600001613eeb90919063ffffffff16565b905092915050565b6000600e60019054906101000a900460ff16905090565b806122237ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336120b7565b80612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225a906159e2565b60405180910390fd5b600082116122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90615aa2565b60405180910390fd5b6122ae613cd4565b6122b66121e1565b6122f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ec90615942565b60405180910390fd5b6122ff33846138a0565b612307613d34565b505050565b60006123e433846123df6305f5e10086026040518060400160405280600981526020017f45524332303a3439350000000000000000000000000000000000000000000000815250600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6130b9565b6001905092915050565b806123f833611ced565b806305f5e10083021115612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890615922565b60405180910390fd5b8260008111612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c906157e2565b60405180910390fd5b6000806000600d8054905090505b80831015612523573373ffffffffffffffffffffffffffffffffffffffff16600d84815481106124bf57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125165760019150612523565b8280600101935050612493565b81156125ca5786600d848154811061253757fe5b906000526020600020906007020160010160008282540192505081905550612565336305f5e1008902613aa9565b6305f5e1008702600b600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516125c19190615b5d565b60405180910390a25b816125e2576125d833613f05565b6125e1876123ee565b5b50505050505050565b6125f3614320565b600080600d8054905090505b80821015612747578373ffffffffffffffffffffffffffffffffffffffff16600d838154811061262b57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561273a57600d828154811061268657fe5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509250505061274a565b81806001019250506125ff565b50505b919050565b600061275c3384846134c3565b6001905092915050565b6000600454905090565b6000600b54905090565b6060600a805480602002602001604051908101604052809291908181526020016000905b82821015612ab65783829060005260206000209060080201604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128b15780601f10612886576101008083540402835291602001916128b1565b820191906000526020600020905b81548152906001019060200180831161289457829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129535780601f1061292857610100808354040283529160200191612953565b820191906000526020600020905b81548152906001019060200180831161293657829003601f168201915b505050505081526020016003820160009054906101000a900460ff16151515158152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015612a1057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116129c6575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015612a9e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612a54575b5050505050815250508152602001906001019061279e565b50505050905090565b612ae97faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336120b7565b612b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1f90615a22565b60405180910390fd5b6000801b821415612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6590615742565b60405180910390fd5b612b7b6000801b336120b7565b612be2577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd8906156e2565b60405180910390fd5b5b612bec8282613e5e565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612c846000801b336120b7565b612cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cba906158a2565b60405180910390fd5b80600c8190555050565b6040518060400160405280600b81526020017f756e6973736f752e636f6d00000000000000000000000000000000000000000081525081565b612d136000801b336120b7565b612d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d49906158a2565b60405180910390fd5b612d5f6000801b82613813565b612d6c6000801b33613e5e565b50565b7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c81565b612dbd7f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b382336120b7565b612dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df390615ae2565b60405180910390fd5b600a6040518061010001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183151581526020016000815260200160008152602001600067ffffffffffffffff81118015612e6057600080fd5b50604051908082528060200260200182016040528015612e8f5781602001602082028036833780820191505090505b508152602001600067ffffffffffffffff81118015612ead57600080fd5b50604051908082528060200260200182016040528015612edc5781602001602082028036833780820191505090505b50815250908060018154018082558091505060019003906000526020600020906008020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019080519060200190612f6c929190614373565b506040820151816002019080519060200190612f89929190614373565b5060608201518160030160006101000a81548160ff0219169083151502179055506080820151816004015560a0820151816005015560c0820151816006019080519060200190612fda9291906143f3565b5060e0820151816007019080519060200190612ff79291906143f3565b505050505050565b60008082840190508381101561304a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304190615802565b60405180910390fd5b8091505092915050565b600061307c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614006565b905092915050565b505050565b60006130b1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614076565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312090615902565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613199576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613190906158e2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516132779190615b5d565b60405180910390a3505050565b6000600d828154811061329357fe5b90600052602060002090600702016001015490506000600d83815481106132b657fe5b90600052602060002090600702016006015490506000600d84815481106132d957fe5b906000526020600020906007020160050154905060008214156133d557428110156133d45762015180814203106133d357600c5483111561331c57600c5461331e565b825b620151808242038161332c57fe5b0402600d858154811061333b57fe5b906000526020600020906007020160020160008282540192505081905550600c5483111561336b57600c5461336d565b825b620151808242038161337b57fe5b0402600d858154811061338a57fe5b90600052602060002090600702016003016000828254019250508190555042600d85815481106133b657fe5b9060005260206000209060070201600601819055505050506134c0565b5b5b600082146134bc57428210156134bb5762015180824203106134ba57600c5483111561340357600c54613405565b825b620151808342038161341357fe5b0402600d858154811061342257fe5b906000526020600020906007020160020160008282540192505081905550600c5483111561345257600c54613454565b825b620151808342038161346257fe5b0402600d858154811061347157fe5b90600052602060002090600702016003016000828254019250508190555042600d858154811061349d57fe5b9060005260206000209060070201600601819055505050506134c0565b5b5b5050505b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a90615b02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359a90615a82565b60405180910390fd5b600081116135e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dd906157a2565b60405180910390fd5b6135f1838383614099565b613679816040518060400160405280600981526020017f45524332303a34373000000000000000000000000000000000000000000000008152506000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061370c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137ab9190615b5d565b60405180910390a3505050565b6000838311158290613800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f791906156c0565b60405180910390fd5b5060008385039050809150509392505050565b61383b816008600085815260200190815260200160002060000161305490919063ffffffff16565b1561389c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390790615862565b60405180910390fd5b61391c60008383614099565b61393181600354612fff90919063ffffffff16565b600381905550613988816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613a289190615b5d565b60405180910390a35050565b6000613a428260000161418a565b9050919050565b6001600e60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f0846bb88ff3b4abf3ada7790ae6fc103385a19b2aed99f8e450648b9e1374a3660405160405180910390a2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1090615a62565b60405180910390fd5b613b2582600083614099565b613bad816040518060400160405280600981526020017f45524332303a32333000000000000000000000000000000000000000000000008152506000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c0481600354613e1490919063ffffffff16565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c689190615b5d565b60405180910390a35050565b6000600e60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fc21bebfeff90d942c9009e0eca370a1ab9ddc28e67af48c2a213e3e9ad65fe0860405160405180910390a2565b6001600e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f04fe8ec10fc27a3eb74bc6484c1010613b3354832dd9c927827d71388ee2677a60405160405180910390a2565b6000600e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f340bf1b235fa0bbed4b1b74504c172953a38e3ef4bd71a7042fd2a0057455b7360405160405180910390a2565b60008060009050600080855190505b80831015613e08578473ffffffffffffffffffffffffffffffffffffffff16868481518110613dce57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415613dfb5760019150613e08565b8280600101935050613da3565b81935050505092915050565b6000613e5683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137b8565b905092915050565b613e86816008600085815260200190815260200160002060000161419b90919063ffffffff16565b15613ee7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000613efa83600001836141cb565b60001c905092915050565b600d6040518060e001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020014281526020016000815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505050565b60006140128383614076565b61406b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050614070565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6140a4838383613084565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561413d576140e1612766565b6140fb826140ed610b3f565b612fff90919063ffffffff16565b111561413c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614133906157c2565b60405180910390fd5b5b6141456117ed565b15614185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161417c90615962565b60405180910390fd5b505050565b600081600001805490509050919050565b60006141c3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614238565b905092915050565b600081836000018054905011614216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161420d90615722565b60405180910390fd5b82600001828154811061422557fe5b9060005260206000200154905092915050565b60008083600101600084815260200190815260200160002054905060008114614314576000600182039050600060018660000180549050039050600086600001828154811061428357fe5b90600052602060002001549050808760000184815481106142a057fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806142d857fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061431a565b60009150505b92915050565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106143b457805160ff19168380011785556143e2565b828001600101855582156143e2579182015b828111156143e15782518255916020019190600101906143c6565b5b5090506143ef919061447d565b5090565b82805482825590600052602060002090810192821561446c579160200282015b8281111561446b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190614413565b5b509050614479919061449a565b5090565b5b8082111561449657600081600090555060010161447e565b5090565b5b808211156144d157600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010161449b565b5090565b6000813590506144e481615d9e565b92915050565b600082601f8301126144fb57600080fd5b813561450e61450982615bc0565b615b93565b9150818183526020840193506020810190508385602084028201111561453357600080fd5b60005b83811015614563578161454988826144d5565b845260208401935060208301925050600181019050614536565b5050505092915050565b60008135905061457c81615db5565b92915050565b60008135905061459181615dcc565b92915050565b600082601f8301126145a857600080fd5b81356145bb6145b682615be8565b615b93565b915080825260208301602083018583830111156145d757600080fd5b6145e2838284615d4b565b50505092915050565b6000813590506145fa81615de3565b92915050565b60006020828403121561461257600080fd5b6000614620848285016144d5565b91505092915050565b6000806040838503121561463c57600080fd5b600061464a858286016144d5565b925050602061465b858286016144d5565b9150509250929050565b60008060006060848603121561467a57600080fd5b6000614688868287016144d5565b9350506020614699868287016144d5565b92505060406146aa868287016145eb565b9150509250925092565b600080604083850312156146c757600080fd5b60006146d5858286016144d5565b92505060206146e6858286016145eb565b9150509250929050565b6000806040838503121561470357600080fd5b600083013567ffffffffffffffff81111561471d57600080fd5b614729858286016144ea565b925050602061473a858286016145eb565b9150509250929050565b60006020828403121561475657600080fd5b600061476484828501614582565b91505092915050565b6000806040838503121561478057600080fd5b600061478e85828601614582565b925050602061479f858286016144d5565b9150509250929050565b600080604083850312156147bc57600080fd5b60006147ca85828601614582565b92505060206147db858286016145eb565b9150509250929050565b6000806000606084860312156147fa57600080fd5b600084013567ffffffffffffffff81111561481457600080fd5b61482086828701614597565b935050602084013567ffffffffffffffff81111561483d57600080fd5b61484986828701614597565b925050604061485a8682870161456d565b9150509250925092565b60006020828403121561487657600080fd5b6000614884848285016145eb565b91505092915050565b600080604083850312156148a057600080fd5b60006148ae858286016145eb565b92505060206148bf858286016144d5565b9150509250929050565b600080604083850312156148dc57600080fd5b60006148ea858286016145eb565b92505060206148fb8582860161456d565b9150509250929050565b60006149118383614949565b60208301905092915050565b6000614929838361541d565b905092915050565b600061493d83836154e2565b60e08301905092915050565b61495281615cec565b82525050565b61496181615cec565b82525050565b600061497282615c44565b61497c8185615c97565b935061498783615c14565b8060005b838110156149b857815161499f8882614905565b97506149aa83615c70565b92505060018101905061498b565b5085935050505092915050565b60006149d082615c4f565b6149da8185615ca8565b9350836020820285016149ec85615c24565b8060005b85811015614a285784840389528151614a09858261491d565b9450614a1483615c7d565b925060208a019950506001810190506149f0565b50829750879550505050505092915050565b6000614a4582615c5a565b614a4f8185615cb9565b9350614a5a83615c34565b8060005b83811015614a8b578151614a728882614931565b9750614a7d83615c8a565b925050600181019050614a5e565b5085935050505092915050565b614aa181615cfe565b82525050565b614ab081615cfe565b82525050565b614abf81615d0a565b82525050565b6000614ad082615c65565b614ada8185615cca565b9350614aea818560208601615d5a565b614af381615d8d565b840191505092915050565b6000614b0982615c65565b614b138185615cdb565b9350614b23818560208601615d5a565b614b2c81615d8d565b840191505092915050565b6000614b44600783615cdb565b91507f5250433a353330000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614b84600683615cdb565b91507f42433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614bc4602283615cdb565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c2a600783615cdb565b91507f5250433a353430000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614c6a600783615cdb565b91507f5250433a353130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614caa600683615cdb565b91507f53433a36353000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614cea600983615cdb565b91507f45524332303a34383000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d2a600583615cdb565b91507f55543a32300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d6a600683615cdb565b91507f53433a36333000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614daa601b83615cdb565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614dea600683615cdb565b91507f42433a32313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614e2a600683615cdb565b91507f55543a34373000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614e6a600983615cdb565b91507f45524332303a31323000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614eaa600783615cdb565b91507f56433a31303130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614eea600783615cdb565b91507f5250433a353030000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f2a600783615cdb565b91507f56433a31303230000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f6a600983615cdb565b91507f45524332303a34363000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614faa600983615cdb565b91507f45524332303a34353000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614fea600683615cdb565b91507f53433a36343000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061502a600683615cdb565b91507f4d433a31313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061506a600683615cdb565b91507f55543a34303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006150aa600683615cdb565b91507f50433a33303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006150ea600783615cdb565b91507f5250433a353230000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061512a600783615cdb565b91507f5250433a353730000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061516a600683615cdb565b91507f4d433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151aa600583615cdb565b91507f42433a33300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151ea600783615cdb565b91507f5250433a353530000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061522a600683615cdb565b91507f53433a36363000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061526a600983615cdb565b91507f45524332303a32323000000000000000000000000000000000000000000000006000830152602082019050919050565b60006152aa600983615cdb565b91507f45524332303a34323000000000000000000000000000000000000000000000006000830152602082019050919050565b60006152ea600583615cdb565b91507f4d433a33300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061532a600683615cdb565b91507f50433a33313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061536a600683615cdb565b91507f56433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006153aa600983615cdb565b91507f45524332303a34313000000000000000000000000000000000000000000000006000830152602082019050919050565b60006153ea600783615cdb565b91507f56433a31303330000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000610100830160008301516154366000860182614949565b506020830151848203602086015261544e8282614ac5565b915050604083015184820360408601526154688282614ac5565b915050606083015161547d6060860182614a98565b50608083015161549060808601826155fe565b5060a08301516154a360a08601826155fe565b5060c083015184820360c08601526154bb8282614967565b91505060e083015184820360e08601526154d58282614967565b9150508091505092915050565b60e0820160008201516154f86000850182614949565b50602082015161550b60208501826155fe565b50604082015161551e60408501826155fe565b50606082015161553160608501826155fe565b50608082015161554460808501826155fe565b5060a082015161555760a08501826155fe565b5060c082015161556a60c08501826155fe565b50505050565b60e0820160008201516155866000850182614949565b50602082015161559960208501826155fe565b5060408201516155ac60408501826155fe565b5060608201516155bf60608501826155fe565b5060808201516155d260808501826155fe565b5060a08201516155e560a08501826155fe565b5060c08201516155f860c08501826155fe565b50505050565b61560781615d34565b82525050565b61561681615d34565b82525050565b61562581615d3e565b82525050565b60006020820190506156406000830184614958565b92915050565b6000602082019050818103600083015261566081846149c5565b905092915050565b600060208201905081810360008301526156828184614a3a565b905092915050565b600060208201905061569f6000830184614aa7565b92915050565b60006020820190506156ba6000830184614ab6565b92915050565b600060208201905081810360008301526156da8184614afe565b905092915050565b600060208201905081810360008301526156fb81614b37565b9050919050565b6000602082019050818103600083015261571b81614b77565b9050919050565b6000602082019050818103600083015261573b81614bb7565b9050919050565b6000602082019050818103600083015261575b81614c1d565b9050919050565b6000602082019050818103600083015261577b81614c5d565b9050919050565b6000602082019050818103600083015261579b81614c9d565b9050919050565b600060208201905081810360008301526157bb81614cdd565b9050919050565b600060208201905081810360008301526157db81614d1d565b9050919050565b600060208201905081810360008301526157fb81614d5d565b9050919050565b6000602082019050818103600083015261581b81614d9d565b9050919050565b6000602082019050818103600083015261583b81614ddd565b9050919050565b6000602082019050818103600083015261585b81614e1d565b9050919050565b6000602082019050818103600083015261587b81614e5d565b9050919050565b6000602082019050818103600083015261589b81614e9d565b9050919050565b600060208201905081810360008301526158bb81614edd565b9050919050565b600060208201905081810360008301526158db81614f1d565b9050919050565b600060208201905081810360008301526158fb81614f5d565b9050919050565b6000602082019050818103600083015261591b81614f9d565b9050919050565b6000602082019050818103600083015261593b81614fdd565b9050919050565b6000602082019050818103600083015261595b8161501d565b9050919050565b6000602082019050818103600083015261597b8161505d565b9050919050565b6000602082019050818103600083015261599b8161509d565b9050919050565b600060208201905081810360008301526159bb816150dd565b9050919050565b600060208201905081810360008301526159db8161511d565b9050919050565b600060208201905081810360008301526159fb8161515d565b9050919050565b60006020820190508181036000830152615a1b8161519d565b9050919050565b60006020820190508181036000830152615a3b816151dd565b9050919050565b60006020820190508181036000830152615a5b8161521d565b9050919050565b60006020820190508181036000830152615a7b8161525d565b9050919050565b60006020820190508181036000830152615a9b8161529d565b9050919050565b60006020820190508181036000830152615abb816152dd565b9050919050565b60006020820190508181036000830152615adb8161531d565b9050919050565b60006020820190508181036000830152615afb8161535d565b9050919050565b60006020820190508181036000830152615b1b8161539d565b9050919050565b60006020820190508181036000830152615b3b816153dd565b9050919050565b600060e082019050615b576000830184615570565b92915050565b6000602082019050615b72600083018461560d565b92915050565b6000602082019050615b8d600083018461561c565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615bb657600080fd5b8060405250919050565b600067ffffffffffffffff821115615bd757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115615bff57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615cf782615d14565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615d78578082015181840152602081019050615d5d565b83811115615d87576000848401525b50505050565b6000601f19601f8301169050919050565b615da781615cec565b8114615db257600080fd5b50565b615dbe81615cfe565b8114615dc957600080fd5b50565b615dd581615d0a565b8114615de057600080fd5b50565b615dec81615d34565b8114615df757600080fd5b5056fea2646970667358221220ba2fad7ffcf3442a88d6c70a050b97bd7e084781fe1f72ae119f153f4077855664736f6c634300060c0033

Deployed Bytecode Sourcemap

264:205:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;920:77:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1929:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2769:105:9;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1269:94:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4584:630:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2111:296:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3007:114:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2624:115:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2620:687:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3465:385:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1086:77:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1167:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1872:131:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2411:225:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3792:387:12;;;:::i;:::-;;1527:118:6;;;:::i;:::-;;2999:181:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2510:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1371:88:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;388:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;796:67:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1139:72:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1222:428:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3774:200:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1471:119:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2374:91:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3650:328:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2584:91:9;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1223:321:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1311:116:6;;;:::i;:::-;;599:41:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4755:236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1542:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;388:57:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1001:81:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2258:143:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1371:88:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1896:181:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2640:248:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1158:682:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3060:279:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1594:172:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1367:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2376:97:9;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4059:96:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4196:387:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1770:155:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3498:115:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;420:46:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2619:154:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;755:59;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3092:426:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;920:77:2;959:13;987:5;980:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;920:77;:::o;1929:178::-;2024:4;2036:49;2045:10;2057:7;2077:5;2067:6;:16;2036:8;:49::i;:::-;2098:4;2091:11;;1929:178;;;;:::o;2769:105:9:-;2822:20;2857:12;2850:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2769:105;:::o;1269:94:2:-;1324:7;1346:12;;1339:19;;1269:94;:::o;4584:630:12:-;1233:31:7;636:4;1241:10;;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;4678:9:12::1;4697:18:::0;4729:11:::1;4743:12;:19;;;;4729:33;;4768:133;4779:3;4775:1;:7;4768:133;;;4821:7;4796:32;;:12;4809:1;4796:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:32;;;4792:92;;;4856:4;4840:20;;4870:5;;4792:92;4891:3;;;;;;;4768:133;;;4922:13;4907:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;4968:13;4964:246;;;4991:17;5006:1;4991:14;:17::i;:::-;5044:12;5057:1;5044:15;;;;;;;;;;;;;;;;;;:31;;;5033:7;:42;;5016:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;5145:7;5110:12;5123:1;5110:15;;;;;;;;;;;;;;;;;;:31;;;:42;;;;;;;;;;;5196:7;5160:12;5173:1;5160:15;;;;;;;;;;;;;;;;;;:32;;;:43;;;;;;;;;;;4964:246;1293:1:7;;;4584:630:12::0;;:::o;2111:296:2:-;2233:4;2245:36;2255:6;2263:9;2274:6;2245:9;:36::i;:::-;2287:98;2296:6;2304:10;2316:68;2363:5;2353:6;:16;2316:68;;;;;;;;;;;;;;;;;:11;:19;2328:6;2316:19;;;;;;;;;;;;;;;:31;2336:10;2316:31;;;;;;;;;;;;;;;;:35;;:68;;;;;:::i;:::-;2287:8;:98::i;:::-;2398:4;2391:11;;2111:296;;;;;:::o;3007:114:7:-;1233:31;636:4;1241:10;;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3087:29:::1;794:20;3112:3;3087:10;:29::i;:::-;3007:114:::0;:::o;2624:115:14:-;1233:31:7;636:4;1241:10;;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2727:7:14::1;2709:15;:25;;;;2624:115:::0;:::o;2620:687:12:-;2698:7;1362:1:9;1352:7;:11;1337:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;2731:7:12::1;2057:30:9;;:::i;:::-;2090:29;2108:10;2090:17;:29::i;:::-;2057:62;;2152:11;:17;;;2141:7;:28;;2126:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;2749:9:12::2;2768:18:::0;2800:11:::2;2814:12;:19;;;;2800:33;;2839:136;2850:3;2846:1;:7;2839:136;;;2892:10;2867:35;;:12;2880:1;2867:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:35;;;2863:95;;;2930:4;2914:20;;2944:5;;2863:95;2965:3;;;;;;;2839:136;;;2996:13;2981:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3042:13;3038:265;;;3080:12;3093:1;3080:15;;;;;;;;;;;;;;;;;;:21;;;3069:7;:32;3065:232;;3138:7;3113:12;3126:1;3113:15;;;;;;;;;;;;;;;;;;:21;;;:32;;;;;;;;;;;3155:38;3161:10;3185:5;3174:7;:17;3155:5;:38::i;:::-;3237:5;3226:7;:17;3203:18;;:41;;;;;;;;;;;3268:10;3259:29;;;3280:7;3259:29;;;;;;:::i;:::-;;;;;;;;3065:232;3038:265;2197:1:9;;;1391::::1;;2620:687:12::0;;:::o;3465:385:7:-;3560:33;794:20;3582:10;3560:7;:33::i;:::-;3545:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;636:4;3647:10;;3638:5;:19;;3623:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3692:31;636:4;3700:10;;3712;3692:7;:31::i;:::-;3687:130;;3759:24;3750:5;:33;3733:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;3687:130;3823:22;3834:5;3841:3;3823:10;:22::i;:::-;3465:385;;:::o;1086:77:2:-;1129:5;1149:9;;;;;;;;;;;1142:16;;1086:77;:::o;1167:98::-;1224:7;1246:14;;1239:21;;1167:98;:::o;1872:131:7:-;1946:7;1968:30;:6;:13;1975:5;1968:13;;;;;;;;;;;:21;;:28;:30::i;:::-;1961:37;;1872:131;;;:::o;2411:225:2:-;2511:4;2523:91;2532:10;2544:7;2553:60;2605:5;2591:10;:20;2553:11;:23;2565:10;2553:23;;;;;;;;;;;;;;;:32;2577:7;2553:32;;;;;;;;;;;;;;;;:36;;:60;;;;:::i;:::-;2523:8;:91::i;:::-;2627:4;2620:11;;2411:225;;;;:::o;3792:387:12:-;3835:9;3854:18;3886:11;3900:12;:19;;;;3886:33;;3925:136;3936:3;3932:1;:7;3925:136;;;3978:10;3953:35;;:12;3966:1;3953:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:35;;;3949:95;;;4016:4;4000:20;;4030:5;;3949:95;4051:3;;;;;;;3925:136;;;4082:13;4067:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;4128:13;4124:51;;;4151:17;4166:1;4151:14;:17::i;:::-;4124:51;3792:387;;;:::o;1527:118:6:-;901:7;;;;;;;;;;;886:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;1233:31:7::1;636:4;1241:10:::0;::::1;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1604:5:6::2;1594:7;;:15;;;;;;;;;;;;;;;;;;1629:10;1620:20;;;;;;;;;;;;1527:118::o:0;2999:181:13:-;3070:7;3083:32;426:19:1;3104:10:13;3083:7;:32::i;:::-;978:8:1;963:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;1040:1;1030:7;:11;1015:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1069:16;:14;:16::i;:::-;1107;:14;:16::i;:::-;1092:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3126:26:13::1;3132:10;3144:7;3126:5;:26::i;:::-;3158:17;:15;:17::i;:::-;2999:181:::0;;;:::o;2510:193::-;2600:7;2613:32;426:19:5;2634:10:13;2613:7;:32::i;:::-;978:8:5;963:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;1040:1;1030:7;:11;1015:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1069:16;:14;:16::i;:::-;1107;:14;:16::i;:::-;1092:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;2656:19:13::1;2662:3;2667:7;2656:5;:19::i;:::-;2681:17;:15;:17::i;:::-;2510:193:::0;;;;:::o;1371:88:1:-;1420:4;1439:15;;;;;;;;;;;1432:22;;1371:88;:::o;388:57::-;426:19;388:57;:::o;796:67:14:-;839:24;796:67;:::o;1139:72:6:-;1180:4;1199:7;;;;;;;;;;;1192:14;;1139:72;:::o;1222:428:11:-;1327:3;1336:21;1346:10;1336:9;:21::i;:::-;1576:5:14;1557:15;;:25;1544:8;:39;;1529:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;1613:17;1633:63;1654:9;1664:3;1654:14;;;;;;;;;;;;;;;;;;:29;;1633:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1685:10;1633:20;:63::i;:::-;1613:83;;1702:17;1722:63;1743:9;1753:3;1743:14;;;;;;;;;;;;;;;;;;:29;;1722:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1774:10;1722:20;:63::i;:::-;1702:83;;1808:12;1807:13;:30;;;;;1825:12;1824:13;1807:30;1792:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1381:3:11::1;2131:9:14;2141:3;2131:14;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;2116:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;1399:15:11::2;1395:122;;;1455:1;1424:9;1434:3;1424:14;;;;;;;;;;;;;;;;;;:27;;;:32;;;;;;;;;;;1464:9;1474:3;1464:14;;;;;;;;;;;;;;;;;;:29;;1499:10;1464:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1395:122;1528:15;1523:123;;1584:1;1553:9;1563:3;1553:14;;;;;;;;;;;;;;;;;;:27;;;:32;;;;;;;;;;;1593:9;1603:3;1593:14;;;;;;;;;;;;;;;;;;:29;;1628:10;1593:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1523:123;1866:1:14::1;1222:428:11::0;;;;;;:::o;3774:200:14:-;1110:37;839:24;1136:10;1110:7;:37::i;:::-;1095:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;3856:9:::1;3866:3;3856:14;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;:113;;3965:4;3934:9;3944:3;3934:14;;;;;;;;;;;;;;;;;;:28;;;:35;;;;;;;;;;;;;;;;;3856:113;;;3922:5;3891:9;3901:3;3891:14;;;;;;;;;;;;;;;;;;:28;;;:36;;;;;;;;;;;;;;;;;3856:113;;3774:200:::0;:::o;1471:119:2:-;1545:7;1567:9;:18;1577:7;1567:18;;;;;;;;;;;;;;;;1560:25;;1471:119;;;:::o;2374:91:14:-;2423:7;2445:15;;2438:22;;2374:91;:::o;3650:328:13:-;3744:7;3757:32;426:19:1;3778:10:13;3757:7;:32::i;:::-;978:8:1;963:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;1040:1;1030:7;:11;1015:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1069:16;:14;:16::i;:::-;1107;:14;:16::i;:::-;1092:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3800:26:13::1;3829:41;3862:7;3829:28;3839:5;3846:10;3829:9;:28::i;:::-;:32;;:41;;;;:::i;:::-;3800:70;;3876:47;3885:5;3892:10;3904:18;3876:8;:47::i;:::-;3929:21;3935:5;3942:7;3929:5;:21::i;:::-;3956:17;:15;:17::i;:::-;1151:1:1;3650:328:13::0;;;;:::o;2584:91:9:-;2633:7;2655:15;;2648:22;;2584:91;:::o;1223:321:13:-;1325:9;1344:11;1358:10;:17;1344:31;;1433:3;1423:7;:13;1397:21;1407:10;1397:9;:21::i;:::-;:40;;1382:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;1466:74;1477:3;1473:1;:7;1466:74;;;1490:32;1499:10;1510:1;1499:13;;;;;;;;;;;;;;1514:7;1490:8;:32::i;:::-;;1530:3;;;;;;;1466:74;;;1223:321;;;;:::o;1311:116:6:-;705:7;;;;;;;;;;;704:8;689:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;1233:31:7::1;636:4;1241:10:::0;::::1;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1389:4:6::2;1379:7;;:14;;;;;;;;;;;;;;;;;;1411:10;1404:18;;;;;;;;;;;;1311:116::o:0;599:41:7:-;636:4;599:41;;;:::o;4755:236::-;636:4;4845:10;;4836:5;:19;;4821:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4900:26;4908:5;4915:10;4900:7;:26::i;:::-;4885:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4956:30;4968:5;4975:10;4956:11;:30::i;:::-;4755:236;:::o;1542:147::-;1625:4;1644:40;1675:8;1644:6;:13;1651:5;1644:13;;;;;;;;;;;:21;;:30;;:40;;;;:::i;:::-;1637:47;;1542:147;;;;:::o;388:57:5:-;426:19;388:57;:::o;1001:81:2:-;1042:13;1070:7;1063:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1001:81;:::o;2258:143:7:-;2345:7;2367:29;2392:3;2367:6;:13;2374:5;2367:13;;;;;;;;;;;:21;;:24;;:29;;;;:::i;:::-;2360:36;;2258:143;;;;:::o;1371:88:5:-;1420:4;1439:15;;;;;;;;;;;1432:22;;1371:88;:::o;1896:181:13:-;1967:7;1980:32;426:19:5;2001:10:13;1980:7;:32::i;:::-;978:8:5;963:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;1040:1;1030:7;:11;1015:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1069:16;:14;:16::i;:::-;1107;:14;:16::i;:::-;1092:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;2023:26:13::1;2029:10;2041:7;2023:5;:26::i;:::-;2055:17;:15;:17::i;:::-;1896:181:::0;;;:::o;2640:248:2:-;2745:4;2757:109;2766:10;2778:7;2787:78;2844:5;2825:15;:25;2787:78;;;;;;;;;;;;;;;;;:11;:23;2799:10;2787:23;;;;;;;;;;;;;;;:32;2811:7;2787:32;;;;;;;;;;;;;;;;:36;;:78;;;;;:::i;:::-;2757:8;:109::i;:::-;2879:4;2872:11;;2640:248;;;;:::o;1158:682:12:-;1232:7;1245:21;1255:10;1245:9;:21::i;:::-;1749:8:9;1738:5;1727:7;:17;1726:31;;1711:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1292:7:12::1;1362:1:9;1352:7;:11;1337:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1310:9:12::2;1329:18:::0;1361:11:::2;1375:12;:19;;;;1361:33;;1400:136;1411:3;1407:1;:7;1400:136;;;1453:10;1428:35;;:12;1441:1;1428:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:35;;;1424:95;;;1491:4;1475:20;;1505:5;;1424:95;1526:3;;;;;;;1400:136;;;1546:13;1542:201;;;1594:7;1569:12;1582:1;1569:15;;;;;;;;;;;;;;;;;;:21;;;:32;;;;;;;;;;;1609:38;1615:10;1639:5;1628:7;:17;1609:5;:38::i;:::-;1689:5;1678:7;:17;1655:18;;:41;;;;;;;;;;;1716:10;1709:27;;;1728:7;1709:27;;;;;;:::i;:::-;;;;;;;;1542:201;1754:13;1749:87;;1777:30;1796:10;1777:18;:30::i;:::-;1815:14;1821:7;1815:5;:14::i;:::-;1749:87;1391:1:9;;;1785::::1;1158:682:12::0;;;:::o;3060:279:9:-;3132:18;;:::i;:::-;3158:9;3177:11;3191:12;:19;;;;3177:33;;3216:119;3227:3;3223:1;:7;3216:119;;;3269:6;3244:31;;:12;3257:1;3244:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:31;;;3240:78;;;3294:12;3307:1;3294:15;;;;;;;;;;;;;;;;;;3287:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3240:78;3325:3;;;;;;;3216:119;;;3060:279;;;;;;:::o;1594:172:2:-;1692:4;1704:40;1714:10;1726:9;1737:6;1704:9;:40::i;:::-;1757:4;1750:11;;1594:172;;;;:::o;1367:100::-;1425:7;1447:15;;1440:22;;1367:100;:::o;2376:97:9:-;2428:7;2450:18;;2443:25;;2376:97;:::o;4059:96:14:-;4109:17;4141:9;4134:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4059:96;:::o;4196:387:7:-;4292:33;794:20;4314:10;4292:7;:33::i;:::-;4277:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;636:4;4379:10;;4370:5;:19;;4355:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4424:31;636:4;4432:10;;4444;4424:7;:31::i;:::-;4419:130;;4491:24;4482:5;:33;4465:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;4419:130;4555:23;4567:5;4574:3;4555:11;:23::i;:::-;4196:387;;:::o;1770:155:2:-;1871:7;1893:11;:18;1905:5;1893:18;;;;;;;;;;;;;;;:27;1912:7;1893:27;;;;;;;;;;;;;;;;1886:34;;1770:155;;;;:::o;3498:115:9:-;1233:31:7;636:4;1241:10;;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3601:7:9::1;3583:15;:25;;;;3498:115:::0;:::o;420:46:10:-;;;;;;;;;;;;;;;;;;;:::o;2619:154:7:-;1233:31;636:4;1241:10;;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2700:27:::1;636:4;2711:10:::0;::::1;2723:3;2700:10;:27::i;:::-;2733:35;636:4;2745:10:::0;::::1;2757;2733:11;:35::i;:::-;2619:154:::0;:::o;755:59::-;794:20;755:59;:::o;3092:426:14:-;1110:37;839:24;1136:10;1110:7;:37::i;:::-;1095:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;3224:9:::1;3246:261;;;;;;;;3274:10;3246:261;;;;;;3300:5;3246:261;;;;3328:4;3246:261;;;;3357:7;3246:261;;;;;;3388:1;3246:261;;;;3413:1;3246:261;;;;3454:1;3440:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3246:261;;;;3496:1;3482:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3246:261;;::::0;3224:289:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;3092:426:::0;;;:::o;189:174:8:-;259:7;274:9;290:1;286;:5;274:17;;310:1;305;:6;;297:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;357:1;350:8;;;189:174;;;;:::o;1601:147:3:-;1683:4;1702:41;1707:3;:10;;1735:5;1727:14;;1719:23;;1702:4;:41::i;:::-;1695:48;;1601:147;;;;:::o;4580:107:2:-;;;;:::o;1909:162:3:-;2001:4;2020:46;2030:3;:10;;2058:5;2050:14;;2042:23;;2020:9;:46::i;:::-;2013:53;;1909:162;;;;:::o;4160:322:2:-;4297:1;4280:19;;:5;:19;;;;4265:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;4364:1;4345:21;;:7;:21;;;;4330:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;4428:6;4398:11;:18;4410:5;4398:18;;;;;;;;;;;;;;;:27;4417:7;4398:27;;;;;;;;;;;;;;;:36;;;;4461:7;4445:32;;4454:5;4445:32;;;4470:6;4445:32;;;;;;:::i;:::-;;;;;;;;4160:322;;;:::o;4885:1390:9:-;4953:13;4969:12;4982:3;4969:17;;;;;;;;;;;;;;;;;;:23;;;4953:39;;4998:28;5029:12;5042:3;5029:17;;;;;;;;;;;;;;;;;;:40;;;4998:71;;5075:17;5095:12;5108:3;5095:17;;;;;;;;;;;;;;;;;;:27;;;5075:47;;5157:1;5133:20;:25;5129:546;;;5184:3;5172:9;:15;5168:501;;;5224:6;5210:9;5204:3;:15;5203:27;5199:462;;5336:15;;5327:5;:24;;:62;;5374:15;;5327:62;;;5366:5;5327:62;5303:6;5290:9;5284:3;:15;5283:26;;;;;;5282:119;5244:12;5257:3;5244:17;;;;;;;;;;;;;;;;;;:33;;;:158;;;;;;;;;;;5508:15;;5499:5;:24;;:62;;5546:15;;5499:62;;;5538:5;5499:62;5475:6;5462:9;5456:3;:15;5455:26;;;;;;5454:119;5414:12;5427:3;5414:17;;;;;;;;;;;;;;;;;;:35;;;:160;;;;;;;;;;;5629:3;5586:12;5599:3;5586:17;;;;;;;;;;;;;;;;;;:40;;:46;;;;5644:7;;;;;5199:462;5168:501;5129:546;5709:1;5685:20;:25;5681:590;;5747:3;5724:20;:26;5720:545;;;5798:6;5773:20;5767:3;:26;5766:38;5762:495;;5921:15;;5912:5;:24;;:62;;5959:15;;5912:62;;;5951:5;5912:62;5888:6;5864:20;5858:3;:26;5857:37;;;;;;5856:130;5818:12;5831:3;5818:17;;;;;;;;;;;;;;;;;;:33;;;:169;;;;;;;;;;;6104:15;;6095:5;:24;;:62;;6142:15;;6095:62;;;6134:5;6095:62;6071:6;6047:20;6041:3;:26;6040:37;;;;;;6039:130;5999:12;6012:3;5999:17;;;;;;;;;;;;;;;;;;:35;;;:171;;;;;;;;;;;6225:3;6182:12;6195:3;6182:17;;;;;;;;;;;;;;;;;;:40;;:46;;;;6240:7;;;;;5762:495;5720:545;5681:590;4885:1390;;;;;:::o;2892:531:2:-;3034:1;3016:20;;:6;:20;;;;3001:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;3104:1;3083:23;;:9;:23;;;;3068:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3162:1;3153:6;:10;3138:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3195:47;3216:6;3224:9;3235:6;3195:20;:47::i;:::-;3269:42;3291:6;3269:42;;;;;;;;;;;;;;;;;:9;:17;3279:6;3269:17;;;;;;;;;;;;;;;;:21;;:42;;;;;:::i;:::-;3249:9;:17;3259:6;3249:17;;;;;;;;;;;;;;;:62;;;;3340:32;3365:6;3340:9;:20;3350:9;3340:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;3317:9;:20;3327:9;3317:20;;;;;;;;;;;;;;;:55;;;;3400:9;3383:35;;3392:6;3383:35;;;3411:6;3383:35;;;;;;:::i;:::-;;;;;;;;2892:531;;;:::o;511:189:8:-;613:7;641:1;636;:6;;644:12;628:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;663:9;679:1;675;:5;663:17;;694:1;687:8;;;511:189;;;;;:::o;5109:169:7:-;5187:30;5213:3;5187:6;:13;5194:5;5187:13;;;;;;;;;;;:21;;:25;;:30;;;;:::i;:::-;5183:91;;;5256:10;5232:35;;5251:3;5232:35;;5244:5;5232:35;;;;;;;;;;5183:91;5109:169;;:::o;3427:356:2:-;3544:1;3525:21;;:7;:21;;;;3510:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3578:49;3607:1;3611:7;3620:6;3578:20;:49::i;:::-;3649:24;3666:6;3649:12;;:16;;:24;;;;:::i;:::-;3634:12;:39;;;;3700:30;3723:6;3700:9;:18;3710:7;3700:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;3679:9;:18;3689:7;3679:18;;;;;;;;;;;;;;;:51;;;;3762:7;3741:37;;3758:1;3741:37;;;3771:6;3741:37;;;;;;:::i;:::-;;;;;;;;3427:356;;:::o;2075:117:3:-;2146:7;2168:19;2176:3;:10;;2168:7;:19::i;:::-;2161:26;;2075:117;;;:::o;1567:115:1:-;1636:4;1618:15;;:22;;;;;;;;;;;;;;;;;;1666:10;1651:26;;;;;;;;;;;;1567:115::o;3787:369:2:-;3904:1;3885:21;;:7;:21;;;;3870:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3938:49;3959:7;3976:1;3980:6;3938:20;:49::i;:::-;4015:43;4038:6;4015:43;;;;;;;;;;;;;;;;;:9;:18;4025:7;4015:18;;;;;;;;;;;;;;;;:22;;:43;;;;;:::i;:::-;3994:9;:18;4004:7;3994:18;;;;;;;;;;;;;;;:64;;;;4079:24;4096:6;4079:12;;:16;;:24;;;;:::i;:::-;4064:12;:39;;;;4140:1;4114:37;;4123:7;4114:37;;;4144:6;4114:37;;;;;;:::i;:::-;;;;;;;;3787:369;;:::o;1792:118:1:-;1862:5;1844:15;;:23;;;;;;;;;;;;;;;;;;1894:10;1878:27;;;;;;;;;;;;1792:118::o;1567:115:5:-;1636:4;1618:15;;:22;;;;;;;;;;;;;;;;;;1666:10;1651:26;;;;;;;;;;;;1567:115::o;1792:118::-;1862:5;1844:15;;:23;;;;;;;;;;;;;;;;;;1894:10;1878:27;;;;;;;;;;;;1792:118::o;4433:331:14:-;4539:4;4551:9;4563:1;4551:13;;4570:10;4594:11;4608:7;:14;4594:28;;4628:113;4639:3;4635:1;:7;4628:113;;;4670:6;4656:20;;:7;4664:1;4656:10;;;;;;;;;;;;;;:20;;;4652:72;;;4696:4;4688:12;;4710:5;;4652:72;4731:3;;;;;;;4628:113;;;4754:5;4747:12;;;;;4433:331;;;;:::o;367:140:8:-;437:7;459:43;463:1;466;459:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;452:50;;367:140;;;;:::o;5282:173:7:-;5361:33;5390:3;5361:6;:13;5368:5;5361:13;;;;;;;;;;;:21;;:28;;:33;;;;:::i;:::-;5357:94;;;5433:10;5409:35;;5428:3;5409:35;;5421:5;5409:35;;;;;;;;;;5357:94;5282:173;;:::o;2196:153:3:-;2282:7;2320:22;2324:3;:10;;2336:5;2320:3;:22::i;:::-;2312:31;;2297:47;;2196:153;;;;:::o;3768:291:9:-;3843:12;3861:192;;;;;;;;3888:6;3861:192;;;;;;3909:1;3861:192;;;;3957:1;3861:192;;;;3985:1;3861:192;;;;4012:1;3861:192;;;;3929:3;3861:192;;;;4045:1;3861:192;;;3843:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3768:291;:::o;286:257:3:-;361:4;378:21;388:3;393:5;378:9;:21::i;:::-;373:166;;409:3;:11;;426:5;409:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;462:3;:11;;:18;;;;440:3;:12;;:19;453:5;440:19;;;;;;;;;;;:40;;;;495:4;488:11;;;;373:166;527:5;520:12;;286:257;;;;;:::o;1101:133::-;1186:4;1228:1;1205:3;:12;;:19;1218:5;1205:19;;;;;;;;;;;;:24;;1198:31;;1101:133;;;;:::o;4249:354:13:-;4369:44;4396:4;4402:2;4406:6;4369:26;:44::i;:::-;4440:1;4424:18;;:4;:18;;;4420:126;;;4498:16;:14;:16::i;:::-;4469:25;4487:6;4469:13;:11;:13::i;:::-;:17;;:25;;;;:::i;:::-;:45;;4452:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;4420:126;4568:8;:6;:8::i;:::-;4567:9;4552:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4249:354;;;:::o;1238:109:3:-;1302:7;1324:3;:11;;:18;;;;1317:25;;1238:109;;;:::o;1752:153::-;1837:4;1856:44;1864:3;:10;;1892:5;1884:14;;1876:23;;1856:7;:44::i;:::-;1849:51;;1752:153;;;;:::o;1351:203::-;1430:7;1474:5;1453:3;:11;;:18;;;;:26;1445:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1531:3;:11;;1543:5;1531:18;;;;;;;;;;;;;;;;1524:25;;1351:203;;;;:::o;547:550::-;625:4;637:18;658:3;:12;;:19;671:5;658:19;;;;;;;;;;;;637:40;;702:1;688:10;:15;684:409;;713:21;750:1;737:10;:14;713:38;;759:17;800:1;779:3;:11;;:18;;;;:22;759:42;;809:17;829:3;:11;;841:9;829:22;;;;;;;;;;;;;;;;809:42;;888:9;859:3;:11;;871:13;859:26;;;;;;;;;;;;;;;:38;;;;947:1;931:13;:17;905:3;:12;;:23;918:9;905:23;;;;;;;;;;;:43;;;;983:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;1015:3;:12;;:19;1028:5;1015:19;;;;;;;;;;;1008:26;;;1049:4;1042:11;;;;;;;;684:409;1081:5;1074:12;;;547:550;;;;;:::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://ba2fad7ffcf3442a88d6c70a050b97bd7e084781fe1f72ae119f153f40778556
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.