My Name Tag:
Not Available, login to update
[ Download CSV Export ]
OVERVIEW
Foundation Time-lock Contract.Contract Name:
HEC_Foundation_Distribution
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-01-18 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.2; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Provides walletsrmation 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 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { 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. */ abstract 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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, 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 addition of two unsigned integers, reverting with custom message on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, errorMessage); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction underflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ 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 multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b, string memory errorMessage) 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, errorMessage); 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; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @dev Heroes Chained base TimeLock Contract. * */ abstract contract HEC_Base_Distribution is Ownable, ReentrancyGuard { /* ====== INCLUDES ====== */ using SafeMath for uint256; using SafeERC20 for IERC20; /* ====== CONSTANTS ====== */ uint256 internal constant SECONDS_PER_DAY = 24 * 60 * 60; /* ====== EVENTS ====== */ event RewardClaimed(address indexed user, uint256 amount); /* ====== VARIABLES ====== */ address public immutable HeC; uint256 internal totalDebt; bool internal STOPPED = false; mapping( address => uint256 ) public walletIndices; WalletInfo[] public wallets; /* ====== STRUCTS ====== */ struct WalletInfo { address recipient; uint256 unlockedBalance; uint256 lockedBalance; uint256 initialBalance; uint256 releaseAmountPerDay; uint256 claimableEpochTime; } /* ====== VIRTUAL FUNCTIONS ====== */ function getTGEEpochTime() internal virtual view returns(uint256); function getInitialContractBalance() internal virtual view returns(uint256); function getTGEUnlockPercentage() internal virtual view returns(uint256); function getCliffEndEpochTime() internal virtual view returns(uint256); function getVestingEndEpochTime() internal virtual view returns(uint256); /* ====== CONSTRUCTOR ====== */ constructor( address _hec) { require( _hec != address(0) ); HeC = _hec; totalDebt = 0; STOPPED = false; } /* ====== FUNCTIONS ====== */ /** @notice calculate and send claimable amount to the recipient as of call time */ function claim() external nonReentrant { require(STOPPED == false, "Contract is in suspended state."); require(getTGEEpochTime() > 0, "Contract not initialized yet."); require(wallets.length > 0, "No recipients found."); require(uint256(block.timestamp) > getTGEEpochTime(), "Request not valid."); uint256 index = walletIndices[msg.sender]; require(wallets[ index ].recipient == msg.sender, "Claim request is not valid."); require(wallets[ index ].lockedBalance.add( wallets[ index ].unlockedBalance ) > 0, "There is no balance left to claim."); uint256 valueToSendFromVesting = calculateClaimableAmountForVesting( index ); uint256 valueToSendFromTGE = wallets[ index ].unlockedBalance; uint256 valueToSendTOTAL = valueToSendFromVesting.add(valueToSendFromTGE); require( valueToSendTOTAL > 0, "There is no balance to claim at the moment."); uint256 vestingDayCount = calculateVestingDayCount( wallets[ index ].claimableEpochTime, uint256(block.timestamp) ); wallets[ index ].lockedBalance = wallets[ index ].lockedBalance.sub( valueToSendFromVesting ); wallets[ index ].unlockedBalance = wallets[ index ].unlockedBalance.sub( valueToSendFromTGE ); wallets[ index ].claimableEpochTime = wallets[ index ].claimableEpochTime.add( vestingDayCount.mul( SECONDS_PER_DAY ) ); totalDebt = totalDebt.sub( valueToSendTOTAL ); IERC20( HeC ).safeTransfer(msg.sender, valueToSendTOTAL); emit RewardClaimed( msg.sender, valueToSendTOTAL ); } /** @notice calculate and return claimable amount as of call time */ function claimable() external view returns (uint256) { require(STOPPED == false, "Contract is in suspended state."); require(getTGEEpochTime() > 0, "Contract not initialized yet."); require(wallets.length > 0, "No recipients found."); uint256 index = walletIndices[ msg.sender ]; require(wallets[ index ].recipient == msg.sender, "Request not valid."); if (uint256(block.timestamp) <= getTGEEpochTime()) return 0; return wallets[ index ].unlockedBalance.add( calculateClaimableAmountForVesting( index ) ); } /** @notice calculate claimable amount accoring to vesting conditions as of call time @param _index uint256 */ function calculateClaimableAmountForVesting( uint256 _index ) private view returns (uint256) { //initial value of current claimable time is the ending time of cliff/lock period //after first claim, this value is iterated forward by the time unit amount claimed. //Calculate the number of vesting days passed since the most recent claim time (or TGE time initially) //for instance, this calculations gives the number of days passed since last claim (or TGE time) //we use the number of seconds passed and divide it by number of seconds per day uint256 vestingDayCount = calculateVestingDayCount( wallets[ _index ].claimableEpochTime, uint256(block.timestamp) ); uint256 valueToSendFromVesting = wallets[ _index ].releaseAmountPerDay.mul( vestingDayCount ); //If claim time is after Vesting End Time, send all the remaining tokens. if (uint256(block.timestamp) > getVestingEndEpochTime()) valueToSendFromVesting = wallets[ _index ].lockedBalance; if ( valueToSendFromVesting > wallets[ _index ].lockedBalance ) { valueToSendFromVesting = wallets[ _index ].lockedBalance; } return valueToSendFromVesting; } /** @notice calculate number of days between given dates @param _start_time uint256 @param _end_time uint256 */ function calculateVestingDayCount( uint256 _start_time, uint256 _end_time ) private pure returns (uint256) { if (_end_time <= _start_time) return 0; return _end_time.sub(_start_time).div(SECONDS_PER_DAY); } /** @notice add a recipient to the contract. @param _recipient address @param _tokenAmount uint256 */ function _addRecipient( address _recipient, uint256 _tokenAmount ) private { uint256 index = walletIndices[ _recipient ]; if (wallets.length > 0) { if (index > 0) { require(false, "Address already in list."); //Force throw exception } else { require(_recipient != wallets[0].recipient, "Address already in list."); } } require( _recipient != address(0), "Recipient address cannot be empty." ); require( _tokenAmount > 0, "Token amount invalid." ); require(totalDebt.add(_tokenAmount) <= getInitialContractBalance(), "Cannot add this debt amount due to the balance of this Contract."); uint256 vestingDayCount = calculateVestingDayCount( getCliffEndEpochTime(), getVestingEndEpochTime() ); //This contract does not support cases where Cliff-End = Vesting-End, i.e. There's no vesting period require(vestingDayCount > 0, "Unexpected vesting day count."); uint256 _unlockedBalance = _tokenAmount.mul(getTGEUnlockPercentage()).div(100); uint256 _lockedBalance = _tokenAmount.sub(_unlockedBalance); uint256 _releaseAmountPerDay = _lockedBalance.div(vestingDayCount); wallets.push( WalletInfo({ recipient: _recipient, unlockedBalance: _unlockedBalance, lockedBalance: _lockedBalance, initialBalance: _tokenAmount, releaseAmountPerDay: _releaseAmountPerDay, claimableEpochTime: getCliffEndEpochTime() })); walletIndices[_recipient] = wallets.length.sub(1); totalDebt = totalDebt.add(_tokenAmount); } /** @notice remove a recipient from contract @param _recipient address */ function _removeRecipient( address _recipient ) private { uint256 _index = walletIndices[ _recipient ]; require( _recipient == wallets[ _index ].recipient, "Recipient index does not match." ); totalDebt = totalDebt.sub( wallets[ _index ].lockedBalance ).sub( wallets[ _index ].unlockedBalance ); wallets[ _index ].recipient = address(0); wallets[ _index ].releaseAmountPerDay = 0; wallets[ _index ].claimableEpochTime = 0; wallets[ _index ].initialBalance = 0; wallets[ _index ].unlockedBalance = 0; wallets[ _index ].lockedBalance = 0; delete walletIndices[ _recipient ]; } /** @notice batch add recipients to the contract. @param _recipients address[] @param _tokenAmounts uint256[] */ function addRecipients(address[] memory _recipients, uint256[] memory _tokenAmounts) external nonReentrant onlyOwner returns (bool) { require( _recipients.length == _tokenAmounts.length, "Array sizes do not match."); require( _recipients.length > 0, "Array cannot be empty."); for( uint256 i = 0; i < _recipients.length; i++ ) { _addRecipient( _recipients[i], _tokenAmounts[i] ); } return true; } /** @notice batch remove recipients from contract @param _recipients address[] */ function removeRecipients(address[] memory _recipients) external nonReentrant onlyOwner returns (bool) { require( _recipients.length > 0, "Array cannot be empty."); for( uint256 i = 0; i < _recipients.length; i++ ) { _removeRecipient( _recipients[i] ); } return true; } /** @notice withdrawal of remaining tokens in case of emergency conditions */ function emergencyWithdrawal() external nonReentrant onlyOwner { require(STOPPED, "Contract is not in suspended state."); uint256 total = IERC20( HeC ).balanceOf( address(this) ); IERC20( HeC ).safeTransfer(msg.sender, total); } /** @notice temporarily stop contract operations in case of emergency conditions */ function suspendOperations() external onlyOwner returns (bool) { STOPPED = true; return true; } /** @notice resume contract operations after emergency conditions */ function resumeOperations() external onlyOwner returns (bool) { STOPPED = false; return true; } /** @notice get remaining balance of this contract */ function getRemainingBalance() external view onlyOwner returns (uint256) { return IERC20( HeC ).balanceOf( address(this) ); } /** @notice return whether contract is suspended or not */ function isSuspended() external onlyOwner view returns (bool) { bool ret = STOPPED; return ret; } /** @notice get remaining debts of all recipients */ function getRemainingDebt() external view onlyOwner returns (uint256) { uint256 remainingBalance = 0; for( uint256 i = 0; i < wallets.length; i++ ) { remainingBalance = remainingBalance.add( wallets[i].lockedBalance ).add( wallets[i].unlockedBalance ); } return remainingBalance; } } /** * @dev Heroes Chained TimeLock Contract for Pre-Seed, Seed, Private, Team. * LP, Foundation and Community & Marketing Contracts. */ contract HEC_Foundation_Distribution is HEC_Base_Distribution { /* ====== INCLUDES ====== */ using SafeMath for uint256; //Properties - In accordance with Token Distribution Plan uint256 private INITIAL_CONTRACT_BALANCE = 0; //(X million tokens) uint256 private TGE_UNLOCK_PERCENTAGE = 0; //X% uint256 private TGE_EPOCH_TIME = 0; uint256 private CLIFF_END_EPOCH_TIME = 0; uint256 private VESTING_END_EPOCH_TIME = 0; /* ====== STRUCTS ====== */ struct ContractInfo { uint256 TGEEpochTime; uint256 CliffEndEpochTime; uint256 VestingEndEpochTime; uint256 TGEUnlockPercentage; uint256 InitialContractBalance; } /* ====== CONSTRUCTOR ====== */ constructor( address _hec ) HEC_Base_Distribution( _hec ) { require( _hec != address(0) ); } /* ====== FUNCTIONS ====== */ /** @notice get TGE, Cliff-End and Vesting-End and other properties */ function getContractInfo() external view onlyOwner returns ( ContractInfo memory ) { ContractInfo memory ret = ContractInfo({ TGEEpochTime: TGE_EPOCH_TIME, CliffEndEpochTime: CLIFF_END_EPOCH_TIME, VestingEndEpochTime: VESTING_END_EPOCH_TIME, TGEUnlockPercentage: TGE_UNLOCK_PERCENTAGE, InitialContractBalance: INITIAL_CONTRACT_BALANCE }); return ret; } function getTGEEpochTime() internal override view returns(uint256) { return TGE_EPOCH_TIME; } function getInitialContractBalance() internal override view returns(uint256) { return INITIAL_CONTRACT_BALANCE; } function getCliffEndEpochTime() internal override view returns(uint256){ return CLIFF_END_EPOCH_TIME; } function getVestingEndEpochTime() internal override view returns(uint256){ return VESTING_END_EPOCH_TIME; } function getTGEUnlockPercentage() internal override view returns(uint256){ return TGE_UNLOCK_PERCENTAGE; } /** @notice set TGE, Cliff-End and Vesting-End dates and initialize the contract. @param _TGEEpochTime uint256 @param _CliffEndEpochTime uint256 @param _VestingEndEpochTime uint256 */ function setContractProperties( uint256 _InitialContractBalance, uint256 _TGEEpochTime, uint256 _TGEUnlockPercentage, uint256 _CliffEndEpochTime, uint256 _VestingEndEpochTime ) external onlyOwner returns (bool) { require(STOPPED, "Contract is not in suspended state."); require(_InitialContractBalance > 0, "Initial Contract Balance should be greater than 0."); require(_TGEUnlockPercentage <= 20, "TGE Unlock Percentage cannot be greater than 20% per HeC Tokenomics."); if (TGE_EPOCH_TIME > 0) { require(IERC20( HeC ).balanceOf( address(this) ) == 0, "Contract already has tokens and TGE already set. Cannot change dates at this moment."); } require(_TGEEpochTime >= uint256(block.timestamp), "TGE time cannot be earlier than now."); require(_CliffEndEpochTime >= _TGEEpochTime, "Cliff End time cannot be earlier than TGE time."); require(_VestingEndEpochTime >= _CliffEndEpochTime, "Vesting End time cannot be earlier than Cliff End time."); TGE_EPOCH_TIME = _TGEEpochTime; CLIFF_END_EPOCH_TIME = _CliffEndEpochTime; VESTING_END_EPOCH_TIME = _VestingEndEpochTime; INITIAL_CONTRACT_BALANCE = _InitialContractBalance; TGE_UNLOCK_PERCENTAGE = _TGEUnlockPercentage; return true; } }
[{"inputs":[{"internalType":"address","name":"_hec","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"inputs":[],"name":"HeC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_tokenAmounts","type":"uint256[]"}],"name":"addRecipients","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractInfo","outputs":[{"components":[{"internalType":"uint256","name":"TGEEpochTime","type":"uint256"},{"internalType":"uint256","name":"CliffEndEpochTime","type":"uint256"},{"internalType":"uint256","name":"VestingEndEpochTime","type":"uint256"},{"internalType":"uint256","name":"TGEUnlockPercentage","type":"uint256"},{"internalType":"uint256","name":"InitialContractBalance","type":"uint256"}],"internalType":"struct HEC_Foundation_Distribution.ContractInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSuspended","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":"address[]","name":"_recipients","type":"address[]"}],"name":"removeRecipients","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resumeOperations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_InitialContractBalance","type":"uint256"},{"internalType":"uint256","name":"_TGEEpochTime","type":"uint256"},{"internalType":"uint256","name":"_TGEUnlockPercentage","type":"uint256"},{"internalType":"uint256","name":"_CliffEndEpochTime","type":"uint256"},{"internalType":"uint256","name":"_VestingEndEpochTime","type":"uint256"}],"name":"setContractProperties","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"suspendOperations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletIndices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wallets","outputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"unlockedBalance","type":"uint256"},{"internalType":"uint256","name":"lockedBalance","type":"uint256"},{"internalType":"uint256","name":"initialBalance","type":"uint256"},{"internalType":"uint256","name":"releaseAmountPerDay","type":"uint256"},{"internalType":"uint256","name":"claimableEpochTime","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040526000600360006101000a81548160ff02191690831515021790555060006006556000600755600060085560006009556000600a553480156200004557600080fd5b5060405162004abc38038062004abc83398181016040528101906200006b91906200024e565b806200008c620000806200016b60201b60201c565b6200017360201b60201c565b60018081905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000ce57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060006002819055506000600360006101000a81548160ff02191690831515021790555050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200016457600080fd5b50620002c8565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000815190506200024881620002ae565b92915050565b6000602082840312156200026157600080fd5b6000620002718482850162000237565b91505092915050565b600062000287826200028e565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620002b9816200027a565b8114620002c557600080fd5b50565b60805160601c6147b26200030a600039600081816104bb015281816107b501528181610f4e015281816111ab0152818161125b015261143401526147b26000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063715018a6116100a25780639dd509cb116100715780639dd509cb146102b2578063a6e1d016146102e2578063af38d75714610300578063bf2a1c081461031e578063f2fde38b1461033c57610116565b8063715018a6146102375780637ad71f72146102415780637cc1f867146102765780638da5cb5b1461029457610116565b80634e71d92d116100e95780634e71d92d146101b7578063598f89fc146101c15780635b0a3843146101df578063639ab82f146101e95780636db9a96f1461021957610116565b806310764cd41461011b5780631d1309351461014b5780632fba2c85146101695780633b5784f614610187575b600080fd5b610135600480360381019061013091906131fe565b610358565b6040516101429190613859565b60405180910390f35b61015361069c565b6040516101609190613859565b60405180910390f35b610171610735565b60405161017e9190613c71565b60405180910390f35b6101a1600480360381019061019c91906130ad565b610861565b6040516101ae9190613c71565b60405180910390f35b6101bf610879565b005b6101c9610fee565b6040516101d69190613859565b60405180910390f35b6101e761108e565b005b61020360048036038101906101fe91906130d6565b6112a9565b6040516102109190613859565b60405180910390f35b610221611432565b60405161022e91906137b4565b60405180910390f35b61023f611456565b005b61025b600480360381019061025691906131ac565b6114de565b60405161026d969594939291906137f8565b60405180910390f35b61027e61154a565b60405161028b9190613c56565b60405180910390f35b61029c61160a565b6040516102a991906137b4565b60405180910390f35b6102cc60048036038101906102c79190613117565b611633565b6040516102d99190613859565b60405180910390f35b6102ea611842565b6040516102f79190613859565b60405180910390f35b6103086118e2565b6040516103159190613c71565b60405180910390f35b610326611b6d565b6040516103339190613c71565b60405180910390f35b610356600480360381019061035191906130ad565b611cd4565b005b6000610362611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661038061160a565b73ffffffffffffffffffffffffffffffffffffffff16146103d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103cd90613a96565b60405180910390fd5b600360009054906101000a900460ff16610425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041c90613ab6565b60405180910390fd5b60008611610468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161045f90613af6565b60405180910390fd5b60148411156104ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a390613b96565b60405180910390fd5b600060085411156105a35760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161051291906137b4565b60206040518083038186803b15801561052a57600080fd5b505afa15801561053e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056291906131d5565b146105a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059990613b16565b60405180910390fd5b5b428510156105e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105dd90613a36565b60405180910390fd5b84831015610629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062090613b76565b60405180910390fd5b8282101561066c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066390613896565b60405180910390fd5b846008819055508260098190555081600a8190555085600681905550836007819055506001905095945050505050565b60006106a6611dcc565b73ffffffffffffffffffffffffffffffffffffffff166106c461160a565b73ffffffffffffffffffffffffffffffffffffffff161461071a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071190613a96565b60405180910390fd5b6000600360009054906101000a900460ff1690508091505090565b600061073f611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661075d61160a565b73ffffffffffffffffffffffffffffffffffffffff16146107b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107aa90613a96565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161080c91906137b4565b60206040518083038186803b15801561082457600080fd5b505afa158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c91906131d5565b905090565b60046020528060005260406000206000915090505481565b600260015414156108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b690613bd6565b60405180910390fd5b600260018190555060001515600360009054906101000a900460ff1615151461091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490613a16565b60405180910390fd5b6000610927611dd4565b11610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e906139f6565b60405180910390fd5b6000600580549050116109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690613ad6565b60405180910390fd5b6109b7611dd4565b42116109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef90613976565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660058281548110610a8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90613956565b60405180910390fd5b6000610bc060058381548110610b54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015460058481548110610ba0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020154611dde90919063ffffffff16565b11610c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf7906138f6565b60405180910390fd5b6000610c0b82611e3c565b9050600060058381548110610c49577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015490506000610c728284611dde90919063ffffffff16565b905060008111610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90613a76565b60405180910390fd5b6000610d0e60058681548110610cf6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016005015442612002565b9050610d6e8460058781548110610d4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015461204590919063ffffffff16565b60058681548110610da8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020181905550610e1b8360058781548110610dfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015461204590919063ffffffff16565b60058681548110610e55577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160010181905550610edd610e83620151808361208f90919063ffffffff16565b60058781548110610ebd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160050154611dde90919063ffffffff16565b60058681548110610f17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160050181905550610f418260025461204590919063ffffffff16565b600281905550610f9233837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661210a9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f724183604051610fd89190613c71565b60405180910390a2505050505060018081905550565b6000610ff8611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661101661160a565b73ffffffffffffffffffffffffffffffffffffffff161461106c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106390613a96565b60405180910390fd5b6001600360006101000a81548160ff0219169083151502179055506001905090565b600260015414156110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90613bd6565b60405180910390fd5b60026001819055506110e4611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661110261160a565b73ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f90613a96565b60405180910390fd5b600360009054906101000a900460ff166111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e90613ab6565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161120291906137b4565b60206040518083038186803b15801561121a57600080fd5b505afa15801561122e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125291906131d5565b905061129f33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661210a9092919063ffffffff16565b5060018081905550565b6000600260015414156112f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e890613bd6565b60405180910390fd5b6002600181905550611301611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661131f61160a565b73ffffffffffffffffffffffffffffffffffffffff1614611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90613a96565b60405180910390fd5b60008251116113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b0906138b6565b60405180910390fd5b60005b82518110156114215761140e838281518110611401577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612190565b808061141990613efc565b9150506113bc565b506001905060018081905550919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61145e611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661147c61160a565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613a96565b60405180910390fd5b6114dc60006125d7565b565b600581815481106114ee57600080fd5b90600052602060002090600602016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154905086565b611552612efe565b61155a611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661157861160a565b73ffffffffffffffffffffffffffffffffffffffff16146115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590613a96565b60405180910390fd5b60006040518060a0016040528060085481526020016009548152602001600a548152602001600754815260200160065481525090508091505090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006002600154141561167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290613bd6565b60405180910390fd5b600260018190555061168b611dcc565b73ffffffffffffffffffffffffffffffffffffffff166116a961160a565b73ffffffffffffffffffffffffffffffffffffffff16146116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f690613a96565b60405180910390fd5b8151835114611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613c36565b60405180910390fd5b6000835111611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e906138b6565b60405180910390fd5b60005b83518110156118305761181d8482815181106117cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848381518110611810577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161269b565b808061182890613efc565b91505061178a565b50600190506001808190555092915050565b600061184c611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661186a61160a565b73ffffffffffffffffffffffffffffffffffffffff16146118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790613a96565b60405180910390fd5b6000600360006101000a81548160ff0219169083151502179055506001905090565b6000801515600360009054906101000a900460ff16151514611939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193090613a16565b60405180910390fd5b6000611943611dd4565b11611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a906139f6565b60405180910390fd5b6000600580549050116119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290613ad6565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660058281548110611a60577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf90613976565b60405180910390fd5b611af0611dd4565b4211611b00576000915050611b6a565b611b66611b0c82611e3c565b60058381548110611b46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160010154611dde90919063ffffffff16565b9150505b90565b6000611b77611dcc565b73ffffffffffffffffffffffffffffffffffffffff16611b9561160a565b73ffffffffffffffffffffffffffffffffffffffff1614611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be290613a96565b60405180910390fd5b6000805b600580549050811015611ccc57611cb760058281548110611c39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160010154611ca960058481548110611c88577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015485611dde90919063ffffffff16565b611dde90919063ffffffff16565b91508080611cc490613efc565b915050611bef565b508091505090565b611cdc611dcc565b73ffffffffffffffffffffffffffffffffffffffff16611cfa61160a565b73ffffffffffffffffffffffffffffffffffffffff1614611d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4790613a96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db7906138d6565b60405180910390fd5b611dc9816125d7565b50565b600033905090565b6000600854905090565b6000808284611ded9190613d3b565b905083811015611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2990613916565b60405180910390fd5b8091505092915050565b600080611e9460058481548110611e7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016005015442612002565b90506000611ef68260058681548110611ed6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016004015461208f90919063ffffffff16565b9050611f00612b58565b421115611f565760058481548110611f41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015490505b60058481548110611f90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020154811115611ff85760058481548110611fe3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015490505b8092505050919050565b6000828211612014576000905061203f565b61203c6201518061202e858561204590919063ffffffff16565b612b6290919063ffffffff16565b90505b92915050565b600061208783836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f7700815250612bac565b905092915050565b6000808314156120a25760009050612104565b600082846120b09190613dc2565b90508284826120bf9190613d91565b146120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f690613a56565b60405180910390fd5b809150505b92915050565b61218b8363a9059cbb60e01b84846040516024016121299291906137cf565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612c10565b505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506005818154811061220e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a490613c16565b60405180910390fd5b61236a600582815481106122ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015461235c60058481548110612339577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015460025461204590919063ffffffff16565b61204590919063ffffffff16565b6002819055506000600582815481106123ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060058281548110612437577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160040181905550600060058281548110612488577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060060201600501819055506000600582815481106124d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016003018190555060006005828154811061252a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001018190555060006005828154811061257b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020181905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600580549050111561281957600081111561273c576000612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272e906139b6565b60405180910390fd5b612818565b6005600081548110612777577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280e906139b6565b60405180910390fd5b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612889576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612880906139d6565b60405180910390fd5b600082116128cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c390613b36565b60405180910390fd5b6128d4612cd7565b6128e983600254611dde90919063ffffffff16565b111561292a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292190613936565b60405180910390fd5b6000612944612937612ce1565b61293f612b58565b612002565b905060008111612989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298090613bf6565b60405180910390fd5b60006129b860646129aa61299b612ceb565b8761208f90919063ffffffff16565b612b6290919063ffffffff16565b905060006129cf828661204590919063ffffffff16565b905060006129e68483612b6290919063ffffffff16565b905060056040518060c001604052808973ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001888152602001838152602001612a31612ce1565b815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501555050612af1600160058054905061204590919063ffffffff16565b600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612b4986600254611dde90919063ffffffff16565b60028190555050505050505050565b6000600a54905090565b6000612ba483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cf5565b905092915050565b6000838311158290612bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612beb9190613874565b60405180910390fd5b5060008385612c039190613e1c565b9050809150509392505050565b6000612c72826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d589092919063ffffffff16565b9050600081511115612cd25780806020019051810190612c929190613183565b612cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc890613bb6565b60405180910390fd5b5b505050565b6000600654905090565b6000600954905090565b6000600754905090565b60008083118290612d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d339190613874565b60405180910390fd5b5060008385612d4b9190613d91565b9050809150509392505050565b6060612d678484600085612d70565b90509392505050565b606082471015612db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dac90613996565b60405180910390fd5b612dbe85612e84565b612dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df490613b56565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e26919061379d565b60006040518083038185875af1925050503d8060008114612e63576040519150601f19603f3d011682016040523d82523d6000602084013e612e68565b606091505b5091509150612e78828286612e97565b92505050949350505050565b600080823b905060008111915050919050565b60608315612ea757829050612ef7565b600083511115612eba5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eee9190613874565b60405180910390fd5b9392505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000612f40612f3b84613cb1565b613c8c565b90508083825260208201905082856020860282011115612f5f57600080fd5b60005b85811015612f8f5781612f758882613005565b845260208401935060208301925050600181019050612f62565b5050509392505050565b6000612fac612fa784613cdd565b613c8c565b90508083825260208201905082856020860282011115612fcb57600080fd5b60005b85811015612ffb5781612fe18882613083565b845260208401935060208301925050600181019050612fce565b5050509392505050565b60008135905061301481614737565b92915050565b600082601f83011261302b57600080fd5b813561303b848260208601612f2d565b91505092915050565b600082601f83011261305557600080fd5b8135613065848260208601612f99565b91505092915050565b60008151905061307d8161474e565b92915050565b60008135905061309281614765565b92915050565b6000815190506130a781614765565b92915050565b6000602082840312156130bf57600080fd5b60006130cd84828501613005565b91505092915050565b6000602082840312156130e857600080fd5b600082013567ffffffffffffffff81111561310257600080fd5b61310e8482850161301a565b91505092915050565b6000806040838503121561312a57600080fd5b600083013567ffffffffffffffff81111561314457600080fd5b6131508582860161301a565b925050602083013567ffffffffffffffff81111561316d57600080fd5b61317985828601613044565b9150509250929050565b60006020828403121561319557600080fd5b60006131a38482850161306e565b91505092915050565b6000602082840312156131be57600080fd5b60006131cc84828501613083565b91505092915050565b6000602082840312156131e757600080fd5b60006131f584828501613098565b91505092915050565b600080600080600060a0868803121561321657600080fd5b600061322488828901613083565b955050602061323588828901613083565b945050604061324688828901613083565b935050606061325788828901613083565b925050608061326888828901613083565b9150509295509295909350565b61327e81613e50565b82525050565b61328d81613e62565b82525050565b600061329e82613d09565b6132a88185613d1f565b93506132b8818560208601613e98565b80840191505092915050565b60006132cf82613d14565b6132d98185613d2a565b93506132e9818560208601613e98565b6132f281613fd2565b840191505092915050565b600061330a603783613d2a565b915061331582613fe3565b604082019050919050565b600061332d601683613d2a565b915061333882614032565b602082019050919050565b6000613350602683613d2a565b915061335b8261405b565b604082019050919050565b6000613373602283613d2a565b915061337e826140aa565b604082019050919050565b6000613396601b83613d2a565b91506133a1826140f9565b602082019050919050565b60006133b9604083613d2a565b91506133c482614122565b604082019050919050565b60006133dc601b83613d2a565b91506133e782614171565b602082019050919050565b60006133ff601283613d2a565b915061340a8261419a565b602082019050919050565b6000613422602683613d2a565b915061342d826141c3565b604082019050919050565b6000613445601883613d2a565b915061345082614212565b602082019050919050565b6000613468602283613d2a565b91506134738261423b565b604082019050919050565b600061348b601d83613d2a565b91506134968261428a565b602082019050919050565b60006134ae601f83613d2a565b91506134b9826142b3565b602082019050919050565b60006134d1602483613d2a565b91506134dc826142dc565b604082019050919050565b60006134f4602183613d2a565b91506134ff8261432b565b604082019050919050565b6000613517602b83613d2a565b91506135228261437a565b604082019050919050565b600061353a602083613d2a565b9150613545826143c9565b602082019050919050565b600061355d602383613d2a565b9150613568826143f2565b604082019050919050565b6000613580601483613d2a565b915061358b82614441565b602082019050919050565b60006135a3603283613d2a565b91506135ae8261446a565b604082019050919050565b60006135c6605483613d2a565b91506135d1826144b9565b606082019050919050565b60006135e9601583613d2a565b91506135f48261452e565b602082019050919050565b600061360c601d83613d2a565b915061361782614557565b602082019050919050565b600061362f602f83613d2a565b915061363a82614580565b604082019050919050565b6000613652604483613d2a565b915061365d826145cf565b606082019050919050565b6000613675602a83613d2a565b915061368082614644565b604082019050919050565b6000613698601f83613d2a565b91506136a382614693565b602082019050919050565b60006136bb601d83613d2a565b91506136c6826146bc565b602082019050919050565b60006136de601f83613d2a565b91506136e9826146e5565b602082019050919050565b6000613701601983613d2a565b915061370c8261470e565b602082019050919050565b60a08201600082015161372d600085018261377f565b506020820151613740602085018261377f565b506040820151613753604085018261377f565b506060820151613766606085018261377f565b506080820151613779608085018261377f565b50505050565b61378881613e8e565b82525050565b61379781613e8e565b82525050565b60006137a98284613293565b915081905092915050565b60006020820190506137c96000830184613275565b92915050565b60006040820190506137e46000830185613275565b6137f1602083018461378e565b9392505050565b600060c08201905061380d6000830189613275565b61381a602083018861378e565b613827604083018761378e565b613834606083018661378e565b613841608083018561378e565b61384e60a083018461378e565b979650505050505050565b600060208201905061386e6000830184613284565b92915050565b6000602082019050818103600083015261388e81846132c4565b905092915050565b600060208201905081810360008301526138af816132fd565b9050919050565b600060208201905081810360008301526138cf81613320565b9050919050565b600060208201905081810360008301526138ef81613343565b9050919050565b6000602082019050818103600083015261390f81613366565b9050919050565b6000602082019050818103600083015261392f81613389565b9050919050565b6000602082019050818103600083015261394f816133ac565b9050919050565b6000602082019050818103600083015261396f816133cf565b9050919050565b6000602082019050818103600083015261398f816133f2565b9050919050565b600060208201905081810360008301526139af81613415565b9050919050565b600060208201905081810360008301526139cf81613438565b9050919050565b600060208201905081810360008301526139ef8161345b565b9050919050565b60006020820190508181036000830152613a0f8161347e565b9050919050565b60006020820190508181036000830152613a2f816134a1565b9050919050565b60006020820190508181036000830152613a4f816134c4565b9050919050565b60006020820190508181036000830152613a6f816134e7565b9050919050565b60006020820190508181036000830152613a8f8161350a565b9050919050565b60006020820190508181036000830152613aaf8161352d565b9050919050565b60006020820190508181036000830152613acf81613550565b9050919050565b60006020820190508181036000830152613aef81613573565b9050919050565b60006020820190508181036000830152613b0f81613596565b9050919050565b60006020820190508181036000830152613b2f816135b9565b9050919050565b60006020820190508181036000830152613b4f816135dc565b9050919050565b60006020820190508181036000830152613b6f816135ff565b9050919050565b60006020820190508181036000830152613b8f81613622565b9050919050565b60006020820190508181036000830152613baf81613645565b9050919050565b60006020820190508181036000830152613bcf81613668565b9050919050565b60006020820190508181036000830152613bef8161368b565b9050919050565b60006020820190508181036000830152613c0f816136ae565b9050919050565b60006020820190508181036000830152613c2f816136d1565b9050919050565b60006020820190508181036000830152613c4f816136f4565b9050919050565b600060a082019050613c6b6000830184613717565b92915050565b6000602082019050613c86600083018461378e565b92915050565b6000613c96613ca7565b9050613ca28282613ecb565b919050565b6000604051905090565b600067ffffffffffffffff821115613ccc57613ccb613fa3565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613cf857613cf7613fa3565b5b602082029050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000613d4682613e8e565b9150613d5183613e8e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d8657613d85613f45565b5b828201905092915050565b6000613d9c82613e8e565b9150613da783613e8e565b925082613db757613db6613f74565b5b828204905092915050565b6000613dcd82613e8e565b9150613dd883613e8e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e1157613e10613f45565b5b828202905092915050565b6000613e2782613e8e565b9150613e3283613e8e565b925082821015613e4557613e44613f45565b5b828203905092915050565b6000613e5b82613e6e565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015613eb6578082015181840152602081019050613e9b565b83811115613ec5576000848401525b50505050565b613ed482613fd2565b810181811067ffffffffffffffff82111715613ef357613ef2613fa3565b5b80604052505050565b6000613f0782613e8e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f3a57613f39613f45565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f56657374696e6720456e642074696d652063616e6e6f74206265206561726c6960008201527f6572207468616e20436c69666620456e642074696d652e000000000000000000602082015250565b7f41727261792063616e6e6f7420626520656d7074792e00000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5468657265206973206e6f2062616c616e6365206c65667420746f20636c616960008201527f6d2e000000000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f43616e6e6f74206164642074686973206465627420616d6f756e74206475652060008201527f746f207468652062616c616e6365206f66207468697320436f6e74726163742e602082015250565b7f436c61696d2072657175657374206973206e6f742076616c69642e0000000000600082015250565b7f52657175657374206e6f742076616c69642e0000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4164647265737320616c726561647920696e206c6973742e0000000000000000600082015250565b7f526563697069656e7420616464726573732063616e6e6f7420626520656d707460008201527f792e000000000000000000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206e6f7420696e697469616c697a6564207965742e000000600082015250565b7f436f6e747261637420697320696e2073757370656e6465642073746174652e00600082015250565b7f5447452074696d652063616e6e6f74206265206561726c696572207468616e2060008201527f6e6f772e00000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f5468657265206973206e6f2062616c616e636520746f20636c61696d2061742060008201527f746865206d6f6d656e742e000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e7472616374206973206e6f7420696e2073757370656e6465642073746160008201527f74652e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20726563697069656e747320666f756e642e000000000000000000000000600082015250565b7f496e697469616c20436f6e74726163742042616c616e63652073686f756c642060008201527f62652067726561746572207468616e20302e0000000000000000000000000000602082015250565b7f436f6e747261637420616c72656164792068617320746f6b656e7320616e642060008201527f54474520616c7265616479207365742e2043616e6e6f74206368616e6765206460208201527f617465732061742074686973206d6f6d656e742e000000000000000000000000604082015250565b7f546f6b656e20616d6f756e7420696e76616c69642e0000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f436c69666620456e642074696d652063616e6e6f74206265206561726c69657260008201527f207468616e205447452074696d652e0000000000000000000000000000000000602082015250565b7f54474520556e6c6f636b2050657263656e746167652063616e6e6f742062652060008201527f67726561746572207468616e20323025207065722048654320546f6b656e6f6d60208201527f6963732e00000000000000000000000000000000000000000000000000000000604082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f556e65787065637465642076657374696e672064617920636f756e742e000000600082015250565b7f526563697069656e7420696e64657820646f6573206e6f74206d617463682e00600082015250565b7f41727261792073697a657320646f206e6f74206d617463682e00000000000000600082015250565b61474081613e50565b811461474b57600080fd5b50565b61475781613e62565b811461476257600080fd5b50565b61476e81613e8e565b811461477957600080fd5b5056fea2646970667358221220afb3d1e7ed8ab6c70838c11ae9ddc703845575ccf6284d934275b7f51d24e0f764736f6c63430008020033000000000000000000000000c7f4debc8072e23fe9259a5c0398326d8efb7f5c
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c7f4debc8072e23fe9259a5c0398326d8efb7f5c
-----Decoded View---------------
Arg [0] : _hec (address): 0xc7f4debc8072e23fe9259a5c0398326d8efb7f5c
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c7f4debc8072e23fe9259a5c0398326d8efb7f5c
Deployed ByteCode Sourcemap
38316:3716:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40703:1326;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37623:121;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37398:139;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27407:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28568:1616;;;:::i;:::-;;36984:118;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36611:262;;;:::i;:::-;;36179:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27303:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16967:103;;;:::i;:::-;;27464:27;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;39326:499;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16316:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35594:463;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37198:119;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30281:610;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37824:337;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17225:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40703:1326;40908:4;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40933:7:::1;;;;;;;;;;;40925:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41025:1;40999:23;:27;40991:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;41124:2;41100:20;:26;;41092:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;41231:1;41214:14;;:18;41210:193;;;41301:1;41265:3;41257:23;;;41290:4;41257:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;41249:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;41210:193;41446:15;41421:13;:41;;41413:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;41544:13;41522:18;:35;;41514:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41652:18;41628:20;:42;;41620:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;41760:13;41743:14;:30;;;;41807:18;41784:20;:41;;;;41861:20;41836:22;:45;;;;41919:23;41892:24;:50;;;;41977:20;41953:21;:44;;;;42017:4;42010:11;;40703:1326:::0;;;;;;;:::o;37623:121::-;37679:4;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37697:8:::1;37708:7;;;;;;;;;;;37697:18;;37733:3;37726:10;;;37623:121:::0;:::o;37398:139::-;37462:7;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37497:3:::1;37489:23;;;37522:4;37489:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37482:47;;37398:139:::0;:::o;27407:50::-;;;;;;;;;;;;;;;;;:::o;28568:1616::-;25873:1;26471:7;;:19;;26463:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;25873:1;26604:7;:18;;;;28637:5:::1;28626:16;;:7;;;;;;;;;;;:16;;;28618:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28717:1;28697:17;:15;:17::i;:::-;:21;28689:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28788:1;28771:7;:14;;;;:18;28763:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;28860:17;:15;:17::i;:::-;28841:15;28833:44;28825:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28913:13;28929;:25;28943:10;28929:25;;;;;;;;;;;;;;;;28913:41;;29003:10;28973:40;;:7;28982:5;28973:16;;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;:40;;;28965:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;29137:1;29064:70;29100:7;29109:5;29100:16;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;29064:7;29073:5;29064:16;;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;:34;;:70;;;;:::i;:::-;:74;29056:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;29198:30;29231:43;29267:5;29231:34;:43::i;:::-;29198:76;;29285:26;29314:7;29323:5;29314:16;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;29285:61;;29357:24;29384:46;29411:18;29384:22;:26;;:46;;;;:::i;:::-;29357:73;;29471:1;29452:16;:20;29443:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;29533:23;29559:89;29585:7;29594:5;29585:16;;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;29630:15;29559:24;:89::i;:::-;29533:115;;29694:60;29730:22;29694:7;29703:5;29694:16;;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;:34;;:60;;;;:::i;:::-;29661:7;29670:5;29661:16;;;;;;;;;;;;;;;;;;;;;;;;;;:30;;:93;;;;29800:58;29838:18;29800:7;29809:5;29800:16;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;:36;;:58;;;;:::i;:::-;29765:7;29774:5;29765:16;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;:93;;;;29907:81;29948:38;27145:12;29948:15;:19;;:38;;;;:::i;:::-;29907:7;29916:5;29907:16;;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;:39;;:81;;;;:::i;:::-;29869:7;29878:5;29869:16;;;;;;;;;;;;;;;;;;;;;;;;;;:35;;:119;;;;30013:33;30028:16;30013:9;;:13;;:33;;;;:::i;:::-;30001:9;:45;;;;30059:56;30086:10;30098:16;30067:3;30059:26;;;;:56;;;;;:::i;:::-;30146:10;30131:45;;;30158:16;30131:45;;;;;;:::i;:::-;;;;;;;;26635:1;;;;;25829::::0;26783:7;:22;;;;28568:1616::o;36984:118::-;37041:4;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37068:4:::1;37058:7;;:14;;;;;;;;;;;;;;;;;;37090:4;37083:11;;36984:118:::0;:::o;36611:262::-;25873:1;26471:7;;:19;;26463:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;25873:1;26604:7;:18;;;;16547:12:::1;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36693:7:::2;;;;;;;;;;;36685:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36753:13;36777:3;36769:23;;;36802:4;36769:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36753:56;;36820:45;36847:10;36859:5;36828:3;36820:26;;;;:45;;;;;:::i;:::-;16607:1;25829::::0;26783:7;:22;;;;36611:262::o;36179:327::-;36276:4;25873:1;26471:7;;:19;;26463:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;25873:1;26604:7;:18;;;;16547:12:::1;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36323:1:::2;36302:11;:18;:22;36293:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36369:9;36364:111;36388:11;:18;36384:1;:22;36364:111;;;36429:34;36447:11;36459:1;36447:14;;;;;;;;;;;;;;;;;;;;;;36429:16;:34::i;:::-;36408:3;;;;;:::i;:::-;;;;36364:111;;;;36494:4;36487:11;;25829:1:::0;26783:7;:22;;;;36179:327;;;:::o;27303:28::-;;;:::o;16967:103::-;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17032:30:::1;17059:1;17032:18;:30::i;:::-;16967:103::o:0;27464:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39326:499::-;39387:19;;:::i;:::-;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39420:23:::1;39446:340;;;;;;;;39496:14;;39446:340;;;;39552:20;;39446:340;;;;39616:22;;39446:340;;;;39682:21;;39446:340;;;;39750:24;;39446:340;;::::0;39420:366:::1;;39814:3;39807:10;;;39326:499:::0;:::o;16316:87::-;16362:7;16389:6;;;;;;;;;;;16382:13;;16316:87;:::o;35594:463::-;35720:4;25873:1;26471:7;;:19;;26463:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;25873:1;26604:7;:18;;;;16547:12:::1;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35768:13:::2;:20;35746:11;:18;:42;35737:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35859:1;35838:11;:18;:22;35829:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35905:9;35900:126;35924:11;:18;35920:1;:22;35900:126;;;35965:49;35980:11;35992:1;35980:14;;;;;;;;;;;;;;;;;;;;;;35996:13;36010:1;35996:16;;;;;;;;;;;;;;;;;;;;;;35965:13;:49::i;:::-;35944:3;;;;;:::i;:::-;;;;35900:126;;;;36045:4;36038:11;;25829:1:::0;26783:7;:22;;;;35594:463;;;;:::o;37198:119::-;37254:4;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37282:5:::1;37272:7;;:15;;;;;;;;;;;;;;;;;;37305:4;37298:11;;37198:119:::0;:::o;30281:610::-;30325:7;30364:5;30353:16;;:7;;;;;;;;;;;:16;;;30345:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;30444:1;30424:17;:15;:17::i;:::-;:21;30416:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;30515:1;30498:7;:14;;;;:18;30490:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;30554:13;30570;:27;30585:10;30570:27;;;;;;;;;;;;;;;;30554:43;;30662:10;30632:40;;:7;30641:5;30632:16;;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;:40;;;30624:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30740:17;:15;:17::i;:::-;30720:15;30712:45;30708:72;;30779:1;30772:8;;;;;30708:72;30800:83;30838:43;30874:5;30838:34;:43::i;:::-;30800:7;30809:5;30800:16;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;:36;;:83;;;;:::i;:::-;30793:90;;;30281:610;;:::o;37824:337::-;37885:7;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37905:24:::1;37949:9:::0;37944:174:::1;37968:7;:14;;;;37964:1;:18;37944:174;;;38024:82;38078:7;38086:1;38078:10;;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;38024:48;38046:7;38054:1;38046:10;;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;38024:16;:20;;:48;;;;:::i;:::-;:52;;:82;;;;:::i;:::-;38005:101;;37984:3;;;;;:::i;:::-;;;;37944:174;;;;38137:16;38130:23;;;37824:337:::0;:::o;17225:201::-;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17334:1:::1;17314:22;;:8;:22;;;;17306:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17390:28;17409:8;17390:18;:28::i;:::-;17225:201:::0;:::o;15183:98::-;15236:7;15263:10;15256:17;;15183:98;:::o;39841:107::-;39899:7;39926:14;;39919:21;;39841:107;:::o;18608:181::-;18666:7;18686:9;18702:1;18698;:5;;;;:::i;:::-;18686:17;;18727:1;18722;:6;;18714:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;18780:1;18773:8;;;18608:181;;;;:::o;31039:1248::-;31123:7;31636:23;31662:90;31688:7;31697:6;31688:17;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;31734:15;31662:24;:90::i;:::-;31636:116;;31763:30;31796:60;31839:15;31796:7;31805:6;31796:17;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;:41;;:60;;;;:::i;:::-;31763:93;;31983:24;:22;:24::i;:::-;31964:15;31956:51;31952:126;;;32047:7;32056:6;32047:17;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;32022:56;;31952:126;32121:7;32130:6;32121:17;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;32096:22;:56;32091:147;;;32195:7;32204:6;32195:17;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;32170:56;;32091:147;32257:22;32250:29;;;;31039:1248;;;:::o;32445:244::-;32543:7;32580:11;32567:9;:24;32563:51;;32613:1;32606:8;;;;32563:51;32634:47;27145:12;32634:26;32648:11;32634:9;:13;;:26;;;;:::i;:::-;:30;;:47;;;;:::i;:::-;32627:54;;32445:244;;;;;:::o;19501:137::-;19559:7;19586:44;19590:1;19593;19586:44;;;;;;;;;;;;;;;;;:3;:44::i;:::-;19579:51;;19501:137;;;;:::o;20362:471::-;20420:7;20670:1;20665;:6;20661:47;;;20695:1;20688:8;;;;20661:47;20720:9;20736:1;20732;:5;;;;:::i;:::-;20720:17;;20765:1;20760;20756;:5;;;;:::i;:::-;:10;20748:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;20824:1;20817:8;;;20362:471;;;;;:::o;11344:211::-;11461:86;11481:5;11511:23;;;11536:2;11540:5;11488:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11461:19;:86::i;:::-;11344:211;;;:::o;34757:675::-;34824:14;34841:13;:27;34856:10;34841:27;;;;;;;;;;;;;;;;34824:44;;34902:7;34911:6;34902:17;;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;34888:41;;:10;:41;;;34879:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34991:89;35045:7;35054:6;35045:17;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;34991:48;35006:7;35015:6;35006:17;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;34991:9;;:13;;:48;;;;:::i;:::-;:52;;:89;;;;:::i;:::-;34979:9;:101;;;;35131:1;35093:7;35102:6;35093:17;;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;:40;;;;;;;;;;;;;;;;;;35184:1;35144:7;35153:6;35144:17;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;:41;;;;35235:1;35196:7;35205:6;35196:17;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;:40;;;;35282:1;35247:7;35256:6;35247:17;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;:36;;;;35330:1;35294:7;35303:6;35294:17;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:37;;;;35376:1;35342:7;35351:6;35342:17;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;:35;;;;35397:13;:27;35412:10;35397:27;;;;;;;;;;;;;;;35390:34;;;34757:675;;:::o;17586:191::-;17660:16;17679:6;;;;;;;;;;;17660:25;;17705:8;17696:6;;:17;;;;;;;;;;;;;;;;;;17760:8;17729:40;;17750:8;17729:40;;;;;;;;;;;;17586:191;;:::o;32837:1809::-;32923:13;32939;:27;32954:10;32939:27;;;;;;;;;;;;;;;;32923:43;;32998:1;32981:7;:14;;;;:18;32977:317;;;33028:1;33020:5;:9;33016:267;;;33071:5;33063:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;33016:267;;;33218:7;33226:1;33218:10;;;;;;;;;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;33204:34;;:10;:34;;;;33196:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33016:267;32977:317;33337:1;33315:24;;:10;:24;;;;33306:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33414:1;33399:12;:16;33390:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;33492:27;:25;:27::i;:::-;33461;33475:12;33461:9;;:13;;:27;;;;:::i;:::-;:58;;33453:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;33609:23;33635:76;33661:22;:20;:22::i;:::-;33685:24;:22;:24::i;:::-;33635;:76::i;:::-;33609:102;;33860:1;33842:15;:19;33834:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33908:24;33935:51;33982:3;33935:42;33952:24;:22;:24::i;:::-;33935:12;:16;;:42;;;;:::i;:::-;:46;;:51;;;;:::i;:::-;33908:78;;33998:22;34023:34;34040:16;34023:12;:16;;:34;;;;:::i;:::-;33998:59;;34077:28;34108:35;34127:15;34108:14;:18;;:35;;;;:::i;:::-;34077:66;;34156:7;34170:355;;;;;;;;34215:10;34170:355;;;;;;34265:16;34170:355;;;;34319:14;34170:355;;;;34372:12;34170:355;;;;34428:20;34170:355;;;;34491:22;:20;:22::i;:::-;34170:355;;;34156:370;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34567:21;34586:1;34567:7;:14;;;;:18;;:21;;;;:::i;:::-;34539:13;:25;34553:10;34539:25;;;;;;;;;;;;;;;:49;;;;34611:27;34625:12;34611:9;;:13;;:27;;;;:::i;:::-;34599:9;:39;;;;32837:1809;;;;;;;:::o;40216:121::-;40281:7;40307:22;;40300:29;;40216:121;:::o;22020:132::-;22078:7;22105:39;22109:1;22112;22105:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;22098:46;;22020:132;;;;:::o;19927:192::-;20013:7;20046:1;20041;:6;;20049:12;20033:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20073:9;20089:1;20085;:5;;;;:::i;:::-;20073:17;;20110:1;20103:8;;;19927:192;;;;;:::o;13917:716::-;14341:23;14367:69;14395:4;14367:69;;;;;;;;;;;;;;;;;14375:5;14367:27;;;;:69;;;;;:::i;:::-;14341:95;;14471:1;14451:10;:17;:21;14447:179;;;14548:10;14537:30;;;;;;;;;;;;:::i;:::-;14529:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14447:179;13917:716;;;:::o;39956:127::-;40024:7;40051:24;;40044:31;;39956:127;:::o;40091:117::-;40154:7;40180:20;;40173:27;;40091:117;:::o;40345:120::-;40410:7;40436:21;;40429:28;;40345:120;:::o;22640:345::-;22726:7;22825:1;22821;:5;22828:12;22813:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22852:9;22868:1;22864;:5;;;;:::i;:::-;22852:17;;22976:1;22969:8;;;22640:345;;;;;:::o;6293:229::-;6430:12;6462:52;6484:6;6492:4;6498:1;6501:12;6462:21;:52::i;:::-;6455:59;;6293:229;;;;;:::o;7413:510::-;7583:12;7641:5;7616:21;:30;;7608:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;7708:18;7719:6;7708:10;:18::i;:::-;7700:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;7774:12;7788:23;7815:6;:11;;7834:5;7841:4;7815:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7773:73;;;;7864:51;7881:7;7890:10;7902:12;7864:16;:51::i;:::-;7857:58;;;;7413:510;;;;;;:::o;3487:387::-;3547:4;3755:12;3822:7;3810:20;3802:28;;3865:1;3858:4;:8;3851:15;;;3487:387;;;:::o;10099:712::-;10249:12;10278:7;10274:530;;;10309:10;10302:17;;;;10274:530;10443:1;10423:10;:17;:21;10419:374;;;10621:10;10615:17;10682:15;10669:10;10665:2;10661:19;10654:44;10569:148;10764:12;10757:20;;;;;;;;;;;:::i;:::-;;;;;;;;10099:712;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24:623:1:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;670:623::-;;791:81;807:64;864:6;807:64;:::i;:::-;791:81;:::i;:::-;782:90;;892:5;920:6;913:5;906:21;946:4;939:5;935:16;928:23;;971:6;1021:3;1013:4;1005:6;1001:17;996:3;992:27;989:36;986:2;;;1038:1;1035;1028:12;986:2;1066:1;1051:236;1076:6;1073:1;1070:13;1051:236;;;1143:3;1171:37;1204:3;1192:10;1171:37;:::i;:::-;1166:3;1159:50;1238:4;1233:3;1229:14;1222:21;;1272:4;1267:3;1263:14;1256:21;;1111:176;1098:1;1095;1091:9;1086:14;;1051:236;;;1055:14;772:521;;;;;;;:::o;1299:139::-;;1383:6;1370:20;1361:29;;1399:33;1426:5;1399:33;:::i;:::-;1351:87;;;;:::o;1461:303::-;;1581:3;1574:4;1566:6;1562:17;1558:27;1548:2;;1599:1;1596;1589:12;1548:2;1639:6;1626:20;1664:94;1754:3;1746:6;1739:4;1731:6;1727:17;1664:94;:::i;:::-;1655:103;;1538:226;;;;;:::o;1787:303::-;;1907:3;1900:4;1892:6;1888:17;1884:27;1874:2;;1925:1;1922;1915:12;1874:2;1965:6;1952:20;1990:94;2080:3;2072:6;2065:4;2057:6;2053:17;1990:94;:::i;:::-;1981:103;;1864:226;;;;;:::o;2096:137::-;;2181:6;2175:13;2166:22;;2197:30;2221:5;2197:30;:::i;:::-;2156:77;;;;:::o;2239:139::-;;2323:6;2310:20;2301:29;;2339:33;2366:5;2339:33;:::i;:::-;2291:87;;;;:::o;2384:143::-;;2472:6;2466:13;2457:22;;2488:33;2515:5;2488:33;:::i;:::-;2447:80;;;;:::o;2533:262::-;;2641:2;2629:9;2620:7;2616:23;2612:32;2609:2;;;2657:1;2654;2647:12;2609:2;2700:1;2725:53;2770:7;2761:6;2750:9;2746:22;2725:53;:::i;:::-;2715:63;;2671:117;2599:196;;;;:::o;2801:405::-;;2934:2;2922:9;2913:7;2909:23;2905:32;2902:2;;;2950:1;2947;2940:12;2902:2;3021:1;3010:9;3006:17;2993:31;3051:18;3043:6;3040:30;3037:2;;;3083:1;3080;3073:12;3037:2;3111:78;3181:7;3172:6;3161:9;3157:22;3111:78;:::i;:::-;3101:88;;2964:235;2892:314;;;;:::o;3212:693::-;;;3387:2;3375:9;3366:7;3362:23;3358:32;3355:2;;;3403:1;3400;3393:12;3355:2;3474:1;3463:9;3459:17;3446:31;3504:18;3496:6;3493:30;3490:2;;;3536:1;3533;3526:12;3490:2;3564:78;3634:7;3625:6;3614:9;3610:22;3564:78;:::i;:::-;3554:88;;3417:235;3719:2;3708:9;3704:18;3691:32;3750:18;3742:6;3739:30;3736:2;;;3782:1;3779;3772:12;3736:2;3810:78;3880:7;3871:6;3860:9;3856:22;3810:78;:::i;:::-;3800:88;;3662:236;3345:560;;;;;:::o;3911:278::-;;4027:2;4015:9;4006:7;4002:23;3998:32;3995:2;;;4043:1;4040;4033:12;3995:2;4086:1;4111:61;4164:7;4155:6;4144:9;4140:22;4111:61;:::i;:::-;4101:71;;4057:125;3985:204;;;;:::o;4195:262::-;;4303:2;4291:9;4282:7;4278:23;4274:32;4271:2;;;4319:1;4316;4309:12;4271:2;4362:1;4387:53;4432:7;4423:6;4412:9;4408:22;4387:53;:::i;:::-;4377:63;;4333:117;4261:196;;;;:::o;4463:284::-;;4582:2;4570:9;4561:7;4557:23;4553:32;4550:2;;;4598:1;4595;4588:12;4550:2;4641:1;4666:64;4722:7;4713:6;4702:9;4698:22;4666:64;:::i;:::-;4656:74;;4612:128;4540:207;;;;:::o;4753:844::-;;;;;;4929:3;4917:9;4908:7;4904:23;4900:33;4897:2;;;4946:1;4943;4936:12;4897:2;4989:1;5014:53;5059:7;5050:6;5039:9;5035:22;5014:53;:::i;:::-;5004:63;;4960:117;5116:2;5142:53;5187:7;5178:6;5167:9;5163:22;5142:53;:::i;:::-;5132:63;;5087:118;5244:2;5270:53;5315:7;5306:6;5295:9;5291:22;5270:53;:::i;:::-;5260:63;;5215:118;5372:2;5398:53;5443:7;5434:6;5423:9;5419:22;5398:53;:::i;:::-;5388:63;;5343:118;5500:3;5527:53;5572:7;5563:6;5552:9;5548:22;5527:53;:::i;:::-;5517:63;;5471:119;4887:710;;;;;;;;:::o;5603:118::-;5690:24;5708:5;5690:24;:::i;:::-;5685:3;5678:37;5668:53;;:::o;5727:109::-;5808:21;5823:5;5808:21;:::i;:::-;5803:3;5796:34;5786:50;;:::o;5842:373::-;;5974:38;6006:5;5974:38;:::i;:::-;6028:88;6109:6;6104:3;6028:88;:::i;:::-;6021:95;;6125:52;6170:6;6165:3;6158:4;6151:5;6147:16;6125:52;:::i;:::-;6202:6;6197:3;6193:16;6186:23;;5950:265;;;;;:::o;6221:364::-;;6337:39;6370:5;6337:39;:::i;:::-;6392:71;6456:6;6451:3;6392:71;:::i;:::-;6385:78;;6472:52;6517:6;6512:3;6505:4;6498:5;6494:16;6472:52;:::i;:::-;6549:29;6571:6;6549:29;:::i;:::-;6544:3;6540:39;6533:46;;6313:272;;;;;:::o;6591:366::-;;6754:67;6818:2;6813:3;6754:67;:::i;:::-;6747:74;;6830:93;6919:3;6830:93;:::i;:::-;6948:2;6943:3;6939:12;6932:19;;6737:220;;;:::o;6963:366::-;;7126:67;7190:2;7185:3;7126:67;:::i;:::-;7119:74;;7202:93;7291:3;7202:93;:::i;:::-;7320:2;7315:3;7311:12;7304:19;;7109:220;;;:::o;7335:366::-;;7498:67;7562:2;7557:3;7498:67;:::i;:::-;7491:74;;7574:93;7663:3;7574:93;:::i;:::-;7692:2;7687:3;7683:12;7676:19;;7481:220;;;:::o;7707:366::-;;7870:67;7934:2;7929:3;7870:67;:::i;:::-;7863:74;;7946:93;8035:3;7946:93;:::i;:::-;8064:2;8059:3;8055:12;8048:19;;7853:220;;;:::o;8079:366::-;;8242:67;8306:2;8301:3;8242:67;:::i;:::-;8235:74;;8318:93;8407:3;8318:93;:::i;:::-;8436:2;8431:3;8427:12;8420:19;;8225:220;;;:::o;8451:366::-;;8614:67;8678:2;8673:3;8614:67;:::i;:::-;8607:74;;8690:93;8779:3;8690:93;:::i;:::-;8808:2;8803:3;8799:12;8792:19;;8597:220;;;:::o;8823:366::-;;8986:67;9050:2;9045:3;8986:67;:::i;:::-;8979:74;;9062:93;9151:3;9062:93;:::i;:::-;9180:2;9175:3;9171:12;9164:19;;8969:220;;;:::o;9195:366::-;;9358:67;9422:2;9417:3;9358:67;:::i;:::-;9351:74;;9434:93;9523:3;9434:93;:::i;:::-;9552:2;9547:3;9543:12;9536:19;;9341:220;;;:::o;9567:366::-;;9730:67;9794:2;9789:3;9730:67;:::i;:::-;9723:74;;9806:93;9895:3;9806:93;:::i;:::-;9924:2;9919:3;9915:12;9908:19;;9713:220;;;:::o;9939:366::-;;10102:67;10166:2;10161:3;10102:67;:::i;:::-;10095:74;;10178:93;10267:3;10178:93;:::i;:::-;10296:2;10291:3;10287:12;10280:19;;10085:220;;;:::o;10311:366::-;;10474:67;10538:2;10533:3;10474:67;:::i;:::-;10467:74;;10550:93;10639:3;10550:93;:::i;:::-;10668:2;10663:3;10659:12;10652:19;;10457:220;;;:::o;10683:366::-;;10846:67;10910:2;10905:3;10846:67;:::i;:::-;10839:74;;10922:93;11011:3;10922:93;:::i;:::-;11040:2;11035:3;11031:12;11024:19;;10829:220;;;:::o;11055:366::-;;11218:67;11282:2;11277:3;11218:67;:::i;:::-;11211:74;;11294:93;11383:3;11294:93;:::i;:::-;11412:2;11407:3;11403:12;11396:19;;11201:220;;;:::o;11427:366::-;;11590:67;11654:2;11649:3;11590:67;:::i;:::-;11583:74;;11666:93;11755:3;11666:93;:::i;:::-;11784:2;11779:3;11775:12;11768:19;;11573:220;;;:::o;11799:366::-;;11962:67;12026:2;12021:3;11962:67;:::i;:::-;11955:74;;12038:93;12127:3;12038:93;:::i;:::-;12156:2;12151:3;12147:12;12140:19;;11945:220;;;:::o;12171:366::-;;12334:67;12398:2;12393:3;12334:67;:::i;:::-;12327:74;;12410:93;12499:3;12410:93;:::i;:::-;12528:2;12523:3;12519:12;12512:19;;12317:220;;;:::o;12543:366::-;;12706:67;12770:2;12765:3;12706:67;:::i;:::-;12699:74;;12782:93;12871:3;12782:93;:::i;:::-;12900:2;12895:3;12891:12;12884:19;;12689:220;;;:::o;12915:366::-;;13078:67;13142:2;13137:3;13078:67;:::i;:::-;13071:74;;13154:93;13243:3;13154:93;:::i;:::-;13272:2;13267:3;13263:12;13256:19;;13061:220;;;:::o;13287:366::-;;13450:67;13514:2;13509:3;13450:67;:::i;:::-;13443:74;;13526:93;13615:3;13526:93;:::i;:::-;13644:2;13639:3;13635:12;13628:19;;13433:220;;;:::o;13659:366::-;;13822:67;13886:2;13881:3;13822:67;:::i;:::-;13815:74;;13898:93;13987:3;13898:93;:::i;:::-;14016:2;14011:3;14007:12;14000:19;;13805:220;;;:::o;14031:366::-;;14194:67;14258:2;14253:3;14194:67;:::i;:::-;14187:74;;14270:93;14359:3;14270:93;:::i;:::-;14388:2;14383:3;14379:12;14372:19;;14177:220;;;:::o;14403:366::-;;14566:67;14630:2;14625:3;14566:67;:::i;:::-;14559:74;;14642:93;14731:3;14642:93;:::i;:::-;14760:2;14755:3;14751:12;14744:19;;14549:220;;;:::o;14775:366::-;;14938:67;15002:2;14997:3;14938:67;:::i;:::-;14931:74;;15014:93;15103:3;15014:93;:::i;:::-;15132:2;15127:3;15123:12;15116:19;;14921:220;;;:::o;15147:366::-;;15310:67;15374:2;15369:3;15310:67;:::i;:::-;15303:74;;15386:93;15475:3;15386:93;:::i;:::-;15504:2;15499:3;15495:12;15488:19;;15293:220;;;:::o;15519:366::-;;15682:67;15746:2;15741:3;15682:67;:::i;:::-;15675:74;;15758:93;15847:3;15758:93;:::i;:::-;15876:2;15871:3;15867:12;15860:19;;15665:220;;;:::o;15891:366::-;;16054:67;16118:2;16113:3;16054:67;:::i;:::-;16047:74;;16130:93;16219:3;16130:93;:::i;:::-;16248:2;16243:3;16239:12;16232:19;;16037:220;;;:::o;16263:366::-;;16426:67;16490:2;16485:3;16426:67;:::i;:::-;16419:74;;16502:93;16591:3;16502:93;:::i;:::-;16620:2;16615:3;16611:12;16604:19;;16409:220;;;:::o;16635:366::-;;16798:67;16862:2;16857:3;16798:67;:::i;:::-;16791:74;;16874:93;16963:3;16874:93;:::i;:::-;16992:2;16987:3;16983:12;16976:19;;16781:220;;;:::o;17007:366::-;;17170:67;17234:2;17229:3;17170:67;:::i;:::-;17163:74;;17246:93;17335:3;17246:93;:::i;:::-;17364:2;17359:3;17355:12;17348:19;;17153:220;;;:::o;17379:366::-;;17542:67;17606:2;17601:3;17542:67;:::i;:::-;17535:74;;17618:93;17707:3;17618:93;:::i;:::-;17736:2;17731:3;17727:12;17720:19;;17525:220;;;:::o;17857:1108::-;18014:4;18009:3;18005:14;18109:4;18102:5;18098:16;18092:23;18128:63;18185:4;18180:3;18176:14;18162:12;18128:63;:::i;:::-;18029:172;18296:4;18289:5;18285:16;18279:23;18315:63;18372:4;18367:3;18363:14;18349:12;18315:63;:::i;:::-;18211:177;18485:4;18478:5;18474:16;18468:23;18504:63;18561:4;18556:3;18552:14;18538:12;18504:63;:::i;:::-;18398:179;18674:4;18667:5;18663:16;18657:23;18693:63;18750:4;18745:3;18741:14;18727:12;18693:63;:::i;:::-;18587:179;18866:4;18859:5;18855:16;18849:23;18885:63;18942:4;18937:3;18933:14;18919:12;18885:63;:::i;:::-;18776:182;17983:982;;;:::o;18971:108::-;19048:24;19066:5;19048:24;:::i;:::-;19043:3;19036:37;19026:53;;:::o;19085:118::-;19172:24;19190:5;19172:24;:::i;:::-;19167:3;19160:37;19150:53;;:::o;19209:271::-;;19361:93;19450:3;19441:6;19361:93;:::i;:::-;19354:100;;19471:3;19464:10;;19343:137;;;;:::o;19486:222::-;;19617:2;19606:9;19602:18;19594:26;;19630:71;19698:1;19687:9;19683:17;19674:6;19630:71;:::i;:::-;19584:124;;;;:::o;19714:332::-;;19873:2;19862:9;19858:18;19850:26;;19886:71;19954:1;19943:9;19939:17;19930:6;19886:71;:::i;:::-;19967:72;20035:2;20024:9;20020:18;20011:6;19967:72;:::i;:::-;19840:206;;;;;:::o;20052:775::-;;20323:3;20312:9;20308:19;20300:27;;20337:71;20405:1;20394:9;20390:17;20381:6;20337:71;:::i;:::-;20418:72;20486:2;20475:9;20471:18;20462:6;20418:72;:::i;:::-;20500;20568:2;20557:9;20553:18;20544:6;20500:72;:::i;:::-;20582;20650:2;20639:9;20635:18;20626:6;20582:72;:::i;:::-;20664:73;20732:3;20721:9;20717:19;20708:6;20664:73;:::i;:::-;20747;20815:3;20804:9;20800:19;20791:6;20747:73;:::i;:::-;20290:537;;;;;;;;;:::o;20833:210::-;;20958:2;20947:9;20943:18;20935:26;;20971:65;21033:1;21022:9;21018:17;21009:6;20971:65;:::i;:::-;20925:118;;;;:::o;21049:313::-;;21200:2;21189:9;21185:18;21177:26;;21249:9;21243:4;21239:20;21235:1;21224:9;21220:17;21213:47;21277:78;21350:4;21341:6;21277:78;:::i;:::-;21269:86;;21167:195;;;;:::o;21368:419::-;;21572:2;21561:9;21557:18;21549:26;;21621:9;21615:4;21611:20;21607:1;21596:9;21592:17;21585:47;21649:131;21775:4;21649:131;:::i;:::-;21641:139;;21539:248;;;:::o;21793:419::-;;21997:2;21986:9;21982:18;21974:26;;22046:9;22040:4;22036:20;22032:1;22021:9;22017:17;22010:47;22074:131;22200:4;22074:131;:::i;:::-;22066:139;;21964:248;;;:::o;22218:419::-;;22422:2;22411:9;22407:18;22399:26;;22471:9;22465:4;22461:20;22457:1;22446:9;22442:17;22435:47;22499:131;22625:4;22499:131;:::i;:::-;22491:139;;22389:248;;;:::o;22643:419::-;;22847:2;22836:9;22832:18;22824:26;;22896:9;22890:4;22886:20;22882:1;22871:9;22867:17;22860:47;22924:131;23050:4;22924:131;:::i;:::-;22916:139;;22814:248;;;:::o;23068:419::-;;23272:2;23261:9;23257:18;23249:26;;23321:9;23315:4;23311:20;23307:1;23296:9;23292:17;23285:47;23349:131;23475:4;23349:131;:::i;:::-;23341:139;;23239:248;;;:::o;23493:419::-;;23697:2;23686:9;23682:18;23674:26;;23746:9;23740:4;23736:20;23732:1;23721:9;23717:17;23710:47;23774:131;23900:4;23774:131;:::i;:::-;23766:139;;23664:248;;;:::o;23918:419::-;;24122:2;24111:9;24107:18;24099:26;;24171:9;24165:4;24161:20;24157:1;24146:9;24142:17;24135:47;24199:131;24325:4;24199:131;:::i;:::-;24191:139;;24089:248;;;:::o;24343:419::-;;24547:2;24536:9;24532:18;24524:26;;24596:9;24590:4;24586:20;24582:1;24571:9;24567:17;24560:47;24624:131;24750:4;24624:131;:::i;:::-;24616:139;;24514:248;;;:::o;24768:419::-;;24972:2;24961:9;24957:18;24949:26;;25021:9;25015:4;25011:20;25007:1;24996:9;24992:17;24985:47;25049:131;25175:4;25049:131;:::i;:::-;25041:139;;24939:248;;;:::o;25193:419::-;;25397:2;25386:9;25382:18;25374:26;;25446:9;25440:4;25436:20;25432:1;25421:9;25417:17;25410:47;25474:131;25600:4;25474:131;:::i;:::-;25466:139;;25364:248;;;:::o;25618:419::-;;25822:2;25811:9;25807:18;25799:26;;25871:9;25865:4;25861:20;25857:1;25846:9;25842:17;25835:47;25899:131;26025:4;25899:131;:::i;:::-;25891:139;;25789:248;;;:::o;26043:419::-;;26247:2;26236:9;26232:18;26224:26;;26296:9;26290:4;26286:20;26282:1;26271:9;26267:17;26260:47;26324:131;26450:4;26324:131;:::i;:::-;26316:139;;26214:248;;;:::o;26468:419::-;;26672:2;26661:9;26657:18;26649:26;;26721:9;26715:4;26711:20;26707:1;26696:9;26692:17;26685:47;26749:131;26875:4;26749:131;:::i;:::-;26741:139;;26639:248;;;:::o;26893:419::-;;27097:2;27086:9;27082:18;27074:26;;27146:9;27140:4;27136:20;27132:1;27121:9;27117:17;27110:47;27174:131;27300:4;27174:131;:::i;:::-;27166:139;;27064:248;;;:::o;27318:419::-;;27522:2;27511:9;27507:18;27499:26;;27571:9;27565:4;27561:20;27557:1;27546:9;27542:17;27535:47;27599:131;27725:4;27599:131;:::i;:::-;27591:139;;27489:248;;;:::o;27743:419::-;;27947:2;27936:9;27932:18;27924:26;;27996:9;27990:4;27986:20;27982:1;27971:9;27967:17;27960:47;28024:131;28150:4;28024:131;:::i;:::-;28016:139;;27914:248;;;:::o;28168:419::-;;28372:2;28361:9;28357:18;28349:26;;28421:9;28415:4;28411:20;28407:1;28396:9;28392:17;28385:47;28449:131;28575:4;28449:131;:::i;:::-;28441:139;;28339:248;;;:::o;28593:419::-;;28797:2;28786:9;28782:18;28774:26;;28846:9;28840:4;28836:20;28832:1;28821:9;28817:17;28810:47;28874:131;29000:4;28874:131;:::i;:::-;28866:139;;28764:248;;;:::o;29018:419::-;;29222:2;29211:9;29207:18;29199:26;;29271:9;29265:4;29261:20;29257:1;29246:9;29242:17;29235:47;29299:131;29425:4;29299:131;:::i;:::-;29291:139;;29189:248;;;:::o;29443:419::-;;29647:2;29636:9;29632:18;29624:26;;29696:9;29690:4;29686:20;29682:1;29671:9;29667:17;29660:47;29724:131;29850:4;29724:131;:::i;:::-;29716:139;;29614:248;;;:::o;29868:419::-;;30072:2;30061:9;30057:18;30049:26;;30121:9;30115:4;30111:20;30107:1;30096:9;30092:17;30085:47;30149:131;30275:4;30149:131;:::i;:::-;30141:139;;30039:248;;;:::o;30293:419::-;;30497:2;30486:9;30482:18;30474:26;;30546:9;30540:4;30536:20;30532:1;30521:9;30517:17;30510:47;30574:131;30700:4;30574:131;:::i;:::-;30566:139;;30464:248;;;:::o;30718:419::-;;30922:2;30911:9;30907:18;30899:26;;30971:9;30965:4;30961:20;30957:1;30946:9;30942:17;30935:47;30999:131;31125:4;30999:131;:::i;:::-;30991:139;;30889:248;;;:::o;31143:419::-;;31347:2;31336:9;31332:18;31324:26;;31396:9;31390:4;31386:20;31382:1;31371:9;31367:17;31360:47;31424:131;31550:4;31424:131;:::i;:::-;31416:139;;31314:248;;;:::o;31568:419::-;;31772:2;31761:9;31757:18;31749:26;;31821:9;31815:4;31811:20;31807:1;31796:9;31792:17;31785:47;31849:131;31975:4;31849:131;:::i;:::-;31841:139;;31739:248;;;:::o;31993:419::-;;32197:2;32186:9;32182:18;32174:26;;32246:9;32240:4;32236:20;32232:1;32221:9;32217:17;32210:47;32274:131;32400:4;32274:131;:::i;:::-;32266:139;;32164:248;;;:::o;32418:419::-;;32622:2;32611:9;32607:18;32599:26;;32671:9;32665:4;32661:20;32657:1;32646:9;32642:17;32635:47;32699:131;32825:4;32699:131;:::i;:::-;32691:139;;32589:248;;;:::o;32843:419::-;;33047:2;33036:9;33032:18;33024:26;;33096:9;33090:4;33086:20;33082:1;33071:9;33067:17;33060:47;33124:131;33250:4;33124:131;:::i;:::-;33116:139;;33014:248;;;:::o;33268:419::-;;33472:2;33461:9;33457:18;33449:26;;33521:9;33515:4;33511:20;33507:1;33496:9;33492:17;33485:47;33549:131;33675:4;33549:131;:::i;:::-;33541:139;;33439:248;;;:::o;33693:419::-;;33897:2;33886:9;33882:18;33874:26;;33946:9;33940:4;33936:20;33932:1;33921:9;33917:17;33910:47;33974:131;34100:4;33974:131;:::i;:::-;33966:139;;33864:248;;;:::o;34118:343::-;;34309:3;34298:9;34294:19;34286:27;;34323:131;34451:1;34440:9;34436:17;34427:6;34323:131;:::i;:::-;34276:185;;;;:::o;34467:222::-;;34598:2;34587:9;34583:18;34575:26;;34611:71;34679:1;34668:9;34664:17;34655:6;34611:71;:::i;:::-;34565:124;;;;:::o;34695:129::-;;34756:20;;:::i;:::-;34746:30;;34785:33;34813:4;34805:6;34785:33;:::i;:::-;34736:88;;;:::o;34830:75::-;;34896:2;34890:9;34880:19;;34870:35;:::o;34911:311::-;;35078:18;35070:6;35067:30;35064:2;;;35100:18;;:::i;:::-;35064:2;35150:4;35142:6;35138:17;35130:25;;35210:4;35204;35200:15;35192:23;;34993:229;;;:::o;35228:311::-;;35395:18;35387:6;35384:30;35381:2;;;35417:18;;:::i;:::-;35381:2;35467:4;35459:6;35455:17;35447:25;;35527:4;35521;35517:15;35509:23;;35310:229;;;:::o;35545:98::-;;35630:5;35624:12;35614:22;;35603:40;;;:::o;35649:99::-;;35735:5;35729:12;35719:22;;35708:40;;;:::o;35754:147::-;;35892:3;35877:18;;35867:34;;;;:::o;35907:169::-;;36025:6;36020:3;36013:19;36065:4;36060:3;36056:14;36041:29;;36003:73;;;;:::o;36082:305::-;;36141:20;36159:1;36141:20;:::i;:::-;36136:25;;36175:20;36193:1;36175:20;:::i;:::-;36170:25;;36329:1;36261:66;36257:74;36254:1;36251:81;36248:2;;;36335:18;;:::i;:::-;36248:2;36379:1;36376;36372:9;36365:16;;36126:261;;;;:::o;36393:185::-;;36450:20;36468:1;36450:20;:::i;:::-;36445:25;;36484:20;36502:1;36484:20;:::i;:::-;36479:25;;36523:1;36513:2;;36528:18;;:::i;:::-;36513:2;36570:1;36567;36563:9;36558:14;;36435:143;;;;:::o;36584:348::-;;36647:20;36665:1;36647:20;:::i;:::-;36642:25;;36681:20;36699:1;36681:20;:::i;:::-;36676:25;;36869:1;36801:66;36797:74;36794:1;36791:81;36786:1;36779:9;36772:17;36768:105;36765:2;;;36876:18;;:::i;:::-;36765:2;36924:1;36921;36917:9;36906:20;;36632:300;;;;:::o;36938:191::-;;36998:20;37016:1;36998:20;:::i;:::-;36993:25;;37032:20;37050:1;37032:20;:::i;:::-;37027:25;;37071:1;37068;37065:8;37062:2;;;37076:18;;:::i;:::-;37062:2;37121:1;37118;37114:9;37106:17;;36983:146;;;;:::o;37135:96::-;;37201:24;37219:5;37201:24;:::i;:::-;37190:35;;37180:51;;;:::o;37237:90::-;;37314:5;37307:13;37300:21;37289:32;;37279:48;;;:::o;37333:126::-;;37410:42;37403:5;37399:54;37388:65;;37378:81;;;:::o;37465:77::-;;37531:5;37520:16;;37510:32;;;:::o;37548:307::-;37616:1;37626:113;37640:6;37637:1;37634:13;37626:113;;;37725:1;37720:3;37716:11;37710:18;37706:1;37701:3;37697:11;37690:39;37662:2;37659:1;37655:10;37650:15;;37626:113;;;37757:6;37754:1;37751:13;37748:2;;;37837:1;37828:6;37823:3;37819:16;37812:27;37748:2;37597:258;;;;:::o;37861:281::-;37944:27;37966:4;37944:27;:::i;:::-;37936:6;37932:40;38074:6;38062:10;38059:22;38038:18;38026:10;38023:34;38020:62;38017:2;;;38085:18;;:::i;:::-;38017:2;38125:10;38121:2;38114:22;37904:238;;;:::o;38148:233::-;;38210:24;38228:5;38210:24;:::i;:::-;38201:33;;38256:66;38249:5;38246:77;38243:2;;;38326:18;;:::i;:::-;38243:2;38373:1;38366:5;38362:13;38355:20;;38191:190;;;:::o;38387:180::-;38435:77;38432:1;38425:88;38532:4;38529:1;38522:15;38556:4;38553:1;38546:15;38573:180;38621:77;38618:1;38611:88;38718:4;38715:1;38708:15;38742:4;38739:1;38732:15;38759:180;38807:77;38804:1;38797:88;38904:4;38901:1;38894:15;38928:4;38925:1;38918:15;38945:102;;39037:2;39033:7;39028:2;39021:5;39017:14;39013:28;39003:38;;38993:54;;;:::o;39053:242::-;39193:34;39189:1;39181:6;39177:14;39170:58;39262:25;39257:2;39249:6;39245:15;39238:50;39159:136;:::o;39301:172::-;39441:24;39437:1;39429:6;39425:14;39418:48;39407:66;:::o;39479:225::-;39619:34;39615:1;39607:6;39603:14;39596:58;39688:8;39683:2;39675:6;39671:15;39664:33;39585:119;:::o;39710:221::-;39850:34;39846:1;39838:6;39834:14;39827:58;39919:4;39914:2;39906:6;39902:15;39895:29;39816:115;:::o;39937:177::-;40077:29;40073:1;40065:6;40061:14;40054:53;40043:71;:::o;40120:251::-;40260:34;40256:1;40248:6;40244:14;40237:58;40329:34;40324:2;40316:6;40312:15;40305:59;40226:145;:::o;40377:177::-;40517:29;40513:1;40505:6;40501:14;40494:53;40483:71;:::o;40560:168::-;40700:20;40696:1;40688:6;40684:14;40677:44;40666:62;:::o;40734:225::-;40874:34;40870:1;40862:6;40858:14;40851:58;40943:8;40938:2;40930:6;40926:15;40919:33;40840:119;:::o;40965:174::-;41105:26;41101:1;41093:6;41089:14;41082:50;41071:68;:::o;41145:221::-;41285:34;41281:1;41273:6;41269:14;41262:58;41354:4;41349:2;41341:6;41337:15;41330:29;41251:115;:::o;41372:179::-;41512:31;41508:1;41500:6;41496:14;41489:55;41478:73;:::o;41557:181::-;41697:33;41693:1;41685:6;41681:14;41674:57;41663:75;:::o;41744:223::-;41884:34;41880:1;41872:6;41868:14;41861:58;41953:6;41948:2;41940:6;41936:15;41929:31;41850:117;:::o;41973:220::-;42113:34;42109:1;42101:6;42097:14;42090:58;42182:3;42177:2;42169:6;42165:15;42158:28;42079:114;:::o;42199:230::-;42339:34;42335:1;42327:6;42323:14;42316:58;42408:13;42403:2;42395:6;42391:15;42384:38;42305:124;:::o;42435:182::-;42575:34;42571:1;42563:6;42559:14;42552:58;42541:76;:::o;42623:222::-;42763:34;42759:1;42751:6;42747:14;42740:58;42832:5;42827:2;42819:6;42815:15;42808:30;42729:116;:::o;42851:170::-;42991:22;42987:1;42979:6;42975:14;42968:46;42957:64;:::o;43027:237::-;43167:34;43163:1;43155:6;43151:14;43144:58;43236:20;43231:2;43223:6;43219:15;43212:45;43133:131;:::o;43270:308::-;43410:34;43406:1;43398:6;43394:14;43387:58;43479:34;43474:2;43466:6;43462:15;43455:59;43548:22;43543:2;43535:6;43531:15;43524:47;43376:202;:::o;43584:171::-;43724:23;43720:1;43712:6;43708:14;43701:47;43690:65;:::o;43761:179::-;43901:31;43897:1;43889:6;43885:14;43878:55;43867:73;:::o;43946:234::-;44086:34;44082:1;44074:6;44070:14;44063:58;44155:17;44150:2;44142:6;44138:15;44131:42;44052:128;:::o;44186:292::-;44326:34;44322:1;44314:6;44310:14;44303:58;44395:34;44390:2;44382:6;44378:15;44371:59;44464:6;44459:2;44451:6;44447:15;44440:31;44292:186;:::o;44484:229::-;44624:34;44620:1;44612:6;44608:14;44601:58;44693:12;44688:2;44680:6;44676:15;44669:37;44590:123;:::o;44719:181::-;44859:33;44855:1;44847:6;44843:14;44836:57;44825:75;:::o;44906:179::-;45046:31;45042:1;45034:6;45030:14;45023:55;45012:73;:::o;45091:181::-;45231:33;45227:1;45219:6;45215:14;45208:57;45197:75;:::o;45278:175::-;45418:27;45414:1;45406:6;45402:14;45395:51;45384:69;:::o;45459:122::-;45532:24;45550:5;45532:24;:::i;:::-;45525:5;45522:35;45512:2;;45571:1;45568;45561:12;45512:2;45502:79;:::o;45587:116::-;45657:21;45672:5;45657:21;:::i;:::-;45650:5;45647:32;45637:2;;45693:1;45690;45683:12;45637:2;45627:76;:::o;45709:122::-;45782:24;45800:5;45782:24;:::i;:::-;45775:5;45772:35;45762:2;;45821:1;45818;45811:12;45762:2;45752:79;:::o
Swarm Source
ipfs://afb3d1e7ed8ab6c70838c11ae9ddc703845575ccf6284d934275b7f51d24e0f7
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.