My Name Tag:
Not Available, login to update
[ Download CSV Export ]
OVERVIEW
Community & Marketing Time-lock Contract - 2.Contract Name:
HEC_KOL_Marketing
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_KOL_Marketing 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_KOL_Marketing.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
60a06040526000600360006101000a81548160ff02191690831515021790555060006006556000600755600060085560006009556000600a553480156200004557600080fd5b5060405162004abc38038062004abc83398181016040528101906200006b91906200024e565b806200008c620000806200016b60201b60201c565b6200017360201b60201c565b60018081905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000ce57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060006002819055506000600360006101000a81548160ff02191690831515021790555050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200016457600080fd5b50620002c8565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000815190506200024881620002ae565b92915050565b6000602082840312156200026157600080fd5b6000620002718482850162000237565b91505092915050565b600062000287826200028e565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620002b9816200027a565b8114620002c557600080fd5b50565b60805160601c6147b26200030a600039600081816104bb015281816107b501528181610f4e015281816111ab0152818161125b015261143401526147b26000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063715018a6116100a25780639dd509cb116100715780639dd509cb146102b2578063a6e1d016146102e2578063af38d75714610300578063bf2a1c081461031e578063f2fde38b1461033c57610116565b8063715018a6146102375780637ad71f72146102415780637cc1f867146102765780638da5cb5b1461029457610116565b80634e71d92d116100e95780634e71d92d146101b7578063598f89fc146101c15780635b0a3843146101df578063639ab82f146101e95780636db9a96f1461021957610116565b806310764cd41461011b5780631d1309351461014b5780632fba2c85146101695780633b5784f614610187575b600080fd5b610135600480360381019061013091906131fe565b610358565b6040516101429190613859565b60405180910390f35b61015361069c565b6040516101609190613859565b60405180910390f35b610171610735565b60405161017e9190613c71565b60405180910390f35b6101a1600480360381019061019c91906130ad565b610861565b6040516101ae9190613c71565b60405180910390f35b6101bf610879565b005b6101c9610fee565b6040516101d69190613859565b60405180910390f35b6101e761108e565b005b61020360048036038101906101fe91906130d6565b6112a9565b6040516102109190613859565b60405180910390f35b610221611432565b60405161022e91906137b4565b60405180910390f35b61023f611456565b005b61025b600480360381019061025691906131ac565b6114de565b60405161026d969594939291906137f8565b60405180910390f35b61027e61154a565b60405161028b9190613c56565b60405180910390f35b61029c61160a565b6040516102a991906137b4565b60405180910390f35b6102cc60048036038101906102c79190613117565b611633565b6040516102d99190613859565b60405180910390f35b6102ea611842565b6040516102f79190613859565b60405180910390f35b6103086118e2565b6040516103159190613c71565b60405180910390f35b610326611b6d565b6040516103339190613c71565b60405180910390f35b610356600480360381019061035191906130ad565b611cd4565b005b6000610362611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661038061160a565b73ffffffffffffffffffffffffffffffffffffffff16146103d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103cd90613a96565b60405180910390fd5b600360009054906101000a900460ff16610425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041c90613ab6565b60405180910390fd5b60008611610468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161045f90613af6565b60405180910390fd5b60148411156104ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a390613b96565b60405180910390fd5b600060085411156105a35760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161051291906137b4565b60206040518083038186803b15801561052a57600080fd5b505afa15801561053e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056291906131d5565b146105a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059990613b16565b60405180910390fd5b5b428510156105e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105dd90613a36565b60405180910390fd5b84831015610629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062090613b76565b60405180910390fd5b8282101561066c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066390613896565b60405180910390fd5b846008819055508260098190555081600a8190555085600681905550836007819055506001905095945050505050565b60006106a6611dcc565b73ffffffffffffffffffffffffffffffffffffffff166106c461160a565b73ffffffffffffffffffffffffffffffffffffffff161461071a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071190613a96565b60405180910390fd5b6000600360009054906101000a900460ff1690508091505090565b600061073f611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661075d61160a565b73ffffffffffffffffffffffffffffffffffffffff16146107b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107aa90613a96565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161080c91906137b4565b60206040518083038186803b15801561082457600080fd5b505afa158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c91906131d5565b905090565b60046020528060005260406000206000915090505481565b600260015414156108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b690613bd6565b60405180910390fd5b600260018190555060001515600360009054906101000a900460ff1615151461091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490613a16565b60405180910390fd5b6000610927611dd4565b11610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e906139f6565b60405180910390fd5b6000600580549050116109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690613ad6565b60405180910390fd5b6109b7611dd4565b42116109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef90613976565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660058281548110610a8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90613956565b60405180910390fd5b6000610bc060058381548110610b54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015460058481548110610ba0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020154611dde90919063ffffffff16565b11610c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf7906138f6565b60405180910390fd5b6000610c0b82611e3c565b9050600060058381548110610c49577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015490506000610c728284611dde90919063ffffffff16565b905060008111610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90613a76565b60405180910390fd5b6000610d0e60058681548110610cf6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016005015442612002565b9050610d6e8460058781548110610d4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015461204590919063ffffffff16565b60058681548110610da8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020181905550610e1b8360058781548110610dfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015461204590919063ffffffff16565b60058681548110610e55577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160010181905550610edd610e83620151808361208f90919063ffffffff16565b60058781548110610ebd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160050154611dde90919063ffffffff16565b60058681548110610f17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160050181905550610f418260025461204590919063ffffffff16565b600281905550610f9233837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661210a9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f724183604051610fd89190613c71565b60405180910390a2505050505060018081905550565b6000610ff8611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661101661160a565b73ffffffffffffffffffffffffffffffffffffffff161461106c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106390613a96565b60405180910390fd5b6001600360006101000a81548160ff0219169083151502179055506001905090565b600260015414156110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90613bd6565b60405180910390fd5b60026001819055506110e4611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661110261160a565b73ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f90613a96565b60405180910390fd5b600360009054906101000a900460ff166111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e90613ab6565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161120291906137b4565b60206040518083038186803b15801561121a57600080fd5b505afa15801561122e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125291906131d5565b905061129f33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661210a9092919063ffffffff16565b5060018081905550565b6000600260015414156112f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e890613bd6565b60405180910390fd5b6002600181905550611301611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661131f61160a565b73ffffffffffffffffffffffffffffffffffffffff1614611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90613a96565b60405180910390fd5b60008251116113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b0906138b6565b60405180910390fd5b60005b82518110156114215761140e838281518110611401577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612190565b808061141990613efc565b9150506113bc565b506001905060018081905550919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61145e611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661147c61160a565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613a96565b60405180910390fd5b6114dc60006125d7565b565b600581815481106114ee57600080fd5b90600052602060002090600602016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154905086565b611552612efe565b61155a611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661157861160a565b73ffffffffffffffffffffffffffffffffffffffff16146115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590613a96565b60405180910390fd5b60006040518060a0016040528060085481526020016009548152602001600a548152602001600754815260200160065481525090508091505090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006002600154141561167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290613bd6565b60405180910390fd5b600260018190555061168b611dcc565b73ffffffffffffffffffffffffffffffffffffffff166116a961160a565b73ffffffffffffffffffffffffffffffffffffffff16146116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f690613a96565b60405180910390fd5b8151835114611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613c36565b60405180910390fd5b6000835111611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e906138b6565b60405180910390fd5b60005b83518110156118305761181d8482815181106117cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848381518110611810577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161269b565b808061182890613efc565b91505061178a565b50600190506001808190555092915050565b600061184c611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661186a61160a565b73ffffffffffffffffffffffffffffffffffffffff16146118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790613a96565b60405180910390fd5b6000600360006101000a81548160ff0219169083151502179055506001905090565b6000801515600360009054906101000a900460ff16151514611939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193090613a16565b60405180910390fd5b6000611943611dd4565b11611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a906139f6565b60405180910390fd5b6000600580549050116119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290613ad6565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660058281548110611a60577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf90613976565b60405180910390fd5b611af0611dd4565b4211611b00576000915050611b6a565b611b66611b0c82611e3c565b60058381548110611b46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160010154611dde90919063ffffffff16565b9150505b90565b6000611b77611dcc565b73ffffffffffffffffffffffffffffffffffffffff16611b9561160a565b73ffffffffffffffffffffffffffffffffffffffff1614611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be290613a96565b60405180910390fd5b6000805b600580549050811015611ccc57611cb760058281548110611c39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160010154611ca960058481548110611c88577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015485611dde90919063ffffffff16565b611dde90919063ffffffff16565b91508080611cc490613efc565b915050611bef565b508091505090565b611cdc611dcc565b73ffffffffffffffffffffffffffffffffffffffff16611cfa61160a565b73ffffffffffffffffffffffffffffffffffffffff1614611d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4790613a96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db7906138d6565b60405180910390fd5b611dc9816125d7565b50565b600033905090565b6000600854905090565b6000808284611ded9190613d3b565b905083811015611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2990613916565b60405180910390fd5b8091505092915050565b600080611e9460058481548110611e7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016005015442612002565b90506000611ef68260058681548110611ed6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016004015461208f90919063ffffffff16565b9050611f00612b58565b421115611f565760058481548110611f41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015490505b60058481548110611f90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020154811115611ff85760058481548110611fe3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015490505b8092505050919050565b6000828211612014576000905061203f565b61203c6201518061202e858561204590919063ffffffff16565b612b6290919063ffffffff16565b90505b92915050565b600061208783836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f7700815250612bac565b905092915050565b6000808314156120a25760009050612104565b600082846120b09190613dc2565b90508284826120bf9190613d91565b146120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f690613a56565b60405180910390fd5b809150505b92915050565b61218b8363a9059cbb60e01b84846040516024016121299291906137cf565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612c10565b505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506005818154811061220e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a490613c16565b60405180910390fd5b61236a600582815481106122ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015461235c60058481548110612339577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015460025461204590919063ffffffff16565b61204590919063ffffffff16565b6002819055506000600582815481106123ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060058281548110612437577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160040181905550600060058281548110612488577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060060201600501819055506000600582815481106124d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016003018190555060006005828154811061252a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001018190555060006005828154811061257b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020181905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600580549050111561281957600081111561273c576000612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272e906139b6565b60405180910390fd5b612818565b6005600081548110612777577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280e906139b6565b60405180910390fd5b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612889576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612880906139d6565b60405180910390fd5b600082116128cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c390613b36565b60405180910390fd5b6128d4612cd7565b6128e983600254611dde90919063ffffffff16565b111561292a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292190613936565b60405180910390fd5b6000612944612937612ce1565b61293f612b58565b612002565b905060008111612989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298090613bf6565b60405180910390fd5b60006129b860646129aa61299b612ceb565b8761208f90919063ffffffff16565b612b6290919063ffffffff16565b905060006129cf828661204590919063ffffffff16565b905060006129e68483612b6290919063ffffffff16565b905060056040518060c001604052808973ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001888152602001838152602001612a31612ce1565b815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501555050612af1600160058054905061204590919063ffffffff16565b600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612b4986600254611dde90919063ffffffff16565b60028190555050505050505050565b6000600a54905090565b6000612ba483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cf5565b905092915050565b6000838311158290612bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612beb9190613874565b60405180910390fd5b5060008385612c039190613e1c565b9050809150509392505050565b6000612c72826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d589092919063ffffffff16565b9050600081511115612cd25780806020019051810190612c929190613183565b612cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc890613bb6565b60405180910390fd5b5b505050565b6000600654905090565b6000600954905090565b6000600754905090565b60008083118290612d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d339190613874565b60405180910390fd5b5060008385612d4b9190613d91565b9050809150509392505050565b6060612d678484600085612d70565b90509392505050565b606082471015612db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dac90613996565b60405180910390fd5b612dbe85612e84565b612dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df490613b56565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e26919061379d565b60006040518083038185875af1925050503d8060008114612e63576040519150601f19603f3d011682016040523d82523d6000602084013e612e68565b606091505b5091509150612e78828286612e97565b92505050949350505050565b600080823b905060008111915050919050565b60608315612ea757829050612ef7565b600083511115612eba5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eee9190613874565b60405180910390fd5b9392505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000612f40612f3b84613cb1565b613c8c565b90508083825260208201905082856020860282011115612f5f57600080fd5b60005b85811015612f8f5781612f758882613005565b845260208401935060208301925050600181019050612f62565b5050509392505050565b6000612fac612fa784613cdd565b613c8c565b90508083825260208201905082856020860282011115612fcb57600080fd5b60005b85811015612ffb5781612fe18882613083565b845260208401935060208301925050600181019050612fce565b5050509392505050565b60008135905061301481614737565b92915050565b600082601f83011261302b57600080fd5b813561303b848260208601612f2d565b91505092915050565b600082601f83011261305557600080fd5b8135613065848260208601612f99565b91505092915050565b60008151905061307d8161474e565b92915050565b60008135905061309281614765565b92915050565b6000815190506130a781614765565b92915050565b6000602082840312156130bf57600080fd5b60006130cd84828501613005565b91505092915050565b6000602082840312156130e857600080fd5b600082013567ffffffffffffffff81111561310257600080fd5b61310e8482850161301a565b91505092915050565b6000806040838503121561312a57600080fd5b600083013567ffffffffffffffff81111561314457600080fd5b6131508582860161301a565b925050602083013567ffffffffffffffff81111561316d57600080fd5b61317985828601613044565b9150509250929050565b60006020828403121561319557600080fd5b60006131a38482850161306e565b91505092915050565b6000602082840312156131be57600080fd5b60006131cc84828501613083565b91505092915050565b6000602082840312156131e757600080fd5b60006131f584828501613098565b91505092915050565b600080600080600060a0868803121561321657600080fd5b600061322488828901613083565b955050602061323588828901613083565b945050604061324688828901613083565b935050606061325788828901613083565b925050608061326888828901613083565b9150509295509295909350565b61327e81613e50565b82525050565b61328d81613e62565b82525050565b600061329e82613d09565b6132a88185613d1f565b93506132b8818560208601613e98565b80840191505092915050565b60006132cf82613d14565b6132d98185613d2a565b93506132e9818560208601613e98565b6132f281613fd2565b840191505092915050565b600061330a603783613d2a565b915061331582613fe3565b604082019050919050565b600061332d601683613d2a565b915061333882614032565b602082019050919050565b6000613350602683613d2a565b915061335b8261405b565b604082019050919050565b6000613373602283613d2a565b915061337e826140aa565b604082019050919050565b6000613396601b83613d2a565b91506133a1826140f9565b602082019050919050565b60006133b9604083613d2a565b91506133c482614122565b604082019050919050565b60006133dc601b83613d2a565b91506133e782614171565b602082019050919050565b60006133ff601283613d2a565b915061340a8261419a565b602082019050919050565b6000613422602683613d2a565b915061342d826141c3565b604082019050919050565b6000613445601883613d2a565b915061345082614212565b602082019050919050565b6000613468602283613d2a565b91506134738261423b565b604082019050919050565b600061348b601d83613d2a565b91506134968261428a565b602082019050919050565b60006134ae601f83613d2a565b91506134b9826142b3565b602082019050919050565b60006134d1602483613d2a565b91506134dc826142dc565b604082019050919050565b60006134f4602183613d2a565b91506134ff8261432b565b604082019050919050565b6000613517602b83613d2a565b91506135228261437a565b604082019050919050565b600061353a602083613d2a565b9150613545826143c9565b602082019050919050565b600061355d602383613d2a565b9150613568826143f2565b604082019050919050565b6000613580601483613d2a565b915061358b82614441565b602082019050919050565b60006135a3603283613d2a565b91506135ae8261446a565b604082019050919050565b60006135c6605483613d2a565b91506135d1826144b9565b606082019050919050565b60006135e9601583613d2a565b91506135f48261452e565b602082019050919050565b600061360c601d83613d2a565b915061361782614557565b602082019050919050565b600061362f602f83613d2a565b915061363a82614580565b604082019050919050565b6000613652604483613d2a565b915061365d826145cf565b606082019050919050565b6000613675602a83613d2a565b915061368082614644565b604082019050919050565b6000613698601f83613d2a565b91506136a382614693565b602082019050919050565b60006136bb601d83613d2a565b91506136c6826146bc565b602082019050919050565b60006136de601f83613d2a565b91506136e9826146e5565b602082019050919050565b6000613701601983613d2a565b915061370c8261470e565b602082019050919050565b60a08201600082015161372d600085018261377f565b506020820151613740602085018261377f565b506040820151613753604085018261377f565b506060820151613766606085018261377f565b506080820151613779608085018261377f565b50505050565b61378881613e8e565b82525050565b61379781613e8e565b82525050565b60006137a98284613293565b915081905092915050565b60006020820190506137c96000830184613275565b92915050565b60006040820190506137e46000830185613275565b6137f1602083018461378e565b9392505050565b600060c08201905061380d6000830189613275565b61381a602083018861378e565b613827604083018761378e565b613834606083018661378e565b613841608083018561378e565b61384e60a083018461378e565b979650505050505050565b600060208201905061386e6000830184613284565b92915050565b6000602082019050818103600083015261388e81846132c4565b905092915050565b600060208201905081810360008301526138af816132fd565b9050919050565b600060208201905081810360008301526138cf81613320565b9050919050565b600060208201905081810360008301526138ef81613343565b9050919050565b6000602082019050818103600083015261390f81613366565b9050919050565b6000602082019050818103600083015261392f81613389565b9050919050565b6000602082019050818103600083015261394f816133ac565b9050919050565b6000602082019050818103600083015261396f816133cf565b9050919050565b6000602082019050818103600083015261398f816133f2565b9050919050565b600060208201905081810360008301526139af81613415565b9050919050565b600060208201905081810360008301526139cf81613438565b9050919050565b600060208201905081810360008301526139ef8161345b565b9050919050565b60006020820190508181036000830152613a0f8161347e565b9050919050565b60006020820190508181036000830152613a2f816134a1565b9050919050565b60006020820190508181036000830152613a4f816134c4565b9050919050565b60006020820190508181036000830152613a6f816134e7565b9050919050565b60006020820190508181036000830152613a8f8161350a565b9050919050565b60006020820190508181036000830152613aaf8161352d565b9050919050565b60006020820190508181036000830152613acf81613550565b9050919050565b60006020820190508181036000830152613aef81613573565b9050919050565b60006020820190508181036000830152613b0f81613596565b9050919050565b60006020820190508181036000830152613b2f816135b9565b9050919050565b60006020820190508181036000830152613b4f816135dc565b9050919050565b60006020820190508181036000830152613b6f816135ff565b9050919050565b60006020820190508181036000830152613b8f81613622565b9050919050565b60006020820190508181036000830152613baf81613645565b9050919050565b60006020820190508181036000830152613bcf81613668565b9050919050565b60006020820190508181036000830152613bef8161368b565b9050919050565b60006020820190508181036000830152613c0f816136ae565b9050919050565b60006020820190508181036000830152613c2f816136d1565b9050919050565b60006020820190508181036000830152613c4f816136f4565b9050919050565b600060a082019050613c6b6000830184613717565b92915050565b6000602082019050613c86600083018461378e565b92915050565b6000613c96613ca7565b9050613ca28282613ecb565b919050565b6000604051905090565b600067ffffffffffffffff821115613ccc57613ccb613fa3565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613cf857613cf7613fa3565b5b602082029050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000613d4682613e8e565b9150613d5183613e8e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d8657613d85613f45565b5b828201905092915050565b6000613d9c82613e8e565b9150613da783613e8e565b925082613db757613db6613f74565b5b828204905092915050565b6000613dcd82613e8e565b9150613dd883613e8e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e1157613e10613f45565b5b828202905092915050565b6000613e2782613e8e565b9150613e3283613e8e565b925082821015613e4557613e44613f45565b5b828203905092915050565b6000613e5b82613e6e565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015613eb6578082015181840152602081019050613e9b565b83811115613ec5576000848401525b50505050565b613ed482613fd2565b810181811067ffffffffffffffff82111715613ef357613ef2613fa3565b5b80604052505050565b6000613f0782613e8e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f3a57613f39613f45565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f56657374696e6720456e642074696d652063616e6e6f74206265206561726c6960008201527f6572207468616e20436c69666620456e642074696d652e000000000000000000602082015250565b7f41727261792063616e6e6f7420626520656d7074792e00000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5468657265206973206e6f2062616c616e6365206c65667420746f20636c616960008201527f6d2e000000000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f43616e6e6f74206164642074686973206465627420616d6f756e74206475652060008201527f746f207468652062616c616e6365206f66207468697320436f6e74726163742e602082015250565b7f436c61696d2072657175657374206973206e6f742076616c69642e0000000000600082015250565b7f52657175657374206e6f742076616c69642e0000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4164647265737320616c726561647920696e206c6973742e0000000000000000600082015250565b7f526563697069656e7420616464726573732063616e6e6f7420626520656d707460008201527f792e000000000000000000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206e6f7420696e697469616c697a6564207965742e000000600082015250565b7f436f6e747261637420697320696e2073757370656e6465642073746174652e00600082015250565b7f5447452074696d652063616e6e6f74206265206561726c696572207468616e2060008201527f6e6f772e00000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f5468657265206973206e6f2062616c616e636520746f20636c61696d2061742060008201527f746865206d6f6d656e742e000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e7472616374206973206e6f7420696e2073757370656e6465642073746160008201527f74652e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20726563697069656e747320666f756e642e000000000000000000000000600082015250565b7f496e697469616c20436f6e74726163742042616c616e63652073686f756c642060008201527f62652067726561746572207468616e20302e0000000000000000000000000000602082015250565b7f436f6e747261637420616c72656164792068617320746f6b656e7320616e642060008201527f54474520616c7265616479207365742e2043616e6e6f74206368616e6765206460208201527f617465732061742074686973206d6f6d656e742e000000000000000000000000604082015250565b7f546f6b656e20616d6f756e7420696e76616c69642e0000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f436c69666620456e642074696d652063616e6e6f74206265206561726c69657260008201527f207468616e205447452074696d652e0000000000000000000000000000000000602082015250565b7f54474520556e6c6f636b2050657263656e746167652063616e6e6f742062652060008201527f67726561746572207468616e20323025207065722048654320546f6b656e6f6d60208201527f6963732e00000000000000000000000000000000000000000000000000000000604082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f556e65787065637465642076657374696e672064617920636f756e742e000000600082015250565b7f526563697069656e7420696e64657820646f6573206e6f74206d617463682e00600082015250565b7f41727261792073697a657320646f206e6f74206d617463682e00000000000000600082015250565b61474081613e50565b811461474b57600080fd5b50565b61475781613e62565b811461476257600080fd5b50565b61476e81613e8e565b811461477957600080fd5b5056fea2646970667358221220684e78ef3cbe2bab9cbde5b5364573591b51c1c61cd122c8c106bfe91e4018d964736f6c63430008020033000000000000000000000000c7f4debc8072e23fe9259a5c0398326d8efb7f5c
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:3706:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40693: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;:::-;;;;;;;;39316: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;:::-;;40693:1326;40898:4;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40923:7:::1;;;;;;;;;;;40915:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41015:1;40989:23;:27;40981:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;41114:2;41090:20;:26;;41082:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;41221:1;41204:14;;:18;41200:193;;;41291:1;41255:3;41247:23;;;41280:4;41247:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;41239:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;41200:193;41436:15;41411:13;:41;;41403:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;41534:13;41512:18;:35;;41504:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41642:18;41618:20;:42;;41610:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;41750:13;41733:14;:30;;;;41797:18;41774:20;:41;;;;41851:20;41826:22;:45;;;;41909:23;41882:24;:50;;;;41967:20;41943:21;:44;;;;42007:4;42000:11;;40693: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;39316:499::-;39377:19;;:::i;:::-;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39410:23:::1;39436:340;;;;;;;;39486:14;;39436:340;;;;39542:20;;39436:340;;;;39606:22;;39436:340;;;;39672:21;;39436:340;;;;39740:24;;39436:340;;::::0;39410:366:::1;;39804:3;39797:10;;;39316: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;39831:107::-;39889:7;39916:14;;39909:21;;39831: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;40206:121::-;40271:7;40297:22;;40290:29;;40206: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;39946:127::-;40014:7;40041:24;;40034:31;;39946:127;:::o;40081:117::-;40144:7;40170:20;;40163:27;;40081:117;:::o;40335:120::-;40400:7;40426:21;;40419:28;;40335: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;17837:1108::-;17994:4;17989:3;17985:14;18089:4;18082:5;18078:16;18072:23;18108:63;18165:4;18160:3;18156:14;18142:12;18108:63;:::i;:::-;18009:172;18276:4;18269:5;18265:16;18259:23;18295:63;18352:4;18347:3;18343:14;18329:12;18295:63;:::i;:::-;18191:177;18465:4;18458:5;18454:16;18448:23;18484:63;18541:4;18536:3;18532:14;18518:12;18484:63;:::i;:::-;18378:179;18654:4;18647:5;18643:16;18637:23;18673:63;18730:4;18725:3;18721:14;18707:12;18673:63;:::i;:::-;18567:179;18846:4;18839:5;18835:16;18829:23;18865:63;18922:4;18917:3;18913:14;18899:12;18865:63;:::i;:::-;18756:182;17963:982;;;:::o;18951:108::-;19028:24;19046:5;19028:24;:::i;:::-;19023:3;19016:37;19006:53;;:::o;19065:118::-;19152:24;19170:5;19152:24;:::i;:::-;19147:3;19140:37;19130:53;;:::o;19189:271::-;;19341:93;19430:3;19421:6;19341:93;:::i;:::-;19334:100;;19451:3;19444:10;;19323:137;;;;:::o;19466:222::-;;19597:2;19586:9;19582:18;19574:26;;19610:71;19678:1;19667:9;19663:17;19654:6;19610:71;:::i;:::-;19564:124;;;;:::o;19694:332::-;;19853:2;19842:9;19838:18;19830:26;;19866:71;19934:1;19923:9;19919:17;19910:6;19866:71;:::i;:::-;19947:72;20015:2;20004:9;20000:18;19991:6;19947:72;:::i;:::-;19820:206;;;;;:::o;20032:775::-;;20303:3;20292:9;20288:19;20280:27;;20317:71;20385:1;20374:9;20370:17;20361:6;20317:71;:::i;:::-;20398:72;20466:2;20455:9;20451:18;20442:6;20398:72;:::i;:::-;20480;20548:2;20537:9;20533:18;20524:6;20480:72;:::i;:::-;20562;20630:2;20619:9;20615:18;20606:6;20562:72;:::i;:::-;20644:73;20712:3;20701:9;20697:19;20688:6;20644:73;:::i;:::-;20727;20795:3;20784:9;20780:19;20771:6;20727:73;:::i;:::-;20270:537;;;;;;;;;:::o;20813:210::-;;20938:2;20927:9;20923:18;20915:26;;20951:65;21013:1;21002:9;20998:17;20989:6;20951:65;:::i;:::-;20905:118;;;;:::o;21029:313::-;;21180:2;21169:9;21165:18;21157:26;;21229:9;21223:4;21219:20;21215:1;21204:9;21200:17;21193:47;21257:78;21330:4;21321:6;21257:78;:::i;:::-;21249:86;;21147:195;;;;:::o;21348:419::-;;21552:2;21541:9;21537:18;21529:26;;21601:9;21595:4;21591:20;21587:1;21576:9;21572:17;21565:47;21629:131;21755:4;21629:131;:::i;:::-;21621:139;;21519:248;;;:::o;21773:419::-;;21977:2;21966:9;21962:18;21954:26;;22026:9;22020:4;22016:20;22012:1;22001:9;21997:17;21990:47;22054:131;22180:4;22054:131;:::i;:::-;22046:139;;21944:248;;;:::o;22198:419::-;;22402:2;22391:9;22387:18;22379:26;;22451:9;22445:4;22441:20;22437:1;22426:9;22422:17;22415:47;22479:131;22605:4;22479:131;:::i;:::-;22471:139;;22369:248;;;:::o;22623:419::-;;22827:2;22816:9;22812:18;22804:26;;22876:9;22870:4;22866:20;22862:1;22851:9;22847:17;22840:47;22904:131;23030:4;22904:131;:::i;:::-;22896:139;;22794:248;;;:::o;23048:419::-;;23252:2;23241:9;23237:18;23229:26;;23301:9;23295:4;23291:20;23287:1;23276:9;23272:17;23265:47;23329:131;23455:4;23329:131;:::i;:::-;23321:139;;23219:248;;;:::o;23473:419::-;;23677:2;23666:9;23662:18;23654:26;;23726:9;23720:4;23716:20;23712:1;23701:9;23697:17;23690:47;23754:131;23880:4;23754:131;:::i;:::-;23746:139;;23644:248;;;:::o;23898:419::-;;24102:2;24091:9;24087:18;24079:26;;24151:9;24145:4;24141:20;24137:1;24126:9;24122:17;24115:47;24179:131;24305:4;24179:131;:::i;:::-;24171:139;;24069:248;;;:::o;24323:419::-;;24527:2;24516:9;24512:18;24504:26;;24576:9;24570:4;24566:20;24562:1;24551:9;24547:17;24540:47;24604:131;24730:4;24604:131;:::i;:::-;24596:139;;24494:248;;;:::o;24748:419::-;;24952:2;24941:9;24937:18;24929:26;;25001:9;24995:4;24991:20;24987:1;24976:9;24972:17;24965:47;25029:131;25155:4;25029:131;:::i;:::-;25021:139;;24919:248;;;:::o;25173:419::-;;25377:2;25366:9;25362:18;25354:26;;25426:9;25420:4;25416:20;25412:1;25401:9;25397:17;25390:47;25454:131;25580:4;25454:131;:::i;:::-;25446:139;;25344:248;;;:::o;25598:419::-;;25802:2;25791:9;25787:18;25779:26;;25851:9;25845:4;25841:20;25837:1;25826:9;25822:17;25815:47;25879:131;26005:4;25879:131;:::i;:::-;25871:139;;25769:248;;;:::o;26023:419::-;;26227:2;26216:9;26212:18;26204:26;;26276:9;26270:4;26266:20;26262:1;26251:9;26247:17;26240:47;26304:131;26430:4;26304:131;:::i;:::-;26296:139;;26194:248;;;:::o;26448:419::-;;26652:2;26641:9;26637:18;26629:26;;26701:9;26695:4;26691:20;26687:1;26676:9;26672:17;26665:47;26729:131;26855:4;26729:131;:::i;:::-;26721:139;;26619:248;;;:::o;26873:419::-;;27077:2;27066:9;27062:18;27054:26;;27126:9;27120:4;27116:20;27112:1;27101:9;27097:17;27090:47;27154:131;27280:4;27154:131;:::i;:::-;27146:139;;27044:248;;;:::o;27298:419::-;;27502:2;27491:9;27487:18;27479:26;;27551:9;27545:4;27541:20;27537:1;27526:9;27522:17;27515:47;27579:131;27705:4;27579:131;:::i;:::-;27571:139;;27469:248;;;:::o;27723:419::-;;27927:2;27916:9;27912:18;27904:26;;27976:9;27970:4;27966:20;27962:1;27951:9;27947:17;27940:47;28004:131;28130:4;28004:131;:::i;:::-;27996:139;;27894:248;;;:::o;28148:419::-;;28352:2;28341:9;28337:18;28329:26;;28401:9;28395:4;28391:20;28387:1;28376:9;28372:17;28365:47;28429:131;28555:4;28429:131;:::i;:::-;28421:139;;28319:248;;;:::o;28573:419::-;;28777:2;28766:9;28762:18;28754:26;;28826:9;28820:4;28816:20;28812:1;28801:9;28797:17;28790:47;28854:131;28980:4;28854:131;:::i;:::-;28846:139;;28744:248;;;:::o;28998:419::-;;29202:2;29191:9;29187:18;29179:26;;29251:9;29245:4;29241:20;29237:1;29226:9;29222:17;29215:47;29279:131;29405:4;29279:131;:::i;:::-;29271:139;;29169:248;;;:::o;29423:419::-;;29627:2;29616:9;29612:18;29604:26;;29676:9;29670:4;29666:20;29662:1;29651:9;29647:17;29640:47;29704:131;29830:4;29704:131;:::i;:::-;29696:139;;29594:248;;;:::o;29848:419::-;;30052:2;30041:9;30037:18;30029:26;;30101:9;30095:4;30091:20;30087:1;30076:9;30072:17;30065:47;30129:131;30255:4;30129:131;:::i;:::-;30121:139;;30019:248;;;:::o;30273:419::-;;30477:2;30466:9;30462:18;30454:26;;30526:9;30520:4;30516:20;30512:1;30501:9;30497:17;30490:47;30554:131;30680:4;30554:131;:::i;:::-;30546:139;;30444:248;;;:::o;30698:419::-;;30902:2;30891:9;30887:18;30879:26;;30951:9;30945:4;30941:20;30937:1;30926:9;30922:17;30915:47;30979:131;31105:4;30979:131;:::i;:::-;30971:139;;30869:248;;;:::o;31123:419::-;;31327:2;31316:9;31312:18;31304:26;;31376:9;31370:4;31366:20;31362:1;31351:9;31347:17;31340:47;31404:131;31530:4;31404:131;:::i;:::-;31396:139;;31294:248;;;:::o;31548:419::-;;31752:2;31741:9;31737:18;31729:26;;31801:9;31795:4;31791:20;31787:1;31776:9;31772:17;31765:47;31829:131;31955:4;31829:131;:::i;:::-;31821:139;;31719:248;;;:::o;31973:419::-;;32177:2;32166:9;32162:18;32154:26;;32226:9;32220:4;32216:20;32212:1;32201:9;32197:17;32190:47;32254:131;32380:4;32254:131;:::i;:::-;32246:139;;32144:248;;;:::o;32398:419::-;;32602:2;32591:9;32587:18;32579:26;;32651:9;32645:4;32641:20;32637:1;32626:9;32622:17;32615:47;32679:131;32805:4;32679:131;:::i;:::-;32671:139;;32569:248;;;:::o;32823:419::-;;33027:2;33016:9;33012:18;33004:26;;33076:9;33070:4;33066:20;33062:1;33051:9;33047:17;33040:47;33104:131;33230:4;33104:131;:::i;:::-;33096:139;;32994:248;;;:::o;33248:419::-;;33452:2;33441:9;33437:18;33429:26;;33501:9;33495:4;33491:20;33487:1;33476:9;33472:17;33465:47;33529:131;33655:4;33529:131;:::i;:::-;33521:139;;33419:248;;;:::o;33673:419::-;;33877:2;33866:9;33862:18;33854:26;;33926:9;33920:4;33916:20;33912:1;33901:9;33897:17;33890:47;33954:131;34080:4;33954:131;:::i;:::-;33946:139;;33844:248;;;:::o;34098:343::-;;34289:3;34278:9;34274:19;34266:27;;34303:131;34431:1;34420:9;34416:17;34407:6;34303:131;:::i;:::-;34256:185;;;;:::o;34447:222::-;;34578:2;34567:9;34563:18;34555:26;;34591:71;34659:1;34648:9;34644:17;34635:6;34591:71;:::i;:::-;34545:124;;;;:::o;34675:129::-;;34736:20;;:::i;:::-;34726:30;;34765:33;34793:4;34785:6;34765:33;:::i;:::-;34716:88;;;:::o;34810:75::-;;34876:2;34870:9;34860:19;;34850:35;:::o;34891:311::-;;35058:18;35050:6;35047:30;35044:2;;;35080:18;;:::i;:::-;35044:2;35130:4;35122:6;35118:17;35110:25;;35190:4;35184;35180:15;35172:23;;34973:229;;;:::o;35208:311::-;;35375:18;35367:6;35364:30;35361:2;;;35397:18;;:::i;:::-;35361:2;35447:4;35439:6;35435:17;35427:25;;35507:4;35501;35497:15;35489:23;;35290:229;;;:::o;35525:98::-;;35610:5;35604:12;35594:22;;35583:40;;;:::o;35629:99::-;;35715:5;35709:12;35699:22;;35688:40;;;:::o;35734:147::-;;35872:3;35857:18;;35847:34;;;;:::o;35887:169::-;;36005:6;36000:3;35993:19;36045:4;36040:3;36036:14;36021:29;;35983:73;;;;:::o;36062:305::-;;36121:20;36139:1;36121:20;:::i;:::-;36116:25;;36155:20;36173:1;36155:20;:::i;:::-;36150:25;;36309:1;36241:66;36237:74;36234:1;36231:81;36228:2;;;36315:18;;:::i;:::-;36228:2;36359:1;36356;36352:9;36345:16;;36106:261;;;;:::o;36373:185::-;;36430:20;36448:1;36430:20;:::i;:::-;36425:25;;36464:20;36482:1;36464:20;:::i;:::-;36459:25;;36503:1;36493:2;;36508:18;;:::i;:::-;36493:2;36550:1;36547;36543:9;36538:14;;36415:143;;;;:::o;36564:348::-;;36627:20;36645:1;36627:20;:::i;:::-;36622:25;;36661:20;36679:1;36661:20;:::i;:::-;36656:25;;36849:1;36781:66;36777:74;36774:1;36771:81;36766:1;36759:9;36752:17;36748:105;36745:2;;;36856:18;;:::i;:::-;36745:2;36904:1;36901;36897:9;36886:20;;36612:300;;;;:::o;36918:191::-;;36978:20;36996:1;36978:20;:::i;:::-;36973:25;;37012:20;37030:1;37012:20;:::i;:::-;37007:25;;37051:1;37048;37045:8;37042:2;;;37056:18;;:::i;:::-;37042:2;37101:1;37098;37094:9;37086:17;;36963:146;;;;:::o;37115:96::-;;37181:24;37199:5;37181:24;:::i;:::-;37170:35;;37160:51;;;:::o;37217:90::-;;37294:5;37287:13;37280:21;37269:32;;37259:48;;;:::o;37313:126::-;;37390:42;37383:5;37379:54;37368:65;;37358:81;;;:::o;37445:77::-;;37511:5;37500:16;;37490:32;;;:::o;37528:307::-;37596:1;37606:113;37620:6;37617:1;37614:13;37606:113;;;37705:1;37700:3;37696:11;37690:18;37686:1;37681:3;37677:11;37670:39;37642:2;37639:1;37635:10;37630:15;;37606:113;;;37737:6;37734:1;37731:13;37728:2;;;37817:1;37808:6;37803:3;37799:16;37792:27;37728:2;37577:258;;;;:::o;37841:281::-;37924:27;37946:4;37924:27;:::i;:::-;37916:6;37912:40;38054:6;38042:10;38039:22;38018:18;38006:10;38003:34;38000:62;37997:2;;;38065:18;;:::i;:::-;37997:2;38105:10;38101:2;38094:22;37884:238;;;:::o;38128:233::-;;38190:24;38208:5;38190:24;:::i;:::-;38181:33;;38236:66;38229:5;38226:77;38223:2;;;38306:18;;:::i;:::-;38223:2;38353:1;38346:5;38342:13;38335:20;;38171:190;;;:::o;38367:180::-;38415:77;38412:1;38405:88;38512:4;38509:1;38502:15;38536:4;38533:1;38526:15;38553:180;38601:77;38598:1;38591:88;38698:4;38695:1;38688:15;38722:4;38719:1;38712:15;38739:180;38787:77;38784:1;38777:88;38884:4;38881:1;38874:15;38908:4;38905:1;38898:15;38925:102;;39017:2;39013:7;39008:2;39001:5;38997:14;38993:28;38983:38;;38973:54;;;:::o;39033:242::-;39173:34;39169:1;39161:6;39157:14;39150:58;39242:25;39237:2;39229:6;39225:15;39218:50;39139:136;:::o;39281:172::-;39421:24;39417:1;39409:6;39405:14;39398:48;39387:66;:::o;39459:225::-;39599:34;39595:1;39587:6;39583:14;39576:58;39668:8;39663:2;39655:6;39651:15;39644:33;39565:119;:::o;39690:221::-;39830:34;39826:1;39818:6;39814:14;39807:58;39899:4;39894:2;39886:6;39882:15;39875:29;39796:115;:::o;39917:177::-;40057:29;40053:1;40045:6;40041:14;40034:53;40023:71;:::o;40100:251::-;40240:34;40236:1;40228:6;40224:14;40217:58;40309:34;40304:2;40296:6;40292:15;40285:59;40206:145;:::o;40357:177::-;40497:29;40493:1;40485:6;40481:14;40474:53;40463:71;:::o;40540:168::-;40680:20;40676:1;40668:6;40664:14;40657:44;40646:62;:::o;40714:225::-;40854:34;40850:1;40842:6;40838:14;40831:58;40923:8;40918:2;40910:6;40906:15;40899:33;40820:119;:::o;40945:174::-;41085:26;41081:1;41073:6;41069:14;41062:50;41051:68;:::o;41125:221::-;41265:34;41261:1;41253:6;41249:14;41242:58;41334:4;41329:2;41321:6;41317:15;41310:29;41231:115;:::o;41352:179::-;41492:31;41488:1;41480:6;41476:14;41469:55;41458:73;:::o;41537:181::-;41677:33;41673:1;41665:6;41661:14;41654:57;41643:75;:::o;41724:223::-;41864:34;41860:1;41852:6;41848:14;41841:58;41933:6;41928:2;41920:6;41916:15;41909:31;41830:117;:::o;41953:220::-;42093:34;42089:1;42081:6;42077:14;42070:58;42162:3;42157:2;42149:6;42145:15;42138:28;42059:114;:::o;42179:230::-;42319:34;42315:1;42307:6;42303:14;42296:58;42388:13;42383:2;42375:6;42371:15;42364:38;42285:124;:::o;42415:182::-;42555:34;42551:1;42543:6;42539:14;42532:58;42521:76;:::o;42603:222::-;42743:34;42739:1;42731:6;42727:14;42720:58;42812:5;42807:2;42799:6;42795:15;42788:30;42709:116;:::o;42831:170::-;42971:22;42967:1;42959:6;42955:14;42948:46;42937:64;:::o;43007:237::-;43147:34;43143:1;43135:6;43131:14;43124:58;43216:20;43211:2;43203:6;43199:15;43192:45;43113:131;:::o;43250:308::-;43390:34;43386:1;43378:6;43374:14;43367:58;43459:34;43454:2;43446:6;43442:15;43435:59;43528:22;43523:2;43515:6;43511:15;43504:47;43356:202;:::o;43564:171::-;43704:23;43700:1;43692:6;43688:14;43681:47;43670:65;:::o;43741:179::-;43881:31;43877:1;43869:6;43865:14;43858:55;43847:73;:::o;43926:234::-;44066:34;44062:1;44054:6;44050:14;44043:58;44135:17;44130:2;44122:6;44118:15;44111:42;44032:128;:::o;44166:292::-;44306:34;44302:1;44294:6;44290:14;44283:58;44375:34;44370:2;44362:6;44358:15;44351:59;44444:6;44439:2;44431:6;44427:15;44420:31;44272:186;:::o;44464:229::-;44604:34;44600:1;44592:6;44588:14;44581:58;44673:12;44668:2;44660:6;44656:15;44649:37;44570:123;:::o;44699:181::-;44839:33;44835:1;44827:6;44823:14;44816:57;44805:75;:::o;44886:179::-;45026:31;45022:1;45014:6;45010:14;45003:55;44992:73;:::o;45071:181::-;45211:33;45207:1;45199:6;45195:14;45188:57;45177:75;:::o;45258:175::-;45398:27;45394:1;45386:6;45382:14;45375:51;45364:69;:::o;45439:122::-;45512:24;45530:5;45512:24;:::i;:::-;45505:5;45502:35;45492:2;;45551:1;45548;45541:12;45492:2;45482:79;:::o;45567:116::-;45637:21;45652:5;45637:21;:::i;:::-;45630:5;45627:32;45617:2;;45673:1;45670;45663:12;45617:2;45607:76;:::o;45689:122::-;45762:24;45780:5;45762:24;:::i;:::-;45755:5;45752:35;45742:2;;45801:1;45798;45791:12;45742:2;45732:79;:::o
Swarm Source
ipfs://684e78ef3cbe2bab9cbde5b5364573591b51c1c61cd122c8c106bfe91e4018d9
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.