ERC-20
Overview
Max Total Supply
120,849,035,497,235,521.944868763204 COM
Holders
5,110
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 12 Decimals)
Balance
828,239,892,868,995.518593217324 COMValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Communis
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-09 */ // File: @openzeppelin\contracts\token\ERC20\IERC20.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin\contracts\token\ERC20\extensions\IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin\contracts\utils\Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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; } } // File: @openzeppelin\contracts\token\ERC20\ERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin\contracts\token\ERC20\extensions\ERC20Burnable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File: contracts\COM.sol // Codeak pragma solidity ^0.8.4; interface _HEX { function currentDay() external view returns (uint256); function stakeLists(address owner, uint256 stakeIndex) external view returns (uint40, uint72, uint72, uint16, uint16, uint16, bool); function stakeGoodAccounting(address stakerAddr, uint256 stakeIndex, uint40 stakeIdParam) external; function globals() external view returns ( uint72 lockedHeartsTotal ,uint72 nextStakeSharesTotal ,uint40 shareRate ,uint72 stakePenaltyTotal ,uint16 dailyDataCount ,uint72 stakeSharesTotal ,uint40 latestStakeId ,uint128 claimStats ); } contract Communis is ERC20, ERC20Burnable { _HEX private HEX; address internal constant contract_creator = 0x3dEF1720Ce2B04a56f0ee6BC9875C64A785136b9; constructor() ERC20("Communis", "COM") { HEX = _HEX(address(0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39)); } function decimals() public view virtual override returns (uint8) { return 12; } enum BonusType {START, END, GOOD, RESTAKE} event newMint( uint256 data0 ,uint256 data1 ,uint256 indexed stakeId ,uint256 indexed bonusType ,address indexed senderAddr ,address referrer ); event newDebtMint( uint256 data0 ,address indexed senderAddr ); event stakeDepositCodeak( uint256 data0 ,address indexed senderAddr ); event stakeWithdrawCodeak( uint256 data0 ,address indexed senderAddr ); struct PayoutResponse { uint256 recalculatedStakeShares; uint256 stakesOriginalShareRate; uint256 maxPayout; } struct Stake { uint256 stakeID; uint256 stakedHearts; uint256 stakeShares; uint256 lockedDay; uint256 stakedDays; uint256 unlockedDay; } struct RestakeEndDebt { uint16 stakedDays; uint16 endBonusPayoutDay; uint72 sharesDebt; } struct EndBonusDebt { uint16 nextPayoutDay; uint128 payoutDebt; } struct stakeIndexIdAmount { uint256 stakeIndex; uint256 stakeID; uint256 stakeAmount; } mapping(uint256 => uint256) public stakeIdStartBonusPayout; mapping(uint256 => uint256) public stakeIdEndBonusPayout; mapping(address => RestakeEndDebt) public addressRestakeEndDebt; mapping(address => EndBonusDebt) public addressEndBonusDebt; mapping(uint256 => uint256) public stakeIdGoodAccountingBonusPayout; mapping(address => uint256) public addressStakedCodeak; function memoryStake(address adr, uint256 stakeIndex, uint256 stakeID) internal view returns (Stake memory) { uint40 _stakeID; uint72 _stakedHearts; uint72 _stakeShares; uint16 _lockedDay; uint16 _stakedDays; uint16 _unlockedDay; (_stakeID, _stakedHearts, _stakeShares, _lockedDay, _stakedDays, _unlockedDay, ) = HEX.stakeLists(address(adr), stakeIndex); require(_stakeID == stakeID, "COM: Assure correct and current stake"); return Stake(_stakeID, _stakedHearts, _stakeShares, _lockedDay, _stakedDays, _unlockedDay); } function getGlobalShareRate() internal view returns (uint256 shareRate) { (, , shareRate, , , , , ) = HEX.globals(); } function _emitNewMint(uint256 payout, uint256 stakedDays, uint256 recalculatedStakeShares, uint256 stakesOriginalShareRate, uint256 stakedHearts, uint256 stakeID, address referrer, BonusType bonusType) private { emit newMint( (uint256(uint128(payout))) | (uint256(uint128(recalculatedStakeShares)) << 128) ,uint256(uint40(block.timestamp)) | (uint256(uint16(stakedDays)) << 40) | (uint256(uint40(stakesOriginalShareRate)) << 56) | (uint256(uint72(stakedHearts)) << 96) ,stakeID ,uint(bonusType) ,msg.sender ,referrer ); } function _emitNewDebtMint(uint16 nextPayoutDay, uint256 payout, uint128 payoutDebt) private { emit newDebtMint( uint256(nextPayoutDay) | (uint256(uint112(payout)) << 16) | (uint256(payoutDebt) << 128) ,msg.sender ); } function _emitStakeDepositCodeak(uint256 amount, uint256 stakedCodeak) private { emit stakeDepositCodeak( uint256(uint128(amount)) | (uint256(uint128(stakedCodeak)) << 128) ,msg.sender ); } function _emitStakeWithdrawCodeak(uint256 amount, uint256 stakedCodeak) private { emit stakeWithdrawCodeak( uint256(uint128(amount)) | (uint256(uint128(stakedCodeak)) << 128) ,msg.sender ); } /** * * @dev Reads current RestakeEndDebt * * Maintains latest end bonus payout day * * Maintains largest amount staked days * * Accumulates stake's shares as total sharesDebt * */ function _updateRestakeEndDebt(uint256 currentDay, Stake memory s) private { RestakeEndDebt storage red = addressRestakeEndDebt[msg.sender]; if(red.endBonusPayoutDay < currentDay) red.endBonusPayoutDay = uint16(currentDay); if(red.stakedDays < s.stakedDays) red.stakedDays = uint16(s.stakedDays); red.sharesDebt += uint72(s.stakeShares); } /** * * @dev Reads current RestakeEndDebt * * Assure new start stake (Stake Memory ss) meets requirements against RestakeEndDebt for Restake Bonus * * Delete any restake debt if obligations are met * */ function _validateRestakeBonus(Stake memory ss) private { require(ss.stakedDays > 364, "COM: Minimum 365 staked days required"); RestakeEndDebt storage red = addressRestakeEndDebt[msg.sender]; require(red.endBonusPayoutDay != 0, "COM: No valid restake opportunity"); require(ss.lockedDay > red.endBonusPayoutDay, "COM: Start Stake must be newer than previous stake"); require(ss.stakedDays == 5555 || ss.stakedDays > red.stakedDays, "COM: New staked days must be greater than to previous"); require(ss.stakeShares >= red.sharesDebt, "COM: Restake must at least maintain shares"); require(ss.stakeShares <= (red.sharesDebt * 2), "COM: Restake shares cannot be more than double"); delete addressRestakeEndDebt[msg.sender]; } /** * * @dev Reverse engineer amount of bonus HEX hearts that were used in * determining stake's HEX shares (this data is not kept in HEX storage) * * Formula is derived from HEX smart contract * */ function getStakesBonusHearts(Stake memory s) internal pure returns (uint256 stakesBonusHearts) { uint256 cappedDays = 0; if (s.stakedDays > 1) cappedDays = s.stakedDays <= 3640 ? s.stakedDays - 1 : 3640; uint256 cappedHearts = s.stakedHearts <= (15 * (10 ** 15)) ? s.stakedHearts : (15 * (10 ** 15)); stakesBonusHearts = s.stakedHearts * ((cappedDays * (15 * (10 ** 16))) + (cappedHearts * 1820)) / (273 * (10 ** 18)); } /** * * @dev Recalculate amount of bonus HEX hearts that would be applied if * the cappedDays were not limited to 3640 days * * Formula is derived from HEX smart contract * */ function getRecalculatedBonusHearts(Stake memory s) internal pure returns (uint256 recalculatedBonusHearts) { uint256 cappedDays = s.stakedDays - 1; uint256 cappedHearts = s.stakedHearts <= (15 * (10 ** 15)) ? s.stakedHearts : (15 * (10 ** 15)); recalculatedBonusHearts = s.stakedHearts * ((cappedDays * (15 * (10 ** 16))) + (cappedHearts * 1820)) / (273 * (10 ** 18)); } /** * * @dev Creates a consistent PayoutResponse for any given Stake * * Reverse engineer stakes original share rate as stakesOriginalShareRate using reverse engineered stakes bonus hearts * * Recalculate Stake Shares with new Recalculated Bonus Hearts and using Reverse engineered stakesOriginalShareRate * * Calculate penalty for amount days staked out of possible max length staked days of 5555, derived from HEX smart contract * * Max payout represents the maximum possible value that can be minted for any given Stake * */ function getPayout(Stake memory s) public pure returns (PayoutResponse memory pr) { uint256 stakesOriginalShareRate = ((s.stakedHearts + getStakesBonusHearts(s)) * (10 ** 5)) / s.stakeShares; uint256 recalculatedStakeShares = (s.stakedHearts + getRecalculatedBonusHearts(s)) * (10 ** 17) / stakesOriginalShareRate; pr.stakesOriginalShareRate = stakesOriginalShareRate; pr.recalculatedStakeShares = recalculatedStakeShares; uint256 penalty = (s.stakedDays * (10 ** 15)) / 5555; pr.maxPayout = (recalculatedStakeShares * penalty) / (10 ** 15); } /** * * @dev Creates a consistent payout for the Start Bonus given any Stake * * If applyRestakeBonus, staked days range between 365 and 5555: * 365 days gives bonusPercentage of 50000000000 and thus a 20% payout of maxPayout * 5555 days gives bonusPercentage of 20000000000 and thus a 50% payout of maxPayout * * Else if staked days greater than 364, staked days range between 365 and 5555: * 365 days gives bonusPercentage of 100000000000 and thus a 10% payout of maxPayout * 5555 days gives bonusPercentage of 40000000000 and thus a 25% payout of maxPayout * * Else, staked days range between 180 and 364: * 180 days gives bonusPercentage of 200000000000 and thus a 5% payout of maxPayout * 364 days gives bonusPercentage of ~100540540540 and thus a ~9.946% payout of maxPayout * * Penalty * global share rate is derived from HEX smart contract * global share rate can only increase over time * distance between current global share rate and reverse engineered stakes original share rate determine penalty * I.E. * 100,000 stakes share rate / 200,000 global share rate = you keep 50% of Start Bonus payout * 100,000 stakes share rate / 400,000 global share rate = you keep 25% of Start Bonus payout * */ function getStartBonusPayout(uint256 stakedDays, uint256 lockedDay, uint256 maxPayout, uint256 stakesOriginalShareRate, uint256 currentDay, uint256 globalShareRate, bool applyRestakeBonus) public pure returns (uint256 payout) { uint256 bonusPercentage; if(applyRestakeBonus == true) { bonusPercentage = (((stakedDays - 365) * (10 ** 10)) / 5190); bonusPercentage = ((3 * (10 ** 10)) * bonusPercentage) / (10 ** 10); bonusPercentage = (5 * (10 ** 10)) - bonusPercentage; } else if (stakedDays > 364) { bonusPercentage = ((stakedDays - 365) * (10 ** 10)) / 5190; bonusPercentage = ((6 * (10 ** 10)) * bonusPercentage) / (10 ** 10); bonusPercentage = (10 * (10 ** 10)) - bonusPercentage; } else { bonusPercentage = ((stakedDays - 180) * (10 ** 10)) / 185; bonusPercentage = ((10 * (10 ** 10)) * bonusPercentage) / (10 ** 10); bonusPercentage = (20 * (10 ** 10)) - bonusPercentage; } payout = (maxPayout * (10 ** 10)) / bonusPercentage; if(currentDay != lockedDay) { uint256 penalty = (stakesOriginalShareRate * (10 ** 15)) / globalShareRate; payout = (payout * penalty) / (10 ** 15); } } /** * * @dev Allows withdraw of staked Codeak associated with msg.sender address * */ function withdrawStakedCodeak(uint256 withdrawAmount) external { require(withdrawAmount <= addressStakedCodeak[msg.sender], "COM: Requested withdraw amount is more than Address Staked Amount"); addressStakedCodeak[msg.sender] -= withdrawAmount; _mint(msg.sender, withdrawAmount); _emitStakeWithdrawCodeak(withdrawAmount, addressStakedCodeak[msg.sender]); } /** * * @dev External call to mint stake bonus for staking Codeak * * Must have end bonus payout debt * * Must have staked Codeak greater than or equal to end bonus payout debt * */ function mintStakeBonus() external { EndBonusDebt storage ebd = addressEndBonusDebt[msg.sender]; if(ebd.payoutDebt != 0) { uint256 stakedCodeak = addressStakedCodeak[msg.sender]; require(stakedCodeak >= ebd.payoutDebt, "COM: Address Staked Amount does not cover End Bonus Debt"); _mintStakeBonus(ebd, HEX.currentDay(), stakedCodeak); } } /** * * @dev Mints stake bonus for staking Codeak * * Must have current day derived from HEX smart contract greater than next payout day * * Calculates number of payouts based on distance between current day and next payout day * with no limit between the amount of days between them but in 91 day chunks * * Sets next payout day depending on number of payouts minted * */ function _mintStakeBonus(EndBonusDebt storage ebd, uint256 currentDay, uint256 stakedCodeak) private { if(currentDay >= ebd.nextPayoutDay) { uint256 numberOfPayouts = ((currentDay - ebd.nextPayoutDay) / 91) + 1; uint256 payout = (stakedCodeak * numberOfPayouts) / 80; _mint(msg.sender, payout); ebd.nextPayoutDay += uint16(numberOfPayouts * 91); _emitNewDebtMint(ebd.nextPayoutDay, payout, ebd.payoutDebt); } } /** * * @dev Allows batch minting of Start Bonuses to reduce gas costs * */ function mintStartBonusBatch(stakeIndexIdAmount[] calldata stakeIndexIdAmounts, address referrer) external { uint256 stakeIndexIdAmountsLength = stakeIndexIdAmounts.length; uint256 currentDay = HEX.currentDay(); uint256 globalShareRate = getGlobalShareRate(); for(uint256 i = 0; i < stakeIndexIdAmountsLength;){ _mintStartBonus(stakeIndexIdAmounts[i].stakeIndex, stakeIndexIdAmounts[i].stakeID, false, referrer, currentDay, globalShareRate, stakeIndexIdAmounts[i].stakeAmount); unchecked { i++; } } } /** * * @dev External call for single Start Bonuses * */ function mintStartBonus(uint256 stakeIndex, uint256 stakeID, bool applyRestakeBonus, address referrer, uint256 stakeAmount) external { _mintStartBonus(stakeIndex, stakeID, applyRestakeBonus, referrer, HEX.currentDay(), getGlobalShareRate(), stakeAmount); } /** * * @dev Mints a bonus for starting a stake in HEX smart contract * * Start bonus is only an upfront cut of the total max payout available for any given stake * * Stake must not have its Start or End Bonus minted already * * Stake shares must be at least 10000 to truncate low value edge cases * * Start bonus forces minting Stake Bonus, if available, before staking new Codeak * */ function _mintStartBonus(uint256 stakeIndex, uint256 stakeID, bool applyRestakeBonus, address referrer, uint256 currentDay, uint256 globalShareRate, uint256 stakeAmount) private { require(stakeIdStartBonusPayout[stakeID] == 0, "COM: StakeID Start Bonus already minted"); require(stakeIdEndBonusPayout[stakeID] == 0, "COM: StakeID End Bonus already minted"); Stake memory s = memoryStake(address(msg.sender), stakeIndex, stakeID); require(s.stakeShares > 9999, "COM: Minimum 10000 shares required"); require(s.stakedDays > 179, "COM: Minimum 180 staked days required"); require(currentDay >= s.lockedDay, "COM: Stake not Active"); BonusType bt = BonusType.START; if(applyRestakeBonus == true) { _validateRestakeBonus(s); bt = BonusType.RESTAKE; } PayoutResponse memory pr = getPayout(s); uint256 payout = getStartBonusPayout(s.stakedDays, s.lockedDay, pr.maxPayout, pr.stakesOriginalShareRate, currentDay, globalShareRate, applyRestakeBonus); if(referrer == msg.sender) { payout += (payout / 100); } else if(referrer != address(0)) { _mint(referrer, (payout / 100)); } else { _mint(contract_creator, (payout / 100)); } stakeIdStartBonusPayout[stakeID] = payout; EndBonusDebt storage ebd = addressEndBonusDebt[msg.sender]; if(ebd.payoutDebt != 0 && addressStakedCodeak[msg.sender] >= ebd.payoutDebt) _mintStakeBonus(ebd, currentDay, addressStakedCodeak[msg.sender]); if(stakeAmount > 0) { require(stakeAmount <= payout, "COM: Stake amount is more than available payout"); addressStakedCodeak[msg.sender] += stakeAmount; payout -= stakeAmount; _emitStakeDepositCodeak(stakeAmount, addressStakedCodeak[msg.sender]); } if(payout > 0) _mint(msg.sender, payout); _emitNewMint(payout, s.stakedDays, pr.recalculatedStakeShares, pr.stakesOriginalShareRate, s.stakedHearts, s.stakeID, referrer, bt); } /** * * @dev Allows batch minting of End Bonuses to reduce gas costs * */ function mintEndBonusBatch(stakeIndexIdAmount[] calldata stakeIndexIdAmounts, address referrer) external { uint256 stakeIndexIdAmountsLength = stakeIndexIdAmounts.length; uint256 currentDay = HEX.currentDay(); for(uint256 i = 0; i < stakeIndexIdAmountsLength;){ _mintEndBonus(stakeIndexIdAmounts[i].stakeIndex, stakeIndexIdAmounts[i].stakeID, referrer, currentDay, stakeIndexIdAmounts[i].stakeAmount); unchecked { i++; } } } /** * * @dev External call for single End Bonuses * */ function mintEndBonus(uint256 stakeIndex, uint256 stakeID, address referrer, uint256 stakeAmount) external { _mintEndBonus(stakeIndex, stakeID, referrer, HEX.currentDay(), stakeAmount); } /** * * @dev Mints a bonus for fulfilling a stakes staked days commitment in HEX smart contract * * End bonus is the remaining total max payout available for any given stake, reduced only based on previous Start Stake Bonus minted * * Stake must not have its End Bonus minted already * * Stake shares must be at least 10000 to truncate low value edge cases * * 50% of End Bonus Payout is accumulated as End Bonus Debt * * End bonus forces minting Stake Bonus, if available, before staking new Codeak * * Allows staking new Codeak before checking if staked Codeak is less than End Bonus Debt * */ function _mintEndBonus(uint256 stakeIndex, uint256 stakeID, address referrer, uint256 currentDay, uint256 stakeAmount) private { require(stakeIdEndBonusPayout[stakeID] == 0, "COM: StakeID End Bonus already minted"); Stake memory s = memoryStake(address(msg.sender), stakeIndex, stakeID); require(s.stakedDays > 364, "COM: Minimum 365 staked days required"); require(s.stakeShares > 9999, "COM: Minimum 10000 shares required"); uint256 dueDay = s.lockedDay + s.stakedDays; require(currentDay >= dueDay, "COM: Stake not due"); require(currentDay <= dueDay + 37, "COM: Grace period ended"); PayoutResponse memory pr = getPayout(s); uint256 payout = pr.maxPayout - stakeIdStartBonusPayout[stakeID]; if(referrer == msg.sender) { payout += (payout / 100); } else if(referrer != address(0)) { _mint(referrer, (payout / 100)); } else { _mint(contract_creator, (payout / 100)); } stakeIdEndBonusPayout[stakeID] = payout; uint128 payoutDebt = uint128(payout / 2); EndBonusDebt storage ebd = addressEndBonusDebt[msg.sender]; if(ebd.payoutDebt != 0) _mintStakeBonus(ebd, currentDay, addressStakedCodeak[msg.sender]); if(stakeAmount > 0) { require(stakeAmount <= payout, "COM: Stake amount is more than available payout"); addressStakedCodeak[msg.sender] += stakeAmount; payout -= stakeAmount; _emitStakeDepositCodeak(stakeAmount, addressStakedCodeak[msg.sender]); } if(ebd.payoutDebt != 0) require(addressStakedCodeak[msg.sender] >= ebd.payoutDebt, "COM: Address Staked Amount does not cover End Bonus Debt"); else ebd.nextPayoutDay = uint16(currentDay) + 91; if(payout > 0) _mint(msg.sender, payout); _emitNewMint(payout, s.stakedDays, pr.recalculatedStakeShares, pr.stakesOriginalShareRate, s.stakedHearts, s.stakeID, referrer, BonusType.END); _updateRestakeEndDebt(currentDay, s); ebd.payoutDebt += payoutDebt; } /** * * @dev Mints a bonus for cleaning stale shares in the HEX smart contract * * Stake must not already be unlocked * * Stake must not have its End or Good Accounting Bonus minted already * */ function mintGoodAccountingBonus(address stakeOwner, uint256 stakeIndex, uint256 stakeID) external { require(stakeIdGoodAccountingBonusPayout[stakeID] == 0, "COM: StakeID Good Accounting Bonus already minted"); require(stakeIdEndBonusPayout[stakeID] == 0, "COM: StakeID End Bonus already minted"); Stake memory s = memoryStake(address(stakeOwner), stakeIndex, stakeID); require(s.stakeShares > 9999, "COM: Minimum 10000 shares required"); require(s.unlockedDay == 0, "COM: Stake already unlocked"); require(HEX.currentDay() > s.lockedDay + s.stakedDays + 37, "COM: Grace period has not ended"); HEX.stakeGoodAccounting(address(stakeOwner), stakeIndex, uint40(stakeID)); Stake memory sga = memoryStake(address(stakeOwner), stakeIndex, stakeID); require(sga.unlockedDay != 0, "COM: Stake did not have Good Accounting ran"); PayoutResponse memory pr = getPayout(s); uint256 payout = pr.maxPayout / 100; stakeIdGoodAccountingBonusPayout[stakeID] = payout; _mint(msg.sender, payout); _emitNewMint(payout, s.stakedDays, pr.recalculatedStakeShares, pr.stakesOriginalShareRate, s.stakedHearts, s.stakeID, address(0), BonusType.GOOD); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"data0","type":"uint256"},{"indexed":true,"internalType":"address","name":"senderAddr","type":"address"}],"name":"newDebtMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"data0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"data1","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"bonusType","type":"uint256"},{"indexed":true,"internalType":"address","name":"senderAddr","type":"address"},{"indexed":false,"internalType":"address","name":"referrer","type":"address"}],"name":"newMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"data0","type":"uint256"},{"indexed":true,"internalType":"address","name":"senderAddr","type":"address"}],"name":"stakeDepositCodeak","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"data0","type":"uint256"},{"indexed":true,"internalType":"address","name":"senderAddr","type":"address"}],"name":"stakeWithdrawCodeak","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressEndBonusDebt","outputs":[{"internalType":"uint16","name":"nextPayoutDay","type":"uint16"},{"internalType":"uint128","name":"payoutDebt","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressRestakeEndDebt","outputs":[{"internalType":"uint16","name":"stakedDays","type":"uint16"},{"internalType":"uint16","name":"endBonusPayoutDay","type":"uint16"},{"internalType":"uint72","name":"sharesDebt","type":"uint72"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressStakedCodeak","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"stakeID","type":"uint256"},{"internalType":"uint256","name":"stakedHearts","type":"uint256"},{"internalType":"uint256","name":"stakeShares","type":"uint256"},{"internalType":"uint256","name":"lockedDay","type":"uint256"},{"internalType":"uint256","name":"stakedDays","type":"uint256"},{"internalType":"uint256","name":"unlockedDay","type":"uint256"}],"internalType":"struct Communis.Stake","name":"s","type":"tuple"}],"name":"getPayout","outputs":[{"components":[{"internalType":"uint256","name":"recalculatedStakeShares","type":"uint256"},{"internalType":"uint256","name":"stakesOriginalShareRate","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"}],"internalType":"struct Communis.PayoutResponse","name":"pr","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakedDays","type":"uint256"},{"internalType":"uint256","name":"lockedDay","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"stakesOriginalShareRate","type":"uint256"},{"internalType":"uint256","name":"currentDay","type":"uint256"},{"internalType":"uint256","name":"globalShareRate","type":"uint256"},{"internalType":"bool","name":"applyRestakeBonus","type":"bool"}],"name":"getStartBonusPayout","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint256","name":"stakeID","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"name":"mintEndBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint256","name":"stakeID","type":"uint256"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"internalType":"struct Communis.stakeIndexIdAmount[]","name":"stakeIndexIdAmounts","type":"tuple[]"},{"internalType":"address","name":"referrer","type":"address"}],"name":"mintEndBonusBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakeOwner","type":"address"},{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint256","name":"stakeID","type":"uint256"}],"name":"mintGoodAccountingBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStakeBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint256","name":"stakeID","type":"uint256"},{"internalType":"bool","name":"applyRestakeBonus","type":"bool"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"name":"mintStartBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint256","name":"stakeID","type":"uint256"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"internalType":"struct Communis.stakeIndexIdAmount[]","name":"stakeIndexIdAmounts","type":"tuple[]"},{"internalType":"address","name":"referrer","type":"address"}],"name":"mintStartBonusBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeIdEndBonusPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeIdGoodAccountingBonusPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeIdStartBonusPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawStakedCodeak","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600881526020017f436f6d6d756e69730000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f434f4d000000000000000000000000000000000000000000000000000000000081525081600390816200008f9190620001a4565b5060046200009e8282620001a4565b5050600580546001600160a01b031916732b591e99afe9f32eaa6214f7b7629768c40eeb391790555062000270565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600181811c908216806200011157607f821691505b6020821081036200014b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156200019f57600081815260208120601f850160051c810160208610156200017a5750805b601f850160051c820191505b818110156200019b5782815560010162000186565b5050505b505050565b81516001600160401b03811115620001c057620001c0620000cd565b620001d881620001d18454620000fc565b8462000151565b602080601f831160018114620002105760008415620001f75750858301515b600019600386901b1c1916600185901b1785556200019b565b600085815260208120601f198616915b82811015620002415788860151825594840194600190910190840162000220565b5085821015620002605787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612f0f80620002806000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379cc6790116100f9578063b2d9bf8011610097578063c031e1df11610071578063c031e1df1461046d578063dd62ed3e146104a2578063e107625d146104b5578063ea98ed9a146104c857600080fd5b8063b2d9bf801461043f578063b4f98bed14610452578063bf607ab81461046557600080fd5b80638efd25c3116100d35780638efd25c3146103fe57806395d89b4114610411578063a457c2d714610419578063a9059cbb1461042c57600080fd5b806379cc6790146103b85780637b4296db146103cb5780638c58e047146103eb57600080fd5b80633b665f9c1161016657806367350ffe1161014057806367350ffe1461033c5780636c03c39c1461034f57806370a082311461036f578063741bf9211461039857600080fd5b80633b665f9c1461026657806342966c68146102bd57806360bc0be8146102d057600080fd5b806323b872dd116101a257806323b872dd1461021c578063313ce5671461022f578063395093511461023e57806339d6e5671461025157600080fd5b806306fdde03146101c9578063095ea7b3146101e757806318160ddd1461020a575b600080fd5b6101d16104e8565b6040516101de91906126fd565b60405180910390f35b6101fa6101f5366004612767565b61057a565b60405190151581526020016101de565b6002545b6040519081526020016101de565b6101fa61022a366004612791565b610594565b604051600c81526020016101de565b6101fa61024c366004612767565b6105b8565b61026461025f3660046127cd565b6105da565b005b61029b610274366004612800565b60096020526000908152604090205461ffff8116906201000090046001600160801b031682565b6040805161ffff90931683526001600160801b039091166020830152016101de565b6102646102cb366004612822565b610940565b6103126102de366004612800565b60086020526000908152604090205461ffff808216916201000081049091169064010000000090046001600160481b031683565b6040805161ffff94851681529390921660208401526001600160481b0316908201526060016101de565b61026461034a366004612849565b61094d565b61020e61035d366004612822565b600a6020526000908152604090205481565b61020e61037d366004612800565b6001600160a01b031660009081526020819052604090205490565b61020e6103a6366004612822565b60066020526000908152604090205481565b6102646103c6366004612767565b6109e0565b61020e6103d9366004612800565b600b6020526000908152604090205481565b6102646103f9366004612899565b6109f9565b61026461040c366004612822565b610aee565b6101d1610bc7565b6101fa610427366004612767565b610bd6565b6101fa61043a366004612767565b610c51565b61026461044d366004612899565b610c5f565b61020e61046036600461291d565b610d4d565b610264610ee9565b61048061047b36600461297d565b610fcf565b60408051825181526020808401519082015291810151908201526060016101de565b61020e6104b0366004612a05565b6110c2565b6102646104c3366004612a38565b6110ed565b61020e6104d6366004612822565b60076020526000908152604090205481565b6060600380546104f790612a75565b80601f016020809104026020016040519081016040528092919081815260200182805461052390612a75565b80156105705780601f1061054557610100808354040283529160200191610570565b820191906000526020600020905b81548152906001019060200180831161055357829003601f168201915b5050505050905090565b600033610588818585611176565b60019150505b92915050565b6000336105a285828561129b565b6105ad85858561130f565b506001949350505050565b6000336105888185856105cb83836110c2565b6105d59190612ac5565b611176565b6000818152600a6020526040902054156106555760405162461bcd60e51b815260206004820152603160248201527f434f4d3a205374616b65494420476f6f64204163636f756e74696e6720426f6e6044820152701d5cc8185b1c9958591e481b5a5b9d1959607a1b60648201526084015b60405180910390fd5b600081815260076020526040902054156106815760405162461bcd60e51b815260040161064c90612ad8565b600061068e8484846114dd565b905061270f8160400151116106b55760405162461bcd60e51b815260040161064c90612b1d565b60a0810151156107075760405162461bcd60e51b815260206004820152601b60248201527f434f4d3a205374616b6520616c726561647920756e6c6f636b65640000000000604482015260640161064c565b8060800151816060015161071b9190612ac5565b610726906025612ac5565b600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d9190612b5f565b116107ea5760405162461bcd60e51b815260206004820152601f60248201527f434f4d3a20477261636520706572696f6420686173206e6f7420656e64656400604482015260640161064c565b6005546040516332e7b8d960e11b81526001600160a01b0386811660048301526024820186905264ffffffffff85166044830152909116906365cf71b290606401600060405180830381600087803b15801561084557600080fd5b505af1158015610859573d6000803e3d6000fd5b50505050600061086a8585856114dd565b90508060a001516000036108d45760405162461bcd60e51b815260206004820152602b60248201527f434f4d3a205374616b6520646964206e6f74206861766520476f6f642041636360448201526a37bab73a34b733903930b760a91b606482015260840161064c565b60006108df83610fcf565b90506000606482604001516108f49190612b78565b6000868152600a602052604090208190559050610911338261165e565b61093781856080015184600001518560200151886020015189600001516000600261173d565b50505050505050565b61094a33826117f5565b50565b6109d985858585600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cb9190612b5f565b6109d3611940565b876119c4565b5050505050565b6109eb82338361129b565b6109f582826117f5565b5050565b60055460408051635c9302c960e01b8152905184926000926001600160a01b0390911691635c9302c9916004808201926020929091908290030181865afa158015610a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6c9190612b5f565b90506000610a78611940565b905060005b8381101561093757610ae6878783818110610a9a57610a9a612b9a565b90506060020160000135888884818110610ab657610ab6612b9a565b9050606002016020013560008887878d8d89818110610ad757610ad7612b9a565b905060600201604001356119c4565b600101610a7d565b336000908152600b6020526040902054811115610b7d5760405162461bcd60e51b815260206004820152604160248201527f434f4d3a2052657175657374656420776974686472617720616d6f756e74206960448201527f73206d6f7265207468616e2041646472657373205374616b656420416d6f756e6064820152601d60fa1b608482015260a40161064c565b336000908152600b602052604081208054839290610b9c908490612bb0565b90915550610bac9050338261165e565b336000908152600b602052604090205461094a908290611d32565b6060600480546104f790612a75565b60003381610be482866110c2565b905083811015610c445760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161064c565b6105ad8286868403611176565b60003361058881858561130f565b60055460408051635c9302c960e01b8152905184926000926001600160a01b0390911691635c9302c9916004808201926020929091908290030181865afa158015610cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd29190612b5f565b905060005b82811015610d4557610d3d868683818110610cf457610cf4612b9a565b90506060020160000135878784818110610d1057610d10612b9a565b9050606002016020013586858a8a87818110610d2e57610d2e612b9a565b90506060020160400135611d85565b600101610cd7565b505050505050565b600080821515600103610dbb57611446610d6961016d8b612bb0565b610d78906402540be400612bc3565b610d829190612b78565b90506402540be400610d99826406fc23ac00612bc3565b610da39190612b78565b9050610db481640ba43b7400612bb0565b9050610e7a565b61016c891115610e1f57611446610dd461016d8b612bb0565b610de3906402540be400612bc3565b610ded9190612b78565b90506402540be400610e0482640df8475800612bc3565b610e0e9190612b78565b9050610db48164174876e800612bb0565b60b9610e2c60b48b612bb0565b610e3b906402540be400612bc3565b610e459190612b78565b90506402540be400610e5c8264174876e800612bc3565b610e669190612b78565b9050610e7781642e90edd000612bb0565b90505b80610e8a886402540be400612bc3565b610e949190612b78565b9150878514610edd57600084610eb18866038d7ea4c68000612bc3565b610ebb9190612b78565b905066038d7ea4c68000610ecf8285612bc3565b610ed99190612b78565b9250505b50979650505050505050565b33600090815260096020526040902080546201000090046001600160801b03161561094a57336000908152600b602052604090205481546201000090046001600160801b0316811015610f4e5760405162461bcd60e51b815260040161064c90612be2565b6109f582600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc99190612b5f565b83612143565b610ff360405180606001604052806000815260200160008152602001600081525090565b60008260400151611003846121fd565b84602001516110129190612ac5565b61101f90620186a0612bc3565b6110299190612b78565b9050600081611037856122b8565b85602001516110469190612ac5565b6110589067016345785d8a0000612bc3565b6110629190612b78565b6020840183905280845260808501519091506000906115b39061108c9066038d7ea4c68000612bc3565b6110969190612b78565b905066038d7ea4c680006110aa8284612bc3565b6110b49190612b78565b604085015250919392505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611170848484600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116a9190612b5f565b85611d85565b50505050565b6001600160a01b0383166111d85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161064c565b6001600160a01b0382166112395760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161064c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006112a784846110c2565b9050600019811461117057818110156113025760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064c565b6111708484848403611176565b6001600160a01b0383166113735760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161064c565b6001600160a01b0382166113d55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161064c565b6001600160a01b0383166000908152602081905260409020548181101561144d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161064c565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611484908490612ac5565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114d091815260200190565b60405180910390a3611170565b6115166040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600554604051632607443b60e01b81526001600160a01b038681166004830152602482018690526000928392839283928392839290911690632607443b9060440160e060405180830381865afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190612c7d565b50949a5092985090965094509250905064ffffffffff8616881461160c5760405162461bcd60e51b815260206004820152602560248201527f434f4d3a2041737375726520636f727265637420616e642063757272656e74206044820152647374616b6560d81b606482015260840161064c565b6040805160c08101825264ffffffffff90971687526001600160481b039586166020880152939094169285019290925261ffff908116606085015290811660808401521660a082015290509392505050565b6001600160a01b0382166116b45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064c565b80600260008282546116c69190612ac5565b90915550506001600160a01b038216600090815260208190526040812080548392906116f3908490612ac5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b3381600381111561175057611750612cf7565b847fafc22f2a1b7c8423cb392f3fe7711c08b38f98246adb12e5a041c2fba455ef2a60808a6001600160801b0316901b8c6001600160801b0316176060896001600160481b0316901b60388b64ffffffffff16901b60288e61ffff16901b4264ffffffffff16171717876040516117e39392919092835260208301919091526001600160a01b0316604082015260600190565b60405180910390a45050505050505050565b6001600160a01b0382166118555760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161064c565b6001600160a01b038216600090815260208190526040902054818110156118c95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161064c565b6001600160a01b03831660009081526020819052604081208383039055600280548492906118f8908490612bb0565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161128e565b505050565b6005546040805163c312452560e01b815290516000926001600160a01b03169163c3124525916004808301926101009291908290030181865afa15801561198b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119af9190612d0d565b505064ffffffffff9093169695505050505050565b60008681526006602052604090205415611a305760405162461bcd60e51b815260206004820152602760248201527f434f4d3a205374616b65494420537461727420426f6e757320616c7265616479604482015266081b5a5b9d195960ca1b606482015260840161064c565b60008681526007602052604090205415611a5c5760405162461bcd60e51b815260040161064c90612ad8565b6000611a693389896114dd565b905061270f816040015111611a905760405162461bcd60e51b815260040161064c90612b1d565b60b3816080015111611af25760405162461bcd60e51b815260206004820152602560248201527f434f4d3a204d696e696d756d20313830207374616b65642064617973207265716044820152641d5a5c995960da1b606482015260840161064c565b8060600151841015611b3e5760405162461bcd60e51b8152602060048201526015602482015274434f4d3a205374616b65206e6f742041637469766560581b604482015260640161064c565b6000861515600103611b5757611b53826122cc565b5060035b6000611b6283610fcf565b90506000611b8584608001518560600151846040015185602001518b8b8f610d4d565b9050336001600160a01b03891603611bb357611ba2606482612b78565b611bac9082612ac5565b9050611bfe565b6001600160a01b03881615611bdb57611bd688611bd1606484612b78565b61165e565b611bfe565b611bfe733def1720ce2b04a56f0ee6bc9875c64a785136b9611bd1606484612b78565b60008a81526006602090815260408083208490553383526009909152902080546201000090046001600160801b031615801590611c5b57508054336000908152600b6020526040902054620100009091046001600160801b031611155b15611c7d57336000908152600b6020526040902054611c7d9082908a90612143565b8515611cf05781861115611ca35760405162461bcd60e51b815260040161064c90612db4565b336000908152600b602052604081208054889290611cc2908490612ac5565b90915550611cd290508683612bb0565b336000908152600b6020526040902054909250611cf090879061259b565b8115611d0057611d00338361165e565b611d248286608001518560000151866020015189602001518a600001518f8b61173d565b505050505050505050505050565b6040516001600160801b0383166001600160801b0319608084901b1617815233907f4cbbb1897a82fabe5c208fdda8b9787408442e9e6f9263068465e228a5f906c4906020015b60405180910390a25050565b60008481526007602052604090205415611db15760405162461bcd60e51b815260040161064c90612ad8565b6000611dbe3387876114dd565b905061016c816080015111611de55760405162461bcd60e51b815260040161064c90612e03565b61270f816040015111611e0a5760405162461bcd60e51b815260040161064c90612b1d565b600081608001518260600151611e209190612ac5565b905080841015611e675760405162461bcd60e51b8152602060048201526012602482015271434f4d3a205374616b65206e6f742064756560701b604482015260640161064c565b611e72816025612ac5565b841115611ec15760405162461bcd60e51b815260206004820152601760248201527f434f4d3a20477261636520706572696f6420656e646564000000000000000000604482015260640161064c565b6000611ecc83610fcf565b60008881526006602052604080822054908301519293509091611eef9190612bb0565b9050336001600160a01b03881603611f1d57611f0c606482612b78565b611f169082612ac5565b9050611f63565b6001600160a01b03871615611f4057611f3b87611bd1606484612b78565b611f63565b611f63733def1720ce2b04a56f0ee6bc9875c64a785136b9611bd1606484612b78565b6000888152600760205260408120829055611f7f600283612b78565b3360009081526009602052604090208054919250906201000090046001600160801b031615611fc557336000908152600b6020526040902054611fc59082908a90612143565b86156120385782871115611feb5760405162461bcd60e51b815260040161064c90612db4565b336000908152600b60205260408120805489929061200a908490612ac5565b9091555061201a90508784612bb0565b336000908152600b602052604090205490935061203890889061259b565b80546201000090046001600160801b031615612093578054336000908152600b6020526040902054620100009091046001600160801b0316111561208e5760405162461bcd60e51b815260040161064c90612be2565b6120b0565b61209e88605b612e48565b815461ffff191661ffff919091161781555b82156120c0576120c0338461165e565b6120e5838760800151866000015187602001518a602001518b600001518f600161173d565b6120ef88876125e6565b8054829082906002906121129084906201000090046001600160801b0316612e6a565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505050505050505050505050565b825461ffff16821061193b578254600090605b906121659061ffff1685612bb0565b61216f9190612b78565b61217a906001612ac5565b90506000605061218a8385612bc3565b6121949190612b78565b90506121a0338261165e565b6121ab82605b612bc3565b855486906000906121c190849061ffff16612e48565b82546101009290920a61ffff81810219909316918316021790915586546109d992509081169083906201000090046001600160801b0316612697565b6000806000905060018360800151111561223b57610e388360800151111561222757610e38612238565b600183608001516122389190612bb0565b90505b600066354a6ba7a180008460200151111561225d5766354a6ba7a18000612263565b83602001515b9050680ecca2d59581a4000061227b8261071c612bc3565b61228d84670214e8348c4f0000612bc3565b6122979190612ac5565b85602001516122a69190612bc3565b6122b09190612b78565b949350505050565b600080600183608001516122389190612bb0565b61016c8160800151116122f15760405162461bcd60e51b815260040161064c90612e03565b336000908152600860205260408120805490916201000090910461ffff1690036123675760405162461bcd60e51b815260206004820152602160248201527f434f4d3a204e6f2076616c69642072657374616b65206f70706f7274756e69746044820152607960f81b606482015260840161064c565b805460608301516201000090910461ffff16106123e15760405162461bcd60e51b815260206004820152603260248201527f434f4d3a205374617274205374616b65206d757374206265206e65776572207460448201527168616e2070726576696f7573207374616b6560701b606482015260840161064c565b81608001516115b314806123ff57508054608083015161ffff909116105b6124695760405162461bcd60e51b815260206004820152603560248201527f434f4d3a204e6577207374616b65642064617973206d7573742062652067726560448201527461746572207468616e20746f2070726576696f757360581b606482015260840161064c565b805460408301516401000000009091046001600160481b031611156124e35760405162461bcd60e51b815260206004820152602a60248201527f434f4d3a2052657374616b65206d757374206174206c65617374206d61696e7460448201526961696e2073686172657360b01b606482015260840161064c565b80546125019064010000000090046001600160481b03166002612e8a565b6001600160481b0316826040015111156125745760405162461bcd60e51b815260206004820152602e60248201527f434f4d3a2052657374616b65207368617265732063616e6e6f74206265206d6f60448201526d7265207468616e20646f75626c6560901b606482015260840161064c565b505033600090815260086020526040902080546cffffffffffffffffffffffffff19169055565b6040516001600160801b0383166001600160801b0319608084901b1617815233907fa8f21c07a94b82da90d177f9b2b3a25e91a969ac251d1601fa387a831c951ad890602001611d79565b336000908152600860205260409020805462010000900461ffff1683111561261f57805463ffff000019166201000061ffff8516021781555b6080820151815461ffff161015612646576080820151815461ffff191661ffff9091161781555b60408201518154829060049061266e90849064010000000090046001600160481b0316612eb9565b92506101000a8154816001600160481b0302191690836001600160481b03160217905550505050565b60405161ffff84166fffffffffffffffffffffffffffff0000601085901b16176001600160801b0319608084901b1617815233907f3a4343c9c29638775b0d0acbd8fcb6ec75cf77284a520b2f4b41357b86f4900c9060200160405180910390a2505050565b600060208083528351808285015260005b8181101561272a5785810183015185820160400152820161270e565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461276257600080fd5b919050565b6000806040838503121561277a57600080fd5b6127838361274b565b946020939093013593505050565b6000806000606084860312156127a657600080fd5b6127af8461274b565b92506127bd6020850161274b565b9150604084013590509250925092565b6000806000606084860312156127e257600080fd5b6127eb8461274b565b95602085013595506040909401359392505050565b60006020828403121561281257600080fd5b61281b8261274b565b9392505050565b60006020828403121561283457600080fd5b5035919050565b801515811461094a57600080fd5b600080600080600060a0868803121561286157600080fd5b8535945060208601359350604086013561287a8161283b565b92506128886060870161274b565b949793965091946080013592915050565b6000806000604084860312156128ae57600080fd5b833567ffffffffffffffff808211156128c657600080fd5b818601915086601f8301126128da57600080fd5b8135818111156128e957600080fd5b8760206060830285010111156128fe57600080fd5b602092830195509350612914918601905061274b565b90509250925092565b600080600080600080600060e0888a03121561293857600080fd5b873596506020880135955060408801359450606088013593506080880135925060a0880135915060c088013561296d8161283b565b8091505092959891949750929550565b600060c0828403121561298f57600080fd5b60405160c0810181811067ffffffffffffffff821117156129c057634e487b7160e01b600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201528091505092915050565b60008060408385031215612a1857600080fd5b612a218361274b565b9150612a2f6020840161274b565b90509250929050565b60008060008060808587031215612a4e57600080fd5b8435935060208501359250612a656040860161274b565b9396929550929360600135925050565b600181811c90821680612a8957607f821691505b602082108103612aa957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561058e5761058e612aaf565b60208082526025908201527f434f4d3a205374616b65494420456e6420426f6e757320616c7265616479206d6040820152641a5b9d195960da1b606082015260800190565b60208082526022908201527f434f4d3a204d696e696d756d2031303030302073686172657320726571756972604082015261195960f21b606082015260800190565b600060208284031215612b7157600080fd5b5051919050565b600082612b9557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b8181038181111561058e5761058e612aaf565b6000816000190483118215151615612bdd57612bdd612aaf565b500290565b60208082526038908201527f434f4d3a2041646472657373205374616b656420416d6f756e7420646f65732060408201527f6e6f7420636f76657220456e6420426f6e757320446562740000000000000000606082015260800190565b805164ffffffffff8116811461276257600080fd5b80516001600160481b038116811461276257600080fd5b805161ffff8116811461276257600080fd5b600080600080600080600060e0888a031215612c9857600080fd5b612ca188612c3f565b9650612caf60208901612c54565b9550612cbd60408901612c54565b9450612ccb60608901612c6b565b9350612cd960808901612c6b565b9250612ce760a08901612c6b565b915060c088015161296d8161283b565b634e487b7160e01b600052602160045260246000fd5b600080600080600080600080610100898b031215612d2a57600080fd5b612d3389612c54565b9750612d4160208a01612c54565b9650612d4f60408a01612c3f565b9550612d5d60608a01612c54565b9450612d6b60808a01612c6b565b9350612d7960a08a01612c54565b9250612d8760c08a01612c3f565b915060e08901516001600160801b0381168114612da357600080fd5b809150509295985092959890939650565b6020808252602f908201527f434f4d3a205374616b6520616d6f756e74206973206d6f7265207468616e206160408201526e1d985a5b18589b19481c185e5bdd5d608a1b606082015260800190565b60208082526025908201527f434f4d3a204d696e696d756d20333635207374616b65642064617973207265716040820152641d5a5c995960da1b606082015260800190565b61ffff818116838216019080821115612e6357612e63612aaf565b5092915050565b6001600160801b03818116838216019080821115612e6357612e63612aaf565b60006001600160481b0380831681851681830481118215151615612eb057612eb0612aaf565b02949350505050565b6001600160481b03818116838216019080821115612e6357612e63612aaf56fea264697066735822122061a13278b51a7e83d610fe88bde393134b6eef7699d4c59c7a88088a0cba7ed664736f6c63430008100033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806379cc6790116100f9578063b2d9bf8011610097578063c031e1df11610071578063c031e1df1461046d578063dd62ed3e146104a2578063e107625d146104b5578063ea98ed9a146104c857600080fd5b8063b2d9bf801461043f578063b4f98bed14610452578063bf607ab81461046557600080fd5b80638efd25c3116100d35780638efd25c3146103fe57806395d89b4114610411578063a457c2d714610419578063a9059cbb1461042c57600080fd5b806379cc6790146103b85780637b4296db146103cb5780638c58e047146103eb57600080fd5b80633b665f9c1161016657806367350ffe1161014057806367350ffe1461033c5780636c03c39c1461034f57806370a082311461036f578063741bf9211461039857600080fd5b80633b665f9c1461026657806342966c68146102bd57806360bc0be8146102d057600080fd5b806323b872dd116101a257806323b872dd1461021c578063313ce5671461022f578063395093511461023e57806339d6e5671461025157600080fd5b806306fdde03146101c9578063095ea7b3146101e757806318160ddd1461020a575b600080fd5b6101d16104e8565b6040516101de91906126fd565b60405180910390f35b6101fa6101f5366004612767565b61057a565b60405190151581526020016101de565b6002545b6040519081526020016101de565b6101fa61022a366004612791565b610594565b604051600c81526020016101de565b6101fa61024c366004612767565b6105b8565b61026461025f3660046127cd565b6105da565b005b61029b610274366004612800565b60096020526000908152604090205461ffff8116906201000090046001600160801b031682565b6040805161ffff90931683526001600160801b039091166020830152016101de565b6102646102cb366004612822565b610940565b6103126102de366004612800565b60086020526000908152604090205461ffff808216916201000081049091169064010000000090046001600160481b031683565b6040805161ffff94851681529390921660208401526001600160481b0316908201526060016101de565b61026461034a366004612849565b61094d565b61020e61035d366004612822565b600a6020526000908152604090205481565b61020e61037d366004612800565b6001600160a01b031660009081526020819052604090205490565b61020e6103a6366004612822565b60066020526000908152604090205481565b6102646103c6366004612767565b6109e0565b61020e6103d9366004612800565b600b6020526000908152604090205481565b6102646103f9366004612899565b6109f9565b61026461040c366004612822565b610aee565b6101d1610bc7565b6101fa610427366004612767565b610bd6565b6101fa61043a366004612767565b610c51565b61026461044d366004612899565b610c5f565b61020e61046036600461291d565b610d4d565b610264610ee9565b61048061047b36600461297d565b610fcf565b60408051825181526020808401519082015291810151908201526060016101de565b61020e6104b0366004612a05565b6110c2565b6102646104c3366004612a38565b6110ed565b61020e6104d6366004612822565b60076020526000908152604090205481565b6060600380546104f790612a75565b80601f016020809104026020016040519081016040528092919081815260200182805461052390612a75565b80156105705780601f1061054557610100808354040283529160200191610570565b820191906000526020600020905b81548152906001019060200180831161055357829003601f168201915b5050505050905090565b600033610588818585611176565b60019150505b92915050565b6000336105a285828561129b565b6105ad85858561130f565b506001949350505050565b6000336105888185856105cb83836110c2565b6105d59190612ac5565b611176565b6000818152600a6020526040902054156106555760405162461bcd60e51b815260206004820152603160248201527f434f4d3a205374616b65494420476f6f64204163636f756e74696e6720426f6e6044820152701d5cc8185b1c9958591e481b5a5b9d1959607a1b60648201526084015b60405180910390fd5b600081815260076020526040902054156106815760405162461bcd60e51b815260040161064c90612ad8565b600061068e8484846114dd565b905061270f8160400151116106b55760405162461bcd60e51b815260040161064c90612b1d565b60a0810151156107075760405162461bcd60e51b815260206004820152601b60248201527f434f4d3a205374616b6520616c726561647920756e6c6f636b65640000000000604482015260640161064c565b8060800151816060015161071b9190612ac5565b610726906025612ac5565b600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d9190612b5f565b116107ea5760405162461bcd60e51b815260206004820152601f60248201527f434f4d3a20477261636520706572696f6420686173206e6f7420656e64656400604482015260640161064c565b6005546040516332e7b8d960e11b81526001600160a01b0386811660048301526024820186905264ffffffffff85166044830152909116906365cf71b290606401600060405180830381600087803b15801561084557600080fd5b505af1158015610859573d6000803e3d6000fd5b50505050600061086a8585856114dd565b90508060a001516000036108d45760405162461bcd60e51b815260206004820152602b60248201527f434f4d3a205374616b6520646964206e6f74206861766520476f6f642041636360448201526a37bab73a34b733903930b760a91b606482015260840161064c565b60006108df83610fcf565b90506000606482604001516108f49190612b78565b6000868152600a602052604090208190559050610911338261165e565b61093781856080015184600001518560200151886020015189600001516000600261173d565b50505050505050565b61094a33826117f5565b50565b6109d985858585600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cb9190612b5f565b6109d3611940565b876119c4565b5050505050565b6109eb82338361129b565b6109f582826117f5565b5050565b60055460408051635c9302c960e01b8152905184926000926001600160a01b0390911691635c9302c9916004808201926020929091908290030181865afa158015610a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6c9190612b5f565b90506000610a78611940565b905060005b8381101561093757610ae6878783818110610a9a57610a9a612b9a565b90506060020160000135888884818110610ab657610ab6612b9a565b9050606002016020013560008887878d8d89818110610ad757610ad7612b9a565b905060600201604001356119c4565b600101610a7d565b336000908152600b6020526040902054811115610b7d5760405162461bcd60e51b815260206004820152604160248201527f434f4d3a2052657175657374656420776974686472617720616d6f756e74206960448201527f73206d6f7265207468616e2041646472657373205374616b656420416d6f756e6064820152601d60fa1b608482015260a40161064c565b336000908152600b602052604081208054839290610b9c908490612bb0565b90915550610bac9050338261165e565b336000908152600b602052604090205461094a908290611d32565b6060600480546104f790612a75565b60003381610be482866110c2565b905083811015610c445760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161064c565b6105ad8286868403611176565b60003361058881858561130f565b60055460408051635c9302c960e01b8152905184926000926001600160a01b0390911691635c9302c9916004808201926020929091908290030181865afa158015610cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd29190612b5f565b905060005b82811015610d4557610d3d868683818110610cf457610cf4612b9a565b90506060020160000135878784818110610d1057610d10612b9a565b9050606002016020013586858a8a87818110610d2e57610d2e612b9a565b90506060020160400135611d85565b600101610cd7565b505050505050565b600080821515600103610dbb57611446610d6961016d8b612bb0565b610d78906402540be400612bc3565b610d829190612b78565b90506402540be400610d99826406fc23ac00612bc3565b610da39190612b78565b9050610db481640ba43b7400612bb0565b9050610e7a565b61016c891115610e1f57611446610dd461016d8b612bb0565b610de3906402540be400612bc3565b610ded9190612b78565b90506402540be400610e0482640df8475800612bc3565b610e0e9190612b78565b9050610db48164174876e800612bb0565b60b9610e2c60b48b612bb0565b610e3b906402540be400612bc3565b610e459190612b78565b90506402540be400610e5c8264174876e800612bc3565b610e669190612b78565b9050610e7781642e90edd000612bb0565b90505b80610e8a886402540be400612bc3565b610e949190612b78565b9150878514610edd57600084610eb18866038d7ea4c68000612bc3565b610ebb9190612b78565b905066038d7ea4c68000610ecf8285612bc3565b610ed99190612b78565b9250505b50979650505050505050565b33600090815260096020526040902080546201000090046001600160801b03161561094a57336000908152600b602052604090205481546201000090046001600160801b0316811015610f4e5760405162461bcd60e51b815260040161064c90612be2565b6109f582600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc99190612b5f565b83612143565b610ff360405180606001604052806000815260200160008152602001600081525090565b60008260400151611003846121fd565b84602001516110129190612ac5565b61101f90620186a0612bc3565b6110299190612b78565b9050600081611037856122b8565b85602001516110469190612ac5565b6110589067016345785d8a0000612bc3565b6110629190612b78565b6020840183905280845260808501519091506000906115b39061108c9066038d7ea4c68000612bc3565b6110969190612b78565b905066038d7ea4c680006110aa8284612bc3565b6110b49190612b78565b604085015250919392505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611170848484600560009054906101000a90046001600160a01b03166001600160a01b0316635c9302c96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116a9190612b5f565b85611d85565b50505050565b6001600160a01b0383166111d85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161064c565b6001600160a01b0382166112395760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161064c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006112a784846110c2565b9050600019811461117057818110156113025760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161064c565b6111708484848403611176565b6001600160a01b0383166113735760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161064c565b6001600160a01b0382166113d55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161064c565b6001600160a01b0383166000908152602081905260409020548181101561144d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161064c565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611484908490612ac5565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114d091815260200190565b60405180910390a3611170565b6115166040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600554604051632607443b60e01b81526001600160a01b038681166004830152602482018690526000928392839283928392839290911690632607443b9060440160e060405180830381865afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190612c7d565b50949a5092985090965094509250905064ffffffffff8616881461160c5760405162461bcd60e51b815260206004820152602560248201527f434f4d3a2041737375726520636f727265637420616e642063757272656e74206044820152647374616b6560d81b606482015260840161064c565b6040805160c08101825264ffffffffff90971687526001600160481b039586166020880152939094169285019290925261ffff908116606085015290811660808401521660a082015290509392505050565b6001600160a01b0382166116b45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161064c565b80600260008282546116c69190612ac5565b90915550506001600160a01b038216600090815260208190526040812080548392906116f3908490612ac5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b3381600381111561175057611750612cf7565b847fafc22f2a1b7c8423cb392f3fe7711c08b38f98246adb12e5a041c2fba455ef2a60808a6001600160801b0316901b8c6001600160801b0316176060896001600160481b0316901b60388b64ffffffffff16901b60288e61ffff16901b4264ffffffffff16171717876040516117e39392919092835260208301919091526001600160a01b0316604082015260600190565b60405180910390a45050505050505050565b6001600160a01b0382166118555760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161064c565b6001600160a01b038216600090815260208190526040902054818110156118c95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161064c565b6001600160a01b03831660009081526020819052604081208383039055600280548492906118f8908490612bb0565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161128e565b505050565b6005546040805163c312452560e01b815290516000926001600160a01b03169163c3124525916004808301926101009291908290030181865afa15801561198b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119af9190612d0d565b505064ffffffffff9093169695505050505050565b60008681526006602052604090205415611a305760405162461bcd60e51b815260206004820152602760248201527f434f4d3a205374616b65494420537461727420426f6e757320616c7265616479604482015266081b5a5b9d195960ca1b606482015260840161064c565b60008681526007602052604090205415611a5c5760405162461bcd60e51b815260040161064c90612ad8565b6000611a693389896114dd565b905061270f816040015111611a905760405162461bcd60e51b815260040161064c90612b1d565b60b3816080015111611af25760405162461bcd60e51b815260206004820152602560248201527f434f4d3a204d696e696d756d20313830207374616b65642064617973207265716044820152641d5a5c995960da1b606482015260840161064c565b8060600151841015611b3e5760405162461bcd60e51b8152602060048201526015602482015274434f4d3a205374616b65206e6f742041637469766560581b604482015260640161064c565b6000861515600103611b5757611b53826122cc565b5060035b6000611b6283610fcf565b90506000611b8584608001518560600151846040015185602001518b8b8f610d4d565b9050336001600160a01b03891603611bb357611ba2606482612b78565b611bac9082612ac5565b9050611bfe565b6001600160a01b03881615611bdb57611bd688611bd1606484612b78565b61165e565b611bfe565b611bfe733def1720ce2b04a56f0ee6bc9875c64a785136b9611bd1606484612b78565b60008a81526006602090815260408083208490553383526009909152902080546201000090046001600160801b031615801590611c5b57508054336000908152600b6020526040902054620100009091046001600160801b031611155b15611c7d57336000908152600b6020526040902054611c7d9082908a90612143565b8515611cf05781861115611ca35760405162461bcd60e51b815260040161064c90612db4565b336000908152600b602052604081208054889290611cc2908490612ac5565b90915550611cd290508683612bb0565b336000908152600b6020526040902054909250611cf090879061259b565b8115611d0057611d00338361165e565b611d248286608001518560000151866020015189602001518a600001518f8b61173d565b505050505050505050505050565b6040516001600160801b0383166001600160801b0319608084901b1617815233907f4cbbb1897a82fabe5c208fdda8b9787408442e9e6f9263068465e228a5f906c4906020015b60405180910390a25050565b60008481526007602052604090205415611db15760405162461bcd60e51b815260040161064c90612ad8565b6000611dbe3387876114dd565b905061016c816080015111611de55760405162461bcd60e51b815260040161064c90612e03565b61270f816040015111611e0a5760405162461bcd60e51b815260040161064c90612b1d565b600081608001518260600151611e209190612ac5565b905080841015611e675760405162461bcd60e51b8152602060048201526012602482015271434f4d3a205374616b65206e6f742064756560701b604482015260640161064c565b611e72816025612ac5565b841115611ec15760405162461bcd60e51b815260206004820152601760248201527f434f4d3a20477261636520706572696f6420656e646564000000000000000000604482015260640161064c565b6000611ecc83610fcf565b60008881526006602052604080822054908301519293509091611eef9190612bb0565b9050336001600160a01b03881603611f1d57611f0c606482612b78565b611f169082612ac5565b9050611f63565b6001600160a01b03871615611f4057611f3b87611bd1606484612b78565b611f63565b611f63733def1720ce2b04a56f0ee6bc9875c64a785136b9611bd1606484612b78565b6000888152600760205260408120829055611f7f600283612b78565b3360009081526009602052604090208054919250906201000090046001600160801b031615611fc557336000908152600b6020526040902054611fc59082908a90612143565b86156120385782871115611feb5760405162461bcd60e51b815260040161064c90612db4565b336000908152600b60205260408120805489929061200a908490612ac5565b9091555061201a90508784612bb0565b336000908152600b602052604090205490935061203890889061259b565b80546201000090046001600160801b031615612093578054336000908152600b6020526040902054620100009091046001600160801b0316111561208e5760405162461bcd60e51b815260040161064c90612be2565b6120b0565b61209e88605b612e48565b815461ffff191661ffff919091161781555b82156120c0576120c0338461165e565b6120e5838760800151866000015187602001518a602001518b600001518f600161173d565b6120ef88876125e6565b8054829082906002906121129084906201000090046001600160801b0316612e6a565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505050505050505050505050565b825461ffff16821061193b578254600090605b906121659061ffff1685612bb0565b61216f9190612b78565b61217a906001612ac5565b90506000605061218a8385612bc3565b6121949190612b78565b90506121a0338261165e565b6121ab82605b612bc3565b855486906000906121c190849061ffff16612e48565b82546101009290920a61ffff81810219909316918316021790915586546109d992509081169083906201000090046001600160801b0316612697565b6000806000905060018360800151111561223b57610e388360800151111561222757610e38612238565b600183608001516122389190612bb0565b90505b600066354a6ba7a180008460200151111561225d5766354a6ba7a18000612263565b83602001515b9050680ecca2d59581a4000061227b8261071c612bc3565b61228d84670214e8348c4f0000612bc3565b6122979190612ac5565b85602001516122a69190612bc3565b6122b09190612b78565b949350505050565b600080600183608001516122389190612bb0565b61016c8160800151116122f15760405162461bcd60e51b815260040161064c90612e03565b336000908152600860205260408120805490916201000090910461ffff1690036123675760405162461bcd60e51b815260206004820152602160248201527f434f4d3a204e6f2076616c69642072657374616b65206f70706f7274756e69746044820152607960f81b606482015260840161064c565b805460608301516201000090910461ffff16106123e15760405162461bcd60e51b815260206004820152603260248201527f434f4d3a205374617274205374616b65206d757374206265206e65776572207460448201527168616e2070726576696f7573207374616b6560701b606482015260840161064c565b81608001516115b314806123ff57508054608083015161ffff909116105b6124695760405162461bcd60e51b815260206004820152603560248201527f434f4d3a204e6577207374616b65642064617973206d7573742062652067726560448201527461746572207468616e20746f2070726576696f757360581b606482015260840161064c565b805460408301516401000000009091046001600160481b031611156124e35760405162461bcd60e51b815260206004820152602a60248201527f434f4d3a2052657374616b65206d757374206174206c65617374206d61696e7460448201526961696e2073686172657360b01b606482015260840161064c565b80546125019064010000000090046001600160481b03166002612e8a565b6001600160481b0316826040015111156125745760405162461bcd60e51b815260206004820152602e60248201527f434f4d3a2052657374616b65207368617265732063616e6e6f74206265206d6f60448201526d7265207468616e20646f75626c6560901b606482015260840161064c565b505033600090815260086020526040902080546cffffffffffffffffffffffffff19169055565b6040516001600160801b0383166001600160801b0319608084901b1617815233907fa8f21c07a94b82da90d177f9b2b3a25e91a969ac251d1601fa387a831c951ad890602001611d79565b336000908152600860205260409020805462010000900461ffff1683111561261f57805463ffff000019166201000061ffff8516021781555b6080820151815461ffff161015612646576080820151815461ffff191661ffff9091161781555b60408201518154829060049061266e90849064010000000090046001600160481b0316612eb9565b92506101000a8154816001600160481b0302191690836001600160481b03160217905550505050565b60405161ffff84166fffffffffffffffffffffffffffff0000601085901b16176001600160801b0319608084901b1617815233907f3a4343c9c29638775b0d0acbd8fcb6ec75cf77284a520b2f4b41357b86f4900c9060200160405180910390a2505050565b600060208083528351808285015260005b8181101561272a5785810183015185820160400152820161270e565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461276257600080fd5b919050565b6000806040838503121561277a57600080fd5b6127838361274b565b946020939093013593505050565b6000806000606084860312156127a657600080fd5b6127af8461274b565b92506127bd6020850161274b565b9150604084013590509250925092565b6000806000606084860312156127e257600080fd5b6127eb8461274b565b95602085013595506040909401359392505050565b60006020828403121561281257600080fd5b61281b8261274b565b9392505050565b60006020828403121561283457600080fd5b5035919050565b801515811461094a57600080fd5b600080600080600060a0868803121561286157600080fd5b8535945060208601359350604086013561287a8161283b565b92506128886060870161274b565b949793965091946080013592915050565b6000806000604084860312156128ae57600080fd5b833567ffffffffffffffff808211156128c657600080fd5b818601915086601f8301126128da57600080fd5b8135818111156128e957600080fd5b8760206060830285010111156128fe57600080fd5b602092830195509350612914918601905061274b565b90509250925092565b600080600080600080600060e0888a03121561293857600080fd5b873596506020880135955060408801359450606088013593506080880135925060a0880135915060c088013561296d8161283b565b8091505092959891949750929550565b600060c0828403121561298f57600080fd5b60405160c0810181811067ffffffffffffffff821117156129c057634e487b7160e01b600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201528091505092915050565b60008060408385031215612a1857600080fd5b612a218361274b565b9150612a2f6020840161274b565b90509250929050565b60008060008060808587031215612a4e57600080fd5b8435935060208501359250612a656040860161274b565b9396929550929360600135925050565b600181811c90821680612a8957607f821691505b602082108103612aa957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561058e5761058e612aaf565b60208082526025908201527f434f4d3a205374616b65494420456e6420426f6e757320616c7265616479206d6040820152641a5b9d195960da1b606082015260800190565b60208082526022908201527f434f4d3a204d696e696d756d2031303030302073686172657320726571756972604082015261195960f21b606082015260800190565b600060208284031215612b7157600080fd5b5051919050565b600082612b9557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b8181038181111561058e5761058e612aaf565b6000816000190483118215151615612bdd57612bdd612aaf565b500290565b60208082526038908201527f434f4d3a2041646472657373205374616b656420416d6f756e7420646f65732060408201527f6e6f7420636f76657220456e6420426f6e757320446562740000000000000000606082015260800190565b805164ffffffffff8116811461276257600080fd5b80516001600160481b038116811461276257600080fd5b805161ffff8116811461276257600080fd5b600080600080600080600060e0888a031215612c9857600080fd5b612ca188612c3f565b9650612caf60208901612c54565b9550612cbd60408901612c54565b9450612ccb60608901612c6b565b9350612cd960808901612c6b565b9250612ce760a08901612c6b565b915060c088015161296d8161283b565b634e487b7160e01b600052602160045260246000fd5b600080600080600080600080610100898b031215612d2a57600080fd5b612d3389612c54565b9750612d4160208a01612c54565b9650612d4f60408a01612c3f565b9550612d5d60608a01612c54565b9450612d6b60808a01612c6b565b9350612d7960a08a01612c54565b9250612d8760c08a01612c3f565b915060e08901516001600160801b0381168114612da357600080fd5b809150509295985092959890939650565b6020808252602f908201527f434f4d3a205374616b6520616d6f756e74206973206d6f7265207468616e206160408201526e1d985a5b18589b19481c185e5bdd5d608a1b606082015260800190565b60208082526025908201527f434f4d3a204d696e696d756d20333635207374616b65642064617973207265716040820152641d5a5c995960da1b606082015260800190565b61ffff818116838216019080821115612e6357612e63612aaf565b5092915050565b6001600160801b03818116838216019080821115612e6357612e63612aaf565b60006001600160481b0380831681851681830481118215151615612eb057612eb0612aaf565b02949350505050565b6001600160481b03818116838216019080821115612e6357612e63612aaf56fea264697066735822122061a13278b51a7e83d610fe88bde393134b6eef7699d4c59c7a88088a0cba7ed664736f6c63430008100033
Deployed Bytecode Sourcemap
19366:23161:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6674:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9025:201;;;;;;:::i;:::-;;:::i;:::-;;;1169:14:1;;1162:22;1144:41;;1132:2;1117:18;9025:201:0;1004:187:1;7794:108:0;7882:12;;7794:108;;;1342:25:1;;;1330:2;1315:18;7794:108:0;1196:177:1;9806:295:0;;;;;;:::i;:::-;;:::i;19667:93::-;;;19750:2;1853:36:1;;1841:2;1826:18;19667:93:0;1711:184:1;10510:238:0;;;;;;:::i;:::-;;:::i;41236:1288::-;;;;;;:::i;:::-;;:::i;:::-;;21277:70;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21277:70:0;;;;;;;2620:6:1;2608:19;;;2590:38;;-1:-1:-1;;;;;2664:47:1;;;2659:2;2644:18;;2637:75;2563:18;21277:70:0;2418:300:1;18039:91:0;;;;;;:::i;:::-;;:::i;21198:72::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21198:72:0;;;;;;;3114:6:1;3147:15;;;3129:34;;3199:15;;;;3194:2;3179:18;;3172:43;-1:-1:-1;;;;;3251:33:1;3231:18;;;3224:61;3092:2;3077:18;21198:72:0;2908:383:1;34159:284:0;;;;;;:::i;:::-;;:::i;21354:83::-;;;;;;:::i;:::-;;;;;;;;;;;;;;7965:127;;;;;;:::i;:::-;-1:-1:-1;;;;;8066:18:0;8039:7;8066:18;;;;;;;;;;;;7965:127;21038:74;;;;;;:::i;:::-;;;;;;;;;;;;;;18449:164;;;;;;:::i;:::-;;:::i;21444:70::-;;;;;;:::i;:::-;;;;;;;;;;;;;;33441:622;;;;;;:::i;:::-;;:::i;31268:415::-;;;;;;:::i;:::-;;:::i;6893:104::-;;;:::i;11251:436::-;;;;;;:::i;:::-;;:::i;8298:193::-;;;;;;:::i;:::-;;:::i;37214:537::-;;;;;;:::i;:::-;;:::i;29791:1352::-;;;;;;:::i;:::-;;:::i;31930:422::-;;;:::i;27732:631::-;;;;;;:::i;:::-;;:::i;:::-;;;;6442:13:1;;6424:32;;6512:4;6500:17;;;6494:24;6472:20;;;6465:54;6563:17;;;6557:24;6535:20;;;6528:54;6412:2;6397:18;27732:631:0;6216:372:1;8554:151:0;;;;;;:::i;:::-;;:::i;37845:215::-;;;;;;:::i;:::-;;:::i;21119:72::-;;;;;;:::i;:::-;;;;;;;;;;;;;;6674:100;6728:13;6761:5;6754:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6674:100;:::o;9025:201::-;9108:4;4398:10;9164:32;4398:10;9180:7;9189:6;9164:8;:32::i;:::-;9214:4;9207:11;;;9025:201;;;;;:::o;9806:295::-;9937:4;4398:10;9995:38;10011:4;4398:10;10026:6;9995:15;:38::i;:::-;10044:27;10054:4;10060:2;10064:6;10044:9;:27::i;:::-;-1:-1:-1;10089:4:0;;9806:295;-1:-1:-1;;;;9806:295:0:o;10510:238::-;10598:4;4398:10;10654:64;4398:10;10670:7;10707:10;10679:25;4398:10;10670:7;10679:9;:25::i;:::-;:38;;;;:::i;:::-;10654:8;:64::i;41236:1288::-;41368:41;;;;:32;:41;;;;;;:46;41360:108;;;;-1:-1:-1;;;41360:108:0;;8103:2:1;41360:108:0;;;8085:21:1;8142:2;8122:18;;;8115:30;8181:34;8161:18;;;8154:62;-1:-1:-1;;;8232:18:1;;;8225:47;8289:19;;41360:108:0;;;;;;;;;41487:30;;;;:21;:30;;;;;;:35;41479:85;;;;-1:-1:-1;;;41479:85:0;;;;;;;:::i;:::-;41577:14;41594:53;41614:10;41627;41639:7;41594:11;:53::i;:::-;41577:70;;41684:4;41668:1;:13;;;:20;41660:67;;;;-1:-1:-1;;;41660:67:0;;;;;;;:::i;:::-;41746:13;;;;:18;41738:58;;;;-1:-1:-1;;;41738:58:0;;9330:2:1;41738:58:0;;;9312:21:1;9369:2;9349:18;;;9342:30;9408:29;9388:18;;;9381:57;9455:18;;41738:58:0;9128:351:1;41738:58:0;41848:1;:12;;;41834:1;:11;;;:26;;;;:::i;:::-;:31;;41863:2;41834:31;:::i;:::-;41815:3;;;;;;;;;-1:-1:-1;;;;;41815:3:0;-1:-1:-1;;;;;41815:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;41807:94;;;;-1:-1:-1;;;41807:94:0;;9875:2:1;41807:94:0;;;9857:21:1;9914:2;9894:18;;;9887:30;9953:33;9933:18;;;9926:61;10004:18;;41807:94:0;9673:355:1;41807:94:0;41914:3;;:73;;-1:-1:-1;;;41914:73:0;;-1:-1:-1;;;;;10251:32:1;;;41914:73:0;;;10233:51:1;10300:18;;;10293:34;;;10375:12;10363:25;;10343:18;;;10336:53;41914:3:0;;;;:23;;10206:18:1;;41914:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42000:16;42019:53;42039:10;42052;42064:7;42019:11;:53::i;:::-;42000:72;;42091:3;:15;;;42110:1;42091:20;42083:76;;;;-1:-1:-1;;;42083:76:0;;10602:2:1;42083:76:0;;;10584:21:1;10641:2;10621:18;;;10614:30;10680:34;10660:18;;;10653:62;-1:-1:-1;;;10731:18:1;;;10724:41;10782:19;;42083:76:0;10400:407:1;42083:76:0;42172:24;42199:12;42209:1;42199:9;:12::i;:::-;42172:39;;42224:14;42256:3;42241:2;:12;;;:18;;;;:::i;:::-;42272:41;;;;:32;:41;;;;;:50;;;42224:35;-1:-1:-1;42335:25:0;42341:10;42224:35;42335:5;:25::i;:::-;42371:145;42384:6;42392:1;:12;;;42406:2;:26;;;42434:2;:26;;;42462:1;:14;;;42478:1;:9;;;42497:1;42501:14;42371:12;:145::i;:::-;41349:1175;;;;41236:1288;;;:::o;18039:91::-;18095:27;4398:10;18115:6;18095:5;:27::i;:::-;18039:91;:::o;34159:284::-;34317:118;34333:10;34345:7;34354:17;34373:8;34383:3;;;;;;;;;-1:-1:-1;;;;;34383:3:0;-1:-1:-1;;;;;34383:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34401:20;:18;:20::i;:::-;34423:11;34317:15;:118::i;:::-;34159:284;;;;;:::o;18449:164::-;18526:46;18542:7;4398:10;18565:6;18526:15;:46::i;:::-;18583:22;18589:7;18598:6;18583:5;:22::i;:::-;18449:164;;:::o;33441:622::-;33667:3;;:16;;;-1:-1:-1;;;33667:16:0;;;;33609:19;;33573:33;;-1:-1:-1;;;;;33667:3:0;;;;:14;;:16;;;;;;;;;;;;;;;:3;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33646:37;;33694:23;33720:20;:18;:20::i;:::-;33694:46;;33757:9;33753:303;33776:25;33772:1;:29;33753:303;;;33818:164;33834:19;;33854:1;33834:22;;;;;;;:::i;:::-;;;;;;:33;;;33869:19;;33889:1;33869:22;;;;;;;:::i;:::-;;;;;;:30;;;33901:5;33908:8;33918:10;33930:15;33947:19;;33967:1;33947:22;;;;;;;:::i;:::-;;;;;;:34;;;33818:15;:164::i;:::-;34026:3;;33753:303;;31268:415;31402:10;31382:31;;;;:19;:31;;;;;;31364:49;;;31356:127;;;;-1:-1:-1;;;31356:127:0;;11368:2:1;31356:127:0;;;11350:21:1;11407:2;11387:18;;;11380:30;11446:34;11426:18;;;11419:62;11517:34;11497:18;;;11490:62;-1:-1:-1;;;11568:19:1;;;11561:32;11610:19;;31356:127:0;11166:469:1;31356:127:0;31516:10;31496:31;;;;:19;:31;;;;;:49;;31531:14;;31496:31;:49;;31531:14;;31496:49;:::i;:::-;;;;-1:-1:-1;31558:33:0;;-1:-1:-1;31564:10:0;31576:14;31558:5;:33::i;:::-;31663:10;31643:31;;;;:19;:31;;;;;;31602:73;;31627:14;;31602:24;:73::i;6893:104::-;6949:13;6982:7;6975:14;;;;;:::i;11251:436::-;11344:4;4398:10;11344:4;11427:25;4398:10;11444:7;11427:9;:25::i;:::-;11400:52;;11491:15;11471:16;:35;;11463:85;;;;-1:-1:-1;;;11463:85:0;;11975:2:1;11463:85:0;;;11957:21:1;12014:2;11994:18;;;11987:30;12053:34;12033:18;;;12026:62;-1:-1:-1;;;12104:18:1;;;12097:35;12149:19;;11463:85:0;11773:401:1;11463:85:0;11584:60;11593:5;11600:7;11628:15;11609:16;:34;11584:8;:60::i;8298:193::-;8377:4;4398:10;8433:28;4398:10;8450:2;8454:6;8433:9;:28::i;37214:537::-;37438:3;;:16;;;-1:-1:-1;;;37438:16:0;;;;37380:19;;37344:33;;-1:-1:-1;;;;;37438:3:0;;;;:14;;:16;;;;;;;;;;;;;;;:3;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37417:37;;37471:9;37467:277;37490:25;37486:1;:29;37467:277;;;37532:138;37546:19;;37566:1;37546:22;;;;;;;:::i;:::-;;;;;;:33;;;37581:19;;37601:1;37581:22;;;;;;;:::i;:::-;;;;;;:30;;;37613:8;37623:10;37635:19;;37655:1;37635:22;;;;;;;:::i;:::-;;;;;;:34;;;37532:13;:138::i;:::-;37714:3;;37467:277;;;;37333:418;;37214:537;;;:::o;29791:1352::-;30019:14;;30090:25;;;30111:4;30090:25;30087:788;;30187:4;30153:16;30166:3;30153:10;:16;:::i;:::-;30152:31;;30174:8;30152:31;:::i;:::-;30151:40;;;;:::i;:::-;30132:60;-1:-1:-1;30265:8:0;30226:34;30132:60;30227:14;30226:34;:::i;:::-;30225:49;;;;:::i;:::-;30207:67;-1:-1:-1;30307:34:0;30207:67;30308:14;30307:34;:::i;:::-;30289:52;;30087:788;;;30385:3;30372:10;:16;30368:507;;;30459:4;30425:16;30438:3;30425:10;:16;:::i;:::-;30424:31;;30446:8;30424:31;:::i;:::-;30423:40;;;;:::i;:::-;30405:58;-1:-1:-1;30536:8:0;30497:34;30405:58;30498:14;30497:34;:::i;:::-;30496:49;;;;:::i;:::-;30478:67;-1:-1:-1;30578:35:0;30478:67;30579:15;30578:35;:::i;30368:507::-;30709:3;30675:16;30688:3;30675:10;:16;:::i;:::-;30674:31;;30696:8;30674:31;:::i;:::-;30673:39;;;;:::i;:::-;30655:57;-1:-1:-1;30786:8:0;30746:35;30655:57;30747:15;30746:35;:::i;:::-;30745:50;;;;:::i;:::-;30727:68;-1:-1:-1;30828:35:0;30727:68;30829:15;30828:35;:::i;:::-;30810:53;;30368:507;30924:15;30898:22;:9;30911:8;30898:22;:::i;:::-;30897:42;;;;:::i;:::-;30888:51;;30969:9;30955:10;:23;30952:184;;30995:15;31054;31014:36;:23;31041:8;31014:36;:::i;:::-;31013:56;;;;:::i;:::-;30995:74;-1:-1:-1;31115:8:0;31094:16;30995:74;31094:6;:16;:::i;:::-;31093:31;;;;:::i;:::-;31084:40;;30980:156;30952:184;30040:1103;29791:1352;;;;;;;;;:::o;31930:422::-;32037:10;31990:24;32017:31;;;:19;:31;;;;;32062:14;;;;;-1:-1:-1;;;;;32062:14:0;:19;32059:286;;32141:10;32098:20;32121:31;;;:19;:31;;;;;;32191:14;;;;;-1:-1:-1;;;;;32191:14:0;32175:30;;;32167:99;;;;-1:-1:-1;;;32167:99:0;;;;;;;:::i;:::-;32281:52;32297:3;32302;;;;;;;;;-1:-1:-1;;;;;32302:3:0;-1:-1:-1;;;;;32302:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32320:12;32281:15;:52::i;27732:631::-;27806:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;27806:24:0;27848:31;27941:1;:13;;;27901:23;27922:1;27901:20;:23::i;:::-;27884:1;:14;;;:40;;;;:::i;:::-;27883:54;;27929:7;27883:54;:::i;:::-;27882:72;;;;:::i;:::-;27848:106;;27967:31;28065:23;28019:29;28046:1;28019:26;:29::i;:::-;28002:1;:14;;;:46;;;;:::i;:::-;28001:61;;28053:8;28001:61;:::i;:::-;:87;;;;:::i;:::-;28101:26;;;:52;;;28164;;;28248:12;;;;27967:121;;-1:-1:-1;28164:26:0;;28277:4;;28248:25;;28264:8;28248:25;:::i;:::-;28247:34;;;;:::i;:::-;28229:52;-1:-1:-1;28346:8:0;28308:33;28229:52;28308:23;:33;:::i;:::-;28307:48;;;;:::i;:::-;28292:12;;;:63;-1:-1:-1;28292:2:0;;27732:631;-1:-1:-1;;;27732:631:0:o;8554:151::-;-1:-1:-1;;;;;8670:18:0;;;8643:7;8670:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8554:151::o;37845:215::-;37977:75;37991:10;38003:7;38012:8;38022:3;;;;;;;;;-1:-1:-1;;;;;38022:3:0;-1:-1:-1;;;;;38022:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38040:11;37977:13;:75::i;:::-;37845:215;;;;:::o;14876:380::-;-1:-1:-1;;;;;15012:19:0;;15004:68;;;;-1:-1:-1;;;15004:68:0;;12979:2:1;15004:68:0;;;12961:21:1;13018:2;12998:18;;;12991:30;13057:34;13037:18;;;13030:62;-1:-1:-1;;;13108:18:1;;;13101:34;13152:19;;15004:68:0;12777:400:1;15004:68:0;-1:-1:-1;;;;;15091:21:0;;15083:68;;;;-1:-1:-1;;;15083:68:0;;13384:2:1;15083:68:0;;;13366:21:1;13423:2;13403:18;;;13396:30;13462:34;13442:18;;;13435:62;-1:-1:-1;;;13513:18:1;;;13506:32;13555:19;;15083:68:0;13182:398:1;15083:68:0;-1:-1:-1;;;;;15164:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15216:32;;1342:25:1;;;15216:32:0;;1315:18:1;15216:32:0;;;;;;;;14876:380;;;:::o;15547:453::-;15682:24;15709:25;15719:5;15726:7;15709:9;:25::i;:::-;15682:52;;-1:-1:-1;;15749:16:0;:37;15745:248;;15831:6;15811:16;:26;;15803:68;;;;-1:-1:-1;;;15803:68:0;;13787:2:1;15803:68:0;;;13769:21:1;13826:2;13806:18;;;13799:30;13865:31;13845:18;;;13838:59;13914:18;;15803:68:0;13585:353:1;15803:68:0;15915:51;15924:5;15931:7;15959:6;15940:16;:25;15915:8;:51::i;12157:671::-;-1:-1:-1;;;;;12288:18:0;;12280:68;;;;-1:-1:-1;;;12280:68:0;;14145:2:1;12280:68:0;;;14127:21:1;14184:2;14164:18;;;14157:30;14223:34;14203:18;;;14196:62;-1:-1:-1;;;14274:18:1;;;14267:35;14319:19;;12280:68:0;13943:401:1;12280:68:0;-1:-1:-1;;;;;12367:16:0;;12359:64;;;;-1:-1:-1;;;12359:64:0;;14551:2:1;12359:64:0;;;14533:21:1;14590:2;14570:18;;;14563:30;14629:34;14609:18;;;14602:62;-1:-1:-1;;;14680:18:1;;;14673:33;14723:19;;12359:64:0;14349:399:1;12359:64:0;-1:-1:-1;;;;;12509:15:0;;12487:19;12509:15;;;;;;;;;;;12543:21;;;;12535:72;;;;-1:-1:-1;;;12535:72:0;;14955:2:1;12535:72:0;;;14937:21:1;14994:2;14974:18;;;14967:30;15033:34;15013:18;;;15006:62;-1:-1:-1;;;15084:18:1;;;15077:36;15130:19;;12535:72:0;14753:402:1;12535:72:0;-1:-1:-1;;;;;12643:15:0;;;:9;:15;;;;;;;;;;;12661:20;;;12643:38;;12703:13;;;;;;;;:23;;12675:6;;12643:9;12703:23;;12675:6;;12703:23;:::i;:::-;;;;;;;;12759:2;-1:-1:-1;;;;;12744:26:0;12753:4;-1:-1:-1;;;;;12744:26:0;;12763:6;12744:26;;;;1342:25:1;;1330:2;1315:18;;1196:177;12744:26:0;;;;;;;;12783:37;13847:591;21523:634;21635:12;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21635:12:0;21924:3;;:40;;-1:-1:-1;;;21924:40:0;;-1:-1:-1;;;;;15352:32:1;;;21924:40:0;;;15334:51:1;15401:18;;;15394:34;;;21665:15:0;;;;;;;;;;;;21924:3;;;;:14;;15307:18:1;;21924:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;21841:123:0;;-1:-1:-1;21841:123:0;;-1:-1:-1;21841:123:0;;-1:-1:-1;21841:123:0;-1:-1:-1;21841:123:0;-1:-1:-1;21841:123:0;-1:-1:-1;21985:19:0;;;;;21977:69;;;;-1:-1:-1;;;21977:69:0;;16917:2:1;21977:69:0;;;16899:21:1;16956:2;16936:18;;;16929:30;16995:34;16975:18;;;16968:62;-1:-1:-1;;;17046:18:1;;;17039:35;17091:19;;21977:69:0;16715:401:1;21977:69:0;22066:83;;;;;;;;;;;;;;-1:-1:-1;;;;;22066:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21523:634:0;;;;;:::o;13115:399::-;-1:-1:-1;;;;;13199:21:0;;13191:65;;;;-1:-1:-1;;;13191:65:0;;17323:2:1;13191:65:0;;;17305:21:1;17362:2;17342:18;;;17335:30;17401:33;17381:18;;;17374:61;17452:18;;13191:65:0;17121:355:1;13191:65:0;13347:6;13331:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13364:18:0;;:9;:18;;;;;;;;;;:28;;13386:6;;13364:9;:28;;13386:6;;13364:28;:::i;:::-;;;;-1:-1:-1;;13408:37:0;;1342:25:1;;;-1:-1:-1;;;;;13408:37:0;;;13425:1;;13408:37;;1330:2:1;1315:18;13408:37:0;;;;;;;18449:164;;:::o;22330:731::-;23009:10;22984:9;22979:15;;;;;;;;:::i;:::-;22957:7;22570:483;22684:3;22655:23;-1:-1:-1;;;;;22639:41:0;:48;;22609:6;-1:-1:-1;;;;;22593:24:0;22592:96;22939:2;22909:12;-1:-1:-1;;;;;22894:29:0;:47;;22870:2;22840:23;22825:40;;:47;;22801:2;22771:10;22756:27;;:47;;22718:15;22703:32;;:101;:170;:239;23034:8;22570:483;;;;;;;17815:25:1;;;17871:2;17856:18;;17849:34;;;;-1:-1:-1;;;;;17919:32:1;17914:2;17899:18;;17892:60;17803:2;17788:18;;17613:345;22570:483:0;;;;;;;;22330:731;;;;;;;;:::o;13847:591::-;-1:-1:-1;;;;;13931:21:0;;13923:67;;;;-1:-1:-1;;;13923:67:0;;18165:2:1;13923:67:0;;;18147:21:1;18204:2;18184:18;;;18177:30;18243:34;18223:18;;;18216:62;-1:-1:-1;;;18294:18:1;;;18287:31;18335:19;;13923:67:0;17963:397:1;13923:67:0;-1:-1:-1;;;;;14090:18:0;;14065:22;14090:18;;;;;;;;;;;14127:24;;;;14119:71;;;;-1:-1:-1;;;14119:71:0;;18567:2:1;14119:71:0;;;18549:21:1;18606:2;18586:18;;;18579:30;18645:34;18625:18;;;18618:62;-1:-1:-1;;;18696:18:1;;;18689:32;18738:19;;14119:71:0;18365:398:1;14119:71:0;-1:-1:-1;;;;;14226:18:0;;:9;:18;;;;;;;;;;14247:23;;;14226:44;;14292:12;:22;;14264:6;;14226:9;14292:22;;14264:6;;14292:22;:::i;:::-;;;;-1:-1:-1;;14332:37:0;;1342:25:1;;;14358:1:0;;-1:-1:-1;;;;;14332:37:0;;;;;1330:2:1;1315:18;14332:37:0;1196:177:1;14382:48:0;13912:526;13847:591;;:::o;22165:157::-;22300:3;;:13;;;-1:-1:-1;;;22300:13:0;;;;22236:17;;-1:-1:-1;;;;;22300:3:0;;:11;;:13;;;;;:3;;:13;;;;;;;:3;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;22272:41:0;;;;;22165:157;-1:-1:-1;;;;;;22165:157:0:o;34921:2180::-;35132:32;;;;:23;:32;;;;;;:37;35124:89;;;;-1:-1:-1;;;35124:89:0;;19866:2:1;35124:89:0;;;19848:21:1;19905:2;19885:18;;;19878:30;19944:34;19924:18;;;19917:62;-1:-1:-1;;;19995:18:1;;;19988:37;20042:19;;35124:89:0;19664:403:1;35124:89:0;35232:30;;;;:21;:30;;;;;;:35;35224:85;;;;-1:-1:-1;;;35224:85:0;;;;;;;:::i;:::-;35322:14;35339:53;35359:10;35372;35384:7;35339:11;:53::i;:::-;35322:70;;35429:4;35413:1;:13;;;:20;35405:67;;;;-1:-1:-1;;;35405:67:0;;;;;;;:::i;:::-;35506:3;35491:1;:12;;;:18;35483:68;;;;-1:-1:-1;;;35483:68:0;;20274:2:1;35483:68:0;;;20256:21:1;20313:2;20293:18;;;20286:30;20352:34;20332:18;;;20325:62;-1:-1:-1;;;20403:18:1;;;20396:35;20448:19;;35483:68:0;20072:401:1;35483:68:0;35594:1;:11;;;35580:10;:25;;35572:59;;;;-1:-1:-1;;;35572:59:0;;20680:2:1;35572:59:0;;;20662:21:1;20719:2;20699:18;;;20692:30;-1:-1:-1;;;20738:18:1;;;20731:51;20799:18;;35572:59:0;20478:345:1;35572:59:0;35644:12;35688:25;;;35709:4;35688:25;35685:118;;35730:24;35752:1;35730:21;:24::i;:::-;-1:-1:-1;35774:17:0;35685:118;35815:24;35842:12;35852:1;35842:9;:12::i;:::-;35815:39;;35867:14;35884:136;35904:1;:12;;;35918:1;:11;;;35931:2;:12;;;35945:2;:26;;;35973:10;35985:15;36002:17;35884:19;:136::i;:::-;35867:153;-1:-1:-1;36048:10:0;-1:-1:-1;;;;;36036:22:0;;;36033:259;;36086:12;36095:3;36086:6;:12;:::i;:::-;36075:24;;;;:::i;:::-;;;36033:259;;;-1:-1:-1;;;;;36129:22:0;;;36126:166;;36168:31;36174:8;36185:12;36194:3;36185:6;:12;:::i;:::-;36168:5;:31::i;:::-;36126:166;;;36241:39;19487:42;36266:12;36275:3;36266:6;:12;:::i;36241:39::-;36304:32;;;;:23;:32;;;;;;;;:41;;;36405:10;36385:31;;:19;:31;;;;;36432:14;;;;;-1:-1:-1;;;;;36432:14:0;:19;;;;:72;;-1:-1:-1;36490:14:0;;36475:10;36490:14;36455:31;;;:19;:31;;;;;;36490:14;;;;-1:-1:-1;;;;;36490:14:0;-1:-1:-1;36455:49:0;36432:72;36429:142;;;36559:10;36539:31;;;;:19;:31;;;;;;36506:65;;36522:3;;36527:10;;36506:15;:65::i;:::-;36587:15;;36584:315;;36642:6;36627:11;:21;;36619:81;;;;-1:-1:-1;;;36619:81:0;;;;;;;:::i;:::-;36737:10;36717:31;;;;:19;:31;;;;;:46;;36752:11;;36717:31;:46;;36752:11;;36717:46;:::i;:::-;;;;-1:-1:-1;36780:21:0;;-1:-1:-1;36790:11:0;36780:21;;:::i;:::-;36875:10;36855:31;;;;:19;:31;;;;;;36780:21;;-1:-1:-1;36818:69:0;;36842:11;;36818:23;:69::i;:::-;36914:10;;36911:40;;36926:25;36932:10;36944:6;36926:5;:25::i;:::-;36962:131;36975:6;36983:1;:12;;;36997:2;:26;;;37025:2;:26;;;37053:1;:14;;;37069:1;:9;;;37080:8;37090:2;36962:12;:131::i;:::-;35113:1988;;;;;34921:2180;;;;;;;:::o;23675:272::-;23785:154;;-1:-1:-1;;;;;23820:24:0;;-1:-1:-1;;;;;;23899:3:0;23865:37;;;;23820:83;1342:25:1;;23918:10:0;;23785:154;;1330:2:1;1315:18;23785:154:0;;;;;;;;23675:272;;:::o;38773:2202::-;38933:30;;;;:21;:30;;;;;;:35;38925:85;;;;-1:-1:-1;;;38925:85:0;;;;;;;:::i;:::-;39023:14;39040:53;39060:10;39073;39085:7;39040:11;:53::i;:::-;39023:70;;39129:3;39114:1;:12;;;:18;39106:68;;;;-1:-1:-1;;;39106:68:0;;;;;;;:::i;:::-;39209:4;39193:1;:13;;;:20;39185:67;;;;-1:-1:-1;;;39185:67:0;;;;;;;:::i;:::-;39265:14;39296:1;:12;;;39282:1;:11;;;:26;;;;:::i;:::-;39265:43;;39341:6;39327:10;:20;;39319:51;;;;-1:-1:-1;;;39319:51:0;;21852:2:1;39319:51:0;;;21834:21:1;21891:2;21871:18;;;21864:30;-1:-1:-1;;;21910:18:1;;;21903:48;21968:18;;39319:51:0;21650:342:1;39319:51:0;39403:11;:6;39412:2;39403:11;:::i;:::-;39389:10;:25;;39381:61;;;;-1:-1:-1;;;39381:61:0;;22199:2:1;39381:61:0;;;22181:21:1;22238:2;22218:18;;;22211:30;22277:25;22257:18;;;22250:53;22320:18;;39381:61:0;21997:347:1;39381:61:0;39455:24;39482:12;39492:1;39482:9;:12::i;:::-;39507:14;39539:32;;;:23;:32;;;;;;;39524:12;;;;39455:39;;-1:-1:-1;39507:14:0;;39524:47;;39539:32;39524:47;:::i;:::-;39507:64;-1:-1:-1;39599:10:0;-1:-1:-1;;;;;39587:22:0;;;39584:259;;39637:12;39646:3;39637:6;:12;:::i;:::-;39626:24;;;;:::i;:::-;;;39584:259;;;-1:-1:-1;;;;;39680:22:0;;;39677:166;;39719:31;39725:8;39736:12;39745:3;39736:6;:12;:::i;39719:31::-;39677:166;;;39792:39;19487:42;39817:12;39826:3;39817:6;:12;:::i;39792:39::-;39855:30;;;;:21;:30;;;;;:39;;;39936:10;39945:1;39888:6;39936:10;:::i;:::-;40007;39960:24;39987:31;;;:19;:31;;;;;40034:14;;39907:40;;-1:-1:-1;39987:31:0;40034:14;;;-1:-1:-1;;;;;40034:14:0;:19;40031:89;;40108:10;40088:31;;;;:19;:31;;;;;;40055:65;;40071:3;;40076:10;;40055:15;:65::i;:::-;40136:15;;40133:327;;40191:6;40176:11;:21;;40168:81;;;;-1:-1:-1;;;40168:81:0;;;;;;;:::i;:::-;40286:10;40266:31;;;;:19;:31;;;;;:46;;40301:11;;40266:31;:46;;40301:11;;40266:46;:::i;:::-;;;;-1:-1:-1;40329:21:0;;-1:-1:-1;40339:11:0;40329:21;;:::i;:::-;40436:10;40416:31;;;;:19;:31;;;;;;40329:21;;-1:-1:-1;40379:69:0;;40403:11;;40379:23;:69::i;:::-;40475:14;;;;;-1:-1:-1;;;;;40475:14:0;:19;40472:201;;40539:14;;40524:10;40539:14;40504:31;;;:19;:31;;;;;;40539:14;;;;-1:-1:-1;;;;;40539:14:0;-1:-1:-1;40504:49:0;40496:118;;;;-1:-1:-1;;;40496:118:0;;;;;;;:::i;:::-;40472:201;;;40650:23;40657:10;40671:2;40650:23;:::i;:::-;40630:43;;-1:-1:-1;;40630:43:0;;;;;;;;;40472:201;40689:10;;40686:40;;40701:25;40707:10;40719:6;40701:5;:25::i;:::-;40737:142;40750:6;40758:1;:12;;;40772:2;:26;;;40800:2;:26;;;40828:1;:14;;;40844:1;:9;;;40855:8;40865:13;40737:12;:142::i;:::-;40892:36;40914:10;40926:1;40892:21;:36::i;:::-;40939:28;;40957:10;;40939:28;;:14;;:28;;40957:10;;40939:28;;;-1:-1:-1;;;;;40939:28:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;40939:28:0;;;;;-1:-1:-1;;;;;40939:28:0;;;;;;38914:2061;;;;;;38773:2202;;;;;:::o;32810:516::-;32953:17;;;;32939:31;;32936:383;;33028:17;;32987:23;;33049:2;;33015:30;;33028:17;;33015:10;:30;:::i;:::-;33014:37;;;;:::i;:::-;33013:43;;33055:1;33013:43;:::i;:::-;32987:69;-1:-1:-1;33071:14:0;33123:2;33089:30;32987:69;33089:12;:30;:::i;:::-;33088:37;;;;:::i;:::-;33071:54;;33142:25;33148:10;33160:6;33142:5;:25::i;:::-;33212:20;:15;33230:2;33212:20;:::i;:::-;33184:49;;:3;;:17;;:49;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;33265:17;;33248:59;;-1:-1:-1;33265:17:0;;;;33284:6;;33292:14;;;-1:-1:-1;;;;;33292:14:0;33248:16;:59::i;25954:492::-;26041:25;26084:18;26105:1;26084:22;;26138:1;26123;:12;;;:16;26119:81;;;26170:4;26154:1;:12;;;:20;;:46;;26196:4;26154:46;;;26192:1;26177;:12;;;:16;;;;:::i;:::-;26141:59;;26119:81;26213:20;26255:15;26236:1;:14;;;:35;;:72;;26292:15;26236:72;;;26274:1;:14;;;26236:72;26213:95;-1:-1:-1;26420:16:0;26395:19;26213:95;26410:4;26395:19;:::i;:::-;26360:30;:10;26374:15;26360:30;:::i;:::-;26359:56;;;;:::i;:::-;26341:1;:14;;;:75;;;;:::i;:::-;:96;;;;:::i;:::-;26321:116;25954:492;-1:-1:-1;;;;25954:492:0:o;26681:432::-;26774:31;26823:18;26859:1;26844;:12;;;:16;;;;:::i;24872:824::-;24977:3;24961:2;:13;;;:19;24953:69;;;;-1:-1:-1;;;24953:69:0;;;;;;;:::i;:::-;25086:10;25035:26;25064:33;;;:21;:33;;;;;25118:21;;25064:33;;25118:21;;;;;;:26;;25110:72;;;;-1:-1:-1;;;25110:72:0;;22926:2:1;25110:72:0;;;22908:21:1;22965:2;22945:18;;;22938:30;23004:34;22984:18;;;22977:62;-1:-1:-1;;;23055:18:1;;;23048:31;23096:19;;25110:72:0;22724:397:1;25110:72:0;25216:21;;25201:12;;;;25216:21;;;;;;-1:-1:-1;25193:99:0;;;;-1:-1:-1;;;25193:99:0;;23328:2:1;25193:99:0;;;23310:21:1;23367:2;23347:18;;;23340:30;23406:34;23386:18;;;23379:62;-1:-1:-1;;;23457:18:1;;;23450:48;23515:19;;25193:99:0;23126:414:1;25193:99:0;25311:2;:13;;;25328:4;25311:21;:55;;;-1:-1:-1;25352:14:0;;25336:13;;;;25352:14;;;;-1:-1:-1;25311:55:0;25303:121;;;;-1:-1:-1;;;25303:121:0;;23747:2:1;25303:121:0;;;23729:21:1;23786:2;23766:18;;;23759:30;23825:34;23805:18;;;23798:62;-1:-1:-1;;;23876:18:1;;;23869:51;23937:19;;25303:121:0;23545:417:1;25303:121:0;25461:14;;25443;;;;25461;;;;-1:-1:-1;;;;;25461:14:0;-1:-1:-1;25443:32:0;25435:87;;;;-1:-1:-1;;;25435:87:0;;24169:2:1;25435:87:0;;;24151:21:1;24208:2;24188:18;;;24181:30;24247:34;24227:18;;;24220:62;-1:-1:-1;;;24298:18:1;;;24291:40;24348:19;;25435:87:0;23967:406:1;25435:87:0;25565:14;;:18;;:14;;;-1:-1:-1;;;;;25565:14:0;25582:1;25565:18;:::i;:::-;-1:-1:-1;;;;;25546:38:0;:2;:14;;;:38;;25538:97;;;;-1:-1:-1;;;25538:97:0;;24857:2:1;25538:97:0;;;24839:21:1;24896:2;24876:18;;;24869:30;24935:34;24915:18;;;24908:62;-1:-1:-1;;;24986:18:1;;;24979:44;25040:19;;25538:97:0;24655:410:1;25538:97:0;-1:-1:-1;;25677:10:0;25655:33;;;;:21;:33;;;;;25648:40;;-1:-1:-1;;25648:40:0;;;24872:824::o;23397:270::-;23506:153;;-1:-1:-1;;;;;23540:24:0;;-1:-1:-1;;;;;;23619:3:0;23585:37;;;;23540:83;1342:25:1;;23638:10:0;;23506:153;;1330:2:1;1315:18;23506:153:0;1196:177:1;24206:398:0;24357:10;24306:26;24335:33;;;:21;:33;;;;;24384:21;;;;;;;-1:-1:-1;;24381:81:0;;;24420:42;;-1:-1:-1;;24420:42:0;;;;;;;;;24381:81;24493:12;;;;24476:14;;;;:29;24473:71;;;24531:12;;;;24507:37;;-1:-1:-1;;24507:37:0;;;;;;;;24473:71;24582:13;;;;24557:39;;;;:14;;:39;;24582:13;;24557:39;;;-1:-1:-1;;;;;24557:39:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;24557:39:0;;;;;-1:-1:-1;;;;;24557:39:0;;;;;;24295:309;24206:398;;:::o;23069:320::-;23191:190;;23218:22;;;23261:30;23289:2;23261:30;;;;23218:74;-1:-1:-1;;;;;;23341:3:0;23313:31;;;;23218:127;1342:25:1;;23360:10:0;;23191:190;;1330:2:1;1315:18;23191:190:0;;;;;;;23069:320;;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:173::-;635:20;;-1:-1:-1;;;;;684:31:1;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:1:o;1378:328::-;1455:6;1463;1471;1524:2;1512:9;1503:7;1499:23;1495:32;1492:52;;;1540:1;1537;1530:12;1492:52;1563:29;1582:9;1563:29;:::i;:::-;1553:39;;1611:38;1645:2;1634:9;1630:18;1611:38;:::i;:::-;1601:48;;1696:2;1685:9;1681:18;1668:32;1658:42;;1378:328;;;;;:::o;1900:322::-;1977:6;1985;1993;2046:2;2034:9;2025:7;2021:23;2017:32;2014:52;;;2062:1;2059;2052:12;2014:52;2085:29;2104:9;2085:29;:::i;:::-;2075:39;2161:2;2146:18;;2133:32;;-1:-1:-1;2212:2:1;2197:18;;;2184:32;;1900:322;-1:-1:-1;;;1900:322:1:o;2227:186::-;2286:6;2339:2;2327:9;2318:7;2314:23;2310:32;2307:52;;;2355:1;2352;2345:12;2307:52;2378:29;2397:9;2378:29;:::i;:::-;2368:39;2227:186;-1:-1:-1;;;2227:186:1:o;2723:180::-;2782:6;2835:2;2823:9;2814:7;2810:23;2806:32;2803:52;;;2851:1;2848;2841:12;2803:52;-1:-1:-1;2874:23:1;;2723:180;-1:-1:-1;2723:180:1:o;3296:118::-;3382:5;3375:13;3368:21;3361:5;3358:32;3348:60;;3404:1;3401;3394:12;3419:521;3511:6;3519;3527;3535;3543;3596:3;3584:9;3575:7;3571:23;3567:33;3564:53;;;3613:1;3610;3603:12;3564:53;3649:9;3636:23;3626:33;;3706:2;3695:9;3691:18;3678:32;3668:42;;3760:2;3749:9;3745:18;3732:32;3773:28;3795:5;3773:28;:::i;:::-;3820:5;-1:-1:-1;3844:38:1;3878:2;3863:18;;3844:38;:::i;:::-;3419:521;;;;-1:-1:-1;3419:521:1;;3929:3;3914:19;3901:33;;3419:521;-1:-1:-1;;3419:521:1:o;3945:735::-;4077:6;4085;4093;4146:2;4134:9;4125:7;4121:23;4117:32;4114:52;;;4162:1;4159;4152:12;4114:52;4202:9;4189:23;4231:18;4272:2;4264:6;4261:14;4258:34;;;4288:1;4285;4278:12;4258:34;4326:6;4315:9;4311:22;4301:32;;4371:7;4364:4;4360:2;4356:13;4352:27;4342:55;;4393:1;4390;4383:12;4342:55;4433:2;4420:16;4459:2;4451:6;4448:14;4445:34;;;4475:1;4472;4465:12;4445:34;4533:7;4526:4;4518;4510:6;4506:17;4502:2;4498:26;4494:37;4491:50;4488:70;;;4554:1;4551;4544:12;4488:70;4585:4;4577:13;;;;-1:-1:-1;4609:6:1;-1:-1:-1;4634:40:1;;4653:20;;;-1:-1:-1;4634:40:1;:::i;:::-;4624:50;;3945:735;;;;;:::o;4685:653::-;4795:6;4803;4811;4819;4827;4835;4843;4896:3;4884:9;4875:7;4871:23;4867:33;4864:53;;;4913:1;4910;4903:12;4864:53;4949:9;4936:23;4926:33;;5006:2;4995:9;4991:18;4978:32;4968:42;;5057:2;5046:9;5042:18;5029:32;5019:42;;5108:2;5097:9;5093:18;5080:32;5070:42;;5159:3;5148:9;5144:19;5131:33;5121:43;;5211:3;5200:9;5196:19;5183:33;5173:43;;5266:3;5255:9;5251:19;5238:33;5280:28;5302:5;5280:28;:::i;:::-;5327:5;5317:15;;;4685:653;;;;;;;;;;:::o;5343:868::-;5424:6;5477:3;5465:9;5456:7;5452:23;5448:33;5445:53;;;5494:1;5491;5484:12;5445:53;5527:2;5521:9;5569:3;5561:6;5557:16;5639:6;5627:10;5624:22;5603:18;5591:10;5588:34;5585:62;5582:185;;;5689:10;5684:3;5680:20;5677:1;5670:31;5724:4;5721:1;5714:15;5752:4;5749:1;5742:15;5582:185;5787:10;5783:2;5776:22;;5835:9;5822:23;5814:6;5807:39;5907:2;5896:9;5892:18;5879:32;5874:2;5866:6;5862:15;5855:57;5973:2;5962:9;5958:18;5945:32;5940:2;5932:6;5928:15;5921:57;6039:2;6028:9;6024:18;6011:32;6006:2;5998:6;5994:15;5987:57;6106:3;6095:9;6091:19;6078:33;6072:3;6064:6;6060:16;6053:59;6174:3;6163:9;6159:19;6146:33;6140:3;6132:6;6128:16;6121:59;6199:6;6189:16;;;5343:868;;;;:::o;6593:260::-;6661:6;6669;6722:2;6710:9;6701:7;6697:23;6693:32;6690:52;;;6738:1;6735;6728:12;6690:52;6761:29;6780:9;6761:29;:::i;:::-;6751:39;;6809:38;6843:2;6832:9;6828:18;6809:38;:::i;:::-;6799:48;;6593:260;;;;;:::o;6858:391::-;6944:6;6952;6960;6968;7021:3;7009:9;7000:7;6996:23;6992:33;6989:53;;;7038:1;7035;7028:12;6989:53;7074:9;7061:23;7051:33;;7131:2;7120:9;7116:18;7103:32;7093:42;;7154:38;7188:2;7177:9;7173:18;7154:38;:::i;:::-;6858:391;;;;-1:-1:-1;7144:48:1;;7239:2;7224:18;7211:32;;-1:-1:-1;;6858:391:1:o;7254:380::-;7333:1;7329:12;;;;7376;;;7397:61;;7451:4;7443:6;7439:17;7429:27;;7397:61;7504:2;7496:6;7493:14;7473:18;7470:38;7467:161;;7550:10;7545:3;7541:20;7538:1;7531:31;7585:4;7582:1;7575:15;7613:4;7610:1;7603:15;7467:161;;7254:380;;;:::o;7639:127::-;7700:10;7695:3;7691:20;7688:1;7681:31;7731:4;7728:1;7721:15;7755:4;7752:1;7745:15;7771:125;7836:9;;;7857:10;;;7854:36;;;7870:18;;:::i;8319:401::-;8521:2;8503:21;;;8560:2;8540:18;;;8533:30;8599:34;8594:2;8579:18;;8572:62;-1:-1:-1;;;8665:2:1;8650:18;;8643:35;8710:3;8695:19;;8319:401::o;8725:398::-;8927:2;8909:21;;;8966:2;8946:18;;;8939:30;9005:34;9000:2;8985:18;;8978:62;-1:-1:-1;;;9071:2:1;9056:18;;9049:32;9113:3;9098:19;;8725:398::o;9484:184::-;9554:6;9607:2;9595:9;9586:7;9582:23;9578:32;9575:52;;;9623:1;9620;9613:12;9575:52;-1:-1:-1;9646:16:1;;9484:184;-1:-1:-1;9484:184:1:o;10812:217::-;10852:1;10878;10868:132;;10922:10;10917:3;10913:20;10910:1;10903:31;10957:4;10954:1;10947:15;10985:4;10982:1;10975:15;10868:132;-1:-1:-1;11014:9:1;;10812:217::o;11034:127::-;11095:10;11090:3;11086:20;11083:1;11076:31;11126:4;11123:1;11116:15;11150:4;11147:1;11140:15;11640:128;11707:9;;;11728:11;;;11725:37;;;11742:18;;:::i;12179:168::-;12219:7;12285:1;12281;12277:6;12273:14;12270:1;12267:21;12262:1;12255:9;12248:17;12244:45;12241:71;;;12292:18;;:::i;:::-;-1:-1:-1;12332:9:1;;12179:168::o;12352:420::-;12554:2;12536:21;;;12593:2;12573:18;;;12566:30;12632:34;12627:2;12612:18;;12605:62;12703:26;12698:2;12683:18;;12676:54;12762:3;12747:19;;12352:420::o;15439:169::-;15517:13;;15570:12;15559:24;;15549:35;;15539:63;;15598:1;15595;15588:12;15613:177;15691:13;;-1:-1:-1;;;;;15733:32:1;;15723:43;;15713:71;;15780:1;15777;15770:12;15795:163;15873:13;;15926:6;15915:18;;15905:29;;15895:57;;15948:1;15945;15938:12;15963:747;16078:6;16086;16094;16102;16110;16118;16126;16179:3;16167:9;16158:7;16154:23;16150:33;16147:53;;;16196:1;16193;16186:12;16147:53;16219:39;16248:9;16219:39;:::i;:::-;16209:49;;16277:48;16321:2;16310:9;16306:18;16277:48;:::i;:::-;16267:58;;16344:48;16388:2;16377:9;16373:18;16344:48;:::i;:::-;16334:58;;16411:48;16455:2;16444:9;16440:18;16411:48;:::i;:::-;16401:58;;16478:49;16522:3;16511:9;16507:19;16478:49;:::i;:::-;16468:59;;16546:49;16590:3;16579:9;16575:19;16546:49;:::i;:::-;16536:59;;16638:3;16627:9;16623:19;16617:26;16652:28;16674:5;16652:28;:::i;17481:127::-;17542:10;17537:3;17533:20;17530:1;17523:31;17573:4;17570:1;17563:15;17597:4;17594:1;17587:15;18768:891;18894:6;18902;18910;18918;18926;18934;18942;18950;19003:3;18991:9;18982:7;18978:23;18974:33;18971:53;;;19020:1;19017;19010:12;18971:53;19043:39;19072:9;19043:39;:::i;:::-;19033:49;;19101:48;19145:2;19134:9;19130:18;19101:48;:::i;:::-;19091:58;;19168:48;19212:2;19201:9;19197:18;19168:48;:::i;:::-;19158:58;;19235:48;19279:2;19268:9;19264:18;19235:48;:::i;:::-;19225:58;;19302:49;19346:3;19335:9;19331:19;19302:49;:::i;:::-;19292:59;;19370:49;19414:3;19403:9;19399:19;19370:49;:::i;:::-;19360:59;;19438:49;19482:3;19471:9;19467:19;19438:49;:::i;:::-;19428:59;;19530:3;19519:9;19515:19;19509:26;-1:-1:-1;;;;;19568:5:1;19564:46;19557:5;19554:57;19544:85;;19625:1;19622;19615:12;19544:85;19648:5;19638:15;;;18768:891;;;;;;;;;;;:::o;20828:411::-;21030:2;21012:21;;;21069:2;21049:18;;;21042:30;21108:34;21103:2;21088:18;;21081:62;-1:-1:-1;;;21174:2:1;21159:18;;21152:45;21229:3;21214:19;;20828:411::o;21244:401::-;21446:2;21428:21;;;21485:2;21465:18;;;21458:30;21524:34;21519:2;21504:18;;21497:62;-1:-1:-1;;;21590:2:1;21575:18;;21568:35;21635:3;21620:19;;21244:401::o;22349:168::-;22416:6;22442:10;;;22454;;;22438:27;;22477:11;;;22474:37;;;22491:18;;:::i;:::-;22474:37;22349:168;;;;:::o;22522:197::-;-1:-1:-1;;;;;22644:10:1;;;22656;;;22640:27;;22679:11;;;22676:37;;;22693:18;;:::i;24378:272::-;24417:7;-1:-1:-1;;;;;24496:2:1;24493:1;24489:10;24526:2;24523:1;24519:10;24582:3;24578:2;24574:12;24569:3;24566:21;24559:3;24552:11;24545:19;24541:47;24538:73;;;24591:18;;:::i;:::-;24631:13;;24378:272;-1:-1:-1;;;;24378:272:1:o;25070:182::-;-1:-1:-1;;;;;25177:10:1;;;25189;;;25173:27;;25212:11;;;25209:37;;;25226:18;;:::i
Swarm Source
ipfs://61a13278b51a7e83d610fe88bde393134b6eef7699d4c59c7a88088a0cba7ed6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.