Latest 25 from a total of 49,123 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 16638053 | 2 hrs ago | IN | 0 ETH | 0.00002869 | ||||
Approve | 16634829 | 5 hrs ago | IN | 0 ETH | 0.00002131 | ||||
Approve | 16634783 | 5 hrs ago | IN | 0 ETH | 0.00002103 | ||||
Approve | 16634776 | 5 hrs ago | IN | 0 ETH | 0.00002097 | ||||
Approve | 16634354 | 5 hrs ago | IN | 0 ETH | 0.00002829 | ||||
Approve | 16633995 | 6 hrs ago | IN | 0 ETH | 0.00003958 | ||||
Approve | 16632432 | 7 hrs ago | IN | 0 ETH | 0.00003215 | ||||
Approve | 16631143 | 9 hrs ago | IN | 0 ETH | 0.00002469 | ||||
Approve | 16630320 | 9 hrs ago | IN | 0 ETH | 0.00000883 | ||||
Approve | 16629800 | 10 hrs ago | IN | 0 ETH | 0.00000177 | ||||
Approve | 16629638 | 10 hrs ago | IN | 0 ETH | 0.00000792 | ||||
Approve | 16629607 | 10 hrs ago | IN | 0 ETH | 0.00000203 | ||||
Approve | 16629499 | 10 hrs ago | IN | 0 ETH | 0.00000667 | ||||
Approve | 16628938 | 11 hrs ago | IN | 0 ETH | 0.00000477 | ||||
Approve | 16628195 | 11 hrs ago | IN | 0 ETH | 0.00000698 | ||||
Approve | 16628166 | 11 hrs ago | IN | 0 ETH | 0.00000698 | ||||
Approve | 16628081 | 11 hrs ago | IN | 0 ETH | 0.00000629 | ||||
Approve | 16627372 | 12 hrs ago | IN | 0 ETH | 0.00000648 | ||||
Approve | 16624570 | 15 hrs ago | IN | 0 ETH | 0.0000039 | ||||
Approve | 16623922 | 15 hrs ago | IN | 0 ETH | 0.00000439 | ||||
Approve | 16622737 | 16 hrs ago | IN | 0 ETH | 0.00000276 | ||||
Approve | 16621952 | 17 hrs ago | IN | 0 ETH | 0.00000503 | ||||
Approve | 16619728 | 19 hrs ago | IN | 0 ETH | 0.00000791 | ||||
Approve | 16619590 | 19 hrs ago | IN | 0 ETH | 0.00000736 | ||||
Approve | 16619354 | 20 hrs ago | IN | 0 ETH | 0.00000717 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16614974 | 24 hrs ago | 0.00013784 ETH | ||||
16614974 | 24 hrs ago | 0.00013784 ETH | ||||
16595036 | 42 hrs ago | 0.00001381 ETH | ||||
16589829 | 47 hrs ago | 0.00021941 ETH | ||||
16589829 | 47 hrs ago | 0.00021941 ETH | ||||
16584510 | 2 days ago | 0.00021941 ETH | ||||
16584510 | 2 days ago | 0.00021941 ETH | ||||
16545173 | 3 days ago | 0.00021941 ETH | ||||
16545173 | 3 days ago | 0.00021941 ETH | ||||
16507084 | 5 days ago | 0.00021941 ETH | ||||
16500996 | 5 days ago | 0.00254725 ETH | ||||
16500794 | 5 days ago | 0.00021941 ETH | ||||
16496586 | 5 days ago | 0.00013794 ETH | ||||
16465852 | 6 days ago | 0.00021073 ETH | ||||
16453644 | 7 days ago | 0.00013145 ETH | ||||
16400291 | 9 days ago | 0.00021073 ETH | ||||
16387219 | 9 days ago | 0.00001312 ETH | ||||
16383751 | 9 days ago | 0.00021073 ETH | ||||
16343253 | 11 days ago | 0.00021073 ETH | ||||
16321549 | 11 days ago | 0.00021073 ETH | ||||
16314953 | 12 days ago | 0.00021073 ETH | ||||
16314953 | 12 days ago | 0.00021073 ETH | ||||
16311674 | 12 days ago | 0.00013579 ETH | ||||
16310863 | 12 days ago | 0.00021073 ETH | ||||
16310863 | 12 days ago | 0.00021073 ETH |
Loading...
Loading
Contract Name:
CakeOFT
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at zkevm.polygonscan.com on 2023-06-22 */ pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) /** * @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 {} } // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; } interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; } interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external; // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); } /* * @title Solidity Bytes Arrays Utils * @author Gonçalo Sá <[email protected]> * * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity. * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage. */ library BytesLib { function concat( bytes memory _preBytes, bytes memory _postBytes ) internal pure returns (bytes memory) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore(0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. )) } return tempBytes; } function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal { assembly { // Read the first 32 bytes of _preBytes storage, which is the length // of the array. (We don't need to use the offset into the slot // because arrays use the entire slot.) let fslot := sload(_preBytes.slot) // Arrays of 31 bytes or less have an even value in their slot, // while longer arrays have an odd value. The actual length is // the slot divided by two for odd values, and the lowest order // byte divided by two for even values. // If the slot is even, bitwise and the slot with 255 and divide by // two to get the length. If the slot is odd, bitwise and the slot // with -1 and divide by two. let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) let newlength := add(slength, mlength) // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage switch add(lt(slength, 32), lt(newlength, 32)) case 2 { // Since the new array still fits in the slot, we just need to // update the contents of the slot. // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length sstore( _preBytes.slot, // all the modifications to the slot are inside this // next block add( // we can just add to the slot contents because the // bytes we want to change are the LSBs fslot, add( mul( div( // load the bytes from memory mload(add(_postBytes, 0x20)), // zero all bytes to the right exp(0x100, sub(32, mlength)) ), // and now shift left the number of bytes to // leave space for the length in the slot exp(0x100, sub(32, newlength)) ), // increase length by the double of the memory // bytes length mul(mlength, 2) ) ) ) } case 1 { // The stored value fits in the slot, but the combined value // will exceed it. // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // The contents of the _postBytes array start 32 bytes into // the structure. Our first read should obtain the `submod` // bytes that can fit into the unused space in the last word // of the stored array. To get this, we read 32 bytes starting // from `submod`, so the data we read overlaps with the array // contents by `submod` bytes. Masking the lowest-order // `submod` bytes allows us to add that value directly to the // stored value. let submod := sub(32, slength) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore( sc, add( and( fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ), and(mload(mc), mask) ) ) for { mc := add(mc, 0x20) sc := add(sc, 1) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } default { // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) // Start copying to the last used word of the stored array. let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // Copy over the first `submod` bytes of the new data as in // case 1 above. let slengthmod := mod(slength, 32) let mlengthmod := mod(mlength, 32) let submod := sub(32, slengthmod) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore(sc, add(sload(sc), and(mload(mc), mask))) for { sc := add(sc, 1) mc := add(mc, 0x20) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } } } function slice( bytes memory _bytes, uint256 _start, uint256 _length ) internal pure returns (bytes memory) { require(_length + 31 >= _length, "slice_overflow"); require(_bytes.length >= _start + _length, "slice_outOfBounds"); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) { require(_bytes.length >= _start + 20, "toAddress_outOfBounds"); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) { require(_bytes.length >= _start + 1 , "toUint8_outOfBounds"); uint8 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x1), _start)) } return tempUint; } function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) { require(_bytes.length >= _start + 2, "toUint16_outOfBounds"); uint16 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x2), _start)) } return tempUint; } function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) { require(_bytes.length >= _start + 4, "toUint32_outOfBounds"); uint32 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x4), _start)) } return tempUint; } function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) { require(_bytes.length >= _start + 8, "toUint64_outOfBounds"); uint64 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x8), _start)) } return tempUint; } function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) { require(_bytes.length >= _start + 12, "toUint96_outOfBounds"); uint96 tempUint; assembly { tempUint := mload(add(add(_bytes, 0xc), _start)) } return tempUint; } function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) { require(_bytes.length >= _start + 16, "toUint128_outOfBounds"); uint128 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x10), _start)) } return tempUint; } function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) { require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); uint256 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) { require(_bytes.length >= _start + 32, "toBytes32_outOfBounds"); bytes32 tempBytes32; assembly { tempBytes32 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes32; } function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) { bool success = true; assembly { let length := mload(_preBytes) // if lengths don't match the arrays are not equal switch eq(length, mload(_postBytes)) case 1 { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 let mc := add(_preBytes, 0x20) let end := add(mc, length) for { let cc := add(_postBytes, 0x20) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) } eq(add(lt(mc, end), cb), 2) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { // if any of these checks fails then arrays are not equal if iszero(eq(mload(mc), mload(cc))) { // unsuccess: success := 0 cb := 0 } } } default { // unsuccess: success := 0 } } return success; } function equalStorage( bytes storage _preBytes, bytes memory _postBytes ) internal view returns (bool) { bool success = true; assembly { // we know _preBytes_offset is 0 let fslot := sload(_preBytes.slot) // Decode the length of the stored array like in concatStorage(). let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) // if lengths don't match the arrays are not equal switch eq(slength, mlength) case 1 { // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage if iszero(iszero(slength)) { switch lt(slength, 32) case 1 { // blank the last byte which is the length fslot := mul(div(fslot, 0x100), 0x100) if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { // unsuccess: success := 0 } } default { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := keccak256(0x0, 0x20) let mc := add(_postBytes, 0x20) let end := add(mc, mlength) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) for {} eq(add(lt(mc, end), cb), 2) { sc := add(sc, 1) mc := add(mc, 0x20) } { if iszero(eq(sload(sc), mload(mc))) { // unsuccess: success := 0 cb := 0 } } } } } default { // unsuccess: success := 0 } } return success; } } /* * a generic LzReceiver implementation */ abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { using BytesLib for bytes; ILayerZeroEndpoint public immutable lzEndpoint; mapping(uint16 => bytes) public trustedRemoteLookup; mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup; address public precrime; event SetPrecrime(address precrime); event SetTrustedRemote(uint16 _remoteChainId, bytes _path); event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress); event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas); constructor(address _endpoint) { lzEndpoint = ILayerZeroEndpoint(_endpoint); } function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual override { // lzReceive must be called by the endpoint for security require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller"); bytes memory trustedRemote = trustedRemoteLookup[_srcChainId]; // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote. require(_srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote), "LzApp: invalid source sending contract"); _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams, uint _nativeFee) internal virtual { bytes memory trustedRemote = trustedRemoteLookup[_dstChainId]; require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source"); lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams); } function _checkGasLimit(uint16 _dstChainId, uint16 _type, bytes memory _adapterParams, uint _extraGas) internal view virtual { uint providedGasLimit = _getGasLimit(_adapterParams); uint minGasLimit = minDstGasLookup[_dstChainId][_type] + _extraGas; require(minGasLimit > 0, "LzApp: minGasLimit not set"); require(providedGasLimit >= minGasLimit, "LzApp: gas limit is too low"); } function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) { require(_adapterParams.length >= 34, "LzApp: invalid adapterParams"); assembly { gasLimit := mload(add(_adapterParams, 34)) } } //---------------------------UserApplication config---------------------------------------- function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns (bytes memory) { return lzEndpoint.getConfig(_version, _chainId, address(this), _configType); } // generic config for LayerZero user Application function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner { lzEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 _version) external override onlyOwner { lzEndpoint.setSendVersion(_version); } function setReceiveVersion(uint16 _version) external override onlyOwner { lzEndpoint.setReceiveVersion(_version); } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } // _path = abi.encodePacked(remoteAddress, localAddress) // this function set the trusted path for the cross-chain communication function setTrustedRemote(uint16 _srcChainId, bytes calldata _path) external onlyOwner { trustedRemoteLookup[_srcChainId] = _path; emit SetTrustedRemote(_srcChainId, _path); } function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner { trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this)); emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress); } function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) { bytes memory path = trustedRemoteLookup[_remoteChainId]; require(path.length != 0, "LzApp: no trusted path record"); return path.slice(0, path.length - 20); // the last 20 bytes should be address(this) } function setPrecrime(address _precrime) external onlyOwner { precrime = _precrime; emit SetPrecrime(_precrime); } function setMinDstGas(uint16 _dstChainId, uint16 _packetType, uint _minGas) external onlyOwner { require(_minGas > 0, "LzApp: invalid minGas"); minDstGasLookup[_dstChainId][_packetType] = _minGas; emit SetMinDstGas(_dstChainId, _packetType, _minGas); } //--------------------------- VIEW FUNCTION ---------------------------------------- function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; return keccak256(trustedSource) == keccak256(_srcAddress); } } library ExcessivelySafeCall { uint256 constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff; /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeCall( address _target, uint256 _gas, uint16 _maxCopy, bytes memory _calldata ) internal returns (bool, bytes memory) { // set up for assembly call uint256 _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := call( _gas, // gas _target, // recipient 0, // ether value add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeStaticCall( address _target, uint256 _gas, uint16 _maxCopy, bytes memory _calldata ) internal view returns (bool, bytes memory) { // set up for assembly call uint256 _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := staticcall( _gas, // gas _target, // recipient add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /** * @notice Swaps function selectors in encoded contract calls * @dev Allows reuse of encoded calldata for functions with identical * argument types but different names. It simply swaps out the first 4 bytes * for the new selector. This function modifies memory in place, and should * only be used with caution. * @param _newSelector The new 4-byte selector * @param _buf The encoded contract args */ function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure { require(_buf.length >= 4); uint256 _mask = LOW_28_MASK; assembly { // load the first word of let _word := mload(add(_buf, 0x20)) // mask out the top 4 bytes // /x _word := and(_word, _mask) _word := or(_newSelector, _word) mstore(add(_buf, 0x20), _word) } } } /* * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress) */ abstract contract NonblockingLzApp is LzApp { using ExcessivelySafeCall for address; constructor(address _endpoint) LzApp(_endpoint) {} mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages; event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason); event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash); // overriding the virtual function in LzReceiver function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override { (bool success, bytes memory reason) = address(this).excessivelySafeCall(gasleft(), 150, abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload)); // try-catch all errors/exceptions if (!success) { _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason); } } function _storeFailedMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload, bytes memory _reason) internal virtual { failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason); } function nonblockingLzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual { // only internal transaction require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp"); _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } //@notice override this function function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function retryMessage(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public payable virtual { // assert there is message to retry bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce]; require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message"); require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload"); // clear the stored message failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0); // execute the message. revert if it fails again _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Interface of the IOFT core standard */ interface ICommonOFT is IERC165 { struct LzCallParams { address payable refundAddress; address zroPaymentAddress; bytes adapterParams; } /** * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`) * _dstChainId - L0 defined chain id to send tokens too * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain * _amount - amount of the tokens to transfer * _useZro - indicates to use zro to pay L0 fees * _adapterParam - flexible bytes array to indicate messaging adapter services in L0 */ function estimateSendFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); function estimateSendAndCallFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); /** * @dev returns the circulating amount of tokens on current chain */ function circulatingSupply() external view returns (uint); /** * @dev returns the address of the ERC20 token */ function token() external view returns (address); } interface IOFTReceiverV2 { /** * @dev Called by the OFT contract when tokens are received from source chain. * @param _srcChainId The chain id of the source chain. * @param _srcAddress The address of the OFT token contract on the source chain. * @param _nonce The nonce of the transaction on the source chain. * @param _from The address of the account who calls the sendAndCall() on the source chain. * @param _amount The amount of tokens to transfer. * @param _payload Additional data with no specified format. */ function onOFTReceived(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes32 _from, uint _amount, bytes calldata _payload) external; } abstract contract OFTCoreV2 is NonblockingLzApp { using BytesLib for bytes; using ExcessivelySafeCall for address; uint public constant NO_EXTRA_GAS = 0; // packet type uint8 public constant PT_SEND = 0; uint8 public constant PT_SEND_AND_CALL = 1; uint8 public immutable sharedDecimals; bool public useCustomAdapterParams; mapping(uint16 => mapping(bytes => mapping(uint64 => AmountForCall))) public amountsForCall; struct AmountForCall { uint amount; bool credited; } /** * @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`) * `_nonce` is the outbound nonce */ event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes32 indexed _toAddress, uint _amount); /** * @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain. * `_nonce` is the inbound nonce. */ event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount); event SetUseCustomAdapterParams(bool _useCustomAdapterParams); event CallOFTReceivedSuccess(uint16 indexed _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _hash); event NonContractAddress(address _address); // _sharedDecimals should be the minimum decimals on all chains constructor(uint8 _sharedDecimals, address _lzEndpoint) NonblockingLzApp(_lzEndpoint) { sharedDecimals = _sharedDecimals; } /************************************************************************ * public functions ************************************************************************/ function callOnOFTReceived(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes32 _from, address _to, uint _amount, bytes calldata _payload, uint _gasForCall) public virtual { require(_msgSender() == address(this), "OFTCore: caller must be OFTCore"); // send _amount = _transferFrom(address(this), _to, _amount); emit ReceiveFromChain(_srcChainId, _to, _amount); // call IOFTReceiverV2(_to).onOFTReceived{gas: _gasForCall}(_srcChainId, _srcAddress, _nonce, _from, _amount, _payload); } function setUseCustomAdapterParams(bool _useCustomAdapterParams) public virtual onlyOwner { useCustomAdapterParams = _useCustomAdapterParams; emit SetUseCustomAdapterParams(_useCustomAdapterParams); } /************************************************************************ * internal functions ************************************************************************/ function _estimateSendFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bool _useZro, bytes memory _adapterParams) internal view virtual returns (uint nativeFee, uint zroFee) { // mock the payload for sendFrom() bytes memory payload = _encodeSendPayload(_toAddress, _ld2sd(_amount)); return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); } function _estimateSendAndCallFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes memory _payload, uint64 _dstGasForCall, bool _useZro, bytes memory _adapterParams) internal view virtual returns (uint nativeFee, uint zroFee) { // mock the payload for sendAndCall() bytes memory payload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(_amount), _payload, _dstGasForCall); return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); } function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override { uint8 packetType = _payload.toUint8(0); if (packetType == PT_SEND) { _sendAck(_srcChainId, _srcAddress, _nonce, _payload); } else if (packetType == PT_SEND_AND_CALL) { _sendAndCallAck(_srcChainId, _srcAddress, _nonce, _payload); } else { revert("OFTCore: unknown packet type"); } } function _send(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual returns (uint amount) { _checkAdapterParams(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS); (amount,) = _removeDust(_amount); amount = _debitFrom(_from, _dstChainId, _toAddress, amount); // amount returned should not have dust require(amount > 0, "OFTCore: amount too small"); bytes memory lzPayload = _encodeSendPayload(_toAddress, _ld2sd(amount)); _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); emit SendToChain(_dstChainId, _from, _toAddress, amount); } function _sendAck(uint16 _srcChainId, bytes memory, uint64, bytes memory _payload) internal virtual { (address to, uint64 amountSD) = _decodeSendPayload(_payload); if (to == address(0)) { to = address(0xdead); } uint amount = _sd2ld(amountSD); amount = _creditTo(_srcChainId, to, amount); emit ReceiveFromChain(_srcChainId, to, amount); } function _sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes memory _payload, uint64 _dstGasForCall, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual returns (uint amount) { _checkAdapterParams(_dstChainId, PT_SEND_AND_CALL, _adapterParams, _dstGasForCall); (amount,) = _removeDust(_amount); amount = _debitFrom(_from, _dstChainId, _toAddress, amount); require(amount > 0, "OFTCore: amount too small"); // encode the msg.sender into the payload instead of _from bytes memory lzPayload = _encodeSendAndCallPayload(msg.sender, _toAddress, _ld2sd(amount), _payload, _dstGasForCall); _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); emit SendToChain(_dstChainId, _from, _toAddress, amount); } function _sendAndCallAck(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual { (bytes32 from, address to, uint64 amountSD, bytes memory payloadForCall, uint64 gasForCall) = _decodeSendAndCallPayload(_payload); AmountForCall memory amountForCall = amountsForCall[_srcChainId][_srcAddress][_nonce]; uint amount = amountForCall.amount; // credit to this contract first, and then transfer to receiver only if callOnOFTReceived() succeeds if (!amountForCall.credited) { amount = _sd2ld(amountSD); amount = _creditTo(_srcChainId, address(this), amount); amountsForCall[_srcChainId][_srcAddress][_nonce] = AmountForCall(amount, true); } if (!_isContract(to)) { emit NonContractAddress(to); return; } // workaround for stack too deep uint16 srcChainId = _srcChainId; bytes memory srcAddress = _srcAddress; uint64 nonce = _nonce; bytes memory payload = _payload; bytes32 from_ = from; address to_ = to; uint amount_ = amount; bytes memory payloadForCall_ = payloadForCall; // no gas limit for the call if retry uint gas = amountForCall.credited ? gasleft() : gasForCall; (bool success, bytes memory reason) = address(this).excessivelySafeCall(gasleft(), 150, abi.encodeWithSelector(this.callOnOFTReceived.selector, srcChainId, srcAddress, nonce, from_, to_, amount_, payloadForCall_, gas)); if (success) { bytes32 hash = keccak256(payload); emit CallOFTReceivedSuccess(srcChainId, srcAddress, nonce, hash); } else { // store the failed message into the nonblockingLzApp _storeFailedMessage(srcChainId, srcAddress, nonce, payload, reason); } } function _isContract(address _account) internal view returns (bool) { return _account.code.length > 0; } function _checkAdapterParams(uint16 _dstChainId, uint16 _pkType, bytes memory _adapterParams, uint _extraGas) internal virtual { if (useCustomAdapterParams) { _checkGasLimit(_dstChainId, _pkType, _adapterParams, _extraGas); } else { require(_adapterParams.length == 0, "OFTCore: _adapterParams must be empty."); } } function _ld2sd(uint _amount) internal virtual view returns (uint64) { uint amountSD = _amount / _ld2sdRate(); require(amountSD <= type(uint64).max, "OFTCore: amountSD overflow"); return uint64(amountSD); } function _sd2ld(uint64 _amountSD) internal virtual view returns (uint) { return _amountSD * _ld2sdRate(); } function _removeDust(uint _amount) internal virtual view returns (uint amountAfter, uint dust) { dust = _amount % _ld2sdRate(); amountAfter = _amount - dust; } function _encodeSendPayload(bytes32 _toAddress, uint64 _amountSD) internal virtual view returns (bytes memory) { return abi.encodePacked(PT_SEND, _toAddress, _amountSD); } function _decodeSendPayload(bytes memory _payload) internal virtual view returns (address to, uint64 amountSD) { require(_payload.toUint8(0) == PT_SEND && _payload.length == 41, "OFTCore: invalid payload"); to = _payload.toAddress(13); // drop the first 12 bytes of bytes32 amountSD = _payload.toUint64(33); } function _encodeSendAndCallPayload(address _from, bytes32 _toAddress, uint64 _amountSD, bytes memory _payload, uint64 _dstGasForCall) internal virtual view returns (bytes memory) { return abi.encodePacked( PT_SEND_AND_CALL, _toAddress, _amountSD, _addressToBytes32(_from), _dstGasForCall, _payload ); } function _decodeSendAndCallPayload(bytes memory _payload) internal virtual view returns (bytes32 from, address to, uint64 amountSD, bytes memory payload, uint64 dstGasForCall) { require(_payload.toUint8(0) == PT_SEND_AND_CALL, "OFTCore: invalid payload"); to = _payload.toAddress(13); // drop the first 12 bytes of bytes32 amountSD = _payload.toUint64(33); from = _payload.toBytes32(41); dstGasForCall = _payload.toUint64(73); payload = _payload.slice(81, _payload.length - 81); } function _addressToBytes32(address _address) internal pure virtual returns (bytes32) { return bytes32(uint(uint160(_address))); } function _debitFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount) internal virtual returns (uint); function _creditTo(uint16 _srcChainId, address _toAddress, uint _amount) internal virtual returns (uint); function _transferFrom(address _from, address _to, uint _amount) internal virtual returns (uint); function _ld2sdRate() internal view virtual returns (uint); } /** * @dev Interface of the IOFT core standard */ interface IOFTWithFee is ICommonOFT { /** * @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from` * `_from` the owner of token * `_dstChainId` the destination chain identifier * `_toAddress` can be any size depending on the `dstChainId`. * `_amount` the quantity of tokens in wei * `_minAmount` the minimum amount of tokens to receive on dstChain * `_refundAddress` the address LayerZero refunds if too much message fee is sent * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) * `_adapterParams` is a flexible bytes array to indicate messaging adapter services */ function sendFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, LzCallParams calldata _callParams) external payable; function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) external payable; } abstract contract Fee is Ownable { uint public constant BP_DENOMINATOR = 10000; mapping(uint16 => FeeConfig) public chainIdToFeeBps; uint16 public defaultFeeBp; address public feeOwner; // defaults to owner struct FeeConfig { uint16 feeBP; bool enabled; } event SetFeeBp(uint16 dstchainId, bool enabled, uint16 feeBp); event SetDefaultFeeBp(uint16 feeBp); event SetFeeOwner(address feeOwner); constructor(){ feeOwner = owner(); } function setDefaultFeeBp(uint16 _feeBp) public virtual onlyOwner { require(_feeBp <= BP_DENOMINATOR, "Fee: fee bp must be <= BP_DENOMINATOR"); defaultFeeBp = _feeBp; emit SetDefaultFeeBp(defaultFeeBp); } function setFeeBp(uint16 _dstChainId, bool _enabled, uint16 _feeBp) public virtual onlyOwner { require(_feeBp <= BP_DENOMINATOR, "Fee: fee bp must be <= BP_DENOMINATOR"); chainIdToFeeBps[_dstChainId] = FeeConfig(_feeBp, _enabled); emit SetFeeBp(_dstChainId, _enabled, _feeBp); } function setFeeOwner(address _feeOwner) public virtual onlyOwner { require(_feeOwner != address(0x0), "Fee: feeOwner cannot be 0x"); feeOwner = _feeOwner; emit SetFeeOwner(_feeOwner); } function quoteOFTFee(uint16 _dstChainId, uint _amount) public virtual view returns (uint fee) { FeeConfig memory config = chainIdToFeeBps[_dstChainId]; if (config.enabled) { fee = _amount * config.feeBP / BP_DENOMINATOR; } else if (defaultFeeBp > 0) { fee = _amount * defaultFeeBp / BP_DENOMINATOR; } else { fee = 0; } } function _payOFTFee(address _from, uint16 _dstChainId, uint _amount) internal virtual returns (uint amount, uint fee) { fee = quoteOFTFee(_dstChainId, _amount); amount = _amount - fee; if (fee > 0) { _transferFrom(_from, feeOwner, fee); } } function _transferFrom(address _from, address _to, uint _amount) internal virtual returns (uint); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } abstract contract BaseOFTWithFee is OFTCoreV2, Fee, ERC165, IOFTWithFee { constructor(uint8 _sharedDecimals, address _lzEndpoint) OFTCoreV2(_sharedDecimals, _lzEndpoint) { } /************************************************************************ * public functions ************************************************************************/ function sendFrom(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, LzCallParams calldata _callParams) public payable virtual override { (_amount,) = _payOFTFee(_from, _dstChainId, _amount); _amount = _send(_from, _dstChainId, _toAddress, _amount, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams); require(_amount >= _minAmount, "BaseOFTWithFee: amount is less than minAmount"); } function sendAndCall(address _from, uint16 _dstChainId, bytes32 _toAddress, uint _amount, uint _minAmount, bytes calldata _payload, uint64 _dstGasForCall, LzCallParams calldata _callParams) public payable virtual override { (_amount,) = _payOFTFee(_from, _dstChainId, _amount); _amount = _sendAndCall(_from, _dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _callParams.refundAddress, _callParams.zroPaymentAddress, _callParams.adapterParams); require(_amount >= _minAmount, "BaseOFTWithFee: amount is less than minAmount"); } /************************************************************************ * public view functions ************************************************************************/ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IOFTWithFee).interfaceId || super.supportsInterface(interfaceId); } function estimateSendFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) { return _estimateSendFee(_dstChainId, _toAddress, _amount, _useZro, _adapterParams); } function estimateSendAndCallFee(uint16 _dstChainId, bytes32 _toAddress, uint _amount, bytes calldata _payload, uint64 _dstGasForCall, bool _useZro, bytes calldata _adapterParams) public view virtual override returns (uint nativeFee, uint zroFee) { return _estimateSendAndCallFee(_dstChainId, _toAddress, _amount, _payload, _dstGasForCall, _useZro, _adapterParams); } function circulatingSupply() public view virtual override returns (uint); function token() public view virtual override returns (address); function _transferFrom(address _from, address _to, uint _amount) internal virtual override (Fee, OFTCoreV2) returns (uint); } contract OFTWithFee is BaseOFTWithFee, ERC20 { uint internal immutable ld2sdRate; constructor(string memory _name, string memory _symbol, uint8 _sharedDecimals, address _lzEndpoint) ERC20(_name, _symbol) BaseOFTWithFee(_sharedDecimals, _lzEndpoint) { uint8 decimals = decimals(); require(_sharedDecimals <= decimals, "OFTWithFee: sharedDecimals must be <= decimals"); ld2sdRate = 10 ** (decimals - _sharedDecimals); } /************************************************************************ * public functions ************************************************************************/ function circulatingSupply() public view virtual override returns (uint) { return totalSupply(); } function token() public view virtual override returns (address) { return address(this); } /************************************************************************ * internal functions ************************************************************************/ function _debitFrom(address _from, uint16, bytes32, uint _amount) internal virtual override returns (uint) { address spender = _msgSender(); if (_from != spender) _spendAllowance(_from, spender, _amount); _burn(_from, _amount); return _amount; } function _creditTo(uint16, address _toAddress, uint _amount) internal virtual override returns (uint) { _mint(_toAddress, _amount); return _amount; } function _transferFrom(address _from, address _to, uint _amount) internal virtual override returns (uint) { address spender = _msgSender(); // if transfer from this contract, no need to check allowance if (_from != address(this) && _from != spender) _spendAllowance(_from, spender, _amount); _transfer(_from, _to, _amount); return _amount; } function _ld2sdRate() internal view virtual override returns (uint) { return ld2sdRate; } } // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } contract CakeOFT is OFTWithFee, Pausable { // Outbound cap mapping(uint16 => uint256) public chainIdToOutboundCap; mapping(uint16 => uint256) public chainIdToSentTokenAmount; mapping(uint16 => uint256) public chainIdToLastSentTimestamp; // Inbound cap mapping(uint16 => uint256) public chainIdToInboundCap; mapping(uint16 => uint256) public chainIdToReceivedTokenAmount; mapping(uint16 => uint256) public chainIdToLastReceivedTimestamp; // If an address is whitelisted, the inbound/outbound cap checks are skipped mapping(address => bool) public whitelist; error ExceedOutboundCap(uint256 cap, uint256 amount); error ExceedInboundCap(uint256 cap, uint256 amount); event SetOperator(address newOperator); event SetOutboundCap(uint16 indexed chainId, uint256 cap); event SetInboundCap(uint16 indexed chainId, uint256 cap); event SetWhitelist(address indexed addr, bool isWhitelist); event FallbackWithdraw(address indexed to, uint256 amount); event DropFailedMessage(uint16 srcChainId, bytes srcAddress, uint64 nonce); constructor(address _lzEndpoint) OFTWithFee("PancakeSwap Token", "Cake", 8, _lzEndpoint){} function decimals() public pure override returns (uint8){ return 18; } function _debitFrom( address _from, uint16 _dstChainId, bytes32 _toAddress, uint256 _amount ) internal override whenNotPaused returns (uint256) { uint256 amount = super._debitFrom( _from, _dstChainId, _toAddress, _amount ); if (whitelist[_from]) { return amount; } uint256 sentTokenAmount; uint256 lastSentTimestamp = chainIdToLastSentTimestamp[_dstChainId]; uint256 currTimestamp = block.timestamp; if ((currTimestamp / (1 days)) > (lastSentTimestamp / (1 days))) { sentTokenAmount = amount; } else { sentTokenAmount = chainIdToSentTokenAmount[_dstChainId] + amount; } uint256 outboundCap = chainIdToOutboundCap[_dstChainId]; if (sentTokenAmount > outboundCap) { revert ExceedOutboundCap(outboundCap, sentTokenAmount); } chainIdToSentTokenAmount[_dstChainId] = sentTokenAmount; chainIdToLastSentTimestamp[_dstChainId] = currTimestamp; return amount; } function _creditTo( uint16 _srcChainId, address _toAddress, uint256 _amount ) internal override whenNotPaused returns (uint256) { uint256 amount = super._creditTo(_srcChainId, _toAddress, _amount); if (whitelist[_toAddress]) { return amount; } uint256 receivedTokenAmount; uint256 lastReceivedTimestamp = chainIdToLastReceivedTimestamp[ _srcChainId ]; uint256 currTimestamp = block.timestamp; if ((currTimestamp / (1 days)) > (lastReceivedTimestamp / (1 days))) { receivedTokenAmount = amount; } else { receivedTokenAmount = chainIdToReceivedTokenAmount[_srcChainId] + amount; } uint256 inboundCap = chainIdToInboundCap[_srcChainId]; if (receivedTokenAmount > inboundCap) { revert ExceedInboundCap(inboundCap, receivedTokenAmount); } chainIdToReceivedTokenAmount[_srcChainId] = receivedTokenAmount; chainIdToLastReceivedTimestamp[_srcChainId] = currTimestamp; return amount; } function setOutboundCap(uint16 chainId, uint256 cap) external onlyOwner { chainIdToOutboundCap[chainId] = cap; emit SetOutboundCap(chainId, cap); } function setInboundCap(uint16 chainId, uint256 cap) external onlyOwner { chainIdToInboundCap[chainId] = cap; emit SetInboundCap(chainId, cap); } function setWhitelist(address addr, bool isWhitelist) external onlyOwner { whitelist[addr] = isWhitelist; emit SetWhitelist(addr, isWhitelist); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_lzEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ExceedInboundCap","type":"error"},{"inputs":[{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ExceedOutboundCap","type":"error"},{"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":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"CallOFTReceivedSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"}],"name":"DropFailedMessage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FallbackWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"NonContractAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"feeBp","type":"uint16"}],"name":"SetDefaultFeeBp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"dstchainId","type":"uint16"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint16","name":"feeBp","type":"uint16"}],"name":"SetFeeBp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeOwner","type":"address"}],"name":"SetFeeOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"SetInboundCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"SetOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"SetOutboundCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"SetUseCustomAdapterParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"isWhitelist","type":"bool"}],"name":"SetWhitelist","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BP_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_EXTRA_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND_AND_CALL","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"amountsForCall","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"credited","type":"bool"}],"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":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes32","name":"_from","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint256","name":"_gasForCall","type":"uint256"}],"name":"callOnOFTReceived","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"chainIdToFeeBps","outputs":[{"internalType":"uint16","name":"feeBP","type":"uint16"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"chainIdToInboundCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"chainIdToLastReceivedTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"chainIdToLastSentTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"chainIdToOutboundCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"chainIdToReceivedTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"chainIdToSentTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":[],"name":"defaultFeeBp","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint64","name":"_dstGasForCall","type":"uint64"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendAndCallFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"quoteOFTFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"uint64","name":"_dstGasForCall","type":"uint64"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"}],"name":"sendAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes32","name":"_toAddress","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"components":[{"internalType":"address payable","name":"refundAddress","type":"address"},{"internalType":"address","name":"zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"adapterParams","type":"bytes"}],"internalType":"struct ICommonOFT.LzCallParams","name":"_callParams","type":"tuple"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_feeBp","type":"uint16"}],"name":"setDefaultFeeBp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint16","name":"_feeBp","type":"uint16"}],"name":"setFeeBp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeOwner","type":"address"}],"name":"setFeeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chainId","type":"uint16"},{"internalType":"uint256","name":"cap","type":"uint256"}],"name":"setInboundCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chainId","type":"uint16"},{"internalType":"uint256","name":"cap","type":"uint256"}],"name":"setOutboundCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"setUseCustomAdapterParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isWhitelist","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useCustomAdapterParams","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b506040516200547e3803806200547e8339810160408190526200003491620002d8565b604051806040016040528060118152602001702830b731b0b5b2a9bbb0b8102a37b5b2b760791b8152506040518060400160405280600481526020016343616b6560e01b8152506008838383838381818080620000a06200009a620001d960201b60201c565b620001dd565b6001600160a01b0316608052505060ff1660a052620000c76000546001600160a01b031690565b600880546001600160a01b0392909216620100000262010000600160b01b0319909216919091179055505081516200010790600c90602085019062000232565b5080516200011d90600d90602084019062000232565b5050506000620001326200022d60201b60201c565b90508060ff168360ff161115620001a65760405162461bcd60e51b815260206004820152602e60248201527f4f4654576974684665653a20736861726564446563696d616c73206d7573742060448201526d6265203c3d20646563696d616c7360901b606482015260840160405180910390fd5b620001b2838262000320565b620001bf90600a62000445565b60c0525050600e805460ff19169055506200049392505050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b601290565b828054620002409062000456565b90600052602060002090601f016020900481019282620002645760008555620002af565b82601f106200027f57805160ff1916838001178555620002af565b82800160010185558215620002af579182015b82811115620002af57825182559160200191906001019062000292565b50620002bd929150620002c1565b5090565b5b80821115620002bd5760008155600101620002c2565b600060208284031215620002eb57600080fd5b81516001600160a01b03811681146200030357600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff8416808210156200033d576200033d6200030a565b90039392505050565b600181815b80851115620003875781600019048211156200036b576200036b6200030a565b808516156200037957918102915b93841c93908002906200034b565b509250929050565b600082620003a0575060016200043f565b81620003af575060006200043f565b8160018114620003c85760028114620003d357620003f3565b60019150506200043f565b60ff841115620003e757620003e76200030a565b50506001821b6200043f565b5060208310610133831016604e8410600b841016171562000418575081810a6200043f565b62000424838362000346565b80600019048211156200043b576200043b6200030a565b0290505b92915050565b60006200030360ff8416836200038f565b600181811c908216806200046b57607f821691505b602082108114156200048d57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c051614f6e620005106000396000818161306d015281816131c0015261398501526000610876015260008181610a9e01528181610dbd015281816110d5015281816111760152818161144601528181611cb601528181612312015281816129bc01528181612de4015261335d0152614f6e6000f3fe6080604052600436106103f95760003560e01c80638cfd8f5c11610213578063c83330ce11610123578063eab45d9c116100ab578063ed629c5c1161007a578063ed629c5c14610d2d578063f2fde38b14610d47578063f5ecbdbc14610d67578063fc0c546a14610d87578063fcd5508114610d9a57600080fd5b8063eab45d9c14610cad578063eaffd49a14610ccd578063eb8d72b714610ced578063ecd8f21214610d0d57600080fd5b8063d5c6c6d6116100f2578063d5c6c6d614610bbc578063d888296814610c2a578063dd62ed3e14610c58578063df2a5b3b14610c78578063e6a20ae614610c9857600080fd5b8063c83330ce14610b06578063ca39387c14610b5c578063cbed8b9c14610b89578063d1deba1f14610ba957600080fd5b8063a40e27cb116101a6578063a9059cbb11610175578063a9059cbb14610a56578063abe685cd14610a76578063b353aaa714610a8c578063b9818be114610ac0578063baf3292d14610ae657600080fd5b8063a40e27cb146109c9578063a457c2d7146109f6578063a4c51df514610a16578063a6c3d16514610a3657600080fd5b806395d89b41116101e257806395d89b41146109375780639b19251a1461094c5780639b65e6531461097c5780639f38369a146109a957600080fd5b80638cfd8f5c146108985780638da5cb5b146108d05780639358928b14610902578063950c8a741461091757600080fd5b8063447705151161030e5780635c975abb116102a15780637533d788116102705780637533d788146107e257806379c0ad4b146108025780637bc03b8e146108225780638456cb591461084f578063857749b01461086457600080fd5b80635c975abb1461075f57806366ad5c8a1461077757806370a0823114610797578063715018a6146107cd57600080fd5b806351a2c389116102dd57806351a2c389146106a357806353d6fd59146106d05780635a359dc5146106f05780635b8c41e61461071057600080fd5b80634477051514610646578063455ba27d1461065b5780634b104eff1461066e5780634c42899a1461068e57600080fd5b806323b872dd11610391578063365260b411610360578063365260b41461059c57806339509351146105d15780633d8b38f6146105f15780633f4ba83a1461061157806342d65a8d1461062657600080fd5b806323b872dd146105275780632cdf0b9514610547578063313ce5671461055a57806335dff2bc1461057c57600080fd5b8063095ea7b3116103cd578063095ea7b3146104975780630bc66fbf146104b757806310ddb137146104f257806318160ddd1461051257600080fd5b80621d3567146103fe57806301ffc9a71461042057806306fdde031461045557806307e0db1714610477575b600080fd5b34801561040a57600080fd5b5061041e6104193660046140b3565b610dba565b005b34801561042c57600080fd5b5061044061043b366004614146565b610feb565b60405190151581526020015b60405180910390f35b34801561046157600080fd5b5061046a611022565b60405161044c91906141c8565b34801561048357600080fd5b5061041e6104923660046141db565b6110b4565b3480156104a357600080fd5b506104406104b236600461420b565b61113d565b3480156104c357600080fd5b506104e46104d23660046141db565b60146020526000908152604090205481565b60405190815260200161044c565b3480156104fe57600080fd5b5061041e61050d3660046141db565b611155565b34801561051e57600080fd5b50600b546104e4565b34801561053357600080fd5b50610440610542366004614237565b6111ad565b61041e610555366004614290565b6111d3565b34801561056657600080fd5b5060125b60405160ff909116815260200161044c565b34801561058857600080fd5b5061041e61059736600461430b565b611276565b3480156105a857600080fd5b506105bc6105b7366004614337565b6112d2565b6040805192835260208301919091520161044c565b3480156105dd57600080fd5b506104406105ec36600461420b565b611327565b3480156105fd57600080fd5b5061044061060c36600461439c565b611349565b34801561061d57600080fd5b5061041e611415565b34801561063257600080fd5b5061041e61064136600461439c565b611427565b34801561065257600080fd5b506104e4600081565b61041e6106693660046143ee565b6114ad565b34801561067a57600080fd5b5061041e6106893660046144aa565b61158e565b34801561069a57600080fd5b5061056a600081565b3480156106af57600080fd5b506104e46106be3660046141db565b60116020526000908152604090205481565b3480156106dc57600080fd5b5061041e6106eb3660046144c7565b61164b565b3480156106fc57600080fd5b5061041e61070b3660046141db565b6116ab565b34801561071c57600080fd5b506104e461072b366004614569565b6004602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561076b57600080fd5b50600e5460ff16610440565b34801561078357600080fd5b5061041e6107923660046140b3565b61171d565b3480156107a357600080fd5b506104e46107b23660046144aa565b6001600160a01b031660009081526009602052604090205490565b3480156107d957600080fd5b5061041e6117f1565b3480156107ee57600080fd5b5061046a6107fd3660046141db565b611803565b34801561080e57600080fd5b5061041e61081d366004614609565b61189d565b34801561082e57600080fd5b506104e461083d3660046141db565b600f6020526000908152604090205481565b34801561085b57600080fd5b5061041e611959565b34801561087057600080fd5b5061056a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156108a457600080fd5b506104e46108b3366004614643565b600260209081526000928352604080842090915290825290205481565b3480156108dc57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161044c565b34801561090e57600080fd5b506104e4611969565b34801561092357600080fd5b506003546108ea906001600160a01b031681565b34801561094357600080fd5b5061046a611979565b34801561095857600080fd5b506104406109673660046144aa565b60156020526000908152604090205460ff1681565b34801561098857600080fd5b506104e46109973660046141db565b60126020526000908152604090205481565b3480156109b557600080fd5b5061046a6109c43660046141db565b611988565b3480156109d557600080fd5b506104e46109e43660046141db565b60106020526000908152604090205481565b348015610a0257600080fd5b50610440610a1136600461420b565b611a98565b348015610a2257600080fd5b506105bc610a3136600461466d565b611b1e565b348015610a4257600080fd5b5061041e610a5136600461439c565b611bad565b348015610a6257600080fd5b50610440610a7136600461420b565b611c33565b348015610a8257600080fd5b506104e461271081565b348015610a9857600080fd5b506108ea7f000000000000000000000000000000000000000000000000000000000000000081565b348015610acc57600080fd5b506008546108ea906201000090046001600160a01b031681565b348015610af257600080fd5b5061041e610b013660046144aa565b611c41565b348015610b1257600080fd5b50610b42610b213660046141db565b60076020526000908152604090205461ffff81169062010000900460ff1682565b6040805161ffff909316835290151560208301520161044c565b348015610b6857600080fd5b506104e4610b773660046141db565b60136020526000908152604090205481565b348015610b9557600080fd5b5061041e610ba4366004614726565b611c97565b61041e610bb73660046140b3565b611d21565b348015610bc857600080fd5b50610c15610bd7366004614569565b600660209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015460ff1682565b6040805192835290151560208301520161044c565b348015610c3657600080fd5b50600854610c459061ffff1681565b60405161ffff909116815260200161044c565b348015610c6457600080fd5b506104e4610c73366004614794565b611f37565b348015610c8457600080fd5b5061041e610c933660046147cd565b611f62565b348015610ca457600080fd5b5061056a600181565b348015610cb957600080fd5b5061041e610cc8366004614809565b612014565b348015610cd957600080fd5b5061041e610ce8366004614824565b61205d565b348015610cf957600080fd5b5061041e610d0836600461439c565b61217c565b348015610d1957600080fd5b506104e4610d2836600461430b565b6121d6565b348015610d3957600080fd5b506005546104409060ff1681565b348015610d5357600080fd5b5061041e610d623660046144aa565b612268565b348015610d7357600080fd5b5061046a610d823660046148ec565b6122e1565b348015610d9357600080fd5b50306108ea565b348015610da657600080fd5b5061041e610db536600461430b565b612394565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e375760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff861660009081526001602052604081208054610e5590614939565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8190614939565b8015610ece5780601f10610ea357610100808354040283529160200191610ece565b820191906000526020600020905b815481529060010190602001808311610eb157829003601f168201915b50505050509050805186869050148015610ee9575060008151115b8015610f11575080516020820120604051610f07908890889061496e565b6040518091039020145b610f6c5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610e2e565b610fe28787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506123e492505050565b50505050505050565b60006001600160e01b03198216630d30953d60e31b148061101c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600c805461103190614939565b80601f016020809104026020016040519081016040528092919081815260200182805461105d90614939565b80156110aa5780601f1061107f576101008083540402835291602001916110aa565b820191906000526020600020905b81548152906001019060200180831161108d57829003601f168201915b5050505050905090565b6110bc61245d565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b15801561112257600080fd5b505af1158015611136573d6000803e3d6000fd5b5050505050565b60003361114b8185856124b7565b5060019392505050565b61115d61245d565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401611108565b6000336111bb8582856125db565b6111c6858585612655565b60019150505b9392505050565b6111de868685612823565b50925061124c868686866111f560208701876144aa565b61120560408801602089016144aa565b611212604089018961497e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061286c92505050565b92508183101561126e5760405162461bcd60e51b8152600401610e2e906149c4565b505050505050565b61127e61245d565b61ffff82166000818152600f602052604090819020839055517f33d0fe6530e808b43711a6333a7509ab4601707b639f23fcb8aef05bb6602ae6906112c69084815260200190565b60405180910390a25050565b6000806113188888888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061299092505050565b91509150965096945050505050565b60003361114b81858561133a8383611f37565b6113449190614a27565b6124b7565b61ffff83166000908152600160205260408120805482919061136a90614939565b80601f016020809104026020016040519081016040528092919081815260200182805461139690614939565b80156113e35780601f106113b8576101008083540402835291602001916113e3565b820191906000526020600020905b8154815290600101906020018083116113c657829003601f168201915b5050505050905083836040516113fa92919061496e565b60405180910390208180519060200120149150509392505050565b61141d61245d565b611425612a48565b565b61142f61245d565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d9061147f90869086908690600401614a68565b600060405180830381600087803b15801561149957600080fd5b505af1158015610fe2573d6000803e3d6000fd5b6114b8898988612823565b50809650506115618989898988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a925061150a91505060208901896144aa565b61151a60408a0160208b016144aa565b61152760408b018b61497e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a9a92505050565b9550848610156115835760405162461bcd60e51b8152600401610e2e906149c4565b505050505050505050565b61159661245d565b6001600160a01b0381166115ec5760405162461bcd60e51b815260206004820152601a60248201527f4665653a206665654f776e65722063616e6e6f742062652030780000000000006044820152606401610e2e565b6008805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040519081527f047912631afa564eebd3db2efe191a0dec62da1fede6bbbc1ffc89d87845b1b5906020015b60405180910390a150565b61165361245d565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527ff6019ec0a78d156d249a1ec7579e2321f6ac7521d6e1d2eacf90ba4a184dcceb91016112c6565b6116b361245d565b6127108161ffff1611156116d95760405162461bcd60e51b8152600401610e2e90614a86565b6008805461ffff191661ffff83169081179091556040519081527fd26030ef4a8c225ee12b646eb4466acb41fb96b6cd4660b22d0ba0124e7bdc7490602001611640565b33301461177b5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610e2e565b61126e8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250612b9692505050565b6117f961245d565b6114256000612c1d565b6001602052600090815260409020805461181c90614939565b80601f016020809104026020016040519081016040528092919081815260200182805461184890614939565b80156118955780601f1061186a57610100808354040283529160200191611895565b820191906000526020600020905b81548152906001019060200180831161187857829003601f168201915b505050505081565b6118a561245d565b6127108161ffff1611156118cb5760405162461bcd60e51b8152600401610e2e90614a86565b60408051808201825261ffff83811680835285151560208085018281528985166000818152600784528890209651875492511515620100000262ffffff1990931696169590951717909455845192835292820192909252918201527fdd9c9685af3e6dcb56d8f4b88d2595d4add6837a150034e7781c46b6dcf8aaab906060015b60405180910390a1505050565b61196161245d565b611425612c6d565b6000611974600b5490565b905090565b6060600d805461103190614939565b61ffff81166000908152600160205260408120805460609291906119ab90614939565b80601f01602080910402602001604051908101604052809291908181526020018280546119d790614939565b8015611a245780601f106119f957610100808354040283529160200191611a24565b820191906000526020600020905b815481529060010190602001808311611a0757829003601f168201915b50505050509050805160001415611a7d5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610e2e565b6111cc600060148351611a909190614acb565b839190612caa565b60003381611aa68286611f37565b905083811015611b065760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e2e565b611b1382868684036124b7565b506001949350505050565b600080611b9b8b8b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c9081908401838280828437600092019190915250612db792505050565b91509150995099975050505050505050565b611bb561245d565b818130604051602001611bca93929190614ae2565b60408051601f1981840301815291815261ffff85166000908152600160209081529190208251611bff93919290910190613f30565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161194c93929190614a68565b60003361114b818585612655565b611c4961245d565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b90602001611640565b611c9f61245d565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c90611cf39088908890889088908890600401614b08565b600060405180830381600087803b158015611d0d57600080fd5b505af1158015611583573d6000803e3d6000fd5b61ffff86166000908152600460205260408082209051611d44908890889061496e565b90815260408051602092819003830190206001600160401b03871660009081529252902054905080611dc45760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610e2e565b808383604051611dd592919061496e565b604051809103902014611e345760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610e2e565b61ffff87166000908152600460205260408082209051611e57908990899061496e565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f88018290048202830182019052868252611eef918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250612b9692505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611f26959493929190614b41565b60405180910390a150505050505050565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b611f6a61245d565b60008111611fb25760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610e2e565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac09060600161194c565b61201c61245d565b6005805460ff19168215159081179091556040519081527f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a490602001611640565b3330146120ac5760405162461bcd60e51b815260206004820152601f60248201527f4f4654436f72653a2063616c6c6572206d757374206265204f4654436f7265006044820152606401610e2e565b6120b7308686612e72565b9350846001600160a01b03168a61ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf866040516120f991815260200190565b60405180910390a3604051633fe79aed60e11b81526001600160a01b03861690637fcf35da90839061213d908e908e908e908e908e908d908d908d90600401614b7c565b600060405180830381600088803b15801561215757600080fd5b5087f115801561216b573d6000803e3d6000fd5b505050505050505050505050505050565b61218461245d565b61ffff831660009081526001602052604090206121a2908383613fb4565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161194c93929190614a68565b61ffff828116600090815260076020908152604080832081518083019092525493841681526201000090930460ff161580159184019190915290919061223b5780516127109061222a9061ffff1685614bd7565b6122349190614c0c565b9150612261565b60085461ffff161561225c576008546127109061222a9061ffff1685614bd7565b600091505b5092915050565b61227061245d565b6001600160a01b0381166122d55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e2e565b6122de81612c1d565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015612361573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123899190810190614c20565b90505b949350505050565b61239c61245d565b61ffff821660008181526012602052604090819020839055517f13aaa8bcd182e10a0da2842b57f639fd4182fa41a6c702fb2b8570da7b2911a5906112c69084815260200190565b6000806124475a60966366ad5c8a60e01b8989898960405160240161240c9493929190614c96565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190612ec4565b915091508161126e5761126e8686868685612f4e565b6000546001600160a01b031633146114255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e2e565b6001600160a01b0383166125195760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e2e565b6001600160a01b03821661257a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e2e565b6001600160a01b038381166000818152600a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006125e78484611f37565b9050600019811461264f57818110156126425760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e2e565b61264f84848484036124b7565b50505050565b6001600160a01b0383166126b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e2e565b6001600160a01b03821661271b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e2e565b6001600160a01b038316600090815260096020526040902054818110156127935760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e2e565b6001600160a01b038085166000908152600960205260408082208585039055918516815290812080548492906127ca908490614a27565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161281691815260200190565b60405180910390a361264f565b60008061283084846121d6565b905061283c8184614acb565b91508015612864576008546128629086906201000090046001600160a01b031683612e72565b505b935093915050565b600061287a87828481612feb565b61288385613065565b509050612892888888846130a5565b9050600081116128e05760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610e2e565b600061292b876128ef846131b8565b6040805160006020820152602181019390935260c09190911b6001600160c01b0319166041830152805160298184030181526049909201905290565b905061293b88828787873461323e565b86896001600160a01b03168961ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a8560405161297c91815260200190565b60405180910390a450979650505050505050565b60008060006129a2876128ef886131b8565b60405163040a7bb160e41b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb10906129f9908b90309086908b908b90600401614cd4565b6040805180830381865afa158015612a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a399190614d28565b92509250509550959350505050565b612a506133d9565b600e805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000612ab2896001846001600160401b038916612feb565b612abb87613065565b509050612aca8a8a8a846130a5565b905060008111612b185760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610e2e565b6000612b2f338a612b28856131b8565b8a8a613422565b9050612b3f8a828787873461323e565b888b6001600160a01b03168b61ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a85604051612b8091815260200190565b60405180910390a4509998505050505050505050565b6000612ba28282613463565b905060ff8116612bbd57612bb8858585856134bf565b611136565b60ff811660011415612bd557612bb88585858561354f565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b65742074797065000000006044820152606401610e2e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612c756137a2565b600e805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a7d3390565b606081612cb881601f614a27565b1015612cf75760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610e2e565b612d018284614a27565b84511015612d455760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610e2e565b606082158015612d645760405191506000825260208201604052612dae565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612d9d578051835260209283019201612d85565b5050858452601f01601f1916604052505b50949350505050565b6000806000612dca338a612b288b6131b8565b60405163040a7bb160e41b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090612e21908d90309086908b908b90600401614cd4565b6040805180830381865afa158015612e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e619190614d28565b925092505097509795505050505050565b600033306001600160a01b03861614801590612ea05750806001600160a01b0316856001600160a01b031614155b15612eb057612eb08582856125db565b612ebb858585612655565b50909392505050565b6000606060008060008661ffff166001600160401b03811115612ee957612ee96144fc565b6040519080825280601f01601f191660200182016040528015612f13576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115612f35578692505b828152826000602083013e909890975095505050505050565b8180519060200120600460008761ffff1661ffff16815260200190815260200160002085604051612f7f9190614d4c565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90612fdc9087908790879087908790614d68565b60405180910390a15050505050565b60055460ff161561300757613002848484846137e8565b61264f565b81511561264f5760405162461bcd60e51b815260206004820152602660248201527f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060448201526532b6b83a3c9760d11b6064820152608401610e2e565b6000806130927f000000000000000000000000000000000000000000000000000000000000000084614dba565b905061309e8184614acb565b9150915091565b60006130af6137a2565b60006130bd868686866138c7565b6001600160a01b03871660009081526015602052604090205490915060ff16156130e857905061238c565b61ffff85166000908152601160205260408120544261310a6201518083614c0c565b6131176201518083614c0c565b111561312557839250613147565b61ffff8816600090815260106020526040902054613144908590614a27565b92505b61ffff88166000908152600f60205260409020548084111561318657604051635986919560e01b81526004810182905260248101859052604401610e2e565b5061ffff8816600090815260106020908152604080832095909555601190529290922091909155509050949350505050565b6000806131e57f000000000000000000000000000000000000000000000000000000000000000084614c0c565b90506001600160401b0381111561101c5760405162461bcd60e51b815260206004820152601a60248201527f4f4654436f72653a20616d6f756e745344206f766572666c6f770000000000006044820152606401610e2e565b61ffff86166000908152600160205260408120805461325c90614939565b80601f016020809104026020016040519081016040528092919081815260200182805461328890614939565b80156132d55780601f106132aa576101008083540402835291602001916132d5565b820191906000526020600020905b8154815290600101906020018083116132b857829003601f168201915b505050505090508051600014156133475760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610e2e565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c580310090849061339e908b9086908c908c908c908c90600401614dce565b6000604051808303818588803b1580156133b757600080fd5b505af11580156133cb573d6000803e3d6000fd5b505050505050505050505050565b600e5460ff166114255760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610e2e565b6060600185856001600160a01b038916858760405160200161344996959493929190614e35565b604051602081830303815290604052905095945050505050565b6000613470826001614a27565b835110156134b65760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b6044820152606401610e2e565b50016001015190565b6000806134cb836138f9565b90925090506001600160a01b0382166134e45761dead91505b60006134ef8261397e565b90506134fc8784836139b3565b9050826001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf8360405161353e91815260200190565b60405180910390a350505050505050565b600080600080600061356086613ac4565b945094509450945094506000600660008b61ffff1661ffff168152602001908152602001600020896040516135959190614d4c565b90815260408051602092819003830181206001600160401b038c166000908152908452829020818301909252815480825260019092015460ff16151592810183905292509061366e576135e78561397e565b90506135f48b30836139b3565b604080518082018252828152600160208083019190915261ffff8f166000908152600690915282902091519293509161362e908d90614d4c565b90815260408051602092819003830190206001600160401b038d16600090815290835220825181559101516001909101805460ff19169115159190911790555b6001600160a01b0386163b6136c5576040516001600160a01b03871681527f9aedf5fdba8716db3b6705ca00150643309995d4f818a249ed6dde6677e7792d9060200160405180910390a15050505050505061264f565b60208201518b908b908b908b908b908b9087908b906000906136f0578b6001600160401b03166136f2565b5a5b90506000806137245a609663eaffd49a60e01b8e8e8e8d8d8d8d8d60405160240161240c989796959493929190614e96565b91509150811561377d578751602089012060405161ffff8d16907fb8890edbfc1c74692f527444645f95489c3703cc2df42e4a366f5d06fa6cd8849061376f908e908e908690614f0a565b60405180910390a25061378a565b61378a8b8b8b8b85612f4e565b50505050505050505050505050505050505050505050565b600e5460ff16156114255760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610e2e565b60006137f383613b7b565b61ffff808716600090815260026020908152604080832093891683529290529081205491925090613825908490614a27565b9050600081116138775760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610e2e565b8082101561126e5760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610e2e565b6000336001600160a01b03861681146138e5576138e58682856125db565b6138ef8684613bd7565b5090949350505050565b600080806139078482613463565b60ff16148015613918575082516029145b61395f5760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610e2e565b61396a83600d613d25565b9150613977836021613d8a565b9050915091565b600061101c7f00000000000000000000000000000000000000000000000000000000000000006001600160401b038416614bd7565b60006139bd6137a2565b60006139ca858585613de7565b6001600160a01b03851660009081526015602052604090205490915060ff16156139f55790506111cc565b61ffff851660009081526014602052604081205442613a176201518083614c0c565b613a246201518083614c0c565b1115613a3257839250613a54565b61ffff8816600090815260136020526040902054613a51908590614a27565b92505b61ffff881660009081526012602052604090205480841115613a9357604051636cc1d80760e01b81526004810182905260248101859052604401610e2e565b5061ffff88166000908152601360209081526040808320959095556014905292909220919091555090509392505050565b600080806060816001613ad78783613463565b60ff1614613b225760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610e2e565b613b2d86600d613d25565b9350613b3a866021613d8a565b9250613b47866029613df3565b9450613b54866049613d8a565b9050613b706051808851613b689190614acb565b889190612caa565b915091939590929450565b6000602282511015613bcf5760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d73000000006044820152606401610e2e565b506022015190565b6001600160a01b038216613c375760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610e2e565b6001600160a01b03821660009081526009602052604090205481811015613cab5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610e2e565b6001600160a01b03831660009081526009602052604081208383039055600b8054849290613cda908490614acb565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000613d32826014614a27565b83511015613d7a5760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610e2e565b500160200151600160601b900490565b6000613d97826008614a27565b83511015613dde5760405162461bcd60e51b8152602060048201526014602482015273746f55696e7436345f6f75744f66426f756e647360601b6044820152606401610e2e565b50016008015190565b60006122618383613e51565b6000613e00826020614a27565b83511015613e485760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b6044820152606401610e2e565b50016020015190565b6001600160a01b038216613ea75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610e2e565b80600b6000828254613eb99190614a27565b90915550506001600160a01b03821660009081526009602052604081208054839290613ee6908490614a27565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054613f3c90614939565b90600052602060002090601f016020900481019282613f5e5760008555613fa4565b82601f10613f7757805160ff1916838001178555613fa4565b82800160010185558215613fa4579182015b82811115613fa4578251825591602001919060010190613f89565b50613fb0929150614028565b5090565b828054613fc090614939565b90600052602060002090601f016020900481019282613fe25760008555613fa4565b82601f10613ffb5782800160ff19823516178555613fa4565b82800160010185558215613fa4579182015b82811115613fa457823582559160200191906001019061400d565b5b80821115613fb05760008155600101614029565b803561ffff8116811461404f57600080fd5b919050565b60008083601f84011261406657600080fd5b5081356001600160401b0381111561407d57600080fd5b60208301915083602082850101111561409557600080fd5b9250929050565b80356001600160401b038116811461404f57600080fd5b600080600080600080608087890312156140cc57600080fd5b6140d58761403d565b955060208701356001600160401b03808211156140f157600080fd5b6140fd8a838b01614054565b909750955085915061411160408a0161409c565b9450606089013591508082111561412757600080fd5b5061413489828a01614054565b979a9699509497509295939492505050565b60006020828403121561415857600080fd5b81356001600160e01b0319811681146111cc57600080fd5b60005b8381101561418b578181015183820152602001614173565b8381111561264f5750506000910152565b600081518084526141b4816020860160208601614170565b601f01601f19169290920160200192915050565b6020815260006111cc602083018461419c565b6000602082840312156141ed57600080fd5b6111cc8261403d565b6001600160a01b03811681146122de57600080fd5b6000806040838503121561421e57600080fd5b8235614229816141f6565b946020939093013593505050565b60008060006060848603121561424c57600080fd5b8335614257816141f6565b92506020840135614267816141f6565b929592945050506040919091013590565b60006060828403121561428a57600080fd5b50919050565b60008060008060008060c087890312156142a957600080fd5b86356142b4816141f6565b95506142c26020880161403d565b945060408701359350606087013592506080870135915060a08701356001600160401b038111156142f257600080fd5b6142fe89828a01614278565b9150509295509295509295565b6000806040838503121561431e57600080fd5b6142298361403d565b8035801515811461404f57600080fd5b60008060008060008060a0878903121561435057600080fd5b6143598761403d565b9550602087013594506040870135935061437560608801614327565b925060808701356001600160401b0381111561439057600080fd5b61413489828a01614054565b6000806000604084860312156143b157600080fd5b6143ba8461403d565b925060208401356001600160401b038111156143d557600080fd5b6143e186828701614054565b9497909650939450505050565b60008060008060008060008060006101008a8c03121561440d57600080fd5b8935614418816141f6565b985061442660208b0161403d565b975060408a0135965060608a0135955060808a0135945060a08a01356001600160401b038082111561445757600080fd5b6144638d838e01614054565b909650945084915061447760c08d0161409c565b935060e08c013591508082111561448d57600080fd5b5061449a8c828d01614278565b9150509295985092959850929598565b6000602082840312156144bc57600080fd5b81356111cc816141f6565b600080604083850312156144da57600080fd5b82356144e5816141f6565b91506144f360208401614327565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561453a5761453a6144fc565b604052919050565b60006001600160401b0382111561455b5761455b6144fc565b50601f01601f191660200190565b60008060006060848603121561457e57600080fd5b6145878461403d565b925060208401356001600160401b038111156145a257600080fd5b8401601f810186136145b357600080fd5b80356145c66145c182614542565b614512565b8181528760208385010111156145db57600080fd5b816020840160208301376000602083830101528094505050506146006040850161409c565b90509250925092565b60008060006060848603121561461e57600080fd5b6146278461403d565b925061463560208501614327565b91506146006040850161403d565b6000806040838503121561465657600080fd5b61465f8361403d565b91506144f36020840161403d565b600080600080600080600080600060e08a8c03121561468b57600080fd5b6146948a61403d565b985060208a0135975060408a0135965060608a01356001600160401b03808211156146be57600080fd5b6146ca8d838e01614054565b90985096508691506146de60808d0161409c565b95506146ec60a08d01614327565b945060c08c013591508082111561470257600080fd5b5061470f8c828d01614054565b915080935050809150509295985092959850929598565b60008060008060006080868803121561473e57600080fd5b6147478661403d565b94506147556020870161403d565b93506040860135925060608601356001600160401b0381111561477757600080fd5b61478388828901614054565b969995985093965092949392505050565b600080604083850312156147a757600080fd5b82356147b2816141f6565b915060208301356147c2816141f6565b809150509250929050565b6000806000606084860312156147e257600080fd5b6147eb8461403d565b92506147f96020850161403d565b9150604084013590509250925092565b60006020828403121561481b57600080fd5b6111cc82614327565b6000806000806000806000806000806101008b8d03121561484457600080fd5b61484d8b61403d565b995060208b01356001600160401b038082111561486957600080fd5b6148758e838f01614054565b909b50995089915061488960408e0161409c565b985060608d0135975060808d013591506148a2826141f6565b90955060a08c0135945060c08c013590808211156148bf57600080fd5b506148cc8d828e01614054565b9150809450508092505060e08b013590509295989b9194979a5092959850565b6000806000806080858703121561490257600080fd5b61490b8561403d565b93506149196020860161403d565b92506040850135614929816141f6565b9396929550929360600135925050565b600181811c9082168061494d57607f821691505b6020821081141561428a57634e487b7160e01b600052602260045260246000fd5b8183823760009101908152919050565b6000808335601e1984360301811261499557600080fd5b8301803591506001600160401b038211156149af57600080fd5b60200191503681900382131561409557600080fd5b6020808252602d908201527f426173654f4654576974684665653a20616d6f756e74206973206c657373207460408201526c1a185b881b5a5b905b5bdd5b9d609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115614a3a57614a3a614a11565b500190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000612389604083018486614a3f565b60208082526025908201527f4665653a20666565206270206d757374206265203c3d2042505f44454e4f4d496040820152642720aa27a960d91b606082015260800190565b600082821015614add57614add614a11565b500390565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b600061ffff808816835280871660208401525084604083015260806060830152614b36608083018486614a3f565b979650505050505050565b61ffff86168152608060208201526000614b5f608083018688614a3f565b6001600160401b0394909416604083015250606001529392505050565b61ffff8916815260c060208201526000614b9a60c08301898b614a3f565b6001600160401b038816604084015286606084015285608084015282810360a0840152614bc8818587614a3f565b9b9a5050505050505050505050565b6000816000190483118215151615614bf157614bf1614a11565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614c1b57614c1b614bf6565b500490565b600060208284031215614c3257600080fd5b81516001600160401b03811115614c4857600080fd5b8201601f81018413614c5957600080fd5b8051614c676145c182614542565b818152856020838501011115614c7c57600080fd5b614c8d826020830160208601614170565b95945050505050565b61ffff85168152608060208201526000614cb3608083018661419c565b6001600160401b03851660408401528281036060840152614b36818561419c565b61ffff861681526001600160a01b038516602082015260a060408201819052600090614d029083018661419c565b84151560608401528281036080840152614d1c818561419c565b98975050505050505050565b60008060408385031215614d3b57600080fd5b505080516020909101519092909150565b60008251614d5e818460208701614170565b9190910192915050565b61ffff8616815260a060208201526000614d8560a083018761419c565b6001600160401b03861660408401528281036060840152614da6818661419c565b90508281036080840152614d1c818561419c565b600082614dc957614dc9614bf6565b500690565b61ffff8716815260c060208201526000614deb60c083018861419c565b8281036040840152614dfd818861419c565b6001600160a01b0387811660608601528616608085015283810360a08501529050614e28818561419c565b9998505050505050505050565b60ff60f81b8760f81b16815285600182015260006001600160401b0360c01b808760c01b166021840152856029840152808560c01b166049840152508251614e84816051850160208701614170565b91909101605101979650505050505050565b600061010061ffff8b168352806020840152614eb48184018b61419c565b6001600160401b038a166040850152606084018990526001600160a01b038816608085015260a0840187905283810360c08501529050614ef4818661419c565b9150508260e08301529998505050505050505050565b606081526000614f1d606083018661419c565b6001600160401b03949094166020830152506040015291905056fea26469706673582212208d01f6c8ab82d843943fb212fc4ae7e672093db816a7cedc5feb9359d61779b364736f6c634300080c00330000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e4
Deployed Bytecode
0x6080604052600436106103f95760003560e01c80638cfd8f5c11610213578063c83330ce11610123578063eab45d9c116100ab578063ed629c5c1161007a578063ed629c5c14610d2d578063f2fde38b14610d47578063f5ecbdbc14610d67578063fc0c546a14610d87578063fcd5508114610d9a57600080fd5b8063eab45d9c14610cad578063eaffd49a14610ccd578063eb8d72b714610ced578063ecd8f21214610d0d57600080fd5b8063d5c6c6d6116100f2578063d5c6c6d614610bbc578063d888296814610c2a578063dd62ed3e14610c58578063df2a5b3b14610c78578063e6a20ae614610c9857600080fd5b8063c83330ce14610b06578063ca39387c14610b5c578063cbed8b9c14610b89578063d1deba1f14610ba957600080fd5b8063a40e27cb116101a6578063a9059cbb11610175578063a9059cbb14610a56578063abe685cd14610a76578063b353aaa714610a8c578063b9818be114610ac0578063baf3292d14610ae657600080fd5b8063a40e27cb146109c9578063a457c2d7146109f6578063a4c51df514610a16578063a6c3d16514610a3657600080fd5b806395d89b41116101e257806395d89b41146109375780639b19251a1461094c5780639b65e6531461097c5780639f38369a146109a957600080fd5b80638cfd8f5c146108985780638da5cb5b146108d05780639358928b14610902578063950c8a741461091757600080fd5b8063447705151161030e5780635c975abb116102a15780637533d788116102705780637533d788146107e257806379c0ad4b146108025780637bc03b8e146108225780638456cb591461084f578063857749b01461086457600080fd5b80635c975abb1461075f57806366ad5c8a1461077757806370a0823114610797578063715018a6146107cd57600080fd5b806351a2c389116102dd57806351a2c389146106a357806353d6fd59146106d05780635a359dc5146106f05780635b8c41e61461071057600080fd5b80634477051514610646578063455ba27d1461065b5780634b104eff1461066e5780634c42899a1461068e57600080fd5b806323b872dd11610391578063365260b411610360578063365260b41461059c57806339509351146105d15780633d8b38f6146105f15780633f4ba83a1461061157806342d65a8d1461062657600080fd5b806323b872dd146105275780632cdf0b9514610547578063313ce5671461055a57806335dff2bc1461057c57600080fd5b8063095ea7b3116103cd578063095ea7b3146104975780630bc66fbf146104b757806310ddb137146104f257806318160ddd1461051257600080fd5b80621d3567146103fe57806301ffc9a71461042057806306fdde031461045557806307e0db1714610477575b600080fd5b34801561040a57600080fd5b5061041e6104193660046140b3565b610dba565b005b34801561042c57600080fd5b5061044061043b366004614146565b610feb565b60405190151581526020015b60405180910390f35b34801561046157600080fd5b5061046a611022565b60405161044c91906141c8565b34801561048357600080fd5b5061041e6104923660046141db565b6110b4565b3480156104a357600080fd5b506104406104b236600461420b565b61113d565b3480156104c357600080fd5b506104e46104d23660046141db565b60146020526000908152604090205481565b60405190815260200161044c565b3480156104fe57600080fd5b5061041e61050d3660046141db565b611155565b34801561051e57600080fd5b50600b546104e4565b34801561053357600080fd5b50610440610542366004614237565b6111ad565b61041e610555366004614290565b6111d3565b34801561056657600080fd5b5060125b60405160ff909116815260200161044c565b34801561058857600080fd5b5061041e61059736600461430b565b611276565b3480156105a857600080fd5b506105bc6105b7366004614337565b6112d2565b6040805192835260208301919091520161044c565b3480156105dd57600080fd5b506104406105ec36600461420b565b611327565b3480156105fd57600080fd5b5061044061060c36600461439c565b611349565b34801561061d57600080fd5b5061041e611415565b34801561063257600080fd5b5061041e61064136600461439c565b611427565b34801561065257600080fd5b506104e4600081565b61041e6106693660046143ee565b6114ad565b34801561067a57600080fd5b5061041e6106893660046144aa565b61158e565b34801561069a57600080fd5b5061056a600081565b3480156106af57600080fd5b506104e46106be3660046141db565b60116020526000908152604090205481565b3480156106dc57600080fd5b5061041e6106eb3660046144c7565b61164b565b3480156106fc57600080fd5b5061041e61070b3660046141db565b6116ab565b34801561071c57600080fd5b506104e461072b366004614569565b6004602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561076b57600080fd5b50600e5460ff16610440565b34801561078357600080fd5b5061041e6107923660046140b3565b61171d565b3480156107a357600080fd5b506104e46107b23660046144aa565b6001600160a01b031660009081526009602052604090205490565b3480156107d957600080fd5b5061041e6117f1565b3480156107ee57600080fd5b5061046a6107fd3660046141db565b611803565b34801561080e57600080fd5b5061041e61081d366004614609565b61189d565b34801561082e57600080fd5b506104e461083d3660046141db565b600f6020526000908152604090205481565b34801561085b57600080fd5b5061041e611959565b34801561087057600080fd5b5061056a7f000000000000000000000000000000000000000000000000000000000000000881565b3480156108a457600080fd5b506104e46108b3366004614643565b600260209081526000928352604080842090915290825290205481565b3480156108dc57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161044c565b34801561090e57600080fd5b506104e4611969565b34801561092357600080fd5b506003546108ea906001600160a01b031681565b34801561094357600080fd5b5061046a611979565b34801561095857600080fd5b506104406109673660046144aa565b60156020526000908152604090205460ff1681565b34801561098857600080fd5b506104e46109973660046141db565b60126020526000908152604090205481565b3480156109b557600080fd5b5061046a6109c43660046141db565b611988565b3480156109d557600080fd5b506104e46109e43660046141db565b60106020526000908152604090205481565b348015610a0257600080fd5b50610440610a1136600461420b565b611a98565b348015610a2257600080fd5b506105bc610a3136600461466d565b611b1e565b348015610a4257600080fd5b5061041e610a5136600461439c565b611bad565b348015610a6257600080fd5b50610440610a7136600461420b565b611c33565b348015610a8257600080fd5b506104e461271081565b348015610a9857600080fd5b506108ea7f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e481565b348015610acc57600080fd5b506008546108ea906201000090046001600160a01b031681565b348015610af257600080fd5b5061041e610b013660046144aa565b611c41565b348015610b1257600080fd5b50610b42610b213660046141db565b60076020526000908152604090205461ffff81169062010000900460ff1682565b6040805161ffff909316835290151560208301520161044c565b348015610b6857600080fd5b506104e4610b773660046141db565b60136020526000908152604090205481565b348015610b9557600080fd5b5061041e610ba4366004614726565b611c97565b61041e610bb73660046140b3565b611d21565b348015610bc857600080fd5b50610c15610bd7366004614569565b600660209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015460ff1682565b6040805192835290151560208301520161044c565b348015610c3657600080fd5b50600854610c459061ffff1681565b60405161ffff909116815260200161044c565b348015610c6457600080fd5b506104e4610c73366004614794565b611f37565b348015610c8457600080fd5b5061041e610c933660046147cd565b611f62565b348015610ca457600080fd5b5061056a600181565b348015610cb957600080fd5b5061041e610cc8366004614809565b612014565b348015610cd957600080fd5b5061041e610ce8366004614824565b61205d565b348015610cf957600080fd5b5061041e610d0836600461439c565b61217c565b348015610d1957600080fd5b506104e4610d2836600461430b565b6121d6565b348015610d3957600080fd5b506005546104409060ff1681565b348015610d5357600080fd5b5061041e610d623660046144aa565b612268565b348015610d7357600080fd5b5061046a610d823660046148ec565b6122e1565b348015610d9357600080fd5b50306108ea565b348015610da657600080fd5b5061041e610db536600461430b565b612394565b337f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e46001600160a01b031614610e375760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff861660009081526001602052604081208054610e5590614939565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8190614939565b8015610ece5780601f10610ea357610100808354040283529160200191610ece565b820191906000526020600020905b815481529060010190602001808311610eb157829003601f168201915b50505050509050805186869050148015610ee9575060008151115b8015610f11575080516020820120604051610f07908890889061496e565b6040518091039020145b610f6c5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610e2e565b610fe28787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506123e492505050565b50505050505050565b60006001600160e01b03198216630d30953d60e31b148061101c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600c805461103190614939565b80601f016020809104026020016040519081016040528092919081815260200182805461105d90614939565b80156110aa5780601f1061107f576101008083540402835291602001916110aa565b820191906000526020600020905b81548152906001019060200180831161108d57829003601f168201915b5050505050905090565b6110bc61245d565b6040516307e0db1760e01b815261ffff821660048201527f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e46001600160a01b0316906307e0db17906024015b600060405180830381600087803b15801561112257600080fd5b505af1158015611136573d6000803e3d6000fd5b5050505050565b60003361114b8185856124b7565b5060019392505050565b61115d61245d565b6040516310ddb13760e01b815261ffff821660048201527f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e46001600160a01b0316906310ddb13790602401611108565b6000336111bb8582856125db565b6111c6858585612655565b60019150505b9392505050565b6111de868685612823565b50925061124c868686866111f560208701876144aa565b61120560408801602089016144aa565b611212604089018961497e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061286c92505050565b92508183101561126e5760405162461bcd60e51b8152600401610e2e906149c4565b505050505050565b61127e61245d565b61ffff82166000818152600f602052604090819020839055517f33d0fe6530e808b43711a6333a7509ab4601707b639f23fcb8aef05bb6602ae6906112c69084815260200190565b60405180910390a25050565b6000806113188888888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061299092505050565b91509150965096945050505050565b60003361114b81858561133a8383611f37565b6113449190614a27565b6124b7565b61ffff83166000908152600160205260408120805482919061136a90614939565b80601f016020809104026020016040519081016040528092919081815260200182805461139690614939565b80156113e35780601f106113b8576101008083540402835291602001916113e3565b820191906000526020600020905b8154815290600101906020018083116113c657829003601f168201915b5050505050905083836040516113fa92919061496e565b60405180910390208180519060200120149150509392505050565b61141d61245d565b611425612a48565b565b61142f61245d565b6040516342d65a8d60e01b81526001600160a01b037f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e416906342d65a8d9061147f90869086908690600401614a68565b600060405180830381600087803b15801561149957600080fd5b505af1158015610fe2573d6000803e3d6000fd5b6114b8898988612823565b50809650506115618989898988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a925061150a91505060208901896144aa565b61151a60408a0160208b016144aa565b61152760408b018b61497e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a9a92505050565b9550848610156115835760405162461bcd60e51b8152600401610e2e906149c4565b505050505050505050565b61159661245d565b6001600160a01b0381166115ec5760405162461bcd60e51b815260206004820152601a60248201527f4665653a206665654f776e65722063616e6e6f742062652030780000000000006044820152606401610e2e565b6008805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040519081527f047912631afa564eebd3db2efe191a0dec62da1fede6bbbc1ffc89d87845b1b5906020015b60405180910390a150565b61165361245d565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527ff6019ec0a78d156d249a1ec7579e2321f6ac7521d6e1d2eacf90ba4a184dcceb91016112c6565b6116b361245d565b6127108161ffff1611156116d95760405162461bcd60e51b8152600401610e2e90614a86565b6008805461ffff191661ffff83169081179091556040519081527fd26030ef4a8c225ee12b646eb4466acb41fb96b6cd4660b22d0ba0124e7bdc7490602001611640565b33301461177b5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610e2e565b61126e8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250612b9692505050565b6117f961245d565b6114256000612c1d565b6001602052600090815260409020805461181c90614939565b80601f016020809104026020016040519081016040528092919081815260200182805461184890614939565b80156118955780601f1061186a57610100808354040283529160200191611895565b820191906000526020600020905b81548152906001019060200180831161187857829003601f168201915b505050505081565b6118a561245d565b6127108161ffff1611156118cb5760405162461bcd60e51b8152600401610e2e90614a86565b60408051808201825261ffff83811680835285151560208085018281528985166000818152600784528890209651875492511515620100000262ffffff1990931696169590951717909455845192835292820192909252918201527fdd9c9685af3e6dcb56d8f4b88d2595d4add6837a150034e7781c46b6dcf8aaab906060015b60405180910390a1505050565b61196161245d565b611425612c6d565b6000611974600b5490565b905090565b6060600d805461103190614939565b61ffff81166000908152600160205260408120805460609291906119ab90614939565b80601f01602080910402602001604051908101604052809291908181526020018280546119d790614939565b8015611a245780601f106119f957610100808354040283529160200191611a24565b820191906000526020600020905b815481529060010190602001808311611a0757829003601f168201915b50505050509050805160001415611a7d5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610e2e565b6111cc600060148351611a909190614acb565b839190612caa565b60003381611aa68286611f37565b905083811015611b065760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e2e565b611b1382868684036124b7565b506001949350505050565b600080611b9b8b8b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c9081908401838280828437600092019190915250612db792505050565b91509150995099975050505050505050565b611bb561245d565b818130604051602001611bca93929190614ae2565b60408051601f1981840301815291815261ffff85166000908152600160209081529190208251611bff93919290910190613f30565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161194c93929190614a68565b60003361114b818585612655565b611c4961245d565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b90602001611640565b611c9f61245d565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e4169063cbed8b9c90611cf39088908890889088908890600401614b08565b600060405180830381600087803b158015611d0d57600080fd5b505af1158015611583573d6000803e3d6000fd5b61ffff86166000908152600460205260408082209051611d44908890889061496e565b90815260408051602092819003830190206001600160401b03871660009081529252902054905080611dc45760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610e2e565b808383604051611dd592919061496e565b604051809103902014611e345760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610e2e565b61ffff87166000908152600460205260408082209051611e57908990899061496e565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f88018290048202830182019052868252611eef918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250612b9692505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611f26959493929190614b41565b60405180910390a150505050505050565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b611f6a61245d565b60008111611fb25760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610e2e565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac09060600161194c565b61201c61245d565b6005805460ff19168215159081179091556040519081527f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a490602001611640565b3330146120ac5760405162461bcd60e51b815260206004820152601f60248201527f4f4654436f72653a2063616c6c6572206d757374206265204f4654436f7265006044820152606401610e2e565b6120b7308686612e72565b9350846001600160a01b03168a61ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf866040516120f991815260200190565b60405180910390a3604051633fe79aed60e11b81526001600160a01b03861690637fcf35da90839061213d908e908e908e908e908e908d908d908d90600401614b7c565b600060405180830381600088803b15801561215757600080fd5b5087f115801561216b573d6000803e3d6000fd5b505050505050505050505050505050565b61218461245d565b61ffff831660009081526001602052604090206121a2908383613fb4565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161194c93929190614a68565b61ffff828116600090815260076020908152604080832081518083019092525493841681526201000090930460ff161580159184019190915290919061223b5780516127109061222a9061ffff1685614bd7565b6122349190614c0c565b9150612261565b60085461ffff161561225c576008546127109061222a9061ffff1685614bd7565b600091505b5092915050565b61227061245d565b6001600160a01b0381166122d55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e2e565b6122de81612c1d565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e46001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015612361573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123899190810190614c20565b90505b949350505050565b61239c61245d565b61ffff821660008181526012602052604090819020839055517f13aaa8bcd182e10a0da2842b57f639fd4182fa41a6c702fb2b8570da7b2911a5906112c69084815260200190565b6000806124475a60966366ad5c8a60e01b8989898960405160240161240c9493929190614c96565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190612ec4565b915091508161126e5761126e8686868685612f4e565b6000546001600160a01b031633146114255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e2e565b6001600160a01b0383166125195760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e2e565b6001600160a01b03821661257a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e2e565b6001600160a01b038381166000818152600a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006125e78484611f37565b9050600019811461264f57818110156126425760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e2e565b61264f84848484036124b7565b50505050565b6001600160a01b0383166126b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e2e565b6001600160a01b03821661271b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e2e565b6001600160a01b038316600090815260096020526040902054818110156127935760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e2e565b6001600160a01b038085166000908152600960205260408082208585039055918516815290812080548492906127ca908490614a27565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161281691815260200190565b60405180910390a361264f565b60008061283084846121d6565b905061283c8184614acb565b91508015612864576008546128629086906201000090046001600160a01b031683612e72565b505b935093915050565b600061287a87828481612feb565b61288385613065565b509050612892888888846130a5565b9050600081116128e05760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610e2e565b600061292b876128ef846131b8565b6040805160006020820152602181019390935260c09190911b6001600160c01b0319166041830152805160298184030181526049909201905290565b905061293b88828787873461323e565b86896001600160a01b03168961ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a8560405161297c91815260200190565b60405180910390a450979650505050505050565b60008060006129a2876128ef886131b8565b60405163040a7bb160e41b81529091506001600160a01b037f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e416906340a7bb10906129f9908b90309086908b908b90600401614cd4565b6040805180830381865afa158015612a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a399190614d28565b92509250509550959350505050565b612a506133d9565b600e805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000612ab2896001846001600160401b038916612feb565b612abb87613065565b509050612aca8a8a8a846130a5565b905060008111612b185760405162461bcd60e51b815260206004820152601960248201527813d19510dbdc994e88185b5bdd5b9d081d1bdbc81cdb585b1b603a1b6044820152606401610e2e565b6000612b2f338a612b28856131b8565b8a8a613422565b9050612b3f8a828787873461323e565b888b6001600160a01b03168b61ffff167fd81fc9b8523134ed613870ed029d6170cbb73aa6a6bc311b9a642689fb9df59a85604051612b8091815260200190565b60405180910390a4509998505050505050505050565b6000612ba28282613463565b905060ff8116612bbd57612bb8858585856134bf565b611136565b60ff811660011415612bd557612bb88585858561354f565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b65742074797065000000006044820152606401610e2e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612c756137a2565b600e805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a7d3390565b606081612cb881601f614a27565b1015612cf75760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610e2e565b612d018284614a27565b84511015612d455760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610e2e565b606082158015612d645760405191506000825260208201604052612dae565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612d9d578051835260209283019201612d85565b5050858452601f01601f1916604052505b50949350505050565b6000806000612dca338a612b288b6131b8565b60405163040a7bb160e41b81529091506001600160a01b037f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e416906340a7bb1090612e21908d90309086908b908b90600401614cd4565b6040805180830381865afa158015612e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e619190614d28565b925092505097509795505050505050565b600033306001600160a01b03861614801590612ea05750806001600160a01b0316856001600160a01b031614155b15612eb057612eb08582856125db565b612ebb858585612655565b50909392505050565b6000606060008060008661ffff166001600160401b03811115612ee957612ee96144fc565b6040519080825280601f01601f191660200182016040528015612f13576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115612f35578692505b828152826000602083013e909890975095505050505050565b8180519060200120600460008761ffff1661ffff16815260200190815260200160002085604051612f7f9190614d4c565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90612fdc9087908790879087908790614d68565b60405180910390a15050505050565b60055460ff161561300757613002848484846137e8565b61264f565b81511561264f5760405162461bcd60e51b815260206004820152602660248201527f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060448201526532b6b83a3c9760d11b6064820152608401610e2e565b6000806130927f00000000000000000000000000000000000000000000000000000002540be40084614dba565b905061309e8184614acb565b9150915091565b60006130af6137a2565b60006130bd868686866138c7565b6001600160a01b03871660009081526015602052604090205490915060ff16156130e857905061238c565b61ffff85166000908152601160205260408120544261310a6201518083614c0c565b6131176201518083614c0c565b111561312557839250613147565b61ffff8816600090815260106020526040902054613144908590614a27565b92505b61ffff88166000908152600f60205260409020548084111561318657604051635986919560e01b81526004810182905260248101859052604401610e2e565b5061ffff8816600090815260106020908152604080832095909555601190529290922091909155509050949350505050565b6000806131e57f00000000000000000000000000000000000000000000000000000002540be40084614c0c565b90506001600160401b0381111561101c5760405162461bcd60e51b815260206004820152601a60248201527f4f4654436f72653a20616d6f756e745344206f766572666c6f770000000000006044820152606401610e2e565b61ffff86166000908152600160205260408120805461325c90614939565b80601f016020809104026020016040519081016040528092919081815260200182805461328890614939565b80156132d55780601f106132aa576101008083540402835291602001916132d5565b820191906000526020600020905b8154815290600101906020018083116132b857829003601f168201915b505050505090508051600014156133475760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610e2e565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e4169063c580310090849061339e908b9086908c908c908c908c90600401614dce565b6000604051808303818588803b1580156133b757600080fd5b505af11580156133cb573d6000803e3d6000fd5b505050505050505050505050565b600e5460ff166114255760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610e2e565b6060600185856001600160a01b038916858760405160200161344996959493929190614e35565b604051602081830303815290604052905095945050505050565b6000613470826001614a27565b835110156134b65760405162461bcd60e51b8152602060048201526013602482015272746f55696e74385f6f75744f66426f756e647360681b6044820152606401610e2e565b50016001015190565b6000806134cb836138f9565b90925090506001600160a01b0382166134e45761dead91505b60006134ef8261397e565b90506134fc8784836139b3565b9050826001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf8360405161353e91815260200190565b60405180910390a350505050505050565b600080600080600061356086613ac4565b945094509450945094506000600660008b61ffff1661ffff168152602001908152602001600020896040516135959190614d4c565b90815260408051602092819003830181206001600160401b038c166000908152908452829020818301909252815480825260019092015460ff16151592810183905292509061366e576135e78561397e565b90506135f48b30836139b3565b604080518082018252828152600160208083019190915261ffff8f166000908152600690915282902091519293509161362e908d90614d4c565b90815260408051602092819003830190206001600160401b038d16600090815290835220825181559101516001909101805460ff19169115159190911790555b6001600160a01b0386163b6136c5576040516001600160a01b03871681527f9aedf5fdba8716db3b6705ca00150643309995d4f818a249ed6dde6677e7792d9060200160405180910390a15050505050505061264f565b60208201518b908b908b908b908b908b9087908b906000906136f0578b6001600160401b03166136f2565b5a5b90506000806137245a609663eaffd49a60e01b8e8e8e8d8d8d8d8d60405160240161240c989796959493929190614e96565b91509150811561377d578751602089012060405161ffff8d16907fb8890edbfc1c74692f527444645f95489c3703cc2df42e4a366f5d06fa6cd8849061376f908e908e908690614f0a565b60405180910390a25061378a565b61378a8b8b8b8b85612f4e565b50505050505050505050505050505050505050505050565b600e5460ff16156114255760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610e2e565b60006137f383613b7b565b61ffff808716600090815260026020908152604080832093891683529290529081205491925090613825908490614a27565b9050600081116138775760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610e2e565b8082101561126e5760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610e2e565b6000336001600160a01b03861681146138e5576138e58682856125db565b6138ef8684613bd7565b5090949350505050565b600080806139078482613463565b60ff16148015613918575082516029145b61395f5760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610e2e565b61396a83600d613d25565b9150613977836021613d8a565b9050915091565b600061101c7f00000000000000000000000000000000000000000000000000000002540be4006001600160401b038416614bd7565b60006139bd6137a2565b60006139ca858585613de7565b6001600160a01b03851660009081526015602052604090205490915060ff16156139f55790506111cc565b61ffff851660009081526014602052604081205442613a176201518083614c0c565b613a246201518083614c0c565b1115613a3257839250613a54565b61ffff8816600090815260136020526040902054613a51908590614a27565b92505b61ffff881660009081526012602052604090205480841115613a9357604051636cc1d80760e01b81526004810182905260248101859052604401610e2e565b5061ffff88166000908152601360209081526040808320959095556014905292909220919091555090509392505050565b600080806060816001613ad78783613463565b60ff1614613b225760405162461bcd60e51b815260206004820152601860248201527713d19510dbdc994e881a5b9d985b1a59081c185e5b1bd85960421b6044820152606401610e2e565b613b2d86600d613d25565b9350613b3a866021613d8a565b9250613b47866029613df3565b9450613b54866049613d8a565b9050613b706051808851613b689190614acb565b889190612caa565b915091939590929450565b6000602282511015613bcf5760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d73000000006044820152606401610e2e565b506022015190565b6001600160a01b038216613c375760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610e2e565b6001600160a01b03821660009081526009602052604090205481811015613cab5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610e2e565b6001600160a01b03831660009081526009602052604081208383039055600b8054849290613cda908490614acb565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6000613d32826014614a27565b83511015613d7a5760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b6044820152606401610e2e565b500160200151600160601b900490565b6000613d97826008614a27565b83511015613dde5760405162461bcd60e51b8152602060048201526014602482015273746f55696e7436345f6f75744f66426f756e647360601b6044820152606401610e2e565b50016008015190565b60006122618383613e51565b6000613e00826020614a27565b83511015613e485760405162461bcd60e51b8152602060048201526015602482015274746f427974657333325f6f75744f66426f756e647360581b6044820152606401610e2e565b50016020015190565b6001600160a01b038216613ea75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610e2e565b80600b6000828254613eb99190614a27565b90915550506001600160a01b03821660009081526009602052604081208054839290613ee6908490614a27565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054613f3c90614939565b90600052602060002090601f016020900481019282613f5e5760008555613fa4565b82601f10613f7757805160ff1916838001178555613fa4565b82800160010185558215613fa4579182015b82811115613fa4578251825591602001919060010190613f89565b50613fb0929150614028565b5090565b828054613fc090614939565b90600052602060002090601f016020900481019282613fe25760008555613fa4565b82601f10613ffb5782800160ff19823516178555613fa4565b82800160010185558215613fa4579182015b82811115613fa457823582559160200191906001019061400d565b5b80821115613fb05760008155600101614029565b803561ffff8116811461404f57600080fd5b919050565b60008083601f84011261406657600080fd5b5081356001600160401b0381111561407d57600080fd5b60208301915083602082850101111561409557600080fd5b9250929050565b80356001600160401b038116811461404f57600080fd5b600080600080600080608087890312156140cc57600080fd5b6140d58761403d565b955060208701356001600160401b03808211156140f157600080fd5b6140fd8a838b01614054565b909750955085915061411160408a0161409c565b9450606089013591508082111561412757600080fd5b5061413489828a01614054565b979a9699509497509295939492505050565b60006020828403121561415857600080fd5b81356001600160e01b0319811681146111cc57600080fd5b60005b8381101561418b578181015183820152602001614173565b8381111561264f5750506000910152565b600081518084526141b4816020860160208601614170565b601f01601f19169290920160200192915050565b6020815260006111cc602083018461419c565b6000602082840312156141ed57600080fd5b6111cc8261403d565b6001600160a01b03811681146122de57600080fd5b6000806040838503121561421e57600080fd5b8235614229816141f6565b946020939093013593505050565b60008060006060848603121561424c57600080fd5b8335614257816141f6565b92506020840135614267816141f6565b929592945050506040919091013590565b60006060828403121561428a57600080fd5b50919050565b60008060008060008060c087890312156142a957600080fd5b86356142b4816141f6565b95506142c26020880161403d565b945060408701359350606087013592506080870135915060a08701356001600160401b038111156142f257600080fd5b6142fe89828a01614278565b9150509295509295509295565b6000806040838503121561431e57600080fd5b6142298361403d565b8035801515811461404f57600080fd5b60008060008060008060a0878903121561435057600080fd5b6143598761403d565b9550602087013594506040870135935061437560608801614327565b925060808701356001600160401b0381111561439057600080fd5b61413489828a01614054565b6000806000604084860312156143b157600080fd5b6143ba8461403d565b925060208401356001600160401b038111156143d557600080fd5b6143e186828701614054565b9497909650939450505050565b60008060008060008060008060006101008a8c03121561440d57600080fd5b8935614418816141f6565b985061442660208b0161403d565b975060408a0135965060608a0135955060808a0135945060a08a01356001600160401b038082111561445757600080fd5b6144638d838e01614054565b909650945084915061447760c08d0161409c565b935060e08c013591508082111561448d57600080fd5b5061449a8c828d01614278565b9150509295985092959850929598565b6000602082840312156144bc57600080fd5b81356111cc816141f6565b600080604083850312156144da57600080fd5b82356144e5816141f6565b91506144f360208401614327565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561453a5761453a6144fc565b604052919050565b60006001600160401b0382111561455b5761455b6144fc565b50601f01601f191660200190565b60008060006060848603121561457e57600080fd5b6145878461403d565b925060208401356001600160401b038111156145a257600080fd5b8401601f810186136145b357600080fd5b80356145c66145c182614542565b614512565b8181528760208385010111156145db57600080fd5b816020840160208301376000602083830101528094505050506146006040850161409c565b90509250925092565b60008060006060848603121561461e57600080fd5b6146278461403d565b925061463560208501614327565b91506146006040850161403d565b6000806040838503121561465657600080fd5b61465f8361403d565b91506144f36020840161403d565b600080600080600080600080600060e08a8c03121561468b57600080fd5b6146948a61403d565b985060208a0135975060408a0135965060608a01356001600160401b03808211156146be57600080fd5b6146ca8d838e01614054565b90985096508691506146de60808d0161409c565b95506146ec60a08d01614327565b945060c08c013591508082111561470257600080fd5b5061470f8c828d01614054565b915080935050809150509295985092959850929598565b60008060008060006080868803121561473e57600080fd5b6147478661403d565b94506147556020870161403d565b93506040860135925060608601356001600160401b0381111561477757600080fd5b61478388828901614054565b969995985093965092949392505050565b600080604083850312156147a757600080fd5b82356147b2816141f6565b915060208301356147c2816141f6565b809150509250929050565b6000806000606084860312156147e257600080fd5b6147eb8461403d565b92506147f96020850161403d565b9150604084013590509250925092565b60006020828403121561481b57600080fd5b6111cc82614327565b6000806000806000806000806000806101008b8d03121561484457600080fd5b61484d8b61403d565b995060208b01356001600160401b038082111561486957600080fd5b6148758e838f01614054565b909b50995089915061488960408e0161409c565b985060608d0135975060808d013591506148a2826141f6565b90955060a08c0135945060c08c013590808211156148bf57600080fd5b506148cc8d828e01614054565b9150809450508092505060e08b013590509295989b9194979a5092959850565b6000806000806080858703121561490257600080fd5b61490b8561403d565b93506149196020860161403d565b92506040850135614929816141f6565b9396929550929360600135925050565b600181811c9082168061494d57607f821691505b6020821081141561428a57634e487b7160e01b600052602260045260246000fd5b8183823760009101908152919050565b6000808335601e1984360301811261499557600080fd5b8301803591506001600160401b038211156149af57600080fd5b60200191503681900382131561409557600080fd5b6020808252602d908201527f426173654f4654576974684665653a20616d6f756e74206973206c657373207460408201526c1a185b881b5a5b905b5bdd5b9d609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115614a3a57614a3a614a11565b500190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000612389604083018486614a3f565b60208082526025908201527f4665653a20666565206270206d757374206265203c3d2042505f44454e4f4d496040820152642720aa27a960d91b606082015260800190565b600082821015614add57614add614a11565b500390565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b600061ffff808816835280871660208401525084604083015260806060830152614b36608083018486614a3f565b979650505050505050565b61ffff86168152608060208201526000614b5f608083018688614a3f565b6001600160401b0394909416604083015250606001529392505050565b61ffff8916815260c060208201526000614b9a60c08301898b614a3f565b6001600160401b038816604084015286606084015285608084015282810360a0840152614bc8818587614a3f565b9b9a5050505050505050505050565b6000816000190483118215151615614bf157614bf1614a11565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614c1b57614c1b614bf6565b500490565b600060208284031215614c3257600080fd5b81516001600160401b03811115614c4857600080fd5b8201601f81018413614c5957600080fd5b8051614c676145c182614542565b818152856020838501011115614c7c57600080fd5b614c8d826020830160208601614170565b95945050505050565b61ffff85168152608060208201526000614cb3608083018661419c565b6001600160401b03851660408401528281036060840152614b36818561419c565b61ffff861681526001600160a01b038516602082015260a060408201819052600090614d029083018661419c565b84151560608401528281036080840152614d1c818561419c565b98975050505050505050565b60008060408385031215614d3b57600080fd5b505080516020909101519092909150565b60008251614d5e818460208701614170565b9190910192915050565b61ffff8616815260a060208201526000614d8560a083018761419c565b6001600160401b03861660408401528281036060840152614da6818661419c565b90508281036080840152614d1c818561419c565b600082614dc957614dc9614bf6565b500690565b61ffff8716815260c060208201526000614deb60c083018861419c565b8281036040840152614dfd818861419c565b6001600160a01b0387811660608601528616608085015283810360a08501529050614e28818561419c565b9998505050505050505050565b60ff60f81b8760f81b16815285600182015260006001600160401b0360c01b808760c01b166021840152856029840152808560c01b166049840152508251614e84816051850160208701614170565b91909101605101979650505050505050565b600061010061ffff8b168352806020840152614eb48184018b61419c565b6001600160401b038a166040850152606084018990526001600160a01b038816608085015260a0840187905283810360c08501529050614ef4818661419c565b9150508260e08301529998505050505050505050565b606081526000614f1d606083018661419c565b6001600160401b03949094166020830152506040015291905056fea26469706673582212208d01f6c8ab82d843943fb212fc4ae7e672093db816a7cedc5feb9359d61779b364736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e4
-----Decoded View---------------
Arg [0] : _lzEndpoint (address): 0x9740FF91F1985D8d2B71494aE1A2f723bb3Ed9E4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e4
Deployed Bytecode Sourcemap
86482:4308:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46938:762;;;;;;;;;;-1:-1:-1;46938:762:0;;;;;:::i;:::-;;:::i;:::-;;80670:218;;;;;;;;;;-1:-1:-1;80670:218:0;;;;;:::i;:::-;;:::i;:::-;;;2029:14:1;;2022:22;2004:41;;1992:2;1977:18;80670:218:0;;;;;;;;6334:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49781:123::-;;;;;;;;;;-1:-1:-1;49781:123:0;;;;;:::i;:::-;;:::i;8685:201::-;;;;;;;;;;-1:-1:-1;8685:201:0;;;;;:::i;:::-;;:::i;86895:64::-;;;;;;;;;;-1:-1:-1;86895:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3598:25:1;;;3586:2;3571:18;86895:64:0;3452:177:1;49912:129:0;;;;;;;;;;-1:-1:-1;49912:129:0;;;;;:::i;:::-;;:::i;7454:108::-;;;;;;;;;;-1:-1:-1;7542:12:0;;7454:108;;9466:295;;;;;;;;;;-1:-1:-1;9466:295:0;;;;;:::i;:::-;;:::i;79415:484::-;;;;;;:::i;:::-;;:::i;87702:84::-;;;;;;;;;;-1:-1:-1;87776:2:0;87702:84;;;5217:4:1;5205:17;;;5187:36;;5175:2;5160:18;87702:84:0;5045:184:1;90120:170:0;;;;;;;;;;-1:-1:-1;90120:170:0;;;;;:::i;:::-;;:::i;80896:292::-;;;;;;;;;;-1:-1:-1;80896:292:0;;;;;:::i;:::-;;:::i;:::-;;;;6522:25:1;;;6578:2;6563:18;;6556:34;;;;6495:18;80896:292:0;6348:248:1;10170:238:0;;;;;;;;;;-1:-1:-1;10170:238:0;;;;;:::i;:::-;;:::i;51733:250::-;;;;;;;;;;-1:-1:-1;51733:250:0;;;;;:::i;:::-;;:::i;90720:67::-;;;;;;;;;;;;;:::i;50049:178::-;;;;;;;;;;-1:-1:-1;50049:178:0;;;;;:::i;:::-;;:::i;63579:37::-;;;;;;;;;;;;63615:1;63579:37;;79907:568;;;;;;:::i;:::-;;:::i;77063:217::-;;;;;;;;;;-1:-1:-1;77063:217:0;;;;;:::i;:::-;;:::i;63645:33::-;;;;;;;;;;;;63677:1;63645:33;;86677:60;;;;;;;;;;-1:-1:-1;86677:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;90473:168;;;;;;;;;;-1:-1:-1;90473:168:0;;;;;:::i;:::-;;:::i;76502:235::-;;;;;;;;;;-1:-1:-1;76502:235:0;;;;;:::i;:::-;;:::i;57963:85::-;;;;;;;;;;-1:-1:-1;57963:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85500:86;;;;;;;;;;-1:-1:-1;85571:7:0;;;;85500:86;;59185:346;;;;;;;;;;-1:-1:-1;59185:346:0;;;;;:::i;:::-;;:::i;7625:127::-;;;;;;;;;;-1:-1:-1;7625:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;7726:18:0;7699:7;7726:18;;;:9;:18;;;;;;;7625:127;18915:103;;;;;;;;;;;;;:::i;46410:51::-;;;;;;;;;;-1:-1:-1;46410:51:0;;;;;:::i;:::-;;:::i;76745:310::-;;;;;;;;;;-1:-1:-1;76745:310:0;;;;;:::i;:::-;;:::i;86551:54::-;;;;;;;;;;-1:-1:-1;86551:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;90649:63;;;;;;;;;;;;;:::i;63736:37::-;;;;;;;;;;;;;;;46468:65;;;;;;;;;;-1:-1:-1;46468:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;18267:87;;;;;;;;;;-1:-1:-1;18313:7:0;18340:6;-1:-1:-1;;;;;18340:6:0;18267:87;;;-1:-1:-1;;;;;11408:32:1;;;11390:51;;11378:2;11363:18;18267:87:0;11244:203:1;82520:112:0;;;;;;;;;;;;;:::i;46540:23::-;;;;;;;;;;-1:-1:-1;46540:23:0;;;;-1:-1:-1;;;;;46540:23:0;;;6553:104;;;;;;;;;;;;;:::i;87050:41::-;;;;;;;;;;-1:-1:-1;87050:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;86766:53;;;;;;;;;;-1:-1:-1;86766:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;50869:330;;;;;;;;;;-1:-1:-1;50869:330:0;;;;;:::i;:::-;;:::i;86612:58::-;;;;;;;;;;-1:-1:-1;86612:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;10911:436;;;;;;;;;;-1:-1:-1;10911:436:0;;;;;:::i;:::-;;:::i;81196:380::-;;;;;;;;;;-1:-1:-1;81196:380:0;;;;;:::i;:::-;;:::i;50580:281::-;;;;;;;;;;-1:-1:-1;50580:281:0;;;;;:::i;:::-;;:::i;7958:193::-;;;;;;;;;;-1:-1:-1;7958:193:0;;;;;:::i;:::-;;:::i;76015:43::-;;;;;;;;;;;;76053:5;76015:43;;46357:46;;;;;;;;;;;;;;;76158:23;;;;;;;;;;-1:-1:-1;76158:23:0;;;;;;;-1:-1:-1;;;;;76158:23:0;;;51207:136;;;;;;;;;;-1:-1:-1;51207:136:0;;;;;:::i;:::-;;:::i;76067:51::-;;;;;;;;;;-1:-1:-1;76067:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;12956:6:1;12944:19;;;12926:38;;13007:14;;13000:22;12995:2;12980:18;;12973:50;12899:18;76067:51:0;12760:269:1;86826:62:0;;;;;;;;;;-1:-1:-1;86826:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;49569:204;;;;;;;;;;-1:-1:-1;49569:204:0;;;;;:::i;:::-;;:::i;59717:767::-;;;;;;:::i;:::-;;:::i;63823:91::-;;;;;;;;;;-1:-1:-1;63823:91:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13829:25:1;;;13897:14;;13890:22;13885:2;13870:18;;13863:50;13802:18;63823:91:0;13661:258:1;76125:26:0;;;;;;;;;;-1:-1:-1;76125:26:0;;;;;;;;;;;14098:6:1;14086:19;;;14068:38;;14056:2;14041:18;76125:26:0;13924:188:1;8214:151:0;;;;;;;;;;-1:-1:-1;8214:151:0;;;;;:::i;:::-;;:::i;51351:284::-;;;;;;;;;;-1:-1:-1;51351:284:0;;;;;:::i;:::-;;:::i;63685:42::-;;;;;;;;;;;;63726:1;63685:42;;65758:223;;;;;;;;;;-1:-1:-1;65758:223:0;;;;;:::i;:::-;;:::i;65186:564::-;;;;;;;;;;-1:-1:-1;65186:564:0;;;;;:::i;:::-;;:::i;50374:198::-;;;;;;;;;;-1:-1:-1;50374:198:0;;;;;:::i;:::-;;:::i;77288:409::-;;;;;;;;;;-1:-1:-1;77288:409:0;;;;;:::i;:::-;;:::i;63782:34::-;;;;;;;;;;-1:-1:-1;63782:34:0;;;;;;;;19173:201;;;;;;;;;;-1:-1:-1;19173:201:0;;;;;:::i;:::-;;:::i;49296:211::-;;;;;;;;;;-1:-1:-1;49296:211:0;;;;;:::i;:::-;;:::i;82640:103::-;;;;;;;;;;-1:-1:-1;82730:4:0;82640:103;;90298:167;;;;;;;;;;-1:-1:-1;90298:167:0;;;;;:::i;:::-;;:::i;46938:762::-;4149:10;47178;-1:-1:-1;;;;;47154:35:0;;47146:78;;;;-1:-1:-1;;;47146:78:0;;16901:2:1;47146:78:0;;;16883:21:1;16940:2;16920:18;;;16913:30;16979:32;16959:18;;;16952:60;17029:18;;47146:78:0;;;;;;;;;47266:32;;;47237:26;47266:32;;;:19;:32;;;;;47237:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47472:13;:20;47450:11;;:18;;:42;:70;;;;;47519:1;47496:13;:20;:24;47450:70;:124;;;;-1:-1:-1;47550:24:0;;;;;;47524:22;;;;47534:11;;;;47524:22;:::i;:::-;;;;;;;;:50;47450:124;47442:175;;;;-1:-1:-1;;;47442:175:0;;17921:2:1;47442:175:0;;;17903:21:1;17960:2;17940:18;;;17933:30;17999:34;17979:18;;;17972:62;-1:-1:-1;;;18050:18:1;;;18043:36;18096:19;;47442:175:0;17719:402:1;47442:175:0;47630:62;47649:11;47662;;47630:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47630:62:0;;;;;;;;;;;;;;;;;;;;;;47675:6;;-1:-1:-1;47630:62:0;-1:-1:-1;47683:8:0;;;;;;47630:62;;47683:8;;;;47630:62;;;;;;;;;-1:-1:-1;47630:18:0;;-1:-1:-1;;;47630:62:0:i;:::-;47069:631;46938:762;;;;;;:::o;80670:218::-;80772:4;-1:-1:-1;;;;;;80796:44:0;;-1:-1:-1;;;80796:44:0;;:84;;-1:-1:-1;;;;;;;;;;78985:40:0;;;80844:36;80789:91;80670:218;-1:-1:-1;;80670:218:0:o;6334:100::-;6388:13;6421:5;6414:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6334:100;:::o;49781:123::-;18153:13;:11;:13::i;:::-;49861:35:::1;::::0;-1:-1:-1;;;49861:35:0;;14098:6:1;14086:19;;49861:35:0::1;::::0;::::1;14068:38:1::0;49861:10:0::1;-1:-1:-1::0;;;;;49861:25:0::1;::::0;::::1;::::0;14041:18:1;;49861:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49781:123:::0;:::o;8685:201::-;8768:4;4149:10;8824:32;4149:10;8840:7;8849:6;8824:8;:32::i;:::-;-1:-1:-1;8874:4:0;;8685:201;-1:-1:-1;;;8685:201:0:o;49912:129::-;18153:13;:11;:13::i;:::-;49995:38:::1;::::0;-1:-1:-1;;;49995:38:0;;14098:6:1;14086:19;;49995:38:0::1;::::0;::::1;14068::1::0;49995:10:0::1;-1:-1:-1::0;;;;;49995:28:0::1;::::0;::::1;::::0;14041:18:1;;49995:38:0::1;13924:188:1::0;9466:295:0;9597:4;4149:10;9655:38;9671:4;4149:10;9686:6;9655:15;:38::i;:::-;9704:27;9714:4;9720:2;9724:6;9704:9;:27::i;:::-;9749:4;9742:11;;;9466:295;;;;;;:::o;79415:484::-;79610:39;79621:5;79628:11;79641:7;79610:10;:39::i;:::-;-1:-1:-1;79597:52:0;-1:-1:-1;79670:131:0;79676:5;79683:11;79696:10;79597:52;79717:25;;;;:11;:25;:::i;:::-;79744:29;;;;;;;;:::i;:::-;79775:25;;;;:11;:25;:::i;:::-;79670:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79670:5:0;;-1:-1:-1;;;79670:131:0:i;:::-;79660:141;;79831:10;79820:7;:21;;79812:79;;;;-1:-1:-1;;;79812:79:0;;;;;;;:::i;:::-;79415:484;;;;;;:::o;90120:170::-;18153:13;:11;:13::i;:::-;90203:29:::1;::::0;::::1;;::::0;;;:20:::1;:29;::::0;;;;;;:35;;;90254:28;::::1;::::0;::::1;::::0;90235:3;3598:25:1;;3586:2;3571:18;;3452:177;90254:28:0::1;;;;;;;;90120:170:::0;;:::o;80896:292::-;81058:14;81074:11;81105:75;81122:11;81135:10;81147:7;81156;81165:14;;81105:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;81105:16:0;;-1:-1:-1;;;81105:75:0:i;:::-;81098:82;;;;80896:292;;;;;;;;;:::o;10170:238::-;10258:4;4149:10;10314:64;4149:10;10330:7;10367:10;10339:25;4149:10;10330:7;10339:9;:25::i;:::-;:38;;;;:::i;:::-;10314:8;:64::i;51733:250::-;51875:32;;;51829:4;51875:32;;;:19;:32;;;;;51846:61;;51829:4;;51875:32;51846:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51963:11;;51953:22;;;;;;;:::i;:::-;;;;;;;;51935:13;51925:24;;;;;;:50;51918:57;;;51733:250;;;;;:::o;90720:67::-;18153:13;:11;:13::i;:::-;90769:10:::1;:8;:10::i;:::-;90720:67::o:0;50049:178::-;18153:13;:11;:13::i;:::-;50164:55:::1;::::0;-1:-1:-1;;;50164:55:0;;-1:-1:-1;;;;;50164:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;50194:11;;50207;;;;50164:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;79907:568:::0;80153:39;80164:5;80171:11;80184:7;80153:10;:39::i;:::-;80140:52;;;;;80213:164;80226:5;80233:11;80246:10;80258:7;80267:8;;80213:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80277:14:0;;-1:-1:-1;80293:25:0;;-1:-1:-1;;80293:25:0;;;:11;:25;:::i;:::-;80320:29;;;;;;;;:::i;:::-;80351:25;;;;:11;:25;:::i;:::-;80213:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80213:12:0;;-1:-1:-1;;;80213:164:0:i;:::-;80203:174;;80407:10;80396:7;:21;;80388:79;;;;-1:-1:-1;;;80388:79:0;;;;;;;:::i;:::-;79907:568;;;;;;;;;:::o;77063:217::-;18153:13;:11;:13::i;:::-;-1:-1:-1;;;;;77147:25:0;::::1;77139:64;;;::::0;-1:-1:-1;;;77139:64:0;;20395:2:1;77139:64:0::1;::::0;::::1;20377:21:1::0;20434:2;20414:18;;;20407:30;20473:28;20453:18;;;20446:56;20519:18;;77139:64:0::1;20193:350:1::0;77139:64:0::1;77214:8;:20:::0;;-1:-1:-1;;;;;;77214:20:0::1;::::0;-1:-1:-1;;;;;77214:20:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;77250:22:::1;::::0;11390:51:1;;;77250:22:0::1;::::0;11378:2:1;11363:18;77250:22:0::1;;;;;;;;77063:217:::0;:::o;90473:168::-;18153:13;:11;:13::i;:::-;-1:-1:-1;;;;;90557:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;;;;:29;;-1:-1:-1;;90557:29:0::1;::::0;::::1;;::::0;;::::1;::::0;;;90602:31;;2004:41:1;;;90602:31:0::1;::::0;1977:18:1;90602:31:0::1;1864:187:1::0;76502:235:0;18153:13;:11;:13::i;:::-;76053:5:::1;76586:6;:24;;;;76578:74;;;;-1:-1:-1::0;;;76578:74:0::1;;;;;;;:::i;:::-;76663:12;:21:::0;;-1:-1:-1;;76663:21:0::1;;::::0;::::1;::::0;;::::1;::::0;;;76700:29:::1;::::0;14068:38:1;;;76700:29:0::1;::::0;14056:2:1;14041:18;76700:29:0::1;13924:188:1::0;59185:346:0;4149:10;59399:4;59375:29;59367:80;;;;-1:-1:-1;;;59367:80:0;;21156:2:1;59367:80:0;;;21138:21:1;21195:2;21175:18;;;21168:30;21234:34;21214:18;;;21207:62;-1:-1:-1;;;21285:18:1;;;21278:36;21331:19;;59367:80:0;20954:402:1;59367:80:0;59458:65;59480:11;59493;;59458:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59458:65:0;;;;;;;;;;;;;;;;;;;;;;59506:6;;-1:-1:-1;59458:65:0;-1:-1:-1;59514:8:0;;;;;;59458:65;;59514:8;;;;59458:65;;;;;;;;;-1:-1:-1;59458:21:0;;-1:-1:-1;;;59458:65:0:i;18915:103::-;18153:13;:11;:13::i;:::-;18980:30:::1;19007:1;18980:18;:30::i;46410:51::-:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;76745:310::-;18153:13;:11;:13::i;:::-;76053:5:::1;76857:6;:24;;;;76849:74;;;;-1:-1:-1::0;;;76849:74:0::1;;;;;;;:::i;:::-;76965:27;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;;::::0;;::::1;::::0;;;76934:28;;::::1;-1:-1:-1::0;76934:28:0;;;:15:::1;:28:::0;;;;;:58;;;;;;::::1;;::::0;::::1;-1:-1:-1::0;;76934:58:0;;;;::::1;::::0;;;;::::1;::::0;;;77008:39;;21578:34:1;;;21628:18;;;21621:50;;;;21687:18;;;21680:43;77008:39:0::1;::::0;21541:2:1;21526:18;77008:39:0::1;;;;;;;;76745:310:::0;;;:::o;90649:63::-;18153:13;:11;:13::i;:::-;90696:8:::1;:6;:8::i;82520:112::-:0;82587:4;82611:13;7542:12;;;7454:108;82611:13;82604:20;;82520:112;:::o;6553:104::-;6609:13;6642:7;6635:14;;;;;:::i;50869:330::-;50993:35;;;50973:17;50993:35;;;:19;:35;;;;;50973:55;;50948:12;;50973:17;50993:35;50973:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51047:4;:11;51062:1;51047:16;;51039:58;;;;-1:-1:-1;;;51039:58:0;;21936:2:1;51039:58:0;;;21918:21:1;21975:2;21955:18;;;21948:30;22014:31;21994:18;;;21987:59;22063:18;;51039:58:0;21734:353:1;51039:58:0;51115:31;51126:1;51143:2;51129:4;:11;:16;;;;:::i;:::-;51115:4;;:31;:10;:31::i;10911:436::-;11004:4;4149:10;11004:4;11087:25;4149:10;11104:7;11087:9;:25::i;:::-;11060:52;;11151:15;11131:16;:35;;11123:85;;;;-1:-1:-1;;;11123:85:0;;22424:2:1;11123:85:0;;;22406:21:1;22463:2;22443:18;;;22436:30;22502:34;22482:18;;;22475:62;-1:-1:-1;;;22553:18:1;;;22546:35;22598:19;;11123:85:0;22222:401:1;11123:85:0;11244:60;11253:5;11260:7;11288:15;11269:16;:34;11244:8;:60::i;:::-;-1:-1:-1;11335:4:0;;10911:436;-1:-1:-1;;;;10911:436:0:o;81196:380::-;81413:14;81429:11;81460:108;81484:11;81497:10;81509:7;81518:8;;81460:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;81460:108:0;;;;;;;;;;;;;;;;;;;;;;81528:14;;-1:-1:-1;81544:7:0;;-1:-1:-1;81460:108:0;81553:14;;;;;;81460:108;;81553:14;;;;81460:108;;;;;;;;;-1:-1:-1;81460:23:0;;-1:-1:-1;;;81460:108:0:i;:::-;81453:115;;;;81196:380;;;;;;;;;;;;:::o;50580:281::-;18153:13;:11;:13::i;:::-;50752:14:::1;;50776:4;50735:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;50735:47:0;;::::1;::::0;;;;;;50697:35:::1;::::0;::::1;;::::0;;;:19:::1;50735:47;50697:35:::0;;;;;;:85;;::::1;::::0;:35;;:85;;::::1;::::0;::::1;:::i;:::-;;50798:55;50822:14;50838;;50798:55;;;;;;;;:::i;7958:193::-:0;8037:4;4149:10;8093:28;4149:10;8110:2;8114:6;8093:9;:28::i;51207:136::-;18153:13;:11;:13::i;:::-;51277:8:::1;:20:::0;;-1:-1:-1;;;;;;51277:20:0::1;-1:-1:-1::0;;;;;51277:20:0;::::1;::::0;;::::1;::::0;;;51313:22:::1;::::0;11390:51:1;;;51313:22:0::1;::::0;11378:2:1;11363:18;51313:22:0::1;11244:203:1::0;49569:204:0;18153:13;:11;:13::i;:::-;49703:62:::1;::::0;-1:-1:-1;;;49703:62:0;;-1:-1:-1;;;;;49703:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;49724:8;;49734;;49744:11;;49757:7;;;;49703:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;59717:767:::0;59928:27;;;59906:19;59928:27;;;:14;:27;;;;;;:40;;;;59956:11;;;;59928:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59928:48:0;;;;;;;;;;;;-1:-1:-1;59928:48:0;59987:73;;;;-1:-1:-1;;;59987:73:0;;23720:2:1;59987:73:0;;;23702:21:1;23759:2;23739:18;;;23732:30;23798:34;23778:18;;;23771:62;-1:-1:-1;;;23849:18:1;;;23842:33;23892:19;;59987:73:0;23518:399:1;59987:73:0;60102:11;60089:8;;60079:19;;;;;;;:::i;:::-;;;;;;;;:34;60071:80;;;;-1:-1:-1;;;60071:80:0;;24124:2:1;60071:80:0;;;24106:21:1;24163:2;24143:18;;;24136:30;24202:34;24182:18;;;24175:62;-1:-1:-1;;;24253:18:1;;;24246:31;24294:19;;60071:80:0;23922:397:1;60071:80:0;60199:27;;;60258:1;60199:27;;;:14;:27;;;;;;:40;;;;60227:11;;;;60199:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60199:48:0;;;;;;;;;;;;:61;;;;60329:65;;;;;;;;;;;;;;;;;;;60351:11;;60364;;60329:65;;;;;;60364:11;60329:65;;60364:11;60329:65;;;;;;;;;-1:-1:-1;;60329:65:0;;;;;;;;;;;;;;;;;;;;;;60377:6;;-1:-1:-1;60329:65:0;-1:-1:-1;60385:8:0;;;;;;60329:65;;60385:8;;;;60329:65;;;;;;;;;-1:-1:-1;60329:21:0;;-1:-1:-1;;;60329:65:0:i;:::-;60410:66;60430:11;60443;;60456:6;60464:11;60410:66;;;;;;;;;;:::i;:::-;;;;;;;;59850:634;59717:767;;;;;;:::o;8214:151::-;-1:-1:-1;;;;;8330:18:0;;;8303:7;8330:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8214:151::o;51351:284::-;18153:13;:11;:13::i;:::-;51475:1:::1;51465:7;:11;51457:45;;;::::0;-1:-1:-1;;;51457:45:0;;25024:2:1;51457:45:0::1;::::0;::::1;25006:21:1::0;25063:2;25043:18;;;25036:30;-1:-1:-1;;;25082:18:1;;;25075:51;25143:18;;51457:45:0::1;24822:345:1::0;51457:45:0::1;51513:28;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;51580:47;;25395:34:1;;;25445:18;;25438:43;;;;25497:18;;;25490:34;;;51580:47:0::1;::::0;25358:2:1;25343:18;51580:47:0::1;25172:358:1::0;65758:223:0;18153:13;:11;:13::i;:::-;65859:22:::1;:48:::0;;-1:-1:-1;;65859:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;65923:50:::1;::::0;2004:41:1;;;65923:50:0::1;::::0;1992:2:1;1977:18;65923:50:0::1;1864:187:1::0;65186:564:0;4149:10;65419:4;65395:29;65387:73;;;;-1:-1:-1;;;65387:73:0;;25737:2:1;65387:73:0;;;25719:21:1;25776:2;25756:18;;;25749:30;25815:33;25795:18;;;25788:61;25866:18;;65387:73:0;25535:355:1;65387:73:0;65500:42;65522:4;65529:3;65534:7;65500:13;:42::i;:::-;65490:52;;65588:3;-1:-1:-1;;;;;65558:43:0;65575:11;65558:43;;;65593:7;65558:43;;;;3598:25:1;;3586:2;3571:18;;3452:177;65558:43:0;;;;;;;;65631:111;;-1:-1:-1;;;65631:111:0;;-1:-1:-1;;;;;65631:33:0;;;;;65670:11;;65631:111;;65683:11;;65696;;;;65709:6;;65717:5;;65724:7;;65733:8;;;;65631:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65186:564;;;;;;;;;;:::o;50374:198::-;18153:13;:11;:13::i;:::-;50472:32:::1;::::0;::::1;;::::0;;;:19:::1;:32;::::0;;;;:40:::1;::::0;50507:5;;50472:40:::1;:::i;:::-;;50528:36;50545:11;50558:5;;50528:36;;;;;;;;:::i;77288:409::-:0;77419:28;;;;77372:8;77419:28;;;:15;:28;;;;;;;;77393:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77372:8;;77393:54;77458:232;;77509:12;;76053:5;;77499:22;;;;:7;:22;:::i;:::-;:39;;;;:::i;:::-;77493:45;;77458:232;;;77560:12;;;;:16;77556:134;;77609:12;;76053:5;;77599:22;;77609:12;;77599:7;:22;:::i;77556:134::-;77677:1;77671:7;;77556:134;77382:315;77288:409;;;;:::o;19173:201::-;18153:13;:11;:13::i;:::-;-1:-1:-1;;;;;19262:22:0;::::1;19254:73;;;::::0;-1:-1:-1;;;19254:73:0;;27285:2:1;19254:73:0::1;::::0;::::1;27267:21:1::0;27324:2;27304:18;;;27297:30;27363:34;27343:18;;;27336:62;-1:-1:-1;;;27414:18:1;;;27407:36;27460:19;;19254:73:0::1;27083:402:1::0;19254:73:0::1;19338:28;19357:8;19338:18;:28::i;:::-;19173:201:::0;:::o;49296:211::-;49431:68;;-1:-1:-1;;;49431:68:0;;27727:6:1;27760:15;;;49431:68:0;;;27742:34:1;27812:15;;27792:18;;;27785:43;49480:4:0;27844:18:1;;;27837:60;27913:18;;;27906:34;;;49399:12:0;;49431:10;-1:-1:-1;;;;;49431:20:0;;;;27689:19:1;;49431:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49431:68:0;;;;;;;;;;;;:::i;:::-;49424:75;;49296:211;;;;;;;:::o;90298:167::-;18153:13;:11;:13::i;:::-;90380:28:::1;::::0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;:34;;;90430:27;::::1;::::0;::::1;::::0;90411:3;3598:25:1;;3586:2;3571:18;;3452:177;58332:514:0;58482:12;58496:19;58519:153;58553:9;58564:3;58592:34;;;58628:11;58641;58654:6;58662:8;58569:102;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58569:102:0;;;;;;;;;;;;;;-1:-1:-1;;;;;58569:102:0;-1:-1:-1;;;;;;58569:102:0;;;;;;;;;;58527:4;;58519:153;;:33;:153::i;:::-;58481:191;;;;58732:7;58727:112;;58756:71;58776:11;58789;58802:6;58810:8;58820:6;58756:19;:71::i;18432:132::-;18313:7;18340:6;-1:-1:-1;;;;;18340:6:0;4149:10;18496:23;18488:68;;;;-1:-1:-1;;;18488:68:0;;29354:2:1;18488:68:0;;;29336:21:1;;;29373:18;;;29366:30;29432:34;29412:18;;;29405:62;29484:18;;18488:68:0;29152:356:1;14536:380:0;-1:-1:-1;;;;;14672:19:0;;14664:68;;;;-1:-1:-1;;;14664:68:0;;29715:2:1;14664:68:0;;;29697:21:1;29754:2;29734:18;;;29727:30;29793:34;29773:18;;;29766:62;-1:-1:-1;;;29844:18:1;;;29837:34;29888:19;;14664:68:0;29513:400:1;14664:68:0;-1:-1:-1;;;;;14751:21:0;;14743:68;;;;-1:-1:-1;;;14743:68:0;;30120:2:1;14743:68:0;;;30102:21:1;30159:2;30139:18;;;30132:30;30198:34;30178:18;;;30171:62;-1:-1:-1;;;30249:18:1;;;30242:32;30291:19;;14743:68:0;29918:398:1;14743:68:0;-1:-1:-1;;;;;14824:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;14876:32;;3598:25:1;;;14876:32:0;;3571:18:1;14876:32:0;;;;;;;14536:380;;;:::o;15207:453::-;15342:24;15369:25;15379:5;15386:7;15369:9;:25::i;:::-;15342:52;;-1:-1:-1;;15409:16:0;:37;15405:248;;15491:6;15471:16;:26;;15463:68;;;;-1:-1:-1;;;15463:68:0;;30523:2:1;15463:68:0;;;30505:21:1;30562:2;30542:18;;;30535:30;30601:31;30581:18;;;30574:59;30650:18;;15463:68:0;30321:353:1;15463:68:0;15575:51;15584:5;15591:7;15619:6;15600:16;:25;15575:8;:51::i;:::-;15331:329;15207:453;;;:::o;11817:671::-;-1:-1:-1;;;;;11948:18:0;;11940:68;;;;-1:-1:-1;;;11940:68:0;;30881:2:1;11940:68:0;;;30863:21:1;30920:2;30900:18;;;30893:30;30959:34;30939:18;;;30932:62;-1:-1:-1;;;31010:18:1;;;31003:35;31055:19;;11940:68:0;30679:401:1;11940:68:0;-1:-1:-1;;;;;12027:16:0;;12019:64;;;;-1:-1:-1;;;12019:64:0;;31287:2:1;12019:64:0;;;31269:21:1;31326:2;31306:18;;;31299:30;31365:34;31345:18;;;31338:62;-1:-1:-1;;;31416:18:1;;;31409:33;31459:19;;12019:64:0;31085:399:1;12019:64:0;-1:-1:-1;;;;;12169:15:0;;12147:19;12169:15;;;:9;:15;;;;;;12203:21;;;;12195:72;;;;-1:-1:-1;;;12195:72:0;;31691:2:1;12195:72:0;;;31673:21:1;31730:2;31710:18;;;31703:30;31769:34;31749:18;;;31742:62;-1:-1:-1;;;31820:18:1;;;31813:36;31866:19;;12195:72:0;31489:402:1;12195:72:0;-1:-1:-1;;;;;12303:15:0;;;;;;;:9;:15;;;;;;12321:20;;;12303:38;;12363:13;;;;;;;;:23;;12335:6;;12303:15;12363:23;;12335:6;;12363:23;:::i;:::-;;;;;;;;12419:2;-1:-1:-1;;;;;12404:26:0;12413:4;-1:-1:-1;;;;;12404:26:0;;12423:6;12404:26;;;;3598:25:1;;3586:2;3571:18;;3452:177;12404:26:0;;;;;;;;12443:37;16260:125;77705:294;77800:11;77813:8;77840:33;77852:11;77865:7;77840:11;:33::i;:::-;77834:39;-1:-1:-1;77893:13:0;77834:39;77893:7;:13;:::i;:::-;77884:22;-1:-1:-1;77921:7:0;;77917:75;;77966:8;;77945:35;;77959:5;;77966:8;;;-1:-1:-1;;;;;77966:8:0;77976:3;77945:13;:35::i;:::-;;77917:75;77705:294;;;;;;:::o;67651:774::-;67850:11;67874:71;67894:11;67850;67916:14;67850:11;67874:19;:71::i;:::-;67970:20;67982:7;67970:11;:20::i;:::-;-1:-1:-1;67958:32:0;-1:-1:-1;68010:50:0;68021:5;68028:11;68041:10;67958:32;68010:10;:50::i;:::-;68001:59;;68128:1;68119:6;:10;68111:48;;;;-1:-1:-1;;;68111:48:0;;32098:2:1;68111:48:0;;;32080:21:1;32137:2;32117:18;;;32110:30;-1:-1:-1;;;32156:18:1;;;32149:55;32221:18;;68111:48:0;31896:349:1;68111:48:0;68172:22;68197:46;68216:10;68228:14;68235:6;68228;:14::i;:::-;72906:48;;;63677:1;72906:48;;;36254:49:1;36319:11;;;36312:27;;;;36395:3;36373:16;;;;-1:-1:-1;;;;;;36369:51:1;36355:12;;;36348:73;72906:48:0;;;;;;;;;36437:12:1;;;;72906:48:0;;;72777:185;68197:46;68172:71;;68254:94;68262:11;68275:9;68286:14;68302:18;68322:14;68338:9;68254:7;:94::i;:::-;68398:10;68391:5;-1:-1:-1;;;;;68366:51:0;68378:11;68366:51;;;68410:6;68366:51;;;;3598:25:1;;3586:2;3571:18;;3452:177;68366:51:0;;;;;;;;67863:562;67651:774;;;;;;;;;:::o;66173:419::-;66327:14;66343:11;66411:20;66434:47;66453:10;66465:15;66472:7;66465:6;:15::i;66434:47::-;66499:85;;-1:-1:-1;;;66499:85:0;;66411:70;;-1:-1:-1;;;;;;66499:10:0;:23;;;;:85;;66523:11;;66544:4;;66411:70;;66560:7;;66569:14;;66499:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66492:92;;;;;66173:419;;;;;;;;:::o;86355:120::-;85364:16;:14;:16::i;:::-;86414:7:::1;:15:::0;;-1:-1:-1;;86414:15:0::1;::::0;;86445:22:::1;4149:10:::0;86454:12:::1;86445:22;::::0;-1:-1:-1;;;;;11408:32:1;;;11390:51;;11378:2;11363:18;86445:22:0::1;;;;;;;86355:120::o:0;68855:911::-;69107:11;69131:82;69151:11;63726:1;69182:14;-1:-1:-1;;;;;69131:82:0;;:19;:82::i;:::-;69238:20;69250:7;69238:11;:20::i;:::-;-1:-1:-1;69226:32:0;-1:-1:-1;69278:50:0;69289:5;69296:11;69309:10;69226:32;69278:10;:50::i;:::-;69269:59;;69356:1;69347:6;:10;69339:48;;;;-1:-1:-1;;;69339:48:0;;32098:2:1;69339:48:0;;;32080:21:1;32137:2;32117:18;;;32110:30;-1:-1:-1;;;32156:18:1;;;32149:55;32221:18;;69339:48:0;31896:349:1;69339:48:0;69468:22;69493:91;69519:10;69531;69543:14;69550:6;69543;:14::i;:::-;69559:8;69569:14;69493:25;:91::i;:::-;69468:116;;69595:94;69603:11;69616:9;69627:14;69643:18;69663:14;69679:9;69595:7;:94::i;:::-;69739:10;69732:5;-1:-1:-1;;;;;69707:51:0;69719:11;69707:51;;;69751:6;69707:51;;;;3598:25:1;;3586:2;3571:18;;3452:177;69707:51:0;;;;;;;;69120:646;68855:911;;;;;;;;;;;:::o;67128:515::-;67280:16;67299:19;:8;67280:16;67299;:19::i;:::-;67280:38;-1:-1:-1;67335:21:0;;;67331:305;;67373:52;67382:11;67395;67408:6;67416:8;67373;:52::i;:::-;67331:305;;;67447:30;;;63726:1;67447:30;67443:193;;;67494:59;67510:11;67523;67536:6;67544:8;67494:15;:59::i;67443:193::-;67586:38;;-1:-1:-1;;;67586:38:0;;33349:2:1;67586:38:0;;;33331:21:1;33388:2;33368:18;;;33361:30;33427;33407:18;;;33400:58;33475:18;;67586:38:0;33147:352:1;19534:191:0;19608:16;19627:6;;-1:-1:-1;;;;;19644:17:0;;;-1:-1:-1;;;;;;19644:17:0;;;;;;19677:40;;19627:6;;;;;;;19677:40;;19608:16;19677:40;19597:128;19534:191;:::o;86096:118::-;85105:19;:17;:19::i;:::-;86156:7:::1;:14:::0;;-1:-1:-1;;86156:14:0::1;86166:4;86156:14;::::0;;86186:20:::1;86193:12;4149:10:::0;;4069:98;36281:2779;36422:12;36476:7;36460:12;36476:7;36470:2;36460:12;:::i;:::-;:23;;36452:50;;;;-1:-1:-1;;;36452:50:0;;33706:2:1;36452:50:0;;;33688:21:1;33745:2;33725:18;;;33718:30;-1:-1:-1;;;33764:18:1;;;33757:44;33818:18;;36452:50:0;33504:338:1;36452:50:0;36538:16;36547:7;36538:6;:16;:::i;:::-;36521:6;:13;:33;;36513:63;;;;-1:-1:-1;;;36513:63:0;;34049:2:1;36513:63:0;;;34031:21:1;34088:2;34068:18;;;34061:30;-1:-1:-1;;;34107:18:1;;;34100:47;34164:18;;36513:63:0;33847:341:1;36513:63:0;36589:22;36655:15;;36684:1933;;;;38761:4;38755:11;38742:24;;38942:1;38931:9;38924:20;38992:4;38981:9;38977:20;38971:4;38964:34;36648:2365;;36684:1933;36861:4;36855:11;36842:24;;37498:2;37489:7;37485:16;37870:9;37863:17;37857:4;37853:28;37841:9;37830;37826:25;37822:60;37919:7;37915:2;37911:16;38168:6;38154:9;38147:17;38141:4;38137:28;38125:9;38117:6;38113:22;38109:57;38105:70;37947:426;38202:3;38198:2;38195:11;37947:426;;;38344:9;;38333:21;;38244:4;38236:13;;;;38277;37947:426;;;-1:-1:-1;;38393:26:0;;;38597:2;38580:11;-1:-1:-1;;38576:25:0;38570:4;38563:39;-1:-1:-1;36648:2365:0;-1:-1:-1;39043:9:0;36281:2779;-1:-1:-1;;;;36281:2779:0:o;66600:520::-;66807:14;66823:11;66894:20;66917:92;66943:10;66955;66967:15;66974:7;66967:6;:15::i;66917:92::-;67027:85;;-1:-1:-1;;;67027:85:0;;66894:115;;-1:-1:-1;;;;;;67027:10:0;:23;;;;:85;;67051:11;;67072:4;;66894:115;;67088:7;;67097:14;;67027:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67020:92;;;;;66600:520;;;;;;;;;;:::o;83409:391::-;83509:4;4149:10;83659:4;-1:-1:-1;;;;;83642:22:0;;;;;;:42;;;83677:7;-1:-1:-1;;;;;83668:16:0;:5;-1:-1:-1;;;;;83668:16:0;;;83642:42;83638:88;;;83686:40;83702:5;83709:7;83718;83686:15;:40::i;:::-;83737:30;83747:5;83754:3;83759:7;83737:9;:30::i;:::-;-1:-1:-1;83785:7:0;;83409:391;-1:-1:-1;;;83409:391:0:o;53055:1275::-;53217:4;53223:12;53285:15;53311:13;53335:24;53372:8;53362:19;;-1:-1:-1;;;;;53362:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53362:19:0;;53335:46;;53863:1;53837;53803:9;53797:16;53768:4;53757:9;53753:20;53722:1;53687:7;53661:4;53642:247;53630:259;;53954:16;53943:27;;53999:8;53990:7;53987:21;53984:78;;;54039:8;54028:19;;53984:78;54145:7;54132:11;54125:28;54263:7;54260:1;54253:4;54240:11;54236:22;54221:50;54300:8;;;;-1:-1:-1;53055:1275:0;-1:-1:-1;;;;;;53055:1275:0:o;58854:323::-;59078:8;59068:19;;;;;;59017:14;:27;59032:11;59017:27;;;;;;;;;;;;;;;59045:11;59017:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59017:48:0;;;;;;;;;:70;;;;59103:66;;;;59117:11;;59130;;59058:6;;59151:8;;59161:7;;59103:66;:::i;:::-;;;;;;;;58854:323;;;;;:::o;71831:373::-;71973:22;;;;71969:228;;;72012:63;72027:11;72040:7;72049:14;72065:9;72012:14;:63::i;:::-;71969:228;;;72116:21;;:26;72108:77;;;;-1:-1:-1;;;72108:77:0;;35398:2:1;72108:77:0;;;35380:21:1;35437:2;35417:18;;;35410:30;35476:34;35456:18;;;35449:62;-1:-1:-1;;;35527:18:1;;;35520:36;35573:19;;72108:77:0;35196:402:1;72587:182:0;72653:16;;72700:22;83894:9;72700:7;:22;:::i;:::-;72693:29;-1:-1:-1;72747:14:0;72693:29;72747:7;:14;:::i;:::-;72733:28;;72587:182;;;:::o;87794:1156::-;87970:7;85105:19;:17;:19::i;:::-;87990:14:::1;88007:120;88038:5;88058:11;88084:10;88109:7;88007:16;:120::i;:::-;-1:-1:-1::0;;;;;88144:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;87990:137;;-1:-1:-1;88144:16:0::1;;88140:62;;;88184:6:::0;-1:-1:-1;88177:13:0::1;;88140:62;88276:39;::::0;::::1;88214:23;88276:39:::0;;;:26:::1;:39;::::0;;;;;88350:15:::1;88410:28;88431:6;88276:39:::0;88410:28:::1;:::i;:::-;88381:24;88398:6;88381:13:::0;:24:::1;:::i;:::-;88380:59;88376:213;;;88474:6;88456:24;;88376:213;;;88531:37;::::0;::::1;;::::0;;;:24:::1;:37;::::0;;;;;:46:::1;::::0;88571:6;;88531:46:::1;:::i;:::-;88513:64;;88376:213;88623:33;::::0;::::1;88601:19;88623:33:::0;;;:20:::1;:33;::::0;;;;;88671:29;;::::1;88667:116;;;88724:47;::::0;-1:-1:-1;;;88724:47:0;;::::1;::::0;::::1;6522:25:1::0;;;6563:18;;;6556:34;;;6495:18;;88724:47:0::1;6348:248:1::0;88667:116:0::1;-1:-1:-1::0;88795:37:0::1;::::0;::::1;;::::0;;;:24:::1;:37;::::0;;;;;;;:55;;;;88861:26:::1;:39:::0;;;;;;:55;;;;-1:-1:-1;88936:6:0;-1:-1:-1;87794:1156:0;;;;;;:::o;72212:238::-;72273:6;;72308:22;83894:9;72308:7;:22;:::i;:::-;72292:38;-1:-1:-1;;;;;;72349:28:0;;;72341:67;;;;-1:-1:-1;;;72341:67:0;;35922:2:1;72341:67:0;;;35904:21:1;35961:2;35941:18;;;35934:30;36000:28;35980:18;;;35973:56;36046:18;;72341:67:0;35720:350:1;47989:495:0;48212:32;;;48183:26;48212:32;;;:19;:32;;;;;48183:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48263:13;:20;48287:1;48263:25;;48255:86;;;;-1:-1:-1;;;48255:86:0;;36662:2:1;48255:86:0;;;36644:21:1;36701:2;36681:18;;;36674:30;36740:34;36720:18;;;36713:62;-1:-1:-1;;;36791:18:1;;;36784:46;36847:19;;48255:86:0;36460:412:1;48255:86:0;48352:124;;-1:-1:-1;;;48352:124:0;;-1:-1:-1;;;;;48352:10:0;:15;;;;48375:10;;48352:124;;48387:11;;48400:13;;48415:8;;48425:14;;48441:18;;48461:14;;48352:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48172:312;47989:495;;;;;;:::o;85844:108::-;85571:7;;;;85903:41;;;;-1:-1:-1;;;85903:41:0;;37924:2:1;85903:41:0;;;37906:21:1;37963:2;37943:18;;;37936:30;-1:-1:-1;;;37982:18:1;;;37975:50;38042:18;;85903:41:0;37722:344:1;73321:403:0;73486:12;63726:1;73580:10;73605:9;-1:-1:-1;;;;;74392:23:0;;73668:14;73697:8;73518:198;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73511:205;;73321:403;;;;;;;:::o;39439:311::-;39516:5;39559:10;:6;39568:1;39559:10;:::i;:::-;39542:6;:13;:27;;39534:60;;;;-1:-1:-1;;;39534:60:0;;38992:2:1;39534:60:0;;;38974:21:1;39031:2;39011:18;;;39004:30;-1:-1:-1;;;39050:18:1;;;39043:49;39109:18;;39534:60:0;38790:343:1;39534:60:0;-1:-1:-1;39674:29:0;39690:3;39674:29;39668:36;;39439:311::o;68433:414::-;68545:10;68557:15;68576:28;68595:8;68576:18;:28::i;:::-;68544:60;;-1:-1:-1;68544:60:0;-1:-1:-1;;;;;;68619:16:0;;68615:69;;68665:6;68652:20;;68615:69;68696:11;68710:16;68717:8;68710:6;:16::i;:::-;68696:30;;68746:34;68756:11;68769:2;68773:6;68746:9;:34::i;:::-;68737:43;;68828:2;-1:-1:-1;;;;;68798:41:0;68815:11;68798:41;;;68832:6;68798:41;;;;3598:25:1;;3586:2;3571:18;;3452:177;68798:41:0;;;;;;;;68533:314;;;68433:414;;;;:::o;69774:1923::-;69912:12;69926:10;69938:15;69955:27;69984:17;70005:35;70031:8;70005:25;:35::i;:::-;69911:129;;;;;;;;;;70053:34;70090:14;:27;70105:11;70090:27;;;;;;;;;;;;;;;70118:11;70090:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;70090:48:0;;;;;;;;;;;;70053:85;;;;;;;;;;;;;;;;;;;;;;;;;;70090:40;-1:-1:-1;70053:85:0;70306:243;;70359:16;70366:8;70359:6;:16::i;:::-;70350:25;;70399:45;70409:11;70430:4;70437:6;70399:9;:45::i;:::-;70510:27;;;;;;;;;;;70532:4;70510:27;;;;;;;;70459;;;-1:-1:-1;70459:27:0;;;:14;:27;;;;;;:40;;70390:54;;-1:-1:-1;70510:27:0;70459:40;;70487:11;;70459:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;70459:48:0;;;;;;;;;;:78;;;;;;;;;;;;;-1:-1:-1;;70459:78:0;;;;;;;;;;70306:243;-1:-1:-1;;;;;71791:20:0;;;70561:97;;70603:22;;-1:-1:-1;;;;;11408:32:1;;11390:51;;70603:22:0;;11378:2:1;11363:18;70603:22:0;;;;;;;70640:7;;;;;;;;;70561:97;71082:22;;;;70732:11;;70780;;70817:6;;70857:8;;70892:4;;70921:2;;70949:6;;70997:14;;70712:17;;71082:47;;71119:10;-1:-1:-1;;;;;71082:47:0;;;;71107:9;71082:47;71071:58;;71141:12;71155:19;71178:180;71212:9;71223:3;71251:31;;;71284:10;71296;71308:5;71315;71322:3;71327:7;71336:15;71353:3;71228:129;;;;;;;;;;;;;;;:::i;71178:180::-;71140:218;;;;71375:7;71371:319;;;71414:18;;;;;;71452:59;;;;;;;;;;71487:10;;71499:5;;71414:18;;71452:59;:::i;:::-;;;;;;;;71384:139;71371:319;;;71611:67;71631:10;71643;71655:5;71662:7;71671:6;71611:19;:67::i;:::-;69900:1797;;;;;;;;;;;;;;;;;;69774:1923;;;;:::o;85659:108::-;85571:7;;;;85729:9;85721:38;;;;-1:-1:-1;;;85721:38:0;;40624:2:1;85721:38:0;;;40606:21:1;40663:2;40643:18;;;40636:30;-1:-1:-1;;;40682:18:1;;;40675:46;40738:18;;85721:38:0;40422:340:1;48492:420:0;48628:21;48652:28;48665:14;48652:12;:28::i;:::-;48710;;;;48691:16;48710:28;;;:15;:28;;;;;;;;:35;;;;;;;;;;;;48628:52;;-1:-1:-1;48691:16:0;48710:47;;48748:9;;48710:47;:::i;:::-;48691:66;;48790:1;48776:11;:15;48768:54;;;;-1:-1:-1;;;48768:54:0;;40969:2:1;48768:54:0;;;40951:21:1;41008:2;40988:18;;;40981:30;41047:28;41027:18;;;41020:56;41093:18;;48768:54:0;40767:350:1;48768:54:0;48861:11;48841:16;:31;;48833:71;;;;-1:-1:-1;;;48833:71:0;;41324:2:1;48833:71:0;;;41306:21:1;41363:2;41343:18;;;41336:30;41402:29;41382:18;;;41375:57;41449:18;;48833:71:0;41122:351:1;82935:286:0;83036:4;4149:10;-1:-1:-1;;;;;83098:16:0;;;;83094:62;;83116:40;83132:5;83139:7;83148;83116:15;:40::i;:::-;83167:21;83173:5;83180:7;83167:5;:21::i;:::-;-1:-1:-1;83206:7:0;;82935:286;-1:-1:-1;;;;82935:286:0:o;72970:343::-;73052:10;;;73100:19;:8;73052:10;73100:16;:19::i;:::-;:30;;;:55;;;;;73134:8;:15;73153:2;73134:21;73100:55;73092:92;;;;-1:-1:-1;;;73092:92:0;;41680:2:1;73092:92:0;;;41662:21:1;41719:2;41699:18;;;41692:30;-1:-1:-1;;;41738:18:1;;;41731:54;41802:18;;73092:92:0;41478:348:1;73092:92:0;73202:22;:8;73221:2;73202:18;:22::i;:::-;73197:27;-1:-1:-1;73284:21:0;:8;73302:2;73284:17;:21::i;:::-;73273:32;;72970:343;;;:::o;72458:121::-;72523:4;72547:24;83894:9;-1:-1:-1;;;;;72547:24:0;;;:::i;88958:1154::-;89109:7;85105:19;:17;:19::i;:::-;89129:14:::1;89146:49;89162:11;89175:10;89187:7;89146:15;:49::i;:::-;-1:-1:-1::0;;;;;89212:21:0;::::1;;::::0;;;:9:::1;:21;::::0;;;;;89129:66;;-1:-1:-1;89212:21:0::1;;89208:67;;;89257:6:::0;-1:-1:-1;89250:13:0::1;;89208:67;89357:63;::::0;::::1;89287:27;89357:63:::0;;;:30:::1;:63;::::0;;;;;89455:15:::1;89515:32;89540:6;89357:63:::0;89515:32:::1;:::i;:::-;89486:24;89503:6;89486:13:::0;:24:::1;:::i;:::-;89485:63;89481:255;;;89587:6;89565:28;;89481:255;;;89661:41;::::0;::::1;;::::0;;;:28:::1;:41;::::0;;;;;:63:::1;::::0;89718:6;;89661:63:::1;:::i;:::-;89626:98;;89481:255;89769:32;::::0;::::1;89748:18;89769:32:::0;;;:19:::1;:32;::::0;;;;;89816;;::::1;89812:121;;;89872:49;::::0;-1:-1:-1;;;89872:49:0;;::::1;::::0;::::1;6522:25:1::0;;;6563:18;;;6556:34;;;6495:18;;89872:49:0::1;6348:248:1::0;89812:121:0::1;-1:-1:-1::0;89945:41:0::1;::::0;::::1;;::::0;;;:28:::1;:41;::::0;;;;;;;:63;;;;90019:30:::1;:43:::0;;;;;;:59;;;;-1:-1:-1;90098:6:0;-1:-1:-1;88958:1154:0;;;;;:::o;73732:541::-;73821:12;;;73864:20;73821:12;63726:1;73927:19;:8;73821:12;73927:16;:19::i;:::-;:39;;;73919:76;;;;-1:-1:-1;;;73919:76:0;;41680:2:1;73919:76:0;;;41662:21:1;41719:2;41699:18;;;41692:30;-1:-1:-1;;;41738:18:1;;;41731:54;41802:18;;73919:76:0;41478:348:1;73919:76:0;74013:22;:8;74032:2;74013:18;:22::i;:::-;74008:27;-1:-1:-1;74095:21:0;:8;74113:2;74095:17;:21::i;:::-;74084:32;-1:-1:-1;74134:22:0;:8;74153:2;74134:18;:22::i;:::-;74127:29;-1:-1:-1;74183:21:0;:8;74201:2;74183:17;:21::i;:::-;74167:37;;74225:40;74240:2;74262;74244:8;:15;:20;;;;:::i;:::-;74225:8;;:40;:14;:40::i;:::-;74215:50;;73732:541;;;;;;;:::o;48920:271::-;49002:13;49061:2;49036:14;:21;:27;;49028:68;;;;-1:-1:-1;;;49028:68:0;;42033:2:1;49028:68:0;;;42015:21:1;42072:2;42052:18;;;42045:30;42111;42091:18;;;42084:58;42159:18;;49028:68:0;41831:352:1;49028:68:0;-1:-1:-1;49169:2:0;49149:23;49143:30;;48920:271::o;13507:591::-;-1:-1:-1;;;;;13591:21:0;;13583:67;;;;-1:-1:-1;;;13583:67:0;;42390:2:1;13583:67:0;;;42372:21:1;42429:2;42409:18;;;42402:30;42468:34;42448:18;;;42441:62;-1:-1:-1;;;42519:18:1;;;42512:31;42560:19;;13583:67:0;42188:397:1;13583:67:0;-1:-1:-1;;;;;13750:18:0;;13725:22;13750:18;;;:9;:18;;;;;;13787:24;;;;13779:71;;;;-1:-1:-1;;;13779:71:0;;42792:2:1;13779:71:0;;;42774:21:1;42831:2;42811:18;;;42804:30;42870:34;42850:18;;;42843:62;-1:-1:-1;;;42921:18:1;;;42914:32;42963:19;;13779:71:0;42590:398:1;13779:71:0;-1:-1:-1;;;;;13886:18:0;;;;;;:9;:18;;;;;13907:23;;;13886:44;;13952:12;:22;;13924:6;;13886:18;13952:22;;13924:6;;13952:22;:::i;:::-;;;;-1:-1:-1;;13992:37:0;;3598:25:1;;;14018:1:0;;-1:-1:-1;;;;;13992:37:0;;;;;3586:2:1;3571:18;13992:37:0;;;;;;;16260:125;;;:::o;39068:363::-;39147:7;39192:11;:6;39201:2;39192:11;:::i;:::-;39175:6;:13;:28;;39167:62;;;;-1:-1:-1;;;39167:62:0;;43195:2:1;39167:62:0;;;43177:21:1;43234:2;43214:18;;;43207:30;-1:-1:-1;;;43253:18:1;;;43246:51;43314:18;;39167:62:0;42993:345:1;39167:62:0;-1:-1:-1;39321:30:0;39337:4;39321:30;39315:37;-1:-1:-1;;;39311:71:0;;;39068:363::o;40402:314::-;40480:6;40524:10;:6;40533:1;40524:10;:::i;:::-;40507:6;:13;:27;;40499:60;;;;-1:-1:-1;;;40499:60:0;;43545:2:1;40499:60:0;;;43527:21:1;43584:2;43564:18;;;43557:30;-1:-1:-1;;;43603:18:1;;;43596:50;43663:18;;40499:60:0;43343:344:1;40499:60:0;-1:-1:-1;40640:29:0;40656:3;40640:29;40634:36;;40402:314::o;83229:172::-;83325:4;83342:26;83348:10;83360:7;83342:5;:26::i;41703:329::-;41782:7;41827:11;:6;41836:2;41827:11;:::i;:::-;41810:6;:13;:28;;41802:62;;;;-1:-1:-1;;;41802:62:0;;43894:2:1;41802:62:0;;;43876:21:1;43933:2;43913:18;;;43906:30;-1:-1:-1;;;43952:18:1;;;43945:51;44013:18;;41802:62:0;43692:345:1;41802:62:0;-1:-1:-1;41952:30:0;41968:4;41952:30;41946:37;;41703:329::o;12775:399::-;-1:-1:-1;;;;;12859:21:0;;12851:65;;;;-1:-1:-1;;;12851:65:0;;44244:2:1;12851:65:0;;;44226:21:1;44283:2;44263:18;;;44256:30;44322:33;44302:18;;;44295:61;44373:18;;12851:65:0;44042:355:1;12851:65:0;13007:6;12991:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13024:18:0;;;;;;:9;:18;;;;;:28;;13046:6;;13024:18;:28;;13046:6;;13024:28;:::i;:::-;;;;-1:-1:-1;;13068:37:0;;3598:25:1;;;-1:-1:-1;;;;;13068:37:0;;;13085:1;;13068:37;;3586:2:1;3571:18;13068:37:0;;;;;;;12775:399;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:159:1;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:347::-;229:8;239:6;293:3;286:4;278:6;274:17;270:27;260:55;;311:1;308;301:12;260:55;-1:-1:-1;334:20:1;;-1:-1:-1;;;;;366:30:1;;363:50;;;409:1;406;399:12;363:50;446:4;438:6;434:17;422:29;;498:3;491:4;482:6;474;470:19;466:30;463:39;460:59;;;515:1;512;505:12;460:59;178:347;;;;;:::o;530:171::-;597:20;;-1:-1:-1;;;;;646:30:1;;636:41;;626:69;;691:1;688;681:12;706:862;812:6;820;828;836;844;852;905:3;893:9;884:7;880:23;876:33;873:53;;;922:1;919;912:12;873:53;945:28;963:9;945:28;:::i;:::-;935:38;;1024:2;1013:9;1009:18;996:32;-1:-1:-1;;;;;1088:2:1;1080:6;1077:14;1074:34;;;1104:1;1101;1094:12;1074:34;1143:58;1193:7;1184:6;1173:9;1169:22;1143:58;:::i;:::-;1220:8;;-1:-1:-1;1117:84:1;-1:-1:-1;1117:84:1;;-1:-1:-1;1274:37:1;1307:2;1292:18;;1274:37;:::i;:::-;1264:47;;1364:2;1353:9;1349:18;1336:32;1320:48;;1393:2;1383:8;1380:16;1377:36;;;1409:1;1406;1399:12;1377:36;;1448:60;1500:7;1489:8;1478:9;1474:24;1448:60;:::i;:::-;706:862;;;;-1:-1:-1;706:862:1;;-1:-1:-1;706:862:1;;1527:8;;706:862;-1:-1:-1;;;706:862:1:o;1573:286::-;1631:6;1684:2;1672:9;1663:7;1659:23;1655:32;1652:52;;;1700:1;1697;1690:12;1652:52;1726:23;;-1:-1:-1;;;;;;1778:32:1;;1768:43;;1758:71;;1825:1;1822;1815:12;2056:258;2128:1;2138:113;2152:6;2149:1;2146:13;2138:113;;;2228:11;;;2222:18;2209:11;;;2202:39;2174:2;2167:10;2138:113;;;2269:6;2266:1;2263:13;2260:48;;;-1:-1:-1;;2304:1:1;2286:16;;2279:27;2056:258::o;2319:::-;2361:3;2399:5;2393:12;2426:6;2421:3;2414:19;2442:63;2498:6;2491:4;2486:3;2482:14;2475:4;2468:5;2464:16;2442:63;:::i;:::-;2559:2;2538:15;-1:-1:-1;;2534:29:1;2525:39;;;;2566:4;2521:50;;2319:258;-1:-1:-1;;2319:258:1:o;2582:220::-;2731:2;2720:9;2713:21;2694:4;2751:45;2792:2;2781:9;2777:18;2769:6;2751:45;:::i;2807:184::-;2865:6;2918:2;2906:9;2897:7;2893:23;2889:32;2886:52;;;2934:1;2931;2924:12;2886:52;2957:28;2975:9;2957:28;:::i;2996:131::-;-1:-1:-1;;;;;3071:31:1;;3061:42;;3051:70;;3117:1;3114;3107:12;3132:315;3200:6;3208;3261:2;3249:9;3240:7;3236:23;3232:32;3229:52;;;3277:1;3274;3267:12;3229:52;3316:9;3303:23;3335:31;3360:5;3335:31;:::i;:::-;3385:5;3437:2;3422:18;;;;3409:32;;-1:-1:-1;;;3132:315:1:o;3634:456::-;3711:6;3719;3727;3780:2;3768:9;3759:7;3755:23;3751:32;3748:52;;;3796:1;3793;3786:12;3748:52;3835:9;3822:23;3854:31;3879:5;3854:31;:::i;:::-;3904:5;-1:-1:-1;3961:2:1;3946:18;;3933:32;3974:33;3933:32;3974:33;:::i;:::-;3634:456;;4026:7;;-1:-1:-1;;;4080:2:1;4065:18;;;;4052:32;;3634:456::o;4095:160::-;4160:5;4205:2;4196:6;4191:3;4187:16;4183:25;4180:45;;;4221:1;4218;4211:12;4180:45;-1:-1:-1;4243:6:1;4095:160;-1:-1:-1;4095:160:1:o;4260:780::-;4395:6;4403;4411;4419;4427;4435;4488:3;4476:9;4467:7;4463:23;4459:33;4456:53;;;4505:1;4502;4495:12;4456:53;4544:9;4531:23;4563:31;4588:5;4563:31;:::i;:::-;4613:5;-1:-1:-1;4637:37:1;4670:2;4655:18;;4637:37;:::i;:::-;4627:47;;4721:2;4710:9;4706:18;4693:32;4683:42;;4772:2;4761:9;4757:18;4744:32;4734:42;;4823:3;4812:9;4808:19;4795:33;4785:43;;4879:3;4868:9;4864:19;4851:33;-1:-1:-1;;;;;4899:6:1;4896:30;4893:50;;;4939:1;4936;4929:12;4893:50;4962:72;5026:7;5017:6;5006:9;5002:22;4962:72;:::i;:::-;4952:82;;;4260:780;;;;;;;;:::o;5234:252::-;5301:6;5309;5362:2;5350:9;5341:7;5337:23;5333:32;5330:52;;;5378:1;5375;5368:12;5330:52;5401:28;5419:9;5401:28;:::i;5491:160::-;5556:20;;5612:13;;5605:21;5595:32;;5585:60;;5641:1;5638;5631:12;5656:687;5758:6;5766;5774;5782;5790;5798;5851:3;5839:9;5830:7;5826:23;5822:33;5819:53;;;5868:1;5865;5858:12;5819:53;5891:28;5909:9;5891:28;:::i;:::-;5881:38;;5966:2;5955:9;5951:18;5938:32;5928:42;;6017:2;6006:9;6002:18;5989:32;5979:42;;6040:35;6071:2;6060:9;6056:18;6040:35;:::i;:::-;6030:45;;6126:3;6115:9;6111:19;6098:33;-1:-1:-1;;;;;6146:6:1;6143:30;6140:50;;;6186:1;6183;6176:12;6140:50;6225:58;6275:7;6266:6;6255:9;6251:22;6225:58;:::i;6601:481::-;6679:6;6687;6695;6748:2;6736:9;6727:7;6723:23;6719:32;6716:52;;;6764:1;6761;6754:12;6716:52;6787:28;6805:9;6787:28;:::i;:::-;6777:38;;6866:2;6855:9;6851:18;6838:32;-1:-1:-1;;;;;6885:6:1;6882:30;6879:50;;;6925:1;6922;6915:12;6879:50;6964:58;7014:7;7005:6;6994:9;6990:22;6964:58;:::i;:::-;6601:481;;7041:8;;-1:-1:-1;6938:84:1;;-1:-1:-1;;;;6601:481:1:o;7087:1162::-;7250:6;7258;7266;7274;7282;7290;7298;7306;7314;7367:3;7355:9;7346:7;7342:23;7338:33;7335:53;;;7384:1;7381;7374:12;7335:53;7423:9;7410:23;7442:31;7467:5;7442:31;:::i;:::-;7492:5;-1:-1:-1;7516:37:1;7549:2;7534:18;;7516:37;:::i;:::-;7506:47;;7600:2;7589:9;7585:18;7572:32;7562:42;;7651:2;7640:9;7636:18;7623:32;7613:42;;7702:3;7691:9;7687:19;7674:33;7664:43;;7758:3;7747:9;7743:19;7730:33;-1:-1:-1;;;;;7823:2:1;7815:6;7812:14;7809:34;;;7839:1;7836;7829:12;7809:34;7878:58;7928:7;7919:6;7908:9;7904:22;7878:58;:::i;:::-;7955:8;;-1:-1:-1;7852:84:1;-1:-1:-1;7852:84:1;;-1:-1:-1;8009:38:1;8042:3;8027:19;;8009:38;:::i;:::-;7999:48;;8100:3;8089:9;8085:19;8072:33;8056:49;;8130:2;8120:8;8117:16;8114:36;;;8146:1;8143;8136:12;8114:36;;8169:74;8235:7;8224:8;8213:9;8209:24;8169:74;:::i;:::-;8159:84;;;7087:1162;;;;;;;;;;;:::o;8254:247::-;8313:6;8366:2;8354:9;8345:7;8341:23;8337:32;8334:52;;;8382:1;8379;8372:12;8334:52;8421:9;8408:23;8440:31;8465:5;8440:31;:::i;8506:315::-;8571:6;8579;8632:2;8620:9;8611:7;8607:23;8603:32;8600:52;;;8648:1;8645;8638:12;8600:52;8687:9;8674:23;8706:31;8731:5;8706:31;:::i;:::-;8756:5;-1:-1:-1;8780:35:1;8811:2;8796:18;;8780:35;:::i;:::-;8770:45;;8506:315;;;;;:::o;8826:127::-;8887:10;8882:3;8878:20;8875:1;8868:31;8918:4;8915:1;8908:15;8942:4;8939:1;8932:15;8958:275;9029:2;9023:9;9094:2;9075:13;;-1:-1:-1;;9071:27:1;9059:40;;-1:-1:-1;;;;;9114:34:1;;9150:22;;;9111:62;9108:88;;;9176:18;;:::i;:::-;9212:2;9205:22;8958:275;;-1:-1:-1;8958:275:1:o;9238:186::-;9286:4;-1:-1:-1;;;;;9311:6:1;9308:30;9305:56;;;9341:18;;:::i;:::-;-1:-1:-1;9407:2:1;9386:15;-1:-1:-1;;9382:29:1;9413:4;9378:40;;9238:186::o;9429:815::-;9513:6;9521;9529;9582:2;9570:9;9561:7;9557:23;9553:32;9550:52;;;9598:1;9595;9588:12;9550:52;9621:28;9639:9;9621:28;:::i;:::-;9611:38;;9700:2;9689:9;9685:18;9672:32;-1:-1:-1;;;;;9719:6:1;9716:30;9713:50;;;9759:1;9756;9749:12;9713:50;9782:22;;9835:4;9827:13;;9823:27;-1:-1:-1;9813:55:1;;9864:1;9861;9854:12;9813:55;9900:2;9887:16;9925:48;9941:31;9969:2;9941:31;:::i;:::-;9925:48;:::i;:::-;9996:2;9989:5;9982:17;10036:7;10031:2;10026;10022;10018:11;10014:20;10011:33;10008:53;;;10057:1;10054;10047:12;10008:53;10112:2;10107;10103;10099:11;10094:2;10087:5;10083:14;10070:45;10156:1;10151:2;10146;10139:5;10135:14;10131:23;10124:34;10177:5;10167:15;;;;;10201:37;10234:2;10223:9;10219:18;10201:37;:::i;:::-;10191:47;;9429:815;;;;;:::o;10654:324::-;10726:6;10734;10742;10795:2;10783:9;10774:7;10770:23;10766:32;10763:52;;;10811:1;10808;10801:12;10763:52;10834:28;10852:9;10834:28;:::i;:::-;10824:38;;10881:35;10912:2;10901:9;10897:18;10881:35;:::i;:::-;10871:45;;10935:37;10968:2;10957:9;10953:18;10935:37;:::i;10983:256::-;11049:6;11057;11110:2;11098:9;11089:7;11085:23;11081:32;11078:52;;;11126:1;11123;11116:12;11078:52;11149:28;11167:9;11149:28;:::i;:::-;11139:38;;11196:37;11229:2;11218:9;11214:18;11196:37;:::i;11452:1069::-;11582:6;11590;11598;11606;11614;11622;11630;11638;11646;11699:3;11687:9;11678:7;11674:23;11670:33;11667:53;;;11716:1;11713;11706:12;11667:53;11739:28;11757:9;11739:28;:::i;:::-;11729:38;;11814:2;11803:9;11799:18;11786:32;11776:42;;11865:2;11854:9;11850:18;11837:32;11827:42;;11920:2;11909:9;11905:18;11892:32;-1:-1:-1;;;;;11984:2:1;11976:6;11973:14;11970:34;;;12000:1;11997;11990:12;11970:34;12039:58;12089:7;12080:6;12069:9;12065:22;12039:58;:::i;:::-;12116:8;;-1:-1:-1;12013:84:1;-1:-1:-1;12013:84:1;;-1:-1:-1;12170:38:1;12203:3;12188:19;;12170:38;:::i;:::-;12160:48;;12227:36;12258:3;12247:9;12243:19;12227:36;:::i;:::-;12217:46;;12316:3;12305:9;12301:19;12288:33;12272:49;;12346:2;12336:8;12333:16;12330:36;;;12362:1;12359;12352:12;12330:36;;12401:60;12453:7;12442:8;12431:9;12427:24;12401:60;:::i;:::-;12375:86;;12480:8;12470:18;;;12507:8;12497:18;;;11452:1069;;;;;;;;;;;:::o;13034:622::-;13129:6;13137;13145;13153;13161;13214:3;13202:9;13193:7;13189:23;13185:33;13182:53;;;13231:1;13228;13221:12;13182:53;13254:28;13272:9;13254:28;:::i;:::-;13244:38;;13301:37;13334:2;13323:9;13319:18;13301:37;:::i;:::-;13291:47;;13385:2;13374:9;13370:18;13357:32;13347:42;;13440:2;13429:9;13425:18;13412:32;-1:-1:-1;;;;;13459:6:1;13456:30;13453:50;;;13499:1;13496;13489:12;13453:50;13538:58;13588:7;13579:6;13568:9;13564:22;13538:58;:::i;:::-;13034:622;;;;-1:-1:-1;13034:622:1;;-1:-1:-1;13615:8:1;;13512:84;13034:622;-1:-1:-1;;;13034:622:1:o;14117:388::-;14185:6;14193;14246:2;14234:9;14225:7;14221:23;14217:32;14214:52;;;14262:1;14259;14252:12;14214:52;14301:9;14288:23;14320:31;14345:5;14320:31;:::i;:::-;14370:5;-1:-1:-1;14427:2:1;14412:18;;14399:32;14440:33;14399:32;14440:33;:::i;:::-;14492:7;14482:17;;;14117:388;;;;;:::o;14510:324::-;14585:6;14593;14601;14654:2;14642:9;14633:7;14629:23;14625:32;14622:52;;;14670:1;14667;14660:12;14622:52;14693:28;14711:9;14693:28;:::i;:::-;14683:38;;14740:37;14773:2;14762:9;14758:18;14740:37;:::i;:::-;14730:47;;14824:2;14813:9;14809:18;14796:32;14786:42;;14510:324;;;;;:::o;14839:180::-;14895:6;14948:2;14936:9;14927:7;14923:23;14919:32;14916:52;;;14964:1;14961;14954:12;14916:52;14987:26;15003:9;14987:26;:::i;15024:1205::-;15166:6;15174;15182;15190;15198;15206;15214;15222;15230;15238;15291:3;15279:9;15270:7;15266:23;15262:33;15259:53;;;15308:1;15305;15298:12;15259:53;15331:28;15349:9;15331:28;:::i;:::-;15321:38;;15410:2;15399:9;15395:18;15382:32;-1:-1:-1;;;;;15474:2:1;15466:6;15463:14;15460:34;;;15490:1;15487;15480:12;15460:34;15529:58;15579:7;15570:6;15559:9;15555:22;15529:58;:::i;:::-;15606:8;;-1:-1:-1;15503:84:1;-1:-1:-1;15503:84:1;;-1:-1:-1;15660:37:1;15693:2;15678:18;;15660:37;:::i;:::-;15650:47;;15744:2;15733:9;15729:18;15716:32;15706:42;;15798:3;15787:9;15783:19;15770:33;15757:46;;15812:31;15837:5;15812:31;:::i;:::-;15862:5;;-1:-1:-1;15914:3:1;15899:19;;15886:33;;-1:-1:-1;15972:3:1;15957:19;;15944:33;;15989:16;;;15986:36;;;16018:1;16015;16008:12;15986:36;;16057:60;16109:7;16098:8;16087:9;16083:24;16057:60;:::i;:::-;16031:86;;16136:8;16126:18;;;16163:8;16153:18;;;16218:3;16207:9;16203:19;16190:33;16180:43;;15024:1205;;;;;;;;;;;;;:::o;16234:460::-;16318:6;16326;16334;16342;16395:3;16383:9;16374:7;16370:23;16366:33;16363:53;;;16412:1;16409;16402:12;16363:53;16435:28;16453:9;16435:28;:::i;:::-;16425:38;;16482:37;16515:2;16504:9;16500:18;16482:37;:::i;:::-;16472:47;;16569:2;16558:9;16554:18;16541:32;16582:31;16607:5;16582:31;:::i;:::-;16234:460;;;;-1:-1:-1;16632:5:1;;16684:2;16669:18;16656:32;;-1:-1:-1;;16234:460:1:o;17058:380::-;17137:1;17133:12;;;;17180;;;17201:61;;17255:4;17247:6;17243:17;17233:27;;17201:61;17308:2;17300:6;17297:14;17277:18;17274:38;17271:161;;;17354:10;17349:3;17345:20;17342:1;17335:31;17389:4;17386:1;17379:15;17417:4;17414:1;17407:15;17443:271;17626:6;17618;17613:3;17600:33;17582:3;17652:16;;17677:13;;;17652:16;17443:271;-1:-1:-1;17443:271:1:o;18386:521::-;18463:4;18469:6;18529:11;18516:25;18623:2;18619:7;18608:8;18592:14;18588:29;18584:43;18564:18;18560:68;18550:96;;18642:1;18639;18632:12;18550:96;18669:33;;18721:20;;;-1:-1:-1;;;;;;18753:30:1;;18750:50;;;18796:1;18793;18786:12;18750:50;18829:4;18817:17;;-1:-1:-1;18860:14:1;18856:27;;;18846:38;;18843:58;;;18897:1;18894;18887:12;18912:409;19114:2;19096:21;;;19153:2;19133:18;;;19126:30;19192:34;19187:2;19172:18;;19165:62;-1:-1:-1;;;19258:2:1;19243:18;;19236:43;19311:3;19296:19;;18912:409::o;19326:127::-;19387:10;19382:3;19378:20;19375:1;19368:31;19418:4;19415:1;19408:15;19442:4;19439:1;19432:15;19458:128;19498:3;19529:1;19525:6;19522:1;19519:13;19516:39;;;19535:18;;:::i;:::-;-1:-1:-1;19571:9:1;;19458:128::o;19591:266::-;19679:6;19674:3;19667:19;19731:6;19724:5;19717:4;19712:3;19708:14;19695:43;-1:-1:-1;19783:1:1;19758:16;;;19776:4;19754:27;;;19747:38;;;;19839:2;19818:15;;;-1:-1:-1;;19814:29:1;19805:39;;;19801:50;;19591:266::o;19862:326::-;20057:6;20049;20045:19;20034:9;20027:38;20101:2;20096;20085:9;20081:18;20074:30;20008:4;20121:61;20178:2;20167:9;20163:18;20155:6;20147;20121:61;:::i;20548:401::-;20750:2;20732:21;;;20789:2;20769:18;;;20762:30;20828:34;20823:2;20808:18;;20801:62;-1:-1:-1;;;20894:2:1;20879:18;;20872:35;20939:3;20924:19;;20548:401::o;22092:125::-;22132:4;22160:1;22157;22154:8;22151:34;;;22165:18;;:::i;:::-;-1:-1:-1;22202:9:1;;22092:125::o;22628:382::-;22839:6;22831;22826:3;22813:33;22931:2;22927:15;;;;-1:-1:-1;;22923:53:1;22865:16;;22912:65;;;23001:2;22993:11;;22628:382;-1:-1:-1;22628:382:1:o;23015:498::-;23215:4;23244:6;23289:2;23281:6;23277:15;23266:9;23259:34;23341:2;23333:6;23329:15;23324:2;23313:9;23309:18;23302:43;;23381:6;23376:2;23365:9;23361:18;23354:34;23424:3;23419:2;23408:9;23404:18;23397:31;23445:62;23502:3;23491:9;23487:19;23479:6;23471;23445:62;:::i;:::-;23437:70;23015:498;-1:-1:-1;;;;;;;23015:498:1:o;24324:493::-;24573:6;24565;24561:19;24550:9;24543:38;24617:3;24612:2;24601:9;24597:18;24590:31;24524:4;24638:62;24695:3;24684:9;24680:19;24672:6;24664;24638:62;:::i;:::-;-1:-1:-1;;;;;24736:31:1;;;;24731:2;24716:18;;24709:59;-1:-1:-1;24799:2:1;24784:18;24777:34;24630:70;24324:493;-1:-1:-1;;;24324:493:1:o;25895:753::-;26228:6;26220;26216:19;26205:9;26198:38;26272:3;26267:2;26256:9;26252:18;26245:31;26179:4;26299:62;26356:3;26345:9;26341:19;26333:6;26325;26299:62;:::i;:::-;-1:-1:-1;;;;;26401:6:1;26397:31;26392:2;26381:9;26377:18;26370:59;26465:6;26460:2;26449:9;26445:18;26438:34;26509:6;26503:3;26492:9;26488:19;26481:35;26565:9;26557:6;26553:22;26547:3;26536:9;26532:19;26525:51;26593:49;26635:6;26627;26619;26593:49;:::i;:::-;26585:57;25895:753;-1:-1:-1;;;;;;;;;;;25895:753:1:o;26653:168::-;26693:7;26759:1;26755;26751:6;26747:14;26744:1;26741:21;26736:1;26729:9;26722:17;26718:45;26715:71;;;26766:18;;:::i;:::-;-1:-1:-1;26806:9:1;;26653:168::o;26826:127::-;26887:10;26882:3;26878:20;26875:1;26868:31;26918:4;26915:1;26908:15;26942:4;26939:1;26932:15;26958:120;26998:1;27024;27014:35;;27029:18;;:::i;:::-;-1:-1:-1;27063:9:1;;26958:120::o;27951:634::-;28030:6;28083:2;28071:9;28062:7;28058:23;28054:32;28051:52;;;28099:1;28096;28089:12;28051:52;28132:9;28126:16;-1:-1:-1;;;;;28157:6:1;28154:30;28151:50;;;28197:1;28194;28187:12;28151:50;28220:22;;28273:4;28265:13;;28261:27;-1:-1:-1;28251:55:1;;28302:1;28299;28292:12;28251:55;28331:2;28325:9;28356:48;28372:31;28400:2;28372:31;:::i;28356:48::-;28427:2;28420:5;28413:17;28467:7;28462:2;28457;28453;28449:11;28445:20;28442:33;28439:53;;;28488:1;28485;28478:12;28439:53;28501:54;28552:2;28547;28540:5;28536:14;28531:2;28527;28523:11;28501:54;:::i;:::-;28574:5;27951:634;-1:-1:-1;;;;;27951:634:1:o;28590:557::-;28847:6;28839;28835:19;28824:9;28817:38;28891:3;28886:2;28875:9;28871:18;28864:31;28798:4;28918:46;28959:3;28948:9;28944:19;28936:6;28918:46;:::i;:::-;-1:-1:-1;;;;;29004:6:1;29000:31;28995:2;28984:9;28980:18;28973:59;29080:9;29072:6;29068:22;29063:2;29052:9;29048:18;29041:50;29108:33;29134:6;29126;29108:33;:::i;32250:642::-;32531:6;32519:19;;32501:38;;-1:-1:-1;;;;;32575:32:1;;32570:2;32555:18;;32548:60;32595:3;32639:2;32624:18;;32617:31;;;-1:-1:-1;;32671:46:1;;32697:19;;32689:6;32671:46;:::i;:::-;32767:6;32760:14;32753:22;32748:2;32737:9;32733:18;32726:50;32825:9;32817:6;32813:22;32807:3;32796:9;32792:19;32785:51;32853:33;32879:6;32871;32853:33;:::i;:::-;32845:41;32250:642;-1:-1:-1;;;;;;;;32250:642:1:o;32897:245::-;32976:6;32984;33037:2;33025:9;33016:7;33012:23;33008:32;33005:52;;;33053:1;33050;33043:12;33005:52;-1:-1:-1;;33076:16:1;;33132:2;33117:18;;;33111:25;33076:16;;33111:25;;-1:-1:-1;32897:245:1:o;34193:274::-;34322:3;34360:6;34354:13;34376:53;34422:6;34417:3;34410:4;34402:6;34398:17;34376:53;:::i;:::-;34445:16;;;;;34193:274;-1:-1:-1;;34193:274:1:o;34472:719::-;34775:6;34767;34763:19;34752:9;34745:38;34819:3;34814:2;34803:9;34799:18;34792:31;34726:4;34846:46;34887:3;34876:9;34872:19;34864:6;34846:46;:::i;:::-;-1:-1:-1;;;;;34932:6:1;34928:31;34923:2;34912:9;34908:18;34901:59;35008:9;35000:6;34996:22;34991:2;34980:9;34976:18;34969:50;35042:33;35068:6;35060;35042:33;:::i;:::-;35028:47;;35124:9;35116:6;35112:22;35106:3;35095:9;35091:19;35084:51;35152:33;35178:6;35170;35152:33;:::i;35603:112::-;35635:1;35661;35651:35;;35666:18;;:::i;:::-;-1:-1:-1;35700:9:1;;35603:112::o;36877:840::-;37226:6;37218;37214:19;37203:9;37196:38;37270:3;37265:2;37254:9;37250:18;37243:31;37177:4;37297:46;37338:3;37327:9;37323:19;37315:6;37297:46;:::i;:::-;37391:9;37383:6;37379:22;37374:2;37363:9;37359:18;37352:50;37425:33;37451:6;37443;37425:33;:::i;:::-;-1:-1:-1;;;;;37532:15:1;;;37527:2;37512:18;;37505:43;37585:15;;37579:3;37564:19;;37557:44;37638:22;;;37485:3;37617:19;;37610:51;37411:47;-1:-1:-1;37678:33:1;37411:47;37696:6;37678:33;:::i;:::-;37670:41;36877:840;-1:-1:-1;;;;;;;;;36877:840:1:o;38071:714::-;38393:3;38388;38384:13;38375:6;38370:3;38366:16;38362:36;38357:3;38350:49;38428:6;38424:1;38419:3;38415:11;38408:27;38332:3;-1:-1:-1;;;;;38458:3:1;38454:28;38534:2;38525:6;38520:3;38516:16;38512:25;38507:2;38502:3;38498:12;38491:47;38568:6;38563:2;38558:3;38554:12;38547:28;38627:2;38618:6;38613:3;38609:16;38605:25;38600:2;38595:3;38591:12;38584:47;;38660:6;38654:13;38676:62;38731:6;38726:2;38721:3;38717:12;38710:4;38702:6;38698:17;38676:62;:::i;:::-;38758:16;;;;38776:2;38754:25;;38071:714;-1:-1:-1;;;;;;;38071:714:1:o;39138:891::-;39458:4;39487:3;39529:6;39521;39517:19;39506:9;39499:38;39573:2;39568;39557:9;39553:18;39546:30;39599:45;39640:2;39629:9;39625:18;39617:6;39599:45;:::i;:::-;-1:-1:-1;;;;;39680:31:1;;39675:2;39660:18;;39653:59;39743:2;39728:18;;39721:34;;;-1:-1:-1;;;;;39792:32:1;;39786:3;39771:19;;39764:61;39812:3;39841:19;;39834:35;;;39906:22;;;39900:3;39885:19;;39878:51;39585:59;-1:-1:-1;39946:33:1;39585:59;39964:6;39946:33;:::i;:::-;39938:41;;;40016:6;40010:3;39999:9;39995:19;39988:35;39138:891;;;;;;;;;;;:::o;40034:383::-;40235:2;40224:9;40217:21;40198:4;40255:45;40296:2;40285:9;40281:18;40273:6;40255:45;:::i;:::-;-1:-1:-1;;;;;40336:31:1;;;;40331:2;40316:18;;40309:59;-1:-1:-1;40399:2:1;40384:18;40377:34;40247:53;40034:383;-1:-1:-1;40034:383:1:o
Swarm Source
ipfs://8d01f6c8ab82d843943fb212fc4ae7e672093db816a7cedc5feb9359d61779b3
Loading...
Loading
OVERVIEW
PancakeSwap is a yield farming project whereby users can get FLIP (LP token) for staking and get CAKE token as reward. CAKE holders can swap CAKE for SYRUP for additional incentivized staking.Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.