Source Code
Latest 25 from a total of 3,655 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Stake Dungeon | 24434218 | 18 days ago | IN | 0 ETH | 0.00008423 | ||||
| Stake Multiple D... | 24422905 | 19 days ago | IN | 0 ETH | 0.00004119 | ||||
| Unstake Dungeon | 24389366 | 24 days ago | IN | 0 ETH | 0.00003484 | ||||
| Unstake Dungeon | 23841882 | 101 days ago | IN | 0 ETH | 0.00061552 | ||||
| Unstake Dungeon | 23839613 | 101 days ago | IN | 0 ETH | 0.00028929 | ||||
| Unstake Dungeon | 23715796 | 118 days ago | IN | 0 ETH | 0.00027957 | ||||
| Unstake Multiple... | 23444161 | 156 days ago | IN | 0 ETH | 0.00104493 | ||||
| Unstake Dungeon | 23435901 | 158 days ago | IN | 0 ETH | 0.00015683 | ||||
| Stake Dungeon | 23431728 | 158 days ago | IN | 0 ETH | 0.00024201 | ||||
| Unstake Dungeon | 23431711 | 158 days ago | IN | 0 ETH | 0.00018942 | ||||
| Unstake Dungeon | 23347648 | 170 days ago | IN | 0 ETH | 0.00013497 | ||||
| Unstake Dungeon | 23286420 | 178 days ago | IN | 0 ETH | 0.00016648 | ||||
| Stake Avatar | 23269758 | 181 days ago | IN | 0 ETH | 0.00042715 | ||||
| Stake Multiple A... | 23260476 | 182 days ago | IN | 0 ETH | 0.00002365 | ||||
| Unstake Multiple... | 23183521 | 193 days ago | IN | 0 ETH | 0.00043603 | ||||
| Unstake Dungeon | 23183517 | 193 days ago | IN | 0 ETH | 0.00052016 | ||||
| Stake Multiple D... | 23181980 | 193 days ago | IN | 0 ETH | 0.00009826 | ||||
| Stake Multiple A... | 23181975 | 193 days ago | IN | 0 ETH | 0.00012067 | ||||
| Unstake Multiple... | 23181239 | 193 days ago | IN | 0 ETH | 0.0000657 | ||||
| Unstake Dungeon | 23132426 | 200 days ago | IN | 0 ETH | 0.00056155 | ||||
| Unstake Dungeon | 23020441 | 216 days ago | IN | 0 ETH | 0.00030851 | ||||
| Stake Multiple D... | 22799313 | 247 days ago | IN | 0 ETH | 0.00023568 | ||||
| Stake Multiple D... | 22799305 | 247 days ago | IN | 0 ETH | 0.00019706 | ||||
| Unstake Dungeon | 22732891 | 256 days ago | IN | 0 ETH | 0.0004111 | ||||
| Stake Avatar | 22676680 | 264 days ago | IN | 0 ETH | 0.00043637 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DungeonRewards
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-04-30
*/
// File: default_workspace/contracts/Ownable.sol
pragma solidity ^0.8.10;
error NotOwner();
// https://github.com/m1guelpf/erc721-drop/blob/main/src/LilOwnable.sol
abstract contract Ownable {
address internal _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
modifier onlyOwner() {
require(_owner == msg.sender);
_;
}
constructor() {
_owner = msg.sender;
}
function owner() external view returns (address) {
return _owner;
}
function transferOwnership(address _newOwner) external {
if (msg.sender != _owner) revert NotOwner();
_owner = _newOwner;
}
function renounceOwnership() public {
if (msg.sender != _owner) revert NotOwner();
_owner = address(0);
}
function supportsInterface(bytes4 interfaceId)
public
pure
virtual
returns (bool)
{
return interfaceId == 0x7f5828d0; // ERC165 Interface ID for ERC173
}
}
// File: default_workspace/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: default_workspace/contracts/lib/RLPReader.sol
/*
* @author Hamdi Allam [email protected]
* 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: default_workspace/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;
}
// 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: default_workspace/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: default_workspace/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: default_workspace/contracts/IDungeonRewards.sol
pragma solidity ^0.8.12;
interface IDungeonRewards {
// so we can confirm whether a wallet holds any staked dungeons, useful for Generative Avatars gas-only mint
function balanceOfDungeons(address owner) external view returns (uint256);
// so we can confirm when a wallet staked their dungeons, useful for Generative Avatars gas-only mint
function dungeonFirstStaked(address owner) external view returns (uint256);
function balanceOfAvatars(address owner) external view returns (uint256);
function avatarFirstStaked(address owner) external view returns (uint256);
function balanceOfQuests(address owner) external view returns (uint256);
function questFirstStaked(address owner) external view returns (uint256);
function getStakedTokens(address user) external view returns (uint256[] memory dungeons, uint256[] memory avatars,
uint256[] memory quests);
}
// File: default_workspace/contracts/ERC721.sol
pragma solidity >=0.8.0;
/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.
abstract contract ERC721 {
/*///////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Transfer(address indexed from, address indexed to, uint256 indexed id);
event Approval(address indexed owner, address indexed spender, uint256 indexed id);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/*///////////////////////////////////////////////////////////////
METADATA STORAGE/LOGIC
//////////////////////////////////////////////////////////////*/
string public name;
string public symbol;
function tokenURI(uint256 id) public view virtual returns (string memory);
/*///////////////////////////////////////////////////////////////
ERC721 STORAGE
//////////////////////////////////////////////////////////////*/
mapping(address => uint256) public balanceOf;
mapping(uint256 => address) public ownerOf;
mapping(uint256 => address) public getApproved;
mapping(address => mapping(address => bool)) public isApprovedForAll;
/*///////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(string memory _name, string memory _symbol) {
name = _name;
symbol = _symbol;
}
/*///////////////////////////////////////////////////////////////
ERC721 LOGIC
//////////////////////////////////////////////////////////////*/
function approve(address spender, uint256 id) public virtual {
address owner = ownerOf[id];
require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");
getApproved[id] = spender;
emit Approval(owner, spender, id);
}
function setApprovalForAll(address operator, bool approved) public virtual {
isApprovedForAll[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
function transferFrom(
address from,
address to,
uint256 id
) public virtual {
require(from == ownerOf[id], "WRONG_FROM");
require(to != address(0), "INVALID_RECIPIENT");
require(
msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender],
"NOT_AUTHORIZED"
);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
unchecked {
balanceOf[from]--;
balanceOf[to]++;
}
ownerOf[id] = to;
delete getApproved[id];
emit Transfer(from, to, id);
}
function safeTransferFrom(
address from,
address to,
uint256 id
) public virtual {
transferFrom(from, to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function safeTransferFrom(
address from,
address to,
uint256 id,
bytes memory data
) public virtual {
transferFrom(from, to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
/*///////////////////////////////////////////////////////////////
ERC165 LOGIC
//////////////////////////////////////////////////////////////*/
function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {
return
interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
}
/*///////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
function _mint(address to, uint256 id) internal virtual {
require(to != address(0), "INVALID_RECIPIENT");
require(ownerOf[id] == address(0), "ALREADY_MINTED");
// Counter overflow is incredibly unrealistic.
unchecked {
balanceOf[to]++;
}
ownerOf[id] = to;
emit Transfer(address(0), to, id);
}
function _burn(uint256 id) internal virtual {
address owner = ownerOf[id];
require(ownerOf[id] != address(0), "NOT_MINTED");
// Ownership check above ensures no underflow.
unchecked {
balanceOf[owner]--;
}
delete ownerOf[id];
delete getApproved[id];
emit Transfer(owner, address(0), id);
}
/*///////////////////////////////////////////////////////////////
INTERNAL SAFE MINT LOGIC
//////////////////////////////////////////////////////////////*/
function _safeMint(address to, uint256 id) internal virtual {
_mint(to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function _safeMint(
address to,
uint256 id,
bytes memory data
) internal virtual {
_mint(to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
}
/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
function onERC721Received(
address operator,
address from,
uint256 id,
bytes calldata data
) external returns (bytes4);
}
// File: default_workspace/contracts/IDNGToken.sol
pragma solidity ^0.8.12;
interface IDNGToken {
enum NftType {
Dungeon,
Avatar,
Quest
}
}
// File: default_workspace/contracts/DungeonRewards.sol
pragma solidity ^0.8.12;
/**
________ ___ ___ ________ ________ _______ ________ ________
|\ ___ \|\ \|\ \|\ ___ \|\ ____\|\ ___ \ |\ __ \|\ ___ \
\ \ \_|\ \ \ \\\ \ \ \\ \ \ \ \___|\ \ __/|\ \ \|\ \ \ \\ \ \
\ \ \ \\ \ \ \\\ \ \ \\ \ \ \ \ __\ \ \_|/_\ \ \\\ \ \ \\ \ \
\ \ \_\\ \ \ \\\ \ \ \\ \ \ \ \|\ \ \ \_|\ \ \ \\\ \ \ \\ \ \
\ \_______\ \_______\ \__\\ \__\ \_______\ \_______\ \_______\ \__\\ \__\
\|_______|\|_______|\|__| \|__|\|_______|\|_______|\|_______|\|__| \|__|
________ _______ ___ __ ________ ________ ________ ________
|\ __ \|\ ___ \ |\ \ |\ \|\ __ \|\ __ \|\ ___ \|\ ____\
\ \ \|\ \ \ __/|\ \ \ \ \ \ \ \|\ \ \ \|\ \ \ \_|\ \ \ \___|_
\ \ _ _\ \ \_|/_\ \ \ __\ \ \ \ __ \ \ _ _\ \ \ \\ \ \_____ \
\ \ \\ \\ \ \_|\ \ \ \|\__\_\ \ \ \ \ \ \ \\ \\ \ \_\\ \|____|\ \
\ \__\\ _\\ \_______\ \____________\ \__\ \__\ \__\\ _\\ \_______\____\_\ \
\|__|\|__|\|_______|\|____________|\|__|\|__|\|__|\|__|\|_______|\_________\
\|_________|
**/
contract DungeonRewards is IDungeonRewards, IDNGToken, FxBaseRootTunnel, Ownable {
/*///////////////////////////////////////////////////////////////
STORAGE
//////////////////////////////////////////////////////////////*/
ERC721 public dungeonContract;
ERC721 public avatarContract;
ERC721 public questContract;
struct Staker {
uint256[] stakedDungeons;
uint256 dungeonStakedOn; // timestamp of when holder first staked their dungeon(s) (used to calculated eligibility for avatars).
uint256[] stakedAvatars;
uint256 avatarStakedOn; // timestamp of when holder first staked their avatar(s)
uint256[] stakedQuests;
uint256 questStakedOn; // timestamp of when holder first staked their quest(s)
}
mapping(address => Staker) public userInfo;
bool public stakingPaused;
constructor(
address checkpointManager,
address fxRoot,
address _dungeonContract
) FxBaseRootTunnel(checkpointManager, fxRoot) {
dungeonContract = ERC721(_dungeonContract);
}
// @notice Set the contract addresses for all future instances.
function setContractAddresses(
address _avatarContract,
address _questContract
) public onlyOwner {
avatarContract = ERC721(_avatarContract);
questContract = ERC721(_questContract);
}
// Pause staking and unstaking
function setStakingPaused(bool paused) public onlyOwner {
stakingPaused = paused;
}
// For collab.land to give a role based on staking status
function balanceOf(address owner) public view returns (uint256) {
if(balanceOfDungeons(owner)>0 && balanceOfAvatars(owner)>0 && balanceOfQuests(owner)>0) return 3;
if(balanceOfDungeons(owner)>0 && balanceOfAvatars(owner)>0 && balanceOfQuests(owner)==0) return 2;
if(balanceOfDungeons(owner)>0 && balanceOfAvatars(owner)==0 && balanceOfQuests(owner)==0) return 1;
return 0;
}
// so we can confirm whether a wallet holds any staked dungeons, useful for Generative Avatars gas-only mint
function balanceOfDungeons(address owner) public view returns (uint256) {
return userInfo[owner].stakedDungeons.length;
}
// so we can confirm when a wallet staked their dungeons, useful for Generative Avatars gas-only mint
function dungeonFirstStaked(address owner) public view returns (uint256) {
return userInfo[owner].dungeonStakedOn;
}
function balanceOfAvatars(address owner) public view returns (uint256) {
return userInfo[owner].stakedAvatars.length;
}
function avatarFirstStaked(address owner) public view returns (uint256) {
return userInfo[owner].avatarStakedOn;
}
function balanceOfQuests(address owner) public view returns (uint256) {
return userInfo[owner].stakedQuests.length;
}
function questFirstStaked(address owner) public view returns (uint256) {
return userInfo[owner].questStakedOn;
}
// get staked tokens for address
function getStakedTokens(address user) public view returns (
uint256[] memory dungeons,
uint256[] memory avatars,
uint256[] memory quests
)
{
Staker memory staker = userInfo[user];
return (
staker.stakedDungeons,
staker.stakedAvatars,
staker.stakedQuests
);
}
function bulkStake(
uint256[] memory dungeons,
uint256[] memory avatars,
uint256[] memory quests
) public {
if (dungeons.length > 0) stakeMultipleDungeons(dungeons);
if (avatars.length > 0) stakeMultipleAvatars(avatars);
if (quests.length > 0) stakeMultipleQuests(quests);
}
function bulkUnstake(
uint256[] memory dungeons,
uint256[] memory avatars,
uint256[] memory quests
) public {
if (dungeons.length > 0) unstakeMultipleDungeons(dungeons);
if (avatars.length > 0) unstakeMultipleAvatars(avatars);
if (quests.length > 0) unstakeMultipleQuests(quests);
}
function stakeMultipleDungeons(uint256[] memory tokenIds) public {
require(!stakingPaused, "Staking currently paused.");
require(tokenIds.length>0, "No tokenIds provided.");
Staker storage staker = userInfo[msg.sender];
if (staker.dungeonStakedOn == 0) { // set our dungeon staked on once (if they unstake, it resets to zero and will be reset when they stake again)
staker.dungeonStakedOn = block.timestamp;
}
for (uint256 i = 0; i < tokenIds.length; i++) {
staker.stakedDungeons.push(tokenIds[i]);
dungeonContract.transferFrom(
msg.sender,
address(this),
tokenIds[i]
);
}
// start accumulating $DNG rewards on polygon
_sendMessageToChild(
abi.encode(
msg.sender,
uint256(NftType.Dungeon),
tokenIds.length,
true
)
);
}
function unstakeMultipleDungeons(uint256[] memory tokenIds) public {
require(!stakingPaused, "Staking is currently paused.");
Staker storage staker = userInfo[msg.sender];
for (uint256 i = 0; i < tokenIds.length; i++) {
uint256 tokenId = tokenIds[i];
require(containsElement(staker.stakedDungeons, tokenId), "Not dungeon owner.");
dungeonContract.transferFrom(
address(this),
msg.sender,
tokenId
);
removeDungeonFromStaker(staker, tokenId);
}
if (staker.stakedDungeons.length == 0) { // no more staked dungeons?
staker.dungeonStakedOn = 0; // then we reset the staked on date to 0 (so can be set to block.timestamp when it's staked again)
}
// stop accumulating $DNG rewards on polygon for these dungeons
_sendMessageToChild(
abi.encode(
msg.sender,
uint256(NftType.Dungeon),
tokenIds.length,
false
)
);
}
// Stake a single Dungeon (separate function to optimize for gas)
// @param tokenId The tokenId of the dungeon to stake
function stakeDungeon(uint256 tokenId) external {
require(!stakingPaused, "Staking is currently paused.");
Staker storage staker = userInfo[msg.sender];
staker.stakedDungeons.push(tokenId);
dungeonContract.transferFrom(
msg.sender,
address(this),
tokenId
);
if (staker.dungeonStakedOn == 0) { // set our dungeon staked on once (if they unstake, it resets to zero and will be reset when they stake again)
staker.dungeonStakedOn = block.timestamp;
}
// start accumulating $DNG rewards on polygon
_sendMessageToChild(
abi.encode(
msg.sender,
uint256(NftType.Dungeon),
1,
true
)
);
}
// Unstake a Dungeon
// @param tokenId The tokenId of the dungeon to unstake
function unstakeDungeon(uint256 tokenId) external {
require(!stakingPaused, "Staking is currently paused.");
Staker storage staker = userInfo[msg.sender];
require(containsElement(staker.stakedDungeons, tokenId), "Not dungeon owner.");
dungeonContract.transferFrom(
address(this),
msg.sender,
tokenId
);
removeDungeonFromStaker(staker, tokenId);
if (staker.stakedDungeons.length == 0) { // no more staked dungeons?
staker.dungeonStakedOn = 0; // then we reset the staked on date to 0 (so can be set to block.timestamp when it's staked again)
}
// stop accumulating $DNG rewards on polygon for these dungeons
_sendMessageToChild(
abi.encode(
msg.sender,
uint256(NftType.Dungeon),
1,
false
)
);
}
function stakeMultipleAvatars(uint256[] memory tokenIds) public {
require(!stakingPaused, "Staking currently paused.");
require(tokenIds.length>0, "No tokenIds provided.");
Staker storage staker = userInfo[msg.sender];
if (staker.avatarStakedOn == 0) { // set our avatar staked on once (if they unstake, it resets to zero and will be reset when they stake again)
staker.avatarStakedOn = block.timestamp;
}
for (uint256 i = 0; i < tokenIds.length; i++) {
staker.stakedAvatars.push(tokenIds[i]);
avatarContract.transferFrom(
msg.sender,
address(this),
tokenIds[i]
);
}
// start accumulating $DNG rewards on polygon
_sendMessageToChild(
abi.encode(
msg.sender,
uint256(NftType.Avatar),
tokenIds.length,
true
)
);
}
function unstakeMultipleAvatars(uint256[] memory tokenIds) public {
require(!stakingPaused, "Staking is currently paused.");
Staker storage staker = userInfo[msg.sender];
for (uint256 i = 0; i < tokenIds.length; i++) {
uint256 tokenId = tokenIds[i];
require(containsElement(staker.stakedAvatars, tokenId), "Not avatar owner.");
avatarContract.transferFrom(
address(this),
msg.sender,
tokenId
);
removeAvatarFromStaker(staker, tokenId);
}
if (staker.stakedAvatars.length == 0) { // no more staked avatars?
staker.avatarStakedOn = 0; // then we reset the staked on date to 0 (so can be set to block.timestamp when it's staked again)
}
// stop accumulating $DNG rewards on polygon for these avatars
_sendMessageToChild(
abi.encode(
msg.sender,
uint256(NftType.Avatar),
tokenIds.length,
false
)
);
}
// Stake a single Avatar (separate function to optimize for gas)
// @param tokenId The tokenId of the avatar to stake
function stakeAvatar(uint256 tokenId) external {
require(!stakingPaused, "Staking is currently paused.");
Staker storage staker = userInfo[msg.sender];
staker.stakedAvatars.push(tokenId);
avatarContract.transferFrom(
msg.sender,
address(this),
tokenId
);
if (staker.avatarStakedOn == 0) { // set our avatar staked on once (if they unstake, it resets to zero and will be reset when they stake again)
staker.avatarStakedOn = block.timestamp;
}
// start accumulating $DNG rewards on polygon
_sendMessageToChild(
abi.encode(
msg.sender,
uint256(NftType.Avatar),
1,
true
)
);
}
// Unstake a Avatar
// @param tokenId The tokenId of the avatar to unstake
function unstakeAvatar(uint256 tokenId) external {
require(!stakingPaused, "Staking is currently paused.");
Staker storage staker = userInfo[msg.sender];
require(containsElement(staker.stakedAvatars, tokenId), "Not avatar owner.");
avatarContract.transferFrom(
address(this),
msg.sender,
tokenId
);
removeAvatarFromStaker(staker, tokenId);
if (staker.stakedAvatars.length == 0) { // no more staked avatars?
staker.avatarStakedOn = 0; // then we reset the staked on date to 0 (so can be set to block.timestamp when it's staked again)
}
// stop accumulating $DNG rewards on polygon for these avatars
_sendMessageToChild(
abi.encode(
msg.sender,
uint256(NftType.Avatar),
1,
false
)
);
}
function stakeMultipleQuests(uint256[] memory tokenIds) public {
require(!stakingPaused, "Staking currently paused.");
require(tokenIds.length>0, "No tokenIds provided.");
Staker storage staker = userInfo[msg.sender];
if (staker.questStakedOn == 0) { // set our quest staked on once (if they unstake, it resets to zero and will be reset when they stake again)
staker.questStakedOn = block.timestamp;
}
for (uint256 i = 0; i < tokenIds.length; i++) {
staker.stakedQuests.push(tokenIds[i]);
questContract.transferFrom(
msg.sender,
address(this),
tokenIds[i]
);
}
// start accumulating $DNG rewards on polygon
_sendMessageToChild(
abi.encode(
msg.sender,
uint256(NftType.Quest),
tokenIds.length,
true
)
);
}
function unstakeMultipleQuests(uint256[] memory tokenIds) public {
require(!stakingPaused, "Staking is currently paused.");
Staker storage staker = userInfo[msg.sender];
for (uint256 i = 0; i < tokenIds.length; i++) {
uint256 tokenId = tokenIds[i];
require(containsElement(staker.stakedQuests, tokenId), "Not quest owner.");
questContract.transferFrom(
address(this),
msg.sender,
tokenId
);
removeQuestFromStaker(staker, tokenId);
}
if (staker.stakedQuests.length == 0) { // no more staked quests?
staker.questStakedOn = 0; // then we reset the staked on date to 0 (so can be set to block.timestamp when it's staked again)
}
// stop accumulating $DNG rewards on polygon for these quests
_sendMessageToChild(
abi.encode(
msg.sender,
uint256(NftType.Quest),
tokenIds.length,
false
)
);
}
// Stake a single Quest (separate function to optimize for gas)
// @param tokenId The tokenId of the quest to stake
function stakeQuest(uint256 tokenId) external {
require(!stakingPaused, "Staking is currently paused.");
Staker storage staker = userInfo[msg.sender];
staker.stakedQuests.push(tokenId);
questContract.transferFrom(
msg.sender,
address(this),
tokenId
);
if (staker.questStakedOn == 0) { // set our quest staked on once (if they unstake, it resets to zero and will be reset when they stake again)
staker.questStakedOn = block.timestamp;
}
// start accumulating $DNG rewards on polygon
_sendMessageToChild(
abi.encode(
msg.sender,
uint256(NftType.Quest),
1,
true
)
);
}
// Unstake a Quest
// @param tokenId The tokenId of the quest to unstake
function unstakeQuest(uint256 tokenId) external {
require(!stakingPaused, "Staking is currently paused.");
Staker storage staker = userInfo[msg.sender];
require(containsElement(staker.stakedQuests, tokenId), "Not quest owner.");
questContract.transferFrom(
address(this),
msg.sender,
tokenId
);
removeQuestFromStaker(staker, tokenId);
if (staker.stakedQuests.length == 0) { // no more staked quests?
staker.questStakedOn = 0; // then we reset the staked on date to 0 (so can be set to block.timestamp when it's staked again)
}
// stop accumulating $DNG rewards on polygon for these quests
_sendMessageToChild(
abi.encode(
msg.sender,
uint256(NftType.Quest),
1,
false
)
);
}
function removeDungeonFromStaker(Staker storage staker, uint256 tokenId) private {
uint256[] memory stakedDungeons = staker.stakedDungeons;
uint256 index;
for (uint256 j; j < stakedDungeons.length; j++) {
if (stakedDungeons[j] == tokenId) index = j;
}
if (stakedDungeons[index] == tokenId) {
staker.stakedDungeons[index] = stakedDungeons[
staker.stakedDungeons.length - 1
];
staker.stakedDungeons.pop();
}
}
function removeAvatarFromStaker(Staker storage staker, uint256 tokenId) private {
uint256[] memory stakedAvatars = staker.stakedAvatars;
uint256 index;
for (uint256 j; j < stakedAvatars.length; j++) {
if (stakedAvatars[j] == tokenId) index = j;
}
if (stakedAvatars[index] == tokenId) {
staker.stakedAvatars[index] = stakedAvatars[
staker.stakedAvatars.length - 1
];
staker.stakedAvatars.pop();
}
}
function removeQuestFromStaker(Staker storage staker, uint256 tokenId) private {
uint256[] memory stakedQuests = staker.stakedQuests;
uint256 index;
for (uint256 j; j < stakedQuests.length; j++) {
if (stakedQuests[j] == tokenId) index = j;
}
if (stakedQuests[index] == tokenId) {
staker.stakedQuests[index] = stakedQuests[
staker.stakedQuests.length - 1
];
staker.stakedQuests.pop();
}
}
function _processMessageFromChild(bytes memory message) internal override {
// we don't process any messages from the child chain (Polygon)
}
function containsElement(uint[] memory elements, uint tokenId) internal pure returns (bool) {
for (uint256 i = 0; i < elements.length; i++) {
if(elements[i] == tokenId) return true;
}
return false;
}
/**
* Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 id,
bytes calldata data
) external pure returns (bytes4) {
return ERC721TokenReceiver.onERC721Received.selector;
}
}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":"_dungeonContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NotOwner","type":"error"},{"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":"SEND_MESSAGE_EVENT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"avatarContract","outputs":[{"internalType":"contract ERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"avatarFirstStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOfAvatars","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOfDungeons","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOfQuests","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"dungeons","type":"uint256[]"},{"internalType":"uint256[]","name":"avatars","type":"uint256[]"},{"internalType":"uint256[]","name":"quests","type":"uint256[]"}],"name":"bulkStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"dungeons","type":"uint256[]"},{"internalType":"uint256[]","name":"avatars","type":"uint256[]"},{"internalType":"uint256[]","name":"quests","type":"uint256[]"}],"name":"bulkUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkpointManager","outputs":[{"internalType":"contract ICheckpointManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dungeonContract","outputs":[{"internalType":"contract ERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"dungeonFirstStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"user","type":"address"}],"name":"getStakedTokens","outputs":[{"internalType":"uint256[]","name":"dungeons","type":"uint256[]"},{"internalType":"uint256[]","name":"avatars","type":"uint256[]"},{"internalType":"uint256[]","name":"quests","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","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":[],"name":"questContract","outputs":[{"internalType":"contract ERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"questFirstStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_avatarContract","type":"address"},{"internalType":"address","name":"_questContract","type":"address"}],"name":"setContractAddresses","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":"setStakingPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakeAvatar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakeDungeon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeMultipleAvatars","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeMultipleDungeons","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeMultipleQuests","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakeQuest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstakeAvatar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstakeDungeon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeMultipleAvatars","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeMultipleDungeons","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeMultipleQuests","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstakeQuest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"dungeonStakedOn","type":"uint256"},{"internalType":"uint256","name":"avatarStakedOn","type":"uint256"},{"internalType":"uint256","name":"questStakedOn","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162003e4638038062003e4683398101604081905262000034916200009e565b600180546001600160a01b039485166001600160a01b03199182161790915560008054938516938216939093179092556004805483163317905560058054919093169116179055620000e8565b80516001600160a01b03811681146200009957600080fd5b919050565b600080600060608486031215620000b457600080fd5b620000bf8462000081565b9250620000cf6020850162000081565b9150620000df6040850162000081565b90509250925092565b613d4e80620000f86000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80638da5cb5b11610146578063c6a54924116100c3578063d339785011610087578063d339785014610651578063d9c65c2714610664578063de9b771f14610677578063f2fde38b1461068a578063f79e41641461069d578063f953cec7146106b057600080fd5b8063c6a54924146105d9578063c714b768146105ec578063cc581d79146105ff578063cd931e401461062b578063d0b05d351461063e57600080fd5b8063ad280eb01161010a578063ad280eb014610567578063aea4e49e1461057a578063bbb781cc1461058d578063bded9a7c1461059a578063c0857ba0146105c657600080fd5b80638da5cb5b146104f1578063972c492814610502578063998a1d1514610515578063a04b29b914610528578063a6197a9f1461053b57600080fd5b806345f0791d116101d457806370a082311161019857806370a082311461049d578063715018a6146104b0578063795b396d146104b8578063840d6dcf146104cb5780638d18fa62146104de57600080fd5b806345f0791d146104075780634f04eba414610432578063607f2d421461044557806363c28db1146104685780636a6940cc1461048a57600080fd5b80631959a0021161021b5780631959a002146103265780633723148e146103735780633ac4b3ac146103865780633eee69a9146103b25780633f02d59e146103db57600080fd5b806301ffc9a7146102585780630e1db437146102915780630e387de6146102a6578063150b7a02146102db57806315b31bbb14610313575b600080fd5b61027c6102663660046134a9565b6001600160e01b0319166307f5828d60e41b1490565b60405190151581526020015b60405180910390f35b6102a461029f366004613598565b6106c3565b005b6102cd7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03681565b604051908152602001610288565b6102fa6102e9366004613634565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610288565b6102a46103213660046136d2565b6106f8565b6103586103343660046136f4565b60086020526000908152604090206001810154600382015460059092015490919083565b60408051938452602084019290925290820152606001610288565b6102a4610381366004613711565b610722565b6102cd6103943660046136f4565b6001600160a01b031660009081526008602052604090206001015490565b6102cd6103c03660046136f4565b6001600160a01b031660009081526008602052604090205490565b6102cd6103e93660046136f4565b6001600160a01b031660009081526008602052604090206004015490565b60065461041a906001600160a01b031681565b6040516001600160a01b039091168152602001610288565b6102a4610440366004613711565b6108c0565b61027c610453366004613711565b60036020526000908152604090205460ff1681565b61047b6104763660046136f4565b6109ba565b60405161028893929190613765565b60075461041a906001600160a01b031681565b6102cd6104ab3660046136f4565b610b1f565b6102a4610c7b565b6102a46104c63660046137a8565b610cb8565b6102a46104d93660046137a8565b610e2f565b6102a46104ec3660046137a8565b610f7a565b6004546001600160a01b031661041a565b60025461041a906001600160a01b031681565b6102a4610523366004613711565b6110c5565b6102a46105363660046137a8565b611220565b6102cd6105493660046136f4565b6001600160a01b031660009081526008602052604090206002015490565b6102a46105753660046137a8565b6113e5565b6102a46105883660046136f4565b61157b565b60095461027c9060ff1681565b6102cd6105a83660046136f4565b6001600160a01b031660009081526008602052604090206005015490565b60015461041a906001600160a01b031681565b6102a46105e7366004613711565b611609565b6102a46105fa366004613711565b6116da565b6102cd61060d3660046136f4565b6001600160a01b031660009081526008602052604090206003015490565b6102a46106393660046137dc565b611834565b6102a461064c3660046137a8565b611879565b6102a461065f366004613598565b611a11565b6102a4610672366004613711565b611a41565b60005461041a906001600160a01b031681565b6102a46106983660046136f4565b611b0e565b60055461041a906001600160a01b031681565b6102a46106be36600461383c565b611b5b565b8251156106d3576106d3836113e5565b8151156106e3576106e382611879565b8051156106f3576106f381611220565b505050565b6004546001600160a01b0316331461070f57600080fd5b6009805460ff1916911515919091179055565b60095460ff161561074e5760405162461bcd60e51b8152600401610745906138bb565b60405180910390fd5b33600090815260086020908152604091829020805483518184028101840190945280845290926107b692909184918301828280156107ab57602002820191906000526020600020905b815481526020019060010190808311610797575b505050505083611b66565b6107f75760405162461bcd60e51b81526020600482015260126024820152712737ba10323ab733b2b7b71037bbb732b91760711b6044820152606401610745565b6005546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061082b903090339087906004016138f2565b600060405180830381600087803b15801561084557600080fd5b505af1158015610859573d6000803e3d6000fd5b505050506108678183611bbb565b805460000361087857600060018201555b6108bc3360005b604080516001600160a01b039093166020840152820152600160608201526000608082015260a0015b604051602081830303815290604052611ced565b5050565b60095460ff16156108e35760405162461bcd60e51b8152600401610745906138bb565b336000818152600860209081526040808320600480820180546001810182559086529390942090920185905560075490516323b872dd60e01b815291936001600160a01b03909116926323b872dd92610941929130918891016138f2565b600060405180830381600087803b15801561095b57600080fd5b505af115801561096f573d6000803e3d6000fd5b505050508060050154600003610986574260058201555b6108bc3360025b604080516001600160a01b039093166020840152820152600160608201819052608082015260a0016108a8565b6001600160a01b03811660009081526008602090815260408083208151815460e09481028201850190935260c081018381526060958695869591949284929091849190840182828015610a2c57602002820191906000526020600020905b815481526020019060010190808311610a18575b505050505081526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610a8e57602002820191906000526020600020905b815481526020019060010190808311610a7a575b505050505081526020016003820154815260200160048201805480602002602001604051908101604052809291908181526020018280548015610af057602002820191906000526020600020905b815481526020019060010190808311610adc575b505050918352505060059190910154602090910152805160408201516080909201519097919650945092505050565b6001600160a01b03811660009081526008602052604081205481108015610b5f57506001600160a01b038216600090815260086020526040812060020154115b8015610b8457506001600160a01b038216600090815260086020526040812060040154115b15610b9157506003919050565b6001600160a01b038216600090815260086020526040812054118015610bd057506001600160a01b038216600090815260086020526040812060020154115b8015610bf557506001600160a01b038216600090815260086020526040902060040154155b15610c0257506002919050565b6001600160a01b038216600090815260086020526040812054118015610c4157506001600160a01b038216600090815260086020526040902060020154155b8015610c6657506001600160a01b038216600090815260086020526040902060040154155b15610c7357506001919050565b506000919050565b6004546001600160a01b03163314610ca6576040516330cd747160e01b815260040160405180910390fd5b600480546001600160a01b0319169055565b60095460ff1615610cdb5760405162461bcd60e51b815260040161074590613916565b6000815111610cfc5760405162461bcd60e51b81526004016107459061394d565b3360009081526008602052604081206005810154909103610d1e574260058201555b60005b8251811015610df75781600401838281518110610d4057610d4061397c565b6020908102919091018101518254600181018455600093845291909220015560075483516001600160a01b03909116906323b872dd9033903090879086908110610d8c57610d8c61397c565b60200260200101516040518463ffffffff1660e01b8152600401610db2939291906138f2565b600060405180830381600087803b158015610dcc57600080fd5b505af1158015610de0573d6000803e3d6000fd5b505050508080610def906139a8565b915050610d21565b506108bc3360025b8451604080516001600160a01b03909416602085015283019190915260608201526001608082015260a0016108a8565b60095460ff1615610e525760405162461bcd60e51b815260040161074590613916565b6000815111610e735760405162461bcd60e51b81526004016107459061394d565b3360009081526008602052604081206003810154909103610e95574260038201555b60005b8251811015610f6e5781600201838281518110610eb757610eb761397c565b6020908102919091018101518254600181018455600093845291909220015560065483516001600160a01b03909116906323b872dd9033903090879086908110610f0357610f0361397c565b60200260200101516040518463ffffffff1660e01b8152600401610f29939291906138f2565b600060405180830381600087803b158015610f4357600080fd5b505af1158015610f57573d6000803e3d6000fd5b505050508080610f66906139a8565b915050610e98565b506108bc336001610dff565b60095460ff1615610f9d5760405162461bcd60e51b815260040161074590613916565b6000815111610fbe5760405162461bcd60e51b81526004016107459061394d565b3360009081526008602052604081206001810154909103610fe0574260018201555b60005b82518110156110b957816000018382815181106110025761100261397c565b6020908102919091018101518254600181018455600093845291909220015560055483516001600160a01b03909116906323b872dd903390309087908690811061104e5761104e61397c565b60200260200101516040518463ffffffff1660e01b8152600401611074939291906138f2565b600060405180830381600087803b15801561108e57600080fd5b505af11580156110a2573d6000803e3d6000fd5b5050505080806110b1906139a8565b915050610fe3565b506108bc336000610dff565b60095460ff16156110e85760405162461bcd60e51b8152600401610745906138bb565b336000908152600860209081526040918290206002810180548451818502810185019095528085529193611151939092908301828280156107ab576020028201919060005260206000209081548152602001906001019080831161079757505050505083611b66565b6111915760405162461bcd60e51b81526020600482015260116024820152702737ba1030bb30ba30b91037bbb732b91760791b6044820152606401610745565b6006546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906111c5903090339087906004016138f2565b600060405180830381600087803b1580156111df57600080fd5b505af11580156111f3573d6000803e3d6000fd5b505050506112018183611d58565b600281015460000361121557600060038201555b6108bc33600161087f565b60095460ff16156112435760405162461bcd60e51b8152600401610745906138bb565b336000908152600860205260408120905b82518110156113995760008382815181106112715761127161397c565b602002602001015190506112d7836004018054806020026020016040519081016040528092919081815260200182805480156112cc57602002820191906000526020600020905b8154815260200190600101908083116112b8575b505050505082611b66565b6113165760405162461bcd60e51b815260206004820152601060248201526f2737ba1038bab2b9ba1037bbb732b91760811b6044820152606401610745565b6007546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061134a903090339086906004016138f2565b600060405180830381600087803b15801561136457600080fd5b505af1158015611378573d6000803e3d6000fd5b505050506113868382611e72565b5080611391816139a8565b915050611254565b5060048101546000036113ae57600060058201555b6108bc3360025b8451604080516001600160a01b03909416602085015283019190915260608201526000608082015260a0016108a8565b60095460ff16156114085760405162461bcd60e51b8152600401610745906138bb565b336000908152600860205260408120905b825181101561155e5760008382815181106114365761143661397c565b6020026020010151905061149a836000018054806020026020016040519081016040528092919081815260200182805480156112cc57602002820191906000526020600020908154815260200190600101908083116112b857505050505082611b66565b6114db5760405162461bcd60e51b81526020600482015260126024820152712737ba10323ab733b2b7b71037bbb732b91760711b6044820152606401610745565b6005546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061150f903090339086906004016138f2565b600060405180830381600087803b15801561152957600080fd5b505af115801561153d573d6000803e3d6000fd5b5050505061154b8382611bbb565b5080611556816139a8565b915050611419565b50805460000361157057600060018201555b6108bc3360006113b5565b6002546001600160a01b0316156115e75760405162461bcd60e51b815260206004820152602a60248201527f467842617365526f6f7454756e6e656c3a204348494c445f54554e4e454c5f4160448201526913149150511657d4d15560b21b6064820152608401610745565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60095460ff161561162c5760405162461bcd60e51b8152600401610745906138bb565b3360008181526008602090815260408083206002810180546001810182559085529290932090910184905560065490516323b872dd60e01b815291926001600160a01b03909116916323b872dd9161168a91309087906004016138f2565b600060405180830381600087803b1580156116a457600080fd5b505af11580156116b8573d6000803e3d6000fd5b5050505080600301546000036116cf574260038201555b6108bc33600161098d565b60095460ff16156116fd5760405162461bcd60e51b8152600401610745906138bb565b336000908152600860209081526040918290206004810180548451818502810185019095528085529193611766939092908301828280156107ab576020028201919060005260206000209081548152602001906001019080831161079757505050505083611b66565b6117a55760405162461bcd60e51b815260206004820152601060248201526f2737ba1038bab2b9ba1037bbb732b91760811b6044820152606401610745565b6007546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906117d9903090339087906004016138f2565b600060405180830381600087803b1580156117f357600080fd5b505af1158015611807573d6000803e3d6000fd5b505050506118158183611e72565b600481015460000361182957600060058201555b6108bc33600261087f565b6004546001600160a01b0316331461184b57600080fd5b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b60095460ff161561189c5760405162461bcd60e51b8152600401610745906138bb565b336000908152600860205260408120905b82518110156119f15760008382815181106118ca576118ca61397c565b6020026020010151905061192e836002018054806020026020016040519081016040528092919081815260200182805480156112cc57602002820191906000526020600020908154815260200190600101908083116112b857505050505082611b66565b61196e5760405162461bcd60e51b81526020600482015260116024820152702737ba1030bb30ba30b91037bbb732b91760791b6044820152606401610745565b6006546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906119a2903090339086906004016138f2565b600060405180830381600087803b1580156119bc57600080fd5b505af11580156119d0573d6000803e3d6000fd5b505050506119de8382611d58565b50806119e9816139a8565b9150506118ad565b506002810154600003611a0657600060038201555b6108bc3360016113b5565b825115611a2157611a2183610f7a565b815115611a3157611a3182610e2f565b8051156106f3576106f381610cb8565b60095460ff1615611a645760405162461bcd60e51b8152600401610745906138bb565b33600081815260086020908152604080832080546001810182558185529290932090910184905560055490516323b872dd60e01b815291926001600160a01b03909116916323b872dd91611abe91309087906004016138f2565b600060405180830381600087803b158015611ad857600080fd5b505af1158015611aec573d6000803e3d6000fd5b505050508060010154600003611b03574260018201555b6108bc33600061098d565b6004546001600160a01b03163314611b39576040516330cd747160e01b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60006106f382611f8c565b6000805b8351811015611baf5782848281518110611b8657611b8661397c565b602002602001015103611b9d576001915050611bb5565b80611ba7816139a8565b915050611b6a565b50600090505b92915050565b600082600001805480602002602001604051908101604052809291908181526020018280548015611c0b57602002820191906000526020600020905b815481526020019060010190808311611bf7575b505050505090506000805b8251811015611c555783838281518110611c3257611c3261397c565b602002602001015103611c43578091505b80611c4d816139a8565b915050611c16565b5082828281518110611c6957611c6961397c565b602002602001015103611ce75783548290611c86906001906139c1565b81518110611c9657611c9661397c565b6020026020010151846000018281548110611cb357611cb361397c565b6000918252602090912001558354849080611cd057611cd06139d8565b600190038181906000526020600020016000905590555b50505050565b60005460025460405163b472047760e01b81526001600160a01b039283169263b472047792611d23929116908590600401613a1a565b600060405180830381600087803b158015611d3d57600080fd5b505af1158015611d51573d6000803e3d6000fd5b5050505050565b600082600201805480602002602001604051908101604052809291908181526020018280548015611da857602002820191906000526020600020905b815481526020019060010190808311611d94575b505050505090506000805b8251811015611df25783838281518110611dcf57611dcf61397c565b602002602001015103611de0578091505b80611dea816139a8565b915050611db3565b5082828281518110611e0657611e0661397c565b602002602001015103611ce75760028401548290611e26906001906139c1565b81518110611e3657611e3661397c565b6020026020010151846002018281548110611e5357611e5361397c565b60009182526020909120015560028401805480611cd057611cd06139d8565b600082600401805480602002602001604051908101604052809291908181526020018280548015611ec257602002820191906000526020600020905b815481526020019060010190808311611eae575b505050505090506000805b8251811015611f0c5783838281518110611ee957611ee961397c565b602002602001015103611efa578091505b80611f04816139a8565b915050611ecd565b5082828281518110611f2057611f2061397c565b602002602001015103611ce75760048401548290611f40906001906139c1565b81518110611f5057611f5061397c565b6020026020010151846004018281548110611f6d57611f6d61397c565b60009182526020909120015560048401805480611cd057611cd06139d8565b60606000611f9983612275565b90506000611fa6826122d4565b90506000611fb3836122fd565b9050600081611fc184612326565b611fca866124e2565b604051602001611fdc93929190613a5c565b60408051601f1981840301815291815281516020928301206000818152600390935291205490915060ff16156120605760405162461bcd60e51b8152602060048201526024808201527f4678526f6f7454756e6e656c3a20455849545f414c52454144595f50524f434560448201526314d4d15160e21b6064820152608401610745565b6000818152600360205260408120805460ff19166001179055612082856124fe565b9050600061208f82612647565b905061209a816126d7565b6002546001600160a01b039081169116146121055760405162461bcd60e51b815260206004820152602560248201527f4678526f6f7454756e6e656c3a20494e56414c49445f46585f4348494c445f54604482015264155393915360da1b6064820152608401610745565b600061211087612700565b9050612130612120846020015190565b8761212a8a61271c565b84612738565b6121885760405162461bcd60e51b815260206004820152602360248201527f4678526f6f7454756e6e656c3a20494e56414c49445f524543454950545f505260448201526227a7a360e91b6064820152608401610745565b6121b685612195896129eb565b61219e8a612a07565b846121a88c612a23565b6121b18d612a3f565b612a5b565b5060006121c283612b81565b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b0366121f86121f3836000612bbd565b612bf5565b146122455760405162461bcd60e51b815260206004820152601f60248201527f4678526f6f7454756e6e656c3a20494e56414c49445f5349474e4154555245006044820152606401610745565b600061225084612c70565b8060200190518101906122639190613a89565b9b9a5050505050505050505050565b50565b60408051602081019091526060815260006122bf6122ba8460408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b612c8c565b60408051602081019091529081529392505050565b6060611bb582600001516008815181106122f0576122f061397c565b6020026020010151612da1565b6000611bb582600001516002815181106123195761231961397c565b6020026020010151612bf5565b60408051602081019091526000815281516060919015611bb55760008061234e600086612e3d565b60f81c9050600181148061236557508060ff166003145b1561240c5760018551600261237a9190613aff565b61238491906139c1565b6001600160401b0381111561239b5761239b6134d3565b6040519080825280601f01601f1916602001820160405280156123c5576020820181803683370190505b50925060006123d5600187612e3d565b905080846000815181106123eb576123eb61397c565b60200101906001600160f81b031916908160001a905350600192505061246f565b60028551600261241c9190613aff565b61242691906139c1565b6001600160401b0381111561243d5761243d6134d3565b6040519080825280601f01601f191660200182016040528015612467576020820181803683370190505b509250600091505b60ff82165b83518110156124d95761249e61248d60ff8516836139c1565b612498906002613b1e565b87612e3d565b8482815181106124b0576124b061397c565b60200101906001600160f81b031916908160001a905350806124d1816139a8565b915050612474565b50505092915050565b6000611bb582600001516009815181106123195761231961397c565b61252260405180606001604052806060815260200160608152602001600081525090565b61253c82600001516006815181106122f0576122f061397c565b60208281018290526040805180820182526000808252908301528051808201909152825181529181019082015261257281612ebe565b156125875761258081612c8c565b8252612633565b6020820151805160009061259d906001906139c1565b6001600160401b038111156125b4576125b46134d3565b6040519080825280601f01601f1916602001820160405280156125de576020820181803683370190505b5090506000808360210191508260200190506125fc82828551612ef9565b60408051808201825260008082526020918201528151808301909252845182528085019082015261262c90612c8c565b8652505050505b61263c836124e2565b604083015250919050565b60408051608081018252600091810182815260608083019390935281526020810191909152600061269583600001516003815181106126885761268861397c565b6020026020010151612c8c565b8360400151815181106126aa576126aa61397c565b6020026020010151905060405180604001604052808281526020016126ce83612c8c565b90529392505050565b6000611bb582602001516000815181106126f3576126f361397c565b6020026020010151612f77565b6000611bb582600001516005815181106123195761231961397c565b6060611bb582600001516007815181106122f0576122f061397c565b60008061276c8460408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b9050600061277982612c8c565b90506060808560008061278b8b612326565b905080516000036127a65760009750505050505050506129e3565b60005b86518110156129da5781518311156127cc576000985050505050505050506129e3565b6127ee8782815181106127e1576127e161397c565b6020026020010151612f91565b95508580519060200120841461280f576000985050505050505050506129e3565b6128248782815181106126885761268861397c565b945084516011036128f65781518303612883578c80519060200120612855866010815181106122f0576122f061397c565b8051906020012003612872576001985050505050505050506129e3565b6000985050505050505050506129e3565b60008284815181106128975761289761397c565b016020015160f81c905060108111156128bc57600099505050505050505050506129e3565b6128e1868260ff16815181106128d4576128d461397c565b602002602001015161300f565b94506128ee600185613b1e565b9350506129c8565b845160020361287257600061292161291a876000815181106122f0576122f061397c565b848661303d565b83519091506129308286613b1e565b03612983578d80519060200120612953876001815181106122f0576122f061397c565b805190602001200361297157600199505050505050505050506129e3565b600099505050505050505050506129e3565b8060000361299d57600099505050505050505050506129e3565b6129a78185613b1e565b93506129bf866001815181106128d4576128d461397c565b94506129c89050565b806129d2816139a8565b9150506127a9565b50505050505050505b949350505050565b6000611bb582600001516003815181106123195761231961397c565b6000611bb582600001516004815181106123195761231961397c565b6000611bb582600001516000815181106123195761231961397c565b6060611bb582600001516001815181106122f0576122f061397c565b6001546040516320a9cea560e11b8152600481018490526000918291829182916001600160a01b03909116906341539d4a9060240160a060405180830381865afa158015612aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad19190613b36565b5093505092509250612b28828b612ae891906139c1565b6040805160208082018f90528183018e9052606082018d905260808083018d90528351808403909101815260a09092019092528051910120908588613144565b612b745760405162461bcd60e51b815260206004820152601c60248201527f4678526f6f7454756e6e656c3a20494e56414c49445f484541444552000000006044820152606401610745565b9998505050505050505050565b6040805160208101909152606081526040518060200160405280612bb584602001516001815181106126885761268861397c565b905292915050565b60408051808201909152600080825260208201528251805183908110612be557612be561397c565b6020026020010151905092915050565b805160009015801590612c0a57508151602110155b612c1357600080fd5b6000612c2283602001516132ac565b90506000818460000151612c3691906139c1565b9050600080838660200151612c4b9190613b1e565b9050805191506020831015612c6757826020036101000a820491505b50949350505050565b6060611bb582602001516002815181106122f0576122f061397c565b6060612c9782612ebe565b612ca057600080fd5b6000612cab8361332e565b90506000816001600160401b03811115612cc757612cc76134d3565b604051908082528060200260200182016040528015612d0c57816020015b6040805180820190915260008082526020820152815260200190600190039081612ce55790505b5090506000612d1e85602001516132ac565b8560200151612d2d9190613b1e565b90506000805b84811015612d9657612d44836133b3565b9150604051806040016040528083815260200184815250848281518110612d6d57612d6d61397c565b6020908102919091010152612d828284613b1e565b925080612d8e816139a8565b915050612d33565b509195945050505050565b8051606090612daf57600080fd5b6000612dbe83602001516132ac565b90506000818460000151612dd291906139c1565b90506000816001600160401b03811115612dee57612dee6134d3565b6040519080825280601f01601f191660200182016040528015612e18576020820181803683370190505b5090506000816020019050612c67848760200151612e369190613b1e565b8285613457565b6000612e4a600284613b99565b15612e8457601082612e5d600286613bad565b81518110612e6d57612e6d61397c565b0160200151612e7f919060f81c613bc1565b612eb4565b601082612e92600286613bad565b81518110612ea257612ea261397c565b0160200151612eb4919060f81c613be3565b60f81b9392505050565b80516000908103612ed157506000919050565b6020820151805160001a9060c0821015612eef575060009392505050565b5060019392505050565b80600003612f0657505050565b60208110612f3e5782518252612f1d602084613b1e565b9250612f2a602083613b1e565b9150612f376020826139c1565b9050612f06565b60006001612f4d8360206139c1565b612f5990610100613ce9565b612f6391906139c1565b935183518516941916939093179091525050565b8051600090601514612f8857600080fd5b611bb582612bf5565b6060600082600001516001600160401b03811115612fb157612fb16134d3565b6040519080825280601f01601f191660200182016040528015612fdb576020820181803683370190505b5090508051600003612fed5792915050565b60008160200190506130088460200151828660000151613457565b5092915050565b805160009060211461302057600080fd5b600080836020015160016130349190613b1e565b51949350505050565b6000808061304a86612326565b9050600081516001600160401b03811115613067576130676134d3565b6040519080825280601f01601f191660200182016040528015613091576020820181803683370190505b509050845b82516130a29087613b1e565b8110156131155760008782815181106130bd576130bd61397c565b01602001516001600160f81b031916905080836130da89856139c1565b815181106130ea576130ea61397c565b60200101906001600160f81b031916908160001a90535050808061310d906139a8565b915050613096565b5080805190602001208280519060200120036131345781519250613139565b600092505b509095945050505050565b6000602082516131549190613b99565b156131985760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840e0e4dedecc40d8cadccee8d60631b6044820152606401610745565b6000602083516131a89190613bad565b90506131b5816002613ce9565b85106131fb5760405162461bcd60e51b81526020600482015260156024820152744c65616620696e64657820697320746f6f2062696760581b6044820152606401610745565b60008660205b8551811161329e5785810151925061321a600289613b99565b60000361325257604080516020810184905290810184905260600160405160208183030381529060405280519060200120915061327f565b60408051602081018590529081018390526060016040516020818303038152906040528051906020012091505b61328a600289613bad565b9750613297602082613b1e565b9050613201565b509094149695505050505050565b8051600090811a60808110156132c55750600092915050565b60b88110806132e0575060c081108015906132e0575060f881105b156132ee5750600192915050565b60c081101561332257613303600160b8613cf5565b6133109060ff16826139c1565b61331b906001613b1e565b9392505050565b613303600160f8613cf5565b8051600090810361334157506000919050565b60008061335184602001516132ac565b84602001516133609190613b1e565b90506000846000015185602001516133789190613b1e565b90505b808210156133aa5761338c826133b3565b6133969083613b1e565b9150826133a2816139a8565b93505061337b565b50909392505050565b80516000908190811a60808110156133ce5760019150613008565b60b88110156133f4576133e26080826139c1565b6133ed906001613b1e565b9150613008565b60c08110156134215760b78103600185019450806020036101000a85510460018201810193505050613008565b60f8811015613435576133e260c0826139c1565b60019390930151602084900360f7016101000a900490920160f5190192915050565b8060000361346457505050565b6020811061349c578251825261347b602084613b1e565b9250613488602083613b1e565b91506134956020826139c1565b9050613464565b80600003612f3e57505050565b6000602082840312156134bb57600080fd5b81356001600160e01b03198116811461331b57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613511576135116134d3565b604052919050565b600082601f83011261352a57600080fd5b813560206001600160401b03821115613545576135456134d3565b8160051b6135548282016134e9565b928352848101820192828101908785111561356e57600080fd5b83870192505b8483101561358d57823582529183019190830190613574565b979650505050505050565b6000806000606084860312156135ad57600080fd5b83356001600160401b03808211156135c457600080fd5b6135d087838801613519565b945060208601359150808211156135e657600080fd5b6135f287838801613519565b9350604086013591508082111561360857600080fd5b5061361586828701613519565b9150509250925092565b6001600160a01b038116811461227257600080fd5b60008060008060006080868803121561364c57600080fd5b85356136578161361f565b945060208601356136678161361f565b93506040860135925060608601356001600160401b038082111561368a57600080fd5b818801915088601f83011261369e57600080fd5b8135818111156136ad57600080fd5b8960208285010111156136bf57600080fd5b9699959850939650602001949392505050565b6000602082840312156136e457600080fd5b8135801515811461331b57600080fd5b60006020828403121561370657600080fd5b813561331b8161361f565b60006020828403121561372357600080fd5b5035919050565b600081518084526020808501945080840160005b8381101561375a5781518752958201959082019060010161373e565b509495945050505050565b606081526000613778606083018661372a565b828103602084015261378a818661372a565b9050828103604084015261379e818561372a565b9695505050505050565b6000602082840312156137ba57600080fd5b81356001600160401b038111156137d057600080fd5b6129e384828501613519565b600080604083850312156137ef57600080fd5b82356137fa8161361f565b9150602083013561380a8161361f565b809150509250929050565b60006001600160401b0382111561382e5761382e6134d3565b50601f01601f191660200190565b60006020828403121561384e57600080fd5b81356001600160401b0381111561386457600080fd5b8201601f8101841361387557600080fd5b803561388861388382613815565b6134e9565b81815285602083850101111561389d57600080fd5b81602084016020830137600091810160200191909152949350505050565b6020808252601c908201527f5374616b696e672069732063757272656e746c79207061757365642e00000000604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60208082526019908201527f5374616b696e672063757272656e746c79207061757365642e00000000000000604082015260600190565b6020808252601590820152742737903a37b5b2b724b23990383937bb34b232b21760591b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016139ba576139ba613992565b5060010190565b6000828210156139d3576139d3613992565b500390565b634e487b7160e01b600052603160045260246000fd5b60005b83811015613a095781810151838201526020016139f1565b83811115611ce75750506000910152565b60018060a01b03831681526040602082015260008251806040840152613a478160608501602087016139ee565b601f01601f1916919091016060019392505050565b83815260008351613a748160208501602088016139ee565b60209201918201929092526040019392505050565b600060208284031215613a9b57600080fd5b81516001600160401b03811115613ab157600080fd5b8201601f81018413613ac257600080fd5b8051613ad061388382613815565b818152856020838501011115613ae557600080fd5b613af68260208301602086016139ee565b95945050505050565b6000816000190483118215151615613b1957613b19613992565b500290565b60008219821115613b3157613b31613992565b500190565b600080600080600060a08688031215613b4e57600080fd5b855194506020860151935060408601519250606086015191506080860151613b758161361f565b809150509295509295909350565b634e487b7160e01b600052601260045260246000fd5b600082613ba857613ba8613b83565b500690565b600082613bbc57613bbc613b83565b500490565b600060ff831680613bd457613bd4613b83565b8060ff84160691505092915050565b600060ff831680613bf657613bf6613b83565b8060ff84160491505092915050565b600181815b80851115613c40578160001904821115613c2657613c26613992565b80851615613c3357918102915b93841c9390800290613c0a565b509250929050565b600082613c5757506001611bb5565b81613c6457506000611bb5565b8160018114613c7a5760028114613c8457613ca0565b6001915050611bb5565b60ff841115613c9557613c95613992565b50506001821b611bb5565b5060208310610133831016604e8410600b8410161715613cc3575081810a611bb5565b613ccd8383613c05565b8060001904821115613ce157613ce1613992565b029392505050565b600061331b8383613c48565b600060ff821660ff841680821015613d0f57613d0f613992565b9003939250505056fea26469706673582212208e0052f2db19d7a445185f864f84206c0a7108e7286ea9dacdc8eeafcaef33fd64736f6c634300080d003300000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a200000000000000000000000018487d2cac946c7fe800855c4039aac210f68baa
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c80638da5cb5b11610146578063c6a54924116100c3578063d339785011610087578063d339785014610651578063d9c65c2714610664578063de9b771f14610677578063f2fde38b1461068a578063f79e41641461069d578063f953cec7146106b057600080fd5b8063c6a54924146105d9578063c714b768146105ec578063cc581d79146105ff578063cd931e401461062b578063d0b05d351461063e57600080fd5b8063ad280eb01161010a578063ad280eb014610567578063aea4e49e1461057a578063bbb781cc1461058d578063bded9a7c1461059a578063c0857ba0146105c657600080fd5b80638da5cb5b146104f1578063972c492814610502578063998a1d1514610515578063a04b29b914610528578063a6197a9f1461053b57600080fd5b806345f0791d116101d457806370a082311161019857806370a082311461049d578063715018a6146104b0578063795b396d146104b8578063840d6dcf146104cb5780638d18fa62146104de57600080fd5b806345f0791d146104075780634f04eba414610432578063607f2d421461044557806363c28db1146104685780636a6940cc1461048a57600080fd5b80631959a0021161021b5780631959a002146103265780633723148e146103735780633ac4b3ac146103865780633eee69a9146103b25780633f02d59e146103db57600080fd5b806301ffc9a7146102585780630e1db437146102915780630e387de6146102a6578063150b7a02146102db57806315b31bbb14610313575b600080fd5b61027c6102663660046134a9565b6001600160e01b0319166307f5828d60e41b1490565b60405190151581526020015b60405180910390f35b6102a461029f366004613598565b6106c3565b005b6102cd7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03681565b604051908152602001610288565b6102fa6102e9366004613634565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610288565b6102a46103213660046136d2565b6106f8565b6103586103343660046136f4565b60086020526000908152604090206001810154600382015460059092015490919083565b60408051938452602084019290925290820152606001610288565b6102a4610381366004613711565b610722565b6102cd6103943660046136f4565b6001600160a01b031660009081526008602052604090206001015490565b6102cd6103c03660046136f4565b6001600160a01b031660009081526008602052604090205490565b6102cd6103e93660046136f4565b6001600160a01b031660009081526008602052604090206004015490565b60065461041a906001600160a01b031681565b6040516001600160a01b039091168152602001610288565b6102a4610440366004613711565b6108c0565b61027c610453366004613711565b60036020526000908152604090205460ff1681565b61047b6104763660046136f4565b6109ba565b60405161028893929190613765565b60075461041a906001600160a01b031681565b6102cd6104ab3660046136f4565b610b1f565b6102a4610c7b565b6102a46104c63660046137a8565b610cb8565b6102a46104d93660046137a8565b610e2f565b6102a46104ec3660046137a8565b610f7a565b6004546001600160a01b031661041a565b60025461041a906001600160a01b031681565b6102a4610523366004613711565b6110c5565b6102a46105363660046137a8565b611220565b6102cd6105493660046136f4565b6001600160a01b031660009081526008602052604090206002015490565b6102a46105753660046137a8565b6113e5565b6102a46105883660046136f4565b61157b565b60095461027c9060ff1681565b6102cd6105a83660046136f4565b6001600160a01b031660009081526008602052604090206005015490565b60015461041a906001600160a01b031681565b6102a46105e7366004613711565b611609565b6102a46105fa366004613711565b6116da565b6102cd61060d3660046136f4565b6001600160a01b031660009081526008602052604090206003015490565b6102a46106393660046137dc565b611834565b6102a461064c3660046137a8565b611879565b6102a461065f366004613598565b611a11565b6102a4610672366004613711565b611a41565b60005461041a906001600160a01b031681565b6102a46106983660046136f4565b611b0e565b60055461041a906001600160a01b031681565b6102a46106be36600461383c565b611b5b565b8251156106d3576106d3836113e5565b8151156106e3576106e382611879565b8051156106f3576106f381611220565b505050565b6004546001600160a01b0316331461070f57600080fd5b6009805460ff1916911515919091179055565b60095460ff161561074e5760405162461bcd60e51b8152600401610745906138bb565b60405180910390fd5b33600090815260086020908152604091829020805483518184028101840190945280845290926107b692909184918301828280156107ab57602002820191906000526020600020905b815481526020019060010190808311610797575b505050505083611b66565b6107f75760405162461bcd60e51b81526020600482015260126024820152712737ba10323ab733b2b7b71037bbb732b91760711b6044820152606401610745565b6005546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061082b903090339087906004016138f2565b600060405180830381600087803b15801561084557600080fd5b505af1158015610859573d6000803e3d6000fd5b505050506108678183611bbb565b805460000361087857600060018201555b6108bc3360005b604080516001600160a01b039093166020840152820152600160608201526000608082015260a0015b604051602081830303815290604052611ced565b5050565b60095460ff16156108e35760405162461bcd60e51b8152600401610745906138bb565b336000818152600860209081526040808320600480820180546001810182559086529390942090920185905560075490516323b872dd60e01b815291936001600160a01b03909116926323b872dd92610941929130918891016138f2565b600060405180830381600087803b15801561095b57600080fd5b505af115801561096f573d6000803e3d6000fd5b505050508060050154600003610986574260058201555b6108bc3360025b604080516001600160a01b039093166020840152820152600160608201819052608082015260a0016108a8565b6001600160a01b03811660009081526008602090815260408083208151815460e09481028201850190935260c081018381526060958695869591949284929091849190840182828015610a2c57602002820191906000526020600020905b815481526020019060010190808311610a18575b505050505081526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610a8e57602002820191906000526020600020905b815481526020019060010190808311610a7a575b505050505081526020016003820154815260200160048201805480602002602001604051908101604052809291908181526020018280548015610af057602002820191906000526020600020905b815481526020019060010190808311610adc575b505050918352505060059190910154602090910152805160408201516080909201519097919650945092505050565b6001600160a01b03811660009081526008602052604081205481108015610b5f57506001600160a01b038216600090815260086020526040812060020154115b8015610b8457506001600160a01b038216600090815260086020526040812060040154115b15610b9157506003919050565b6001600160a01b038216600090815260086020526040812054118015610bd057506001600160a01b038216600090815260086020526040812060020154115b8015610bf557506001600160a01b038216600090815260086020526040902060040154155b15610c0257506002919050565b6001600160a01b038216600090815260086020526040812054118015610c4157506001600160a01b038216600090815260086020526040902060020154155b8015610c6657506001600160a01b038216600090815260086020526040902060040154155b15610c7357506001919050565b506000919050565b6004546001600160a01b03163314610ca6576040516330cd747160e01b815260040160405180910390fd5b600480546001600160a01b0319169055565b60095460ff1615610cdb5760405162461bcd60e51b815260040161074590613916565b6000815111610cfc5760405162461bcd60e51b81526004016107459061394d565b3360009081526008602052604081206005810154909103610d1e574260058201555b60005b8251811015610df75781600401838281518110610d4057610d4061397c565b6020908102919091018101518254600181018455600093845291909220015560075483516001600160a01b03909116906323b872dd9033903090879086908110610d8c57610d8c61397c565b60200260200101516040518463ffffffff1660e01b8152600401610db2939291906138f2565b600060405180830381600087803b158015610dcc57600080fd5b505af1158015610de0573d6000803e3d6000fd5b505050508080610def906139a8565b915050610d21565b506108bc3360025b8451604080516001600160a01b03909416602085015283019190915260608201526001608082015260a0016108a8565b60095460ff1615610e525760405162461bcd60e51b815260040161074590613916565b6000815111610e735760405162461bcd60e51b81526004016107459061394d565b3360009081526008602052604081206003810154909103610e95574260038201555b60005b8251811015610f6e5781600201838281518110610eb757610eb761397c565b6020908102919091018101518254600181018455600093845291909220015560065483516001600160a01b03909116906323b872dd9033903090879086908110610f0357610f0361397c565b60200260200101516040518463ffffffff1660e01b8152600401610f29939291906138f2565b600060405180830381600087803b158015610f4357600080fd5b505af1158015610f57573d6000803e3d6000fd5b505050508080610f66906139a8565b915050610e98565b506108bc336001610dff565b60095460ff1615610f9d5760405162461bcd60e51b815260040161074590613916565b6000815111610fbe5760405162461bcd60e51b81526004016107459061394d565b3360009081526008602052604081206001810154909103610fe0574260018201555b60005b82518110156110b957816000018382815181106110025761100261397c565b6020908102919091018101518254600181018455600093845291909220015560055483516001600160a01b03909116906323b872dd903390309087908690811061104e5761104e61397c565b60200260200101516040518463ffffffff1660e01b8152600401611074939291906138f2565b600060405180830381600087803b15801561108e57600080fd5b505af11580156110a2573d6000803e3d6000fd5b5050505080806110b1906139a8565b915050610fe3565b506108bc336000610dff565b60095460ff16156110e85760405162461bcd60e51b8152600401610745906138bb565b336000908152600860209081526040918290206002810180548451818502810185019095528085529193611151939092908301828280156107ab576020028201919060005260206000209081548152602001906001019080831161079757505050505083611b66565b6111915760405162461bcd60e51b81526020600482015260116024820152702737ba1030bb30ba30b91037bbb732b91760791b6044820152606401610745565b6006546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906111c5903090339087906004016138f2565b600060405180830381600087803b1580156111df57600080fd5b505af11580156111f3573d6000803e3d6000fd5b505050506112018183611d58565b600281015460000361121557600060038201555b6108bc33600161087f565b60095460ff16156112435760405162461bcd60e51b8152600401610745906138bb565b336000908152600860205260408120905b82518110156113995760008382815181106112715761127161397c565b602002602001015190506112d7836004018054806020026020016040519081016040528092919081815260200182805480156112cc57602002820191906000526020600020905b8154815260200190600101908083116112b8575b505050505082611b66565b6113165760405162461bcd60e51b815260206004820152601060248201526f2737ba1038bab2b9ba1037bbb732b91760811b6044820152606401610745565b6007546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061134a903090339086906004016138f2565b600060405180830381600087803b15801561136457600080fd5b505af1158015611378573d6000803e3d6000fd5b505050506113868382611e72565b5080611391816139a8565b915050611254565b5060048101546000036113ae57600060058201555b6108bc3360025b8451604080516001600160a01b03909416602085015283019190915260608201526000608082015260a0016108a8565b60095460ff16156114085760405162461bcd60e51b8152600401610745906138bb565b336000908152600860205260408120905b825181101561155e5760008382815181106114365761143661397c565b6020026020010151905061149a836000018054806020026020016040519081016040528092919081815260200182805480156112cc57602002820191906000526020600020908154815260200190600101908083116112b857505050505082611b66565b6114db5760405162461bcd60e51b81526020600482015260126024820152712737ba10323ab733b2b7b71037bbb732b91760711b6044820152606401610745565b6005546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061150f903090339086906004016138f2565b600060405180830381600087803b15801561152957600080fd5b505af115801561153d573d6000803e3d6000fd5b5050505061154b8382611bbb565b5080611556816139a8565b915050611419565b50805460000361157057600060018201555b6108bc3360006113b5565b6002546001600160a01b0316156115e75760405162461bcd60e51b815260206004820152602a60248201527f467842617365526f6f7454756e6e656c3a204348494c445f54554e4e454c5f4160448201526913149150511657d4d15560b21b6064820152608401610745565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60095460ff161561162c5760405162461bcd60e51b8152600401610745906138bb565b3360008181526008602090815260408083206002810180546001810182559085529290932090910184905560065490516323b872dd60e01b815291926001600160a01b03909116916323b872dd9161168a91309087906004016138f2565b600060405180830381600087803b1580156116a457600080fd5b505af11580156116b8573d6000803e3d6000fd5b5050505080600301546000036116cf574260038201555b6108bc33600161098d565b60095460ff16156116fd5760405162461bcd60e51b8152600401610745906138bb565b336000908152600860209081526040918290206004810180548451818502810185019095528085529193611766939092908301828280156107ab576020028201919060005260206000209081548152602001906001019080831161079757505050505083611b66565b6117a55760405162461bcd60e51b815260206004820152601060248201526f2737ba1038bab2b9ba1037bbb732b91760811b6044820152606401610745565b6007546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906117d9903090339087906004016138f2565b600060405180830381600087803b1580156117f357600080fd5b505af1158015611807573d6000803e3d6000fd5b505050506118158183611e72565b600481015460000361182957600060058201555b6108bc33600261087f565b6004546001600160a01b0316331461184b57600080fd5b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b60095460ff161561189c5760405162461bcd60e51b8152600401610745906138bb565b336000908152600860205260408120905b82518110156119f15760008382815181106118ca576118ca61397c565b6020026020010151905061192e836002018054806020026020016040519081016040528092919081815260200182805480156112cc57602002820191906000526020600020908154815260200190600101908083116112b857505050505082611b66565b61196e5760405162461bcd60e51b81526020600482015260116024820152702737ba1030bb30ba30b91037bbb732b91760791b6044820152606401610745565b6006546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906119a2903090339086906004016138f2565b600060405180830381600087803b1580156119bc57600080fd5b505af11580156119d0573d6000803e3d6000fd5b505050506119de8382611d58565b50806119e9816139a8565b9150506118ad565b506002810154600003611a0657600060038201555b6108bc3360016113b5565b825115611a2157611a2183610f7a565b815115611a3157611a3182610e2f565b8051156106f3576106f381610cb8565b60095460ff1615611a645760405162461bcd60e51b8152600401610745906138bb565b33600081815260086020908152604080832080546001810182558185529290932090910184905560055490516323b872dd60e01b815291926001600160a01b03909116916323b872dd91611abe91309087906004016138f2565b600060405180830381600087803b158015611ad857600080fd5b505af1158015611aec573d6000803e3d6000fd5b505050508060010154600003611b03574260018201555b6108bc33600061098d565b6004546001600160a01b03163314611b39576040516330cd747160e01b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60006106f382611f8c565b6000805b8351811015611baf5782848281518110611b8657611b8661397c565b602002602001015103611b9d576001915050611bb5565b80611ba7816139a8565b915050611b6a565b50600090505b92915050565b600082600001805480602002602001604051908101604052809291908181526020018280548015611c0b57602002820191906000526020600020905b815481526020019060010190808311611bf7575b505050505090506000805b8251811015611c555783838281518110611c3257611c3261397c565b602002602001015103611c43578091505b80611c4d816139a8565b915050611c16565b5082828281518110611c6957611c6961397c565b602002602001015103611ce75783548290611c86906001906139c1565b81518110611c9657611c9661397c565b6020026020010151846000018281548110611cb357611cb361397c565b6000918252602090912001558354849080611cd057611cd06139d8565b600190038181906000526020600020016000905590555b50505050565b60005460025460405163b472047760e01b81526001600160a01b039283169263b472047792611d23929116908590600401613a1a565b600060405180830381600087803b158015611d3d57600080fd5b505af1158015611d51573d6000803e3d6000fd5b5050505050565b600082600201805480602002602001604051908101604052809291908181526020018280548015611da857602002820191906000526020600020905b815481526020019060010190808311611d94575b505050505090506000805b8251811015611df25783838281518110611dcf57611dcf61397c565b602002602001015103611de0578091505b80611dea816139a8565b915050611db3565b5082828281518110611e0657611e0661397c565b602002602001015103611ce75760028401548290611e26906001906139c1565b81518110611e3657611e3661397c565b6020026020010151846002018281548110611e5357611e5361397c565b60009182526020909120015560028401805480611cd057611cd06139d8565b600082600401805480602002602001604051908101604052809291908181526020018280548015611ec257602002820191906000526020600020905b815481526020019060010190808311611eae575b505050505090506000805b8251811015611f0c5783838281518110611ee957611ee961397c565b602002602001015103611efa578091505b80611f04816139a8565b915050611ecd565b5082828281518110611f2057611f2061397c565b602002602001015103611ce75760048401548290611f40906001906139c1565b81518110611f5057611f5061397c565b6020026020010151846004018281548110611f6d57611f6d61397c565b60009182526020909120015560048401805480611cd057611cd06139d8565b60606000611f9983612275565b90506000611fa6826122d4565b90506000611fb3836122fd565b9050600081611fc184612326565b611fca866124e2565b604051602001611fdc93929190613a5c565b60408051601f1981840301815291815281516020928301206000818152600390935291205490915060ff16156120605760405162461bcd60e51b8152602060048201526024808201527f4678526f6f7454756e6e656c3a20455849545f414c52454144595f50524f434560448201526314d4d15160e21b6064820152608401610745565b6000818152600360205260408120805460ff19166001179055612082856124fe565b9050600061208f82612647565b905061209a816126d7565b6002546001600160a01b039081169116146121055760405162461bcd60e51b815260206004820152602560248201527f4678526f6f7454756e6e656c3a20494e56414c49445f46585f4348494c445f54604482015264155393915360da1b6064820152608401610745565b600061211087612700565b9050612130612120846020015190565b8761212a8a61271c565b84612738565b6121885760405162461bcd60e51b815260206004820152602360248201527f4678526f6f7454756e6e656c3a20494e56414c49445f524543454950545f505260448201526227a7a360e91b6064820152608401610745565b6121b685612195896129eb565b61219e8a612a07565b846121a88c612a23565b6121b18d612a3f565b612a5b565b5060006121c283612b81565b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b0366121f86121f3836000612bbd565b612bf5565b146122455760405162461bcd60e51b815260206004820152601f60248201527f4678526f6f7454756e6e656c3a20494e56414c49445f5349474e4154555245006044820152606401610745565b600061225084612c70565b8060200190518101906122639190613a89565b9b9a5050505050505050505050565b50565b60408051602081019091526060815260006122bf6122ba8460408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b612c8c565b60408051602081019091529081529392505050565b6060611bb582600001516008815181106122f0576122f061397c565b6020026020010151612da1565b6000611bb582600001516002815181106123195761231961397c565b6020026020010151612bf5565b60408051602081019091526000815281516060919015611bb55760008061234e600086612e3d565b60f81c9050600181148061236557508060ff166003145b1561240c5760018551600261237a9190613aff565b61238491906139c1565b6001600160401b0381111561239b5761239b6134d3565b6040519080825280601f01601f1916602001820160405280156123c5576020820181803683370190505b50925060006123d5600187612e3d565b905080846000815181106123eb576123eb61397c565b60200101906001600160f81b031916908160001a905350600192505061246f565b60028551600261241c9190613aff565b61242691906139c1565b6001600160401b0381111561243d5761243d6134d3565b6040519080825280601f01601f191660200182016040528015612467576020820181803683370190505b509250600091505b60ff82165b83518110156124d95761249e61248d60ff8516836139c1565b612498906002613b1e565b87612e3d565b8482815181106124b0576124b061397c565b60200101906001600160f81b031916908160001a905350806124d1816139a8565b915050612474565b50505092915050565b6000611bb582600001516009815181106123195761231961397c565b61252260405180606001604052806060815260200160608152602001600081525090565b61253c82600001516006815181106122f0576122f061397c565b60208281018290526040805180820182526000808252908301528051808201909152825181529181019082015261257281612ebe565b156125875761258081612c8c565b8252612633565b6020820151805160009061259d906001906139c1565b6001600160401b038111156125b4576125b46134d3565b6040519080825280601f01601f1916602001820160405280156125de576020820181803683370190505b5090506000808360210191508260200190506125fc82828551612ef9565b60408051808201825260008082526020918201528151808301909252845182528085019082015261262c90612c8c565b8652505050505b61263c836124e2565b604083015250919050565b60408051608081018252600091810182815260608083019390935281526020810191909152600061269583600001516003815181106126885761268861397c565b6020026020010151612c8c565b8360400151815181106126aa576126aa61397c565b6020026020010151905060405180604001604052808281526020016126ce83612c8c565b90529392505050565b6000611bb582602001516000815181106126f3576126f361397c565b6020026020010151612f77565b6000611bb582600001516005815181106123195761231961397c565b6060611bb582600001516007815181106122f0576122f061397c565b60008061276c8460408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b9050600061277982612c8c565b90506060808560008061278b8b612326565b905080516000036127a65760009750505050505050506129e3565b60005b86518110156129da5781518311156127cc576000985050505050505050506129e3565b6127ee8782815181106127e1576127e161397c565b6020026020010151612f91565b95508580519060200120841461280f576000985050505050505050506129e3565b6128248782815181106126885761268861397c565b945084516011036128f65781518303612883578c80519060200120612855866010815181106122f0576122f061397c565b8051906020012003612872576001985050505050505050506129e3565b6000985050505050505050506129e3565b60008284815181106128975761289761397c565b016020015160f81c905060108111156128bc57600099505050505050505050506129e3565b6128e1868260ff16815181106128d4576128d461397c565b602002602001015161300f565b94506128ee600185613b1e565b9350506129c8565b845160020361287257600061292161291a876000815181106122f0576122f061397c565b848661303d565b83519091506129308286613b1e565b03612983578d80519060200120612953876001815181106122f0576122f061397c565b805190602001200361297157600199505050505050505050506129e3565b600099505050505050505050506129e3565b8060000361299d57600099505050505050505050506129e3565b6129a78185613b1e565b93506129bf866001815181106128d4576128d461397c565b94506129c89050565b806129d2816139a8565b9150506127a9565b50505050505050505b949350505050565b6000611bb582600001516003815181106123195761231961397c565b6000611bb582600001516004815181106123195761231961397c565b6000611bb582600001516000815181106123195761231961397c565b6060611bb582600001516001815181106122f0576122f061397c565b6001546040516320a9cea560e11b8152600481018490526000918291829182916001600160a01b03909116906341539d4a9060240160a060405180830381865afa158015612aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad19190613b36565b5093505092509250612b28828b612ae891906139c1565b6040805160208082018f90528183018e9052606082018d905260808083018d90528351808403909101815260a09092019092528051910120908588613144565b612b745760405162461bcd60e51b815260206004820152601c60248201527f4678526f6f7454756e6e656c3a20494e56414c49445f484541444552000000006044820152606401610745565b9998505050505050505050565b6040805160208101909152606081526040518060200160405280612bb584602001516001815181106126885761268861397c565b905292915050565b60408051808201909152600080825260208201528251805183908110612be557612be561397c565b6020026020010151905092915050565b805160009015801590612c0a57508151602110155b612c1357600080fd5b6000612c2283602001516132ac565b90506000818460000151612c3691906139c1565b9050600080838660200151612c4b9190613b1e565b9050805191506020831015612c6757826020036101000a820491505b50949350505050565b6060611bb582602001516002815181106122f0576122f061397c565b6060612c9782612ebe565b612ca057600080fd5b6000612cab8361332e565b90506000816001600160401b03811115612cc757612cc76134d3565b604051908082528060200260200182016040528015612d0c57816020015b6040805180820190915260008082526020820152815260200190600190039081612ce55790505b5090506000612d1e85602001516132ac565b8560200151612d2d9190613b1e565b90506000805b84811015612d9657612d44836133b3565b9150604051806040016040528083815260200184815250848281518110612d6d57612d6d61397c565b6020908102919091010152612d828284613b1e565b925080612d8e816139a8565b915050612d33565b509195945050505050565b8051606090612daf57600080fd5b6000612dbe83602001516132ac565b90506000818460000151612dd291906139c1565b90506000816001600160401b03811115612dee57612dee6134d3565b6040519080825280601f01601f191660200182016040528015612e18576020820181803683370190505b5090506000816020019050612c67848760200151612e369190613b1e565b8285613457565b6000612e4a600284613b99565b15612e8457601082612e5d600286613bad565b81518110612e6d57612e6d61397c565b0160200151612e7f919060f81c613bc1565b612eb4565b601082612e92600286613bad565b81518110612ea257612ea261397c565b0160200151612eb4919060f81c613be3565b60f81b9392505050565b80516000908103612ed157506000919050565b6020820151805160001a9060c0821015612eef575060009392505050565b5060019392505050565b80600003612f0657505050565b60208110612f3e5782518252612f1d602084613b1e565b9250612f2a602083613b1e565b9150612f376020826139c1565b9050612f06565b60006001612f4d8360206139c1565b612f5990610100613ce9565b612f6391906139c1565b935183518516941916939093179091525050565b8051600090601514612f8857600080fd5b611bb582612bf5565b6060600082600001516001600160401b03811115612fb157612fb16134d3565b6040519080825280601f01601f191660200182016040528015612fdb576020820181803683370190505b5090508051600003612fed5792915050565b60008160200190506130088460200151828660000151613457565b5092915050565b805160009060211461302057600080fd5b600080836020015160016130349190613b1e565b51949350505050565b6000808061304a86612326565b9050600081516001600160401b03811115613067576130676134d3565b6040519080825280601f01601f191660200182016040528015613091576020820181803683370190505b509050845b82516130a29087613b1e565b8110156131155760008782815181106130bd576130bd61397c565b01602001516001600160f81b031916905080836130da89856139c1565b815181106130ea576130ea61397c565b60200101906001600160f81b031916908160001a90535050808061310d906139a8565b915050613096565b5080805190602001208280519060200120036131345781519250613139565b600092505b509095945050505050565b6000602082516131549190613b99565b156131985760405162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840e0e4dedecc40d8cadccee8d60631b6044820152606401610745565b6000602083516131a89190613bad565b90506131b5816002613ce9565b85106131fb5760405162461bcd60e51b81526020600482015260156024820152744c65616620696e64657820697320746f6f2062696760581b6044820152606401610745565b60008660205b8551811161329e5785810151925061321a600289613b99565b60000361325257604080516020810184905290810184905260600160405160208183030381529060405280519060200120915061327f565b60408051602081018590529081018390526060016040516020818303038152906040528051906020012091505b61328a600289613bad565b9750613297602082613b1e565b9050613201565b509094149695505050505050565b8051600090811a60808110156132c55750600092915050565b60b88110806132e0575060c081108015906132e0575060f881105b156132ee5750600192915050565b60c081101561332257613303600160b8613cf5565b6133109060ff16826139c1565b61331b906001613b1e565b9392505050565b613303600160f8613cf5565b8051600090810361334157506000919050565b60008061335184602001516132ac565b84602001516133609190613b1e565b90506000846000015185602001516133789190613b1e565b90505b808210156133aa5761338c826133b3565b6133969083613b1e565b9150826133a2816139a8565b93505061337b565b50909392505050565b80516000908190811a60808110156133ce5760019150613008565b60b88110156133f4576133e26080826139c1565b6133ed906001613b1e565b9150613008565b60c08110156134215760b78103600185019450806020036101000a85510460018201810193505050613008565b60f8811015613435576133e260c0826139c1565b60019390930151602084900360f7016101000a900490920160f5190192915050565b8060000361346457505050565b6020811061349c578251825261347b602084613b1e565b9250613488602083613b1e565b91506134956020826139c1565b9050613464565b80600003612f3e57505050565b6000602082840312156134bb57600080fd5b81356001600160e01b03198116811461331b57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613511576135116134d3565b604052919050565b600082601f83011261352a57600080fd5b813560206001600160401b03821115613545576135456134d3565b8160051b6135548282016134e9565b928352848101820192828101908785111561356e57600080fd5b83870192505b8483101561358d57823582529183019190830190613574565b979650505050505050565b6000806000606084860312156135ad57600080fd5b83356001600160401b03808211156135c457600080fd5b6135d087838801613519565b945060208601359150808211156135e657600080fd5b6135f287838801613519565b9350604086013591508082111561360857600080fd5b5061361586828701613519565b9150509250925092565b6001600160a01b038116811461227257600080fd5b60008060008060006080868803121561364c57600080fd5b85356136578161361f565b945060208601356136678161361f565b93506040860135925060608601356001600160401b038082111561368a57600080fd5b818801915088601f83011261369e57600080fd5b8135818111156136ad57600080fd5b8960208285010111156136bf57600080fd5b9699959850939650602001949392505050565b6000602082840312156136e457600080fd5b8135801515811461331b57600080fd5b60006020828403121561370657600080fd5b813561331b8161361f565b60006020828403121561372357600080fd5b5035919050565b600081518084526020808501945080840160005b8381101561375a5781518752958201959082019060010161373e565b509495945050505050565b606081526000613778606083018661372a565b828103602084015261378a818661372a565b9050828103604084015261379e818561372a565b9695505050505050565b6000602082840312156137ba57600080fd5b81356001600160401b038111156137d057600080fd5b6129e384828501613519565b600080604083850312156137ef57600080fd5b82356137fa8161361f565b9150602083013561380a8161361f565b809150509250929050565b60006001600160401b0382111561382e5761382e6134d3565b50601f01601f191660200190565b60006020828403121561384e57600080fd5b81356001600160401b0381111561386457600080fd5b8201601f8101841361387557600080fd5b803561388861388382613815565b6134e9565b81815285602083850101111561389d57600080fd5b81602084016020830137600091810160200191909152949350505050565b6020808252601c908201527f5374616b696e672069732063757272656e746c79207061757365642e00000000604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60208082526019908201527f5374616b696e672063757272656e746c79207061757365642e00000000000000604082015260600190565b6020808252601590820152742737903a37b5b2b724b23990383937bb34b232b21760591b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016139ba576139ba613992565b5060010190565b6000828210156139d3576139d3613992565b500390565b634e487b7160e01b600052603160045260246000fd5b60005b83811015613a095781810151838201526020016139f1565b83811115611ce75750506000910152565b60018060a01b03831681526040602082015260008251806040840152613a478160608501602087016139ee565b601f01601f1916919091016060019392505050565b83815260008351613a748160208501602088016139ee565b60209201918201929092526040019392505050565b600060208284031215613a9b57600080fd5b81516001600160401b03811115613ab157600080fd5b8201601f81018413613ac257600080fd5b8051613ad061388382613815565b818152856020838501011115613ae557600080fd5b613af68260208301602086016139ee565b95945050505050565b6000816000190483118215151615613b1957613b19613992565b500290565b60008219821115613b3157613b31613992565b500190565b600080600080600060a08688031215613b4e57600080fd5b855194506020860151935060408601519250606086015191506080860151613b758161361f565b809150509295509295909350565b634e487b7160e01b600052601260045260246000fd5b600082613ba857613ba8613b83565b500690565b600082613bbc57613bbc613b83565b500490565b600060ff831680613bd457613bd4613b83565b8060ff84160691505092915050565b600060ff831680613bf657613bf6613b83565b8060ff84160491505092915050565b600181815b80851115613c40578160001904821115613c2657613c26613992565b80851615613c3357918102915b93841c9390800290613c0a565b509250929050565b600082613c5757506001611bb5565b81613c6457506000611bb5565b8160018114613c7a5760028114613c8457613ca0565b6001915050611bb5565b60ff841115613c9557613c95613992565b50506001821b611bb5565b5060208310610133831016604e8410600b8410161715613cc3575081810a611bb5565b613ccd8383613c05565b8060001904821115613ce157613ce1613992565b029392505050565b600061331b8383613c48565b600060ff821660ff841680821015613d0f57613d0f613992565b9003939250505056fea26469706673582212208e0052f2db19d7a445185f864f84206c0a7108e7286ea9dacdc8eeafcaef33fd64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a200000000000000000000000018487d2cac946c7fe800855c4039aac210f68baa
-----Decoded View---------------
Arg [0] : checkpointManager (address): 0x86E4Dc95c7FBdBf52e33D563BbDB00823894C287
Arg [1] : fxRoot (address): 0xfe5e5D361b2ad62c541bAb87C45a0B9B018389a2
Arg [2] : _dungeonContract (address): 0x18487D2CaC946c7Fe800855c4039aAC210f68bAa
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287
Arg [1] : 000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2
Arg [2] : 00000000000000000000000018487d2cac946c7fe800855c4039aac210f68baa
Deployed Bytecode Sourcemap
40221:19390:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;890:208;;;;;;:::i;:::-;-1:-1:-1;;;;;;1031:25:0;-1:-1:-1;;;1031:25:0;;890:208;;;;470:14:1;;463:22;445:41;;433:2;418:18;890:208:0;;;;;;;;44135:354;;;;;;:::i;:::-;;:::i;:::-;;24090:115;;24139:66;24090:115;;;;;2598:25:1;;;2586:2;2571:18;24090:115:0;2452:177:1;59370:236:0;;;;;;:::i;:::-;-1:-1:-1;;;59370:236:0;;;;;;;;;;;-1:-1:-1;;;;;;3873:33:1;;;3855:52;;3843:2;3828:18;59370:236:0;3711:202:1;41711:97:0;;;;;;:::i;:::-;;:::i;41056:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4650:25:1;;;4706:2;4691:18;;4684:34;;;;4734:18;;;4727:34;4638:2;4623:18;41056:42:0;4448:319:1;47693:954:0;;;;;;:::i;:::-;;:::i;42666:130::-;;;;;;:::i;:::-;-1:-1:-1;;;;;42757:15:0;42730:7;42757:15;;;:8;:15;;;;;:31;;;;42666:130;42418:135;;;;;;:::i;:::-;-1:-1:-1;;;;;42508:15:0;42481:7;42508:15;;;:8;:15;;;;;:37;;42418:135;43079:131;;;;;;:::i;:::-;-1:-1:-1;;;;;43167:15:0;43140:7;43167:15;;;:8;:15;;;;;:28;;:35;;43079:131;40525:28;;;;;-1:-1:-1;;;;;40525:28:0;;;;;;-1:-1:-1;;;;;5318:32:1;;;5300:51;;5288:2;5273:18;40525:28:0;5139:218:1;55019:809:0;;;;;;:::i;:::-;;:::i;24498:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43390:383;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;40560:27::-;;;;;-1:-1:-1;;;;;40560:27:0;;;41881:415;;;;;;:::i;:::-;;:::i;752:130::-;;;:::i;52777:1003::-;;;;;;:::i;:::-;;:::i;48655:1010::-;;;;;;:::i;:::-;;:::i;44497:1017::-;;;;;;:::i;:::-;;:::i;507:81::-;574:6;;-1:-1:-1;;;;;574:6:0;507:81;;24420:28;;;;;-1:-1:-1;;;;;24420:28:0;;;51823:944;;;;;;:::i;:::-;;:::i;53788:1097::-;;;;;;:::i;:::-;;:::i;42804:133::-;;;;;;:::i;:::-;-1:-1:-1;;;;;42893:15:0;42866:7;42893:15;;;:8;:15;;;;;:29;;:36;;42804:133;45522:1117;;;;;;:::i;:::-;;:::i;24783:209::-;;;;;;:::i;:::-;;:::i;41107:25::-;;;;;;;;;43216:126;;;;;;:::i;:::-;-1:-1:-1;;;;;43305:15:0;43278:7;43305:15;;;:8;:15;;;;;:29;;;;43216:126;24306:43;;;;;-1:-1:-1;;;;;24306:43:0;;;50916:814;;;;;;:::i;:::-;;:::i;55919:934::-;;;;;;:::i;:::-;;:::i;42943:128::-;;;;;;:::i;:::-;-1:-1:-1;;;;;43033:15:0;43006:7;43033:15;;;:8;:15;;;;;:30;;;;42943:128;41438:229;;;;;;:::i;:::-;;:::i;49673:1107::-;;;;;;:::i;:::-;;:::i;43781:346::-;;;;;;:::i;:::-;;:::i;46777:821::-;;;;;;:::i;:::-;;:::i;24244:28::-;;;;;-1:-1:-1;;;;;24244:28:0;;;596:148;;;;;;:::i;:::-;;:::i;40489:29::-;;;;;-1:-1:-1;;;;;40489:29:0;;;29551:186;;;;;;:::i;:::-;;:::i;44135:354::-;44290:15;;:19;44286:58;;44311:33;44335:8;44311:23;:33::i;:::-;44359:14;;:18;44355:55;;44379:31;44402:7;44379:22;:31::i;:::-;44425:13;;:17;44421:52;;44444:29;44466:6;44444:21;:29::i;:::-;44135:354;;;:::o;41711:97::-;398:6;;-1:-1:-1;;;;;398:6:0;408:10;398:20;390:29;;;;;;41778:13:::1;:22:::0;;-1:-1:-1;;41778:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41711:97::o;47693:954::-;47763:13;;;;47762:14;47754:55;;;;-1:-1:-1;;;47754:55:0;;;;;;;:::i;:::-;;;;;;;;;47853:10;47820:21;47844:20;;;:8;:20;;;;;;;;;47883:47;;;;;;;;;;;;;;;;;47844:20;;47883:47;;;;47844:20;;47883:47;;47844:20;47883:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47922:7;47883:15;:47::i;:::-;47875:78;;;;-1:-1:-1;;;47875:78:0;;9507:2:1;47875:78:0;;;9489:21:1;9546:2;9526:18;;;9519:30;-1:-1:-1;;;9565:18:1;;;9558:48;9623:18;;47875:78:0;9305:342:1;47875:78:0;47966:15;;:114;;-1:-1:-1;;;47966:114:0;;-1:-1:-1;;;;;47966:15:0;;;;:28;;:114;;48017:4;;48037:10;;48062:7;;47966:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48093:40;48117:6;48125:7;48093:23;:40::i;:::-;48150:28;;:21;:33;48146:220;;48254:1;48229:22;;;:26;48146:220;48451:186;48514:10;48551:15;48543:24;48485:141;;;-1:-1:-1;;;;;10413:32:1;;;48485:141:0;;;10395:51:1;10462:18;;10455:34;48586:1:0;10505:18:1;;;10498:45;48606:5:0;10559:18:1;;;10552:50;10367:19;;48485:141:0;;;;;;;;;;;;;48451:19;:186::i;:::-;47743:904;47693:954;:::o;55019:809::-;55085:13;;;;55084:14;55076:55;;;;-1:-1:-1;;;55076:55:0;;;;;;;:::i;:::-;55175:10;55142:21;55166:20;;;:8;:20;;;;;;;;55197:19;;;;:33;;;;;;;;;;;;;;;;;;;;55241:13;;:112;;-1:-1:-1;;;55241:112:0;;55166:20;;-1:-1:-1;;;;;55241:13:0;;;;:26;;:112;;55175:10;55315:4;;55197:33;;55241:112;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55368:6;:20;;;55392:1;55368:25;55364:206;;55542:15;55519:20;;;:38;55364:206;55637:183;55700:10;55737:13;55729:22;55671:138;;;-1:-1:-1;;;;;10413:32:1;;;55671:138:0;;;10395:51:1;10462:18;;10455:34;55770:1:0;10505:18:1;;;10498:45;;;10559:18;;;10552:50;10367:19;;55671:138:0;10164:444:1;43390:383:0;-1:-1:-1;;;;;43617:14:0;;43594:20;43617:14;;;:8;:14;;;;;;;;43594:37;;;;;;;;;;;;;;;;;;;;;43464:25;;;;;;43594:20;;43617:14;43594:37;;;;43617:14;;43594:37;;;43617:14;43594:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43594:37:0;;;-1:-1:-1;;43594:37:0;;;;;;;;;;;43664:21;;43700:20;;;;43735:19;;;;;43664:21;;43700:20;;-1:-1:-1;43735:19:0;-1:-1:-1;43390:383:0;-1:-1:-1;;;43390:383:0:o;41881:415::-;-1:-1:-1;;;;;42508:15:0;;41936:7;42508:15;;;:8;:15;;;;;:37;41936:7;-1:-1:-1;41959:55:0;;;;-1:-1:-1;;;;;;42893:15:0;;42013:1;42893:15;;;:8;:15;;;;;:29;;:36;41989:25;41959:55;:83;;;;-1:-1:-1;;;;;;43167:15:0;;42041:1;43167:15;;;:8;:15;;;;;:28;;:35;42018:24;41959:83;41956:96;;;-1:-1:-1;42051:1:0;;41881:415;-1:-1:-1;41881:415:0:o;41956:96::-;-1:-1:-1;;;;;42508:15:0;;42091:1;42508:15;;;:8;:15;;;;;:37;42066:26;:55;;;;-1:-1:-1;;;;;;42893:15:0;;42120:1;42893:15;;;:8;:15;;;;;:29;;:36;42096:25;42066:55;:84;;;;-1:-1:-1;;;;;;43167:15:0;;43140:7;43167:15;;;:8;:15;;;;;:28;;:35;42125:25;42066:84;42063:97;;;-1:-1:-1;42159:1:0;;41881:415;-1:-1:-1;41881:415:0:o;42063:97::-;-1:-1:-1;;;;;42508:15:0;;42199:1;42508:15;;;:8;:15;;;;;:37;42174:26;:56;;;;-1:-1:-1;;;;;;42893:15:0;;42866:7;42893:15;;;:8;:15;;;;;:29;;:36;42204:26;42174:56;:85;;;;-1:-1:-1;;;;;;43167:15:0;;43140:7;43167:15;;;:8;:15;;;;;:28;;:35;42234:25;42174:85;42171:98;;;-1:-1:-1;42268:1:0;;41881:415;-1:-1:-1;41881:415:0:o;42171:98::-;-1:-1:-1;42287:1:0;;41881:415;-1:-1:-1;41881:415:0:o;752:130::-;817:6;;-1:-1:-1;;;;;817:6:0;803:10;:20;799:43;;832:10;;-1:-1:-1;;;832:10:0;;;;;;;;;;;799:43;855:6;:19;;-1:-1:-1;;;;;;855:19:0;;;752:130::o;52777:1003::-;52860:13;;;;52859:14;52851:52;;;;-1:-1:-1;;;52851:52:0;;;;;;;:::i;:::-;52938:1;52922:8;:15;:17;52914:51;;;;-1:-1:-1;;;52914:51:0;;;;;;;:::i;:::-;53011:10;52978:21;53002:20;;;:8;:20;;;;;53039;;;;53002;;53039:25;53035:206;;53213:15;53190:20;;;:38;53035:206;53258:9;53253:257;53277:8;:15;53273:1;:19;53253:257;;;53314:6;:19;;53339:8;53348:1;53339:11;;;;;;;;:::i;:::-;;;;;;;;;;;;53314:37;;;;;;;-1:-1:-1;53314:37:0;;;;;;;;;53366:13;;53472:11;;-1:-1:-1;;;;;53366:13:0;;;;:26;;53411:10;;53448:4;;53472:8;;53481:1;;53472:11;;;;;;:::i;:::-;;;;;;;53366:132;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53294:3;;;;;:::i;:::-;;;;53253:257;;;-1:-1:-1;53575:197:0;53638:10;53675:13;53667:22;53708:15;;53609:152;;;-1:-1:-1;;;;;11964:32:1;;;53609:152:0;;;11946:51:1;12013:18;;12006:34;;;;12056:18;;;12049:34;53742:4:0;12099:18:1;;;12092:50;11918:19;;53609:152:0;11721:427:1;48655:1010:0;48739:13;;;;48738:14;48730:52;;;;-1:-1:-1;;;48730:52:0;;;;;;;:::i;:::-;48817:1;48801:8;:15;:17;48793:51;;;;-1:-1:-1;;;48793:51:0;;;;;;;:::i;:::-;48890:10;48857:21;48881:20;;;:8;:20;;;;;48918:21;;;;48881:20;;48918:26;48914:209;;49095:15;49071:21;;;:39;48914:209;49140:9;49135:259;49159:8;:15;49155:1;:19;49135:259;;;49196:6;:20;;49222:8;49231:1;49222:11;;;;;;;;:::i;:::-;;;;;;;;;;;;49196:38;;;;;;;-1:-1:-1;49196:38:0;;;;;;;;;49249:14;;49356:11;;-1:-1:-1;;;;;49249:14:0;;;;:27;;49295:10;;49332:4;;49356:8;;49365:1;;49356:11;;;;;;:::i;:::-;;;;;;;49249:133;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49176:3;;;;;:::i;:::-;;;;49135:259;;;-1:-1:-1;49459:198:0;49522:10;49559:14;49551:23;;44497:1017;44582:13;;;;44581:14;44573:52;;;;-1:-1:-1;;;44573:52:0;;;;;;;:::i;:::-;44660:1;44644:8;:15;:17;44636:51;;;;-1:-1:-1;;;44636:51:0;;;;;;;:::i;:::-;44733:10;44700:21;44724:20;;;:8;:20;;;;;44761:22;;;;44724:20;;44761:27;44757:212;;44941:15;44916:22;;;:40;44757:212;44986:9;44981:261;45005:8;:15;45001:1;:19;44981:261;;;45042:6;:21;;45069:8;45078:1;45069:11;;;;;;;;:::i;:::-;;;;;;;;;;;;45042:39;;;;;;;-1:-1:-1;45042:39:0;;;;;;;;;45096:15;;45204:11;;-1:-1:-1;;;;;45096:15:0;;;;:28;;45143:10;;45180:4;;45204:8;;45213:1;;45204:11;;;;;;:::i;:::-;;;;;;;45096:134;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45022:3;;;;;:::i;:::-;;;;44981:261;;;-1:-1:-1;45307:199:0;45370:10;45407:15;45399:24;;51823:944;51892:13;;;;51891:14;51883:55;;;;-1:-1:-1;;;51883:55:0;;;;;;;:::i;:::-;51982:10;51949:21;51973:20;;;:8;:20;;;;;;;;;52028;;;52012:46;;;;;;;;;;;;;;;;;51973:20;;52012:46;;;;;;;52028:20;52012:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52050:7;52012:15;:46::i;:::-;52004:76;;;;-1:-1:-1;;;52004:76:0;;12355:2:1;52004:76:0;;;12337:21:1;12394:2;12374:18;;;12367:30;-1:-1:-1;;;12413:18:1;;;12406:47;12470:18;;52004:76:0;12153:341:1;52004:76:0;52093:14;;:113;;-1:-1:-1;;;52093:113:0;;-1:-1:-1;;;;;52093:14:0;;;;:27;;:113;;52143:4;;52163:10;;52188:7;;52093:113;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52219:39;52242:6;52250:7;52219:22;:39::i;:::-;52275:20;;;:27;52306:1;52275:32;52271:217;;52376:1;52352:21;;;:25;52271:217;52572:185;52635:10;52672:14;52664:23;;53788:1097;53873:13;;;;53872:14;53864:55;;;;-1:-1:-1;;;53864:55:0;;;;;;;:::i;:::-;53963:10;53930:21;53954:20;;;:8;:20;;;;;;53985:387;54009:8;:15;54005:1;:19;53985:387;;;54046:15;54064:8;54073:1;54064:11;;;;;;;;:::i;:::-;;;;;;;54046:29;;54098:45;54114:6;:19;;54098:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54135:7;54098:15;:45::i;:::-;54090:74;;;;-1:-1:-1;;;54090:74:0;;12701:2:1;54090:74:0;;;12683:21:1;12740:2;12720:18;;;12713:30;-1:-1:-1;;;12759:18:1;;;12752:46;12815:18;;54090:74:0;12499:340:1;54090:74:0;54179:13;;:128;;-1:-1:-1;;;54179:128:0;;-1:-1:-1;;;;;54179:13:0;;;;:26;;:128;;54232:4;;54256:10;;54285:7;;54179:128;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54322:38;54344:6;54352:7;54322:21;:38::i;:::-;-1:-1:-1;54026:3:0;;;;:::i;:::-;;;;53985:387;;;-1:-1:-1;54388:19:0;;;:26;54418:1;54388:31;54384:214;;54486:1;54463:20;;;:24;54384:214;54679:198;54742:10;54779:13;54771:22;54812:15;;54713:153;;;-1:-1:-1;;;;;11964:32:1;;;54713:153:0;;;11946:51:1;12013:18;;12006:34;;;;12056:18;;;12049:34;54846:5:0;12099:18:1;;;12092:50;11918:19;;54713:153:0;11721:427:1;45522:1117:0;45609:13;;;;45608:14;45600:55;;;;-1:-1:-1;;;45600:55:0;;;;;;;:::i;:::-;45699:10;45666:21;45690:20;;;:8;:20;;;;;;45721:395;45745:8;:15;45741:1;:19;45721:395;;;45782:15;45800:8;45809:1;45800:11;;;;;;;;:::i;:::-;;;;;;;45782:29;;45834:47;45850:6;:21;;45834:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45873:7;45834:15;:47::i;:::-;45826:78;;;;-1:-1:-1;;;45826:78:0;;9507:2:1;45826:78:0;;;9489:21:1;9546:2;9526:18;;;9519:30;-1:-1:-1;;;9565:18:1;;;9558:48;9623:18;;45826:78:0;9305:342:1;45826:78:0;45919:15;;:130;;-1:-1:-1;;;45919:130:0;;-1:-1:-1;;;;;45919:15:0;;;;:28;;:130;;45974:4;;45998:10;;46027:7;;45919:130;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46064:40;46088:6;46096:7;46064:23;:40::i;:::-;-1:-1:-1;45762:3:0;;;;:::i;:::-;;;;45721:395;;;-1:-1:-1;46132:28:0;;:21;:33;46128:220;;46236:1;46211:22;;;:26;46128:220;46431:200;46494:10;46531:15;46523:24;;24783:209;24867:13;;-1:-1:-1;;;;;24867:13:0;:29;24859:84;;;;-1:-1:-1;;;24859:84:0;;13046:2:1;24859:84:0;;;13028:21:1;13085:2;13065:18;;;13058:30;13124:34;13104:18;;;13097:62;-1:-1:-1;;;13175:18:1;;;13168:40;13225:19;;24859:84:0;12844:406:1;24859:84:0;24954:13;:30;;-1:-1:-1;;;;;;24954:30:0;-1:-1:-1;;;;;24954:30:0;;;;;;;;;;24783:209::o;50916:814::-;50983:13;;;;50982:14;50974:55;;;;-1:-1:-1;;;50974:55:0;;;;;;;:::i;:::-;51073:10;51040:21;51064:20;;;:8;:20;;;;;;;;51095;;;:34;;;;;;;;;;;;;;;;;;;;51140:14;;:113;;-1:-1:-1;;;51140:113:0;;51064:20;;-1:-1:-1;;;;;51140:14:0;;;;:27;;:113;;51215:4;;51095:34;;51140:113;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51268:6;:21;;;51293:1;51268:26;51264:209;;51445:15;51421:21;;;:39;51264:209;51538:184;51601:10;51638:14;51630:23;;55919:934;55987:13;;;;55986:14;55978:55;;;;-1:-1:-1;;;55978:55:0;;;;;;;:::i;:::-;56077:10;56044:21;56068:20;;;:8;:20;;;;;;;;;56123:19;;;56107:45;;;;;;;;;;;;;;;;;56068:20;;56107:45;;;;;;;56123:19;56107:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56144:7;56107:15;:45::i;:::-;56099:74;;;;-1:-1:-1;;;56099:74:0;;12701:2:1;56099:74:0;;;12683:21:1;12740:2;12720:18;;;12713:30;-1:-1:-1;;;12759:18:1;;;12752:46;12815:18;;56099:74:0;12499:340:1;56099:74:0;56186:13;;:112;;-1:-1:-1;;;56186:112:0;;-1:-1:-1;;;;;56186:13:0;;;;:26;;:112;;56235:4;;56255:10;;56280:7;;56186:112;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56311:38;56333:6;56341:7;56311:21;:38::i;:::-;56366:19;;;:26;56396:1;56366:31;56362:214;;56464:1;56441:20;;;:24;56362:214;56659:184;56722:10;56759:13;56751:22;;41438:229;398:6;;-1:-1:-1;;;;;398:6:0;408:10;398:20;390:29;;;;;;41570:14:::1;:40:::0;;-1:-1:-1;;;;;41570:40:0;;::::1;-1:-1:-1::0;;;;;;41570:40:0;;::::1;;::::0;;;41621:13:::1;:38:::0;;;;;::::1;::::0;::::1;;::::0;;41438:229::o;49673:1107::-;49759:13;;;;49758:14;49750:55;;;;-1:-1:-1;;;49750:55:0;;;;;;;:::i;:::-;49849:10;49816:21;49840:20;;;:8;:20;;;;;;49871:391;49895:8;:15;49891:1;:19;49871:391;;;49932:15;49950:8;49959:1;49950:11;;;;;;;;:::i;:::-;;;;;;;49932:29;;49984:46;50000:6;:20;;49984:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50022:7;49984:15;:46::i;:::-;49976:76;;;;-1:-1:-1;;;49976:76:0;;12355:2:1;49976:76:0;;;12337:21:1;12394:2;12374:18;;;12367:30;-1:-1:-1;;;12413:18:1;;;12406:47;12470:18;;49976:76:0;12153:341:1;49976:76:0;50067:14;;:129;;-1:-1:-1;;;50067:129:0;;-1:-1:-1;;;;;50067:14:0;;;;:27;;:129;;50121:4;;50145:10;;50174:7;;50067:129;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50211:39;50234:6;50242:7;50211:22;:39::i;:::-;-1:-1:-1;49912:3:0;;;;:::i;:::-;;;;49871:391;;;-1:-1:-1;50278:20:0;;;:27;50309:1;50278:32;50274:217;;50379:1;50355:21;;;:25;50274:217;50573:199;50636:10;50673:14;50665:23;;43781:346;43934:15;;:19;43930:56;;43955:31;43977:8;43955:21;:31::i;:::-;44001:14;;:18;43997:53;;44021:29;44042:7;44021:20;:29::i;:::-;44065:13;;:17;44061:50;;44084:27;44104:6;44084:19;:27::i;46777:821::-;46845:13;;;;46844:14;46836:55;;;;-1:-1:-1;;;46836:55:0;;;;;;;:::i;:::-;46935:10;46902:21;46926:20;;;:8;:20;;;;;;;;46957:35;;;;;;;;;;;;;;;;;;;;47003:15;;:114;;-1:-1:-1;;;47003:114:0;;46926:20;;-1:-1:-1;;;;;47003:15:0;;;;:28;;:114;;47079:4;;46957:35;;47003:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47132:6;:22;;;47158:1;47132:27;47128:212;;47312:15;47287:22;;;:40;47128:212;47405:185;47468:10;47505:15;47497:24;;596:148;680:6;;-1:-1:-1;;;;;680:6:0;666:10;:20;662:43;;695:10;;-1:-1:-1;;;695:10:0;;;;;;;;;;;662:43;718:6;:18;;-1:-1:-1;;;;;;718:18:0;-1:-1:-1;;;;;718:18:0;;;;;;;;;;596:148::o;29551:186::-;29625:20;29648:37;29675:9;29648:26;:37::i;58623:243::-;58709:4;;58726:110;58750:8;:15;58746:1;:19;58726:110;;;58804:7;58789:8;58798:1;58789:11;;;;;;;;:::i;:::-;;;;;;;:22;58786:38;;58820:4;58813:11;;;;;58786:38;58767:3;;;;:::i;:::-;;;;58726:110;;;;58853:5;58846:12;;58623:243;;;;;:::o;56861:535::-;56953:31;56987:6;:21;;56953:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57019:13;57048:9;57043:118;57063:14;:21;57059:1;:25;57043:118;;;57131:7;57110:14;57125:1;57110:17;;;;;;;;:::i;:::-;;;;;;;:28;57106:43;;57148:1;57140:9;;57106:43;57086:3;;;;:::i;:::-;;;;57043:118;;;;57200:7;57175:14;57190:5;57175:21;;;;;;;;:::i;:::-;;;;;;;:32;57171:218;;57288:28;;57255:14;;57288:32;;57319:1;;57288:32;:::i;:::-;57255:80;;;;;;;;:::i;:::-;;;;;;;57224:6;:21;;57246:5;57224:28;;;;;;;;:::i;:::-;;;;;;;;;;:111;57350:27;;:6;;:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;57171:218;56942:454;;56861:535;;:::o;25297:128::-;25368:6;;25394:13;;25368:49;;-1:-1:-1;;;25368:49:0;;-1:-1:-1;;;;;25368:6:0;;;;:25;;:49;;25394:13;;;25409:7;;25368:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25297:128;:::o;57404:525::-;57495:30;57528:6;:20;;57495:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57559:13;57588:9;57583:116;57603:13;:20;57599:1;:24;57583:116;;;57669:7;57649:13;57663:1;57649:16;;;;;;;;:::i;:::-;;;;;;;:27;57645:42;;57686:1;57678:9;;57645:42;57625:3;;;;:::i;:::-;;;;57583:116;;;;57737:7;57713:13;57727:5;57713:20;;;;;;;;:::i;:::-;;;;;;;:31;57709:213;;57823:20;;;:27;57791:13;;57823:31;;57853:1;;57823:31;:::i;:::-;57791:78;;;;;;;;:::i;:::-;;;;;;;57761:6;:20;;57782:5;57761:27;;;;;;;;:::i;:::-;;;;;;;;;;:108;57884:20;;;:26;;;;;;;:::i;57937:515::-;58027:29;58059:6;:19;;58027:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58089:13;58118:9;58113:114;58133:12;:19;58129:1;:23;58113:114;;;58197:7;58178:12;58191:1;58178:15;;;;;;;;:::i;:::-;;;;;;;:26;58174:41;;58214:1;58206:9;;58174:41;58154:3;;;;:::i;:::-;;;;58113:114;;;;58264:7;58241:12;58254:5;58241:19;;;;;;;;:::i;:::-;;;;;;;:30;58237:208;;58348:19;;;:26;58317:12;;58348:30;;58377:1;;58348:30;:::i;:::-;58317:76;;;;;;;;:::i;:::-;;;;;;;58288:6;:19;;58308:5;58288:26;;;;;;;;:::i;:::-;;;;;;;;;;:105;58408:19;;;:25;;;;;;;:::i;25433:2411::-;25511:12;25536:44;25583:25;:9;:23;:25::i;:::-;25536:72;;25621:28;25652:30;:7;:28;:30::i;:::-;25621:61;;25693:19;25715:24;:7;:22;:24::i;:::-;25693:46;;25901:16;25979:11;26275:52;26311:15;26275:35;:52::i;:::-;26346:28;:7;:26;:28::i;:::-;25944:445;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25944:445:0;;;;;;;;;25920:480;;25944:445;25920:480;;;;26419:24;;;;:14;:24;;;;;;25920:480;;-1:-1:-1;26419:24:0;;:33;26411:82;;;;-1:-1:-1;;;26411:82:0;;14901:2:1;26411:82:0;;;14883:21:1;14940:2;14920:18;;;14913:30;14979:34;14959:18;;;14952:62;-1:-1:-1;;;15030:18:1;;;15023:34;15074:19;;26411:82:0;14699:400:1;26411:82:0;26504:24;;;;:14;:24;;;;;:31;;-1:-1:-1;;26504:31:0;26531:4;26504:31;;;26591:20;:7;:18;:20::i;:::-;26548:63;;26622:32;26657:16;:7;:14;:16::i;:::-;26622:51;;26742:16;:3;:14;:16::i;:::-;26725:13;;-1:-1:-1;;;;;26725:13:0;;;:33;;;26717:83;;;;-1:-1:-1;;;26717:83:0;;15306:2:1;26717:83:0;;;15288:21:1;15345:2;15325:18;;;15318:30;15384:34;15364:18;;;15357:62;-1:-1:-1;;;15435:18:1;;;15428:35;15480:19;;26717:83:0;15104:401:1;26717:83:0;26813:19;26835:24;:7;:22;:24::i;:::-;26813:46;;26929:102;26956:17;:7;17062:11;;;;16966:115;26956:17;26975:15;26992:25;:7;:23;:25::i;:::-;27019:11;26929:26;:102::i;:::-;26907:187;;;;-1:-1:-1;;;26907:187:0;;15712:2:1;26907:187:0;;;15694:21:1;15751:2;15731:18;;;15724:30;15790:34;15770:18;;;15763:62;-1:-1:-1;;;15841:18:1;;;15834:33;15884:19;;26907:187:0;15510:399:1;26907:187:0;27147:245;27195:11;27221:22;:7;:20;:22::i;:::-;27258:19;:7;:17;:19::i;:::-;27292:11;27318:25;:7;:23;:25::i;:::-;27358:23;:7;:21;:23::i;:::-;27147:33;:245::i;:::-;;27405:41;27449:15;:3;:13;:15::i;:::-;27405:59;-1:-1:-1;24139:66:0;27507:27;:18;27405:59;27539:22;27507:15;:18::i;:::-;:25;:27::i;:::-;27499:62;27477:166;;;;-1:-1:-1;;;27477:166:0;;16116:2:1;27477:166:0;;;16098:21:1;16155:2;16135:18;;;16128:30;16194:33;16174:18;;;16167:61;16245:18;;27477:166:0;15914:355:1;27477:166:0;27690:20;27724:13;:3;:11;:13::i;:::-;27713:34;;;;;;;;;;;;:::i;:::-;27690:57;25433:2411;-1:-1:-1;;;;;;;;;;;25433:2411:0:o;58460:155::-;;:::o;14316:214::-;-1:-1:-1;;;;;;;;;;;;14412:38:0;14453:25;:16;:4;-1:-1:-1;;;;;;;;;;;;;;;;;4029:28:0;;;;;;;;4037:11;;4029:28;;3984:15;;;4029:28;;;;;;;;3837:228;14453:16;:23;:25::i;:::-;14498:24;;;;;;;;;;;;;14316:214;-1:-1:-1;;;14316:214:0:o;16495:146::-;16576:12;16608:25;:7;:12;;;16621:1;16608:15;;;;;;;;:::i;:::-;;;;;;;:23;:25::i;14828:134::-;14903:7;14930:24;:7;:12;;;14943:1;14930:15;;;;;;;;:::i;:::-;;;;;;;:22;:24::i;22027:795::-;22116:25;;;;;;;;;:20;:25;;22156:8;;22091:12;;22116:25;22156:12;22152:638;;22185:12;22212:14;22235:26;22256:1;22259;22235:20;:26::i;:::-;22229:33;;;-1:-1:-1;22293:1:0;22281:13;;;:30;;;22298:8;:13;;22310:1;22298:13;22281:30;22277:349;;;22367:1;22352;:8;22363:1;22352:12;;;;:::i;:::-;:16;;;;:::i;:::-;-1:-1:-1;;;;;22342:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22342:27:0;;22332:37;;22388:16;22407:26;22428:1;22431;22407:20;:26::i;:::-;22388:45;;22465:9;22452:7;22460:1;22452:10;;;;;;;;:::i;:::-;;;;:22;-1:-1:-1;;;;;22452:22:0;;;;;;;;;22502:1;22493:10;;22313:206;22277:349;;;22579:1;22564;:8;22575:1;22564:12;;;;:::i;:::-;:16;;;;:::i;:::-;-1:-1:-1;;;;;22554:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22554:27:0;;22544:37;;22609:1;22600:10;;22277:349;22647:18;;;22642:137;22671:7;:14;22667:1;:18;22642:137;;;22724:39;22745:10;;;;:1;:10;:::i;:::-;:14;;22758:1;22745:14;:::i;:::-;22761:1;22724:20;:39::i;:::-;22711:7;22719:1;22711:10;;;;;;;;:::i;:::-;;;;:52;-1:-1:-1;;;;;22711:52:0;;;;;;;;-1:-1:-1;22687:3:0;;;;:::i;:::-;;;;22642:137;;;;22170:620;;22807:7;22027:795;-1:-1:-1;;22027:795:0:o;16796:138::-;16875:7;16902:24;:7;:12;;;16915:1;16902:15;;;;;;;;:::i;15407:931::-;15478:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;15478:22:0;15527:25;:7;:12;;;15540:1;15527:15;;;;;;;;:::i;:25::-;15513:11;;;;:39;;;-1:-1:-1;;;;;;;;;;;;;;;;4029:28:0;;;;;;;;4037:11;;4029:28;;3984:15;;;4029:28;;;;15642:20;4029:28;15642:18;:20::i;:::-;15638:609;;;15720:20;:11;:18;:20::i;:::-;15705:35;;15638:609;;;15854:11;;;;15912:17;;15828:23;;15912:21;;15932:1;;15912:21;:::i;:::-;-1:-1:-1;;;;;15902:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15902:32:0;;15880:54;;15949:14;15978:15;16054:10;16050:2;16046:19;16036:29;;16104:6;16098:4;16094:17;16083:28;;16142:36;16147:6;16155:7;16164:6;:13;16142:4;:36::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;4029:28:0;;;;;;;;4037:11;;4029:28;;3984:15;;;4029:28;;;;16208:27;;14453:23;:25::i;16208:27::-;16193:42;;-1:-1:-1;;;;15638:609:0;16278:27;16297:7;16278:18;:27::i;:::-;16259:16;;;:46;-1:-1:-1;16259:7:0;15407:931;-1:-1:-1;15407:931:0:o;17089:219::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17175:32:0;17210:24;:7;:12;;;17223:1;17210:15;;;;;;;;:::i;:::-;;;;;;;:22;:24::i;:::-;17235:7;:16;;;17210:42;;;;;;;;:::i;:::-;;;;;;;17175:77;;17270:30;;;;;;;;17274:7;17270:30;;;;17283:16;:7;:14;:16::i;:::-;17270:30;;17263:37;17089:219;-1:-1:-1;;;17089:219:0:o;17336:126::-;17395:7;17422:32;17442:3;:8;;;17451:1;17442:11;;;;;;;;:::i;:::-;;;;;;;17422:19;:32::i;15256:143::-;15331:7;15366:24;:7;:12;;;15379:1;15366:15;;;;;;;;:::i;16346:141::-;16422:12;16454:25;:7;:12;;;16467:1;16454:15;;;;;;;;:::i;18528:2470::-;18699:4;18716:29;18748:35;18768:14;-1:-1:-1;;;;;;;;;;;;;;;;;4029:28:0;;;;;;;;4037:11;;4029:28;;3984:15;;;4029:28;;;;;;;;3837:228;18748:35;18716:67;;18794:38;18835:22;18852:4;18835:16;:22::i;:::-;18794:63;-1:-1:-1;18870:24:0;;18978:4;18960:15;;19045:28;19061:11;19045:15;:28::i;:::-;19025:48;;19088:4;:11;19103:1;19088:16;19084:61;;19128:5;19121:12;;;;;;;;;;;19084:61;19162:9;19157:1834;19181:11;:18;19177:1;:22;19157:1834;;;19235:4;:11;19225:7;:21;19221:74;;;19274:5;19267:12;;;;;;;;;;;;19221:74;19325:36;19346:11;19358:1;19346:14;;;;;;;;:::i;:::-;;;;;;;19325:20;:36::i;:::-;19311:50;;19401:11;19391:22;;;;;;19380:7;:33;19376:86;;19441:5;19434:12;;;;;;;;;;;;19376:86;19494:32;19511:11;19523:1;19511:14;;;;;;;;:::i;19494:32::-;19476:50;;19547:15;:22;19573:2;19547:28;19543:1437;;19611:4;:11;19600:7;:22;19596:276;;19714:5;19704:16;;;;;;19661:38;19679:15;19695:2;19679:19;;;;;;;;:::i;19661:38::-;19651:49;;;;;;:69;19647:206;;19756:4;19749:11;;;;;;;;;;;;19647:206;19824:5;19817:12;;;;;;;;;;;;19647:206;19892:20;19921:4;19926:7;19921:13;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;19975:2:0;19958:19;;19954:80;;;20009:5;20002:12;;;;;;;;;;;;;19954:80;20070:55;20093:15;20109:14;20093:31;;;;;;;;;;:::i;:::-;;;;;;;20070:22;:55::i;:::-;20062:64;-1:-1:-1;20145:12:0;20156:1;20145:12;;:::i;:::-;;;19577:596;19543:1437;;;20183:15;:22;20209:1;20183:27;20179:801;;20231:17;20251:72;20270:37;20288:15;20304:1;20288:18;;;;;;;;:::i;20270:37::-;20309:4;20315:7;20251:18;:72::i;:::-;20369:11;;20231:92;;-1:-1:-1;20346:19:0;20231:92;20346:7;:19;:::i;:::-;:34;20342:320;;20504:5;20494:16;;;;;;20452:37;20470:15;20486:1;20470:18;;;;;;;;:::i;20452:37::-;20442:48;;;;;;:68;20438:205;;20546:4;20539:11;;;;;;;;;;;;;20438:205;20614:5;20607:12;;;;;;;;;;;;;20438:205;20720:9;20733:1;20720:14;20716:75;;20766:5;20759:12;;;;;;;;;;;;;20716:75;20811:20;20822:9;20811:20;;:::i;:::-;;;20868:42;20891:15;20907:1;20891:18;;;;;;;;:::i;20868:42::-;20860:51;-1:-1:-1;20179:801:0;;-1:-1:-1;20179:801:0;;19201:3;;;;:::i;:::-;;;;19157:1834;;;;18705:2293;;;;;;;18528:2470;;;;;;;:::o;14970:132::-;15043:7;15070:24;:7;:12;;;15083:1;15070:15;;;;;;;;:::i;15110:138::-;15180:7;15215:24;:7;:12;;;15228:1;15215:15;;;;;;;;:::i;14538:135::-;14614:7;14641:24;:7;:12;;;14654:1;14641:15;;;;;;;;:::i;14681:139::-;14755:12;14787:25;:7;:12;;;14800:1;14787:15;;;;;;;;:::i;27852:710::-;28188:17;;:44;;-1:-1:-1;;;28188:44:0;;;;;2598:25:1;;;28102:7:0;;;;;;;;-1:-1:-1;;;;;28188:17:0;;;;:30;;2571:18:1;;28188:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28122:110;;;;;;;;28267:204;28388:10;28374:11;:24;;;;:::i;:::-;28277:61;;;;;;;17934:19:1;;;17969:12;;;17962:28;;;18006:12;;;17999:28;;;18043:12;;;;18036:28;;;28277:61:0;;;;;;;;;;18080:13:1;;;;28277:61:0;;;28267:72;;;;;;28417:10;28446;28267:88;:204::i;:::-;28245:282;;;;-1:-1:-1;;;28245:282:0;;18306:2:1;28245:282:0;;;18288:21:1;18345:2;18325:18;;;18318:30;18384;18364:18;;;18357:58;18432:18;;28245:282:0;18104:352:1;28245:282:0;28545:9;27852:710;-1:-1:-1;;;;;;;;;27852:710:0:o;17470:133::-;-1:-1:-1;;;;;;;;;;;;17564:31:0;;;;;;;;17574:20;:3;:8;;;17583:1;17574:11;;;;;;;;:::i;:20::-;17564:31;;17557:38;17470:133;-1:-1:-1;;17470:133:0:o;17890:151::-;-1:-1:-1;;;;;;;;;;;;;;;;;18015:11:0;;:18;;18027:5;;18015:18;;;;;;:::i;:::-;;;;;;;18008:25;;17890:151;;;;:::o;8071:564::-;8159:8;;8131:7;;8159:12;;;;:30;;-1:-1:-1;8175:8:0;;8187:2;-1:-1:-1;8175:14:0;8159:30;8151:39;;;;;;8203:14;8220:27;8235:4;:11;;;8220:14;:27::i;:::-;8203:44;;8258:11;8283:6;8272:4;:8;;;:17;;;;:::i;:::-;8258:31;;8302:14;8327;8358:6;8344:4;:11;;;:20;;;;:::i;:::-;8327:37;;8415:6;8409:13;8399:23;;8508:2;8503:3;8500:11;8497:94;;;8570:3;8566:2;8562:12;8557:3;8553:22;8545:6;8541:35;8531:45;;8497:94;-1:-1:-1;8621:6:0;8071:564;-1:-1:-1;;;;8071:564:0:o;17611:117::-;17667:12;17699:21;:3;:8;;;17708:1;17699:11;;;;;;;;:::i;4894:534::-;4954:16;4991:12;4998:4;4991:6;:12::i;:::-;4983:21;;;;;;5017:13;5033:14;5042:4;5033:8;:14::i;:::-;5017:30;;5058:23;5098:5;-1:-1:-1;;;;;5084:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;5084:20:0;;;;;;;;;;;;;;;;5058:46;;5117:14;5148:27;5163:4;:11;;;5148:14;:27::i;:::-;5134:4;:11;;;:41;;;;:::i;:::-;5117:58;-1:-1:-1;5186:15:0;;5212:183;5236:5;5232:1;:9;5212:183;;;5273:19;5285:6;5273:11;:19::i;:::-;5263:29;;5319:24;;;;;;;;5327:7;5319:24;;;;5336:6;5319:24;;;5307:6;5314:1;5307:9;;;;;;;;:::i;:::-;;;;;;;;;;:36;5367:16;5376:7;5367:6;:16;:::i;:::-;5358:25;-1:-1:-1;5243:3:0;;;;:::i;:::-;;;;5212:183;;;-1:-1:-1;5414:6:0;;4894:534;-1:-1:-1;;;;;4894:534:0:o;8992:454::-;9086:8;;9053:12;;9078:21;;;;;;9112:14;9129:27;9144:4;:11;;;9129:14;:27::i;:::-;9112:44;;9167:11;9192:6;9181:4;:8;;;:17;;;;:::i;:::-;9167:31;;9224:19;9256:3;-1:-1:-1;;;;;9246:14:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9246:14:0;;9224:36;;9273:15;9344:6;9338:4;9334:17;9323:28;;9374:40;9393:6;9379:4;:11;;;:20;;;;:::i;:::-;9401:7;9410:3;9374:4;:40::i;22830:187::-;22911:6;22944:5;22948:1;22944;:5;:::i;:::-;:10;:64;;23004:4;22990:3;22994:5;22998:1;22994;:5;:::i;:::-;22990:10;;;;;;;;:::i;:::-;;;;;22984:24;;;22990:10;;22984:24;:::i;:::-;22944:64;;;22977:4;22963:3;22967:5;22971:1;22967;:5;:::i;:::-;22963:10;;;;;;;;:::i;:::-;;;;;22957:24;;;22963:10;;22957:24;:::i;:::-;22937:72;;;22830:187;-1:-1:-1;;;22830:187:0:o;5535:332::-;5616:8;;5595:4;;5616:13;;5612:31;;-1:-1:-1;5638:5:0;;5535:332;-1:-1:-1;5535:332:0:o;5612:31::-;5695:11;;;;5758:13;;5656:11;5750:22;;2610:4;5799:24;;5795:42;;;-1:-1:-1;5832:5:0;;5535:332;-1:-1:-1;;;5535:332:0:o;5795:42::-;-1:-1:-1;5855:4:0;;5535:332;-1:-1:-1;;;5535:332:0:o;13547:761::-;13663:3;13670:1;13663:8;13659:21;;13547:761;;;:::o;13659:21::-;13098:2;13747:16;;13740:201;;13839:10;;13826:24;;13881:16;13098:2;13845:3;13881:16;:::i;:::-;;-1:-1:-1;13912:17:0;13098:2;13912:17;;:::i;:::-;;-1:-1:-1;13765:16:0;13098:2;13765:16;;:::i;:::-;;;13740:201;;;14034:12;14074:1;14055:15;14067:3;13098:2;14055:15;:::i;:::-;14049:22;;:3;:22;:::i;:::-;:26;;;;:::i;:::-;14129:10;;14201:11;;14197:22;;14141:9;;14125:26;14268:21;;;;14255:35;;;-1:-1:-1;;13547:761:0:o;7858:205::-;7990:8;;7921:7;;8002:2;7990:14;7982:23;;;;;;8041:12;8048:4;8041:6;:12::i;7152:348::-;7216:12;7241:19;7273:4;:8;;;-1:-1:-1;;;;;7263:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7263:19:0;;7241:41;;7297:6;:13;7314:1;7297:18;7293:37;;7324:6;7152:348;-1:-1:-1;;7152:348:0:o;7293:37::-;7343:11;7406:6;7400:4;7396:17;7389:24;;7436:32;7441:4;:11;;;7454:3;7459:4;:8;;;7436:4;:32::i;:::-;-1:-1:-1;7486:6:0;7152:348;-1:-1:-1;;7152:348:0:o;8675:309::-;8797:8;;8741:7;;8809:2;8797:14;8789:23;;;;;;8825:14;8850;8867:4;:11;;;8881:1;8867:15;;;;:::i;:::-;8927:13;;8675:309;-1:-1:-1;;;;8675:309:0:o;21006:978::-;21159:7;;;21419:35;21435:18;21419:15;:35::i;:::-;21392:62;;21465:23;21501:11;:18;-1:-1:-1;;;;;21491:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21491:29:0;-1:-1:-1;21465:55:0;-1:-1:-1;21647:7:0;21630:170;21670:18;;21660:28;;:7;:28;:::i;:::-;21656:1;:32;21630:170;;;21710:17;21730:4;21735:1;21730:7;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;21730:7:0;;-1:-1:-1;21730:7:0;21752:10;21763:11;21767:7;21763:1;:11;:::i;:::-;21752:23;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;21752:36:0;;;;;;;;;21695:105;21690:3;;;;;:::i;:::-;;;;21630:170;;;;21852:10;21842:21;;;;;;21826:11;21816:22;;;;;;:47;21812:144;;21886:11;:18;21880:24;;21812:144;;;21943:1;21937:7;;21812:144;-1:-1:-1;21973:3:0;;21006:978;-1:-1:-1;;;;;21006:978:0:o;1211:1046::-;1369:4;1409:2;1394:5;:12;:17;;;;:::i;:::-;:22;1386:55;;;;-1:-1:-1;;;1386:55:0;;20743:2:1;1386:55:0;;;20725:21:1;20782:2;20762:18;;;20755:30;-1:-1:-1;;;20801:18:1;;;20794:50;20861:18;;1386:55:0;20541:344:1;1386:55:0;1452:19;1489:2;1474:5;:12;:17;;;;:::i;:::-;1452:39;-1:-1:-1;1646:14:0;1452:39;1646:1;:14;:::i;:::-;1638:5;:22;1630:56;;;;-1:-1:-1;;;1630:56:0;;21092:2:1;1630:56:0;;;21074:21:1;21131:2;21111:18;;;21104:30;-1:-1:-1;;;21150:18:1;;;21143:51;21211:18;;1630:56:0;20890:345:1;1630:56:0;1699:20;1753:4;1785:2;1768:440;1794:5;:12;1789:1;:17;1768:440;;1882:13;;;1876:20;;-1:-1:-1;1931:9:0;1939:1;1931:5;:9;:::i;:::-;1944:1;1931:14;1927:236;;1991:44;;;;;;21397:19:1;;;21432:12;;;21425:28;;;21469:12;;1991:44:0;;;;;;;;;;;;1981:55;;;;;;1966:70;;1927:236;;;2102:44;;;;;;21397:19:1;;;21432:12;;;21425:28;;;21469:12;;2102:44:0;;;;;;;;;;;;2092:55;;;;;;2077:70;;1927:236;2187:9;2195:1;2187:5;:9;:::i;:::-;2179:17;-1:-1:-1;1808:7:0;1813:2;1808:7;;:::i;:::-;;;1768:440;;;-1:-1:-1;2225:24:0;;;;1211:1046;-1:-1:-1;;;;;;1211:1046:0:o;11364:533::-;11511:13;;11426:7;;11503:22;;2519:4;11552:26;;11548:341;;;-1:-1:-1;11587:1:0;;11364:533;-1:-1:-1;;11364:533:0:o;11548:341::-;2565:4;11608:25;;;:83;;-1:-1:-1;2610:4:0;11638:25;;;;;:52;;-1:-1:-1;2654:4:0;11667:23;;11638:52;11604:285;;;-1:-1:-1;11700:1:0;;11364:533;-1:-1:-1;;11364:533:0:o;11604:285::-;2610:4;11721:24;;11717:172;;;11807:21;11827:1;2565:4;11807:21;:::i;:::-;11798:31;;;;:5;:31;:::i;:::-;:35;;11832:1;11798:35;:::i;:::-;11791:42;11364:533;-1:-1:-1;;;11364:533:0:o;11717:172::-;11865:19;11883:1;2654:4;11865:19;:::i;9561:436::-;9646:8;;9622:7;;9646:13;;9642:27;;-1:-1:-1;9668:1:0;;9561:436;-1:-1:-1;9561:436:0:o;9642:27::-;9682:13;9710:15;9742:27;9757:4;:11;;;9742:14;:27::i;:::-;9728:4;:11;;;:41;;;;:::i;:::-;9710:59;;9780:14;9811:4;:8;;;9797:4;:11;;;:22;;;;:::i;:::-;9780:39;;9830:135;9847:6;9837:7;:16;9830:135;;;9890:20;9902:7;9890:11;:20::i;:::-;9880:30;;:7;:30;:::i;:::-;9870:40;-1:-1:-1;9946:7:0;;;;:::i;:::-;;;;9830:135;;;-1:-1:-1;9984:5:0;;9561:436;-1:-1:-1;;;9561:436:0:o;10049:1260::-;10219:13;;10108:7;;;;10211:22;;2519:4;10260:26;;10256:1019;;;10298:1;10288:11;;10256:1019;;;2565:4;10319:25;;10315:960;;;10356:26;2519:4;10356:5;:26;:::i;:::-;:30;;10385:1;10356:30;:::i;:::-;10346:40;;10315:960;;;2610:4;10406:24;;10402:873;;;10501:4;10494:5;10490:16;10581:1;10573:6;10569:14;10559:24;;10721:7;10717:2;10713:16;10708:3;10704:26;10695:6;10689:13;10685:46;10819:1;10810:7;10806:15;10797:7;10793:29;10782:40;;;;10402:873;;;2654:4;10858:23;;10854:421;;;10908:24;2610:4;10908:5;:24;:::i;10854:421::-;11068:1;11056:14;;;;11109:13;11137:2;11133:16;;;11023:4;11133:16;11128:3;11124:26;11105:46;;11220:29;;;-1:-1:-1;;11220:29:0;;11294:7;-1:-1:-1;;10049:1260:0:o;12062:796::-;12178:3;12185:1;12178:8;12174:21;;12062:796;;;:::o;12174:21::-;2692:2;12262:16;;12255:201;;12354:10;;12341:24;;12396:16;2692:2;12360:3;12396:16;:::i;:::-;;-1:-1:-1;12427:17:0;2692:2;12427:17;;:::i;:::-;;-1:-1:-1;12280:16:0;2692:2;12280:16;;:::i;:::-;;;12255:201;;;12472:3;12479:1;12472:8;12468:21;;12062:796;;;:::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:127;558:10;553:3;549:20;546:1;539:31;589:4;586:1;579:15;613:4;610:1;603:15;629:275;700:2;694:9;765:2;746:13;;-1:-1:-1;;742:27:1;730:40;;-1:-1:-1;;;;;785:34:1;;821:22;;;782:62;779:88;;;847:18;;:::i;:::-;883:2;876:22;629:275;;-1:-1:-1;629:275:1:o;909:712::-;963:5;1016:3;1009:4;1001:6;997:17;993:27;983:55;;1034:1;1031;1024:12;983:55;1070:6;1057:20;1096:4;-1:-1:-1;;;;;1115:2:1;1112:26;1109:52;;;1141:18;;:::i;:::-;1187:2;1184:1;1180:10;1210:28;1234:2;1230;1226:11;1210:28;:::i;:::-;1272:15;;;1342;;;1338:24;;;1303:12;;;;1374:15;;;1371:35;;;1402:1;1399;1392:12;1371:35;1438:2;1430:6;1426:15;1415:26;;1450:142;1466:6;1461:3;1458:15;1450:142;;;1532:17;;1520:30;;1483:12;;;;1570;;;;1450:142;;;1610:5;909:712;-1:-1:-1;;;;;;;909:712:1:o;1626:821::-;1778:6;1786;1794;1847:2;1835:9;1826:7;1822:23;1818:32;1815:52;;;1863:1;1860;1853:12;1815:52;1903:9;1890:23;-1:-1:-1;;;;;1973:2:1;1965:6;1962:14;1959:34;;;1989:1;1986;1979:12;1959:34;2012:61;2065:7;2056:6;2045:9;2041:22;2012:61;:::i;:::-;2002:71;;2126:2;2115:9;2111:18;2098:32;2082:48;;2155:2;2145:8;2142:16;2139:36;;;2171:1;2168;2161:12;2139:36;2194:63;2249:7;2238:8;2227:9;2223:24;2194:63;:::i;:::-;2184:73;;2310:2;2299:9;2295:18;2282:32;2266:48;;2339:2;2329:8;2326:16;2323:36;;;2355:1;2352;2345:12;2323:36;;2378:63;2433:7;2422:8;2411:9;2407:24;2378:63;:::i;:::-;2368:73;;;1626:821;;;;;:::o;2634:131::-;-1:-1:-1;;;;;2709:31:1;;2699:42;;2689:70;;2755:1;2752;2745:12;2770:936;2867:6;2875;2883;2891;2899;2952:3;2940:9;2931:7;2927:23;2923:33;2920:53;;;2969:1;2966;2959:12;2920:53;3008:9;2995:23;3027:31;3052:5;3027:31;:::i;:::-;3077:5;-1:-1:-1;3134:2:1;3119:18;;3106:32;3147:33;3106:32;3147:33;:::i;:::-;3199:7;-1:-1:-1;3253:2:1;3238:18;;3225:32;;-1:-1:-1;3308:2:1;3293:18;;3280:32;-1:-1:-1;;;;;3361:14:1;;;3358:34;;;3388:1;3385;3378:12;3358:34;3426:6;3415:9;3411:22;3401:32;;3471:7;3464:4;3460:2;3456:13;3452:27;3442:55;;3493:1;3490;3483:12;3442:55;3533:2;3520:16;3559:2;3551:6;3548:14;3545:34;;;3575:1;3572;3565:12;3545:34;3620:7;3615:2;3606:6;3602:2;3598:15;3594:24;3591:37;3588:57;;;3641:1;3638;3631:12;3588:57;2770:936;;;;-1:-1:-1;2770:936:1;;-1:-1:-1;3672:2:1;3664:11;;3694:6;2770:936;-1:-1:-1;;;2770:936:1:o;3918:273::-;3974:6;4027:2;4015:9;4006:7;4002:23;3998:32;3995:52;;;4043:1;4040;4033:12;3995:52;4082:9;4069:23;4135:5;4128:13;4121:21;4114:5;4111:32;4101:60;;4157:1;4154;4147:12;4196:247;4255:6;4308:2;4296:9;4287:7;4283:23;4279:32;4276:52;;;4324:1;4321;4314:12;4276:52;4363:9;4350:23;4382:31;4407:5;4382:31;:::i;4772:180::-;4831:6;4884:2;4872:9;4863:7;4859:23;4855:32;4852:52;;;4900:1;4897;4890:12;4852:52;-1:-1:-1;4923:23:1;;4772:180;-1:-1:-1;4772:180:1:o;5547:435::-;5600:3;5638:5;5632:12;5665:6;5660:3;5653:19;5691:4;5720:2;5715:3;5711:12;5704:19;;5757:2;5750:5;5746:14;5778:1;5788:169;5802:6;5799:1;5796:13;5788:169;;;5863:13;;5851:26;;5897:12;;;;5932:15;;;;5824:1;5817:9;5788:169;;;-1:-1:-1;5973:3:1;;5547:435;-1:-1:-1;;;;;5547:435:1:o;5987:669::-;6322:2;6311:9;6304:21;6285:4;6348:56;6400:2;6389:9;6385:18;6377:6;6348:56;:::i;:::-;6452:9;6444:6;6440:22;6435:2;6424:9;6420:18;6413:50;6486:44;6523:6;6515;6486:44;:::i;:::-;6472:58;;6578:9;6570:6;6566:22;6561:2;6550:9;6546:18;6539:50;6606:44;6643:6;6635;6606:44;:::i;:::-;6598:52;5987:669;-1:-1:-1;;;;;;5987:669:1:o;6661:348::-;6745:6;6798:2;6786:9;6777:7;6773:23;6769:32;6766:52;;;6814:1;6811;6804:12;6766:52;6854:9;6841:23;-1:-1:-1;;;;;6879:6:1;6876:30;6873:50;;;6919:1;6916;6909:12;6873:50;6942:61;6995:7;6986:6;6975:9;6971:22;6942:61;:::i;7457:388::-;7525:6;7533;7586:2;7574:9;7565:7;7561:23;7557:32;7554:52;;;7602:1;7599;7592:12;7554:52;7641:9;7628:23;7660:31;7685:5;7660:31;:::i;:::-;7710:5;-1:-1:-1;7767:2:1;7752:18;;7739:32;7780:33;7739:32;7780:33;:::i;:::-;7832:7;7822:17;;;7457:388;;;;;:::o;8081:186::-;8129:4;-1:-1:-1;;;;;8154:6:1;8151:30;8148:56;;;8184:18;;:::i;:::-;-1:-1:-1;8250:2:1;8229:15;-1:-1:-1;;8225:29:1;8256:4;8221:40;;8081:186::o;8272:671::-;8340:6;8393:2;8381:9;8372:7;8368:23;8364:32;8361:52;;;8409:1;8406;8399:12;8361:52;8449:9;8436:23;-1:-1:-1;;;;;8474:6:1;8471:30;8468:50;;;8514:1;8511;8504:12;8468:50;8537:22;;8590:4;8582:13;;8578:27;-1:-1:-1;8568:55:1;;8619:1;8616;8609:12;8568:55;8655:2;8642:16;8680:48;8696:31;8724:2;8696:31;:::i;:::-;8680:48;:::i;:::-;8751:2;8744:5;8737:17;8791:7;8786:2;8781;8777;8773:11;8769:20;8766:33;8763:53;;;8812:1;8809;8802:12;8763:53;8867:2;8862;8858;8854:11;8849:2;8842:5;8838:14;8825:45;8911:1;8890:14;;;8906:2;8886:23;8879:34;;;;8894:5;8272:671;-1:-1:-1;;;;8272:671:1:o;8948:352::-;9150:2;9132:21;;;9189:2;9169:18;;;9162:30;9228;9223:2;9208:18;;9201:58;9291:2;9276:18;;8948:352::o;9652:375::-;-1:-1:-1;;;;;9910:15:1;;;9892:34;;9962:15;;;;9957:2;9942:18;;9935:43;10009:2;9994:18;;9987:34;;;;9842:2;9827:18;;9652:375::o;10613:349::-;10815:2;10797:21;;;10854:2;10834:18;;;10827:30;10893:27;10888:2;10873:18;;10866:55;10953:2;10938:18;;10613:349::o;10967:345::-;11169:2;11151:21;;;11208:2;11188:18;;;11181:30;-1:-1:-1;;;11242:2:1;11227:18;;11220:51;11303:2;11288:18;;10967:345::o;11317:127::-;11378:10;11373:3;11369:20;11366:1;11359:31;11409:4;11406:1;11399:15;11433:4;11430:1;11423:15;11449:127;11510:10;11505:3;11501:20;11498:1;11491:31;11541:4;11538:1;11531:15;11565:4;11562:1;11555:15;11581:135;11620:3;11641:17;;;11638:43;;11661:18;;:::i;:::-;-1:-1:-1;11708:1:1;11697:13;;11581:135::o;13255:125::-;13295:4;13323:1;13320;13317:8;13314:34;;;13328:18;;:::i;:::-;-1:-1:-1;13365:9:1;;13255:125::o;13385:127::-;13446:10;13441:3;13437:20;13434:1;13427:31;13477:4;13474:1;13467:15;13501:4;13498:1;13491:15;13517:258;13589:1;13599:113;13613:6;13610:1;13607:13;13599:113;;;13689:11;;;13683:18;13670:11;;;13663:39;13635:2;13628:10;13599:113;;;13730:6;13727:1;13724:13;13721:48;;;-1:-1:-1;;13765:1:1;13747:16;;13740:27;13517:258::o;13780:478::-;13984:1;13980;13975:3;13971:11;13967:19;13959:6;13955:32;13944:9;13937:51;14024:2;14019;14008:9;14004:18;13997:30;13918:4;14056:6;14050:13;14099:6;14094:2;14083:9;14079:18;14072:34;14115:66;14174:6;14169:2;14158:9;14154:18;14149:2;14141:6;14137:15;14115:66;:::i;:::-;14242:2;14221:15;-1:-1:-1;;14217:29:1;14202:45;;;;14249:2;14198:54;;13780:478;-1:-1:-1;;;13780:478:1:o;14263:431::-;14478:6;14473:3;14466:19;14448:3;14514:6;14508:13;14530:60;14583:6;14578:2;14573:3;14569:12;14564:2;14556:6;14552:15;14530:60;:::i;:::-;14649:2;14609:16;;14641:11;;;14634:27;;;;14685:2;14677:11;;14263:431;-1:-1:-1;;;14263:431:1:o;16274:634::-;16353:6;16406:2;16394:9;16385:7;16381:23;16377:32;16374:52;;;16422:1;16419;16412:12;16374:52;16455:9;16449:16;-1:-1:-1;;;;;16480:6:1;16477:30;16474:50;;;16520:1;16517;16510:12;16474:50;16543:22;;16596:4;16588:13;;16584:27;-1:-1:-1;16574:55:1;;16625:1;16622;16615:12;16574:55;16654:2;16648:9;16679:48;16695:31;16723:2;16695:31;:::i;16679:48::-;16750:2;16743:5;16736:17;16790:7;16785:2;16780;16776;16772:11;16768:20;16765:33;16762:53;;;16811:1;16808;16801:12;16762:53;16824:54;16875:2;16870;16863:5;16859:14;16854:2;16850;16846:11;16824:54;:::i;:::-;16897:5;16274:634;-1:-1:-1;;;;;16274:634:1:o;16913:168::-;16953:7;17019:1;17015;17011:6;17007:14;17004:1;17001:21;16996:1;16989:9;16982:17;16978:45;16975:71;;;17026:18;;:::i;:::-;-1:-1:-1;17066:9:1;;16913:168::o;17086:128::-;17126:3;17157:1;17153:6;17150:1;17147:13;17144:39;;;17163:18;;:::i;:::-;-1:-1:-1;17199:9:1;;17086:128::o;17219:497::-;17325:6;17333;17341;17349;17357;17410:3;17398:9;17389:7;17385:23;17381:33;17378:53;;;17427:1;17424;17417:12;17378:53;17456:9;17450:16;17440:26;;17506:2;17495:9;17491:18;17485:25;17475:35;;17550:2;17539:9;17535:18;17529:25;17519:35;;17594:2;17583:9;17579:18;17573:25;17563:35;;17641:3;17630:9;17626:19;17620:26;17655:31;17680:5;17655:31;:::i;:::-;17705:5;17695:15;;;17219:497;;;;;;;;:::o;18461:127::-;18522:10;18517:3;18513:20;18510:1;18503:31;18553:4;18550:1;18543:15;18577:4;18574:1;18567:15;18593:112;18625:1;18651;18641:35;;18656:18;;:::i;:::-;-1:-1:-1;18690:9:1;;18593:112::o;18710:120::-;18750:1;18776;18766:35;;18781:18;;:::i;:::-;-1:-1:-1;18815:9:1;;18710:120::o;18835:157::-;18865:1;18899:4;18896:1;18892:12;18923:3;18913:37;;18930:18;;:::i;:::-;18982:3;18975:4;18972:1;18968:12;18964:22;18959:27;;;18835:157;;;;:::o;18997:165::-;19035:1;19069:4;19066:1;19062:12;19093:3;19083:37;;19100:18;;:::i;:::-;19152:3;19145:4;19142:1;19138:12;19134:22;19129:27;;;18997:165;;;;:::o;19167:422::-;19256:1;19299:5;19256:1;19313:270;19334:7;19324:8;19321:21;19313:270;;;19393:4;19389:1;19385:6;19381:17;19375:4;19372:27;19369:53;;;19402:18;;:::i;:::-;19452:7;19442:8;19438:22;19435:55;;;19472:16;;;;19435:55;19551:22;;;;19511:15;;;;19313:270;;;19317:3;19167:422;;;;;:::o;19594:806::-;19643:5;19673:8;19663:80;;-1:-1:-1;19714:1:1;19728:5;;19663:80;19762:4;19752:76;;-1:-1:-1;19799:1:1;19813:5;;19752:76;19844:4;19862:1;19857:59;;;;19930:1;19925:130;;;;19837:218;;19857:59;19887:1;19878:10;;19901:5;;;19925:130;19962:3;19952:8;19949:17;19946:43;;;19969:18;;:::i;:::-;-1:-1:-1;;20025:1:1;20011:16;;20040:5;;19837:218;;20139:2;20129:8;20126:16;20120:3;20114:4;20111:13;20107:36;20101:2;20091:8;20088:16;20083:2;20077:4;20074:12;20070:35;20067:77;20064:159;;;-1:-1:-1;20176:19:1;;;20208:5;;20064:159;20255:34;20280:8;20274:4;20255:34;:::i;:::-;20325:6;20321:1;20317:6;20313:19;20304:7;20301:32;20298:58;;;20336:18;;:::i;:::-;20374:20;;19594:806;-1:-1:-1;;;19594:806:1:o;20405:131::-;20465:5;20494:36;20521:8;20515:4;20494:36;:::i;21492:195::-;21530:4;21567;21564:1;21560:12;21599:4;21596:1;21592:12;21624:3;21619;21616:12;21613:38;;;21631:18;;:::i;:::-;21668:13;;;21492:195;-1:-1:-1;;;21492:195:1:o
Swarm Source
ipfs://8e0052f2db19d7a445185f864f84206c0a7108e7286ea9dacdc8eeafcaef33fd
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.