Source Code
Overview
MOVR Balance
MOVR Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 4420755 | 966 days ago | 0.05 MOVR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LayerZeroTesttsfkk
Compiler Version
v0.8.14+commit.80d49f37
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.14;
//import "@layerzerolabs/solidity-examples/contracts/lzApp/NonblockingLzApp.sol";
import "@layerzerolabs/solidity-examples/contracts/lzApp/NonblockingLzApp.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract LayerZeroTesttsfkk is NonblockingLzApp, ERC20 {
uint16 destChainId;
constructor(uint16 _destChainId, address _lzEndpoint, uint _supply, string memory _short, string memory _long) NonblockingLzApp(_lzEndpoint) ERC20(_long, _short) {
destChainId = _destChainId;
_mint(msg.sender, _supply * 10 ** decimals());
}
function _nonblockingLzReceive(uint16, bytes memory, uint64, bytes memory _payload) internal override {
(address toAddress, uint amount) = abi.decode(_payload, (address, uint));
_mint(toAddress, amount);
}
function bridge(uint _amount) public payable {
uint amount = _amount * 10 ** decimals();
_burn(msg.sender, amount);
bytes memory payload = abi.encode(msg.sender, amount);
_lzSend(destChainId, payload, payable(msg.sender), address(0x0), bytes(""), msg.value);
}
function trustAddress(address _otherContract) public onlyOwner {
trustedRemoteLookup[destChainId] = abi.encodePacked(_otherContract, address(this));
}
// ----------
function tsfkk() public pure returns (string memory)
{
string memory randomStr='181';
return randomStr;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
import "./ILayerZeroUserApplicationConfig.sol";
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);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
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;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
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;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "../interfaces/ILayerZeroReceiver.sol";
import "../interfaces/ILayerZeroUserApplicationConfig.sol";
import "../interfaces/ILayerZeroEndpoint.sol";
import "../util/BytesLib.sol";
/*
* a generic LzReceiver implementation
*/
abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig {
using BytesLib for bytes;
// ua can not send payload larger than this by default, but it can be changed by the ua owner
uint constant public DEFAULT_PAYLOAD_SIZE_LIMIT = 10000;
ILayerZeroEndpoint public immutable lzEndpoint;
mapping(uint16 => bytes) public trustedRemoteLookup;
mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup;
mapping(uint16 => uint) public payloadSizeLimitLookup;
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");
_checkPayloadSize(_dstChainId, _payload.length);
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))
}
}
function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual {
uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId];
if (payloadSizeLimit == 0) { // use default if not set
payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT;
}
require(_payloadSize <= payloadSizeLimit, "LzApp: payload size is too large");
}
//---------------------------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);
}
// if the size is 0, it means default size limit
function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner {
payloadSizeLimitLookup[_dstChainId] = _size;
}
//--------------------------- VIEW FUNCTION ----------------------------------------
function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) {
bytes memory trustedSource = trustedRemoteLookup[_srcChainId];
return keccak256(trustedSource) == keccak256(_srcAddress);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./LzApp.sol";
import "../util/ExcessivelySafeCall.sol";
/*
* 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);
}
}// SPDX-License-Identifier: Unlicense /* * @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. */ pragma solidity >=0.8.0 <0.9.0; 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; } }
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.7.6;
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)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.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);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.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.openzeppelin.com/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;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_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;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_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;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_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 {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint16","name":"_destChainId","type":"uint16"},{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"string","name":"_short","type":"string"},{"internalType":"string","name":"_long","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":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":"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":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":"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":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"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"bridge","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":[{"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":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"payloadSizeLimitLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"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":"_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":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setPayloadSizeLimit","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_otherContract","type":"address"}],"name":"trustAddress","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":"tsfkk","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]Contract Creation Code
60a06040523480156200001157600080fd5b50604051620056e7380380620056e78339818101604052810190620000379190620006a2565b808285806200005b6200004f6200012960201b60201c565b6200013160201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050508160099080519060200190620000a992919062000376565b5080600a9080519060200190620000c292919062000376565b50505084600b60006101000a81548161ffff021916908361ffff1602179055506200011e33620000f7620001f560201b60201c565b600a620001059190620008f8565b8562000112919062000949565b620001fe60201b60201c565b505050505062000b1c565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000270576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002679062000a0b565b60405180910390fd5b62000284600083836200036c60201b60201c565b806008600082825462000298919062000a2d565b9250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200034c919062000a9b565b60405180910390a362000368600083836200037160201b60201c565b5050565b505050565b505050565b828054620003849062000ae7565b90600052602060002090601f016020900481019282620003a85760008555620003f4565b82601f10620003c357805160ff1916838001178555620003f4565b82800160010185558215620003f4579182015b82811115620003f3578251825591602001919060010190620003d6565b5b50905062000403919062000407565b5090565b5b808211156200042257600081600090555060010162000408565b5090565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b62000453816200043a565b81146200045f57600080fd5b50565b600081519050620004738162000448565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004a68262000479565b9050919050565b620004b88162000499565b8114620004c457600080fd5b50565b600081519050620004d881620004ad565b92915050565b6000819050919050565b620004f381620004de565b8114620004ff57600080fd5b50565b6000815190506200051381620004e8565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200056e8262000523565b810181811067ffffffffffffffff8211171562000590576200058f62000534565b5b80604052505050565b6000620005a562000426565b9050620005b3828262000563565b919050565b600067ffffffffffffffff821115620005d657620005d562000534565b5b620005e18262000523565b9050602081019050919050565b60005b838110156200060e578082015181840152602081019050620005f1565b838111156200061e576000848401525b50505050565b60006200063b6200063584620005b8565b62000599565b9050828152602081018484840111156200065a57620006596200051e565b5b62000667848285620005ee565b509392505050565b600082601f83011262000687576200068662000519565b5b81516200069984826020860162000624565b91505092915050565b600080600080600060a08688031215620006c157620006c062000430565b5b6000620006d18882890162000462565b9550506020620006e488828901620004c7565b9450506040620006f78882890162000502565b935050606086015167ffffffffffffffff8111156200071b576200071a62000435565b5b62000729888289016200066f565b925050608086015167ffffffffffffffff8111156200074d576200074c62000435565b5b6200075b888289016200066f565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620007f657808604811115620007ce57620007cd62000768565b5b6001851615620007de5780820291505b8081029050620007ee8562000797565b9450620007ae565b94509492505050565b600082620008115760019050620008e4565b81620008215760009050620008e4565b81600181146200083a576002811462000845576200087b565b6001915050620008e4565b60ff8411156200085a576200085962000768565b5b8360020a91508482111562000874576200087362000768565b5b50620008e4565b5060208310610133831016604e8410600b8410161715620008b55782820a905083811115620008af57620008ae62000768565b5b620008e4565b620008c48484846001620007a4565b92509050818404811115620008de57620008dd62000768565b5b81810290505b9392505050565b600060ff82169050919050565b60006200090582620004de565b91506200091283620008eb565b9250620009417fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620007ff565b905092915050565b60006200095682620004de565b91506200096383620004de565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200099f576200099e62000768565b5b828202905092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620009f3601f83620009aa565b915062000a0082620009bb565b602082019050919050565b6000602082019050818103600083015262000a2681620009e4565b9050919050565b600062000a3a82620004de565b915062000a4783620004de565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a7f5762000a7e62000768565b5b828201905092915050565b62000a9581620004de565b82525050565b600060208201905062000ab2600083018462000a8a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b0057607f821691505b60208210810362000b165762000b1562000ab8565b5b50919050565b608051614b7e62000b696000396000818161097301528181610c6301528181610d4801528181610f86015281816116b60152818161176b01528181611c8b01526127100152614b7e6000f3fe60806040526004361061022f5760003560e01c80637533d7881161012e578063b353aaa7116100ab578063dd62ed3e1161006f578063dd62ed3e1461087c578063df2a5b3b146108b9578063eb8d72b7146108e2578063f2fde38b1461090b578063f5ecbdbc146109345761022f565b8063b353aaa7146107b8578063baf3292d146107e3578063c44618341461080c578063cbed8b9c14610837578063d1deba1f146108605761022f565b806395d89b41116100f257806395d89b41146106ad5780639f38369a146106d8578063a457c2d714610715578063a6c3d16514610752578063a9059cbb1461077b5761022f565b80637533d788146105c15780638cfd8f5c146105fe5780638da5cb5b1461063b57806390fd50b314610666578063950c8a74146106825761022f565b806332c7f381116101bc5780635b8c41e6116101805780635b8c41e6146104de5780635cdf16491461051b57806366ad5c8a1461054457806370a082311461056d578063715018a6146105aa5761022f565b806332c7f381146103d357806339509351146103fe5780633d8b38f61461043b5780633f1f4fa41461047857806342d65a8d146104b55761022f565b80630df37483116102035780630df37483146102ee57806310ddb1371461031757806318160ddd1461034057806323b872dd1461036b578063313ce567146103a85761022f565b80621d35671461023457806306fdde031461025d57806307e0db1714610288578063095ea7b3146102b1575b600080fd5b34801561024057600080fd5b5061025b60048036038101906102569190612e04565b610971565b005b34801561026957600080fd5b50610272610bc7565b60405161027f9190612f44565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190612f66565b610c59565b005b3480156102bd57600080fd5b506102d860048036038101906102d39190613027565b610cef565b6040516102e59190613082565b60405180910390f35b3480156102fa57600080fd5b506103156004803603810190610310919061309d565b610d12565b005b34801561032357600080fd5b5061033e60048036038101906103399190612f66565b610d3e565b005b34801561034c57600080fd5b50610355610dd4565b60405161036291906130ec565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d9190613107565b610dde565b60405161039f9190613082565b60405180910390f35b3480156103b457600080fd5b506103bd610e0d565b6040516103ca9190613176565b60405180910390f35b3480156103df57600080fd5b506103e8610e16565b6040516103f59190612f44565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613027565b610e59565b6040516104329190613082565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190613191565b610e90565b60405161046f9190613082565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190612f66565b610f64565b6040516104ac91906130ec565b60405180910390f35b3480156104c157600080fd5b506104dc60048036038101906104d79190613191565b610f7c565b005b3480156104ea57600080fd5b5061050560048036038101906105009190613321565b611018565b60405161051291906133a9565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d91906133c4565b611060565b005b34801561055057600080fd5b5061056b60048036038101906105669190612e04565b6110cc565b005b34801561057957600080fd5b50610594600480360381019061058f91906133c4565b6111dd565b6040516105a191906130ec565b60405180910390f35b3480156105b657600080fd5b506105bf611226565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190612f66565b61123a565b6040516105f59190613446565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190613468565b6112da565b60405161063291906130ec565b60405180910390f35b34801561064757600080fd5b506106506112ff565b60405161065d91906134b7565b60405180910390f35b610680600480360381019061067b91906134d2565b611328565b005b34801561068e57600080fd5b506106976113ae565b6040516106a491906134b7565b60405180910390f35b3480156106b957600080fd5b506106c26113d4565b6040516106cf9190612f44565b60405180910390f35b3480156106e457600080fd5b506106ff60048036038101906106fa9190612f66565b611466565b60405161070c9190613446565b60405180910390f35b34801561072157600080fd5b5061073c60048036038101906107379190613027565b61157f565b6040516107499190613082565b60405180910390f35b34801561075e57600080fd5b5061077960048036038101906107749190613191565b6115f6565b005b34801561078757600080fd5b506107a2600480360381019061079d9190613027565b611691565b6040516107af9190613082565b60405180910390f35b3480156107c457600080fd5b506107cd6116b4565b6040516107da919061355e565b60405180910390f35b3480156107ef57600080fd5b5061080a600480360381019061080591906133c4565b6116d8565b005b34801561081857600080fd5b5061082161175b565b60405161082e91906130ec565b60405180910390f35b34801561084357600080fd5b5061085e60048036038101906108599190613579565b611761565b005b61087a60048036038101906108759190612e04565b611803565b005b34801561088857600080fd5b506108a3600480360381019061089e9190613601565b611a46565b6040516108b091906130ec565b60405180910390f35b3480156108c557600080fd5b506108e060048036038101906108db9190613641565b611acd565b005b3480156108ee57600080fd5b5061090960048036038101906109049190613191565b611b91565b005b34801561091757600080fd5b50610932600480360381019061092d91906133c4565b611c04565b005b34801561094057600080fd5b5061095b60048036038101906109569190613694565b611c87565b6040516109689190613446565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166109b0611d38565b73ffffffffffffffffffffffffffffffffffffffff1614610a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fd90613747565b60405180910390fd5b6000600160008861ffff1661ffff1681526020019081526020016000208054610a2e90613796565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5a90613796565b8015610aa75780601f10610a7c57610100808354040283529160200191610aa7565b820191906000526020600020905b815481529060010190602001808311610a8a57829003601f168201915b50505050509050805186869050148015610ac2575060008151115b8015610aeb575080805190602001208686604051610ae19291906137f7565b6040518091039020145b610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190613882565b60405180910390fd5b610bbe8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611d40565b50505050505050565b606060098054610bd690613796565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0290613796565b8015610c4f5780601f10610c2457610100808354040283529160200191610c4f565b820191906000526020600020905b815481529060010190602001808311610c3257829003601f168201915b5050505050905090565b610c61611e0b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610cba91906138b1565b600060405180830381600087803b158015610cd457600080fd5b505af1158015610ce8573d6000803e3d6000fd5b5050505050565b600080610cfa611d38565b9050610d07818585611e89565b600191505092915050565b610d1a611e0b565b80600360008461ffff1661ffff168152602001908152602001600020819055505050565b610d46611e0b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610d9f91906138b1565b600060405180830381600087803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b5050505050565b6000600854905090565b600080610de9611d38565b9050610df6858285612052565b610e018585856120de565b60019150509392505050565b60006012905090565b606060006040518060400160405280600381526020017f313831000000000000000000000000000000000000000000000000000000000081525090508091505090565b600080610e64611d38565b9050610e85818585610e768589611a46565b610e8091906138fb565b611e89565b600191505092915050565b600080600160008661ffff1661ffff1681526020019081526020016000208054610eb990613796565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee590613796565b8015610f325780601f10610f0757610100808354040283529160200191610f32565b820191906000526020600020905b815481529060010190602001808311610f1557829003601f168201915b505050505090508383604051610f499291906137f7565b60405180910390208180519060200120149150509392505050565b60036020528060005260406000206000915090505481565b610f84611e0b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b8152600401610fe19392919061397e565b600060405180830381600087803b158015610ffb57600080fd5b505af115801561100f573d6000803e3d6000fd5b50505050505050565b60056020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050505481565b611068611e0b565b803060405160200161107b9291906139f8565b60405160208183030381529060405260016000600b60009054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002090805190602001906110c8929190612be8565b5050565b3073ffffffffffffffffffffffffffffffffffffffff166110eb611d38565b73ffffffffffffffffffffffffffffffffffffffff1614611141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113890613a96565b60405180910390fd5b6111d58686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612357565b505050505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61122e611e0b565b6112386000612384565b565b6001602052806000526040600020600091509050805461125990613796565b80601f016020809104026020016040519081016040528092919081815260200182805461128590613796565b80156112d25780601f106112a7576101008083540402835291602001916112d2565b820191906000526020600020905b8154815290600101906020018083116112b557829003601f168201915b505050505081565b6002602052816000526040600020602052806000526040600020600091509150505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611332610e0d565b600a61133e9190613be9565b826113499190613c34565b90506113553382612448565b6000338260405160200161136a929190613c8e565b60405160208183030381529060405290506113a9600b60009054906101000a900461ffff16823360006040518060200160405280600081525034612617565b505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a80546113e390613796565b80601f016020809104026020016040519081016040528092919081815260200182805461140f90613796565b801561145c5780601f106114315761010080835404028352916020019161145c565b820191906000526020600020905b81548152906001019060200180831161143f57829003601f168201915b5050505050905090565b60606000600160008461ffff1661ffff168152602001908152602001600020805461149090613796565b80601f01602080910402602001604051908101604052809291908181526020018280546114bc90613796565b80156115095780601f106114de57610100808354040283529160200191611509565b820191906000526020600020905b8154815290600101906020018083116114ec57829003601f168201915b505050505090506000815103611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b90613d03565b60405180910390fd5b6115776000601483516115679190613d23565b836127ad9092919063ffffffff16565b915050919050565b60008061158a611d38565b905060006115988286611a46565b9050838110156115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d490613dc9565b60405180910390fd5b6115ea8286868403611e89565b60019250505092915050565b6115fe611e0b565b81813060405160200161161393929190613de9565b604051602081830303815290604052600160008561ffff1661ffff1681526020019081526020016000209080519060200190611650929190612be8565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce8383836040516116849392919061397e565b60405180910390a1505050565b60008061169c611d38565b90506116a98185856120de565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6116e0611e0b565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b8160405161175091906134b7565b60405180910390a150565b61271081565b611769611e0b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b81526004016117ca959493929190613e13565b600060405180830381600087803b1580156117e457600080fd5b505af11580156117f8573d6000803e3d6000fd5b505050505050505050565b6000600560008861ffff1661ffff16815260200190815260200160002086866040516118309291906137f7565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000205490506000801b81036118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a290613ed3565b60405180910390fd5b8083836040516118bc9291906137f7565b604051809103902014611904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fb90613f65565b60405180910390fd5b6000801b600560008961ffff1661ffff16815260200190815260200160002087876040516119339291906137f7565b908152602001604051809103902060008667ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055506119fe8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612357565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611a35959493929190613f94565b60405180910390a150505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611ad5611e0b565b60008111611b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0f9061402e565b60405180910390fd5b80600260008561ffff1661ffff16815260200190815260200160002060008461ffff1661ffff168152602001908152602001600020819055507f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac0838383604051611b849392919061404e565b60405180910390a1505050565b611b99611e0b565b8181600160008661ffff1661ffff1681526020019081526020016000209190611bc3929190612c6e565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611bf79392919061397e565b60405180910390a1505050565b611c0c611e0b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c72906140f7565b60405180910390fd5b611c8481612384565b50565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc868630866040518563ffffffff1660e01b8152600401611ce89493929190614117565b600060405180830381865afa158015611d05573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611d2e91906141cc565b9050949350505050565b600033905090565b600080611dec5a60966366ad5c8a60e01b89898989604051602401611d689493929190614215565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050503073ffffffffffffffffffffffffffffffffffffffff166128cb909392919063ffffffff16565b9150915081611e0357611e028686868685612963565b5b505050505050565b611e13611d38565b73ffffffffffffffffffffffffffffffffffffffff16611e316112ff565b73ffffffffffffffffffffffffffffffffffffffff1614611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e906142b4565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eef90614346565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5e906143d8565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161204591906130ec565b60405180910390a3505050565b600061205e8484611a46565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120d857818110156120ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c190614444565b60405180910390fd5b6120d78484848403611e89565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361214d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612144906144d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b390614568565b60405180910390fd5b6121c7838383612a11565b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561224e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612245906145fa565b60405180910390fd5b818103600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161233e91906130ec565b60405180910390a3612351848484612a16565b50505050565b6000808280602001905181019061236e919061466d565b9150915061237c8282612a1b565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ae9061471f565b60405180910390fd5b6124c382600083612a11565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561254a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612541906147b1565b60405180910390fd5b818103600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600860008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125fe91906130ec565b60405180910390a361261283600084612a16565b505050565b6000600160008861ffff1661ffff168152602001908152602001600020805461263f90613796565b80601f016020809104026020016040519081016040528092919081815260200182805461266b90613796565b80156126b85780601f1061268d576101008083540402835291602001916126b8565b820191906000526020600020905b81548152906001019060200180831161269b57829003601f168201915b505050505090506000815103612703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fa90614843565b60405180910390fd5b61270e878751612b72565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c58031008389848a8a8a8a6040518863ffffffff1660e01b815260040161277296959493929190614872565b6000604051808303818588803b15801561278b57600080fd5b505af115801561279f573d6000803e3d6000fd5b505050505050505050505050565b606081601f836127bd91906138fb565b10156127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f590614934565b60405180910390fd5b818361280a91906138fb565b8451101561284d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612844906149a0565b60405180910390fd5b606082156000811461286e57604051915060008252602082016040526128bf565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156128ac578051835260208301925060208101905061288f565b50868552601f19601f8301166040525050505b50809150509392505050565b6000606060008060008661ffff1667ffffffffffffffff8111156128f2576128f16131f6565b5b6040519080825280601f01601f1916602001820160405280156129245781602001600182028036833780820191505090505b50905060008087516020890160008d8df191503d925086831115612946578692505b828152826000602083013e81819450945050505094509492505050565b8180519060200120600560008761ffff1661ffff1681526020019081526020016000208560405161299491906149f1565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055507fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c8585858585604051612a02959493929190614a08565b60405180910390a15050505050565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8190614abc565b60405180910390fd5b612a9660008383612a11565b8060086000828254612aa891906138fb565b9250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b5a91906130ec565b60405180910390a3612b6e60008383612a16565b5050565b6000600360008461ffff1661ffff16815260200190815260200160002054905060008103612ba05761271090505b80821115612be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bda90614b28565b60405180910390fd5b505050565b828054612bf490613796565b90600052602060002090601f016020900481019282612c165760008555612c5d565b82601f10612c2f57805160ff1916838001178555612c5d565b82800160010185558215612c5d579182015b82811115612c5c578251825591602001919060010190612c41565b5b509050612c6a9190612cf4565b5090565b828054612c7a90613796565b90600052602060002090601f016020900481019282612c9c5760008555612ce3565b82601f10612cb557803560ff1916838001178555612ce3565b82800160010185558215612ce3579182015b82811115612ce2578235825591602001919060010190612cc7565b5b509050612cf09190612cf4565b5090565b5b80821115612d0d576000816000905550600101612cf5565b5090565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b612d3c81612d25565b8114612d4757600080fd5b50565b600081359050612d5981612d33565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612d8457612d83612d5f565b5b8235905067ffffffffffffffff811115612da157612da0612d64565b5b602083019150836001820283011115612dbd57612dbc612d69565b5b9250929050565b600067ffffffffffffffff82169050919050565b612de181612dc4565b8114612dec57600080fd5b50565b600081359050612dfe81612dd8565b92915050565b60008060008060008060808789031215612e2157612e20612d1b565b5b6000612e2f89828a01612d4a565b965050602087013567ffffffffffffffff811115612e5057612e4f612d20565b5b612e5c89828a01612d6e565b95509550506040612e6f89828a01612def565b935050606087013567ffffffffffffffff811115612e9057612e8f612d20565b5b612e9c89828a01612d6e565b92509250509295509295509295565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ee5578082015181840152602081019050612eca565b83811115612ef4576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f1682612eab565b612f208185612eb6565b9350612f30818560208601612ec7565b612f3981612efa565b840191505092915050565b60006020820190508181036000830152612f5e8184612f0b565b905092915050565b600060208284031215612f7c57612f7b612d1b565b5b6000612f8a84828501612d4a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fbe82612f93565b9050919050565b612fce81612fb3565b8114612fd957600080fd5b50565b600081359050612feb81612fc5565b92915050565b6000819050919050565b61300481612ff1565b811461300f57600080fd5b50565b60008135905061302181612ffb565b92915050565b6000806040838503121561303e5761303d612d1b565b5b600061304c85828601612fdc565b925050602061305d85828601613012565b9150509250929050565b60008115159050919050565b61307c81613067565b82525050565b60006020820190506130976000830184613073565b92915050565b600080604083850312156130b4576130b3612d1b565b5b60006130c285828601612d4a565b92505060206130d385828601613012565b9150509250929050565b6130e681612ff1565b82525050565b600060208201905061310160008301846130dd565b92915050565b6000806000606084860312156131205761311f612d1b565b5b600061312e86828701612fdc565b935050602061313f86828701612fdc565b925050604061315086828701613012565b9150509250925092565b600060ff82169050919050565b6131708161315a565b82525050565b600060208201905061318b6000830184613167565b92915050565b6000806000604084860312156131aa576131a9612d1b565b5b60006131b886828701612d4a565b935050602084013567ffffffffffffffff8111156131d9576131d8612d20565b5b6131e586828701612d6e565b92509250509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61322e82612efa565b810181811067ffffffffffffffff8211171561324d5761324c6131f6565b5b80604052505050565b6000613260612d11565b905061326c8282613225565b919050565b600067ffffffffffffffff82111561328c5761328b6131f6565b5b61329582612efa565b9050602081019050919050565b82818337600083830152505050565b60006132c46132bf84613271565b613256565b9050828152602081018484840111156132e0576132df6131f1565b5b6132eb8482856132a2565b509392505050565b600082601f83011261330857613307612d5f565b5b81356133188482602086016132b1565b91505092915050565b60008060006060848603121561333a57613339612d1b565b5b600061334886828701612d4a565b935050602084013567ffffffffffffffff81111561336957613368612d20565b5b613375868287016132f3565b925050604061338686828701612def565b9150509250925092565b6000819050919050565b6133a381613390565b82525050565b60006020820190506133be600083018461339a565b92915050565b6000602082840312156133da576133d9612d1b565b5b60006133e884828501612fdc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000613418826133f1565b61342281856133fc565b9350613432818560208601612ec7565b61343b81612efa565b840191505092915050565b60006020820190508181036000830152613460818461340d565b905092915050565b6000806040838503121561347f5761347e612d1b565b5b600061348d85828601612d4a565b925050602061349e85828601612d4a565b9150509250929050565b6134b181612fb3565b82525050565b60006020820190506134cc60008301846134a8565b92915050565b6000602082840312156134e8576134e7612d1b565b5b60006134f684828501613012565b91505092915050565b6000819050919050565b600061352461351f61351a84612f93565b6134ff565b612f93565b9050919050565b600061353682613509565b9050919050565b60006135488261352b565b9050919050565b6135588161353d565b82525050565b6000602082019050613573600083018461354f565b92915050565b60008060008060006080868803121561359557613594612d1b565b5b60006135a388828901612d4a565b95505060206135b488828901612d4a565b94505060406135c588828901613012565b935050606086013567ffffffffffffffff8111156135e6576135e5612d20565b5b6135f288828901612d6e565b92509250509295509295909350565b6000806040838503121561361857613617612d1b565b5b600061362685828601612fdc565b925050602061363785828601612fdc565b9150509250929050565b60008060006060848603121561365a57613659612d1b565b5b600061366886828701612d4a565b935050602061367986828701612d4a565b925050604061368a86828701613012565b9150509250925092565b600080600080608085870312156136ae576136ad612d1b565b5b60006136bc87828801612d4a565b94505060206136cd87828801612d4a565b93505060406136de87828801612fdc565b92505060606136ef87828801613012565b91505092959194509250565b7f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c65720000600082015250565b6000613731601e83612eb6565b915061373c826136fb565b602082019050919050565b6000602082019050818103600083015261376081613724565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137ae57607f821691505b6020821081036137c1576137c0613767565b5b50919050565b600081905092915050565b60006137de83856137c7565b93506137eb8385846132a2565b82840190509392505050565b60006138048284866137d2565b91508190509392505050565b7f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b600061386c602683612eb6565b915061387782613810565b604082019050919050565b6000602082019050818103600083015261389b8161385f565b9050919050565b6138ab81612d25565b82525050565b60006020820190506138c660008301846138a2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061390682612ff1565b915061391183612ff1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613946576139456138cc565b5b828201905092915050565b600061395d83856133fc565b935061396a8385846132a2565b61397383612efa565b840190509392505050565b600060408201905061399360008301866138a2565b81810360208301526139a6818486613951565b9050949350505050565b60008160601b9050919050565b60006139c8826139b0565b9050919050565b60006139da826139bd565b9050919050565b6139f26139ed82612fb3565b6139cf565b82525050565b6000613a0482856139e1565b601482019150613a1482846139e1565b6014820191508190509392505050565b7f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d75737420626560008201527f204c7a4170700000000000000000000000000000000000000000000000000000602082015250565b6000613a80602683612eb6565b9150613a8b82613a24565b604082019050919050565b60006020820190508181036000830152613aaf81613a73565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115613b0d57808604811115613ae957613ae86138cc565b5b6001851615613af85780820291505b8081029050613b0685613ab6565b9450613acd565b94509492505050565b600082613b265760019050613be2565b81613b345760009050613be2565b8160018114613b4a5760028114613b5457613b83565b6001915050613be2565b60ff841115613b6657613b656138cc565b5b8360020a915084821115613b7d57613b7c6138cc565b5b50613be2565b5060208310610133831016604e8410600b8410161715613bb85782820a905083811115613bb357613bb26138cc565b5b613be2565b613bc58484846001613ac3565b92509050818404811115613bdc57613bdb6138cc565b5b81810290505b9392505050565b6000613bf482612ff1565b9150613bff8361315a565b9250613c2c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613b16565b905092915050565b6000613c3f82612ff1565b9150613c4a83612ff1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c8357613c826138cc565b5b828202905092915050565b6000604082019050613ca360008301856134a8565b613cb060208301846130dd565b9392505050565b7f4c7a4170703a206e6f20747275737465642070617468207265636f7264000000600082015250565b6000613ced601d83612eb6565b9150613cf882613cb7565b602082019050919050565b60006020820190508181036000830152613d1c81613ce0565b9050919050565b6000613d2e82612ff1565b9150613d3983612ff1565b925082821015613d4c57613d4b6138cc565b5b828203905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613db3602583612eb6565b9150613dbe82613d57565b604082019050919050565b60006020820190508181036000830152613de281613da6565b9050919050565b6000613df68285876137d2565b9150613e0282846139e1565b601482019150819050949350505050565b6000608082019050613e2860008301886138a2565b613e3560208301876138a2565b613e4260408301866130dd565b8181036060830152613e55818486613951565b90509695505050505050565b7f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360008201527f6167650000000000000000000000000000000000000000000000000000000000602082015250565b6000613ebd602383612eb6565b9150613ec882613e61565b604082019050919050565b60006020820190508181036000830152613eec81613eb0565b9050919050565b7f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f6160008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f4f602183612eb6565b9150613f5a82613ef3565b604082019050919050565b60006020820190508181036000830152613f7e81613f42565b9050919050565b613f8e81612dc4565b82525050565b6000608082019050613fa960008301886138a2565b8181036020830152613fbc818688613951565b9050613fcb6040830185613f85565b613fd8606083018461339a565b9695505050505050565b7f4c7a4170703a20696e76616c6964206d696e4761730000000000000000000000600082015250565b6000614018601583612eb6565b915061402382613fe2565b602082019050919050565b600060208201905081810360008301526140478161400b565b9050919050565b600060608201905061406360008301866138a2565b61407060208301856138a2565b61407d60408301846130dd565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006140e1602683612eb6565b91506140ec82614085565b604082019050919050565b60006020820190508181036000830152614110816140d4565b9050919050565b600060808201905061412c60008301876138a2565b61413960208301866138a2565b61414660408301856134a8565b61415360608301846130dd565b95945050505050565b600061416f61416a84613271565b613256565b90508281526020810184848401111561418b5761418a6131f1565b5b614196848285612ec7565b509392505050565b600082601f8301126141b3576141b2612d5f565b5b81516141c384826020860161415c565b91505092915050565b6000602082840312156141e2576141e1612d1b565b5b600082015167ffffffffffffffff811115614200576141ff612d20565b5b61420c8482850161419e565b91505092915050565b600060808201905061422a60008301876138a2565b818103602083015261423c818661340d565b905061424b6040830185613f85565b818103606083015261425d818461340d565b905095945050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061429e602083612eb6565b91506142a982614268565b602082019050919050565b600060208201905081810360008301526142cd81614291565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614330602483612eb6565b915061433b826142d4565b604082019050919050565b6000602082019050818103600083015261435f81614323565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006143c2602283612eb6565b91506143cd82614366565b604082019050919050565b600060208201905081810360008301526143f1816143b5565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061442e601d83612eb6565b9150614439826143f8565b602082019050919050565b6000602082019050818103600083015261445d81614421565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006144c0602583612eb6565b91506144cb82614464565b604082019050919050565b600060208201905081810360008301526144ef816144b3565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614552602383612eb6565b915061455d826144f6565b604082019050919050565b6000602082019050818103600083015261458181614545565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006145e4602683612eb6565b91506145ef82614588565b604082019050919050565b60006020820190508181036000830152614613816145d7565b9050919050565b600061462582612f93565b9050919050565b6146358161461a565b811461464057600080fd5b50565b6000815190506146528161462c565b92915050565b60008151905061466781612ffb565b92915050565b6000806040838503121561468457614683612d1b565b5b600061469285828601614643565b92505060206146a385828601614658565b9150509250929050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614709602183612eb6565b9150614714826146ad565b604082019050919050565b60006020820190508181036000830152614738816146fc565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061479b602283612eb6565b91506147a68261473f565b604082019050919050565b600060208201905081810360008301526147ca8161478e565b9050919050565b7f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060008201527f61207472757374656420736f7572636500000000000000000000000000000000602082015250565b600061482d603083612eb6565b9150614838826147d1565b604082019050919050565b6000602082019050818103600083015261485c81614820565b9050919050565b61486c8161461a565b82525050565b600060c08201905061488760008301896138a2565b8181036020830152614899818861340d565b905081810360408301526148ad818761340d565b90506148bc6060830186614863565b6148c960808301856134a8565b81810360a08301526148db818461340d565b9050979650505050505050565b7f736c6963655f6f766572666c6f77000000000000000000000000000000000000600082015250565b600061491e600e83612eb6565b9150614929826148e8565b602082019050919050565b6000602082019050818103600083015261494d81614911565b9050919050565b7f736c6963655f6f75744f66426f756e6473000000000000000000000000000000600082015250565b600061498a601183612eb6565b915061499582614954565b602082019050919050565b600060208201905081810360008301526149b98161497d565b9050919050565b60006149cb826133f1565b6149d581856137c7565b93506149e5818560208601612ec7565b80840191505092915050565b60006149fd82846149c0565b915081905092915050565b600060a082019050614a1d60008301886138a2565b8181036020830152614a2f818761340d565b9050614a3e6040830186613f85565b8181036060830152614a50818561340d565b90508181036080830152614a64818461340d565b90509695505050505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614aa6601f83612eb6565b9150614ab182614a70565b602082019050919050565b60006020820190508181036000830152614ad581614a99565b9050919050565b7f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c61726765600082015250565b6000614b12602083612eb6565b9150614b1d82614adc565b602082019050919050565b60006020820190508181036000830152614b4181614b05565b905091905056fea26469706673582212206df7af7773b778fce38869337a36d9f65d9bdb7d09ba2244594c61e9cde8578264736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000700000000000000000000000007004396c99d5690da76a7c59057c5f3a53e017040000000000000000000000000000000000000000000000000000000005affb7b00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003766b69000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076d4c56516a487200000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061022f5760003560e01c80637533d7881161012e578063b353aaa7116100ab578063dd62ed3e1161006f578063dd62ed3e1461087c578063df2a5b3b146108b9578063eb8d72b7146108e2578063f2fde38b1461090b578063f5ecbdbc146109345761022f565b8063b353aaa7146107b8578063baf3292d146107e3578063c44618341461080c578063cbed8b9c14610837578063d1deba1f146108605761022f565b806395d89b41116100f257806395d89b41146106ad5780639f38369a146106d8578063a457c2d714610715578063a6c3d16514610752578063a9059cbb1461077b5761022f565b80637533d788146105c15780638cfd8f5c146105fe5780638da5cb5b1461063b57806390fd50b314610666578063950c8a74146106825761022f565b806332c7f381116101bc5780635b8c41e6116101805780635b8c41e6146104de5780635cdf16491461051b57806366ad5c8a1461054457806370a082311461056d578063715018a6146105aa5761022f565b806332c7f381146103d357806339509351146103fe5780633d8b38f61461043b5780633f1f4fa41461047857806342d65a8d146104b55761022f565b80630df37483116102035780630df37483146102ee57806310ddb1371461031757806318160ddd1461034057806323b872dd1461036b578063313ce567146103a85761022f565b80621d35671461023457806306fdde031461025d57806307e0db1714610288578063095ea7b3146102b1575b600080fd5b34801561024057600080fd5b5061025b60048036038101906102569190612e04565b610971565b005b34801561026957600080fd5b50610272610bc7565b60405161027f9190612f44565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190612f66565b610c59565b005b3480156102bd57600080fd5b506102d860048036038101906102d39190613027565b610cef565b6040516102e59190613082565b60405180910390f35b3480156102fa57600080fd5b506103156004803603810190610310919061309d565b610d12565b005b34801561032357600080fd5b5061033e60048036038101906103399190612f66565b610d3e565b005b34801561034c57600080fd5b50610355610dd4565b60405161036291906130ec565b60405180910390f35b34801561037757600080fd5b50610392600480360381019061038d9190613107565b610dde565b60405161039f9190613082565b60405180910390f35b3480156103b457600080fd5b506103bd610e0d565b6040516103ca9190613176565b60405180910390f35b3480156103df57600080fd5b506103e8610e16565b6040516103f59190612f44565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613027565b610e59565b6040516104329190613082565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190613191565b610e90565b60405161046f9190613082565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190612f66565b610f64565b6040516104ac91906130ec565b60405180910390f35b3480156104c157600080fd5b506104dc60048036038101906104d79190613191565b610f7c565b005b3480156104ea57600080fd5b5061050560048036038101906105009190613321565b611018565b60405161051291906133a9565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d91906133c4565b611060565b005b34801561055057600080fd5b5061056b60048036038101906105669190612e04565b6110cc565b005b34801561057957600080fd5b50610594600480360381019061058f91906133c4565b6111dd565b6040516105a191906130ec565b60405180910390f35b3480156105b657600080fd5b506105bf611226565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190612f66565b61123a565b6040516105f59190613446565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190613468565b6112da565b60405161063291906130ec565b60405180910390f35b34801561064757600080fd5b506106506112ff565b60405161065d91906134b7565b60405180910390f35b610680600480360381019061067b91906134d2565b611328565b005b34801561068e57600080fd5b506106976113ae565b6040516106a491906134b7565b60405180910390f35b3480156106b957600080fd5b506106c26113d4565b6040516106cf9190612f44565b60405180910390f35b3480156106e457600080fd5b506106ff60048036038101906106fa9190612f66565b611466565b60405161070c9190613446565b60405180910390f35b34801561072157600080fd5b5061073c60048036038101906107379190613027565b61157f565b6040516107499190613082565b60405180910390f35b34801561075e57600080fd5b5061077960048036038101906107749190613191565b6115f6565b005b34801561078757600080fd5b506107a2600480360381019061079d9190613027565b611691565b6040516107af9190613082565b60405180910390f35b3480156107c457600080fd5b506107cd6116b4565b6040516107da919061355e565b60405180910390f35b3480156107ef57600080fd5b5061080a600480360381019061080591906133c4565b6116d8565b005b34801561081857600080fd5b5061082161175b565b60405161082e91906130ec565b60405180910390f35b34801561084357600080fd5b5061085e60048036038101906108599190613579565b611761565b005b61087a60048036038101906108759190612e04565b611803565b005b34801561088857600080fd5b506108a3600480360381019061089e9190613601565b611a46565b6040516108b091906130ec565b60405180910390f35b3480156108c557600080fd5b506108e060048036038101906108db9190613641565b611acd565b005b3480156108ee57600080fd5b5061090960048036038101906109049190613191565b611b91565b005b34801561091757600080fd5b50610932600480360381019061092d91906133c4565b611c04565b005b34801561094057600080fd5b5061095b60048036038101906109569190613694565b611c87565b6040516109689190613446565b60405180910390f35b7f0000000000000000000000007004396c99d5690da76a7c59057c5f3a53e0170473ffffffffffffffffffffffffffffffffffffffff166109b0611d38565b73ffffffffffffffffffffffffffffffffffffffff1614610a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fd90613747565b60405180910390fd5b6000600160008861ffff1661ffff1681526020019081526020016000208054610a2e90613796565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5a90613796565b8015610aa75780601f10610a7c57610100808354040283529160200191610aa7565b820191906000526020600020905b815481529060010190602001808311610a8a57829003601f168201915b50505050509050805186869050148015610ac2575060008151115b8015610aeb575080805190602001208686604051610ae19291906137f7565b6040518091039020145b610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190613882565b60405180910390fd5b610bbe8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611d40565b50505050505050565b606060098054610bd690613796565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0290613796565b8015610c4f5780601f10610c2457610100808354040283529160200191610c4f565b820191906000526020600020905b815481529060010190602001808311610c3257829003601f168201915b5050505050905090565b610c61611e0b565b7f0000000000000000000000007004396c99d5690da76a7c59057c5f3a53e0170473ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610cba91906138b1565b600060405180830381600087803b158015610cd457600080fd5b505af1158015610ce8573d6000803e3d6000fd5b5050505050565b600080610cfa611d38565b9050610d07818585611e89565b600191505092915050565b610d1a611e0b565b80600360008461ffff1661ffff168152602001908152602001600020819055505050565b610d46611e0b565b7f0000000000000000000000007004396c99d5690da76a7c59057c5f3a53e0170473ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610d9f91906138b1565b600060405180830381600087803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b5050505050565b6000600854905090565b600080610de9611d38565b9050610df6858285612052565b610e018585856120de565b60019150509392505050565b60006012905090565b606060006040518060400160405280600381526020017f313831000000000000000000000000000000000000000000000000000000000081525090508091505090565b600080610e64611d38565b9050610e85818585610e768589611a46565b610e8091906138fb565b611e89565b600191505092915050565b600080600160008661ffff1661ffff1681526020019081526020016000208054610eb990613796565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee590613796565b8015610f325780601f10610f0757610100808354040283529160200191610f32565b820191906000526020600020905b815481529060010190602001808311610f1557829003601f168201915b505050505090508383604051610f499291906137f7565b60405180910390208180519060200120149150509392505050565b60036020528060005260406000206000915090505481565b610f84611e0b565b7f0000000000000000000000007004396c99d5690da76a7c59057c5f3a53e0170473ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b8152600401610fe19392919061397e565b600060405180830381600087803b158015610ffb57600080fd5b505af115801561100f573d6000803e3d6000fd5b50505050505050565b60056020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050505481565b611068611e0b565b803060405160200161107b9291906139f8565b60405160208183030381529060405260016000600b60009054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002090805190602001906110c8929190612be8565b5050565b3073ffffffffffffffffffffffffffffffffffffffff166110eb611d38565b73ffffffffffffffffffffffffffffffffffffffff1614611141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113890613a96565b60405180910390fd5b6111d58686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612357565b505050505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61122e611e0b565b6112386000612384565b565b6001602052806000526040600020600091509050805461125990613796565b80601f016020809104026020016040519081016040528092919081815260200182805461128590613796565b80156112d25780601f106112a7576101008083540402835291602001916112d2565b820191906000526020600020905b8154815290600101906020018083116112b557829003601f168201915b505050505081565b6002602052816000526040600020602052806000526040600020600091509150505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611332610e0d565b600a61133e9190613be9565b826113499190613c34565b90506113553382612448565b6000338260405160200161136a929190613c8e565b60405160208183030381529060405290506113a9600b60009054906101000a900461ffff16823360006040518060200160405280600081525034612617565b505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a80546113e390613796565b80601f016020809104026020016040519081016040528092919081815260200182805461140f90613796565b801561145c5780601f106114315761010080835404028352916020019161145c565b820191906000526020600020905b81548152906001019060200180831161143f57829003601f168201915b5050505050905090565b60606000600160008461ffff1661ffff168152602001908152602001600020805461149090613796565b80601f01602080910402602001604051908101604052809291908181526020018280546114bc90613796565b80156115095780601f106114de57610100808354040283529160200191611509565b820191906000526020600020905b8154815290600101906020018083116114ec57829003601f168201915b505050505090506000815103611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b90613d03565b60405180910390fd5b6115776000601483516115679190613d23565b836127ad9092919063ffffffff16565b915050919050565b60008061158a611d38565b905060006115988286611a46565b9050838110156115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d490613dc9565b60405180910390fd5b6115ea8286868403611e89565b60019250505092915050565b6115fe611e0b565b81813060405160200161161393929190613de9565b604051602081830303815290604052600160008561ffff1661ffff1681526020019081526020016000209080519060200190611650929190612be8565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce8383836040516116849392919061397e565b60405180910390a1505050565b60008061169c611d38565b90506116a98185856120de565b600191505092915050565b7f0000000000000000000000007004396c99d5690da76a7c59057c5f3a53e0170481565b6116e0611e0b565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b8160405161175091906134b7565b60405180910390a150565b61271081565b611769611e0b565b7f0000000000000000000000007004396c99d5690da76a7c59057c5f3a53e0170473ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b81526004016117ca959493929190613e13565b600060405180830381600087803b1580156117e457600080fd5b505af11580156117f8573d6000803e3d6000fd5b505050505050505050565b6000600560008861ffff1661ffff16815260200190815260200160002086866040516118309291906137f7565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000205490506000801b81036118ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a290613ed3565b60405180910390fd5b8083836040516118bc9291906137f7565b604051809103902014611904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fb90613f65565b60405180910390fd5b6000801b600560008961ffff1661ffff16815260200190815260200160002087876040516119339291906137f7565b908152602001604051809103902060008667ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055506119fe8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612357565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611a35959493929190613f94565b60405180910390a150505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611ad5611e0b565b60008111611b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0f9061402e565b60405180910390fd5b80600260008561ffff1661ffff16815260200190815260200160002060008461ffff1661ffff168152602001908152602001600020819055507f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac0838383604051611b849392919061404e565b60405180910390a1505050565b611b99611e0b565b8181600160008661ffff1661ffff1681526020019081526020016000209190611bc3929190612c6e565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611bf79392919061397e565b60405180910390a1505050565b611c0c611e0b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c72906140f7565b60405180910390fd5b611c8481612384565b50565b60607f0000000000000000000000007004396c99d5690da76a7c59057c5f3a53e0170473ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc868630866040518563ffffffff1660e01b8152600401611ce89493929190614117565b600060405180830381865afa158015611d05573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611d2e91906141cc565b9050949350505050565b600033905090565b600080611dec5a60966366ad5c8a60e01b89898989604051602401611d689493929190614215565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050503073ffffffffffffffffffffffffffffffffffffffff166128cb909392919063ffffffff16565b9150915081611e0357611e028686868685612963565b5b505050505050565b611e13611d38565b73ffffffffffffffffffffffffffffffffffffffff16611e316112ff565b73ffffffffffffffffffffffffffffffffffffffff1614611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e906142b4565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eef90614346565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5e906143d8565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161204591906130ec565b60405180910390a3505050565b600061205e8484611a46565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120d857818110156120ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c190614444565b60405180910390fd5b6120d78484848403611e89565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361214d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612144906144d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b390614568565b60405180910390fd5b6121c7838383612a11565b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561224e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612245906145fa565b60405180910390fd5b818103600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161233e91906130ec565b60405180910390a3612351848484612a16565b50505050565b6000808280602001905181019061236e919061466d565b9150915061237c8282612a1b565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ae9061471f565b60405180910390fd5b6124c382600083612a11565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561254a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612541906147b1565b60405180910390fd5b818103600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600860008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125fe91906130ec565b60405180910390a361261283600084612a16565b505050565b6000600160008861ffff1661ffff168152602001908152602001600020805461263f90613796565b80601f016020809104026020016040519081016040528092919081815260200182805461266b90613796565b80156126b85780601f1061268d576101008083540402835291602001916126b8565b820191906000526020600020905b81548152906001019060200180831161269b57829003601f168201915b505050505090506000815103612703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fa90614843565b60405180910390fd5b61270e878751612b72565b7f0000000000000000000000007004396c99d5690da76a7c59057c5f3a53e0170473ffffffffffffffffffffffffffffffffffffffff1663c58031008389848a8a8a8a6040518863ffffffff1660e01b815260040161277296959493929190614872565b6000604051808303818588803b15801561278b57600080fd5b505af115801561279f573d6000803e3d6000fd5b505050505050505050505050565b606081601f836127bd91906138fb565b10156127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f590614934565b60405180910390fd5b818361280a91906138fb565b8451101561284d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612844906149a0565b60405180910390fd5b606082156000811461286e57604051915060008252602082016040526128bf565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156128ac578051835260208301925060208101905061288f565b50868552601f19601f8301166040525050505b50809150509392505050565b6000606060008060008661ffff1667ffffffffffffffff8111156128f2576128f16131f6565b5b6040519080825280601f01601f1916602001820160405280156129245781602001600182028036833780820191505090505b50905060008087516020890160008d8df191503d925086831115612946578692505b828152826000602083013e81819450945050505094509492505050565b8180519060200120600560008761ffff1661ffff1681526020019081526020016000208560405161299491906149f1565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055507fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c8585858585604051612a02959493929190614a08565b60405180910390a15050505050565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8190614abc565b60405180910390fd5b612a9660008383612a11565b8060086000828254612aa891906138fb565b9250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b5a91906130ec565b60405180910390a3612b6e60008383612a16565b5050565b6000600360008461ffff1661ffff16815260200190815260200160002054905060008103612ba05761271090505b80821115612be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bda90614b28565b60405180910390fd5b505050565b828054612bf490613796565b90600052602060002090601f016020900481019282612c165760008555612c5d565b82601f10612c2f57805160ff1916838001178555612c5d565b82800160010185558215612c5d579182015b82811115612c5c578251825591602001919060010190612c41565b5b509050612c6a9190612cf4565b5090565b828054612c7a90613796565b90600052602060002090601f016020900481019282612c9c5760008555612ce3565b82601f10612cb557803560ff1916838001178555612ce3565b82800160010185558215612ce3579182015b82811115612ce2578235825591602001919060010190612cc7565b5b509050612cf09190612cf4565b5090565b5b80821115612d0d576000816000905550600101612cf5565b5090565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b612d3c81612d25565b8114612d4757600080fd5b50565b600081359050612d5981612d33565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612d8457612d83612d5f565b5b8235905067ffffffffffffffff811115612da157612da0612d64565b5b602083019150836001820283011115612dbd57612dbc612d69565b5b9250929050565b600067ffffffffffffffff82169050919050565b612de181612dc4565b8114612dec57600080fd5b50565b600081359050612dfe81612dd8565b92915050565b60008060008060008060808789031215612e2157612e20612d1b565b5b6000612e2f89828a01612d4a565b965050602087013567ffffffffffffffff811115612e5057612e4f612d20565b5b612e5c89828a01612d6e565b95509550506040612e6f89828a01612def565b935050606087013567ffffffffffffffff811115612e9057612e8f612d20565b5b612e9c89828a01612d6e565b92509250509295509295509295565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ee5578082015181840152602081019050612eca565b83811115612ef4576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f1682612eab565b612f208185612eb6565b9350612f30818560208601612ec7565b612f3981612efa565b840191505092915050565b60006020820190508181036000830152612f5e8184612f0b565b905092915050565b600060208284031215612f7c57612f7b612d1b565b5b6000612f8a84828501612d4a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fbe82612f93565b9050919050565b612fce81612fb3565b8114612fd957600080fd5b50565b600081359050612feb81612fc5565b92915050565b6000819050919050565b61300481612ff1565b811461300f57600080fd5b50565b60008135905061302181612ffb565b92915050565b6000806040838503121561303e5761303d612d1b565b5b600061304c85828601612fdc565b925050602061305d85828601613012565b9150509250929050565b60008115159050919050565b61307c81613067565b82525050565b60006020820190506130976000830184613073565b92915050565b600080604083850312156130b4576130b3612d1b565b5b60006130c285828601612d4a565b92505060206130d385828601613012565b9150509250929050565b6130e681612ff1565b82525050565b600060208201905061310160008301846130dd565b92915050565b6000806000606084860312156131205761311f612d1b565b5b600061312e86828701612fdc565b935050602061313f86828701612fdc565b925050604061315086828701613012565b9150509250925092565b600060ff82169050919050565b6131708161315a565b82525050565b600060208201905061318b6000830184613167565b92915050565b6000806000604084860312156131aa576131a9612d1b565b5b60006131b886828701612d4a565b935050602084013567ffffffffffffffff8111156131d9576131d8612d20565b5b6131e586828701612d6e565b92509250509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61322e82612efa565b810181811067ffffffffffffffff8211171561324d5761324c6131f6565b5b80604052505050565b6000613260612d11565b905061326c8282613225565b919050565b600067ffffffffffffffff82111561328c5761328b6131f6565b5b61329582612efa565b9050602081019050919050565b82818337600083830152505050565b60006132c46132bf84613271565b613256565b9050828152602081018484840111156132e0576132df6131f1565b5b6132eb8482856132a2565b509392505050565b600082601f83011261330857613307612d5f565b5b81356133188482602086016132b1565b91505092915050565b60008060006060848603121561333a57613339612d1b565b5b600061334886828701612d4a565b935050602084013567ffffffffffffffff81111561336957613368612d20565b5b613375868287016132f3565b925050604061338686828701612def565b9150509250925092565b6000819050919050565b6133a381613390565b82525050565b60006020820190506133be600083018461339a565b92915050565b6000602082840312156133da576133d9612d1b565b5b60006133e884828501612fdc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000613418826133f1565b61342281856133fc565b9350613432818560208601612ec7565b61343b81612efa565b840191505092915050565b60006020820190508181036000830152613460818461340d565b905092915050565b6000806040838503121561347f5761347e612d1b565b5b600061348d85828601612d4a565b925050602061349e85828601612d4a565b9150509250929050565b6134b181612fb3565b82525050565b60006020820190506134cc60008301846134a8565b92915050565b6000602082840312156134e8576134e7612d1b565b5b60006134f684828501613012565b91505092915050565b6000819050919050565b600061352461351f61351a84612f93565b6134ff565b612f93565b9050919050565b600061353682613509565b9050919050565b60006135488261352b565b9050919050565b6135588161353d565b82525050565b6000602082019050613573600083018461354f565b92915050565b60008060008060006080868803121561359557613594612d1b565b5b60006135a388828901612d4a565b95505060206135b488828901612d4a565b94505060406135c588828901613012565b935050606086013567ffffffffffffffff8111156135e6576135e5612d20565b5b6135f288828901612d6e565b92509250509295509295909350565b6000806040838503121561361857613617612d1b565b5b600061362685828601612fdc565b925050602061363785828601612fdc565b9150509250929050565b60008060006060848603121561365a57613659612d1b565b5b600061366886828701612d4a565b935050602061367986828701612d4a565b925050604061368a86828701613012565b9150509250925092565b600080600080608085870312156136ae576136ad612d1b565b5b60006136bc87828801612d4a565b94505060206136cd87828801612d4a565b93505060406136de87828801612fdc565b92505060606136ef87828801613012565b91505092959194509250565b7f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c65720000600082015250565b6000613731601e83612eb6565b915061373c826136fb565b602082019050919050565b6000602082019050818103600083015261376081613724565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137ae57607f821691505b6020821081036137c1576137c0613767565b5b50919050565b600081905092915050565b60006137de83856137c7565b93506137eb8385846132a2565b82840190509392505050565b60006138048284866137d2565b91508190509392505050565b7f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b600061386c602683612eb6565b915061387782613810565b604082019050919050565b6000602082019050818103600083015261389b8161385f565b9050919050565b6138ab81612d25565b82525050565b60006020820190506138c660008301846138a2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061390682612ff1565b915061391183612ff1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613946576139456138cc565b5b828201905092915050565b600061395d83856133fc565b935061396a8385846132a2565b61397383612efa565b840190509392505050565b600060408201905061399360008301866138a2565b81810360208301526139a6818486613951565b9050949350505050565b60008160601b9050919050565b60006139c8826139b0565b9050919050565b60006139da826139bd565b9050919050565b6139f26139ed82612fb3565b6139cf565b82525050565b6000613a0482856139e1565b601482019150613a1482846139e1565b6014820191508190509392505050565b7f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d75737420626560008201527f204c7a4170700000000000000000000000000000000000000000000000000000602082015250565b6000613a80602683612eb6565b9150613a8b82613a24565b604082019050919050565b60006020820190508181036000830152613aaf81613a73565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115613b0d57808604811115613ae957613ae86138cc565b5b6001851615613af85780820291505b8081029050613b0685613ab6565b9450613acd565b94509492505050565b600082613b265760019050613be2565b81613b345760009050613be2565b8160018114613b4a5760028114613b5457613b83565b6001915050613be2565b60ff841115613b6657613b656138cc565b5b8360020a915084821115613b7d57613b7c6138cc565b5b50613be2565b5060208310610133831016604e8410600b8410161715613bb85782820a905083811115613bb357613bb26138cc565b5b613be2565b613bc58484846001613ac3565b92509050818404811115613bdc57613bdb6138cc565b5b81810290505b9392505050565b6000613bf482612ff1565b9150613bff8361315a565b9250613c2c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613b16565b905092915050565b6000613c3f82612ff1565b9150613c4a83612ff1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c8357613c826138cc565b5b828202905092915050565b6000604082019050613ca360008301856134a8565b613cb060208301846130dd565b9392505050565b7f4c7a4170703a206e6f20747275737465642070617468207265636f7264000000600082015250565b6000613ced601d83612eb6565b9150613cf882613cb7565b602082019050919050565b60006020820190508181036000830152613d1c81613ce0565b9050919050565b6000613d2e82612ff1565b9150613d3983612ff1565b925082821015613d4c57613d4b6138cc565b5b828203905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613db3602583612eb6565b9150613dbe82613d57565b604082019050919050565b60006020820190508181036000830152613de281613da6565b9050919050565b6000613df68285876137d2565b9150613e0282846139e1565b601482019150819050949350505050565b6000608082019050613e2860008301886138a2565b613e3560208301876138a2565b613e4260408301866130dd565b8181036060830152613e55818486613951565b90509695505050505050565b7f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360008201527f6167650000000000000000000000000000000000000000000000000000000000602082015250565b6000613ebd602383612eb6565b9150613ec882613e61565b604082019050919050565b60006020820190508181036000830152613eec81613eb0565b9050919050565b7f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f6160008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f4f602183612eb6565b9150613f5a82613ef3565b604082019050919050565b60006020820190508181036000830152613f7e81613f42565b9050919050565b613f8e81612dc4565b82525050565b6000608082019050613fa960008301886138a2565b8181036020830152613fbc818688613951565b9050613fcb6040830185613f85565b613fd8606083018461339a565b9695505050505050565b7f4c7a4170703a20696e76616c6964206d696e4761730000000000000000000000600082015250565b6000614018601583612eb6565b915061402382613fe2565b602082019050919050565b600060208201905081810360008301526140478161400b565b9050919050565b600060608201905061406360008301866138a2565b61407060208301856138a2565b61407d60408301846130dd565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006140e1602683612eb6565b91506140ec82614085565b604082019050919050565b60006020820190508181036000830152614110816140d4565b9050919050565b600060808201905061412c60008301876138a2565b61413960208301866138a2565b61414660408301856134a8565b61415360608301846130dd565b95945050505050565b600061416f61416a84613271565b613256565b90508281526020810184848401111561418b5761418a6131f1565b5b614196848285612ec7565b509392505050565b600082601f8301126141b3576141b2612d5f565b5b81516141c384826020860161415c565b91505092915050565b6000602082840312156141e2576141e1612d1b565b5b600082015167ffffffffffffffff811115614200576141ff612d20565b5b61420c8482850161419e565b91505092915050565b600060808201905061422a60008301876138a2565b818103602083015261423c818661340d565b905061424b6040830185613f85565b818103606083015261425d818461340d565b905095945050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061429e602083612eb6565b91506142a982614268565b602082019050919050565b600060208201905081810360008301526142cd81614291565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614330602483612eb6565b915061433b826142d4565b604082019050919050565b6000602082019050818103600083015261435f81614323565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006143c2602283612eb6565b91506143cd82614366565b604082019050919050565b600060208201905081810360008301526143f1816143b5565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061442e601d83612eb6565b9150614439826143f8565b602082019050919050565b6000602082019050818103600083015261445d81614421565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006144c0602583612eb6565b91506144cb82614464565b604082019050919050565b600060208201905081810360008301526144ef816144b3565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614552602383612eb6565b915061455d826144f6565b604082019050919050565b6000602082019050818103600083015261458181614545565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006145e4602683612eb6565b91506145ef82614588565b604082019050919050565b60006020820190508181036000830152614613816145d7565b9050919050565b600061462582612f93565b9050919050565b6146358161461a565b811461464057600080fd5b50565b6000815190506146528161462c565b92915050565b60008151905061466781612ffb565b92915050565b6000806040838503121561468457614683612d1b565b5b600061469285828601614643565b92505060206146a385828601614658565b9150509250929050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614709602183612eb6565b9150614714826146ad565b604082019050919050565b60006020820190508181036000830152614738816146fc565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061479b602283612eb6565b91506147a68261473f565b604082019050919050565b600060208201905081810360008301526147ca8161478e565b9050919050565b7f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060008201527f61207472757374656420736f7572636500000000000000000000000000000000602082015250565b600061482d603083612eb6565b9150614838826147d1565b604082019050919050565b6000602082019050818103600083015261485c81614820565b9050919050565b61486c8161461a565b82525050565b600060c08201905061488760008301896138a2565b8181036020830152614899818861340d565b905081810360408301526148ad818761340d565b90506148bc6060830186614863565b6148c960808301856134a8565b81810360a08301526148db818461340d565b9050979650505050505050565b7f736c6963655f6f766572666c6f77000000000000000000000000000000000000600082015250565b600061491e600e83612eb6565b9150614929826148e8565b602082019050919050565b6000602082019050818103600083015261494d81614911565b9050919050565b7f736c6963655f6f75744f66426f756e6473000000000000000000000000000000600082015250565b600061498a601183612eb6565b915061499582614954565b602082019050919050565b600060208201905081810360008301526149b98161497d565b9050919050565b60006149cb826133f1565b6149d581856137c7565b93506149e5818560208601612ec7565b80840191505092915050565b60006149fd82846149c0565b915081905092915050565b600060a082019050614a1d60008301886138a2565b8181036020830152614a2f818761340d565b9050614a3e6040830186613f85565b8181036060830152614a50818561340d565b90508181036080830152614a64818461340d565b90509695505050505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000614aa6601f83612eb6565b9150614ab182614a70565b602082019050919050565b60006020820190508181036000830152614ad581614a99565b9050919050565b7f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c61726765600082015250565b6000614b12602083612eb6565b9150614b1d82614adc565b602082019050919050565b60006020820190508181036000830152614b4181614b05565b905091905056fea26469706673582212206df7af7773b778fce38869337a36d9f65d9bdb7d09ba2244594c61e9cde8578264736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000700000000000000000000000007004396c99d5690da76a7c59057c5f3a53e017040000000000000000000000000000000000000000000000000000000005affb7b00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003766b69000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076d4c56516a487200000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _destChainId (uint16): 112
Arg [1] : _lzEndpoint (address): 0x7004396C99D5690da76A7C59057C5f3A53e01704
Arg [2] : _supply (uint256): 95419259
Arg [3] : _short (string): vki
Arg [4] : _long (string): mLVQjHr
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000070
Arg [1] : 0000000000000000000000007004396c99d5690da76a7c59057c5f3a53e01704
Arg [2] : 0000000000000000000000000000000000000000000000000000000005affb7b
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 766b690000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [8] : 6d4c56516a487200000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MOVR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.