ETH Price: $2,268.38 (+3.09%)
Gas: 49 Gwei

Contract

0xEC568fffba86c094cf06b22134B23074DFE2252c
 

Overview

ETH Balance

0.01 ETH

Eth Value

$22.68 (@ $2,268.38/ETH)

Multi Chain

Transaction Hash
Method
Block
From
To
Value
0x69749dc99e3998507b6f7c92fca6cc92f3ddac0c75810b33e776bd267d4be912Submit Vote(pending)2023-12-06 6:13:511 hr 4 mins ago1701843231IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x2378d7890d75e29426263d4b996e63ecb830f1cd9aefacf445f2a1659ed527beSubmit Vote(pending)2023-12-06 5:49:561 hr 28 mins ago1701841796IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x636962f3a62291a5e5682bc591902785e058fa416bf7e44b2184bb9d8b201815Submit Vote(pending)2023-12-04 1:06:262 days 6 hrs ago1701651986IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x248eefd0ec553b33ea704d39fe80c8f1ae001bfa8e99b47be26ea1af943d3f9aSubmit Vote(pending)2023-12-03 19:53:032 days 11 hrs ago1701633183IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0xdf44e5b9eae84f8175082865415ad105be2cf33da895f5a36764113a9a39cf6bSubmit Vote(pending)2023-12-03 15:23:522 days 15 hrs ago1701617032IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0xa22dac96fe186704d4d845dc03937c0beebc75069e4c91d1ca0fd8178e708f8aSubmit Vote(pending)2023-12-03 9:22:382 days 21 hrs ago1701595358IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x205efb27100a991b70cddd1bd84d3bd4165555e6d9a11c69fc096976cbac7d40Submit Vote(pending)2023-12-03 5:07:013 days 2 hrs ago1701580021IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x0db0e096a3ee7adfa1746bea8e3ea3497d2da3192675f77648658d58d71f97a5Submit Vote(pending)2023-12-03 4:46:353 days 2 hrs ago1701578795IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0xbde533a3cb9d4fb1358f63679b8f9a9dc9765f5bd433bb5288be54c6adf214e8Submit Vote(pending)2023-12-03 3:47:033 days 3 hrs ago1701575223IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x05414bc4ce5f223ab8df9d0b7a510b5159df3357ad7053b876961ce284428020Submit Vote(pending)2023-12-03 3:27:153 days 3 hrs ago1701574035IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0xa797a2bcb5553eac0ab79f8ce156ec49b2c98e91e29c1368bf667512778fcf05Submit Vote(pending)2023-12-03 2:34:543 days 4 hrs ago1701570894IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x73ac50878d27913a8e677156bdd7514e7172c9f9aa8284bd195d32c6965afc36Submit Vote(pending)2023-12-03 2:31:023 days 4 hrs ago1701570662IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x701b0c04a31e1117e414301c80c5b8393103a2ab90073ad80cc3178d50a432edSubmit Vote(pending)2023-12-03 2:31:023 days 4 hrs ago1701570662IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x9766c101437656b548fbc4dda182a383839779e548151ba4cb36241cea172614Submit Vote(pending)2023-12-03 2:28:033 days 4 hrs ago1701570483IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x31be56e163ea9a7aa17473b6e9ba34f042ea81f63f19e39d4187b853816d963eSubmit Vote(pending)2023-12-03 2:24:353 days 4 hrs ago1701570275IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0xd653d8e8047081213e3220a331b8e905703058767dd26b486dd049e31247a29bSubmit Vote(pending)2023-12-03 2:19:493 days 4 hrs ago1701569989IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x3121ba39b5b560d63205aaee8b41a20b2a9a24950d32fd3a3e21dfdfc23ce6dfSubmit Vote(pending)2023-12-03 2:16:153 days 5 hrs ago1701569775IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0xc08c68f89de495ca6339ad1db4fd3d0c396c477c96b04ffe8e7e271577633567Submit Vote(pending)2023-12-03 2:09:243 days 5 hrs ago1701569364IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x564caccaa515a2527edb8e9d5a04d36cf8ed93e8ad7c62abaa43774f2651b0ceSubmit Vote(pending)2023-12-03 2:09:053 days 5 hrs ago1701569345IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x0d8ac264687c5b55dd8ebde8b016eaf9557a05ccb1ba6a6a9c1612497716c4efSubmit Vote(pending)2023-12-03 1:53:513 days 5 hrs ago1701568431IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x02b503823f9852ba95c6b8872b4a9dbfa6953d6a4b9ec78d48d29b264f3f10d6Submit Vote(pending)2023-12-03 1:50:183 days 5 hrs ago1701568218IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0xc88075e67acf7d8a179cf3ac3f0414b80bb765ab1f37efa191ed83ce04fa0792Submit Vote(pending)2023-12-03 1:44:513 days 5 hrs ago1701567891IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0xb9df670d9ee05f71752d6e5a722e0cc2fa9ab6384dba430ffc11a16c6d72e886Submit Vote(pending)2023-12-03 1:37:073 days 5 hrs ago1701567427IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
0x797ac222d55aba46185ae834d1830d9b961719c4a6ed79458659d2ab97ffd21cSubmit Vote(pending)2023-12-03 1:36:473 days 5 hrs ago1701567407IN
0xEC568f...DFE2252c
0 ETH(Pending)(Pending)
Submit Vote187254802023-12-06 6:24:5953 mins ago1701843899IN
0xEC568f...DFE2252c
0 ETH0.0047237545.79055661
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AaveGovernanceV2

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-10
*/

// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.5;
pragma abicoder v2;

function getChainId() pure returns (uint256) {
  uint256 chainId;
  assembly {
    chainId := chainid()
  }
  return chainId;
}

function isContract(address account) view returns (bool) {
  // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
  // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
  // for accounts without code, i.e. `keccak256('')`
  bytes32 codehash;
  bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
  // solhint-disable-next-line no-inline-assembly
  assembly {
    codehash := extcodehash(account)
  }
  return (codehash != accountHash && codehash != 0x0);
}

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
  function _msgSender() internal view virtual returns (address payable) {
    return msg.sender;
  }

  function _msgData() internal view virtual returns (bytes memory) {
    this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
    return msg.data;
  }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
  address private _owner;

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor() {
    address msgSender = _msgSender();
    _owner = msgSender;
    emit OwnershipTransferred(address(0), msgSender);
  }

  /**
   * @dev Returns the address of the current owner.
   */
  function owner() public view returns (address) {
    return _owner;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(_owner == _msgSender(), 'Ownable: caller is not the owner');
    _;
  }

  /**
   * @dev Leaves the contract without owner. It will not be possible to call
   * `onlyOwner` functions anymore. Can only be called by the current owner.
   *
   * NOTE: Renouncing ownership will leave the contract without an owner,
   * thereby removing any functionality that is only available to the owner.
   */
  function renounceOwnership() public virtual onlyOwner {
    emit OwnershipTransferred(_owner, address(0));
    _owner = address(0);
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public virtual onlyOwner {
    require(newOwner != address(0), 'Ownable: new owner is the zero address');
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
  /**
   * @dev Returns the addition of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `+` operator.
   *
   * Requirements:
   * - Addition cannot overflow.
   */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, 'SafeMath: addition overflow');

    return c;
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   * - Subtraction cannot overflow.
   */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    return sub(a, b, 'SafeMath: subtraction overflow');
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   * - Subtraction cannot overflow.
   */
  function sub(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b <= a, errorMessage);
    uint256 c = a - b;

    return c;
  }

  /**
   * @dev Returns the multiplication of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `*` operator.
   *
   * Requirements:
   * - Multiplication cannot overflow.
   */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
    if (a == 0) {
      return 0;
    }

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

    return c;
  }

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    return div(a, b, 'SafeMath: division by zero');
  }

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function div(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, errorMessage);
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    return mod(a, b, 'SafeMath: modulo by zero');
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts with custom message when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function mod(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b != 0, errorMessage);
    return a % b;
  }
}

interface IVotingStrategy {
  function getVotingPowerAt(address user, uint256 blockNumber) external view returns (uint256);
}

interface IProposalValidator {
  /**
   * @dev Called to validate a proposal (e.g when creating new proposal in Governance)
   * @param governance Governance Contract
   * @param user Address of the proposal creator
   * @param blockNumber Block Number against which to make the test (e.g proposal creation block -1).
   * @return boolean, true if can be created
   **/
  function validateCreatorOfProposal(
    IAaveGovernanceV2 governance,
    address user,
    uint256 blockNumber
  ) external view returns (bool);

  /**
   * @dev Called to validate the cancellation of a proposal
   * @param governance Governance Contract
   * @param user Address of the proposal creator
   * @param blockNumber Block Number against which to make the test (e.g proposal creation block -1).
   * @return boolean, true if can be cancelled
   **/
  function validateProposalCancellation(
    IAaveGovernanceV2 governance,
    address user,
    uint256 blockNumber
  ) external view returns (bool);

  /**
   * @dev Returns whether a user has enough Proposition Power to make a proposal.
   * @param governance Governance Contract
   * @param user Address of the user to be challenged.
   * @param blockNumber Block Number against which to make the challenge.
   * @return true if user has enough power
   **/
  function isPropositionPowerEnough(
    IAaveGovernanceV2 governance,
    address user,
    uint256 blockNumber
  ) external view returns (bool);

  /**
   * @dev Returns the minimum Proposition Power needed to create a proposition.
   * @param governance Governance Contract
   * @param blockNumber Blocknumber at which to evaluate
   * @return minimum Proposition Power needed
   **/
  function getMinimumPropositionPowerNeeded(IAaveGovernanceV2 governance, uint256 blockNumber)
    external
    view
    returns (uint256);

  /**
   * @dev Returns whether a proposal passed or not
   * @param governance Governance Contract
   * @param proposalId Id of the proposal to set
   * @return true if proposal passed
   **/
  function isProposalPassed(IAaveGovernanceV2 governance, uint256 proposalId)
    external
    view
    returns (bool);

  /**
   * @dev Check whether a proposal has reached quorum, ie has enough FOR-voting-power
   * Here quorum is not to understand as number of votes reached, but number of for-votes reached
   * @param governance Governance Contract
   * @param proposalId Id of the proposal to verify
   * @return voting power needed for a proposal to pass
   **/
  function isQuorumValid(IAaveGovernanceV2 governance, uint256 proposalId)
    external
    view
    returns (bool);

  /**
   * @dev Check whether a proposal has enough extra FOR-votes than AGAINST-votes
   * FOR VOTES - AGAINST VOTES > VOTE_DIFFERENTIAL * voting supply
   * @param governance Governance Contract
   * @param proposalId Id of the proposal to verify
   * @return true if enough For-Votes
   **/
  function isVoteDifferentialValid(IAaveGovernanceV2 governance, uint256 proposalId)
    external
    view
    returns (bool);

  /**
   * @dev Calculates the minimum amount of Voting Power needed for a proposal to Pass
   * @param votingSupply Total number of oustanding voting tokens
   * @return voting power needed for a proposal to pass
   **/
  function getMinimumVotingPowerNeeded(uint256 votingSupply) external view returns (uint256);

  /**
   * @dev Get proposition threshold constant value
   * @return the proposition threshold value (100 <=> 1%)
   **/
  function PROPOSITION_THRESHOLD() external view returns (uint256);

  /**
   * @dev Get voting duration constant value
   * @return the voting duration value in seconds
   **/
  function VOTING_DURATION() external view returns (uint256);

  /**
   * @dev Get the vote differential threshold constant value
   * to compare with % of for votes/total supply - % of against votes/total supply
   * @return the vote differential threshold value (100 <=> 1%)
   **/
  function VOTE_DIFFERENTIAL() external view returns (uint256);

  /**
   * @dev Get quorum threshold constant value
   * to compare with % of for votes/total supply
   * @return the quorum threshold value (100 <=> 1%)
   **/
  function MINIMUM_QUORUM() external view returns (uint256);

  /**
   * @dev precision helper: 100% = 10000
   * @return one hundred percents with our chosen precision
   **/
  function ONE_HUNDRED_WITH_PRECISION() external view returns (uint256);
}

interface IGovernanceStrategy {
  /**
   * @dev Returns the Proposition Power of a user at a specific block number.
   * @param user Address of the user.
   * @param blockNumber Blocknumber at which to fetch Proposition Power
   * @return Power number
   **/
  function getPropositionPowerAt(address user, uint256 blockNumber) external view returns (uint256);

  /**
   * @dev Returns the total supply of Outstanding Proposition Tokens
   * @param blockNumber Blocknumber at which to evaluate
   * @return total supply at blockNumber
   **/
  function getTotalPropositionSupplyAt(uint256 blockNumber) external view returns (uint256);

  /**
   * @dev Returns the total supply of Outstanding Voting Tokens
   * @param blockNumber Blocknumber at which to evaluate
   * @return total supply at blockNumber
   **/
  function getTotalVotingSupplyAt(uint256 blockNumber) external view returns (uint256);

  /**
   * @dev Returns the Vote Power of a user at a specific block number.
   * @param user Address of the user.
   * @param blockNumber Blocknumber at which to fetch Vote Power
   * @return Vote number
   **/
  function getVotingPowerAt(address user, uint256 blockNumber) external view returns (uint256);
}

interface IExecutorWithTimelock {
  /**
   * @dev emitted when a new pending admin is set
   * @param newPendingAdmin address of the new pending admin
   **/
  event NewPendingAdmin(address newPendingAdmin);

  /**
   * @dev emitted when a new admin is set
   * @param newAdmin address of the new admin
   **/
  event NewAdmin(address newAdmin);

  /**
   * @dev emitted when a new delay (between queueing and execution) is set
   * @param delay new delay
   **/
  event NewDelay(uint256 delay);

  /**
   * @dev emitted when a new (trans)action is Queued.
   * @param actionHash hash of the action
   * @param target address of the targeted contract
   * @param value wei value of the transaction
   * @param signature function signature of the transaction
   * @param data function arguments of the transaction or callData if signature empty
   * @param executionTime time at which to execute the transaction
   * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
   **/
  event QueuedAction(
    bytes32 actionHash,
    address indexed target,
    uint256 value,
    string signature,
    bytes data,
    uint256 executionTime,
    bool withDelegatecall
  );

  /**
   * @dev emitted when an action is Cancelled
   * @param actionHash hash of the action
   * @param target address of the targeted contract
   * @param value wei value of the transaction
   * @param signature function signature of the transaction
   * @param data function arguments of the transaction or callData if signature empty
   * @param executionTime time at which to execute the transaction
   * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
   **/
  event CancelledAction(
    bytes32 actionHash,
    address indexed target,
    uint256 value,
    string signature,
    bytes data,
    uint256 executionTime,
    bool withDelegatecall
  );

  /**
   * @dev emitted when an action is Cancelled
   * @param actionHash hash of the action
   * @param target address of the targeted contract
   * @param value wei value of the transaction
   * @param signature function signature of the transaction
   * @param data function arguments of the transaction or callData if signature empty
   * @param executionTime time at which to execute the transaction
   * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
   * @param resultData the actual callData used on the target
   **/
  event ExecutedAction(
    bytes32 actionHash,
    address indexed target,
    uint256 value,
    string signature,
    bytes data,
    uint256 executionTime,
    bool withDelegatecall,
    bytes resultData
  );

  /**
   * @dev Getter of the current admin address (should be governance)
   * @return The address of the current admin
   **/
  function getAdmin() external view returns (address);

  /**
   * @dev Getter of the current pending admin address
   * @return The address of the pending admin
   **/
  function getPendingAdmin() external view returns (address);

  /**
   * @dev Getter of the delay between queuing and execution
   * @return The delay in seconds
   **/
  function getDelay() external view returns (uint256);

  /**
   * @dev Returns whether an action (via actionHash) is queued
   * @param actionHash hash of the action to be checked
   * keccak256(abi.encode(target, value, signature, data, executionTime, withDelegatecall))
   * @return true if underlying action of actionHash is queued
   **/
  function isActionQueued(bytes32 actionHash) external view returns (bool);

  /**
   * @dev Checks whether a proposal is over its grace period
   * @param governance Governance contract
   * @param proposalId Id of the proposal against which to test
   * @return true of proposal is over grace period
   **/
  function isProposalOverGracePeriod(IAaveGovernanceV2 governance, uint256 proposalId)
    external
    view
    returns (bool);

  /**
   * @dev Getter of grace period constant
   * @return grace period in seconds
   **/
  function GRACE_PERIOD() external view returns (uint256);

  /**
   * @dev Getter of minimum delay constant
   * @return minimum delay in seconds
   **/
  function MINIMUM_DELAY() external view returns (uint256);

  /**
   * @dev Getter of maximum delay constant
   * @return maximum delay in seconds
   **/
  function MAXIMUM_DELAY() external view returns (uint256);

  /**
   * @dev Function, called by Governance, that queue a transaction, returns action hash
   * @param target smart contract target
   * @param value wei value of the transaction
   * @param signature function signature of the transaction
   * @param data function arguments of the transaction or callData if signature empty
   * @param executionTime time at which to execute the transaction
   * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
   **/
  function queueTransaction(
    address target,
    uint256 value,
    string memory signature,
    bytes memory data,
    uint256 executionTime,
    bool withDelegatecall
  ) external returns (bytes32);

  /**
   * @dev Function, called by Governance, that cancels a transaction, returns the callData executed
   * @param target smart contract target
   * @param value wei value of the transaction
   * @param signature function signature of the transaction
   * @param data function arguments of the transaction or callData if signature empty
   * @param executionTime time at which to execute the transaction
   * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
   **/
  function executeTransaction(
    address target,
    uint256 value,
    string memory signature,
    bytes memory data,
    uint256 executionTime,
    bool withDelegatecall
  ) external payable returns (bytes memory);

  /**
   * @dev Function, called by Governance, that cancels a transaction, returns action hash
   * @param target smart contract target
   * @param value wei value of the transaction
   * @param signature function signature of the transaction
   * @param data function arguments of the transaction or callData if signature empty
   * @param executionTime time at which to execute the transaction
   * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
   **/
  function cancelTransaction(
    address target,
    uint256 value,
    string memory signature,
    bytes memory data,
    uint256 executionTime,
    bool withDelegatecall
  ) external returns (bytes32);
}

interface IAaveGovernanceV2 {
  enum ProposalState {Pending, Canceled, Active, Failed, Succeeded, Queued, Expired, Executed}

  struct Vote {
    bool support;
    uint248 votingPower;
  }

  struct Proposal {
    uint256 id;
    address creator;
    IExecutorWithTimelock executor;
    address[] targets;
    uint256[] values;
    string[] signatures;
    bytes[] calldatas;
    bool[] withDelegatecalls;
    uint256 startBlock;
    uint256 endBlock;
    uint256 executionTime;
    uint256 forVotes;
    uint256 againstVotes;
    bool executed;
    bool canceled;
    address strategy;
    bytes32 ipfsHash;
    mapping(address => Vote) votes;
  }

  struct ProposalWithoutVotes {
    uint256 id;
    address creator;
    IExecutorWithTimelock executor;
    address[] targets;
    uint256[] values;
    string[] signatures;
    bytes[] calldatas;
    bool[] withDelegatecalls;
    uint256 startBlock;
    uint256 endBlock;
    uint256 executionTime;
    uint256 forVotes;
    uint256 againstVotes;
    bool executed;
    bool canceled;
    address strategy;
    bytes32 ipfsHash;
  }

  /**
   * @dev emitted when a new proposal is created
   * @param id Id of the proposal
   * @param creator address of the creator
   * @param executor The ExecutorWithTimelock contract that will execute the proposal
   * @param targets list of contracts called by proposal's associated transactions
   * @param values list of value in wei for each propoposal's associated transaction
   * @param signatures list of function signatures (can be empty) to be used when created the callData
   * @param calldatas list of calldatas: if associated signature empty, calldata ready, else calldata is arguments
   * @param withDelegatecalls boolean, true = transaction delegatecalls the taget, else calls the target
   * @param startBlock block number when vote starts
   * @param endBlock block number when vote ends
   * @param strategy address of the governanceStrategy contract
   * @param ipfsHash IPFS hash of the proposal
   **/
  event ProposalCreated(
    uint256 id,
    address indexed creator,
    IExecutorWithTimelock indexed executor,
    address[] targets,
    uint256[] values,
    string[] signatures,
    bytes[] calldatas,
    bool[] withDelegatecalls,
    uint256 startBlock,
    uint256 endBlock,
    address strategy,
    bytes32 ipfsHash
  );

  /**
   * @dev emitted when a proposal is canceled
   * @param id Id of the proposal
   **/
  event ProposalCanceled(uint256 id);

  /**
   * @dev emitted when a proposal is queued
   * @param id Id of the proposal
   * @param executionTime time when proposal underlying transactions can be executed
   * @param initiatorQueueing address of the initiator of the queuing transaction
   **/
  event ProposalQueued(uint256 id, uint256 executionTime, address indexed initiatorQueueing);
  /**
   * @dev emitted when a proposal is executed
   * @param id Id of the proposal
   * @param initiatorExecution address of the initiator of the execution transaction
   **/
  event ProposalExecuted(uint256 id, address indexed initiatorExecution);
  /**
   * @dev emitted when a vote is registered
   * @param id Id of the proposal
   * @param voter address of the voter
   * @param support boolean, true = vote for, false = vote against
   * @param votingPower Power of the voter/vote
   **/
  event VoteEmitted(uint256 id, address indexed voter, bool support, uint256 votingPower);

  event GovernanceStrategyChanged(address indexed newStrategy, address indexed initiatorChange);

  event VotingDelayChanged(uint256 newVotingDelay, address indexed initiatorChange);

  event ExecutorAuthorized(address executor);

  event ExecutorUnauthorized(address executor);

  /**
   * @dev Creates a Proposal (needs Proposition Power of creator > Threshold)
   * @param executor The ExecutorWithTimelock contract that will execute the proposal
   * @param targets list of contracts called by proposal's associated transactions
   * @param values list of value in wei for each propoposal's associated transaction
   * @param signatures list of function signatures (can be empty) to be used when created the callData
   * @param calldatas list of calldatas: if associated signature empty, calldata ready, else calldata is arguments
   * @param withDelegatecalls if true, transaction delegatecalls the taget, else calls the target
   * @param ipfsHash IPFS hash of the proposal
   **/
  function create(
    IExecutorWithTimelock executor,
    address[] memory targets,
    uint256[] memory values,
    string[] memory signatures,
    bytes[] memory calldatas,
    bool[] memory withDelegatecalls,
    bytes32 ipfsHash
  ) external returns (uint256);

  /**
   * @dev Cancels a Proposal,
   * either at anytime by guardian
   * or when proposal is Pending/Active and threshold no longer reached
   * @param proposalId id of the proposal
   **/
  function cancel(uint256 proposalId) external;

  /**
   * @dev Queue the proposal (If Proposal Succeeded)
   * @param proposalId id of the proposal to queue
   **/
  function queue(uint256 proposalId) external;

  /**
   * @dev Execute the proposal (If Proposal Queued)
   * @param proposalId id of the proposal to execute
   **/
  function execute(uint256 proposalId) external payable;

  /**
   * @dev Function allowing msg.sender to vote for/against a proposal
   * @param proposalId id of the proposal
   * @param support boolean, true = vote for, false = vote against
   **/
  function submitVote(uint256 proposalId, bool support) external;

  /**
   * @dev Function to register the vote of user that has voted offchain via signature
   * @param proposalId id of the proposal
   * @param support boolean, true = vote for, false = vote against
   * @param v v part of the voter signature
   * @param r r part of the voter signature
   * @param s s part of the voter signature
   **/
  function submitVoteBySignature(
    uint256 proposalId,
    bool support,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;

  /**
   * @dev Set new GovernanceStrategy
   * Note: owner should be a timelocked executor, so needs to make a proposal
   * @param governanceStrategy new Address of the GovernanceStrategy contract
   **/
  function setGovernanceStrategy(address governanceStrategy) external;

  /**
   * @dev Set new Voting Delay (delay before a newly created proposal can be voted on)
   * Note: owner should be a timelocked executor, so needs to make a proposal
   * @param votingDelay new voting delay in seconds
   **/
  function setVotingDelay(uint256 votingDelay) external;

  /**
   * @dev Add new addresses to the list of authorized executors
   * @param executors list of new addresses to be authorized executors
   **/
  function authorizeExecutors(address[] memory executors) external;

  /**
   * @dev Remove addresses to the list of authorized executors
   * @param executors list of addresses to be removed as authorized executors
   **/
  function unauthorizeExecutors(address[] memory executors) external;

  /**
   * @dev Let the guardian abdicate from its priviledged rights
   **/
  function __abdicate() external;

  /**
   * @dev Getter of the current GovernanceStrategy address
   * @return The address of the current GovernanceStrategy contracts
   **/
  function getGovernanceStrategy() external view returns (address);

  /**
   * @dev Getter of the current Voting Delay (delay before a created proposal can be voted on)
   * Different from the voting duration
   * @return The voting delay in seconds
   **/
  function getVotingDelay() external view returns (uint256);

  /**
   * @dev Returns whether an address is an authorized executor
   * @param executor address to evaluate as authorized executor
   * @return true if authorized
   **/
  function isExecutorAuthorized(address executor) external view returns (bool);

  /**
   * @dev Getter the address of the guardian, that can mainly cancel proposals
   * @return The address of the guardian
   **/
  function getGuardian() external view returns (address);

  /**
   * @dev Getter of the proposal count (the current number of proposals ever created)
   * @return the proposal count
   **/
  function getProposalsCount() external view returns (uint256);

  /**
   * @dev Getter of a proposal by id
   * @param proposalId id of the proposal to get
   * @return the proposal as ProposalWithoutVotes memory object
   **/
  function getProposalById(uint256 proposalId) external view returns (ProposalWithoutVotes memory);

  /**
   * @dev Getter of the Vote of a voter about a proposal
   * Note: Vote is a struct: ({bool support, uint248 votingPower})
   * @param proposalId id of the proposal
   * @param voter address of the voter
   * @return The associated Vote memory object
   **/
  function getVoteOnProposal(uint256 proposalId, address voter) external view returns (Vote memory);

  /**
   * @dev Get the current state of a proposal
   * @param proposalId id of the proposal
   * @return The current state if the proposal
   **/
  function getProposalState(uint256 proposalId) external view returns (ProposalState);
}

/**
 * @title Governance V2 contract
 * @dev Main point of interaction with Aave protocol's governance
 * - Create a Proposal
 * - Cancel a Proposal
 * - Queue a Proposal
 * - Execute a Proposal
 * - Submit Vote to a Proposal
 * Proposal States : Pending => Active => Succeeded(/Failed) => Queued => Executed(/Expired)
 *                   The transition to "Canceled" can appear in multiple states
 * @author Aave
 **/
contract AaveGovernanceV2 is Ownable, IAaveGovernanceV2 {
  using SafeMath for uint256;

  address private _governanceStrategy;
  uint256 private _votingDelay;

  uint256 private _proposalsCount;
  mapping(uint256 => Proposal) private _proposals;
  mapping(address => bool) private _authorizedExecutors;

  address private _guardian;

  bytes32 public constant DOMAIN_TYPEHASH = keccak256(
    'EIP712Domain(string name,uint256 chainId,address verifyingContract)'
  );
  bytes32 public constant VOTE_EMITTED_TYPEHASH = keccak256('VoteEmitted(uint256 id,bool support)');
  string public constant NAME = 'Aave Governance v2';

  modifier onlyGuardian() {
    require(msg.sender == _guardian, 'ONLY_BY_GUARDIAN');
    _;
  }

  constructor(
    address governanceStrategy,
    uint256 votingDelay,
    address guardian,
    address[] memory executors
  ) {
    _setGovernanceStrategy(governanceStrategy);
    _setVotingDelay(votingDelay);
    _guardian = guardian;

    authorizeExecutors(executors);
  }

  struct CreateVars {
    uint256 startBlock;
    uint256 endBlock;
    uint256 previousProposalsCount;
  }

  /**
   * @dev Creates a Proposal (needs to be validated by the Proposal Validator)
   * @param executor The ExecutorWithTimelock contract that will execute the proposal
   * @param targets list of contracts called by proposal's associated transactions
   * @param values list of value in wei for each propoposal's associated transaction
   * @param signatures list of function signatures (can be empty) to be used when created the callData
   * @param calldatas list of calldatas: if associated signature empty, calldata ready, else calldata is arguments
   * @param withDelegatecalls boolean, true = transaction delegatecalls the taget, else calls the target
   * @param ipfsHash IPFS hash of the proposal
   **/
  function create(
    IExecutorWithTimelock executor,
    address[] memory targets,
    uint256[] memory values,
    string[] memory signatures,
    bytes[] memory calldatas,
    bool[] memory withDelegatecalls,
    bytes32 ipfsHash
  ) external override returns (uint256) {
    require(targets.length != 0, 'INVALID_EMPTY_TARGETS');
    require(
      targets.length == values.length &&
        targets.length == signatures.length &&
        targets.length == calldatas.length &&
        targets.length == withDelegatecalls.length,
      'INCONSISTENT_PARAMS_LENGTH'
    );

    require(isExecutorAuthorized(address(executor)), 'EXECUTOR_NOT_AUTHORIZED');

    require(
      IProposalValidator(address(executor)).validateCreatorOfProposal(
        this,
        msg.sender,
        block.number - 1
      ),
      'PROPOSITION_CREATION_INVALID'
    );

    CreateVars memory vars;

    vars.startBlock = block.number.add(_votingDelay);
    vars.endBlock = vars.startBlock.add(IProposalValidator(address(executor)).VOTING_DURATION());

    vars.previousProposalsCount = _proposalsCount;

    Proposal storage newProposal = _proposals[vars.previousProposalsCount];
    newProposal.id = vars.previousProposalsCount;
    newProposal.creator = msg.sender;
    newProposal.executor = executor;
    newProposal.targets = targets;
    newProposal.values = values;
    newProposal.signatures = signatures;
    newProposal.calldatas = calldatas;
    newProposal.withDelegatecalls = withDelegatecalls;
    newProposal.startBlock = vars.startBlock;
    newProposal.endBlock = vars.endBlock;
    newProposal.strategy = _governanceStrategy;
    newProposal.ipfsHash = ipfsHash;
    _proposalsCount++;

    emit ProposalCreated(
      vars.previousProposalsCount,
      msg.sender,
      executor,
      targets,
      values,
      signatures,
      calldatas,
      withDelegatecalls,
      vars.startBlock,
      vars.endBlock,
      _governanceStrategy,
      ipfsHash
    );

    return newProposal.id;
  }

  /**
   * @dev Cancels a Proposal.
   * - Callable by the _guardian with relaxed conditions, or by anybody if the conditions of
   *   cancellation on the executor are fulfilled
   * @param proposalId id of the proposal
   **/
  function cancel(uint256 proposalId) external override {
    ProposalState state = getProposalState(proposalId);
    require(
      state != ProposalState.Executed &&
        state != ProposalState.Canceled &&
        state != ProposalState.Expired,
      'ONLY_BEFORE_EXECUTED'
    );

    Proposal storage proposal = _proposals[proposalId];
    require(
      msg.sender == _guardian ||
        IProposalValidator(address(proposal.executor)).validateProposalCancellation(
          this,
          proposal.creator,
          block.number - 1
        ),
      'PROPOSITION_CANCELLATION_INVALID'
    );
    proposal.canceled = true;
    for (uint256 i = 0; i < proposal.targets.length; i++) {
      proposal.executor.cancelTransaction(
        proposal.targets[i],
        proposal.values[i],
        proposal.signatures[i],
        proposal.calldatas[i],
        proposal.executionTime,
        proposal.withDelegatecalls[i]
      );
    }

    emit ProposalCanceled(proposalId);
  }

  /**
   * @dev Queue the proposal (If Proposal Succeeded)
   * @param proposalId id of the proposal to queue
   **/
  function queue(uint256 proposalId) external override {
    require(getProposalState(proposalId) == ProposalState.Succeeded, 'INVALID_STATE_FOR_QUEUE');
    Proposal storage proposal = _proposals[proposalId];
    uint256 executionTime = block.timestamp.add(proposal.executor.getDelay());
    for (uint256 i = 0; i < proposal.targets.length; i++) {
      _queueOrRevert(
        proposal.executor,
        proposal.targets[i],
        proposal.values[i],
        proposal.signatures[i],
        proposal.calldatas[i],
        executionTime,
        proposal.withDelegatecalls[i]
      );
    }
    proposal.executionTime = executionTime;

    emit ProposalQueued(proposalId, executionTime, msg.sender);
  }

  /**
   * @dev Execute the proposal (If Proposal Queued)
   * @param proposalId id of the proposal to execute
   **/
  function execute(uint256 proposalId) external payable override {
    require(getProposalState(proposalId) == ProposalState.Queued, 'ONLY_QUEUED_PROPOSALS');
    Proposal storage proposal = _proposals[proposalId];
    proposal.executed = true;
    for (uint256 i = 0; i < proposal.targets.length; i++) {
      proposal.executor.executeTransaction{value: proposal.values[i]}(
        proposal.targets[i],
        proposal.values[i],
        proposal.signatures[i],
        proposal.calldatas[i],
        proposal.executionTime,
        proposal.withDelegatecalls[i]
      );
    }
    emit ProposalExecuted(proposalId, msg.sender);
  }

  /**
   * @dev Function allowing msg.sender to vote for/against a proposal
   * @param proposalId id of the proposal
   * @param support boolean, true = vote for, false = vote against
   **/
  function submitVote(uint256 proposalId, bool support) external override {
    return _submitVote(msg.sender, proposalId, support);
  }

  /**
   * @dev Function to register the vote of user that has voted offchain via signature
   * @param proposalId id of the proposal
   * @param support boolean, true = vote for, false = vote against
   * @param v v part of the voter signature
   * @param r r part of the voter signature
   * @param s s part of the voter signature
   **/
  function submitVoteBySignature(
    uint256 proposalId,
    bool support,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external override {
    bytes32 digest = keccak256(
      abi.encodePacked(
        '\x19\x01',
        keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(NAME)), getChainId(), address(this))),
        keccak256(abi.encode(VOTE_EMITTED_TYPEHASH, proposalId, support))
      )
    );
    address signer = ecrecover(digest, v, r, s);
    require(signer != address(0), 'INVALID_SIGNATURE');
    return _submitVote(signer, proposalId, support);
  }

  /**
   * @dev Set new GovernanceStrategy
   * Note: owner should be a timelocked executor, so needs to make a proposal
   * @param governanceStrategy new Address of the GovernanceStrategy contract
   **/
  function setGovernanceStrategy(address governanceStrategy) external override onlyOwner {
    _setGovernanceStrategy(governanceStrategy);
  }

  /**
   * @dev Set new Voting Delay (delay before a newly created proposal can be voted on)
   * Note: owner should be a timelocked executor, so needs to make a proposal
   * @param votingDelay new voting delay in terms of blocks
   **/
  function setVotingDelay(uint256 votingDelay) external override onlyOwner {
    _setVotingDelay(votingDelay);
  }

  /**
   * @dev Add new addresses to the list of authorized executors
   * @param executors list of new addresses to be authorized executors
   **/
  function authorizeExecutors(address[] memory executors) public override onlyOwner {
    for (uint256 i = 0; i < executors.length; i++) {
      _authorizeExecutor(executors[i]);
    }
  }

  /**
   * @dev Remove addresses to the list of authorized executors
   * @param executors list of addresses to be removed as authorized executors
   **/
  function unauthorizeExecutors(address[] memory executors) public override onlyOwner {
    for (uint256 i = 0; i < executors.length; i++) {
      _unauthorizeExecutor(executors[i]);
    }
  }

  /**
   * @dev Let the guardian abdicate from its priviledged rights
   **/
  function __abdicate() external override onlyGuardian {
    _guardian = address(0);
  }

  /**
   * @dev Getter of the current GovernanceStrategy address
   * @return The address of the current GovernanceStrategy contracts
   **/
  function getGovernanceStrategy() external view override returns (address) {
    return _governanceStrategy;
  }

  /**
   * @dev Getter of the current Voting Delay (delay before a created proposal can be voted on)
   * Different from the voting duration
   * @return The voting delay in number of blocks
   **/
  function getVotingDelay() external view override returns (uint256) {
    return _votingDelay;
  }

  /**
   * @dev Returns whether an address is an authorized executor
   * @param executor address to evaluate as authorized executor
   * @return true if authorized
   **/
  function isExecutorAuthorized(address executor) public view override returns (bool) {
    return _authorizedExecutors[executor];
  }

  /**
   * @dev Getter the address of the guardian, that can mainly cancel proposals
   * @return The address of the guardian
   **/
  function getGuardian() external view override returns (address) {
    return _guardian;
  }

  /**
   * @dev Getter of the proposal count (the current number of proposals ever created)
   * @return the proposal count
   **/
  function getProposalsCount() external view override returns (uint256) {
    return _proposalsCount;
  }

  /**
   * @dev Getter of a proposal by id
   * @param proposalId id of the proposal to get
   * @return the proposal as ProposalWithoutVotes memory object
   **/
  function getProposalById(uint256 proposalId)
    external
    view
    override
    returns (ProposalWithoutVotes memory)
  {
    Proposal storage proposal = _proposals[proposalId];
    ProposalWithoutVotes memory proposalWithoutVotes = ProposalWithoutVotes({
      id: proposal.id,
      creator: proposal.creator,
      executor: proposal.executor,
      targets: proposal.targets,
      values: proposal.values,
      signatures: proposal.signatures,
      calldatas: proposal.calldatas,
      withDelegatecalls: proposal.withDelegatecalls,
      startBlock: proposal.startBlock,
      endBlock: proposal.endBlock,
      executionTime: proposal.executionTime,
      forVotes: proposal.forVotes,
      againstVotes: proposal.againstVotes,
      executed: proposal.executed,
      canceled: proposal.canceled,
      strategy: proposal.strategy,
      ipfsHash: proposal.ipfsHash
    });

    return proposalWithoutVotes;
  }

  /**
   * @dev Getter of the Vote of a voter about a proposal
   * Note: Vote is a struct: ({bool support, uint248 votingPower})
   * @param proposalId id of the proposal
   * @param voter address of the voter
   * @return The associated Vote memory object
   **/
  function getVoteOnProposal(uint256 proposalId, address voter)
    external
    view
    override
    returns (Vote memory)
  {
    return _proposals[proposalId].votes[voter];
  }

  /**
   * @dev Get the current state of a proposal
   * @param proposalId id of the proposal
   * @return The current state if the proposal
   **/
  function getProposalState(uint256 proposalId) public view override returns (ProposalState) {
    require(_proposalsCount >= proposalId, 'INVALID_PROPOSAL_ID');
    Proposal storage proposal = _proposals[proposalId];
    if (proposal.canceled) {
      return ProposalState.Canceled;
    } else if (block.number <= proposal.startBlock) {
      return ProposalState.Pending;
    } else if (block.number <= proposal.endBlock) {
      return ProposalState.Active;
    } else if (!IProposalValidator(address(proposal.executor)).isProposalPassed(this, proposalId)) {
      return ProposalState.Failed;
    } else if (proposal.executionTime == 0) {
      return ProposalState.Succeeded;
    } else if (proposal.executed) {
      return ProposalState.Executed;
    } else if (proposal.executor.isProposalOverGracePeriod(this, proposalId)) {
      return ProposalState.Expired;
    } else {
      return ProposalState.Queued;
    }
  }

  function _queueOrRevert(
    IExecutorWithTimelock executor,
    address target,
    uint256 value,
    string memory signature,
    bytes memory callData,
    uint256 executionTime,
    bool withDelegatecall
  ) internal {
    require(
      !executor.isActionQueued(
        keccak256(abi.encode(target, value, signature, callData, executionTime, withDelegatecall))
      ),
      'DUPLICATED_ACTION'
    );
    executor.queueTransaction(target, value, signature, callData, executionTime, withDelegatecall);
  }

  function _submitVote(
    address voter,
    uint256 proposalId,
    bool support
  ) internal {
    require(getProposalState(proposalId) == ProposalState.Active, 'VOTING_CLOSED');
    Proposal storage proposal = _proposals[proposalId];
    Vote storage vote = proposal.votes[voter];

    require(vote.votingPower == 0, 'VOTE_ALREADY_SUBMITTED');

    uint256 votingPower = IVotingStrategy(proposal.strategy).getVotingPowerAt(
      voter,
      proposal.startBlock
    );

    if (support) {
      proposal.forVotes = proposal.forVotes.add(votingPower);
    } else {
      proposal.againstVotes = proposal.againstVotes.add(votingPower);
    }

    vote.support = support;
    vote.votingPower = uint248(votingPower);

    emit VoteEmitted(proposalId, voter, support, votingPower);
  }

  function _setGovernanceStrategy(address governanceStrategy) internal {
    _governanceStrategy = governanceStrategy;

    emit GovernanceStrategyChanged(governanceStrategy, msg.sender);
  }

  function _setVotingDelay(uint256 votingDelay) internal {
    _votingDelay = votingDelay;

    emit VotingDelayChanged(votingDelay, msg.sender);
  }

  function _authorizeExecutor(address executor) internal {
    _authorizedExecutors[executor] = true;
    emit ExecutorAuthorized(executor);
  }

  function _unauthorizeExecutor(address executor) internal {
    _authorizedExecutors[executor] = false;
    emit ExecutorUnauthorized(executor);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"governanceStrategy","type":"address"},{"internalType":"uint256","name":"votingDelay","type":"uint256"},{"internalType":"address","name":"guardian","type":"address"},{"internalType":"address[]","name":"executors","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"}],"name":"ExecutorAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"executor","type":"address"}],"name":"ExecutorUnauthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newStrategy","type":"address"},{"indexed":true,"internalType":"address","name":"initiatorChange","type":"address"}],"name":"GovernanceStrategyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"contract IExecutorWithTimelock","name":"executor","type":"address"},{"indexed":false,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"signatures","type":"string[]"},{"indexed":false,"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"indexed":false,"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"},{"indexed":false,"internalType":"bytes32","name":"ipfsHash","type":"bytes32"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"initiatorExecution","type":"address"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"executionTime","type":"uint256"},{"indexed":true,"internalType":"address","name":"initiatorQueueing","type":"address"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"votingPower","type":"uint256"}],"name":"VoteEmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newVotingDelay","type":"uint256"},{"indexed":true,"internalType":"address","name":"initiatorChange","type":"address"}],"name":"VotingDelayChanged","type":"event"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTE_EMITTED_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"__abdicate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"executors","type":"address[]"}],"name":"authorizeExecutors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IExecutorWithTimelock","name":"executor","type":"address"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"internalType":"bytes32","name":"ipfsHash","type":"bytes32"}],"name":"create","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getGovernanceStrategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGuardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalById","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"contract IExecutorWithTimelock","name":"executor","type":"address"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"executionTime","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"address","name":"strategy","type":"address"},{"internalType":"bytes32","name":"ipfsHash","type":"bytes32"}],"internalType":"struct IAaveGovernanceV2.ProposalWithoutVotes","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalState","outputs":[{"internalType":"enum IAaveGovernanceV2.ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProposalsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getVoteOnProposal","outputs":[{"components":[{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint248","name":"votingPower","type":"uint248"}],"internalType":"struct IAaveGovernanceV2.Vote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVotingDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"}],"name":"isExecutorAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"queue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"governanceStrategy","type":"address"}],"name":"setGovernanceStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"votingDelay","type":"uint256"}],"name":"setVotingDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"submitVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"submitVoteBySignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"executors","type":"address[]"}],"name":"unauthorizeExecutors","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200356838038062003568833981016040819052620000349162000264565b600062000040620000d0565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200009584620000d4565b620000a08362000121565b600680546001600160a01b0319166001600160a01b038416179055620000c68162000165565b50505050620003bc565b3390565b600180546001600160a01b0319166001600160a01b0383169081179091556040513391907f9e8e9f668db69a2cefb172dabe284d0d3aea2b7ee64212a205bd033bd03a3d5590600090a350565b600281905560405133907fc46fc23e244f0720a98ddbac6efb5bb40d212cf15e6478fc4b3017648715289d906200015a9084906200038f565b60405180910390a250565b6200016f620000d0565b6000546001600160a01b03908116911614620001a85760405162461bcd60e51b81526004016200019f906200035a565b60405180910390fd5b60005b8151811015620001e357620001da828281518110620001c657fe5b6020026020010151620001e760201b60201c565b600101620001ab565b5050565b6001600160a01b03811660009081526005602052604090819020805460ff19166001179055517f52762435f58790076157ea2a4914a5a4d0aa0eb421588891377692f7fd3bc082906200023c90839062000346565b60405180910390a150565b80516001600160a01b03811681146200025f57600080fd5b919050565b600080600080608085870312156200027a578384fd5b620002858562000247565b935060208086015193506200029d6040870162000247565b60608701519093506001600160401b0380821115620002ba578384fd5b818801915088601f830112620002ce578384fd5b815181811115620002db57fe5b8381029150620002ed84830162000398565b8181528481019084860184860187018d101562000308578788fd5b8795505b838610156200033557620003208162000247565b8352600195909501949186019186016200030c565b50989b979a50959850505050505050565b6001600160a01b0391909116815260200190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b90815260200190565b6040518181016001600160401b0381118282101715620003b457fe5b604052919050565b61319c80620003cc6000396000f3fe6080604052600436106101665760003560e01c8063760fbc13116100d1578063a3f4df7e1161008a578063ddf0b00911610064578063ddf0b00914610403578063f2fde38b14610423578063f8741a9c14610443578063fe0d94c11461046357610166565b8063a3f4df7e146103ac578063a75b87d2146103ce578063af1e0bd3146103e357610166565b8063760fbc131461030b5780638da5cb5b146103205780639080936f1461033557806398e527d3146103625780639aad6f6a14610377578063a2b170b01461039757610166565b80634185ff83116101235780634185ff831461023c578063548b514e14610269578063612c56fa1461029657806364c786d9146102b657806370b0f660146102d6578063715018a6146102f657610166565b806306be3e8e1461016b5780631a1caf7f1461019657806320606b70146101b857806334b18c26146101da5780633656de21146101ef57806340e58ee51461021c575b600080fd5b34801561017757600080fd5b50610180610476565b60405161018d919061299e565b60405180910390f35b3480156101a257600080fd5b506101b66101b1366004612542565b610485565b005b3480156101c457600080fd5b506101cd6104f7565b60405161018d9190612a63565b3480156101e657600080fd5b506101cd61051b565b3480156101fb57600080fd5b5061020f61020a36600461270a565b61053f565b60405161018d9190612e64565b34801561022857600080fd5b506101b661023736600461270a565b6108f0565b34801561024857600080fd5b5061025c610257366004612722565b610bc2565b60405161018d9190612fbe565b34801561027557600080fd5b50610289610284366004612526565b610c1b565b60405161018d9190612a58565b3480156102a257600080fd5b506101b66102b1366004612751565b610c39565b3480156102c257600080fd5b506101b66102d1366004612542565b610c44565b3480156102e257600080fd5b506101b66102f136600461270a565b610ca9565b34801561030257600080fd5b506101b6610cea565b34801561031757600080fd5b506101b6610d69565b34801561032c57600080fd5b50610180610da5565b34801561034157600080fd5b5061035561035036600461270a565b610db4565b60405161018d9190612aea565b34801561036e57600080fd5b506101cd610f85565b34801561038357600080fd5b506101b6610392366004612526565b610f8b565b3480156103a357600080fd5b506101cd610fc9565b3480156103b857600080fd5b506103c1610fcf565b60405161018d9190612afe565b3480156103da57600080fd5b50610180610ffd565b3480156103ef57600080fd5b506101b66103fe366004612775565b61100c565b34801561040f57600080fd5b506101b661041e36600461270a565b6111ae565b34801561042f57600080fd5b506101b661043e366004612526565b6114aa565b34801561044f57600080fd5b506101cd61045e366004612624565b611560565b6101b661047136600461270a565b6118e9565b6001546001600160a01b031690565b61048d611ae8565b6000546001600160a01b039081169116146104c35760405162461bcd60e51b81526004016104ba90612d39565b60405180910390fd5b60005b81518110156104f3576104eb8282815181106104de57fe5b6020026020010151611aec565b6001016104c6565b5050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b7f4e031542a9553ed1c4e810c54674ab4b984243e335b246aa3de73663bf4c11ee81565b610547611f6e565b600082815260046020526040902061055d611f6e565b60408051610220810182528354815260018401546001600160a01b039081166020808401919091526002860154909116828401526003850180548451818402810184019095528085529293606085019390928301828280156105e857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116105ca575b505050505081526020018360040180548060200260200160405190810160405280929190818152602001828054801561064057602002820191906000526020600020905b81548152602001906001019080831161062c575b5050505050815260200183600501805480602002602001604051908101604052809291908181526020016000905b828210156107195760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156107055780601f106106da57610100808354040283529160200191610705565b820191906000526020600020905b8154815290600101906020018083116106e857829003601f168201915b50505050508152602001906001019061066e565b50505050815260200183600601805480602002602001604051908101604052809291908181526020016000905b828210156107f15760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156107dd5780601f106107b2576101008083540402835291602001916107dd565b820191906000526020600020905b8154815290600101906020018083116107c057829003601f168201915b505050505081526020019060010190610746565b5050505081526020018360070180548060200260200160405190810160405280929190818152602001828054801561086857602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116108375790505b50505091835250506008840154602082015260098401546040820152600a8401546060820152600b8401546080820152600c84015460a0820152600d84015460ff808216151560c0840152610100808304909116151560e0840152620100009091046001600160a01b031690820152600e90930154610120909301929092525090505b919050565b60006108fb82610db4565b9050600781600781111561090b57fe5b141580156109255750600181600781111561092257fe5b14155b801561093d5750600681600781111561093a57fe5b14155b6109595760405162461bcd60e51b81526004016104ba90612dda565b60008281526004602052604090206006546001600160a01b0316331480610a0c5750600281015460018201546040516331a7bc4160e01b81526001600160a01b03928316926331a7bc41926109bc92309290911690436000190190600401612ac6565b60206040518083038186803b1580156109d457600080fd5b505afa1580156109e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0c919061257d565b610a285760405162461bcd60e51b81526004016104ba90612da5565b600d8101805461ff00191661010017905560005b6003820154811015610b855760028201546003830180546001600160a01b0390921691631dc40b51919084908110610a7057fe5b6000918252602090912001546004850180546001600160a01b039092169185908110610a9857fe5b9060005260206000200154856005018581548110610ab257fe5b90600052602060002001866006018681548110610acb57fe5b9060005260206000200187600a0154886007018881548110610ae957fe5b90600052602060002090602091828204019190069054906101000a900460ff166040518763ffffffff1660e01b8152600401610b2a96959493929190612a1f565b602060405180830381600087803b158015610b4457600080fd5b505af1158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190612599565b50600101610a3c565b507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c83604051610bb59190612a63565b60405180910390a1505050565b610bca612014565b5060008281526004602090815260408083206001600160a01b0385168452600f0182529182902082518084019093525460ff8116151583526001600160f81b03610100909104169082015292915050565b6001600160a01b031660009081526005602052604090205460ff1690565b6104f3338383611b47565b610c4c611ae8565b6000546001600160a01b03908116911614610c795760405162461bcd60e51b81526004016104ba90612d39565b60005b81518110156104f357610ca1828281518110610c9457fe5b6020026020010151611d01565b600101610c7c565b610cb1611ae8565b6000546001600160a01b03908116911614610cde5760405162461bcd60e51b81526004016104ba90612d39565b610ce781611d54565b50565b610cf2611ae8565b6000546001600160a01b03908116911614610d1f5760405162461bcd60e51b81526004016104ba90612d39565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6006546001600160a01b03163314610d935760405162461bcd60e51b81526004016104ba90612d0f565b600680546001600160a01b0319169055565b6000546001600160a01b031690565b6000816003541015610dd85760405162461bcd60e51b81526004016104ba90612e08565b6000828152600460205260409020600d810154610100900460ff1615610e025760019150506108eb565b80600801544311610e175760009150506108eb565b80600901544311610e2c5760029150506108eb565b60028101546040516306fbb3ab60e01b81526001600160a01b03909116906306fbb3ab90610e6090309087906004016129b2565b60206040518083038186803b158015610e7857600080fd5b505afa158015610e8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb0919061257d565b610ebe5760039150506108eb565b600a810154610ed15760049150506108eb565b600d81015460ff1615610ee85760079150506108eb565b600281015460405163f670a5f960e01b81526001600160a01b039091169063f670a5f990610f1c90309087906004016129b2565b60206040518083038186803b158015610f3457600080fd5b505afa158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c919061257d565b15610f7b5760069150506108eb565b60059150506108eb565b60035490565b610f93611ae8565b6000546001600160a01b03908116911614610fc05760405162461bcd60e51b81526004016104ba90612d39565b610ce781611d96565b60025490565b6040518060400160405280601281526020017120b0bb329023b7bb32b93730b731b2903b1960711b81525081565b6006546001600160a01b031690565b60408051808201909152601281527120b0bb329023b7bb32b93730b731b2903b1960711b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f4cc6f35bf1a450a8f51b0719ea5910c789b7b914b5c4f0451867c8a5475a4982611082611de3565b306040516020016110969493929190612a6c565b604051602081830303815290604052805190602001207f4e031542a9553ed1c4e810c54674ab4b984243e335b246aa3de73663bf4c11ee87876040516020016110e193929190612a90565b60405160208183030381529060405280519060200120604051602001611108929190612983565b6040516020818303038152906040528051906020012090506000600182868686604051600081526020016040526040516111459493929190612aa8565b6020604051602081039080840390855afa158015611167573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661119a5760405162461bcd60e51b81526004016104ba90612c7d565b6111a5818888611b47565b50505050505050565b60046111b982610db4565b60078111156111c457fe5b146111e15760405162461bcd60e51b81526004016104ba90612bec565b60008181526004602081815260408084206002810154825163675e4d4160e11b81529251919594611278946001600160a01b039092169363cebc9a829381830193929091829003018186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112719190612599565b4290611de7565b905060005b6003830154811015611461576002830154600384018054611459926001600160a01b03169190849081106112ad57fe5b6000918252602090912001546004860180546001600160a01b0390921691859081106112d557fe5b90600052602060002001548660050185815481106112ef57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561137d5780601f106113525761010080835404028352916020019161137d565b820191906000526020600020905b81548152906001019060200180831161136057829003601f168201915b505050505087600601868154811061139157fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561141f5780601f106113f45761010080835404028352916020019161141f565b820191906000526020600020905b81548152906001019060200180831161140257829003601f168201915b50505050508789600701888154811061143457fe5b90600052602060002090602091828204019190069054906101000a900460ff16611e13565b60010161127d565b50600a820181905560405133907f11a0b38e70585e4b09b794bd1d9f9b1a51a802eb8ee2101eeee178d0349e73fe9061149d9086908590613095565b60405180910390a2505050565b6114b2611ae8565b6000546001600160a01b039081169116146114df5760405162461bcd60e51b81526004016104ba90612d39565b6001600160a01b0381166115055760405162461bcd60e51b81526004016104ba90612b11565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008651600014156115845760405162461bcd60e51b81526004016104ba90612c4e565b85518751148015611596575084518751145b80156115a3575083518751145b80156115b0575082518751145b6115cc5760405162461bcd60e51b81526004016104ba90612d6e565b6115d588610c1b565b6115f15760405162461bcd60e51b81526004016104ba90612cd8565b604051631a1b205360e31b81526001600160a01b0389169063d0d90298906116259030903390600019430190600401612ac6565b60206040518083038186803b15801561163d57600080fd5b505afa158015611651573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611675919061257d565b6116915760405162461bcd60e51b81526004016104ba90612b57565b61169961202b565b6002546116a7904390611de7565b81600001818152505061172c896001600160a01b031663a438d2086040518163ffffffff1660e01b815260040160206040518083038186803b1580156116ec57600080fd5b505afa158015611700573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117249190612599565b825190611de7565b602082810191909152600380546040808501828152600092835260048552912090518155600181018054336001600160a01b0319918216179091556002820180549091166001600160a01b038e161790558a51909261179192840191908c019061204c565b5087516117a790600483019060208b01906120b1565b5086516117bd90600583019060208a01906120ec565b5085516117d39060068301906020890190612145565b5084516117e9906007830190602088019061219e565b508160000151816008018190555081602001518160090181905550600160009054906101000a90046001600160a01b031681600d0160026101000a8154816001600160a01b0302191690836001600160a01b031602179055508381600e0181905550600360008154809291906001019190505550896001600160a01b0316336001600160a01b03167fd272d67d2c8c66de43c1d2515abb064978a5020c173e15903b6a2ab3bf7440ec84604001518c8c8c8c8c8a600001518b60200151600160009054906101000a90046001600160a01b03168f6040516118d39a99989796959493929190612fe0565b60405180910390a3549998505050505050505050565b60056118f482610db4565b60078111156118ff57fe5b1461191c5760405162461bcd60e51b81526004016104ba90612e35565b6000818152600460205260408120600d8101805460ff19166001179055905b6003820154811015611aa25760028201546004830180546001600160a01b0390921691638902ab6591908490811061196f57fe5b906000526020600020015484600301848154811061198957fe5b6000918252602090912001546004860180546001600160a01b0390921691869081106119b157fe5b90600052602060002001548660050186815481106119cb57fe5b906000526020600020018760060187815481106119e457fe5b9060005260206000200188600a0154896007018981548110611a0257fe5b90600052602060002090602091828204019190069054906101000a900460ff166040518863ffffffff1660e01b8152600401611a4396959493929190612a1f565b6000604051808303818588803b158015611a5c57600080fd5b505af1158015611a70573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611a9991908101906125b1565b5060010161193b565b50336001600160a01b03167f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec2483604051611adc9190612a63565b60405180910390a25050565b3390565b6001600160a01b03811660009081526005602052604090819020805460ff19169055517f5e8105a2af24345971359d2289f43efa80d093f4a7123561b8d63836b98724f490611b3c90839061299e565b60405180910390a150565b6002611b5283610db4565b6007811115611b5d57fe5b14611b7a5760405162461bcd60e51b81526004016104ba90612bc5565b60008281526004602090815260408083206001600160a01b0387168452600f8101909252909120805461010090046001600160f81b031615611bce5760405162461bcd60e51b81526004016104ba90612ca8565b600d820154600883015460405163eaeded5f60e01b81526000926201000090046001600160a01b03169163eaeded5f91611c0c918a916004016129b2565b60206040518083038186803b158015611c2457600080fd5b505afa158015611c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5c9190612599565b90508315611c7d57600b830154611c739082611de7565b600b840155611c92565b600c830154611c8c9082611de7565b600c8401555b815460ff60ff1990911685151517166101006001600160f81b038316021782556040516001600160a01b038716907f0c611e7b6ae0de26f4772260e1bbdb5f58cbb7c275fe2de14671968d29add8d690611cf19088908890869061307f565b60405180910390a2505050505050565b6001600160a01b03811660009081526005602052604090819020805460ff19166001179055517f52762435f58790076157ea2a4914a5a4d0aa0eb421588891377692f7fd3bc08290611b3c90839061299e565b600281905560405133907fc46fc23e244f0720a98ddbac6efb5bb40d212cf15e6478fc4b3017648715289d90611d8b908490612a63565b60405180910390a250565b600180546001600160a01b0319166001600160a01b0383169081179091556040513391907f9e8e9f668db69a2cefb172dabe284d0d3aea2b7ee64212a205bd033bd03a3d5590600090a350565b4690565b600082820183811015611e0c5760405162461bcd60e51b81526004016104ba90612b8e565b9392505050565b866001600160a01b031663b1fc8796878787878787604051602001611e3d969594939291906129cb565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b8152600401611e6f9190612a63565b60206040518083038186803b158015611e8757600080fd5b505afa158015611e9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebf919061257d565b15611edc5760405162461bcd60e51b81526004016104ba90612c23565b604051638d8fe2e360e01b81526001600160a01b03881690638d8fe2e390611f12908990899089908990899089906004016129cb565b602060405180830381600087803b158015611f2c57600080fd5b505af1158015611f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f649190612599565b5050505050505050565b6040518061022001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016060815260200160608152602001606081526020016060815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160006001600160a01b03168152602001600080191681525090565b604080518082019091526000808252602082015290565b60405180606001604052806000815260200160008152602001600081525090565b8280548282559060005260206000209081019282156120a1579160200282015b828111156120a157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061206c565b506120ad92915061223a565b5090565b8280548282559060005260206000209081019282156120a1579160200282015b828111156120a15782518255916020019190600101906120d1565b828054828255906000526020600020908101928215612139579160200282015b82811115612139578251805161212991849160209091019061224f565b509160200191906001019061210c565b506120ad9291506122ca565b828054828255906000526020600020908101928215612192579160200282015b82811115612192578251805161218291849160209091019061224f565b5091602001919060010190612165565b506120ad9291506122e7565b82805482825590600052602060002090601f016020900481019282156120a15791602002820160005b8382111561220457835183826101000a81548160ff02191690831515021790555092602001926001016020816000010492830192600103026121c7565b80156122315782816101000a81549060ff0219169055600101602081600001049283019260010302612204565b50506120ad9291505b5b808211156120ad576000815560010161223b565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261228557600085556120a1565b82601f1061229e57805160ff19168380011785556120a1565b828001600101855582156120a157918201828111156120a15782518255916020019190600101906120d1565b808211156120ad5760006122de8282612304565b506001016122ca565b808211156120ad5760006122fb8282612304565b506001016122e7565b50805460018160011615610100020316600290046000825580601f1061232a5750610ce7565b601f016020900490600052602060002090810190610ce7919061223a565b600082601f830112612358578081fd5b813561236b612366826130c7565b6130a3565b81815291506020808301908481018184028601820187101561238c57600080fd5b60005b848110156123b45781356123a281613143565b8452928201929082019060010161238f565b505050505092915050565b600082601f8301126123cf578081fd5b81356123dd612366826130c7565b8181529150602080830190848101818402860182018710156123fe57600080fd5b60005b848110156123b457813561241481613158565b84529282019290820190600101612401565b600082601f830112612436578081fd5b8135612444612366826130c7565b818152915060208083019084810160005b848110156123b4578135870188603f82011261247057600080fd5b83810135612480612366826130e5565b81815260408b8184860101111561249657600080fd5b82818501888401375060009181018601919091528552509282019290820190600101612455565b600082601f8301126124cd578081fd5b81356124db612366826130c7565b8181529150602080830190848101818402860182018710156124fc57600080fd5b60005b848110156123b4578135845292820192908201906001016124ff565b80356108eb81613143565b600060208284031215612537578081fd5b8135611e0c81613143565b600060208284031215612553578081fd5b813567ffffffffffffffff811115612569578182fd5b61257584828501612348565b949350505050565b60006020828403121561258e578081fd5b8151611e0c81613158565b6000602082840312156125aa578081fd5b5051919050565b6000602082840312156125c2578081fd5b815167ffffffffffffffff8111156125d8578182fd5b8201601f810184136125e8578182fd5b80516125f6612366826130e5565b81815285602083850101111561260a578384fd5b61261b826020830160208601613113565b95945050505050565b600080600080600080600060e0888a03121561263e578283fd5b6126478861251b565b9650602088013567ffffffffffffffff80821115612663578485fd5b61266f8b838c01612348565b975060408a0135915080821115612684578485fd5b6126908b838c016124bd565b965060608a01359150808211156126a5578485fd5b6126b18b838c01612426565b955060808a01359150808211156126c6578485fd5b6126d28b838c01612426565b945060a08a01359150808211156126e7578384fd5b506126f48a828b016123bf565b92505060c0880135905092959891949750929550565b60006020828403121561271b578081fd5b5035919050565b60008060408385031215612734578182fd5b82359150602083013561274681613143565b809150509250929050565b60008060408385031215612763578182fd5b82359150602083013561274681613158565b600080600080600060a0868803121561278c578283fd5b85359450602086013561279e81613158565b9350604086013560ff811681146127b3578384fd5b94979396509394606081013594506080013592915050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156128105781516001600160a01b0316875295820195908201906001016127eb565b509495945050505050565b6000815180845260208085019450808401835b8381101561281057815115158752958201959082019060010161282e565b6000815180845260208085018081965082840281019150828601855b858110156128925782840389526128808483516128d4565b98850198935090840190600101612868565b5091979650505050505050565b6000815180845260208085019450808401835b83811015612810578151875295820195908201906001016128b2565b15159052565b600081518084526128ec816020860160208601613113565b601f01601f19169290920160200192915050565b6000815460018082166000811461291e576001811461293c5761297a565b60028304607f16865260ff198316602087015260408601935061297a565b6002830480875261294c86613107565b60005b828110156129705781546020828b010152848201915060208101905061294f565b8801602001955050505b50505092915050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038816825286602083015260c060408301526129f260c08301876128d4565b8281036060840152612a0481876128d4565b6080840195909552505090151560a090910152949350505050565b600060018060a01b038816825286602083015260c06040830152612a4660c0830187612900565b8281036060840152612a048187612900565b901515815260200190565b90815260200190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b92835260208301919091521515604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020810160088310612af857fe5b91905290565b600060208252611e0c60208301846128d4565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f50524f504f534954494f4e5f4352454154494f4e5f494e56414c494400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600d908201526c1593d5125391d7d0d313d4d151609a1b604082015260600190565b60208082526017908201527f494e56414c49445f53544154455f464f525f5155455545000000000000000000604082015260600190565b602080825260119082015270222aa82624a1a0aa22a22fa0a1aa24a7a760791b604082015260600190565b602080825260159082015274494e56414c49445f454d5054595f5441524745545360581b604082015260600190565b602080825260119082015270494e56414c49445f5349474e415455524560781b604082015260600190565b6020808252601690820152751593d51157d053149150511657d4d55093525515115160521b604082015260600190565b60208082526017908201527f4558454355544f525f4e4f545f415554484f52495a4544000000000000000000604082015260600190565b60208082526010908201526f27a7262cafa12cafa3aaa0a92224a0a760811b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f494e434f4e53495354454e545f504152414d535f4c454e475448000000000000604082015260600190565b6020808252818101527f50524f504f534954494f4e5f43414e43454c4c4154494f4e5f494e56414c4944604082015260600190565b60208082526014908201527313d3931657d0915193d49157d1561150d555115160621b604082015260600190565b6020808252601390820152721253959053125117d41493d413d4d05317d251606a1b604082015260600190565b6020808252601590820152744f4e4c595f5155455545445f50524f504f53414c5360581b604082015260600190565b600060208252825160208301526020830151612e8360408401826127cb565b506040830151612e9660608401826127cb565b506060830151610220806080850152612eb36102408501836127d8565b91506080850151601f19808685030160a0870152612ed1848361289f565b935060a08701519150808685030160c0870152612eee848361284c565b935060c08701519150808685030160e0870152612f0b848361284c565b935060e08701519150610100818786030181880152612f2a858461281b565b90880151610120888101919091528801516101408089019190915288015161016080890191909152880151610180808901919091528801516101a08089019190915288015190945091506101c09050612f85818701836128ce565b86015190506101e0612f99868201836128ce565b8601519050610200612fad868201836127cb565b959095015193019290925250919050565b8151151581526020918201516001600160f81b03169181019190915260400190565b60006101408c8352806020840152612ffa8184018d6127d8565b9050828103604084015261300e818c61289f565b90508281036060840152613022818b61284c565b90508281036080840152613036818a61284c565b905082810360a084015261304a818961281b565b60c0840197909752505060e08101939093526001600160a01b0391909116610100830152610120909101529695505050505050565b9283529015156020830152604082015260600190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156130bf57fe5b604052919050565b600067ffffffffffffffff8211156130db57fe5b5060209081020190565b600067ffffffffffffffff8211156130f957fe5b50601f01601f191660200190565b60009081526020902090565b60005b8381101561312e578181015183820152602001613116565b8381111561313d576000848401525b50505050565b6001600160a01b0381168114610ce757600080fd5b8015158114610ce757600080fdfea26469706673582212203255f14330cf43fabb4281e87def734f660a2374d36a74dbd177480523c8dfc664736f6c6343000705003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca76ebd8617a03126b6fb84f9b1c1a0fb71c263300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101665760003560e01c8063760fbc13116100d1578063a3f4df7e1161008a578063ddf0b00911610064578063ddf0b00914610403578063f2fde38b14610423578063f8741a9c14610443578063fe0d94c11461046357610166565b8063a3f4df7e146103ac578063a75b87d2146103ce578063af1e0bd3146103e357610166565b8063760fbc131461030b5780638da5cb5b146103205780639080936f1461033557806398e527d3146103625780639aad6f6a14610377578063a2b170b01461039757610166565b80634185ff83116101235780634185ff831461023c578063548b514e14610269578063612c56fa1461029657806364c786d9146102b657806370b0f660146102d6578063715018a6146102f657610166565b806306be3e8e1461016b5780631a1caf7f1461019657806320606b70146101b857806334b18c26146101da5780633656de21146101ef57806340e58ee51461021c575b600080fd5b34801561017757600080fd5b50610180610476565b60405161018d919061299e565b60405180910390f35b3480156101a257600080fd5b506101b66101b1366004612542565b610485565b005b3480156101c457600080fd5b506101cd6104f7565b60405161018d9190612a63565b3480156101e657600080fd5b506101cd61051b565b3480156101fb57600080fd5b5061020f61020a36600461270a565b61053f565b60405161018d9190612e64565b34801561022857600080fd5b506101b661023736600461270a565b6108f0565b34801561024857600080fd5b5061025c610257366004612722565b610bc2565b60405161018d9190612fbe565b34801561027557600080fd5b50610289610284366004612526565b610c1b565b60405161018d9190612a58565b3480156102a257600080fd5b506101b66102b1366004612751565b610c39565b3480156102c257600080fd5b506101b66102d1366004612542565b610c44565b3480156102e257600080fd5b506101b66102f136600461270a565b610ca9565b34801561030257600080fd5b506101b6610cea565b34801561031757600080fd5b506101b6610d69565b34801561032c57600080fd5b50610180610da5565b34801561034157600080fd5b5061035561035036600461270a565b610db4565b60405161018d9190612aea565b34801561036e57600080fd5b506101cd610f85565b34801561038357600080fd5b506101b6610392366004612526565b610f8b565b3480156103a357600080fd5b506101cd610fc9565b3480156103b857600080fd5b506103c1610fcf565b60405161018d9190612afe565b3480156103da57600080fd5b50610180610ffd565b3480156103ef57600080fd5b506101b66103fe366004612775565b61100c565b34801561040f57600080fd5b506101b661041e36600461270a565b6111ae565b34801561042f57600080fd5b506101b661043e366004612526565b6114aa565b34801561044f57600080fd5b506101cd61045e366004612624565b611560565b6101b661047136600461270a565b6118e9565b6001546001600160a01b031690565b61048d611ae8565b6000546001600160a01b039081169116146104c35760405162461bcd60e51b81526004016104ba90612d39565b60405180910390fd5b60005b81518110156104f3576104eb8282815181106104de57fe5b6020026020010151611aec565b6001016104c6565b5050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b7f4e031542a9553ed1c4e810c54674ab4b984243e335b246aa3de73663bf4c11ee81565b610547611f6e565b600082815260046020526040902061055d611f6e565b60408051610220810182528354815260018401546001600160a01b039081166020808401919091526002860154909116828401526003850180548451818402810184019095528085529293606085019390928301828280156105e857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116105ca575b505050505081526020018360040180548060200260200160405190810160405280929190818152602001828054801561064057602002820191906000526020600020905b81548152602001906001019080831161062c575b5050505050815260200183600501805480602002602001604051908101604052809291908181526020016000905b828210156107195760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156107055780601f106106da57610100808354040283529160200191610705565b820191906000526020600020905b8154815290600101906020018083116106e857829003601f168201915b50505050508152602001906001019061066e565b50505050815260200183600601805480602002602001604051908101604052809291908181526020016000905b828210156107f15760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156107dd5780601f106107b2576101008083540402835291602001916107dd565b820191906000526020600020905b8154815290600101906020018083116107c057829003601f168201915b505050505081526020019060010190610746565b5050505081526020018360070180548060200260200160405190810160405280929190818152602001828054801561086857602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116108375790505b50505091835250506008840154602082015260098401546040820152600a8401546060820152600b8401546080820152600c84015460a0820152600d84015460ff808216151560c0840152610100808304909116151560e0840152620100009091046001600160a01b031690820152600e90930154610120909301929092525090505b919050565b60006108fb82610db4565b9050600781600781111561090b57fe5b141580156109255750600181600781111561092257fe5b14155b801561093d5750600681600781111561093a57fe5b14155b6109595760405162461bcd60e51b81526004016104ba90612dda565b60008281526004602052604090206006546001600160a01b0316331480610a0c5750600281015460018201546040516331a7bc4160e01b81526001600160a01b03928316926331a7bc41926109bc92309290911690436000190190600401612ac6565b60206040518083038186803b1580156109d457600080fd5b505afa1580156109e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0c919061257d565b610a285760405162461bcd60e51b81526004016104ba90612da5565b600d8101805461ff00191661010017905560005b6003820154811015610b855760028201546003830180546001600160a01b0390921691631dc40b51919084908110610a7057fe5b6000918252602090912001546004850180546001600160a01b039092169185908110610a9857fe5b9060005260206000200154856005018581548110610ab257fe5b90600052602060002001866006018681548110610acb57fe5b9060005260206000200187600a0154886007018881548110610ae957fe5b90600052602060002090602091828204019190069054906101000a900460ff166040518763ffffffff1660e01b8152600401610b2a96959493929190612a1f565b602060405180830381600087803b158015610b4457600080fd5b505af1158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c9190612599565b50600101610a3c565b507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c83604051610bb59190612a63565b60405180910390a1505050565b610bca612014565b5060008281526004602090815260408083206001600160a01b0385168452600f0182529182902082518084019093525460ff8116151583526001600160f81b03610100909104169082015292915050565b6001600160a01b031660009081526005602052604090205460ff1690565b6104f3338383611b47565b610c4c611ae8565b6000546001600160a01b03908116911614610c795760405162461bcd60e51b81526004016104ba90612d39565b60005b81518110156104f357610ca1828281518110610c9457fe5b6020026020010151611d01565b600101610c7c565b610cb1611ae8565b6000546001600160a01b03908116911614610cde5760405162461bcd60e51b81526004016104ba90612d39565b610ce781611d54565b50565b610cf2611ae8565b6000546001600160a01b03908116911614610d1f5760405162461bcd60e51b81526004016104ba90612d39565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6006546001600160a01b03163314610d935760405162461bcd60e51b81526004016104ba90612d0f565b600680546001600160a01b0319169055565b6000546001600160a01b031690565b6000816003541015610dd85760405162461bcd60e51b81526004016104ba90612e08565b6000828152600460205260409020600d810154610100900460ff1615610e025760019150506108eb565b80600801544311610e175760009150506108eb565b80600901544311610e2c5760029150506108eb565b60028101546040516306fbb3ab60e01b81526001600160a01b03909116906306fbb3ab90610e6090309087906004016129b2565b60206040518083038186803b158015610e7857600080fd5b505afa158015610e8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb0919061257d565b610ebe5760039150506108eb565b600a810154610ed15760049150506108eb565b600d81015460ff1615610ee85760079150506108eb565b600281015460405163f670a5f960e01b81526001600160a01b039091169063f670a5f990610f1c90309087906004016129b2565b60206040518083038186803b158015610f3457600080fd5b505afa158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c919061257d565b15610f7b5760069150506108eb565b60059150506108eb565b60035490565b610f93611ae8565b6000546001600160a01b03908116911614610fc05760405162461bcd60e51b81526004016104ba90612d39565b610ce781611d96565b60025490565b6040518060400160405280601281526020017120b0bb329023b7bb32b93730b731b2903b1960711b81525081565b6006546001600160a01b031690565b60408051808201909152601281527120b0bb329023b7bb32b93730b731b2903b1960711b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f4cc6f35bf1a450a8f51b0719ea5910c789b7b914b5c4f0451867c8a5475a4982611082611de3565b306040516020016110969493929190612a6c565b604051602081830303815290604052805190602001207f4e031542a9553ed1c4e810c54674ab4b984243e335b246aa3de73663bf4c11ee87876040516020016110e193929190612a90565b60405160208183030381529060405280519060200120604051602001611108929190612983565b6040516020818303038152906040528051906020012090506000600182868686604051600081526020016040526040516111459493929190612aa8565b6020604051602081039080840390855afa158015611167573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661119a5760405162461bcd60e51b81526004016104ba90612c7d565b6111a5818888611b47565b50505050505050565b60046111b982610db4565b60078111156111c457fe5b146111e15760405162461bcd60e51b81526004016104ba90612bec565b60008181526004602081815260408084206002810154825163675e4d4160e11b81529251919594611278946001600160a01b039092169363cebc9a829381830193929091829003018186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112719190612599565b4290611de7565b905060005b6003830154811015611461576002830154600384018054611459926001600160a01b03169190849081106112ad57fe5b6000918252602090912001546004860180546001600160a01b0390921691859081106112d557fe5b90600052602060002001548660050185815481106112ef57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561137d5780601f106113525761010080835404028352916020019161137d565b820191906000526020600020905b81548152906001019060200180831161136057829003601f168201915b505050505087600601868154811061139157fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561141f5780601f106113f45761010080835404028352916020019161141f565b820191906000526020600020905b81548152906001019060200180831161140257829003601f168201915b50505050508789600701888154811061143457fe5b90600052602060002090602091828204019190069054906101000a900460ff16611e13565b60010161127d565b50600a820181905560405133907f11a0b38e70585e4b09b794bd1d9f9b1a51a802eb8ee2101eeee178d0349e73fe9061149d9086908590613095565b60405180910390a2505050565b6114b2611ae8565b6000546001600160a01b039081169116146114df5760405162461bcd60e51b81526004016104ba90612d39565b6001600160a01b0381166115055760405162461bcd60e51b81526004016104ba90612b11565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008651600014156115845760405162461bcd60e51b81526004016104ba90612c4e565b85518751148015611596575084518751145b80156115a3575083518751145b80156115b0575082518751145b6115cc5760405162461bcd60e51b81526004016104ba90612d6e565b6115d588610c1b565b6115f15760405162461bcd60e51b81526004016104ba90612cd8565b604051631a1b205360e31b81526001600160a01b0389169063d0d90298906116259030903390600019430190600401612ac6565b60206040518083038186803b15801561163d57600080fd5b505afa158015611651573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611675919061257d565b6116915760405162461bcd60e51b81526004016104ba90612b57565b61169961202b565b6002546116a7904390611de7565b81600001818152505061172c896001600160a01b031663a438d2086040518163ffffffff1660e01b815260040160206040518083038186803b1580156116ec57600080fd5b505afa158015611700573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117249190612599565b825190611de7565b602082810191909152600380546040808501828152600092835260048552912090518155600181018054336001600160a01b0319918216179091556002820180549091166001600160a01b038e161790558a51909261179192840191908c019061204c565b5087516117a790600483019060208b01906120b1565b5086516117bd90600583019060208a01906120ec565b5085516117d39060068301906020890190612145565b5084516117e9906007830190602088019061219e565b508160000151816008018190555081602001518160090181905550600160009054906101000a90046001600160a01b031681600d0160026101000a8154816001600160a01b0302191690836001600160a01b031602179055508381600e0181905550600360008154809291906001019190505550896001600160a01b0316336001600160a01b03167fd272d67d2c8c66de43c1d2515abb064978a5020c173e15903b6a2ab3bf7440ec84604001518c8c8c8c8c8a600001518b60200151600160009054906101000a90046001600160a01b03168f6040516118d39a99989796959493929190612fe0565b60405180910390a3549998505050505050505050565b60056118f482610db4565b60078111156118ff57fe5b1461191c5760405162461bcd60e51b81526004016104ba90612e35565b6000818152600460205260408120600d8101805460ff19166001179055905b6003820154811015611aa25760028201546004830180546001600160a01b0390921691638902ab6591908490811061196f57fe5b906000526020600020015484600301848154811061198957fe5b6000918252602090912001546004860180546001600160a01b0390921691869081106119b157fe5b90600052602060002001548660050186815481106119cb57fe5b906000526020600020018760060187815481106119e457fe5b9060005260206000200188600a0154896007018981548110611a0257fe5b90600052602060002090602091828204019190069054906101000a900460ff166040518863ffffffff1660e01b8152600401611a4396959493929190612a1f565b6000604051808303818588803b158015611a5c57600080fd5b505af1158015611a70573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611a9991908101906125b1565b5060010161193b565b50336001600160a01b03167f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec2483604051611adc9190612a63565b60405180910390a25050565b3390565b6001600160a01b03811660009081526005602052604090819020805460ff19169055517f5e8105a2af24345971359d2289f43efa80d093f4a7123561b8d63836b98724f490611b3c90839061299e565b60405180910390a150565b6002611b5283610db4565b6007811115611b5d57fe5b14611b7a5760405162461bcd60e51b81526004016104ba90612bc5565b60008281526004602090815260408083206001600160a01b0387168452600f8101909252909120805461010090046001600160f81b031615611bce5760405162461bcd60e51b81526004016104ba90612ca8565b600d820154600883015460405163eaeded5f60e01b81526000926201000090046001600160a01b03169163eaeded5f91611c0c918a916004016129b2565b60206040518083038186803b158015611c2457600080fd5b505afa158015611c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5c9190612599565b90508315611c7d57600b830154611c739082611de7565b600b840155611c92565b600c830154611c8c9082611de7565b600c8401555b815460ff60ff1990911685151517166101006001600160f81b038316021782556040516001600160a01b038716907f0c611e7b6ae0de26f4772260e1bbdb5f58cbb7c275fe2de14671968d29add8d690611cf19088908890869061307f565b60405180910390a2505050505050565b6001600160a01b03811660009081526005602052604090819020805460ff19166001179055517f52762435f58790076157ea2a4914a5a4d0aa0eb421588891377692f7fd3bc08290611b3c90839061299e565b600281905560405133907fc46fc23e244f0720a98ddbac6efb5bb40d212cf15e6478fc4b3017648715289d90611d8b908490612a63565b60405180910390a250565b600180546001600160a01b0319166001600160a01b0383169081179091556040513391907f9e8e9f668db69a2cefb172dabe284d0d3aea2b7ee64212a205bd033bd03a3d5590600090a350565b4690565b600082820183811015611e0c5760405162461bcd60e51b81526004016104ba90612b8e565b9392505050565b866001600160a01b031663b1fc8796878787878787604051602001611e3d969594939291906129cb565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b8152600401611e6f9190612a63565b60206040518083038186803b158015611e8757600080fd5b505afa158015611e9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebf919061257d565b15611edc5760405162461bcd60e51b81526004016104ba90612c23565b604051638d8fe2e360e01b81526001600160a01b03881690638d8fe2e390611f12908990899089908990899089906004016129cb565b602060405180830381600087803b158015611f2c57600080fd5b505af1158015611f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f649190612599565b5050505050505050565b6040518061022001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016060815260200160608152602001606081526020016060815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160006001600160a01b03168152602001600080191681525090565b604080518082019091526000808252602082015290565b60405180606001604052806000815260200160008152602001600081525090565b8280548282559060005260206000209081019282156120a1579160200282015b828111156120a157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061206c565b506120ad92915061223a565b5090565b8280548282559060005260206000209081019282156120a1579160200282015b828111156120a15782518255916020019190600101906120d1565b828054828255906000526020600020908101928215612139579160200282015b82811115612139578251805161212991849160209091019061224f565b509160200191906001019061210c565b506120ad9291506122ca565b828054828255906000526020600020908101928215612192579160200282015b82811115612192578251805161218291849160209091019061224f565b5091602001919060010190612165565b506120ad9291506122e7565b82805482825590600052602060002090601f016020900481019282156120a15791602002820160005b8382111561220457835183826101000a81548160ff02191690831515021790555092602001926001016020816000010492830192600103026121c7565b80156122315782816101000a81549060ff0219169055600101602081600001049283019260010302612204565b50506120ad9291505b5b808211156120ad576000815560010161223b565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261228557600085556120a1565b82601f1061229e57805160ff19168380011785556120a1565b828001600101855582156120a157918201828111156120a15782518255916020019190600101906120d1565b808211156120ad5760006122de8282612304565b506001016122ca565b808211156120ad5760006122fb8282612304565b506001016122e7565b50805460018160011615610100020316600290046000825580601f1061232a5750610ce7565b601f016020900490600052602060002090810190610ce7919061223a565b600082601f830112612358578081fd5b813561236b612366826130c7565b6130a3565b81815291506020808301908481018184028601820187101561238c57600080fd5b60005b848110156123b45781356123a281613143565b8452928201929082019060010161238f565b505050505092915050565b600082601f8301126123cf578081fd5b81356123dd612366826130c7565b8181529150602080830190848101818402860182018710156123fe57600080fd5b60005b848110156123b457813561241481613158565b84529282019290820190600101612401565b600082601f830112612436578081fd5b8135612444612366826130c7565b818152915060208083019084810160005b848110156123b4578135870188603f82011261247057600080fd5b83810135612480612366826130e5565b81815260408b8184860101111561249657600080fd5b82818501888401375060009181018601919091528552509282019290820190600101612455565b600082601f8301126124cd578081fd5b81356124db612366826130c7565b8181529150602080830190848101818402860182018710156124fc57600080fd5b60005b848110156123b4578135845292820192908201906001016124ff565b80356108eb81613143565b600060208284031215612537578081fd5b8135611e0c81613143565b600060208284031215612553578081fd5b813567ffffffffffffffff811115612569578182fd5b61257584828501612348565b949350505050565b60006020828403121561258e578081fd5b8151611e0c81613158565b6000602082840312156125aa578081fd5b5051919050565b6000602082840312156125c2578081fd5b815167ffffffffffffffff8111156125d8578182fd5b8201601f810184136125e8578182fd5b80516125f6612366826130e5565b81815285602083850101111561260a578384fd5b61261b826020830160208601613113565b95945050505050565b600080600080600080600060e0888a03121561263e578283fd5b6126478861251b565b9650602088013567ffffffffffffffff80821115612663578485fd5b61266f8b838c01612348565b975060408a0135915080821115612684578485fd5b6126908b838c016124bd565b965060608a01359150808211156126a5578485fd5b6126b18b838c01612426565b955060808a01359150808211156126c6578485fd5b6126d28b838c01612426565b945060a08a01359150808211156126e7578384fd5b506126f48a828b016123bf565b92505060c0880135905092959891949750929550565b60006020828403121561271b578081fd5b5035919050565b60008060408385031215612734578182fd5b82359150602083013561274681613143565b809150509250929050565b60008060408385031215612763578182fd5b82359150602083013561274681613158565b600080600080600060a0868803121561278c578283fd5b85359450602086013561279e81613158565b9350604086013560ff811681146127b3578384fd5b94979396509394606081013594506080013592915050565b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156128105781516001600160a01b0316875295820195908201906001016127eb565b509495945050505050565b6000815180845260208085019450808401835b8381101561281057815115158752958201959082019060010161282e565b6000815180845260208085018081965082840281019150828601855b858110156128925782840389526128808483516128d4565b98850198935090840190600101612868565b5091979650505050505050565b6000815180845260208085019450808401835b83811015612810578151875295820195908201906001016128b2565b15159052565b600081518084526128ec816020860160208601613113565b601f01601f19169290920160200192915050565b6000815460018082166000811461291e576001811461293c5761297a565b60028304607f16865260ff198316602087015260408601935061297a565b6002830480875261294c86613107565b60005b828110156129705781546020828b010152848201915060208101905061294f565b8801602001955050505b50505092915050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038816825286602083015260c060408301526129f260c08301876128d4565b8281036060840152612a0481876128d4565b6080840195909552505090151560a090910152949350505050565b600060018060a01b038816825286602083015260c06040830152612a4660c0830187612900565b8281036060840152612a048187612900565b901515815260200190565b90815260200190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b92835260208301919091521515604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020810160088310612af857fe5b91905290565b600060208252611e0c60208301846128d4565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f50524f504f534954494f4e5f4352454154494f4e5f494e56414c494400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600d908201526c1593d5125391d7d0d313d4d151609a1b604082015260600190565b60208082526017908201527f494e56414c49445f53544154455f464f525f5155455545000000000000000000604082015260600190565b602080825260119082015270222aa82624a1a0aa22a22fa0a1aa24a7a760791b604082015260600190565b602080825260159082015274494e56414c49445f454d5054595f5441524745545360581b604082015260600190565b602080825260119082015270494e56414c49445f5349474e415455524560781b604082015260600190565b6020808252601690820152751593d51157d053149150511657d4d55093525515115160521b604082015260600190565b60208082526017908201527f4558454355544f525f4e4f545f415554484f52495a4544000000000000000000604082015260600190565b60208082526010908201526f27a7262cafa12cafa3aaa0a92224a0a760811b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f494e434f4e53495354454e545f504152414d535f4c454e475448000000000000604082015260600190565b6020808252818101527f50524f504f534954494f4e5f43414e43454c4c4154494f4e5f494e56414c4944604082015260600190565b60208082526014908201527313d3931657d0915193d49157d1561150d555115160621b604082015260600190565b6020808252601390820152721253959053125117d41493d413d4d05317d251606a1b604082015260600190565b6020808252601590820152744f4e4c595f5155455545445f50524f504f53414c5360581b604082015260600190565b600060208252825160208301526020830151612e8360408401826127cb565b506040830151612e9660608401826127cb565b506060830151610220806080850152612eb36102408501836127d8565b91506080850151601f19808685030160a0870152612ed1848361289f565b935060a08701519150808685030160c0870152612eee848361284c565b935060c08701519150808685030160e0870152612f0b848361284c565b935060e08701519150610100818786030181880152612f2a858461281b565b90880151610120888101919091528801516101408089019190915288015161016080890191909152880151610180808901919091528801516101a08089019190915288015190945091506101c09050612f85818701836128ce565b86015190506101e0612f99868201836128ce565b8601519050610200612fad868201836127cb565b959095015193019290925250919050565b8151151581526020918201516001600160f81b03169181019190915260400190565b60006101408c8352806020840152612ffa8184018d6127d8565b9050828103604084015261300e818c61289f565b90508281036060840152613022818b61284c565b90508281036080840152613036818a61284c565b905082810360a084015261304a818961281b565b60c0840197909752505060e08101939093526001600160a01b0391909116610100830152610120909101529695505050505050565b9283529015156020830152604082015260600190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156130bf57fe5b604052919050565b600067ffffffffffffffff8211156130db57fe5b5060209081020190565b600067ffffffffffffffff8211156130f957fe5b50601f01601f191660200190565b60009081526020902090565b60005b8381101561312e578181015183820152602001613116565b8381111561313d576000848401525b50505050565b6001600160a01b0381168114610ce757600080fd5b8015158114610ce757600080fdfea26469706673582212203255f14330cf43fabb4281e87def734f660a2374d36a74dbd177480523c8dfc664736f6c63430007050033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca76ebd8617a03126b6fb84f9b1c1a0fb71c263300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : governanceStrategy (address): 0x0000000000000000000000000000000000000000
Arg [1] : votingDelay (uint256): 0
Arg [2] : guardian (address): 0xCA76Ebd8617a03126B6FB84F9b1c1A0fB71C2633

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 000000000000000000000000ca76ebd8617a03126b6fb84f9b1c1a0fb71c2633
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

31293:15789:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41150:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40631:194;;;;;;;;;;-1:-1:-1;40631:194:0;;;;;:::i;:::-;;:::i;:::-;;31642:132;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31779:97::-;;;;;;;;;;;;;:::i;42544:953::-;;;;;;;;;;-1:-1:-1;42544:953:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35479:1016::-;;;;;;;;;;-1:-1:-1;35479:1016:0;;;;;:::i;:::-;;:::i;43775:185::-;;;;;;;;;;-1:-1:-1;43775:185:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41754:134::-;;;;;;;;;;-1:-1:-1;41754:134:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38323:136::-;;;;;;;;;;-1:-1:-1;38323:136:0;;;;;:::i;:::-;;:::i;40277:190::-;;;;;;;;;;-1:-1:-1;40277:190:0;;;;;:::i;:::-;;:::i;40005:114::-;;;;;;;;;;-1:-1:-1;40005:114:0;;;;;:::i;:::-;;:::i;3235:138::-;;;;;;;;;;;;;:::i;40911:88::-;;;;;;;;;;;;;:::i;2633:73::-;;;;;;;;;;;;;:::i;44119:945::-;;;;;;;;;;-1:-1:-1;44119:945:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42265:105::-;;;;;;;;;;;;;:::i;39614:142::-;;;;;;;;;;-1:-1:-1;39614:142:0;;;;;:::i;:::-;;:::i;41472:99::-;;;;;;;;;;;;;:::i;31881:50::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42031:93::-;;;;;;;;;;;;;:::i;38813:584::-;;;;;;;;;;-1:-1:-1;38813:584:0;;;;;:::i;:::-;;:::i;36622:722::-;;;;;;;;;;-1:-1:-1;36622:722:0;;;;;:::i;:::-;;:::i;3518:230::-;;;;;;;;;;-1:-1:-1;3518:230:0;;;;;:::i;:::-;;:::i;33175:2064::-;;;;;;;;;;-1:-1:-1;33175:2064:0;;;;;:::i;:::-;;:::i;37472:648::-;;;;;;:::i;:::-;;:::i;41150:113::-;41238:19;;-1:-1:-1;;;;;41238:19:0;41150:113;:::o;40631:194::-;2837:12;:10;:12::i;:::-;2827:6;;-1:-1:-1;;;;;2827:6:0;;;:22;;;2819:67;;;;-1:-1:-1;;;2819:67:0;;;;;;;:::i;:::-;;;;;;;;;40727:9:::1;40722:98;40746:9;:16;40742:1;:20;40722:98;;;40778:34;40799:9;40809:1;40799:12;;;;;;;;;;;;;;40778:20;:34::i;:::-;40764:3;;40722:98;;;;40631:194:::0;:::o;31642:132::-;31684:90;31642:132;:::o;31779:97::-;31827:49;31779:97;:::o;42544:953::-;42641:27;;:::i;:::-;42680:25;42708:22;;;:10;:22;;;;;42737:48;;:::i;:::-;42788:667;;;;;;;;42822:11;;42788:667;;42851:16;;;;-1:-1:-1;;;;;42851:16:0;;;42788:667;;;;;;;;42886:17;;;;;;;42788:667;;;;42921:16;;;42788:667;;;;;;;;;;;;;;;;;;;;;;;;;;;42921:16;42788:667;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42788:667:0;;;;;;;;;;;;;;;;;;;;;;;;;42954:8;:15;;42788:667;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42990:8;:19;;42788:667;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42788:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43029:8;:18;;42788:667;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42788:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43075:8;:26;;42788:667;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42788:667:0;;;-1:-1:-1;;43122:19:0;;;;42788:667;;;;43160:17;;;;42788:667;;;;43201:22;;;;42788:667;;;;43242:17;;;;42788:667;;;;43282:21;;;;42788:667;;;;43322:17;;;;;;;;42788:667;;;;;;43322:17;43358;;;;;;42788:667;;;;;;43394:17;;;;-1:-1:-1;;;;;43394:17:0;42788:667;;;;43430:17;;;;;42788:667;;;;;;;;-1:-1:-1;42788:667:0;-1:-1:-1;42544:953:0;;;;:::o;35479:1016::-;35540:19;35562:28;35579:10;35562:16;:28::i;:::-;35540:50;-1:-1:-1;35622:22:0;35613:5;:31;;;;;;;;;;:75;;;;-1:-1:-1;35666:22:0;35657:5;:31;;;;;;;;;;35613:75;:118;;;;-1:-1:-1;35710:21:0;35701:5;:30;;;;;;;;;;35613:118;35597:172;;;;-1:-1:-1;;;35597:172:0;;;;;;;:::i;:::-;35778:25;35806:22;;;:10;:22;;;;;35865:9;;-1:-1:-1;;;;;35865:9:0;35851:10;:23;;:197;;-1:-1:-1;35914:17:0;;;;;35992:16;;;35887:161;;-1:-1:-1;;;35887:161:0;;-1:-1:-1;;;;;35914:17:0;;;;35887:75;;:161;;35975:4;;35992:16;;;;36021:12;-1:-1:-1;;36021:16:0;;35887:161;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35835:263;;;;-1:-1:-1;;;35835:263:0;;;;;;;:::i;:::-;36105:17;;;:24;;-1:-1:-1;;36105:24:0;;;;;;36136:312;36160:16;;;:23;36156:27;;36136:312;;;36199:17;;;;36245:16;;;:19;;-1:-1:-1;;;;;36199:17:0;;;;:35;;36245:16;36262:1;;36245:19;;;;;;;;;;;;;;;;36275:15;;;:18;;-1:-1:-1;;;;;36245:19:0;;;;36291:1;;36275:18;;;;;;;;;;;;;;36304:8;:19;;36324:1;36304:22;;;;;;;;;;;;;;;36337:8;:18;;36356:1;36337:21;;;;;;;;;;;;;;;36369:8;:22;;;36402:8;:26;;36429:1;36402:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36199:241;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36185:3:0;;36136:312;;;;36461:28;36478:10;36461:28;;;;;;:::i;:::-;;;;;;;;35479:1016;;;:::o;43775:185::-;43889:11;;:::i;:::-;-1:-1:-1;43919:22:0;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;43919:35:0;;;;:28;;:35;;;;;;43912:42;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43912:42:0;;;;;;;;;43775:185;;;;:::o;41754:134::-;-1:-1:-1;;;;;41852:30:0;41832:4;41852:30;;;:20;:30;;;;;;;;;41754:134::o;38323:136::-;38409:44;38421:10;38433;38445:7;38409:11;:44::i;40277:190::-;2837:12;:10;:12::i;:::-;2827:6;;-1:-1:-1;;;;;2827:6:0;;;:22;;;2819:67;;;;-1:-1:-1;;;2819:67:0;;;;;;;:::i;:::-;40371:9:::1;40366:96;40390:9;:16;40386:1;:20;40366:96;;;40422:32;40441:9;40451:1;40441:12;;;;;;;;;;;;;;40422:18;:32::i;:::-;40408:3;;40366:96;;40005:114:::0;2837:12;:10;:12::i;:::-;2827:6;;-1:-1:-1;;;;;2827:6:0;;;:22;;;2819:67;;;;-1:-1:-1;;;2819:67:0;;;;;;;:::i;:::-;40085:28:::1;40101:11;40085:15;:28::i;:::-;40005:114:::0;:::o;3235:138::-;2837:12;:10;:12::i;:::-;2827:6;;-1:-1:-1;;;;;2827:6:0;;;:22;;;2819:67;;;;-1:-1:-1;;;2819:67:0;;;;;;;:::i;:::-;3338:1:::1;3322:6:::0;;3301:40:::1;::::0;-1:-1:-1;;;;;3322:6:0;;::::1;::::0;3301:40:::1;::::0;3338:1;;3301:40:::1;3365:1;3348:19:::0;;-1:-1:-1;;;;;;3348:19:0::1;::::0;;3235:138::o;40911:88::-;31991:9;;-1:-1:-1;;;;;31991:9:0;31977:10;:23;31969:52;;;;-1:-1:-1;;;31969:52:0;;;;;;;:::i;:::-;40971:9:::1;:22:::0;;-1:-1:-1;;;;;;40971:22:0::1;::::0;;40911:88::o;2633:73::-;2671:7;2694:6;-1:-1:-1;;;;;2694:6:0;2633:73;:::o;44119:945::-;44195:13;44244:10;44225:15;;:29;;44217:61;;;;-1:-1:-1;;;44217:61:0;;;;;;;:::i;:::-;44285:25;44313:22;;;:10;:22;;;;;44346:17;;;;;;;;;44342:717;;;44381:22;44374:29;;;;;44342:717;44437:8;:19;;;44421:12;:35;44417:642;;44474:21;44467:28;;;;;44417:642;44529:8;:17;;;44513:12;:33;44509:550;;44564:20;44557:27;;;;;44509:550;44630:17;;;;44603:81;;-1:-1:-1;;;44603:81:0;;-1:-1:-1;;;;;44630:17:0;;;;44603:63;;:81;;44667:4;;44673:10;;44603:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44598:461;;44702:20;44695:27;;;;;44598:461;44740:22;;;;44736:323;;44785:23;44778:30;;;;;44736:323;44826:17;;;;;;44822:237;;;44861:22;44854:29;;;;;44822:237;44901:17;;;;:61;;-1:-1:-1;;;44901:61:0;;-1:-1:-1;;;;;44901:17:0;;;;:43;;:61;;44945:4;;44951:10;;44901:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44897:162;;;44980:21;44973:28;;;;;44897:162;45031:20;45024:27;;;;;42265:105;42349:15;;42265:105;:::o;39614:142::-;2837:12;:10;:12::i;:::-;2827:6;;-1:-1:-1;;;;;2827:6:0;;;:22;;;2819:67;;;;-1:-1:-1;;;2819:67:0;;;;;;;:::i;:::-;39708:42:::1;39731:18;39708:22;:42::i;41472:99::-:0;41553:12;;41472:99;:::o;31881:50::-;;;;;;;;;;;;;;-1:-1:-1;;;31881:50:0;;;;:::o;42031:93::-;42109:9;;-1:-1:-1;;;;;42109:9:0;42031:93;:::o;38813:584::-;39101:4;;;;;;;;;;;;-1:-1:-1;;;39101:4:0;;;;;38964:14;31684:90;39085:22;39109:12;:10;:12::i;:::-;39131:4;39057:80;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39047:91;;;;;;31827:49;39193:10;39205:7;39159:54;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39149:65;;;;;;38999:224;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38981:249;;;;;;38964:266;;39237:14;39254:26;39264:6;39272:1;39275;39278;39254:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39254:26:0;;-1:-1:-1;;39254:26:0;;;-1:-1:-1;;;;;;;39295:20:0;;39287:50;;;;-1:-1:-1;;;39287:50:0;;;;;;;:::i;:::-;39351:40;39363:6;39371:10;39383:7;39351:11;:40::i;:::-;39344:47;;38813:584;;;;;:::o;36622:722::-;36722:23;36690:28;36707:10;36690:16;:28::i;:::-;:55;;;;;;;;;36682:91;;;;-1:-1:-1;;;36682:91:0;;;;;;;:::i;:::-;36780:25;36808:22;;;:10;:22;;;;;;;;36881:17;;;;:28;;-1:-1:-1;;;36881:28:0;;;;36808:22;;36780:25;36861:49;;-1:-1:-1;;;;;36881:17:0;;;;:26;;:28;;;;36808:22;36881:28;;;;;;;:17;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36861:15;;:19;:49::i;:::-;36837:73;;36922:9;36917:310;36941:16;;;:23;36937:27;;36917:310;;;37005:17;;;;37033:16;;;:19;;36980:239;;-1:-1:-1;;;;;37005:17:0;;37033:16;37050:1;;37033:19;;;;;;;;;;;;;;;;37063:15;;;:18;;-1:-1:-1;;;;;37033:19:0;;;;37079:1;;37063:18;;;;;;;;;;;;;;37092:8;:19;;37112:1;37092:22;;;;;;;;;;;;;;;;;;36980:239;;;;;;;-1:-1:-1;;36980:239:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37092:22;36980:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37125:8;:18;;37144:1;37125:21;;;;;;;;;;;;;;;;;;36980:239;;;;;;;-1:-1:-1;;36980:239:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37125:21;36980:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37157:13;37181:8;:26;;37208:1;37181:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36980:14;:239::i;:::-;36966:3;;36917:310;;;-1:-1:-1;37233:22:0;;;:38;;;37285:53;;37327:10;;37285:53;;;;37300:10;;37258:13;;37285:53;:::i;:::-;;;;;;;;36622:722;;;:::o;3518:230::-;2837:12;:10;:12::i;:::-;2827:6;;-1:-1:-1;;;;;2827:6:0;;;:22;;;2819:67;;;;-1:-1:-1;;;2819:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3603:22:0;::::1;3595:73;;;;-1:-1:-1::0;;;3595:73:0::1;;;;;;;:::i;:::-;3701:6;::::0;;3680:38:::1;::::0;-1:-1:-1;;;;;3680:38:0;;::::1;::::0;3701:6;::::1;::::0;3680:38:::1;::::0;::::1;3725:6;:17:::0;;-1:-1:-1;;;;;;3725:17:0::1;-1:-1:-1::0;;;;;3725:17:0;;;::::1;::::0;;;::::1;::::0;;3518:230::o;33175:2064::-;33446:7;33470;:14;33488:1;33470:19;;33462:53;;;;-1:-1:-1;;;33462:53:0;;;;;;;:::i;:::-;33556:6;:13;33538:7;:14;:31;:79;;;;;33600:10;:17;33582:7;:14;:35;33538:79;:126;;;;;33648:9;:16;33630:7;:14;:34;33538:126;:181;;;;;33695:17;:24;33677:7;:14;:42;33538:181;33522:241;;;;-1:-1:-1;;;33522:241:0;;;;;;;:::i;:::-;33780:39;33809:8;33780:20;:39::i;:::-;33772:75;;;;-1:-1:-1;;;33772:75:0;;;;;;;:::i;:::-;33872:135;;-1:-1:-1;;;33872:135:0;;-1:-1:-1;;;;;33872:63:0;;;;;:135;;33946:4;;33961:10;;-1:-1:-1;;33982:12:0;:16;;33872:135;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33856:197;;;;-1:-1:-1;;;33856:197:0;;;;;;;:::i;:::-;34062:22;;:::i;:::-;34128:12;;34111:30;;:12;;:16;:30::i;:::-;34093:4;:15;;:48;;;;;34164:76;34211:8;-1:-1:-1;;;;;34184:53:0;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34164:15;;;:19;:76::i;:::-;34148:13;;;;:92;;;;34279:15;;;34249:27;;;;:45;;;-1:-1:-1;34334:39:0;;;:10;:39;;;;34397:27;;34380:44;;34431:19;;;:32;;34453:10;-1:-1:-1;;;;;;34431:32:0;;;;;;;34470:20;;;:31;;;;;-1:-1:-1;;;;;34470:31:0;;;;;34508:29;;34334:39;;34508:29;;:19;;;:29;;;;;:::i;:::-;-1:-1:-1;34544:27:0;;;;:18;;;;:27;;;;;:::i;:::-;-1:-1:-1;34578:35:0;;;;:22;;;;:35;;;;;:::i;:::-;-1:-1:-1;34620:33:0;;;;:21;;;;:33;;;;;:::i;:::-;-1:-1:-1;34660:49:0;;;;:29;;;;:49;;;;;:::i;:::-;;34741:4;:15;;;34716:11;:22;;:40;;;;34786:4;:13;;;34763:11;:20;;:36;;;;34829:19;;;;;;;;;-1:-1:-1;;;;;34829:19:0;34806:11;:20;;;:42;;;;;-1:-1:-1;;;;;34806:42:0;;;;;-1:-1:-1;;;;;34806:42:0;;;;;;34878:8;34855:11;:20;;:31;;;;34893:15;;:17;;;;;;;;;;;;;35003:8;-1:-1:-1;;;;;34924:279:0;34984:10;-1:-1:-1;;;;;34924:279:0;;34948:4;:27;;;35020:7;35036:6;35051:10;35070:9;35088:17;35114:4;:15;;;35138:4;:13;;;35160:19;;;;;;;;;-1:-1:-1;;;;;35160:19:0;35188:8;34924:279;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;35219:14;;33175:2064;-1:-1:-1;;;;;;;;;33175:2064:0:o;37472:648::-;37582:20;37550:28;37567:10;37550:16;:28::i;:::-;:52;;;;;;;;;37542:86;;;;-1:-1:-1;;;37542:86:0;;;;;;;:::i;:::-;37635:25;37663:22;;;:10;:22;;;;;37692:17;;;:24;;-1:-1:-1;;37692:24:0;37712:4;37692:24;;;37663:22;37723:340;37747:16;;;:23;37743:27;;37723:340;;;37786:17;;;;37830:15;;;:18;;-1:-1:-1;;;;;37786:17:0;;;;:36;;37830:15;37846:1;;37830:18;;;;;;;;;;;;;;37860:8;:16;;37877:1;37860:19;;;;;;;;;;;;;;;;;;37890:15;;;:18;;-1:-1:-1;;;;;37860:19:0;;;;37906:1;;37890:18;;;;;;;;;;;;;;37919:8;:19;;37939:1;37919:22;;;;;;;;;;;;;;;37952:8;:18;;37971:1;37952:21;;;;;;;;;;;;;;;37984:8;:22;;;38017:8;:26;;38044:1;38017:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37786:269;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37786:269:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;37772:3:0;;37723:340;;;;38103:10;-1:-1:-1;;;;;38074:40:0;;38091:10;38074:40;;;;;;:::i;:::-;;;;;;;;37472:648;;:::o;1333:100::-;1417:10;1333:100;:::o;46929:150::-;-1:-1:-1;;;;;46993:30:0;;47026:5;46993:30;;;:20;:30;;;;;;;:38;;-1:-1:-1;;46993:38:0;;;47043:30;;;;;47014:8;;47043:30;:::i;:::-;;;;;;;;46929:150;:::o;45605:811::-;45751:20;45719:28;45736:10;45719:16;:28::i;:::-;:52;;;;;;;;;45711:78;;;;-1:-1:-1;;;45711:78:0;;;;;;;:::i;:::-;45796:25;45824:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;45873:21:0;;;;:14;;;:21;;;;;;45911:16;;;;;-1:-1:-1;;;;;45911:16:0;:21;45903:56;;;;-1:-1:-1;;;45903:56:0;;;;;;;:::i;:::-;46006:17;;;;46064:19;;;;45990:100;;-1:-1:-1;;;45990:100:0;;45968:19;;46006:17;;;-1:-1:-1;;;;;46006:17:0;;45990:51;;:100;;46050:5;;45990:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45968:122;;46103:7;46099:169;;;46141:17;;;;:34;;46163:11;46141:21;:34::i;:::-;46121:17;;;:54;46099:169;;;46222:21;;;;:38;;46248:11;46222:25;:38::i;:::-;46198:21;;;:62;46099:169;46276:22;;;-1:-1:-1;;46276:22:0;;;;;;;46305:39;46276:22;-1:-1:-1;;;;;46305:39:0;;;;;;46358:52;;-1:-1:-1;;;;;46358:52:0;;;;;;;46370:10;;46276:22;;46305:39;;46358:52;:::i;:::-;;;;;;;;45605:811;;;;;;:::o;46778:145::-;-1:-1:-1;;;;;46840:30:0;;;;;;:20;:30;;;;;;;:37;;-1:-1:-1;;46840:37:0;46873:4;46840:37;;;46889:28;;;;;46861:8;;46889:28;:::i;46621:151::-;46683:12;:26;;;46723:43;;46755:10;;46723:43;;;;46698:11;;46723:43;:::i;:::-;;;;;;;;46621:151;:::o;46422:193::-;46498:19;:40;;-1:-1:-1;;;;;;46498:40:0;-1:-1:-1;;;;;46498:40:0;;;;;;;;46552:57;;46598:10;;46498:40;46552:57;;-1:-1:-1;;46552:57:0;46422:193;:::o;85:133::-;182:9;85:133;:::o;4567:167::-;4625:7;4653:5;;;4673:6;;;;4665:46;;;;-1:-1:-1;;;4665:46:0;;;;;;;:::i;:::-;4727:1;4567:167;-1:-1:-1;;;4567:167:0:o;45070:529::-;45324:8;-1:-1:-1;;;;;45324:23:0;;45379:6;45387:5;45394:9;45405:8;45415:13;45430:16;45368:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45358:90;;;;;;45324:133;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45323:134;45307:185;;;;-1:-1:-1;;;45307:185:0;;;;;;;:::i;:::-;45499:94;;-1:-1:-1;;;45499:94:0;;-1:-1:-1;;;;;45499:25:0;;;;;:94;;45525:6;;45533:5;;45540:9;;45551:8;;45561:13;;45576:16;;45499:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45070:529;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:769:1:-;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;193:6;180:20;218:69;233:53;279:6;233:53;:::i;:::-;218:69;:::i;:::-;321:21;;;209:78;-1:-1:-1;361:4:1;381:14;;;;415:15;;;461;;;449:28;;445:37;;442:46;-1:-1:-1;439:2:1;;;501:1;498;491:12;439:2;523:1;533:244;547:6;544:1;541:13;533:244;;;622:3;609:17;639:33;666:5;639:33;:::i;:::-;685:18;;723:12;;;;755;;;;569:1;562:9;533:244;;;537:3;;;;;84:699;;;;:::o;788:763::-;;898:3;891:4;883:6;879:17;875:27;865:2;;920:5;913;906:20;865:2;964:6;951:20;989:69;1004:53;1050:6;1004:53;:::i;989:69::-;1092:21;;;980:78;-1:-1:-1;1132:4:1;1152:14;;;;1186:15;;;1232;;;1220:28;;1216:37;;1213:46;-1:-1:-1;1210:2:1;;;1272:1;1269;1262:12;1210:2;1294:1;1304:241;1318:6;1315:1;1312:13;1304:241;;;1393:3;1380:17;1410:30;1434:5;1410:30;:::i;:::-;1453:18;;1491:12;;;;1523;;;;1340:1;1333:9;1304:241;;1556:1109;;1667:3;1660:4;1652:6;1648:17;1644:27;1634:2;;1689:5;1682;1675:20;1634:2;1733:6;1720:20;1758:69;1773:53;1819:6;1773:53;:::i;1758:69::-;1861:21;;;1749:78;-1:-1:-1;1901:4:1;1921:14;;;;1955:15;;;1988:1;1998:661;2012:6;2009:1;2006:13;1998:661;;;2096:3;2083:17;2075:6;2071:30;2141:3;2136:2;2132;2128:11;2124:21;2114:2;;2159:1;2156;2149:12;2114:2;2213;2209;2205:11;2192:25;2245:55;2260:39;2290:8;2260:39;:::i;2245:55::-;2329:8;2320:7;2313:25;2361:2;2410:3;2405:2;2394:8;2390:2;2386:17;2382:26;2379:35;2376:2;;;2427:1;2424;2417:12;2376:2;2488:8;2483:2;2479;2475:11;2470:2;2461:7;2457:16;2444:53;-1:-1:-1;2550:1:1;2521:22;;;2517:31;;2510:42;;;;2565:20;;-1:-1:-1;2605:12:1;;;;2637;;;;2034:1;2027:9;1998:661;;2670:692;;2783:3;2776:4;2768:6;2764:17;2760:27;2750:2;;2805:5;2798;2791:20;2750:2;2849:6;2836:20;2874:69;2889:53;2935:6;2889:53;:::i;2874:69::-;2977:21;;;2865:78;-1:-1:-1;3017:4:1;3037:14;;;;3071:15;;;3117;;;3105:28;;3101:37;;3098:46;-1:-1:-1;3095:2:1;;;3157:1;3154;3147:12;3095:2;3179:1;3189:167;3203:6;3200:1;3197:13;3189:167;;;3264:17;;3252:30;;3302:12;;;;3334;;;;3225:1;3218:9;3189:167;;3367:162;3461:20;;3490:33;3461:20;3490:33;:::i;3534:259::-;;3646:2;3634:9;3625:7;3621:23;3617:32;3614:2;;;3667:6;3659;3652:22;3614:2;3711:9;3698:23;3730:33;3757:5;3730:33;:::i;3798:374::-;;3935:2;3923:9;3914:7;3910:23;3906:32;3903:2;;;3956:6;3948;3941:22;3903:2;4001:9;3988:23;4034:18;4026:6;4023:30;4020:2;;;4071:6;4063;4056:22;4020:2;4099:67;4158:7;4149:6;4138:9;4134:22;4099:67;:::i;:::-;4089:77;3893:279;-1:-1:-1;;;;3893:279:1:o;4177:257::-;;4297:2;4285:9;4276:7;4272:23;4268:32;4265:2;;;4318:6;4310;4303:22;4265:2;4355:9;4349:16;4374:30;4398:5;4374:30;:::i;4439:194::-;;4562:2;4550:9;4541:7;4537:23;4533:32;4530:2;;;4583:6;4575;4568:22;4530:2;-1:-1:-1;4611:16:1;;4520:113;-1:-1:-1;4520:113:1:o;4638:695::-;;4770:2;4758:9;4749:7;4745:23;4741:32;4738:2;;;4791:6;4783;4776:22;4738:2;4829:9;4823:16;4862:18;4854:6;4851:30;4848:2;;;4899:6;4891;4884:22;4848:2;4927:22;;4980:4;4972:13;;4968:27;-1:-1:-1;4958:2:1;;5014:6;5006;4999:22;4958:2;5052;5046:9;5077:53;5092:37;5122:6;5092:37;:::i;5077:53::-;5153:6;5146:5;5139:21;5201:7;5196:2;5187:6;5183:2;5179:15;5175:24;5172:37;5169:2;;;5227:6;5219;5212:22;5169:2;5245:58;5296:6;5291:2;5284:5;5280:14;5275:2;5271;5267:11;5245:58;:::i;:::-;5322:5;4728:605;-1:-1:-1;;;;;4728:605:1:o;5338:1573::-;;;;;;;;5722:3;5710:9;5701:7;5697:23;5693:33;5690:2;;;5744:6;5736;5729:22;5690:2;5772:55;5817:9;5772:55;:::i;:::-;5762:65;;5878:2;5867:9;5863:18;5850:32;5901:18;5942:2;5934:6;5931:14;5928:2;;;5963:6;5955;5948:22;5928:2;5991:67;6050:7;6041:6;6030:9;6026:22;5991:67;:::i;:::-;5981:77;;6111:2;6100:9;6096:18;6083:32;6067:48;;6140:2;6130:8;6127:16;6124:2;;;6161:6;6153;6146:22;6124:2;6189:69;6250:7;6239:8;6228:9;6224:24;6189:69;:::i;:::-;6179:79;;6311:2;6300:9;6296:18;6283:32;6267:48;;6340:2;6330:8;6327:16;6324:2;;;6361:6;6353;6346:22;6324:2;6389:67;6448:7;6437:8;6426:9;6422:24;6389:67;:::i;:::-;6379:77;;6509:3;6498:9;6494:19;6481:33;6465:49;;6539:2;6529:8;6526:16;6523:2;;;6560:6;6552;6545:22;6523:2;6588:67;6647:7;6636:8;6625:9;6621:24;6588:67;:::i;:::-;6578:77;;6708:3;6697:9;6693:19;6680:33;6664:49;;6738:2;6728:8;6725:16;6722:2;;;6759:6;6751;6744:22;6722:2;;6787:66;6845:7;6834:8;6823:9;6819:24;6787:66;:::i;:::-;6777:76;;;6900:3;6889:9;6885:19;6872:33;6862:43;;5680:1231;;;;;;;;;;:::o;6916:190::-;;7028:2;7016:9;7007:7;7003:23;6999:32;6996:2;;;7049:6;7041;7034:22;6996:2;-1:-1:-1;7077:23:1;;6986:120;-1:-1:-1;6986:120:1:o;7310:327::-;;;7439:2;7427:9;7418:7;7414:23;7410:32;7407:2;;;7460:6;7452;7445:22;7407:2;7501:9;7488:23;7478:33;;7561:2;7550:9;7546:18;7533:32;7574:33;7601:5;7574:33;:::i;:::-;7626:5;7616:15;;;7397:240;;;;;:::o;7642:321::-;;;7768:2;7756:9;7747:7;7743:23;7739:32;7736:2;;;7789:6;7781;7774:22;7736:2;7830:9;7817:23;7807:33;;7890:2;7879:9;7875:18;7862:32;7903:30;7927:5;7903:30;:::i;7968:634::-;;;;;;8143:3;8131:9;8122:7;8118:23;8114:33;8111:2;;;8165:6;8157;8150:22;8111:2;8206:9;8193:23;8183:33;;8266:2;8255:9;8251:18;8238:32;8279:30;8303:5;8279:30;:::i;:::-;8328:5;-1:-1:-1;8385:2:1;8370:18;;8357:32;8433:4;8420:18;;8408:31;;8398:2;;8458:6;8450;8443:22;8398:2;8101:501;;;;-1:-1:-1;8486:7:1;;8540:2;8525:18;;8512:32;;-1:-1:-1;8591:3:1;8576:19;8563:33;;8101:501;-1:-1:-1;;8101:501:1:o;8607:106::-;-1:-1:-1;;;;;8675:31:1;8663:44;;8653:60::o;8718:469::-;;8815:5;8809:12;8842:6;8837:3;8830:19;8868:4;8897:2;8892:3;8888:12;8881:19;;8934:2;8927:5;8923:14;8955:3;8967:195;8981:6;8978:1;8975:13;8967:195;;;9046:13;;-1:-1:-1;;;;;9042:39:1;9030:52;;9102:12;;;;9137:15;;;;9078:1;8996:9;8967:195;;;-1:-1:-1;9178:3:1;;8785:402;-1:-1:-1;;;;;8785:402:1:o;9192:456::-;;9286:5;9280:12;9313:6;9308:3;9301:19;9339:4;9368:2;9363:3;9359:12;9352:19;;9405:2;9398:5;9394:14;9426:3;9438:185;9452:6;9449:1;9446:13;9438:185;;;9527:13;;9520:21;9513:29;9501:42;;9563:12;;;;9598:15;;;;9474:1;9467:9;9438:185;;9653:625;;9748:5;9742:12;9775:6;9770:3;9763:19;9801:4;9842:2;9837:3;9833:12;9867:11;9894;9887:18;;9949:2;9941:6;9937:15;9930:5;9926:27;9914:39;;9987:2;9980:5;9976:14;10008:3;10020:232;10034:6;10031:1;10028:13;10020:232;;;10105:5;10099:4;10095:16;10090:3;10083:29;10133:39;10167:4;10158:6;10152:13;10133:39;:::i;:::-;10230:12;;;;10125:47;-1:-1:-1;10195:15:1;;;;10056:1;10049:9;10020:232;;;-1:-1:-1;10268:4:1;;9718:560;-1:-1:-1;;;;;;;9718:560:1:o;10283:443::-;;10380:5;10374:12;10407:6;10402:3;10395:19;10433:4;10462:2;10457:3;10453:12;10446:19;;10499:2;10492:5;10488:14;10520:3;10532:169;10546:6;10543:1;10540:13;10532:169;;;10607:13;;10595:26;;10641:12;;;;10676:15;;;;10568:1;10561:9;10532:169;;10731:93;10803:13;10796:21;10784:34;;10774:50::o;10829:259::-;;10910:5;10904:12;10937:6;10932:3;10925:19;10953:63;11009:6;11002:4;10997:3;10993:14;10986:4;10979:5;10975:16;10953:63;:::i;:::-;11070:2;11049:15;-1:-1:-1;;11045:29:1;11036:39;;;;11077:4;11032:50;;10880:208;-1:-1:-1;;10880:208:1:o;11093:756::-;;11185:5;11179:12;11210:1;11242:2;11231:9;11227:18;11259:1;11254:165;;;;11433:1;11428:415;;;;11220:623;;11254:165;11306:1;11291:17;;11310:4;11287:28;11275:41;;-1:-1:-1;;11352:24:1;;11345:4;11336:14;;11329:48;11406:2;11397:12;;;-1:-1:-1;11254:165:1;;11428:415;11478:1;11467:9;11463:17;11505:6;11500:3;11493:19;11540:37;11571:5;11540:37;:::i;:::-;11599:1;11613:178;11627:6;11624:1;11621:13;11613:178;;;11724:7;11718:14;11711:4;11707:1;11702:3;11698:11;11694:22;11687:46;11774:2;11765:7;11761:16;11750:27;;11649:4;11646:1;11642:12;11637:17;;11613:178;;;11815:11;;11828:4;11811:22;;-1:-1:-1;;;11220:623:1;;;;11152:697;;;;:::o;11854:392::-;-1:-1:-1;;;12112:27:1;;12164:1;12155:11;;12148:27;;;;12200:2;12191:12;;12184:28;12237:2;12228:12;;12102:144::o;12251:203::-;-1:-1:-1;;;;;12415:32:1;;;;12397:51;;12385:2;12370:18;;12352:102::o;12459:274::-;-1:-1:-1;;;;;12651:32:1;;;;12633:51;;12715:2;12700:18;;12693:34;12621:2;12606:18;;12588:145::o;12738:707::-;;13068:1;13064;13059:3;13055:11;13051:19;13043:6;13039:32;13028:9;13021:51;13108:6;13103:2;13092:9;13088:18;13081:34;13151:3;13146:2;13135:9;13131:18;13124:31;13178:47;13220:3;13209:9;13205:19;13197:6;13178:47;:::i;:::-;13273:9;13265:6;13261:22;13256:2;13245:9;13241:18;13234:50;13301:34;13328:6;13320;13301:34;:::i;:::-;13366:3;13351:19;;13344:35;;;;-1:-1:-1;;13423:14:1;;13416:22;13410:3;13395:19;;;13388:51;13293:42;13011:434;-1:-1:-1;;;;13011:434:1:o;13450:717::-;;13774:1;13770;13765:3;13761:11;13757:19;13749:6;13745:32;13734:9;13727:51;13814:6;13809:2;13798:9;13794:18;13787:34;13857:3;13852:2;13841:9;13837:18;13830:31;13884:55;13934:3;13923:9;13919:19;13911:6;13884:55;:::i;:::-;13987:9;13979:6;13975:22;13970:2;13959:9;13955:18;13948:50;14015:42;14050:6;14042;14015:42;:::i;14172:187::-;14337:14;;14330:22;14312:41;;14300:2;14285:18;;14267:92::o;14364:177::-;14510:25;;;14498:2;14483:18;;14465:76::o;14546:417::-;14777:25;;;14833:2;14818:18;;14811:34;;;;14876:2;14861:18;;14854:34;-1:-1:-1;;;;;14924:32:1;14919:2;14904:18;;14897:60;14764:3;14749:19;;14731:232::o;14968:329::-;15164:25;;;15220:2;15205:18;;15198:34;;;;15275:14;15268:22;15263:2;15248:18;;15241:50;15152:2;15137:18;;15119:178::o;15302:398::-;15529:25;;;15602:4;15590:17;;;;15585:2;15570:18;;15563:45;15639:2;15624:18;;15617:34;15682:2;15667:18;;15660:34;15516:3;15501:19;;15483:217::o;15705:408::-;-1:-1:-1;;;;;15996:15:1;;;15978:34;;16048:15;;;;16043:2;16028:18;;16021:43;16095:2;16080:18;;16073:34;;;;15928:2;15913:18;;15895:218::o;16827:239::-;16976:2;16961:18;;17009:1;16998:13;;16988:2;;17015:9;16988:2;17035:25;;;16943:123;:::o;17071:221::-;;17220:2;17209:9;17202:21;17240:46;17282:2;17271:9;17267:18;17259:6;17240:46;:::i;17297:402::-;17499:2;17481:21;;;17538:2;17518:18;;;17511:30;17577:34;17572:2;17557:18;;17550:62;-1:-1:-1;;;17643:2:1;17628:18;;17621:36;17689:3;17674:19;;17471:228::o;17704:352::-;17906:2;17888:21;;;17945:2;17925:18;;;17918:30;17984;17979:2;17964:18;;17957:58;18047:2;18032:18;;17878:178::o;18061:351::-;18263:2;18245:21;;;18302:2;18282:18;;;18275:30;18341:29;18336:2;18321:18;;18314:57;18403:2;18388:18;;18235:177::o;18417:337::-;18619:2;18601:21;;;18658:2;18638:18;;;18631:30;-1:-1:-1;;;18692:2:1;18677:18;;18670:43;18745:2;18730:18;;18591:163::o;18759:347::-;18961:2;18943:21;;;19000:2;18980:18;;;18973:30;19039:25;19034:2;19019:18;;19012:53;19097:2;19082:18;;18933:173::o;19111:341::-;19313:2;19295:21;;;19352:2;19332:18;;;19325:30;-1:-1:-1;;;19386:2:1;19371:18;;19364:47;19443:2;19428:18;;19285:167::o;19457:345::-;19659:2;19641:21;;;19698:2;19678:18;;;19671:30;-1:-1:-1;;;19732:2:1;19717:18;;19710:51;19793:2;19778:18;;19631:171::o;19807:341::-;20009:2;19991:21;;;20048:2;20028:18;;;20021:30;-1:-1:-1;;;20082:2:1;20067:18;;20060:47;20139:2;20124:18;;19981:167::o;20153:346::-;20355:2;20337:21;;;20394:2;20374:18;;;20367:30;-1:-1:-1;;;20428:2:1;20413:18;;20406:52;20490:2;20475:18;;20327:172::o;20504:347::-;20706:2;20688:21;;;20745:2;20725:18;;;20718:30;20784:25;20779:2;20764:18;;20757:53;20842:2;20827:18;;20678:173::o;20856:340::-;21058:2;21040:21;;;21097:2;21077:18;;;21070:30;-1:-1:-1;;;21131:2:1;21116:18;;21109:46;21187:2;21172:18;;21030:166::o;21201:356::-;21403:2;21385:21;;;21422:18;;;21415:30;21481:34;21476:2;21461:18;;21454:62;21548:2;21533:18;;21375:182::o;21562:350::-;21764:2;21746:21;;;21803:2;21783:18;;;21776:30;21842:28;21837:2;21822:18;;21815:56;21903:2;21888:18;;21736:176::o;21917:356::-;22119:2;22101:21;;;22138:18;;;22131:30;22197:34;22192:2;22177:18;;22170:62;22264:2;22249:18;;22091:182::o;22278:344::-;22480:2;22462:21;;;22519:2;22499:18;;;22492:30;-1:-1:-1;;;22553:2:1;22538:18;;22531:50;22613:2;22598:18;;22452:170::o;22627:343::-;22829:2;22811:21;;;22868:2;22848:18;;;22841:30;-1:-1:-1;;;22902:2:1;22887:18;;22880:49;22961:2;22946:18;;22801:169::o;22975:345::-;23177:2;23159:21;;;23216:2;23196:18;;;23189:30;-1:-1:-1;;;23250:2:1;23235:18;;23228:51;23311:2;23296:18;;23149:171::o;23325:2587::-;;23528:2;23517:9;23510:21;23573:6;23567:13;23562:2;23551:9;23547:18;23540:41;23628:2;23620:6;23616:15;23610:22;23641:54;23691:2;23680:9;23676:18;23662:12;23641:54;:::i;:::-;;23744:2;23736:6;23732:15;23726:22;23757:56;23809:2;23798:9;23794:18;23778:14;23757:56;:::i;:::-;;23862:2;23854:6;23850:15;23844:22;23885:6;23928:2;23922:3;23911:9;23907:19;23900:31;23954:71;24020:3;24009:9;24005:19;23989:14;23954:71;:::i;:::-;23940:85;;24074:3;24066:6;24062:16;24056:23;24102:2;24098:7;24170:2;24158:9;24150:6;24146:22;24142:31;24136:3;24125:9;24121:19;24114:60;24197:58;24248:6;24232:14;24197:58;:::i;:::-;24183:72;;24304:3;24296:6;24292:16;24286:23;24264:45;;24374:2;24362:9;24354:6;24350:22;24346:31;24340:3;24329:9;24325:19;24318:60;24401:56;24450:6;24434:14;24401:56;:::i;:::-;24387:70;;24506:3;24498:6;24494:16;24488:23;24466:45;;24576:2;24564:9;24556:6;24552:22;24548:31;24542:3;24531:9;24527:19;24520:60;24603:56;24652:6;24636:14;24603:56;:::i;:::-;24589:70;;24708:3;24700:6;24696:16;24690:23;24668:45;;24732:3;24799:2;24787:9;24779:6;24775:22;24771:31;24766:2;24755:9;24751:18;24744:59;24826:55;24874:6;24858:14;24826:55;:::i;:::-;24906:15;;;24900:22;24941:3;24960:18;;;24953:30;;;;25008:15;;25002:22;25043:3;25062:18;;;25055:30;;;;25110:15;;25104:22;25145:3;25164:18;;;25157:30;;;;25213:15;;25207:22;25249:3;25268:19;;;25261:32;;;;25319:16;;25313:23;25356:3;25375:19;;;25368:32;;;;25437:16;;25431:23;24812:69;;-1:-1:-1;25431:23:1;-1:-1:-1;25474:3:1;;-1:-1:-1;25486:54:1;25520:19;;;25431:23;25486:54;:::i;:::-;25577:16;;25571:23;;-1:-1:-1;25614:3:1;25626:54;25660:19;;;25571:23;25626:54;:::i;:::-;25717:16;;25711:23;;-1:-1:-1;25754:3:1;25766:57;25803:19;;;25711:23;25766:57;:::i;:::-;25865:16;;;;25859:23;25839:18;;25832:51;;;;-1:-1:-1;25900:6:1;23500:2412;-1:-1:-1;23500:2412:1:o;25917:331::-;26137:13;;26130:21;26123:29;26105:48;;26213:4;26201:17;;;26195:24;-1:-1:-1;;;;;26191:50:1;26169:20;;;26162:80;;;;26093:2;26078:18;;26060:188::o;26435:1541::-;;27090:3;27120:6;27109:9;27102:25;27163:2;27158;27147:9;27143:18;27136:30;27189:62;27247:2;27236:9;27232:18;27224:6;27189:62;:::i;:::-;27175:76;;27299:9;27291:6;27287:22;27282:2;27271:9;27267:18;27260:50;27333;27376:6;27368;27333:50;:::i;:::-;27319:64;;27431:9;27423:6;27419:22;27414:2;27403:9;27399:18;27392:50;27465:48;27506:6;27498;27465:48;:::i;:::-;27451:62;;27562:9;27554:6;27550:22;27544:3;27533:9;27529:19;27522:51;27596:48;27637:6;27629;27596:48;:::i;:::-;27582:62;;27693:9;27685:6;27681:22;27675:3;27664:9;27660:19;27653:51;27721:47;27761:6;27753;27721:47;:::i;:::-;27799:3;27784:19;;27777:35;;;;-1:-1:-1;;27843:3:1;27828:19;;27821:35;;;;-1:-1:-1;;;;;27893:32:1;;;;27887:3;27872:19;;27865:61;27957:3;27942:19;;;27935:35;27713:55;27070:906;-1:-1:-1;;;;;;27070:906:1:o;27981:329::-;28177:25;;;28245:14;;28238:22;28233:2;28218:18;;28211:50;28292:2;28277:18;;28270:34;28165:2;28150:18;;28132:178::o;28315:248::-;28489:25;;;28545:2;28530:18;;28523:34;28477:2;28462:18;;28444:119::o;28568:242::-;28638:2;28632:9;28668:17;;;28715:18;28700:34;;28736:22;;;28697:62;28694:2;;;28762:9;28694:2;28789;28782:22;28612:198;;-1:-1:-1;28612:198:1:o;28815:183::-;;28914:18;28906:6;28903:30;28900:2;;;28936:9;28900:2;-1:-1:-1;28987:4:1;28968:17;;;28964:28;;28890:108::o;29003:181::-;;29086:18;29078:6;29075:30;29072:2;;;29108:9;29072:2;-1:-1:-1;29167:2:1;29144:17;-1:-1:-1;;29140:31:1;29173:4;29136:42;;29062:122::o;29189:128::-;;29256:17;;;29306:4;29290:21;;;29246:71::o;29322:258::-;29394:1;29404:113;29418:6;29415:1;29412:13;29404:113;;;29494:11;;;29488:18;29475:11;;;29468:39;29440:2;29433:10;29404:113;;;29535:6;29532:1;29529:13;29526:2;;;29570:1;29561:6;29556:3;29552:16;29545:27;29526:2;;29375:205;;;:::o;29585:133::-;-1:-1:-1;;;;;29662:31:1;;29652:42;;29642:2;;29708:1;29705;29698:12;29723:120;29811:5;29804:13;29797:21;29790:5;29787:32;29777:2;;29833:1;29830;29823:12

Swarm Source

ipfs://3255f14330cf43fabb4281e87def734f660a2374d36a74dbd177480523c8dfc6

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.