Source Code
Latest 25 from a total of 109 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Unlock Supplies | 16515802 | 1128 days ago | IN | 0 ETH | 0.00229206 | ||||
| Unlock Supplies | 16278147 | 1161 days ago | IN | 0 ETH | 0.00200025 | ||||
| Unlock Supplies | 16275140 | 1162 days ago | IN | 0 ETH | 0.00120684 | ||||
| Unlock Supplies | 16272363 | 1162 days ago | IN | 0 ETH | 0.00203029 | ||||
| Unlock Supplies | 16270388 | 1163 days ago | IN | 0 ETH | 0.00238876 | ||||
| Unlock Supplies | 16255637 | 1165 days ago | IN | 0 ETH | 0.00103921 | ||||
| Unlock Supplies | 16246985 | 1166 days ago | IN | 0 ETH | 0.0039004 | ||||
| Unlock Supplies | 16241198 | 1167 days ago | IN | 0 ETH | 0.00706746 | ||||
| Unlock Supplies | 16239560 | 1167 days ago | IN | 0 ETH | 0.00196852 | ||||
| Unlock Supplies | 16233689 | 1168 days ago | IN | 0 ETH | 0.00132471 | ||||
| Unlock Supplies | 16229404 | 1168 days ago | IN | 0 ETH | 0.00123696 | ||||
| Unlock Supplies | 16227753 | 1168 days ago | IN | 0 ETH | 0.00428321 | ||||
| Unlock Supplies | 16227676 | 1168 days ago | IN | 0 ETH | 0.00264763 | ||||
| Unlock Supplies | 16225205 | 1169 days ago | IN | 0 ETH | 0.00102619 | ||||
| Unlock Supplies | 16224613 | 1169 days ago | IN | 0 ETH | 0.00042497 | ||||
| Unlock Supplies | 16224612 | 1169 days ago | IN | 0 ETH | 0.00097778 | ||||
| Unlock Supplies | 16223624 | 1169 days ago | IN | 0 ETH | 0.01429786 | ||||
| Unlock Supplies | 16223430 | 1169 days ago | IN | 0 ETH | 0.00156791 | ||||
| Unlock Supplies | 16221567 | 1169 days ago | IN | 0 ETH | 0.00190815 | ||||
| Unlock Supplies | 16221027 | 1169 days ago | IN | 0 ETH | 0.00174045 | ||||
| Unlock Supplies | 16221024 | 1169 days ago | IN | 0 ETH | 0.00059213 | ||||
| Unlock Supplies | 16221023 | 1169 days ago | IN | 0 ETH | 0.00253152 | ||||
| Unlock Supplies | 16218749 | 1170 days ago | IN | 0 ETH | 0.00169083 | ||||
| Unlock Supplies | 16218654 | 1170 days ago | IN | 0 ETH | 0.00155897 | ||||
| Unlock Supplies | 16217069 | 1170 days ago | IN | 0 ETH | 0.00148506 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SupplyOpener
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-12-16
*/
// File: @maticnetwork/fx-portal/contracts/lib/Merkle.sol
pragma solidity ^0.8.0;
library Merkle {
function checkMembership(
bytes32 leaf,
uint256 index,
bytes32 rootHash,
bytes memory proof
) internal pure returns (bool) {
require(proof.length % 32 == 0, "Invalid proof length");
uint256 proofHeight = proof.length / 32;
// Proof of size n means, height of the tree is n+1.
// In a tree of height n+1, max #leafs possible is 2 ^ n
require(index < 2**proofHeight, "Leaf index is too big");
bytes32 proofElement;
bytes32 computedHash = leaf;
for (uint256 i = 32; i <= proof.length; i += 32) {
assembly {
proofElement := mload(add(proof, i))
}
if (index % 2 == 0) {
computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
} else {
computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
}
index = index / 2;
}
return computedHash == rootHash;
}
}
// File: @maticnetwork/fx-portal/contracts/lib/RLPReader.sol
/*
* @author Hamdi Allam hamdi.allam97@gmail.com
* Please reach out with any questions or concerns
*/
pragma solidity ^0.8.0;
library RLPReader {
uint8 constant STRING_SHORT_START = 0x80;
uint8 constant STRING_LONG_START = 0xb8;
uint8 constant LIST_SHORT_START = 0xc0;
uint8 constant LIST_LONG_START = 0xf8;
uint8 constant WORD_SIZE = 32;
struct RLPItem {
uint256 len;
uint256 memPtr;
}
struct Iterator {
RLPItem item; // Item that's being iterated over.
uint256 nextPtr; // Position of the next item in the list.
}
/*
* @dev Returns the next element in the iteration. Reverts if it has not next element.
* @param self The iterator.
* @return The next element in the iteration.
*/
function next(Iterator memory self) internal pure returns (RLPItem memory) {
require(hasNext(self));
uint256 ptr = self.nextPtr;
uint256 itemLength = _itemLength(ptr);
self.nextPtr = ptr + itemLength;
return RLPItem(itemLength, ptr);
}
/*
* @dev Returns true if the iteration has more elements.
* @param self The iterator.
* @return true if the iteration has more elements.
*/
function hasNext(Iterator memory self) internal pure returns (bool) {
RLPItem memory item = self.item;
return self.nextPtr < item.memPtr + item.len;
}
/*
* @param item RLP encoded bytes
*/
function toRlpItem(bytes memory item) internal pure returns (RLPItem memory) {
uint256 memPtr;
assembly {
memPtr := add(item, 0x20)
}
return RLPItem(item.length, memPtr);
}
/*
* @dev Create an iterator. Reverts if item is not a list.
* @param self The RLP item.
* @return An 'Iterator' over the item.
*/
function iterator(RLPItem memory self) internal pure returns (Iterator memory) {
require(isList(self));
uint256 ptr = self.memPtr + _payloadOffset(self.memPtr);
return Iterator(self, ptr);
}
/*
* @param item RLP encoded bytes
*/
function rlpLen(RLPItem memory item) internal pure returns (uint256) {
return item.len;
}
/*
* @param item RLP encoded bytes
*/
function payloadLen(RLPItem memory item) internal pure returns (uint256) {
return item.len - _payloadOffset(item.memPtr);
}
/*
* @param item RLP encoded list in bytes
*/
function toList(RLPItem memory item) internal pure returns (RLPItem[] memory) {
require(isList(item));
uint256 items = numItems(item);
RLPItem[] memory result = new RLPItem[](items);
uint256 memPtr = item.memPtr + _payloadOffset(item.memPtr);
uint256 dataLen;
for (uint256 i = 0; i < items; i++) {
dataLen = _itemLength(memPtr);
result[i] = RLPItem(dataLen, memPtr);
memPtr = memPtr + dataLen;
}
return result;
}
// @return indicator whether encoded payload is a list. negate this function call for isData.
function isList(RLPItem memory item) internal pure returns (bool) {
if (item.len == 0) return false;
uint8 byte0;
uint256 memPtr = item.memPtr;
assembly {
byte0 := byte(0, mload(memPtr))
}
if (byte0 < LIST_SHORT_START) return false;
return true;
}
/*
* @dev A cheaper version of keccak256(toRlpBytes(item)) that avoids copying memory.
* @return keccak256 hash of RLP encoded bytes.
*/
function rlpBytesKeccak256(RLPItem memory item) internal pure returns (bytes32) {
uint256 ptr = item.memPtr;
uint256 len = item.len;
bytes32 result;
assembly {
result := keccak256(ptr, len)
}
return result;
}
function payloadLocation(RLPItem memory item) internal pure returns (uint256, uint256) {
uint256 offset = _payloadOffset(item.memPtr);
uint256 memPtr = item.memPtr + offset;
uint256 len = item.len - offset; // data length
return (memPtr, len);
}
/*
* @dev A cheaper version of keccak256(toBytes(item)) that avoids copying memory.
* @return keccak256 hash of the item payload.
*/
function payloadKeccak256(RLPItem memory item) internal pure returns (bytes32) {
(uint256 memPtr, uint256 len) = payloadLocation(item);
bytes32 result;
assembly {
result := keccak256(memPtr, len)
}
return result;
}
/** RLPItem conversions into data types **/
// @returns raw rlp encoding in bytes
function toRlpBytes(RLPItem memory item) internal pure returns (bytes memory) {
bytes memory result = new bytes(item.len);
if (result.length == 0) return result;
uint256 ptr;
assembly {
ptr := add(0x20, result)
}
copy(item.memPtr, ptr, item.len);
return result;
}
// any non-zero byte is considered true
function toBoolean(RLPItem memory item) internal pure returns (bool) {
require(item.len == 1);
uint256 result;
uint256 memPtr = item.memPtr;
assembly {
result := byte(0, mload(memPtr))
}
return result == 0 ? false : true;
}
function toAddress(RLPItem memory item) internal pure returns (address) {
// 1 byte for the length prefix
require(item.len == 21);
return address(uint160(toUint(item)));
}
function toUint(RLPItem memory item) internal pure returns (uint256) {
require(item.len > 0 && item.len <= 33);
uint256 offset = _payloadOffset(item.memPtr);
uint256 len = item.len - offset;
uint256 result;
uint256 memPtr = item.memPtr + offset;
assembly {
result := mload(memPtr)
// shfit to the correct location if neccesary
if lt(len, 32) {
result := div(result, exp(256, sub(32, len)))
}
}
return result;
}
// enforces 32 byte length
function toUintStrict(RLPItem memory item) internal pure returns (uint256) {
// one byte prefix
require(item.len == 33);
uint256 result;
uint256 memPtr = item.memPtr + 1;
assembly {
result := mload(memPtr)
}
return result;
}
function toBytes(RLPItem memory item) internal pure returns (bytes memory) {
require(item.len > 0);
uint256 offset = _payloadOffset(item.memPtr);
uint256 len = item.len - offset; // data length
bytes memory result = new bytes(len);
uint256 destPtr;
assembly {
destPtr := add(0x20, result)
}
copy(item.memPtr + offset, destPtr, len);
return result;
}
/*
* Private Helpers
*/
// @return number of payload items inside an encoded list.
function numItems(RLPItem memory item) private pure returns (uint256) {
if (item.len == 0) return 0;
uint256 count = 0;
uint256 currPtr = item.memPtr + _payloadOffset(item.memPtr);
uint256 endPtr = item.memPtr + item.len;
while (currPtr < endPtr) {
currPtr = currPtr + _itemLength(currPtr); // skip over an item
count++;
}
return count;
}
// @return entire rlp item byte length
function _itemLength(uint256 memPtr) private pure returns (uint256) {
uint256 itemLen;
uint256 byte0;
assembly {
byte0 := byte(0, mload(memPtr))
}
if (byte0 < STRING_SHORT_START) itemLen = 1;
else if (byte0 < STRING_LONG_START) itemLen = byte0 - STRING_SHORT_START + 1;
else if (byte0 < LIST_SHORT_START) {
assembly {
let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is
memPtr := add(memPtr, 1) // skip over the first byte
/* 32 byte word size */
let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len
itemLen := add(dataLen, add(byteLen, 1))
}
} else if (byte0 < LIST_LONG_START) {
itemLen = byte0 - LIST_SHORT_START + 1;
} else {
assembly {
let byteLen := sub(byte0, 0xf7)
memPtr := add(memPtr, 1)
let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length
itemLen := add(dataLen, add(byteLen, 1))
}
}
return itemLen;
}
// @return number of bytes until the data
function _payloadOffset(uint256 memPtr) private pure returns (uint256) {
uint256 byte0;
assembly {
byte0 := byte(0, mload(memPtr))
}
if (byte0 < STRING_SHORT_START) return 0;
else if (byte0 < STRING_LONG_START || (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START)) return 1;
else if (byte0 < LIST_SHORT_START)
// being explicit
return byte0 - (STRING_LONG_START - 1) + 1;
else return byte0 - (LIST_LONG_START - 1) + 1;
}
/*
* @param src Pointer to source
* @param dest Pointer to destination
* @param len Amount of memory to copy from the source
*/
function copy(
uint256 src,
uint256 dest,
uint256 len
) private pure {
if (len == 0) return;
// copy as many word sizes as possible
for (; len >= WORD_SIZE; len -= WORD_SIZE) {
assembly {
mstore(dest, mload(src))
}
src += WORD_SIZE;
dest += WORD_SIZE;
}
if (len == 0) return;
// left over bytes. Mask is used to remove unwanted bytes from the word
uint256 mask = 256**(WORD_SIZE - len) - 1;
assembly {
let srcpart := and(mload(src), not(mask)) // zero out src
let destpart := and(mload(dest), mask) // retrieve the bytes
mstore(dest, or(destpart, srcpart))
}
}
}
// File: @maticnetwork/fx-portal/contracts/lib/ExitPayloadReader.sol
pragma solidity ^0.8.0;
library ExitPayloadReader {
using RLPReader for bytes;
using RLPReader for RLPReader.RLPItem;
uint8 constant WORD_SIZE = 32;
struct ExitPayload {
RLPReader.RLPItem[] data;
}
struct Receipt {
RLPReader.RLPItem[] data;
bytes raw;
uint256 logIndex;
}
struct Log {
RLPReader.RLPItem data;
RLPReader.RLPItem[] list;
}
struct LogTopics {
RLPReader.RLPItem[] data;
}
// copy paste of private copy() from RLPReader to avoid changing of existing contracts
function copy(
uint256 src,
uint256 dest,
uint256 len
) private pure {
if (len == 0) return;
// copy as many word sizes as possible
for (; len >= WORD_SIZE; len -= WORD_SIZE) {
assembly {
mstore(dest, mload(src))
}
src += WORD_SIZE;
dest += WORD_SIZE;
}
if (len == 0) return;
// left over bytes. Mask is used to remove unwanted bytes from the word
uint256 mask = 256**(WORD_SIZE - len) - 1;
assembly {
let srcpart := and(mload(src), not(mask)) // zero out src
let destpart := and(mload(dest), mask) // retrieve the bytes
mstore(dest, or(destpart, srcpart))
}
}
function toExitPayload(bytes memory data) internal pure returns (ExitPayload memory) {
RLPReader.RLPItem[] memory payloadData = data.toRlpItem().toList();
return ExitPayload(payloadData);
}
function getHeaderNumber(ExitPayload memory payload) internal pure returns (uint256) {
return payload.data[0].toUint();
}
function getBlockProof(ExitPayload memory payload) internal pure returns (bytes memory) {
return payload.data[1].toBytes();
}
function getBlockNumber(ExitPayload memory payload) internal pure returns (uint256) {
return payload.data[2].toUint();
}
function getBlockTime(ExitPayload memory payload) internal pure returns (uint256) {
return payload.data[3].toUint();
}
function getTxRoot(ExitPayload memory payload) internal pure returns (bytes32) {
return bytes32(payload.data[4].toUint());
}
function getReceiptRoot(ExitPayload memory payload) internal pure returns (bytes32) {
return bytes32(payload.data[5].toUint());
}
function getReceipt(ExitPayload memory payload) internal pure returns (Receipt memory receipt) {
receipt.raw = payload.data[6].toBytes();
RLPReader.RLPItem memory receiptItem = receipt.raw.toRlpItem();
if (receiptItem.isList()) {
// legacy tx
receipt.data = receiptItem.toList();
} else {
// pop first byte before parsting receipt
bytes memory typedBytes = receipt.raw;
bytes memory result = new bytes(typedBytes.length - 1);
uint256 srcPtr;
uint256 destPtr;
assembly {
srcPtr := add(33, typedBytes)
destPtr := add(0x20, result)
}
copy(srcPtr, destPtr, result.length);
receipt.data = result.toRlpItem().toList();
}
receipt.logIndex = getReceiptLogIndex(payload);
return receipt;
}
function getReceiptProof(ExitPayload memory payload) internal pure returns (bytes memory) {
return payload.data[7].toBytes();
}
function getBranchMaskAsBytes(ExitPayload memory payload) internal pure returns (bytes memory) {
return payload.data[8].toBytes();
}
function getBranchMaskAsUint(ExitPayload memory payload) internal pure returns (uint256) {
return payload.data[8].toUint();
}
function getReceiptLogIndex(ExitPayload memory payload) internal pure returns (uint256) {
return payload.data[9].toUint();
}
// Receipt methods
function toBytes(Receipt memory receipt) internal pure returns (bytes memory) {
return receipt.raw;
}
function getLog(Receipt memory receipt) internal pure returns (Log memory) {
RLPReader.RLPItem memory logData = receipt.data[3].toList()[receipt.logIndex];
return Log(logData, logData.toList());
}
// Log methods
function getEmitter(Log memory log) internal pure returns (address) {
return RLPReader.toAddress(log.list[0]);
}
function getTopics(Log memory log) internal pure returns (LogTopics memory) {
return LogTopics(log.list[1].toList());
}
function getData(Log memory log) internal pure returns (bytes memory) {
return log.list[2].toBytes();
}
function toRlpBytes(Log memory log) internal pure returns (bytes memory) {
return log.data.toRlpBytes();
}
// LogTopics methods
function getField(LogTopics memory topics, uint256 index) internal pure returns (RLPReader.RLPItem memory) {
return topics.data[index];
}
}
// File: @maticnetwork/fx-portal/contracts/lib/MerklePatriciaProof.sol
pragma solidity ^0.8.0;
library MerklePatriciaProof {
/*
* @dev Verifies a merkle patricia proof.
* @param value The terminating value in the trie.
* @param encodedPath The path in the trie leading to value.
* @param rlpParentNodes The rlp encoded stack of nodes.
* @param root The root hash of the trie.
* @return The boolean validity of the proof.
*/
function verify(
bytes memory value,
bytes memory encodedPath,
bytes memory rlpParentNodes,
bytes32 root
) internal pure returns (bool) {
RLPReader.RLPItem memory item = RLPReader.toRlpItem(rlpParentNodes);
RLPReader.RLPItem[] memory parentNodes = RLPReader.toList(item);
bytes memory currentNode;
RLPReader.RLPItem[] memory currentNodeList;
bytes32 nodeKey = root;
uint256 pathPtr = 0;
bytes memory path = _getNibbleArray(encodedPath);
if (path.length == 0) {
return false;
}
for (uint256 i = 0; i < parentNodes.length; i++) {
if (pathPtr > path.length) {
return false;
}
currentNode = RLPReader.toRlpBytes(parentNodes[i]);
if (nodeKey != keccak256(currentNode)) {
return false;
}
currentNodeList = RLPReader.toList(parentNodes[i]);
if (currentNodeList.length == 17) {
if (pathPtr == path.length) {
if (keccak256(RLPReader.toBytes(currentNodeList[16])) == keccak256(value)) {
return true;
} else {
return false;
}
}
uint8 nextPathNibble = uint8(path[pathPtr]);
if (nextPathNibble > 16) {
return false;
}
nodeKey = bytes32(RLPReader.toUintStrict(currentNodeList[nextPathNibble]));
pathPtr += 1;
} else if (currentNodeList.length == 2) {
uint256 traversed = _nibblesToTraverse(RLPReader.toBytes(currentNodeList[0]), path, pathPtr);
if (pathPtr + traversed == path.length) {
//leaf node
if (keccak256(RLPReader.toBytes(currentNodeList[1])) == keccak256(value)) {
return true;
} else {
return false;
}
}
//extension node
if (traversed == 0) {
return false;
}
pathPtr += traversed;
nodeKey = bytes32(RLPReader.toUintStrict(currentNodeList[1]));
} else {
return false;
}
}
}
function _nibblesToTraverse(
bytes memory encodedPartialPath,
bytes memory path,
uint256 pathPtr
) private pure returns (uint256) {
uint256 len = 0;
// encodedPartialPath has elements that are each two hex characters (1 byte), but partialPath
// and slicedPath have elements that are each one hex character (1 nibble)
bytes memory partialPath = _getNibbleArray(encodedPartialPath);
bytes memory slicedPath = new bytes(partialPath.length);
// pathPtr counts nibbles in path
// partialPath.length is a number of nibbles
for (uint256 i = pathPtr; i < pathPtr + partialPath.length; i++) {
bytes1 pathNibble = path[i];
slicedPath[i - pathPtr] = pathNibble;
}
if (keccak256(partialPath) == keccak256(slicedPath)) {
len = partialPath.length;
} else {
len = 0;
}
return len;
}
// bytes b must be hp encoded
function _getNibbleArray(bytes memory b) internal pure returns (bytes memory) {
bytes memory nibbles = "";
if (b.length > 0) {
uint8 offset;
uint8 hpNibble = uint8(_getNthNibbleOfBytes(0, b));
if (hpNibble == 1 || hpNibble == 3) {
nibbles = new bytes(b.length * 2 - 1);
bytes1 oddNibble = _getNthNibbleOfBytes(1, b);
nibbles[0] = oddNibble;
offset = 1;
} else {
nibbles = new bytes(b.length * 2 - 2);
offset = 0;
}
for (uint256 i = offset; i < nibbles.length; i++) {
nibbles[i] = _getNthNibbleOfBytes(i - offset + 2, b);
}
}
return nibbles;
}
function _getNthNibbleOfBytes(uint256 n, bytes memory str) private pure returns (bytes1) {
return bytes1(n % 2 == 0 ? uint8(str[n / 2]) / 0x10 : uint8(str[n / 2]) % 0x10);
}
}
// File: @maticnetwork/fx-portal/contracts/tunnel/FxBaseRootTunnel.sol
pragma solidity ^0.8.0;
interface IFxStateSender {
function sendMessageToChild(address _receiver, bytes calldata _data) external;
}
contract ICheckpointManager {
struct HeaderBlock {
bytes32 root;
uint256 start;
uint256 end;
uint256 createdAt;
address proposer;
}
/**
* @notice mapping of checkpoint header numbers to block details
* @dev These checkpoints are submited by plasma contracts
*/
mapping(uint256 => HeaderBlock) public headerBlocks;
}
abstract contract FxBaseRootTunnel {
using RLPReader for RLPReader.RLPItem;
using Merkle for bytes32;
using ExitPayloadReader for bytes;
using ExitPayloadReader for ExitPayloadReader.ExitPayload;
using ExitPayloadReader for ExitPayloadReader.Log;
using ExitPayloadReader for ExitPayloadReader.LogTopics;
using ExitPayloadReader for ExitPayloadReader.Receipt;
// keccak256(MessageSent(bytes))
bytes32 public constant SEND_MESSAGE_EVENT_SIG = 0x8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b036;
// state sender contract
IFxStateSender public fxRoot;
// root chain manager
ICheckpointManager public checkpointManager;
// child tunnel contract which receives and sends messages
address public fxChildTunnel;
// storage to avoid duplicate exits
mapping(bytes32 => bool) public processedExits;
constructor(address _checkpointManager, address _fxRoot) {
checkpointManager = ICheckpointManager(_checkpointManager);
fxRoot = IFxStateSender(_fxRoot);
}
// set fxChildTunnel if not set already
function setFxChildTunnel(address _fxChildTunnel) public virtual {
require(fxChildTunnel == address(0x0), "FxBaseRootTunnel: CHILD_TUNNEL_ALREADY_SET");
fxChildTunnel = _fxChildTunnel;
}
/**
* @notice Send bytes message to Child Tunnel
* @param message bytes message that will be sent to Child Tunnel
* some message examples -
* abi.encode(tokenId);
* abi.encode(tokenId, tokenMetadata);
* abi.encode(messageType, messageData);
*/
function _sendMessageToChild(bytes memory message) internal {
fxRoot.sendMessageToChild(fxChildTunnel, message);
}
function _validateAndExtractMessage(bytes memory inputData) internal returns (bytes memory) {
ExitPayloadReader.ExitPayload memory payload = inputData.toExitPayload();
bytes memory branchMaskBytes = payload.getBranchMaskAsBytes();
uint256 blockNumber = payload.getBlockNumber();
// checking if exit has already been processed
// unique exit is identified using hash of (blockNumber, branchMask, receiptLogIndex)
bytes32 exitHash = keccak256(
abi.encodePacked(
blockNumber,
// first 2 nibbles are dropped while generating nibble array
// this allows branch masks that are valid but bypass exitHash check (changing first 2 nibbles only)
// so converting to nibble array and then hashing it
MerklePatriciaProof._getNibbleArray(branchMaskBytes),
payload.getReceiptLogIndex()
)
);
require(processedExits[exitHash] == false, "FxRootTunnel: EXIT_ALREADY_PROCESSED");
processedExits[exitHash] = true;
ExitPayloadReader.Receipt memory receipt = payload.getReceipt();
ExitPayloadReader.Log memory log = receipt.getLog();
// check child tunnel
require(fxChildTunnel == log.getEmitter(), "FxRootTunnel: INVALID_FX_CHILD_TUNNEL");
bytes32 receiptRoot = payload.getReceiptRoot();
// verify receipt inclusion
require(
MerklePatriciaProof.verify(receipt.toBytes(), branchMaskBytes, payload.getReceiptProof(), receiptRoot),
"FxRootTunnel: INVALID_RECEIPT_PROOF"
);
// verify checkpoint inclusion
_checkBlockMembershipInCheckpoint(
blockNumber,
payload.getBlockTime(),
payload.getTxRoot(),
receiptRoot,
payload.getHeaderNumber(),
payload.getBlockProof()
);
ExitPayloadReader.LogTopics memory topics = log.getTopics();
require(
bytes32(topics.getField(0).toUint()) == SEND_MESSAGE_EVENT_SIG, // topic0 is event sig
"FxRootTunnel: INVALID_SIGNATURE"
);
// received message data
bytes memory message = abi.decode(log.getData(), (bytes)); // event decodes params again, so decoding bytes to get message
return message;
}
function _checkBlockMembershipInCheckpoint(
uint256 blockNumber,
uint256 blockTime,
bytes32 txRoot,
bytes32 receiptRoot,
uint256 headerNumber,
bytes memory blockProof
) private view returns (uint256) {
(bytes32 headerRoot, uint256 startBlock, , uint256 createdAt, ) = checkpointManager.headerBlocks(headerNumber);
require(
keccak256(abi.encodePacked(blockNumber, blockTime, txRoot, receiptRoot)).checkMembership(
blockNumber - startBlock,
headerRoot,
blockProof
),
"FxRootTunnel: INVALID_HEADER"
);
return createdAt;
}
/**
* @notice receive message from L2 to L1, validated by proof
* @dev This function verifies if the transaction actually happened on child chain
*
* @param inputData RLP encoded data of the reference tx containing following list of fields
* 0 - headerNumber - Checkpoint header block number containing the reference tx
* 1 - blockProof - Proof that the block header (in the child chain) is a leaf in the submitted merkle root
* 2 - blockNumber - Block number containing the reference tx on child chain
* 3 - blockTime - Reference tx block time
* 4 - txRoot - Transactions root of block
* 5 - receiptRoot - Receipts root of block
* 6 - receipt - Receipt of the reference transaction
* 7 - receiptProof - Merkle proof of the reference receipt
* 8 - branchMask - 32 bits denoting the path of receipt in merkle tree
* 9 - receiptLogIndex - Log Index to read from the receipt
*/
function receiveMessage(bytes memory inputData) public virtual {
bytes memory message = _validateAndExtractMessage(inputData);
_processMessageFromChild(message);
}
/**
* @notice Process message received from Child Tunnel
* @dev function needs to be implemented to handle message as per requirement
* This is called by onStateReceive function.
* Since it is called via a system call, any event will not be emitted during its execution.
* @param message bytes message that was sent from Child Tunnel
*/
function _processMessageFromChild(bytes memory message) internal virtual;
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @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);
}
}
// File: IERC721A.sol
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev Interface of an ERC721A compliant contract.
*/
interface IERC721A {
/**
* The caller must own the token or be an approved operator.
*/
error ApprovalCallerNotOwnerNorApproved();
/**
* The token does not exist.
*/
error ApprovalQueryForNonexistentToken();
/**
* The caller cannot approve to their own address.
*/
error ApproveToCaller();
/**
* Cannot query the balance for the zero address.
*/
error BalanceQueryForZeroAddress();
/**
* Cannot mint to the zero address.
*/
error MintToZeroAddress();
/**
* The quantity of tokens minted must be more than zero.
*/
error MintZeroQuantity();
/**
* The token does not exist.
*/
error OwnerQueryForNonexistentToken();
/**
* The caller must own the token or be an approved operator.
*/
error TransferCallerNotOwnerNorApproved();
/**
* The token must be owned by `from`.
*/
error TransferFromIncorrectOwner();
/**
* Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
*/
error TransferToNonERC721ReceiverImplementer();
/**
* Cannot transfer to the zero address.
*/
error TransferToZeroAddress();
/**
* The token does not exist.
*/
error URIQueryForNonexistentToken();
/**
* The `quantity` minted with ERC2309 exceeds the safety limit.
*/
error MintERC2309QuantityExceedsLimit();
/**
* The `extraData` cannot be set on an unintialized ownership slot.
*/
error OwnershipNotInitializedForExtraData();
struct TokenOwnership {
// The address of the owner.
address addr;
// Keeps track of the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
// Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
uint24 extraData;
}
/**
* @dev Returns the total amount of tokens stored by the contract.
*
* Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
*/
function totalSupply() external view returns (uint256);
// ==============================
// IERC165
// ==============================
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
// ==============================
// IERC721
// ==============================
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
// ==============================
// IERC721Metadata
// ==============================
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
// ==============================
// IERC2309
// ==============================
/**
* @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
* as defined in the ERC2309 standard. See `_mintERC2309` for more details.
*/
event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}
// File: SuppliesRootTunnel.sol
pragma solidity 0.8.15;
contract SupplyOpener is FxBaseRootTunnel, Ownable {
IERC721A public supplies;
bool public Paused;
constructor(
address checkpointManager,
address fxRoot,
address _supplies
) FxBaseRootTunnel(checkpointManager, fxRoot) {
supplies = IERC721A(_supplies);
}
function unlockSupplies(uint256[] memory tokenIds) public {
require(!Paused, "Currently paused.");
uint256 value = tokenIds.length;
for (uint256 i; i < value; i++) {
supplies.transferFrom(msg.sender, address(this), tokenIds[i]);
_sendMessageToChild(abi.encode(msg.sender, tokenIds[i]));
}
}
function setSupplies(address _supplies) public onlyOwner {
supplies = IERC721A(_supplies);
}
function setPaused(bool paused) public onlyOwner {
Paused = paused;
}
function _processMessageFromChild(bytes memory message) internal override {
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"checkpointManager","type":"address"},{"internalType":"address","name":"fxRoot","type":"address"},{"internalType":"address","name":"_supplies","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"Paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEND_MESSAGE_EVENT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkpointManager","outputs":[{"internalType":"contract ICheckpointManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxChildTunnel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxRoot","outputs":[{"internalType":"contract IFxStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedExits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"receiveMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fxChildTunnel","type":"address"}],"name":"setFxChildTunnel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_supplies","type":"address"}],"name":"setSupplies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplies","outputs":[{"internalType":"contract IERC721A","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unlockSupplies","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620038183803806200381883398181016040528101906200003791906200025e565b828281600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050620000dc620000d06200012660201b60201c565b6200012e60201b60201c565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620002ba565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200022682620001f9565b9050919050565b620002388162000219565b81146200024457600080fd5b50565b60008151905062000258816200022d565b92915050565b6000806000606084860312156200027a5762000279620001f4565b5b60006200028a8682870162000247565b93505060206200029d8682870162000247565b9250506040620002b08682870162000247565b9150509250925092565b61354e80620002ca6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638efa887411610097578063c0857ba011610066578063c0857ba01461023a578063de9b771f14610258578063f2fde38b14610276578063f953cec714610292576100f5565b80638efa8874146101c4578063972c4928146101e25780639e87fac814610200578063aea4e49e1461021e576100f5565b8063607f2d42116100d3578063607f2d4214610150578063715018a6146101805780638b3afb9b1461018a5780638da5cb5b146101a6576100f5565b80630e387de6146100fa57806316c38b3c146101185780632fa8563d14610134575b600080fd5b6101026102ae565b60405161010f91906121ef565b60405180910390f35b610132600480360381019061012d9190612256565b6102d5565b005b61014e60048036038101906101499190612412565b6102fa565b005b61016a60048036038101906101659190612487565b610462565b60405161017791906124c3565b60405180910390f35b610188610482565b005b6101a4600480360381019061019f919061253c565b610496565b005b6101ae6104e2565b6040516101bb9190612578565b60405180910390f35b6101cc61050c565b6040516101d991906125f2565b60405180910390f35b6101ea610532565b6040516101f79190612578565b60405180910390f35b610208610558565b60405161021591906124c3565b60405180910390f35b6102386004803603810190610233919061253c565b61056b565b005b610242610640565b60405161024f919061262e565b60405180910390f35b610260610666565b60405161026d919061266a565b60405180910390f35b610290600480360381019061028b919061253c565b61068a565b005b6102ac60048036038101906102a7919061273a565b61070d565b005b7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b81565b6102dd610727565b80600560146101000a81548160ff02191690831515021790555050565b600560149054906101000a900460ff161561034a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610341906127e0565b60405180910390fd5b60008151905060005b8181101561045d57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308685815181106103ae576103ad612800565b5b60200260200101516040518463ffffffff1660e01b81526004016103d49392919061283e565b600060405180830381600087803b1580156103ee57600080fd5b505af1158015610402573d6000803e3d6000fd5b5050505061044a3384838151811061041d5761041c612800565b5b6020026020010151604051602001610436929190612875565b6040516020818303038152906040526107a5565b8080610455906128cd565b915050610353565b505050565b60036020528060005260406000206000915054906101000a900460ff1681565b61048a610727565b6104946000610857565b565b61049e610727565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560149054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f390612987565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610692610727565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f890612a19565b60405180910390fd5b61070a81610857565b50565b60006107188261091d565b905061072381610c22565b5050565b61072f610c25565b73ffffffffffffffffffffffffffffffffffffffff1661074d6104e2565b73ffffffffffffffffffffffffffffffffffffffff16146107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a90612a85565b60405180910390fd5b565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b4720477600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610822929190612b2d565b600060405180830381600087803b15801561083c57600080fd5b505af1158015610850573d6000803e3d6000fd5b5050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060600061092a83610c2d565b9050600061093782610c61565b9050600061094483610c92565b905060008161095284610cc3565b61095b86610ed9565b60405160200161096d93929190612bba565b604051602081830303815290604052805190602001209050600015156003600083815260200190815260200160002060009054906101000a900460ff161515146109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390612c65565b60405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000610a2385610f0a565b90506000610a308261102f565b9050610a3b816110a6565b73ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac190612cf7565b60405180910390fd5b6000610ad5876110d7565b9050610af3610ae38461110b565b87610aed8a611119565b8461114a565b610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2990612d89565b60405180910390fd5b610b6085610b3f89611448565b610b488a611479565b84610b528c6114ad565b610b5b8d6114de565b61150f565b506000610b6c83611656565b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b610bae610ba960008461169b90919063ffffffff16565b6116ca565b60001b14610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be890612df5565b60405180910390fd5b6000610bfc8461174d565b806020019051810190610c0f9190612e85565b9050809950505050505050505050919050565b50565b600033905090565b610c35612155565b6000610c48610c438461177e565b6117ac565b9050604051806020016040528082815250915050919050565b6060610c8b8260000151600881518110610c7e57610c7d612800565b5b60200260200101516118c1565b9050919050565b6000610cbc8260000151600281518110610caf57610cae612800565b5b60200260200101516116ca565b9050919050565b60606000604051806020016040528060008152509050600083511115610ed057600080610cf1600086611978565b60f81c905060018160ff161480610d0b575060038160ff16145b15610dd557600160028651610d209190612ece565b610d2a9190612f28565b67ffffffffffffffff811115610d4357610d42612299565b5b6040519080825280601f01601f191660200182016040528015610d755781602001600182028036833780820191505090505b5092506000610d85600187611978565b90508084600081518110610d9c57610d9b612800565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001925050610e41565b6002808651610de49190612ece565b610dee9190612f28565b67ffffffffffffffff811115610e0757610e06612299565b5b6040519080825280601f01601f191660200182016040528015610e395781602001600182028036833780820191505090505b509250600091505b60008260ff1690505b8351811015610ecc57610e7760028460ff1683610e679190612f28565b610e719190612f5c565b87611978565b848281518110610e8a57610e89612800565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080610ec4906128cd565b915050610e4a565b5050505b80915050919050565b6000610f038260000151600981518110610ef657610ef5612800565b5b60200260200101516116ca565b9050919050565b610f12612168565b610f3a8260000151600681518110610f2d57610f2c612800565b5b60200260200101516118c1565b81602001819052506000610f51826020015161177e565b9050610f5c81611a10565b15610f7757610f6a816117ac565b8260000181905250611017565b600082602001519050600060018251610f909190612f28565b67ffffffffffffffff811115610fa957610fa8612299565b5b6040519080825280601f01601f191660200182016040528015610fdb5781602001600182028036833780820191505090505b509050600080836021019150826020019050610ff982828551611a5d565b61100a6110058461177e565b6117ac565b8660000181905250505050505b61102083610ed9565b82604001818152505050919050565b611037612189565b6000611061836000015160038151811061105457611053612800565b5b60200260200101516117ac565b83604001518151811061107757611076612800565b5b60200260200101519050604051806040016040528082815260200161109b836117ac565b815250915050919050565b60006110d082602001516000815181106110c3576110c2612800565b5b6020026020010151611afe565b9050919050565b600061110182600001516005815181106110f4576110f3612800565b5b60200260200101516116ca565b60001b9050919050565b606081602001519050919050565b6060611143826000015160078151811061113657611135612800565b5b60200260200101516118c1565b9050919050565b6000806111568461177e565b90506000611163826117ac565b905060608060008690506000806111798b610cc3565b90506000815103611194576000975050505050505050611440565b60005b86518110156114375781518311156111ba57600098505050505050505050611440565b6111dd8782815181106111d0576111cf612800565b5b6020026020010151611b21565b9550858051906020012084146111fe57600098505050505050505050611440565b61122187828151811061121457611213612800565b5b60200260200101516117ac565b94506011855103611311578151830361128e578c805190602001206112608660108151811061125357611252612800565b5b60200260200101516118c1565b805190602001200361127d57600198505050505050505050611440565b600098505050505050505050611440565b60008284815181106112a3576112a2612800565b5b602001015160f81c60f81b60f81c905060108160ff1611156112d15760009950505050505050505050611440565b6112f7868260ff16815181106112ea576112e9612800565b5b6020026020010151611bb0565b60001b94506001846113099190612f5c565b935050611424565b600285510361141257600061134a6113438760008151811061133657611335612800565b5b60200260200101516118c1565b8486611be7565b90508251818561135a9190612f5c565b036113bb578d8051906020012061138b8760018151811061137e5761137d612800565b5b60200260200101516118c1565b80519060200120036113a95760019950505050505050505050611440565b60009950505050505050505050611440565b600081036113d55760009950505050505050505050611440565b80846113e19190612f5c565b9350611407866001815181106113fa576113f9612800565b5b6020026020010151611bb0565b60001b945050611423565b600098505050505050505050611440565b5b808061142f906128cd565b915050611197565b50505050505050505b949350505050565b6000611472826000015160038151811061146557611464612800565b5b60200260200101516116ca565b9050919050565b60006114a3826000015160048151811061149657611495612800565b5b60200260200101516116ca565b60001b9050919050565b60006114d782600001516000815181106114ca576114c9612800565b5b60200260200101516116ca565b9050919050565b606061150882600001516001815181106114fb576114fa612800565b5b60200260200101516118c1565b9050919050565b600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166341539d4a876040518263ffffffff1660e01b81526004016115709190612fb2565b60a060405180830381865afa15801561158d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b1919061300c565b5093505092509250611607828b6115c89190612f28565b84878d8d8d8d6040516020016115e194939291906130a8565b60405160208183030381529060405280519060200120611d1c909392919063ffffffff16565b611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90613142565b60405180910390fd5b8093505050509695505050505050565b61165e6121a9565b6040518060200160405280611691846020015160018151811061168457611683612800565b5b60200260200101516117ac565b8152509050919050565b6116a36121bc565b826000015182815181106116ba576116b9612800565b5b6020026020010151905092915050565b60008082600001511180156116e457506021826000015111155b6116ed57600080fd5b60006116fc8360200151611e8c565b905060008184600001516117109190612f28565b90506000808386602001516117259190612f5c565b905080519150602083101561174157826020036101000a820491505b81945050505050919050565b6060611777826020015160028151811061176a57611769612800565b5b60200260200101516118c1565b9050919050565b6117866121bc565b600060208301905060405180604001604052808451815260200182815250915050919050565b60606117b782611a10565b6117c057600080fd5b60006117cb83611f4b565b905060008167ffffffffffffffff8111156117e9576117e8612299565b5b60405190808252806020026020018201604052801561182257816020015b61180f6121bc565b8152602001906001900390816118075790505b50905060006118348560200151611e8c565b85602001516118439190612f5c565b9050600080600090505b848110156118b45761185e83611fd8565b915060405180604001604052808381526020018481525084828151811061188857611887612800565b5b6020026020010181905250818361189f9190612f5c565b925080806118ac906128cd565b91505061184d565b5082945050505050919050565b606060008260000151116118d457600080fd5b60006118e38360200151611e8c565b905060008184600001516118f79190612f28565b905060008167ffffffffffffffff81111561191557611914612299565b5b6040519080825280601f01601f1916602001820160405280156119475781602001600182028036833780820191505090505b509050600081602001905061196c8487602001516119659190612f5c565b82856120b4565b81945050505050919050565b6000806002846119889190613191565b146119cb5760108260028561199d91906131c2565b815181106119ae576119ad612800565b5b602001015160f81c60f81b60f81c6119c69190613200565b611a05565b6010826002856119db91906131c2565b815181106119ec576119eb612800565b5b602001015160f81c60f81b60f81c611a049190613231565b5b60f81b905092915050565b600080826000015103611a265760009050611a58565b60008083602001519050805160001a915060c060ff168260ff161015611a5157600092505050611a58565b6001925050505b919050565b6000810315611af9575b602060ff168110611ab15782518252602060ff1683611a869190612f5c565b9250602060ff1682611a989190612f5c565b9150602060ff1681611aaa9190612f28565b9050611a67565b6000810315611af9576000600182602060ff16611ace9190612f28565b610100611adb9190613395565b611ae59190612f28565b905080198451168184511681811785525050505b505050565b60006015826000015114611b1157600080fd5b611b1a826116ca565b9050919050565b60606000826000015167ffffffffffffffff811115611b4357611b42612299565b5b6040519080825280601f01601f191660200182016040528015611b755781602001600182028036833780820191505090505b5090506000815103611b8a5780915050611bab565b6000816020019050611ba584602001518286600001516120b4565b81925050505b919050565b60006021826000015114611bc357600080fd5b60008060018460200151611bd79190612f5c565b9050805191508192505050919050565b600080600090506000611bf986610cc3565b90506000815167ffffffffffffffff811115611c1857611c17612299565b5b6040519080825280601f01601f191660200182016040528015611c4a5781602001600182028036833780820191505090505b50905060008590505b825186611c609190612f5c565b811015611ceb576000878281518110611c7c57611c7b612800565b5b602001015160f81c60f81b905080838884611c979190612f28565b81518110611ca857611ca7612800565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080611ce3906128cd565b915050611c53565b508080519060200120828051906020012003611d0a5781519250611d0f565b600092505b8293505050509392505050565b60008060208351611d2d9190613191565b14611d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d649061342c565b60405180910390fd5b600060208351611d7d91906131c2565b9050806002611d8c9190613395565b8510611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490613498565b60405180910390fd5b6000808790506000602090505b85518111611e7b578086015192506000600289611df79190613191565b03611e2c578183604051602001611e0f9291906134b8565b604051602081830303815290604052805190602001209150611e58565b8282604051602001611e3f9291906134b8565b6040516020818303038152906040528051906020012091505b600288611e6591906131c2565b9750602081611e749190612f5c565b9050611dda565b508581149350505050949350505050565b600080825160001a9050608060ff16811015611eac576000915050611f46565b60b860ff16811080611ed1575060c060ff168110158015611ed0575060f860ff1681105b5b15611ee0576001915050611f46565b60c060ff16811015611f1b5760018060b8611efb91906134e4565b60ff1682611f099190612f28565b611f139190612f5c565b915050611f46565b60018060f8611f2a91906134e4565b60ff1682611f389190612f28565b611f429190612f5c565b9150505b919050565b600080826000015103611f615760009050611fd3565b600080611f718460200151611e8c565b8460200151611f809190612f5c565b9050600084600001518560200151611f989190612f5c565b90505b80821015611fcc57611fac82611fd8565b82611fb79190612f5c565b91508280611fc4906128cd565b935050611f9b565b8293505050505b919050565b6000806000835160001a9050608060ff16811015611ff957600191506120aa565b60b860ff16811015612028576001608060ff16826120179190612f28565b6120219190612f5c565b91506120a9565b60c060ff168110156120585760b78103600185019450806020036101000a855104600182018101935050506120a8565b60f860ff1681101561208757600160c060ff16826120769190612f28565b6120809190612f5c565b91506120a7565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b6000810315612150575b602060ff1681106121085782518252602060ff16836120dd9190612f5c565b9250602060ff16826120ef9190612f5c565b9150602060ff16816121019190612f28565b90506120be565b6000810315612150576000600182602060ff166121259190612f28565b6101006121329190613395565b61213c9190612f28565b905080198451168184511681811785525050505b505050565b6040518060200160405280606081525090565b60405180606001604052806060815260200160608152602001600081525090565b604051806040016040528061219c6121bc565b8152602001606081525090565b6040518060200160405280606081525090565b604051806040016040528060008152602001600081525090565b6000819050919050565b6121e9816121d6565b82525050565b600060208201905061220460008301846121e0565b92915050565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b6122338161221e565b811461223e57600080fd5b50565b6000813590506122508161222a565b92915050565b60006020828403121561226c5761226b612214565b5b600061227a84828501612241565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6122d182612288565b810181811067ffffffffffffffff821117156122f0576122ef612299565b5b80604052505050565b600061230361220a565b905061230f82826122c8565b919050565b600067ffffffffffffffff82111561232f5761232e612299565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61235881612345565b811461236357600080fd5b50565b6000813590506123758161234f565b92915050565b600061238e61238984612314565b6122f9565b905080838252602082019050602084028301858111156123b1576123b0612340565b5b835b818110156123da57806123c68882612366565b8452602084019350506020810190506123b3565b5050509392505050565b600082601f8301126123f9576123f8612283565b5b813561240984826020860161237b565b91505092915050565b60006020828403121561242857612427612214565b5b600082013567ffffffffffffffff81111561244657612445612219565b5b612452848285016123e4565b91505092915050565b612464816121d6565b811461246f57600080fd5b50565b6000813590506124818161245b565b92915050565b60006020828403121561249d5761249c612214565b5b60006124ab84828501612472565b91505092915050565b6124bd8161221e565b82525050565b60006020820190506124d860008301846124b4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612509826124de565b9050919050565b612519816124fe565b811461252457600080fd5b50565b60008135905061253681612510565b92915050565b60006020828403121561255257612551612214565b5b600061256084828501612527565b91505092915050565b612572816124fe565b82525050565b600060208201905061258d6000830184612569565b92915050565b6000819050919050565b60006125b86125b36125ae846124de565b612593565b6124de565b9050919050565b60006125ca8261259d565b9050919050565b60006125dc826125bf565b9050919050565b6125ec816125d1565b82525050565b600060208201905061260760008301846125e3565b92915050565b6000612618826125bf565b9050919050565b6126288161260d565b82525050565b6000602082019050612643600083018461261f565b92915050565b6000612654826125bf565b9050919050565b61266481612649565b82525050565b600060208201905061267f600083018461265b565b92915050565b600080fd5b600067ffffffffffffffff8211156126a5576126a4612299565b5b6126ae82612288565b9050602081019050919050565b82818337600083830152505050565b60006126dd6126d88461268a565b6122f9565b9050828152602081018484840111156126f9576126f8612685565b5b6127048482856126bb565b509392505050565b600082601f83011261272157612720612283565b5b81356127318482602086016126ca565b91505092915050565b6000602082840312156127505761274f612214565b5b600082013567ffffffffffffffff81111561276e5761276d612219565b5b61277a8482850161270c565b91505092915050565b600082825260208201905092915050565b7f43757272656e746c79207061757365642e000000000000000000000000000000600082015250565b60006127ca601183612783565b91506127d582612794565b602082019050919050565b600060208201905081810360008301526127f9816127bd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b61283881612345565b82525050565b60006060820190506128536000830186612569565b6128606020830185612569565b61286d604083018461282f565b949350505050565b600060408201905061288a6000830185612569565b612897602083018461282f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006128d882612345565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361290a5761290961289e565b5b600182019050919050565b7f467842617365526f6f7454756e6e656c3a204348494c445f54554e4e454c5f4160008201527f4c52454144595f53455400000000000000000000000000000000000000000000602082015250565b6000612971602a83612783565b915061297c82612915565b604082019050919050565b600060208201905081810360008301526129a081612964565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612a03602683612783565b9150612a0e826129a7565b604082019050919050565b60006020820190508181036000830152612a32816129f6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612a6f602083612783565b9150612a7a82612a39565b602082019050919050565b60006020820190508181036000830152612a9e81612a62565b9050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612adf578082015181840152602081019050612ac4565b83811115612aee576000848401525b50505050565b6000612aff82612aa5565b612b098185612ab0565b9350612b19818560208601612ac1565b612b2281612288565b840191505092915050565b6000604082019050612b426000830185612569565b8181036020830152612b548184612af4565b90509392505050565b6000819050919050565b612b78612b7382612345565b612b5d565b82525050565b600081905092915050565b6000612b9482612aa5565b612b9e8185612b7e565b9350612bae818560208601612ac1565b80840191505092915050565b6000612bc68286612b67565b602082019150612bd68285612b89565b9150612be28284612b67565b602082019150819050949350505050565b7f4678526f6f7454756e6e656c3a20455849545f414c52454144595f50524f434560008201527f5353454400000000000000000000000000000000000000000000000000000000602082015250565b6000612c4f602483612783565b9150612c5a82612bf3565b604082019050919050565b60006020820190508181036000830152612c7e81612c42565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f46585f4348494c445f5460008201527f554e4e454c000000000000000000000000000000000000000000000000000000602082015250565b6000612ce1602583612783565b9150612cec82612c85565b604082019050919050565b60006020820190508181036000830152612d1081612cd4565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f524543454950545f505260008201527f4f4f460000000000000000000000000000000000000000000000000000000000602082015250565b6000612d73602383612783565b9150612d7e82612d17565b604082019050919050565b60006020820190508181036000830152612da281612d66565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f5349474e415455524500600082015250565b6000612ddf601f83612783565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b6000612e28612e238461268a565b6122f9565b905082815260208101848484011115612e4457612e43612685565b5b612e4f848285612ac1565b509392505050565b600082601f830112612e6c57612e6b612283565b5b8151612e7c848260208601612e15565b91505092915050565b600060208284031215612e9b57612e9a612214565b5b600082015167ffffffffffffffff811115612eb957612eb8612219565b5b612ec584828501612e57565b91505092915050565b6000612ed982612345565b9150612ee483612345565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f1d57612f1c61289e565b5b828202905092915050565b6000612f3382612345565b9150612f3e83612345565b925082821015612f5157612f5061289e565b5b828203905092915050565b6000612f6782612345565b9150612f7283612345565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612fa757612fa661289e565b5b828201905092915050565b6000602082019050612fc7600083018461282f565b92915050565b600081519050612fdc8161245b565b92915050565b600081519050612ff18161234f565b92915050565b60008151905061300681612510565b92915050565b600080600080600060a0868803121561302857613027612214565b5b600061303688828901612fcd565b955050602061304788828901612fe2565b945050604061305888828901612fe2565b935050606061306988828901612fe2565b925050608061307a88828901612ff7565b9150509295509295909350565b6000819050919050565b6130a261309d826121d6565b613087565b82525050565b60006130b48287612b67565b6020820191506130c48286612b67565b6020820191506130d48285613091565b6020820191506130e48284613091565b60208201915081905095945050505050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f48454144455200000000600082015250565b600061312c601c83612783565b9150613137826130f6565b602082019050919050565b6000602082019050818103600083015261315b8161311f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061319c82612345565b91506131a783612345565b9250826131b7576131b6613162565b5b828206905092915050565b60006131cd82612345565b91506131d883612345565b9250826131e8576131e7613162565b5b828204905092915050565b600060ff82169050919050565b600061320b826131f3565b9150613216836131f3565b92508261322657613225613162565b5b828206905092915050565b600061323c826131f3565b9150613247836131f3565b92508261325757613256613162565b5b828204905092915050565b60008160011c9050919050565b6000808291508390505b60018511156132b9578086048111156132955761329461289e565b5b60018516156132a45780820291505b80810290506132b285613262565b9450613279565b94509492505050565b6000826132d2576001905061338e565b816132e0576000905061338e565b81600181146132f657600281146133005761332f565b600191505061338e565b60ff8411156133125761331161289e565b5b8360020a9150848211156133295761332861289e565b5b5061338e565b5060208310610133831016604e8410600b84101617156133645782820a90508381111561335f5761335e61289e565b5b61338e565b613371848484600161326f565b925090508184048111156133885761338761289e565b5b81810290505b9392505050565b60006133a082612345565b91506133ab83612345565b92506133d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846132c2565b905092915050565b7f496e76616c69642070726f6f66206c656e677468000000000000000000000000600082015250565b6000613416601483612783565b9150613421826133e0565b602082019050919050565b6000602082019050818103600083015261344581613409565b9050919050565b7f4c65616620696e64657820697320746f6f206269670000000000000000000000600082015250565b6000613482601583612783565b915061348d8261344c565b602082019050919050565b600060208201905081810360008301526134b181613475565b9050919050565b60006134c48285613091565b6020820191506134d48284613091565b6020820191508190509392505050565b60006134ef826131f3565b91506134fa836131f3565b92508282101561350d5761350c61289e565b5b82820390509291505056fea264697066735822122055850767a26826c0d7af9e2953f2168fd65c29bebaccd517028ac36194fcab3464736f6c634300080f003300000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a200000000000000000000000057b514cee8f1a8791289a22cdb50b550dd59dcc5
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80638efa887411610097578063c0857ba011610066578063c0857ba01461023a578063de9b771f14610258578063f2fde38b14610276578063f953cec714610292576100f5565b80638efa8874146101c4578063972c4928146101e25780639e87fac814610200578063aea4e49e1461021e576100f5565b8063607f2d42116100d3578063607f2d4214610150578063715018a6146101805780638b3afb9b1461018a5780638da5cb5b146101a6576100f5565b80630e387de6146100fa57806316c38b3c146101185780632fa8563d14610134575b600080fd5b6101026102ae565b60405161010f91906121ef565b60405180910390f35b610132600480360381019061012d9190612256565b6102d5565b005b61014e60048036038101906101499190612412565b6102fa565b005b61016a60048036038101906101659190612487565b610462565b60405161017791906124c3565b60405180910390f35b610188610482565b005b6101a4600480360381019061019f919061253c565b610496565b005b6101ae6104e2565b6040516101bb9190612578565b60405180910390f35b6101cc61050c565b6040516101d991906125f2565b60405180910390f35b6101ea610532565b6040516101f79190612578565b60405180910390f35b610208610558565b60405161021591906124c3565b60405180910390f35b6102386004803603810190610233919061253c565b61056b565b005b610242610640565b60405161024f919061262e565b60405180910390f35b610260610666565b60405161026d919061266a565b60405180910390f35b610290600480360381019061028b919061253c565b61068a565b005b6102ac60048036038101906102a7919061273a565b61070d565b005b7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b81565b6102dd610727565b80600560146101000a81548160ff02191690831515021790555050565b600560149054906101000a900460ff161561034a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610341906127e0565b60405180910390fd5b60008151905060005b8181101561045d57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308685815181106103ae576103ad612800565b5b60200260200101516040518463ffffffff1660e01b81526004016103d49392919061283e565b600060405180830381600087803b1580156103ee57600080fd5b505af1158015610402573d6000803e3d6000fd5b5050505061044a3384838151811061041d5761041c612800565b5b6020026020010151604051602001610436929190612875565b6040516020818303038152906040526107a5565b8080610455906128cd565b915050610353565b505050565b60036020528060005260406000206000915054906101000a900460ff1681565b61048a610727565b6104946000610857565b565b61049e610727565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560149054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f390612987565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610692610727565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f890612a19565b60405180910390fd5b61070a81610857565b50565b60006107188261091d565b905061072381610c22565b5050565b61072f610c25565b73ffffffffffffffffffffffffffffffffffffffff1661074d6104e2565b73ffffffffffffffffffffffffffffffffffffffff16146107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a90612a85565b60405180910390fd5b565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b4720477600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610822929190612b2d565b600060405180830381600087803b15801561083c57600080fd5b505af1158015610850573d6000803e3d6000fd5b5050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060600061092a83610c2d565b9050600061093782610c61565b9050600061094483610c92565b905060008161095284610cc3565b61095b86610ed9565b60405160200161096d93929190612bba565b604051602081830303815290604052805190602001209050600015156003600083815260200190815260200160002060009054906101000a900460ff161515146109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390612c65565b60405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506000610a2385610f0a565b90506000610a308261102f565b9050610a3b816110a6565b73ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac190612cf7565b60405180910390fd5b6000610ad5876110d7565b9050610af3610ae38461110b565b87610aed8a611119565b8461114a565b610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2990612d89565b60405180910390fd5b610b6085610b3f89611448565b610b488a611479565b84610b528c6114ad565b610b5b8d6114de565b61150f565b506000610b6c83611656565b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b610bae610ba960008461169b90919063ffffffff16565b6116ca565b60001b14610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be890612df5565b60405180910390fd5b6000610bfc8461174d565b806020019051810190610c0f9190612e85565b9050809950505050505050505050919050565b50565b600033905090565b610c35612155565b6000610c48610c438461177e565b6117ac565b9050604051806020016040528082815250915050919050565b6060610c8b8260000151600881518110610c7e57610c7d612800565b5b60200260200101516118c1565b9050919050565b6000610cbc8260000151600281518110610caf57610cae612800565b5b60200260200101516116ca565b9050919050565b60606000604051806020016040528060008152509050600083511115610ed057600080610cf1600086611978565b60f81c905060018160ff161480610d0b575060038160ff16145b15610dd557600160028651610d209190612ece565b610d2a9190612f28565b67ffffffffffffffff811115610d4357610d42612299565b5b6040519080825280601f01601f191660200182016040528015610d755781602001600182028036833780820191505090505b5092506000610d85600187611978565b90508084600081518110610d9c57610d9b612800565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001925050610e41565b6002808651610de49190612ece565b610dee9190612f28565b67ffffffffffffffff811115610e0757610e06612299565b5b6040519080825280601f01601f191660200182016040528015610e395781602001600182028036833780820191505090505b509250600091505b60008260ff1690505b8351811015610ecc57610e7760028460ff1683610e679190612f28565b610e719190612f5c565b87611978565b848281518110610e8a57610e89612800565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080610ec4906128cd565b915050610e4a565b5050505b80915050919050565b6000610f038260000151600981518110610ef657610ef5612800565b5b60200260200101516116ca565b9050919050565b610f12612168565b610f3a8260000151600681518110610f2d57610f2c612800565b5b60200260200101516118c1565b81602001819052506000610f51826020015161177e565b9050610f5c81611a10565b15610f7757610f6a816117ac565b8260000181905250611017565b600082602001519050600060018251610f909190612f28565b67ffffffffffffffff811115610fa957610fa8612299565b5b6040519080825280601f01601f191660200182016040528015610fdb5781602001600182028036833780820191505090505b509050600080836021019150826020019050610ff982828551611a5d565b61100a6110058461177e565b6117ac565b8660000181905250505050505b61102083610ed9565b82604001818152505050919050565b611037612189565b6000611061836000015160038151811061105457611053612800565b5b60200260200101516117ac565b83604001518151811061107757611076612800565b5b60200260200101519050604051806040016040528082815260200161109b836117ac565b815250915050919050565b60006110d082602001516000815181106110c3576110c2612800565b5b6020026020010151611afe565b9050919050565b600061110182600001516005815181106110f4576110f3612800565b5b60200260200101516116ca565b60001b9050919050565b606081602001519050919050565b6060611143826000015160078151811061113657611135612800565b5b60200260200101516118c1565b9050919050565b6000806111568461177e565b90506000611163826117ac565b905060608060008690506000806111798b610cc3565b90506000815103611194576000975050505050505050611440565b60005b86518110156114375781518311156111ba57600098505050505050505050611440565b6111dd8782815181106111d0576111cf612800565b5b6020026020010151611b21565b9550858051906020012084146111fe57600098505050505050505050611440565b61122187828151811061121457611213612800565b5b60200260200101516117ac565b94506011855103611311578151830361128e578c805190602001206112608660108151811061125357611252612800565b5b60200260200101516118c1565b805190602001200361127d57600198505050505050505050611440565b600098505050505050505050611440565b60008284815181106112a3576112a2612800565b5b602001015160f81c60f81b60f81c905060108160ff1611156112d15760009950505050505050505050611440565b6112f7868260ff16815181106112ea576112e9612800565b5b6020026020010151611bb0565b60001b94506001846113099190612f5c565b935050611424565b600285510361141257600061134a6113438760008151811061133657611335612800565b5b60200260200101516118c1565b8486611be7565b90508251818561135a9190612f5c565b036113bb578d8051906020012061138b8760018151811061137e5761137d612800565b5b60200260200101516118c1565b80519060200120036113a95760019950505050505050505050611440565b60009950505050505050505050611440565b600081036113d55760009950505050505050505050611440565b80846113e19190612f5c565b9350611407866001815181106113fa576113f9612800565b5b6020026020010151611bb0565b60001b945050611423565b600098505050505050505050611440565b5b808061142f906128cd565b915050611197565b50505050505050505b949350505050565b6000611472826000015160038151811061146557611464612800565b5b60200260200101516116ca565b9050919050565b60006114a3826000015160048151811061149657611495612800565b5b60200260200101516116ca565b60001b9050919050565b60006114d782600001516000815181106114ca576114c9612800565b5b60200260200101516116ca565b9050919050565b606061150882600001516001815181106114fb576114fa612800565b5b60200260200101516118c1565b9050919050565b600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166341539d4a876040518263ffffffff1660e01b81526004016115709190612fb2565b60a060405180830381865afa15801561158d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b1919061300c565b5093505092509250611607828b6115c89190612f28565b84878d8d8d8d6040516020016115e194939291906130a8565b60405160208183030381529060405280519060200120611d1c909392919063ffffffff16565b611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90613142565b60405180910390fd5b8093505050509695505050505050565b61165e6121a9565b6040518060200160405280611691846020015160018151811061168457611683612800565b5b60200260200101516117ac565b8152509050919050565b6116a36121bc565b826000015182815181106116ba576116b9612800565b5b6020026020010151905092915050565b60008082600001511180156116e457506021826000015111155b6116ed57600080fd5b60006116fc8360200151611e8c565b905060008184600001516117109190612f28565b90506000808386602001516117259190612f5c565b905080519150602083101561174157826020036101000a820491505b81945050505050919050565b6060611777826020015160028151811061176a57611769612800565b5b60200260200101516118c1565b9050919050565b6117866121bc565b600060208301905060405180604001604052808451815260200182815250915050919050565b60606117b782611a10565b6117c057600080fd5b60006117cb83611f4b565b905060008167ffffffffffffffff8111156117e9576117e8612299565b5b60405190808252806020026020018201604052801561182257816020015b61180f6121bc565b8152602001906001900390816118075790505b50905060006118348560200151611e8c565b85602001516118439190612f5c565b9050600080600090505b848110156118b45761185e83611fd8565b915060405180604001604052808381526020018481525084828151811061188857611887612800565b5b6020026020010181905250818361189f9190612f5c565b925080806118ac906128cd565b91505061184d565b5082945050505050919050565b606060008260000151116118d457600080fd5b60006118e38360200151611e8c565b905060008184600001516118f79190612f28565b905060008167ffffffffffffffff81111561191557611914612299565b5b6040519080825280601f01601f1916602001820160405280156119475781602001600182028036833780820191505090505b509050600081602001905061196c8487602001516119659190612f5c565b82856120b4565b81945050505050919050565b6000806002846119889190613191565b146119cb5760108260028561199d91906131c2565b815181106119ae576119ad612800565b5b602001015160f81c60f81b60f81c6119c69190613200565b611a05565b6010826002856119db91906131c2565b815181106119ec576119eb612800565b5b602001015160f81c60f81b60f81c611a049190613231565b5b60f81b905092915050565b600080826000015103611a265760009050611a58565b60008083602001519050805160001a915060c060ff168260ff161015611a5157600092505050611a58565b6001925050505b919050565b6000810315611af9575b602060ff168110611ab15782518252602060ff1683611a869190612f5c565b9250602060ff1682611a989190612f5c565b9150602060ff1681611aaa9190612f28565b9050611a67565b6000810315611af9576000600182602060ff16611ace9190612f28565b610100611adb9190613395565b611ae59190612f28565b905080198451168184511681811785525050505b505050565b60006015826000015114611b1157600080fd5b611b1a826116ca565b9050919050565b60606000826000015167ffffffffffffffff811115611b4357611b42612299565b5b6040519080825280601f01601f191660200182016040528015611b755781602001600182028036833780820191505090505b5090506000815103611b8a5780915050611bab565b6000816020019050611ba584602001518286600001516120b4565b81925050505b919050565b60006021826000015114611bc357600080fd5b60008060018460200151611bd79190612f5c565b9050805191508192505050919050565b600080600090506000611bf986610cc3565b90506000815167ffffffffffffffff811115611c1857611c17612299565b5b6040519080825280601f01601f191660200182016040528015611c4a5781602001600182028036833780820191505090505b50905060008590505b825186611c609190612f5c565b811015611ceb576000878281518110611c7c57611c7b612800565b5b602001015160f81c60f81b905080838884611c979190612f28565b81518110611ca857611ca7612800565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080611ce3906128cd565b915050611c53565b508080519060200120828051906020012003611d0a5781519250611d0f565b600092505b8293505050509392505050565b60008060208351611d2d9190613191565b14611d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d649061342c565b60405180910390fd5b600060208351611d7d91906131c2565b9050806002611d8c9190613395565b8510611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490613498565b60405180910390fd5b6000808790506000602090505b85518111611e7b578086015192506000600289611df79190613191565b03611e2c578183604051602001611e0f9291906134b8565b604051602081830303815290604052805190602001209150611e58565b8282604051602001611e3f9291906134b8565b6040516020818303038152906040528051906020012091505b600288611e6591906131c2565b9750602081611e749190612f5c565b9050611dda565b508581149350505050949350505050565b600080825160001a9050608060ff16811015611eac576000915050611f46565b60b860ff16811080611ed1575060c060ff168110158015611ed0575060f860ff1681105b5b15611ee0576001915050611f46565b60c060ff16811015611f1b5760018060b8611efb91906134e4565b60ff1682611f099190612f28565b611f139190612f5c565b915050611f46565b60018060f8611f2a91906134e4565b60ff1682611f389190612f28565b611f429190612f5c565b9150505b919050565b600080826000015103611f615760009050611fd3565b600080611f718460200151611e8c565b8460200151611f809190612f5c565b9050600084600001518560200151611f989190612f5c565b90505b80821015611fcc57611fac82611fd8565b82611fb79190612f5c565b91508280611fc4906128cd565b935050611f9b565b8293505050505b919050565b6000806000835160001a9050608060ff16811015611ff957600191506120aa565b60b860ff16811015612028576001608060ff16826120179190612f28565b6120219190612f5c565b91506120a9565b60c060ff168110156120585760b78103600185019450806020036101000a855104600182018101935050506120a8565b60f860ff1681101561208757600160c060ff16826120769190612f28565b6120809190612f5c565b91506120a7565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b6000810315612150575b602060ff1681106121085782518252602060ff16836120dd9190612f5c565b9250602060ff16826120ef9190612f5c565b9150602060ff16816121019190612f28565b90506120be565b6000810315612150576000600182602060ff166121259190612f28565b6101006121329190613395565b61213c9190612f28565b905080198451168184511681811785525050505b505050565b6040518060200160405280606081525090565b60405180606001604052806060815260200160608152602001600081525090565b604051806040016040528061219c6121bc565b8152602001606081525090565b6040518060200160405280606081525090565b604051806040016040528060008152602001600081525090565b6000819050919050565b6121e9816121d6565b82525050565b600060208201905061220460008301846121e0565b92915050565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b6122338161221e565b811461223e57600080fd5b50565b6000813590506122508161222a565b92915050565b60006020828403121561226c5761226b612214565b5b600061227a84828501612241565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6122d182612288565b810181811067ffffffffffffffff821117156122f0576122ef612299565b5b80604052505050565b600061230361220a565b905061230f82826122c8565b919050565b600067ffffffffffffffff82111561232f5761232e612299565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61235881612345565b811461236357600080fd5b50565b6000813590506123758161234f565b92915050565b600061238e61238984612314565b6122f9565b905080838252602082019050602084028301858111156123b1576123b0612340565b5b835b818110156123da57806123c68882612366565b8452602084019350506020810190506123b3565b5050509392505050565b600082601f8301126123f9576123f8612283565b5b813561240984826020860161237b565b91505092915050565b60006020828403121561242857612427612214565b5b600082013567ffffffffffffffff81111561244657612445612219565b5b612452848285016123e4565b91505092915050565b612464816121d6565b811461246f57600080fd5b50565b6000813590506124818161245b565b92915050565b60006020828403121561249d5761249c612214565b5b60006124ab84828501612472565b91505092915050565b6124bd8161221e565b82525050565b60006020820190506124d860008301846124b4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612509826124de565b9050919050565b612519816124fe565b811461252457600080fd5b50565b60008135905061253681612510565b92915050565b60006020828403121561255257612551612214565b5b600061256084828501612527565b91505092915050565b612572816124fe565b82525050565b600060208201905061258d6000830184612569565b92915050565b6000819050919050565b60006125b86125b36125ae846124de565b612593565b6124de565b9050919050565b60006125ca8261259d565b9050919050565b60006125dc826125bf565b9050919050565b6125ec816125d1565b82525050565b600060208201905061260760008301846125e3565b92915050565b6000612618826125bf565b9050919050565b6126288161260d565b82525050565b6000602082019050612643600083018461261f565b92915050565b6000612654826125bf565b9050919050565b61266481612649565b82525050565b600060208201905061267f600083018461265b565b92915050565b600080fd5b600067ffffffffffffffff8211156126a5576126a4612299565b5b6126ae82612288565b9050602081019050919050565b82818337600083830152505050565b60006126dd6126d88461268a565b6122f9565b9050828152602081018484840111156126f9576126f8612685565b5b6127048482856126bb565b509392505050565b600082601f83011261272157612720612283565b5b81356127318482602086016126ca565b91505092915050565b6000602082840312156127505761274f612214565b5b600082013567ffffffffffffffff81111561276e5761276d612219565b5b61277a8482850161270c565b91505092915050565b600082825260208201905092915050565b7f43757272656e746c79207061757365642e000000000000000000000000000000600082015250565b60006127ca601183612783565b91506127d582612794565b602082019050919050565b600060208201905081810360008301526127f9816127bd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b61283881612345565b82525050565b60006060820190506128536000830186612569565b6128606020830185612569565b61286d604083018461282f565b949350505050565b600060408201905061288a6000830185612569565b612897602083018461282f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006128d882612345565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361290a5761290961289e565b5b600182019050919050565b7f467842617365526f6f7454756e6e656c3a204348494c445f54554e4e454c5f4160008201527f4c52454144595f53455400000000000000000000000000000000000000000000602082015250565b6000612971602a83612783565b915061297c82612915565b604082019050919050565b600060208201905081810360008301526129a081612964565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612a03602683612783565b9150612a0e826129a7565b604082019050919050565b60006020820190508181036000830152612a32816129f6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612a6f602083612783565b9150612a7a82612a39565b602082019050919050565b60006020820190508181036000830152612a9e81612a62565b9050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612adf578082015181840152602081019050612ac4565b83811115612aee576000848401525b50505050565b6000612aff82612aa5565b612b098185612ab0565b9350612b19818560208601612ac1565b612b2281612288565b840191505092915050565b6000604082019050612b426000830185612569565b8181036020830152612b548184612af4565b90509392505050565b6000819050919050565b612b78612b7382612345565b612b5d565b82525050565b600081905092915050565b6000612b9482612aa5565b612b9e8185612b7e565b9350612bae818560208601612ac1565b80840191505092915050565b6000612bc68286612b67565b602082019150612bd68285612b89565b9150612be28284612b67565b602082019150819050949350505050565b7f4678526f6f7454756e6e656c3a20455849545f414c52454144595f50524f434560008201527f5353454400000000000000000000000000000000000000000000000000000000602082015250565b6000612c4f602483612783565b9150612c5a82612bf3565b604082019050919050565b60006020820190508181036000830152612c7e81612c42565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f46585f4348494c445f5460008201527f554e4e454c000000000000000000000000000000000000000000000000000000602082015250565b6000612ce1602583612783565b9150612cec82612c85565b604082019050919050565b60006020820190508181036000830152612d1081612cd4565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f524543454950545f505260008201527f4f4f460000000000000000000000000000000000000000000000000000000000602082015250565b6000612d73602383612783565b9150612d7e82612d17565b604082019050919050565b60006020820190508181036000830152612da281612d66565b9050919050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f5349474e415455524500600082015250565b6000612ddf601f83612783565b9150612dea82612da9565b602082019050919050565b60006020820190508181036000830152612e0e81612dd2565b9050919050565b6000612e28612e238461268a565b6122f9565b905082815260208101848484011115612e4457612e43612685565b5b612e4f848285612ac1565b509392505050565b600082601f830112612e6c57612e6b612283565b5b8151612e7c848260208601612e15565b91505092915050565b600060208284031215612e9b57612e9a612214565b5b600082015167ffffffffffffffff811115612eb957612eb8612219565b5b612ec584828501612e57565b91505092915050565b6000612ed982612345565b9150612ee483612345565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f1d57612f1c61289e565b5b828202905092915050565b6000612f3382612345565b9150612f3e83612345565b925082821015612f5157612f5061289e565b5b828203905092915050565b6000612f6782612345565b9150612f7283612345565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612fa757612fa661289e565b5b828201905092915050565b6000602082019050612fc7600083018461282f565b92915050565b600081519050612fdc8161245b565b92915050565b600081519050612ff18161234f565b92915050565b60008151905061300681612510565b92915050565b600080600080600060a0868803121561302857613027612214565b5b600061303688828901612fcd565b955050602061304788828901612fe2565b945050604061305888828901612fe2565b935050606061306988828901612fe2565b925050608061307a88828901612ff7565b9150509295509295909350565b6000819050919050565b6130a261309d826121d6565b613087565b82525050565b60006130b48287612b67565b6020820191506130c48286612b67565b6020820191506130d48285613091565b6020820191506130e48284613091565b60208201915081905095945050505050565b7f4678526f6f7454756e6e656c3a20494e56414c49445f48454144455200000000600082015250565b600061312c601c83612783565b9150613137826130f6565b602082019050919050565b6000602082019050818103600083015261315b8161311f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061319c82612345565b91506131a783612345565b9250826131b7576131b6613162565b5b828206905092915050565b60006131cd82612345565b91506131d883612345565b9250826131e8576131e7613162565b5b828204905092915050565b600060ff82169050919050565b600061320b826131f3565b9150613216836131f3565b92508261322657613225613162565b5b828206905092915050565b600061323c826131f3565b9150613247836131f3565b92508261325757613256613162565b5b828204905092915050565b60008160011c9050919050565b6000808291508390505b60018511156132b9578086048111156132955761329461289e565b5b60018516156132a45780820291505b80810290506132b285613262565b9450613279565b94509492505050565b6000826132d2576001905061338e565b816132e0576000905061338e565b81600181146132f657600281146133005761332f565b600191505061338e565b60ff8411156133125761331161289e565b5b8360020a9150848211156133295761332861289e565b5b5061338e565b5060208310610133831016604e8410600b84101617156133645782820a90508381111561335f5761335e61289e565b5b61338e565b613371848484600161326f565b925090508184048111156133885761338761289e565b5b81810290505b9392505050565b60006133a082612345565b91506133ab83612345565b92506133d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846132c2565b905092915050565b7f496e76616c69642070726f6f66206c656e677468000000000000000000000000600082015250565b6000613416601483612783565b9150613421826133e0565b602082019050919050565b6000602082019050818103600083015261344581613409565b9050919050565b7f4c65616620696e64657820697320746f6f206269670000000000000000000000600082015250565b6000613482601583612783565b915061348d8261344c565b602082019050919050565b600060208201905081810360008301526134b181613475565b9050919050565b60006134c48285613091565b6020820191506134d48284613091565b6020820191508190509392505050565b60006134ef826131f3565b91506134fa836131f3565b92508282101561350d5761350c61289e565b5b82820390509291505056fea264697066735822122055850767a26826c0d7af9e2953f2168fd65c29bebaccd517028ac36194fcab3464736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a200000000000000000000000057b514cee8f1a8791289a22cdb50b550dd59dcc5
-----Decoded View---------------
Arg [0] : checkpointManager (address): 0x86E4Dc95c7FBdBf52e33D563BbDB00823894C287
Arg [1] : fxRoot (address): 0xfe5e5D361b2ad62c541bAb87C45a0B9B018389a2
Arg [2] : _supplies (address): 0x57b514cee8F1A8791289a22CDB50B550dD59DCc5
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287
Arg [1] : 000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2
Arg [2] : 00000000000000000000000057b514cee8f1a8791289a22cdb50b550dd59dcc5
Deployed Bytecode Sourcemap
41600:994:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23056:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42408:83;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41929:357;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23464:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31945:103;;;:::i;:::-;;42294:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31297:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41660:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23386:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41693:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23749:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23272:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23210:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32203:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28517:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23056:115;23105:66;23056:115;;;:::o;42408:83::-;31183:13;:11;:13::i;:::-;42477:6:::1;42468;;:15;;;;;;;;;;;;;;;;;;42408:83:::0;:::o;41929:357::-;42007:6;;;;;;;;;;;42006:7;41998:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;42046:13;42062:8;:15;42046:31;;42093:9;42088:191;42108:5;42104:1;:9;42088:191;;;42135:8;;;;;;;;;;;:21;;;42157:10;42177:4;42184:8;42193:1;42184:11;;;;;;;;:::i;:::-;;;;;;;;42135:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42211:56;42242:10;42254:8;42263:1;42254:11;;;;;;;;:::i;:::-;;;;;;;;42231:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42211:19;:56::i;:::-;42115:3;;;;;:::i;:::-;;;;42088:191;;;;41987:299;41929:357;:::o;23464:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;31945:103::-;31183:13;:11;:13::i;:::-;32010:30:::1;32037:1;32010:18;:30::i;:::-;31945:103::o:0;42294:106::-;31183:13;:11;:13::i;:::-;42382:9:::1;42362:8;;:30;;;;;;;;;;;;;;;;;;42294:106:::0;:::o;31297:87::-;31343:7;31370:6;;;;;;;;;;;31363:13;;31297:87;:::o;41660:24::-;;;;;;;;;;;;;:::o;23386:28::-;;;;;;;;;;;;;:::o;41693:18::-;;;;;;;;;;;;;:::o;23749:209::-;23858:3;23833:29;;:13;;;;;;;;;;;:29;;;23825:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;23936:14;23920:13;;:30;;;;;;;;;;;;;;;;;;23749:209;:::o;23272:43::-;;;;;;;;;;;;;:::o;23210:28::-;;;;;;;;;;;;:::o;32203:201::-;31183:13;:11;:13::i;:::-;32312:1:::1;32292:22;;:8;:22;;::::0;32284:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;32368:28;32387:8;32368:18;:28::i;:::-;32203:201:::0;:::o;28517:186::-;28591:20;28614:37;28641:9;28614:26;:37::i;:::-;28591:60;;28662:33;28687:7;28662:24;:33::i;:::-;28580:123;28517:186;:::o;31462:132::-;31537:12;:10;:12::i;:::-;31526:23;;:7;:5;:7::i;:::-;:23;;;31518:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31462:132::o;24263:128::-;24334:6;;;;;;;;;;:25;;;24360:13;;;;;;;;;;;24375:7;24334:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24263:128;:::o;32564:191::-;32638:16;32657:6;;;;;;;;;;;32638:25;;32683:8;32674:6;;:17;;;;;;;;;;;;;;;;;;32738:8;32707:40;;32728:8;32707:40;;;;;;;;;;;;32627:128;32564:191;:::o;24399:2411::-;24477:12;24502:44;24549:25;:9;:23;:25::i;:::-;24502:72;;24587:28;24618:30;:7;:28;:30::i;:::-;24587:61;;24659:19;24681:24;:7;:22;:24::i;:::-;24659:46;;24867:16;24945:11;25241:52;25277:15;25241:35;:52::i;:::-;25312:28;:7;:26;:28::i;:::-;24910:445;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24886:480;;;;;;24867:499;;25413:5;25385:33;;:14;:24;25400:8;25385:24;;;;;;;;;;;;;;;;;;;;;:33;;;25377:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;25497:4;25470:14;:24;25485:8;25470:24;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;25514:40;25557:20;:7;:18;:20::i;:::-;25514:63;;25588:32;25623:16;:7;:14;:16::i;:::-;25588:51;;25708:16;:3;:14;:16::i;:::-;25691:33;;:13;;;;;;;;;;;:33;;;25683:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;25779:19;25801:24;:7;:22;:24::i;:::-;25779:46;;25895:102;25922:17;:7;:15;:17::i;:::-;25941:15;25958:25;:7;:23;:25::i;:::-;25985:11;25895:26;:102::i;:::-;25873:187;;;;;;;;;;;;:::i;:::-;;;;;;;;;26113:245;26161:11;26187:22;:7;:20;:22::i;:::-;26224:19;:7;:17;:19::i;:::-;26258:11;26284:25;:7;:23;:25::i;:::-;26324:23;:7;:21;:23::i;:::-;26113:33;:245::i;:::-;;26371:41;26415:15;:3;:13;:15::i;:::-;26371:59;;23105:66;26505:22;;26473:27;:18;26489:1;26473:6;:15;;:18;;;;:::i;:::-;:25;:27::i;:::-;26465:36;;:62;26443:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;26656:20;26690:13;:3;:11;:13::i;:::-;26679:34;;;;;;;;;;;;:::i;:::-;26656:57;;26795:7;26788:14;;;;;;;;;;;24399:2411;;;:::o;42499:92::-;;:::o;29848:98::-;29901:7;29928:10;29921:17;;29848:98;:::o;13270:214::-;13335:18;;:::i;:::-;13366:38;13407:25;:16;:4;:14;:16::i;:::-;:23;:25::i;:::-;13366:66;;13452:24;;;;;;;;13464:11;13452:24;;;13445:31;;;13270:214;;;:::o;15449:146::-;15530:12;15562:25;:7;:12;;;15575:1;15562:15;;;;;;;;:::i;:::-;;;;;;;;:23;:25::i;:::-;15555:32;;15449:146;;;:::o;13782:134::-;13857:7;13884:24;:7;:12;;;13897:1;13884:15;;;;;;;;:::i;:::-;;;;;;;;:22;:24::i;:::-;13877:31;;13782:134;;;:::o;20987:795::-;21051:12;21076:20;:25;;;;;;;;;;;;;;21127:1;21116;:8;:12;21112:638;;;21145:12;21172:14;21195:26;21216:1;21219;21195:20;:26::i;:::-;21189:33;;21172:50;;21253:1;21241:8;:13;;;:30;;;;21270:1;21258:8;:13;;;21241:30;21237:349;;;21327:1;21323;21312;:8;:12;;;;:::i;:::-;:16;;;;:::i;:::-;21302:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21292:37;;21348:16;21367:26;21388:1;21391;21367:20;:26::i;:::-;21348:45;;21425:9;21412:7;21420:1;21412:10;;;;;;;;:::i;:::-;;;;;:22;;;;;;;;;;;21462:1;21453:10;;21273:206;21237:349;;;21539:1;21535;21524;:8;:12;;;;:::i;:::-;:16;;;;:::i;:::-;21514:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21504:37;;21569:1;21560:10;;21237:349;21607:9;21619:6;21607:18;;;;21602:137;21631:7;:14;21627:1;:18;21602:137;;;21684:39;21718:1;21709:6;21705:10;;:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;21721:1;21684:20;:39::i;:::-;21671:7;21679:1;21671:10;;;;;;;;:::i;:::-;;;;;:52;;;;;;;;;;;21647:3;;;;;:::i;:::-;;;;21602:137;;;;21130:620;;21112:638;21767:7;21760:14;;;20987:795;;;:::o;15750:138::-;15829:7;15856:24;:7;:12;;;15869:1;15856:15;;;;;;;;:::i;:::-;;;;;;;;:22;:24::i;:::-;15849:31;;15750:138;;;:::o;14361:931::-;14432:22;;:::i;:::-;14481:25;:7;:12;;;14494:1;14481:15;;;;;;;;:::i;:::-;;;;;;;;:23;:25::i;:::-;14467:7;:11;;:39;;;;14517:36;14556:23;:7;:11;;;:21;:23::i;:::-;14517:62;;14596:20;:11;:18;:20::i;:::-;14592:609;;;14674:20;:11;:18;:20::i;:::-;14659:7;:12;;:35;;;;14592:609;;;14782:23;14808:7;:11;;;14782:37;;14834:19;14886:1;14866:10;:17;:21;;;;:::i;:::-;14856:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14834:54;;14903:14;14932:15;15008:10;15004:2;15000:19;14990:29;;15058:6;15052:4;15048:17;15037:28;;15096:36;15101:6;15109:7;15118:6;:13;15096:4;:36::i;:::-;15162:27;:18;:6;:16;:18::i;:::-;:25;:27::i;:::-;15147:7;:12;;:42;;;;14712:489;;;;14592:609;15232:27;15251:7;15232:18;:27::i;:::-;15213:7;:16;;:46;;;;;15270:14;14361:931;;;:::o;16043:219::-;16106:10;;:::i;:::-;16129:32;16164:24;:7;:12;;;16177:1;16164:15;;;;;;;;:::i;:::-;;;;;;;;:22;:24::i;:::-;16189:7;:16;;;16164:42;;;;;;;;:::i;:::-;;;;;;;;16129:77;;16224:30;;;;;;;;16228:7;16224:30;;;;16237:16;:7;:14;:16::i;:::-;16224:30;;;16217:37;;;16043:219;;;:::o;16290:126::-;16349:7;16376:32;16396:3;:8;;;16405:1;16396:11;;;;;;;;:::i;:::-;;;;;;;;16376:19;:32::i;:::-;16369:39;;16290:126;;;:::o;14210:143::-;14285:7;14320:24;:7;:12;;;14333:1;14320:15;;;;;;;;:::i;:::-;;;;;;;;:22;:24::i;:::-;14312:33;;14305:40;;14210:143;;;:::o;15920:115::-;15984:12;16016:7;:11;;;16009:18;;15920:115;;;:::o;15300:141::-;15376:12;15408:25;:7;:12;;;15421:1;15408:15;;;;;;;;:::i;:::-;;;;;;;;:23;:25::i;:::-;15401:32;;15300:141;;;:::o;17488:2470::-;17659:4;17676:29;17708:35;17728:14;17708:19;:35::i;:::-;17676:67;;17754:38;17795:22;17812:4;17795:16;:22::i;:::-;17754:63;;17830:24;17865:42;17920:15;17938:4;17920:22;;17953:15;17985:17;18005:28;18021:11;18005:15;:28::i;:::-;17985:48;;18063:1;18048:4;:11;:16;18044:61;;18088:5;18081:12;;;;;;;;;;;18044:61;18122:9;18117:1834;18141:11;:18;18137:1;:22;18117:1834;;;18195:4;:11;18185:7;:21;18181:74;;;18234:5;18227:12;;;;;;;;;;;;18181:74;18285:36;18306:11;18318:1;18306:14;;;;;;;;:::i;:::-;;;;;;;;18285:20;:36::i;:::-;18271:50;;18361:11;18351:22;;;;;;18340:7;:33;18336:86;;18401:5;18394:12;;;;;;;;;;;;18336:86;18454:32;18471:11;18483:1;18471:14;;;;;;;;:::i;:::-;;;;;;;;18454:16;:32::i;:::-;18436:50;;18533:2;18507:15;:22;:28;18503:1437;;18571:4;:11;18560:7;:22;18556:276;;18674:5;18664:16;;;;;;18621:38;18639:15;18655:2;18639:19;;;;;;;;:::i;:::-;;;;;;;;18621:17;:38::i;:::-;18611:49;;;;;;:69;18607:206;;18716:4;18709:11;;;;;;;;;;;;18607:206;18784:5;18777:12;;;;;;;;;;;;18556:276;18852:20;18881:4;18886:7;18881:13;;;;;;;;:::i;:::-;;;;;;;;;;18875:20;;18852:43;;18935:2;18918:14;:19;;;18914:80;;;18969:5;18962:12;;;;;;;;;;;;;18914:80;19030:55;19053:15;19069:14;19053:31;;;;;;;;;;:::i;:::-;;;;;;;;19030:22;:55::i;:::-;19022:64;;19012:74;;19116:1;19105:12;;;;;:::i;:::-;;;18537:596;18503:1437;;;19169:1;19143:15;:22;:27;19139:801;;19191:17;19211:72;19230:37;19248:15;19264:1;19248:18;;;;;;;;:::i;:::-;;;;;;;;19230:17;:37::i;:::-;19269:4;19275:7;19211:18;:72::i;:::-;19191:92;;19329:4;:11;19316:9;19306:7;:19;;;;:::i;:::-;:34;19302:320;;19464:5;19454:16;;;;;;19412:37;19430:15;19446:1;19430:18;;;;;;;;:::i;:::-;;;;;;;;19412:17;:37::i;:::-;19402:48;;;;;;:68;19398:205;;19506:4;19499:11;;;;;;;;;;;;;19398:205;19574:5;19567:12;;;;;;;;;;;;;19302:320;19693:1;19680:9;:14;19676:75;;19726:5;19719:12;;;;;;;;;;;;;19676:75;19782:9;19771:20;;;;;:::i;:::-;;;19828:42;19851:15;19867:1;19851:18;;;;;;;;:::i;:::-;;;;;;;;19828:22;:42::i;:::-;19820:51;;19810:61;;19172:715;19139:801;;;19919:5;19912:12;;;;;;;;;;;;19139:801;18503:1437;18161:3;;;;;:::i;:::-;;;;18117:1834;;;;17665:2293;;;;;;;17488:2470;;;;;;;:::o;13924:132::-;13997:7;14024:24;:7;:12;;;14037:1;14024:15;;;;;;;;:::i;:::-;;;;;;;;:22;:24::i;:::-;14017:31;;13924:132;;;:::o;14064:138::-;14134:7;14169:24;:7;:12;;;14182:1;14169:15;;;;;;;;:::i;:::-;;;;;;;;:22;:24::i;:::-;14161:33;;14154:40;;14064:138;;;:::o;13492:135::-;13568:7;13595:24;:7;:12;;;13608:1;13595:15;;;;;;;;:::i;:::-;;;;;;;;:22;:24::i;:::-;13588:31;;13492:135;;;:::o;13635:139::-;13709:12;13741:25;:7;:12;;;13754:1;13741:15;;;;;;;;:::i;:::-;;;;;;;;:23;:25::i;:::-;13734:32;;13635:139;;;:::o;26818:710::-;27068:7;27089:18;27109;27131:17;27154;;;;;;;;;;;:30;;;27185:12;27154:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27088:110;;;;;;;;27233:204;27354:10;27340:11;:24;;;;:::i;:::-;27383:10;27412;27260:11;27273:9;27284:6;27292:11;27243:61;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27233:72;;;;;;:88;;:204;;;;;;:::i;:::-;27211:282;;;;;;;;;;;;:::i;:::-;;;;;;;;;27511:9;27504:16;;;;;26818:710;;;;;;;;:::o;16424:133::-;16482:16;;:::i;:::-;16518:31;;;;;;;;16528:20;:3;:8;;;16537:1;16528:11;;;;;;;;:::i;:::-;;;;;;;;:18;:20::i;:::-;16518:31;;;16511:38;;16424:133;;;:::o;16844:151::-;16925:24;;:::i;:::-;16969:6;:11;;;16981:5;16969:18;;;;;;;;:::i;:::-;;;;;;;;16962:25;;16844:151;;;;:::o;6978:564::-;7038:7;7077:1;7066:4;:8;;;:12;:30;;;;;7094:2;7082:4;:8;;;:14;;7066:30;7058:39;;;;;;7110:14;7127:27;7142:4;:11;;;7127:14;:27::i;:::-;7110:44;;7165:11;7190:6;7179:4;:8;;;:17;;;;:::i;:::-;7165:31;;7209:14;7234;7265:6;7251:4;:11;;;:20;;;;:::i;:::-;7234:37;;7322:6;7316:13;7306:23;;7415:2;7410:3;7407:11;7404:94;;;7477:3;7473:2;7469:12;7464:3;7460:22;7452:6;7448:35;7438:45;;7404:94;7528:6;7521:13;;;;;;6978:564;;;:::o;16565:117::-;16621:12;16653:21;:3;:8;;;16662:1;16653:11;;;;;;;;:::i;:::-;;;;;;;;:19;:21::i;:::-;16646:28;;16565:117;;;:::o;2744:228::-;2805:14;;:::i;:::-;2832;2901:4;2895;2891:15;2881:25;;2936:28;;;;;;;;2944:4;:11;2936:28;;;;2957:6;2936:28;;;2929:35;;;2744:228;;;:::o;3801:534::-;3861:16;3898:12;3905:4;3898:6;:12::i;:::-;3890:21;;;;;;3924:13;3940:14;3949:4;3940:8;:14::i;:::-;3924:30;;3965:23;4005:5;3991:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3965:46;;4024:14;4055:27;4070:4;:11;;;4055:14;:27::i;:::-;4041:4;:11;;;:41;;;;:::i;:::-;4024:58;;4093:15;4124:9;4136:1;4124:13;;4119:183;4143:5;4139:1;:9;4119:183;;;4180:19;4192:6;4180:11;:19::i;:::-;4170:29;;4226:24;;;;;;;;4234:7;4226:24;;;;4243:6;4226:24;;;4214:6;4221:1;4214:9;;;;;;;;:::i;:::-;;;;;;;:36;;;;4283:7;4274:6;:16;;;;:::i;:::-;4265:25;;4150:3;;;;;:::i;:::-;;;;4119:183;;;;4321:6;4314:13;;;;;;3801:534;;;:::o;7899:454::-;7960:12;8004:1;7993:4;:8;;;:12;7985:21;;;;;;8019:14;8036:27;8051:4;:11;;;8036:14;:27::i;:::-;8019:44;;8074:11;8099:6;8088:4;:8;;;:17;;;;:::i;:::-;8074:31;;8131:19;8163:3;8153:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8131:36;;8180:15;8251:6;8245:4;8241:17;8230:28;;8281:40;8300:6;8286:4;:11;;;:20;;;;:::i;:::-;8308:7;8317:3;8281:4;:40::i;:::-;8339:6;8332:13;;;;;;7899:454;;;:::o;21790:187::-;21871:6;21913:1;21908;21904;:5;;;;:::i;:::-;:10;:64;;21964:4;21950:3;21958:1;21954;:5;;;;:::i;:::-;21950:10;;;;;;;;:::i;:::-;;;;;;;;;;21944:17;;:24;;;;:::i;:::-;21904:64;;;21937:4;21923:3;21931:1;21927;:5;;;;:::i;:::-;21923:10;;;;;;;;:::i;:::-;;;;;;;;;;21917:17;;:24;;;;:::i;:::-;21904:64;21897:72;;21890:79;;21790:187;;;;:::o;4442:332::-;4502:4;4535:1;4523:4;:8;;;:13;4519:31;;4545:5;4538:12;;;;4519:31;4563:11;4585:14;4602:4;:11;;;4585:28;;4671:6;4665:13;4662:1;4657:22;4648:31;;1517:4;4706:24;;:5;:24;;;4702:42;;;4739:5;4732:12;;;;;;4702:42;4762:4;4755:11;;;;4442:332;;;;:::o;12460:802::-;12583:1;12576:3;:8;12572:21;12586:7;12572:21;12653:201;12011:2;12660:16;;:3;:16;12653:201;;12758:3;12752:10;12746:4;12739:24;12011:2;12794:16;;;;;;;:::i;:::-;;;12011:2;12825:17;;;;;;;:::i;:::-;;;12011:2;12678:16;;;;;;;:::i;:::-;;;12653:201;;;12885:1;12878:3;:8;12874:21;12888:7;12874:21;12988:12;13028:1;13021:3;12011:2;13009:15;;;;;;:::i;:::-;13003:3;:22;;;;:::i;:::-;:26;;;;:::i;:::-;12988:41;;13099:4;13095:9;13089:3;13083:10;13079:26;13168:4;13161;13155:11;13151:22;13235:7;13225:8;13222:21;13216:4;13209:35;13049:206;;;12460:802;;;;:::o;6765:205::-;6828:7;6909:2;6897:4;:8;;;:14;6889:23;;;;;;6948:12;6955:4;6948:6;:12::i;:::-;6925:37;;6765:205;;;:::o;6059:348::-;6123:12;6148:19;6180:4;:8;;;6170:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6148:41;;6221:1;6204:6;:13;:18;6200:37;;6231:6;6224:13;;;;;6200:37;6250:11;6313:6;6307:4;6303:17;6296:24;;6343:32;6348:4;:11;;;6361:3;6366:4;:8;;;6343:4;:32::i;:::-;6393:6;6386:13;;;;6059:348;;;;:::o;7582:309::-;7648:7;7716:2;7704:4;:8;;;:14;7696:23;;;;;;7732:14;7757;7788:1;7774:4;:11;;;:15;;;;:::i;:::-;7757:32;;7840:6;7834:13;7824:23;;7877:6;7870:13;;;;7582:309;;;:::o;19966:978::-;20119:7;20139:11;20153:1;20139:15;;20352:24;20379:35;20395:18;20379:15;:35::i;:::-;20352:62;;20425:23;20461:11;:18;20451:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20425:55;;20595:9;20607:7;20595:19;;20590:170;20630:11;:18;20620:7;:28;;;;:::i;:::-;20616:1;:32;20590:170;;;20670:17;20690:4;20695:1;20690:7;;;;;;;;:::i;:::-;;;;;;;;;;20670:27;;20738:10;20712;20727:7;20723:1;:11;;;;:::i;:::-;20712:23;;;;;;;;:::i;:::-;;;;;:36;;;;;;;;;;;20655:105;20650:3;;;;;:::i;:::-;;;;20590:170;;;;20812:10;20802:21;;;;;;20786:11;20776:22;;;;;;:47;20772:144;;20846:11;:18;20840:24;;20772:144;;;20903:1;20897:7;;20772:144;20933:3;20926:10;;;;;19966:978;;;;;:::o;112:1046::-;270:4;316:1;310:2;295:5;:12;:17;;;;:::i;:::-;:22;287:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;353:19;390:2;375:5;:12;:17;;;;:::i;:::-;353:39;;550:11;547:1;:14;;;;:::i;:::-;539:5;:22;531:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;600:20;631;654:4;631:27;;674:9;686:2;674:14;;669:440;695:5;:12;690:1;:17;669:440;;794:1;787:5;783:13;777:20;761:36;;845:1;840;832:5;:9;;;;:::i;:::-;:14;828:236;;909:12;923;892:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;882:55;;;;;;867:70;;828:236;;;1020:12;1034;1003:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;993:55;;;;;;978:70;;828:236;1096:1;1088:5;:9;;;;:::i;:::-;1080:17;;714:2;709:7;;;;;:::i;:::-;;;669:440;;;;1142:8;1126:12;:24;1119:31;;;;;112:1046;;;;;;:::o;10271:533::-;10333:7;10353:13;10424:6;10418:13;10415:1;10410:22;10401:31;;1426:4;10459:26;;:5;:26;10455:341;;;10494:1;10487:8;;;;;10455:341;1472:4;10515:25;;:5;:25;:83;;;;1517:4;10545:25;;:5;:25;;:52;;;;;1561:4;10574:23;;:5;:23;10545:52;10515:83;10511:285;;;10607:1;10600:8;;;;;10511:285;1517:4;10628:24;;:5;:24;10624:172;;;10739:1;10734;1472:4;10714:21;;;;:::i;:::-;10705:31;;:5;:31;;;;:::i;:::-;:35;;;;:::i;:::-;10698:42;;;;;10624:172;10795:1;10790;1561:4;10772:19;;;;:::i;:::-;10763:29;;:5;:29;;;;:::i;:::-;:33;;;;:::i;:::-;10756:40;;;10271:533;;;;:::o;8468:436::-;8529:7;8565:1;8553:4;:8;;;:13;8549:27;;8575:1;8568:8;;;;8549:27;8589:13;8617:15;8649:27;8664:4;:11;;;8649:14;:27::i;:::-;8635:4;:11;;;:41;;;;:::i;:::-;8617:59;;8687:14;8718:4;:8;;;8704:4;:11;;;:22;;;;:::i;:::-;8687:39;;8737:135;8754:6;8744:7;:16;8737:135;;;8797:20;8809:7;8797:11;:20::i;:::-;8787:7;:30;;;;:::i;:::-;8777:40;;8853:7;;;;;:::i;:::-;;;;8737:135;;;8891:5;8884:12;;;;;8468:436;;;;:::o;8956:1260::-;9015:7;9035:15;9061:13;9132:6;9126:13;9123:1;9118:22;9109:31;;1426:4;9167:26;;:5;:26;9163:1019;;;9205:1;9195:11;;9163:1019;;;1472:4;9226:25;;:5;:25;9222:960;;;9292:1;1426:4;9263:26;;:5;:26;;;;:::i;:::-;:30;;;;:::i;:::-;9253:40;;9222:960;;;1517:4;9313:24;;:5;:24;9309:873;;;9408:4;9401:5;9397:16;9488:1;9480:6;9476:14;9466:24;;9628:7;9624:2;9620:16;9615:3;9611:26;9602:6;9596:13;9592:46;9726:1;9717:7;9713:15;9704:7;9700:29;9689:40;;9363:381;;9309:873;;;1561:4;9765:23;;:5;:23;9761:421;;;9842:1;1517:4;9815:24;;:5;:24;;;;:::i;:::-;:28;;;;:::i;:::-;9805:38;;9761:421;;;9930:4;9923:5;9919:16;9975:1;9967:6;9963:14;9953:24;;10048:7;10044:2;10040:16;10035:3;10031:26;10022:6;10016:13;10012:46;10153:1;10144:7;10140:15;10131:7;10127:29;10116:40;;9885:286;;9761:421;9309:873;9222:960;9163:1019;10201:7;10194:14;;;;8956:1260;;;:::o;10969:796::-;11092:1;11085:3;:8;11081:21;11095:7;11081:21;11162:201;1599:2;11169:16;;:3;:16;11162:201;;11267:3;11261:10;11255:4;11248:24;1599:2;11303:16;;;;;;;:::i;:::-;;;1599:2;11334:17;;;;;;;:::i;:::-;;;1599:2;11187:16;;;;;;;:::i;:::-;;;11162:201;;;11386:1;11379:3;:8;11375:21;11389:7;11375:21;11489:12;11529:1;11522:3;1599:2;11510:15;;;;;;:::i;:::-;11504:3;:22;;;;:::i;:::-;:26;;;;:::i;:::-;11489:41;;11602:4;11598:9;11592:3;11586:10;11582:26;11671:4;11664;11658:11;11654:22;11738:7;11728:8;11725:21;11719:4;11712:35;11552:206;;;10969:796;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:90;803:7;846:5;839:13;832:21;821:32;;769:90;;;:::o;865:116::-;935:21;950:5;935:21;:::i;:::-;928:5;925:32;915:60;;971:1;968;961:12;915:60;865:116;:::o;987:133::-;1030:5;1068:6;1055:20;1046:29;;1084:30;1108:5;1084:30;:::i;:::-;987:133;;;;:::o;1126:323::-;1182:6;1231:2;1219:9;1210:7;1206:23;1202:32;1199:119;;;1237:79;;:::i;:::-;1199:119;1357:1;1382:50;1424:7;1415:6;1404:9;1400:22;1382:50;:::i;:::-;1372:60;;1328:114;1126:323;;;;:::o;1455:117::-;1564:1;1561;1554:12;1578:102;1619:6;1670:2;1666:7;1661:2;1654:5;1650:14;1646:28;1636:38;;1578:102;;;:::o;1686:180::-;1734:77;1731:1;1724:88;1831:4;1828:1;1821:15;1855:4;1852:1;1845:15;1872:281;1955:27;1977:4;1955:27;:::i;:::-;1947:6;1943:40;2085:6;2073:10;2070:22;2049:18;2037:10;2034:34;2031:62;2028:88;;;2096:18;;:::i;:::-;2028:88;2136:10;2132:2;2125:22;1915:238;1872:281;;:::o;2159:129::-;2193:6;2220:20;;:::i;:::-;2210:30;;2249:33;2277:4;2269:6;2249:33;:::i;:::-;2159:129;;;:::o;2294:311::-;2371:4;2461:18;2453:6;2450:30;2447:56;;;2483:18;;:::i;:::-;2447:56;2533:4;2525:6;2521:17;2513:25;;2593:4;2587;2583:15;2575:23;;2294:311;;;:::o;2611:117::-;2720:1;2717;2710:12;2734:77;2771:7;2800:5;2789:16;;2734:77;;;:::o;2817:122::-;2890:24;2908:5;2890:24;:::i;:::-;2883:5;2880:35;2870:63;;2929:1;2926;2919:12;2870:63;2817:122;:::o;2945:139::-;2991:5;3029:6;3016:20;3007:29;;3045:33;3072:5;3045:33;:::i;:::-;2945:139;;;;:::o;3107:710::-;3203:5;3228:81;3244:64;3301:6;3244:64;:::i;:::-;3228:81;:::i;:::-;3219:90;;3329:5;3358:6;3351:5;3344:21;3392:4;3385:5;3381:16;3374:23;;3445:4;3437:6;3433:17;3425:6;3421:30;3474:3;3466:6;3463:15;3460:122;;;3493:79;;:::i;:::-;3460:122;3608:6;3591:220;3625:6;3620:3;3617:15;3591:220;;;3700:3;3729:37;3762:3;3750:10;3729:37;:::i;:::-;3724:3;3717:50;3796:4;3791:3;3787:14;3780:21;;3667:144;3651:4;3646:3;3642:14;3635:21;;3591:220;;;3595:21;3209:608;;3107:710;;;;;:::o;3840:370::-;3911:5;3960:3;3953:4;3945:6;3941:17;3937:27;3927:122;;3968:79;;:::i;:::-;3927:122;4085:6;4072:20;4110:94;4200:3;4192:6;4185:4;4177:6;4173:17;4110:94;:::i;:::-;4101:103;;3917:293;3840:370;;;;:::o;4216:539::-;4300:6;4349:2;4337:9;4328:7;4324:23;4320:32;4317:119;;;4355:79;;:::i;:::-;4317:119;4503:1;4492:9;4488:17;4475:31;4533:18;4525:6;4522:30;4519:117;;;4555:79;;:::i;:::-;4519:117;4660:78;4730:7;4721:6;4710:9;4706:22;4660:78;:::i;:::-;4650:88;;4446:302;4216:539;;;;:::o;4761:122::-;4834:24;4852:5;4834:24;:::i;:::-;4827:5;4824:35;4814:63;;4873:1;4870;4863:12;4814:63;4761:122;:::o;4889:139::-;4935:5;4973:6;4960:20;4951:29;;4989:33;5016:5;4989:33;:::i;:::-;4889:139;;;;:::o;5034:329::-;5093:6;5142:2;5130:9;5121:7;5117:23;5113:32;5110:119;;;5148:79;;:::i;:::-;5110:119;5268:1;5293:53;5338:7;5329:6;5318:9;5314:22;5293:53;:::i;:::-;5283:63;;5239:117;5034:329;;;;:::o;5369:109::-;5450:21;5465:5;5450:21;:::i;:::-;5445:3;5438:34;5369:109;;:::o;5484:210::-;5571:4;5609:2;5598:9;5594:18;5586:26;;5622:65;5684:1;5673:9;5669:17;5660:6;5622:65;:::i;:::-;5484:210;;;;:::o;5700:126::-;5737:7;5777:42;5770:5;5766:54;5755:65;;5700:126;;;:::o;5832:96::-;5869:7;5898:24;5916:5;5898:24;:::i;:::-;5887:35;;5832:96;;;:::o;5934:122::-;6007:24;6025:5;6007:24;:::i;:::-;6000:5;5997:35;5987:63;;6046:1;6043;6036:12;5987:63;5934:122;:::o;6062:139::-;6108:5;6146:6;6133:20;6124:29;;6162:33;6189:5;6162:33;:::i;:::-;6062:139;;;;:::o;6207:329::-;6266:6;6315:2;6303:9;6294:7;6290:23;6286:32;6283:119;;;6321:79;;:::i;:::-;6283:119;6441:1;6466:53;6511:7;6502:6;6491:9;6487:22;6466:53;:::i;:::-;6456:63;;6412:117;6207:329;;;;:::o;6542:118::-;6629:24;6647:5;6629:24;:::i;:::-;6624:3;6617:37;6542:118;;:::o;6666:222::-;6759:4;6797:2;6786:9;6782:18;6774:26;;6810:71;6878:1;6867:9;6863:17;6854:6;6810:71;:::i;:::-;6666:222;;;;:::o;6894:60::-;6922:3;6943:5;6936:12;;6894:60;;;:::o;6960:142::-;7010:9;7043:53;7061:34;7070:24;7088:5;7070:24;:::i;:::-;7061:34;:::i;:::-;7043:53;:::i;:::-;7030:66;;6960:142;;;:::o;7108:126::-;7158:9;7191:37;7222:5;7191:37;:::i;:::-;7178:50;;7108:126;;;:::o;7240:143::-;7307:9;7340:37;7371:5;7340:37;:::i;:::-;7327:50;;7240:143;;;:::o;7389:165::-;7493:54;7541:5;7493:54;:::i;:::-;7488:3;7481:67;7389:165;;:::o;7560:256::-;7670:4;7708:2;7697:9;7693:18;7685:26;;7721:88;7806:1;7795:9;7791:17;7782:6;7721:88;:::i;:::-;7560:256;;;;:::o;7822:153::-;7899:9;7932:37;7963:5;7932:37;:::i;:::-;7919:50;;7822:153;;;:::o;7981:185::-;8095:64;8153:5;8095:64;:::i;:::-;8090:3;8083:77;7981:185;;:::o;8172:276::-;8292:4;8330:2;8319:9;8315:18;8307:26;;8343:98;8438:1;8427:9;8423:17;8414:6;8343:98;:::i;:::-;8172:276;;;;:::o;8454:149::-;8527:9;8560:37;8591:5;8560:37;:::i;:::-;8547:50;;8454:149;;;:::o;8609:177::-;8719:60;8773:5;8719:60;:::i;:::-;8714:3;8707:73;8609:177;;:::o;8792:268::-;8908:4;8946:2;8935:9;8931:18;8923:26;;8959:94;9050:1;9039:9;9035:17;9026:6;8959:94;:::i;:::-;8792:268;;;;:::o;9066:117::-;9175:1;9172;9165:12;9189:307;9250:4;9340:18;9332:6;9329:30;9326:56;;;9362:18;;:::i;:::-;9326:56;9400:29;9422:6;9400:29;:::i;:::-;9392:37;;9484:4;9478;9474:15;9466:23;;9189:307;;;:::o;9502:154::-;9586:6;9581:3;9576;9563:30;9648:1;9639:6;9634:3;9630:16;9623:27;9502:154;;;:::o;9662:410::-;9739:5;9764:65;9780:48;9821:6;9780:48;:::i;:::-;9764:65;:::i;:::-;9755:74;;9852:6;9845:5;9838:21;9890:4;9883:5;9879:16;9928:3;9919:6;9914:3;9910:16;9907:25;9904:112;;;9935:79;;:::i;:::-;9904:112;10025:41;10059:6;10054:3;10049;10025:41;:::i;:::-;9745:327;9662:410;;;;;:::o;10091:338::-;10146:5;10195:3;10188:4;10180:6;10176:17;10172:27;10162:122;;10203:79;;:::i;:::-;10162:122;10320:6;10307:20;10345:78;10419:3;10411:6;10404:4;10396:6;10392:17;10345:78;:::i;:::-;10336:87;;10152:277;10091:338;;;;:::o;10435:507::-;10503:6;10552:2;10540:9;10531:7;10527:23;10523:32;10520:119;;;10558:79;;:::i;:::-;10520:119;10706:1;10695:9;10691:17;10678:31;10736:18;10728:6;10725:30;10722:117;;;10758:79;;:::i;:::-;10722:117;10863:62;10917:7;10908:6;10897:9;10893:22;10863:62;:::i;:::-;10853:72;;10649:286;10435:507;;;;:::o;10948:169::-;11032:11;11066:6;11061:3;11054:19;11106:4;11101:3;11097:14;11082:29;;10948:169;;;;:::o;11123:167::-;11263:19;11259:1;11251:6;11247:14;11240:43;11123:167;:::o;11296:366::-;11438:3;11459:67;11523:2;11518:3;11459:67;:::i;:::-;11452:74;;11535:93;11624:3;11535:93;:::i;:::-;11653:2;11648:3;11644:12;11637:19;;11296:366;;;:::o;11668:419::-;11834:4;11872:2;11861:9;11857:18;11849:26;;11921:9;11915:4;11911:20;11907:1;11896:9;11892:17;11885:47;11949:131;12075:4;11949:131;:::i;:::-;11941:139;;11668:419;;;:::o;12093:180::-;12141:77;12138:1;12131:88;12238:4;12235:1;12228:15;12262:4;12259:1;12252:15;12279:118;12366:24;12384:5;12366:24;:::i;:::-;12361:3;12354:37;12279:118;;:::o;12403:442::-;12552:4;12590:2;12579:9;12575:18;12567:26;;12603:71;12671:1;12660:9;12656:17;12647:6;12603:71;:::i;:::-;12684:72;12752:2;12741:9;12737:18;12728:6;12684:72;:::i;:::-;12766;12834:2;12823:9;12819:18;12810:6;12766:72;:::i;:::-;12403:442;;;;;;:::o;12851:332::-;12972:4;13010:2;12999:9;12995:18;12987:26;;13023:71;13091:1;13080:9;13076:17;13067:6;13023:71;:::i;:::-;13104:72;13172:2;13161:9;13157:18;13148:6;13104:72;:::i;:::-;12851:332;;;;;:::o;13189:180::-;13237:77;13234:1;13227:88;13334:4;13331:1;13324:15;13358:4;13355:1;13348:15;13375:233;13414:3;13437:24;13455:5;13437:24;:::i;:::-;13428:33;;13483:66;13476:5;13473:77;13470:103;;13553:18;;:::i;:::-;13470:103;13600:1;13593:5;13589:13;13582:20;;13375:233;;;:::o;13614:229::-;13754:34;13750:1;13742:6;13738:14;13731:58;13823:12;13818:2;13810:6;13806:15;13799:37;13614:229;:::o;13849:366::-;13991:3;14012:67;14076:2;14071:3;14012:67;:::i;:::-;14005:74;;14088:93;14177:3;14088:93;:::i;:::-;14206:2;14201:3;14197:12;14190:19;;13849:366;;;:::o;14221:419::-;14387:4;14425:2;14414:9;14410:18;14402:26;;14474:9;14468:4;14464:20;14460:1;14449:9;14445:17;14438:47;14502:131;14628:4;14502:131;:::i;:::-;14494:139;;14221:419;;;:::o;14646:225::-;14786:34;14782:1;14774:6;14770:14;14763:58;14855:8;14850:2;14842:6;14838:15;14831:33;14646:225;:::o;14877:366::-;15019:3;15040:67;15104:2;15099:3;15040:67;:::i;:::-;15033:74;;15116:93;15205:3;15116:93;:::i;:::-;15234:2;15229:3;15225:12;15218:19;;14877:366;;;:::o;15249:419::-;15415:4;15453:2;15442:9;15438:18;15430:26;;15502:9;15496:4;15492:20;15488:1;15477:9;15473:17;15466:47;15530:131;15656:4;15530:131;:::i;:::-;15522:139;;15249:419;;;:::o;15674:182::-;15814:34;15810:1;15802:6;15798:14;15791:58;15674:182;:::o;15862:366::-;16004:3;16025:67;16089:2;16084:3;16025:67;:::i;:::-;16018:74;;16101:93;16190:3;16101:93;:::i;:::-;16219:2;16214:3;16210:12;16203:19;;15862:366;;;:::o;16234:419::-;16400:4;16438:2;16427:9;16423:18;16415:26;;16487:9;16481:4;16477:20;16473:1;16462:9;16458:17;16451:47;16515:131;16641:4;16515:131;:::i;:::-;16507:139;;16234:419;;;:::o;16659:98::-;16710:6;16744:5;16738:12;16728:22;;16659:98;;;:::o;16763:168::-;16846:11;16880:6;16875:3;16868:19;16920:4;16915:3;16911:14;16896:29;;16763:168;;;;:::o;16937:307::-;17005:1;17015:113;17029:6;17026:1;17023:13;17015:113;;;17114:1;17109:3;17105:11;17099:18;17095:1;17090:3;17086:11;17079:39;17051:2;17048:1;17044:10;17039:15;;17015:113;;;17146:6;17143:1;17140:13;17137:101;;;17226:1;17217:6;17212:3;17208:16;17201:27;17137:101;16986:258;16937:307;;;:::o;17250:360::-;17336:3;17364:38;17396:5;17364:38;:::i;:::-;17418:70;17481:6;17476:3;17418:70;:::i;:::-;17411:77;;17497:52;17542:6;17537:3;17530:4;17523:5;17519:16;17497:52;:::i;:::-;17574:29;17596:6;17574:29;:::i;:::-;17569:3;17565:39;17558:46;;17340:270;17250:360;;;;:::o;17616:419::-;17755:4;17793:2;17782:9;17778:18;17770:26;;17806:71;17874:1;17863:9;17859:17;17850:6;17806:71;:::i;:::-;17924:9;17918:4;17914:20;17909:2;17898:9;17894:18;17887:48;17952:76;18023:4;18014:6;17952:76;:::i;:::-;17944:84;;17616:419;;;;;:::o;18041:79::-;18080:7;18109:5;18098:16;;18041:79;;;:::o;18126:157::-;18231:45;18251:24;18269:5;18251:24;:::i;:::-;18231:45;:::i;:::-;18226:3;18219:58;18126:157;;:::o;18289:147::-;18390:11;18427:3;18412:18;;18289:147;;;;:::o;18442:373::-;18546:3;18574:38;18606:5;18574:38;:::i;:::-;18628:88;18709:6;18704:3;18628:88;:::i;:::-;18621:95;;18725:52;18770:6;18765:3;18758:4;18751:5;18747:16;18725:52;:::i;:::-;18802:6;18797:3;18793:16;18786:23;;18550:265;18442:373;;;;:::o;18821:553::-;19007:3;19022:75;19093:3;19084:6;19022:75;:::i;:::-;19122:2;19117:3;19113:12;19106:19;;19142:93;19231:3;19222:6;19142:93;:::i;:::-;19135:100;;19245:75;19316:3;19307:6;19245:75;:::i;:::-;19345:2;19340:3;19336:12;19329:19;;19365:3;19358:10;;18821:553;;;;;;:::o;19380:223::-;19520:34;19516:1;19508:6;19504:14;19497:58;19589:6;19584:2;19576:6;19572:15;19565:31;19380:223;:::o;19609:366::-;19751:3;19772:67;19836:2;19831:3;19772:67;:::i;:::-;19765:74;;19848:93;19937:3;19848:93;:::i;:::-;19966:2;19961:3;19957:12;19950:19;;19609:366;;;:::o;19981:419::-;20147:4;20185:2;20174:9;20170:18;20162:26;;20234:9;20228:4;20224:20;20220:1;20209:9;20205:17;20198:47;20262:131;20388:4;20262:131;:::i;:::-;20254:139;;19981:419;;;:::o;20406:224::-;20546:34;20542:1;20534:6;20530:14;20523:58;20615:7;20610:2;20602:6;20598:15;20591:32;20406:224;:::o;20636:366::-;20778:3;20799:67;20863:2;20858:3;20799:67;:::i;:::-;20792:74;;20875:93;20964:3;20875:93;:::i;:::-;20993:2;20988:3;20984:12;20977:19;;20636:366;;;:::o;21008:419::-;21174:4;21212:2;21201:9;21197:18;21189:26;;21261:9;21255:4;21251:20;21247:1;21236:9;21232:17;21225:47;21289:131;21415:4;21289:131;:::i;:::-;21281:139;;21008:419;;;:::o;21433:222::-;21573:34;21569:1;21561:6;21557:14;21550:58;21642:5;21637:2;21629:6;21625:15;21618:30;21433:222;:::o;21661:366::-;21803:3;21824:67;21888:2;21883:3;21824:67;:::i;:::-;21817:74;;21900:93;21989:3;21900:93;:::i;:::-;22018:2;22013:3;22009:12;22002:19;;21661:366;;;:::o;22033:419::-;22199:4;22237:2;22226:9;22222:18;22214:26;;22286:9;22280:4;22276:20;22272:1;22261:9;22257:17;22250:47;22314:131;22440:4;22314:131;:::i;:::-;22306:139;;22033:419;;;:::o;22458:181::-;22598:33;22594:1;22586:6;22582:14;22575:57;22458:181;:::o;22645:366::-;22787:3;22808:67;22872:2;22867:3;22808:67;:::i;:::-;22801:74;;22884:93;22973:3;22884:93;:::i;:::-;23002:2;22997:3;22993:12;22986:19;;22645:366;;;:::o;23017:419::-;23183:4;23221:2;23210:9;23206:18;23198:26;;23270:9;23264:4;23260:20;23256:1;23245:9;23241:17;23234:47;23298:131;23424:4;23298:131;:::i;:::-;23290:139;;23017:419;;;:::o;23442:::-;23530:5;23555:65;23571:48;23612:6;23571:48;:::i;:::-;23555:65;:::i;:::-;23546:74;;23643:6;23636:5;23629:21;23681:4;23674:5;23670:16;23719:3;23710:6;23705:3;23701:16;23698:25;23695:112;;;23726:79;;:::i;:::-;23695:112;23816:39;23848:6;23843:3;23838;23816:39;:::i;:::-;23536:325;23442:419;;;;;:::o;23880:353::-;23946:5;23995:3;23988:4;23980:6;23976:17;23972:27;23962:122;;24003:79;;:::i;:::-;23962:122;24113:6;24107:13;24138:89;24223:3;24215:6;24208:4;24200:6;24196:17;24138:89;:::i;:::-;24129:98;;23952:281;23880:353;;;;:::o;24239:522::-;24318:6;24367:2;24355:9;24346:7;24342:23;24338:32;24335:119;;;24373:79;;:::i;:::-;24335:119;24514:1;24503:9;24499:17;24493:24;24544:18;24536:6;24533:30;24530:117;;;24566:79;;:::i;:::-;24530:117;24671:73;24736:7;24727:6;24716:9;24712:22;24671:73;:::i;:::-;24661:83;;24464:290;24239:522;;;;:::o;24767:348::-;24807:7;24830:20;24848:1;24830:20;:::i;:::-;24825:25;;24864:20;24882:1;24864:20;:::i;:::-;24859:25;;25052:1;24984:66;24980:74;24977:1;24974:81;24969:1;24962:9;24955:17;24951:105;24948:131;;;25059:18;;:::i;:::-;24948:131;25107:1;25104;25100:9;25089:20;;24767:348;;;;:::o;25121:191::-;25161:4;25181:20;25199:1;25181:20;:::i;:::-;25176:25;;25215:20;25233:1;25215:20;:::i;:::-;25210:25;;25254:1;25251;25248:8;25245:34;;;25259:18;;:::i;:::-;25245:34;25304:1;25301;25297:9;25289:17;;25121:191;;;;:::o;25318:305::-;25358:3;25377:20;25395:1;25377:20;:::i;:::-;25372:25;;25411:20;25429:1;25411:20;:::i;:::-;25406:25;;25565:1;25497:66;25493:74;25490:1;25487:81;25484:107;;;25571:18;;:::i;:::-;25484:107;25615:1;25612;25608:9;25601:16;;25318:305;;;;:::o;25629:222::-;25722:4;25760:2;25749:9;25745:18;25737:26;;25773:71;25841:1;25830:9;25826:17;25817:6;25773:71;:::i;:::-;25629:222;;;;:::o;25857:143::-;25914:5;25945:6;25939:13;25930:22;;25961:33;25988:5;25961:33;:::i;:::-;25857:143;;;;:::o;26006:::-;26063:5;26094:6;26088:13;26079:22;;26110:33;26137:5;26110:33;:::i;:::-;26006:143;;;;:::o;26155:::-;26212:5;26243:6;26237:13;26228:22;;26259:33;26286:5;26259:33;:::i;:::-;26155:143;;;;:::o;26304:977::-;26410:6;26418;26426;26434;26442;26491:3;26479:9;26470:7;26466:23;26462:33;26459:120;;;26498:79;;:::i;:::-;26459:120;26618:1;26643:64;26699:7;26690:6;26679:9;26675:22;26643:64;:::i;:::-;26633:74;;26589:128;26756:2;26782:64;26838:7;26829:6;26818:9;26814:22;26782:64;:::i;:::-;26772:74;;26727:129;26895:2;26921:64;26977:7;26968:6;26957:9;26953:22;26921:64;:::i;:::-;26911:74;;26866:129;27034:2;27060:64;27116:7;27107:6;27096:9;27092:22;27060:64;:::i;:::-;27050:74;;27005:129;27173:3;27200:64;27256:7;27247:6;27236:9;27232:22;27200:64;:::i;:::-;27190:74;;27144:130;26304:977;;;;;;;;:::o;27287:79::-;27326:7;27355:5;27344:16;;27287:79;;;:::o;27372:157::-;27477:45;27497:24;27515:5;27497:24;:::i;:::-;27477:45;:::i;:::-;27472:3;27465:58;27372:157;;:::o;27535:679::-;27731:3;27746:75;27817:3;27808:6;27746:75;:::i;:::-;27846:2;27841:3;27837:12;27830:19;;27859:75;27930:3;27921:6;27859:75;:::i;:::-;27959:2;27954:3;27950:12;27943:19;;27972:75;28043:3;28034:6;27972:75;:::i;:::-;28072:2;28067:3;28063:12;28056:19;;28085:75;28156:3;28147:6;28085:75;:::i;:::-;28185:2;28180:3;28176:12;28169:19;;28205:3;28198:10;;27535:679;;;;;;;:::o;28220:178::-;28360:30;28356:1;28348:6;28344:14;28337:54;28220:178;:::o;28404:366::-;28546:3;28567:67;28631:2;28626:3;28567:67;:::i;:::-;28560:74;;28643:93;28732:3;28643:93;:::i;:::-;28761:2;28756:3;28752:12;28745:19;;28404:366;;;:::o;28776:419::-;28942:4;28980:2;28969:9;28965:18;28957:26;;29029:9;29023:4;29019:20;29015:1;29004:9;29000:17;28993:47;29057:131;29183:4;29057:131;:::i;:::-;29049:139;;28776:419;;;:::o;29201:180::-;29249:77;29246:1;29239:88;29346:4;29343:1;29336:15;29370:4;29367:1;29360:15;29387:176;29419:1;29436:20;29454:1;29436:20;:::i;:::-;29431:25;;29470:20;29488:1;29470:20;:::i;:::-;29465:25;;29509:1;29499:35;;29514:18;;:::i;:::-;29499:35;29555:1;29552;29548:9;29543:14;;29387:176;;;;:::o;29569:185::-;29609:1;29626:20;29644:1;29626:20;:::i;:::-;29621:25;;29660:20;29678:1;29660:20;:::i;:::-;29655:25;;29699:1;29689:35;;29704:18;;:::i;:::-;29689:35;29746:1;29743;29739:9;29734:14;;29569:185;;;;:::o;29760:86::-;29795:7;29835:4;29828:5;29824:16;29813:27;;29760:86;;;:::o;29852:170::-;29882:1;29899:18;29915:1;29899:18;:::i;:::-;29894:23;;29931:18;29947:1;29931:18;:::i;:::-;29926:23;;29968:1;29958:35;;29973:18;;:::i;:::-;29958:35;30014:1;30011;30007:9;30002:14;;29852:170;;;;:::o;30028:179::-;30066:1;30083:18;30099:1;30083:18;:::i;:::-;30078:23;;30115:18;30131:1;30115:18;:::i;:::-;30110:23;;30152:1;30142:35;;30157:18;;:::i;:::-;30142:35;30199:1;30196;30192:9;30187:14;;30028:179;;;;:::o;30213:102::-;30255:8;30302:5;30299:1;30295:13;30274:34;;30213:102;;;:::o;30321:848::-;30382:5;30389:4;30413:6;30404:15;;30437:5;30428:14;;30451:712;30472:1;30462:8;30459:15;30451:712;;;30567:4;30562:3;30558:14;30552:4;30549:24;30546:50;;;30576:18;;:::i;:::-;30546:50;30626:1;30616:8;30612:16;30609:451;;;31041:4;31034:5;31030:16;31021:25;;30609:451;31091:4;31085;31081:15;31073:23;;31121:32;31144:8;31121:32;:::i;:::-;31109:44;;30451:712;;;30321:848;;;;;;;:::o;31175:1073::-;31229:5;31420:8;31410:40;;31441:1;31432:10;;31443:5;;31410:40;31469:4;31459:36;;31486:1;31477:10;;31488:5;;31459:36;31555:4;31603:1;31598:27;;;;31639:1;31634:191;;;;31548:277;;31598:27;31616:1;31607:10;;31618:5;;;31634:191;31679:3;31669:8;31666:17;31663:43;;;31686:18;;:::i;:::-;31663:43;31735:8;31732:1;31728:16;31719:25;;31770:3;31763:5;31760:14;31757:40;;;31777:18;;:::i;:::-;31757:40;31810:5;;;31548:277;;31934:2;31924:8;31921:16;31915:3;31909:4;31906:13;31902:36;31884:2;31874:8;31871:16;31866:2;31860:4;31857:12;31853:35;31837:111;31834:246;;;31990:8;31984:4;31980:19;31971:28;;32025:3;32018:5;32015:14;32012:40;;;32032:18;;:::i;:::-;32012:40;32065:5;;31834:246;32105:42;32143:3;32133:8;32127:4;32124:1;32105:42;:::i;:::-;32090:57;;;;32179:4;32174:3;32170:14;32163:5;32160:25;32157:51;;;32188:18;;:::i;:::-;32157:51;32237:4;32230:5;32226:16;32217:25;;31175:1073;;;;;;:::o;32254:285::-;32314:5;32338:23;32356:4;32338:23;:::i;:::-;32330:31;;32382:27;32400:8;32382:27;:::i;:::-;32370:39;;32428:104;32465:66;32455:8;32449:4;32428:104;:::i;:::-;32419:113;;32254:285;;;;:::o;32545:170::-;32685:22;32681:1;32673:6;32669:14;32662:46;32545:170;:::o;32721:366::-;32863:3;32884:67;32948:2;32943:3;32884:67;:::i;:::-;32877:74;;32960:93;33049:3;32960:93;:::i;:::-;33078:2;33073:3;33069:12;33062:19;;32721:366;;;:::o;33093:419::-;33259:4;33297:2;33286:9;33282:18;33274:26;;33346:9;33340:4;33336:20;33332:1;33321:9;33317:17;33310:47;33374:131;33500:4;33374:131;:::i;:::-;33366:139;;33093:419;;;:::o;33518:171::-;33658:23;33654:1;33646:6;33642:14;33635:47;33518:171;:::o;33695:366::-;33837:3;33858:67;33922:2;33917:3;33858:67;:::i;:::-;33851:74;;33934:93;34023:3;33934:93;:::i;:::-;34052:2;34047:3;34043:12;34036:19;;33695:366;;;:::o;34067:419::-;34233:4;34271:2;34260:9;34256:18;34248:26;;34320:9;34314:4;34310:20;34306:1;34295:9;34291:17;34284:47;34348:131;34474:4;34348:131;:::i;:::-;34340:139;;34067:419;;;:::o;34492:397::-;34632:3;34647:75;34718:3;34709:6;34647:75;:::i;:::-;34747:2;34742:3;34738:12;34731:19;;34760:75;34831:3;34822:6;34760:75;:::i;:::-;34860:2;34855:3;34851:12;34844:19;;34880:3;34873:10;;34492:397;;;;;:::o;34895:185::-;34933:4;34953:18;34969:1;34953:18;:::i;:::-;34948:23;;34985:18;35001:1;34985:18;:::i;:::-;34980:23;;35022:1;35019;35016:8;35013:34;;;35027:18;;:::i;:::-;35013:34;35072:1;35069;35065:9;35057:17;;34895:185;;;;:::o
Swarm Source
ipfs://55850767a26826c0d7af9e2953f2168fd65c29bebaccd517028ac36194fcab34
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.