| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Base64} from "@openzeppelin/contracts/utils/Base64.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
contract H2PositionNFT is ERC721, Ownable {
using Strings for uint256;
enum State { Open, Closing, Closed }
struct Position {
uint128 sizeUsdE18;
uint128 collateralUsdE18;
uint128 openPxE18;
uint128 closePxE18;
int128 pnlUsdE18;
uint64 openedAt;
uint64 closedAt;
bool sideLong;
State state;
uint8 leverage;
uint8 assetId;
bytes32 externalKey;
}
address public controller;
uint256 public nextId = 1;
mapping(uint256 => Position) public positions;
event ControllerSet(address indexed controller);
event PositionMinted(uint256 indexed tokenId, address indexed winner, uint128 sizeUsdE18, uint128 openPxE18, bool sideLong, uint8 leverage, uint8 assetId);
event PositionClosing(uint256 indexed tokenId);
event PositionClosed(uint256 indexed tokenId, uint128 closePxE18, int128 pnlUsdE18);
modifier onlyController() {
require(msg.sender == controller, "H2: not controller");
_;
}
constructor(address initialOwner, string memory name_, string memory symbol_)
ERC721(name_, symbol_)
Ownable(initialOwner)
{}
function setController(address c) external onlyOwner {
controller = c;
emit ControllerSet(c);
}
function mint(
address to,
uint128 sizeUsdE18,
uint128 collateralUsdE18,
uint128 openPxE18,
bool sideLong,
uint8 leverage,
uint8 assetId,
bytes32 externalKey
) external onlyController returns (uint256 tokenId) {
tokenId = nextId++;
positions[tokenId] = Position({
sizeUsdE18: sizeUsdE18,
collateralUsdE18: collateralUsdE18,
openPxE18: openPxE18,
closePxE18: 0,
pnlUsdE18: 0,
openedAt: uint64(block.timestamp),
closedAt: 0,
sideLong: sideLong,
state: State.Open,
leverage: leverage,
assetId: assetId,
externalKey: externalKey
});
_safeMint(to, tokenId);
emit PositionMinted(tokenId, to, sizeUsdE18, openPxE18, sideLong, leverage, assetId);
}
// Per-asset display symbol (assetId → "ETH"/"SUI"/…), owner-set. Defaults to
// "ETH" for id 0 / unset so existing single-asset behaviour is unchanged.
mapping(uint8 => string) public assetSymbol;
function setAssetSymbol(uint8 id, string calldata s) external onlyOwner {
assetSymbol[id] = s;
}
function _assetName(uint8 id) internal view returns (string memory) {
string memory s = assetSymbol[id];
return bytes(s).length == 0 ? "ETH" : s;
}
function markClosing(uint256 tokenId) external onlyController {
Position storage p = positions[tokenId];
require(p.state == State.Open, "H2: not open");
p.state = State.Closing;
emit PositionClosing(tokenId);
}
function recordClose(uint256 tokenId, uint128 closePxE18, int128 pnlUsdE18)
external
onlyController
{
Position storage p = positions[tokenId];
require(p.state == State.Open || p.state == State.Closing, "H2: not open/closing");
p.closePxE18 = closePxE18;
p.pnlUsdE18 = pnlUsdE18;
p.closedAt = uint64(block.timestamp);
p.state = State.Closed;
emit PositionClosed(tokenId, closePxE18, pnlUsdE18);
}
function _update(address to, uint256 tokenId, address auth) internal override returns (address) {
address from = _ownerOf(tokenId);
if (from != address(0) && to != address(0)) {
require(positions[tokenId].state != State.Closing, "H2: NFT locked during close");
}
return super._update(to, tokenId, auth);
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
_requireOwned(tokenId);
Position memory p = positions[tokenId];
string memory side = p.sideLong ? "LONG" : "SHORT";
string memory state = p.state == State.Open ? "OPEN" : "CLOSED";
string memory image = Base64.encode(bytes(_svg(tokenId, p, side, state)));
bytes memory json = abi.encodePacked(
_jsonHeader(tokenId, image),
_jsonAttrs(p, side, state)
);
return string(abi.encodePacked(
"data:application/json;base64,",
Base64.encode(json)
));
}
function _jsonHeader(uint256 tokenId, string memory image) internal view returns (bytes memory) {
return abi.encodePacked(
'{"name":"', name(), ' #', tokenId.toString(),
'","description":"A live lottery position. ',
'Each slot is opened on a holder\\u2019s behalf by the engine. ',
'The NFT tracks the lifetime of that slot.",',
'"image":"data:image/svg+xml;base64,', image, '",'
);
}
function _jsonAttrs(Position memory p, string memory side, string memory state) internal view returns (bytes memory) {
// Asset trait built in its own encodePacked (keeps _assetName's branch +
// string out of the big group below — that combo blew the Yul stack).
bytes memory pre = abi.encodePacked('"attributes":[', '{"trait_type":"Asset","value":"', _assetName(p.assetId), '"},');
bytes memory a = abi.encodePacked(
'{"trait_type":"Side","value":"', side, '"},',
'{"trait_type":"State","value":"', state, '"},',
'{"trait_type":"Leverage","value":"', uint256(p.leverage).toString(), 'x"},',
'{"trait_type":"Slot Size (USD)","value":"', _fmtUsd(p.sizeUsdE18), '"},',
'{"trait_type":"Collateral (USD)","value":"', _fmtUsd(p.collateralUsdE18), '"},',
'{"trait_type":"Entry Mark","value":"', _fmtUsd(p.openPxE18), '"},'
);
bytes memory b = abi.encodePacked(
'{"trait_type":"Exit Mark","value":"', _fmtUsd(p.closePxE18), '"},',
'{"trait_type":"PnL (USD)","value":"', _fmtPayout(p.sizeUsdE18, p.leverage, p.pnlUsdE18), '"},',
'{"trait_type":"Opened","display_type":"date","value":', uint256(p.openedAt).toString(), '},',
'{"trait_type":"Closed","display_type":"date","value":', uint256(p.closedAt).toString(), '}',
']}'
);
return abi.encodePacked(pre, a, b);
}
function _svg(uint256 tokenId, Position memory p, string memory side, string memory state)
internal
pure
returns (string memory)
{
string memory head = _svgHead(tokenId);
string memory body = _svgBody(p, side);
string memory tail = _svgTail(p, state);
return string(abi.encodePacked(head, body, tail));
}
function _svgHead(uint256 tokenId) internal pure returns (string memory) {
return string(abi.encodePacked(
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400">',
'<defs><linearGradient id="g" x1="0" x2="0" y1="0" y2="1">',
'<stop offset="0%" stop-color="#06140a"/>',
'<stop offset="100%" stop-color="#030a06"/>',
'</linearGradient></defs>',
'<rect width="400" height="400" fill="url(#g)"/>',
'<text x="20" y="44" font-family="monospace" font-size="28" fill="#CBFB08">H\xc2\xb2</text>',
'<text x="20" y="68" font-family="monospace" font-size="11" fill="#6b8a76">HOODSQUARED</text>',
'<text x="380" y="44" font-family="monospace" font-size="14" fill="#d6ffe0" text-anchor="end">#', tokenId.toString(), '</text>'
));
}
function _svgBody(Position memory p, string memory side) internal pure returns (string memory) {
return string(abi.encodePacked(
'<text x="20" y="140" font-family="monospace" font-size="18" fill="#d6ffe0">SIDE</text>',
'<text x="380" y="140" font-family="monospace" font-size="18" fill="#CBFB08" text-anchor="end">', side, '</text>',
'<text x="20" y="170" font-family="monospace" font-size="18" fill="#d6ffe0">LEVERAGE</text>',
'<text x="380" y="170" font-family="monospace" font-size="18" fill="#ffd166" text-anchor="end">', uint256(p.leverage).toString(), 'x</text>',
'<text x="20" y="200" font-family="monospace" font-size="18" fill="#d6ffe0">SIZE</text>',
'<text x="380" y="200" font-family="monospace" font-size="18" fill="#CBFB08" text-anchor="end">$', _fmtUsd(p.sizeUsdE18), '</text>',
'<text x="20" y="240" font-family="monospace" font-size="18" fill="#d6ffe0">ENTRY</text>',
'<text x="380" y="240" font-family="monospace" font-size="18" fill="#CBFB08" text-anchor="end">', _fmtUsd(p.openPxE18), '</text>'
));
}
function _svgTail(Position memory p, string memory state) internal pure returns (string memory) {
string memory pnlColor = p.pnlUsdE18 >= 0 ? "#34d399" : "#f87171";
return string(abi.encodePacked(
'<text x="20" y="280" font-family="monospace" font-size="18" fill="#d6ffe0">PNL</text>',
'<text x="380" y="280" font-family="monospace" font-size="18" fill="', pnlColor, '" text-anchor="end">', _fmtPayout(p.sizeUsdE18, p.leverage, p.pnlUsdE18), '</text>',
'<text x="20" y="360" font-family="monospace" font-size="11" fill="#6b8a76">STATE</text>',
'<text x="380" y="360" font-family="monospace" font-size="11" fill="#d6ffe0" text-anchor="end">', state, '</text>',
'</svg>'
));
}
function _fmtUsd(uint128 vE18) internal pure returns (string memory) {
uint256 whole = uint256(vE18) / 1e18;
uint256 frac = (uint256(vE18) % 1e18) / 1e16;
return string(abi.encodePacked(
whole.toString(),
".",
frac < 10 ? "0" : "",
frac.toString()
));
}
function _fmtSignedUsd(int128 vE18) internal pure returns (string memory) {
if (vE18 == 0) return "0.00";
if (vE18 > 0) return string(abi.encodePacked("+", _fmtUsd(uint128(vE18))));
return string(abi.encodePacked("-", _fmtUsd(uint128(-vE18))));
}
// The FULL amount the winner receives = collateral + pnl (what they actually
// get on close, not just the profit slice). USD collateral = notional size /
// leverage (the `collateralUsdE18` field is WETH-denominated, so derive USD
// from sizeUsdE18 instead). Shown as the position's P&L.
function _fmtPayout(uint128 sizeUsdE18, uint8 leverage, int128 pnlE18) internal pure returns (string memory) {
int256 collat = leverage > 0 ? int256(uint256(sizeUsdE18) / leverage) : int256(0);
int256 v = collat + int256(pnlE18);
if (v >= 0) return string(abi.encodePacked("+", _fmtUsd(uint128(uint256(v)))));
return string(abi.encodePacked("-", _fmtUsd(uint128(uint256(-v)))));
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "initialOwner",
"type": "address",
"internalType": "address"
},
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "nonpayable"
},
{
"name": "ERC721IncorrectOwner",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InsufficientApproval",
"type": "error",
"inputs": [
{
"name": "operator",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC721InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InvalidOperator",
"type": "error",
"inputs": [
{
"name": "operator",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC721NonexistentToken",
"type": "error",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "approved",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ApprovalForAll",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "operator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "approved",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "ControllerSet",
"type": "event",
"inputs": [
{
"name": "controller",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PositionClosed",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "closePxE18",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "pnlUsdE18",
"type": "int128",
"indexed": false,
"internalType": "int128"
}
],
"anonymous": false
},
{
"name": "PositionClosing",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "PositionMinted",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "winner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "sizeUsdE18",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "openPxE18",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "sideLong",
"type": "bool",
"indexed": false,
"internalType": "bool"
},
{
"name": "leverage",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "assetId",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "assetSymbol",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "controller",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "getApproved",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "isApprovedForAll",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "operator",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "markClosing",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "mint",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "sizeUsdE18",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "collateralUsdE18",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "openPxE18",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "sideLong",
"type": "bool",
"internalType": "bool"
},
{
"name": "leverage",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "assetId",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "externalKey",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "nextId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "ownerOf",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "positions",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "sizeUsdE18",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "collateralUsdE18",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "openPxE18",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "closePxE18",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "pnlUsdE18",
"type": "int128",
"internalType": "int128"
},
{
"name": "openedAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "closedAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "sideLong",
"type": "bool",
"internalType": "bool"
},
{
"name": "state",
"type": "uint8",
"internalType": "enum H2PositionNFT.State"
},
{
"name": "leverage",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "assetId",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "externalKey",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "recordClose",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "closePxE18",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "pnlUsdE18",
"type": "int128",
"internalType": "int128"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "safeTransferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "safeTransferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setApprovalForAll",
"type": "function",
"inputs": [
{
"name": "operator",
"type": "address",
"internalType": "address"
},
{
"name": "approved",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setAssetSymbol",
"type": "function",
"inputs": [
{
"name": "id",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "s",
"type": "string",
"internalType": "string"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setController",
"type": "function",
"inputs": [
{
"name": "c",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "supportsInterface",
"type": "function",
"inputs": [
{
"name": "interfaceId",
"type": "bytes4",
"internalType": "bytes4"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "tokenURI",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
}
]0x60806040523461038a57613425803803806100198161038e565b92833981019060608183031261038a5780516001600160a01b038116919082900361038a5760208101516001600160401b03811161038a578361005d9183016103b3565b60408201519093906001600160401b03811161038a5761007d92016103b3565b82519091906001600160401b03811161029e575f54600181811c91168015610380575b602082101461028057601f811161031e575b506020601f82116001146102bd57819293945f926102b2575b50508160011b915f199060031b1c1916175f555b81516001600160401b03811161029e57600154600181811c91168015610294575b602082101461028057601f811161021d575b50602092601f82116001146101bc57928192935f926101b1575b50508160011b915f199060031b1c1916176001555b801561019e57600680546001600160a01b03198116831790915560405191906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3600160085561302090816104058239f35b631e4fbdf760e01b5f525f60045260245ffd5b015190505f8061012c565b601f1982169360015f52805f20915f5b86811061020557508360019596106101ed575b505050811b01600155610141565b01515f1960f88460031b161c191690555f80806101df565b919260206001819286850151815501940192016101cc565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f830160051c81019160208410610276575b601f0160051c01905b81811061026b5750610112565b5f815560010161025e565b9091508190610255565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610100565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100cb565b601f198216905f8052805f20915f5b818110610306575095836001959697106102ee575b505050811b015f556100df565b01515f1960f88460031b161c191690555f80806102e1565b9192602060018192868b0151815501940192016102cc565b5f80527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563601f830160051c81019160208410610376575b601f0160051c01905b81811061036b57506100b2565b5f815560010161035e565b9091508190610355565b90607f16906100a0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761029e57604052565b81601f8201121561038a578051906001600160401b03821161029e576103e2601f8301601f191660200161038e565b928284526020838301011161038a57815f9260208093018386015e830101529056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461243a5750806306fdde031461241f578063081812fc146123e3578063095ea7b3146122f957806323b872dd146122e257806342842e0e146122b357806361b8ce8c146122965780636352211e1461226657806363c76317146122345780636a8a02b1146120da5780636aec237014611b9457806370a0823114611b43578063715018a614611ae8578063755f71a814611a345780638da5cb5b14611a0c57806392eefe9b146119a657806395d89b41146118c857806399fbab88146117f75780639cccf2c41461168f578063a22cb465146115d2578063b88d4fde1461153c578063c87b56dd14610238578063e985e9c5146101e1578063f2fde38b1461015b5763f77c47911461012f575f80fd5b34610157575f366003190112610157576007546040516001600160a01b039091168152602090f35b5f80fd5b34610157576020366003190112610157576101746124c9565b61017c6129e7565b6001600160a01b031680156101ce57600680546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b631e4fbdf760e01b5f525f60045260245ffd5b34610157576040366003190112610157576101fa6124c9565b6102026124df565b9060018060a01b03165f52600560205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b3461015757602036600319011261015757600435610255816129b3565b50805f52600960205260405f209060405161026f81612577565b82546001600160801b038116825260801c602082015260018301546001600160801b038116604083015260801c6060820152600283015480600f0b608083015267ffffffffffffffff8160801c1660a083015260c01c60c0820152600383015460e082019060ff81161515825260ff8160081c169461010084019560038110156115025760049260ff918852818160101c1661012087015260181c1661014085015201546101608301525115155f14611516576040516103306040826125a8565b60048152634c4f4e4760e01b6020820152925b516003811015611502576114db5760405161035f6040826125a8565b600481526327a822a760e11b6020820152925b61037b83612c79565b604080517f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208083019182527f30302f737667222076696577426f783d223020302034303020343030223e0000938301939093527f3c646566733e3c6c696e6561724772616469656e742069643d2267222078313d605e8301527f2230222078323d2230222079313d2230222079323d2231223e00000000000000607e8301527f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d2223306097830152671b189a183091179f60c11b60b78301527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d2260bf830152691198199830981b11179f60b11b60df8301527f3c2f6c696e6561724772616469656e743e3c2f646566733e000000000000000060e98301527f3c726563742077696474683d2234303022206865696768743d223430302220666101018301526e34b6361e913ab9361411b39491179f60891b6101218301527f3c7465787420783d2232302220793d2234342220666f6e742d66616d696c793d6101308301527f226d6f6e6f73706163652220666f6e742d73697a653d223238222066696c6c3d610150830152731111a1a12321181c111f2461591e17ba32bc3a1f60611b6101708301527f3c7465787420783d2232302220793d2236382220666f6e742d66616d696c793d6101848301527f226d6f6e6f73706163652220666f6e742d73697a653d223131222066696c6c3d6101a48301527f2223366238613736223e484f4f44535155415245443c2f746578743e000000006101c48301527f3c7465787420783d223338302220793d2234342220666f6e742d66616d696c796101e08301527f3d226d6f6e6f73706163652220666f6e742d73697a653d223134222066696c6c6102008301527f3d22236436666665302220746578742d616e63686f723d22656e64223e230000610220830152835190939192839282910161023e84015e810161023e8101661e17ba32bc3a1f60c91b90520361023e016018198101825260070161068690826125a8565b61012084015160ff1661069890612c79565b8685516001600160801b03166106ad90612de6565b9160408701516001600160801b03166106c590612de6565b9260405193849160208301937f3c7465787420783d2232302220793d223134302220666f6e742d66616d696c798552604084015f80516020612fab8339815191529052751e9111b21b33333298111f29a4a2229e17ba32bc3a1f60511b6060850152607684017f3c7465787420783d223338302220793d223134302220666f6e742d66616d696c9052609684015f80516020612fcb833981519152905260b684017f6c3d22234342464230382220746578742d616e63686f723d22656e64223e0000905289518060208c0160d487015e661e17ba32bc3a1f60c91b60d4918601918201527f3c7465787420783d2232302220793d223137302220666f6e742d66616d696c7960db8201525f80516020612fab83398151915260fb8201527f3d2223643666666530223e4c455645524147453c2f746578743e00000000000061011b8201527f3c7465787420783d223338302220793d223137302220666f6e742d66616d696c6101358201525f80516020612fcb8339815191526101558201527f6c3d22236666643136362220746578742d616e63686f723d22656e64223e0000610175820152815191829060200161019383015e673c1e17ba32bc3a1f60c11b61019392909101918201527f3c7465787420783d2232302220793d223230302220666f6e742d66616d696c7961019b8201525f80516020612fab8339815191526101bb820152751e9111b21b33333298111f29a4ad229e17ba32bc3a1f60511b6101db8201527f3c7465787420783d223338302220793d223230302220666f6e742d66616d696c6101f18201525f80516020612fcb8339815191526102118201527f6c3d22234342464230382220746578742d616e63686f723d22656e64223e240061023182015281519160d4820191839160200190610250015e0160bf0160bd8101661e17ba32bc3a1f60c91b905260c481017f3c7465787420783d2232302220793d223234302220666f6e742d66616d696c79905260e481015f80516020612fab833981519152905261010481017f3d2223643666666530223e454e5452593c2f746578743e000000000000000000905261011b81017f3c7465787420783d223338302220793d223234302220666f6e742d66616d696c905261013b81015f80516020612fcb833981519152905261015b81017f6c3d22234342464230382220746578742d616e63686f723d22656e64223e000090528151602081930161017983015e0160bd0160bc8101661e17ba32bc3a1f60c91b90520360bc0160181981018452600701610a7790846125a8565b6080870151600f0b5f136114b357604051610a936040826125a8565b60078152662333346433393960c81b6020820152925b87516001600160801b031661012089015160ff1660808a0151600f0b90610acf92612eb0565b60405193849160208301967f3c7465787420783d2232302220793d223238302220666f6e742d66616d696c798852604084015f80516020612fab8339815191529052741e9111b21b33333298111f2827261e17ba32bc3a1f60591b6060850152607584017f3c7465787420783d223338302220793d223238302220666f6e742d66616d696c9052609584015f80516020612fcb833981519152905262361e9160e91b60b58501528051602081920160b886015e83017311103a32bc3a16b0b731b437b91e9132b732111f60611b60b88201528151602081930160cc83015e0160b80160148101661e17ba32bc3a1f60c91b9052601b81017f3c7465787420783d2232302220793d223336302220666f6e742d66616d696c799052603b81017f3d226d6f6e6f73706163652220666f6e742d73697a653d223131222066696c6c9052605b81017f3d2223366238613736223e53544154453c2f746578743e0000000000000000009052607281017f3c7465787420783d223338302220793d223336302220666f6e742d66616d696c9052609281017f793d226d6f6e6f73706163652220666f6e742d73697a653d223131222066696c905260b281017f6c3d22236436666665302220746578742d616e63686f723d22656e64223e000090528151602081930160d083015e0160140160bc8101661e17ba32bc3a1f60c91b905260c38101651e17b9bb339f60d11b90520360bc0160121981018452600d01610cf590846125a8565b604051958695518091602088015e85019060208201905f8252519283915e01602001905f8252518092825e015f815203601f1981018252610d3690826125a8565b610d3f90612b44565b92610d486125ca565b90610d5290612c79565b93604051948592683d913730b6b2911d1160b91b602085015280516020819201602986015e83016029810161202360f01b905281516020819301602b83015e7f222c226465736372697074696f6e223a2241206c697665206c6f747465727920602b92909101918201526903837b9b4ba34b7b717160b51b604b8201527f4561636820736c6f74206973206f70656e6564206f6e206120686f6c6465725c60558201527f75323031397320626568616c662062792074686520656e67696e652e2000000060758201527f546865204e465420747261636b7320746865206c69666574696d65206f66207460928201526a1a185d081cdb1bdd0b888b60aa1b60b28201527f22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261736560bd820152620d8d0b60ea1b60dd820152815191602982019183916020019060e0015e0160020161088b60f21b60b58201520360b501601d1981018452600201610ec090846125a8565b61014082015160ff165f52600a60205260405f20610edd9061267e565b80516114ad5750604051610ef26040826125a8565b600381526208aa8960eb1b6020820152905b604051928360208101936d2261747472696275746573223a5b60901b8552602e82017f7b2274726169745f74797065223a224173736574222c2276616c7565223a2200905280516020819201604d84015e810162089f4b60ea1b604d82015203604d01601c1981018552600301610f7b90856125a8565b61012081015160ff16610f8d90612c79565b9581516001600160801b0316610fa290612de6565b60208301516001600160801b0316610fb990612de6565b60408401516001600160801b0316610fd090612de6565b91604051998a9460208601977f7b2274726169745f74797065223a2253696465222c2276616c7565223a220000895280516020819201603e89015e860162089f4b60ea1b603e820152604181017f7b2274726169745f74797065223a225374617465222c2276616c7565223a2200905281516020819301606083015e01603e0162089f4b60ea1b6022820152602581017f7b2274726169745f74797065223a224c65766572616765222c2276616c7565229052611d1160f11b604582015281516020819301604783015e01602201631e089f4b60e21b6025820152602981017f7b2274726169745f74797065223a22536c6f742053697a65202855534429222c905268113b30b63ab2911d1160b91b604982015281516020819301605283015e0160250162089f4b60ea1b602d820152603081017f7b2274726169745f74797065223a22436f6c6c61746572616c2028555344292290526916113b30b63ab2911d1160b11b605082015281516020819301605a83015e01602d0162089f4b60ea1b602d820152603081017f7b2274726169745f74797065223a22456e747279204d61726b222c2276616c7590526332911d1160e11b605082015281516020819301605483015e01602d0162089f4b60ea1b602782015203602701601c19810187526003016111be90876125a8565b60608101516001600160801b03166111d590612de6565b9181516001600160801b031661012083015160ff166080840151600f0b906111fc92612eb0565b60a083015167ffffffffffffffff1661121490612c79565b9260c0015167ffffffffffffffff1661122c90612c79565b60405193849260208401967f7b2274726169745f74797065223a2245786974204d61726b222c2276616c7565885262111d1160e91b604086015280516020819201604387015e62089f4b60ea1b6043918601918201527f7b2274726169745f74797065223a22506e4c202855534429222c2276616c7565604682015262111d1160e91b60668201528151918290602001606983015e0160430162089f4b60ea1b6026820152602981017f7b2274726169745f74797065223a224f70656e6564222c22646973706c61795f9052743a3cb832911d113230ba329116113b30b63ab2911d60591b604982015281516020819301605e83015e0160260160388101611f4b60f21b9052603a81017f7b2274726169745f74797065223a22436c6f736564222c22646973706c61795f9052743a3cb832911d113230ba329116113b30b63ab2911d60591b605a82015281516020819301606f83015e0160380160378101607d60f81b905260388101615d7d60f01b905203603701601c19810183526003016113b690836125a8565b6040519687946020860196518091885e85019060208201905f8252519283915e01602001905f8252518092825e015f815203601f19810184526113f990846125a8565b60405192828493516020819201602086015e83019060208201905f8252519283915e016020015f815203601f198101825261143490826125a8565b61143d90612b44565b6040518091602082017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000905280516020819201603d84015e8101603d81015f905203603d01601f198101825261149390826125a8565b604051809160208252602082016114a9916124a5565b0390f35b90610f04565b6040516114c16040826125a8565b60078152662366383731373160c81b602082015292610aa9565b6040516114e96040826125a8565b600681526510d313d4d15160d21b602082015292610372565b634e487b7160e01b5f52602160045260245ffd5b6040516115246040826125a8565b600581526414d213d49560da1b602082015292610343565b34610157576080366003190112610157576115556124c9565b61155d6124df565b906044356064359267ffffffffffffffff841161015757366023850112156101575783600401359261158e84612732565b9361159c60405195866125a8565b8085523660248288010111610157576020815f9260246115d0990183890137860101526115ca83838361274e565b33612a0e565b005b34610157576040366003190112610157576115eb6124c9565b602435908115159081830361015757331561167c576001600160a01b03169182156116695761163b90335f52600560205260405f20845f5260205260405f209060ff801983541691151516179055565b6040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b82630b61174360e31b5f5260045260245ffd5b63a9fbf51f60e01b5f525f60045260245ffd5b34610157576040366003190112610157576116a861252f565b6024359067ffffffffffffffff821161015757366023830112156101575781600401359067ffffffffffffffff82116101575736602483850101116101575760ff906116f26129e7565b165f52600a60205260405f2090611709825461253f565b601f81116117b2575b505f601f821160011461174e578192935f92611740575b50505f19600383901b1c191660019190911b179055005b602492500101358380611729565b601f19821693835f5260205f20915f5b868110611797575083600195961061177b575b505050811b019055005b01602401355f19600384901b60f8161c19169055838080611771565b9092602060018192602487870101358155019401910161175e565b825f5260205f20601f830160051c810191602084106117ed575b601f0160051c01905b8181106117e25750611712565b5f81556001016117d5565b90915081906117cc565b34610157576020366003190112610157576004355f52600960205260405f2080546001820154600283015492600381015493600460ff8660081c1692015492604051946001600160801b038116865260801c60208601526001600160801b038116604086015260801c606085015280600f0b608085015267ffffffffffffffff8160801c1660a085015260c01c60c084015260ff8416151560e08401526003811015611502576101809360ff91610100850152818160101c1661012085015260181c16610140830152610160820152f35b34610157575f366003190112610157576040515f6001546118e88161253f565b80845290600181169081156119825750600114611924575b6114a983611910818503826125a8565b6040519182916020835260208301906124a5565b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b80821061196857509091508101602001611910611900565b919260018160209254838588010152019101909291611950565b60ff191660208086019190915291151560051b840190910191506119109050611900565b34610157576020366003190112610157576119bf6124c9565b6119c76129e7565b600780546001600160a01b0319166001600160a01b039290921691821790557f79f74fd5964b6943d8a1865abfb7f668c92fa3f32c0a2e3195da7d0946703ad75f80a2005b34610157575f366003190112610157576006546040516001600160a01b039091168152602090f35b3461015757602036600319011261015757600435611a5d60018060a01b03600754163314612972565b805f526009602052600360405f200160ff815460081c16600381101561150257611ab457805461ff0019166101001790557f688c236ac8ec6e00b8d8d254f775e751beada6524a40efeb8ea29c16380c6a085f80a2005b60405162461bcd60e51b815260206004820152600c60248201526b24191d103737ba1037b832b760a11b6044820152606490fd5b34610157575f36600319011261015757611b006129e7565b600680546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610157576020366003190112610157576001600160a01b03611b646124c9565b168015611b81575f526003602052602060405f2054604051908152f35b6322718ad960e21b5f525f60045260245ffd5b346101575761010036600319011261015757611bae6124c9565b611bb661271c565b604435906001600160801b03821680920361015757606435916001600160801b038316809303610157576084358015158091036101575760a43560ff81168091036101575760c4359160ff831680930361015757611c1f60018060a01b03600754163314612972565b600854945f1986146120c6576001860160085560405190611c3f82612577565b6001600160801b03169485825260208201908152866040830189815286606085015f8152608086015f815260a087014267ffffffffffffffff16815260c08801905f825260e08901958a87526101008a01945f86526101208b01998d8b526101408c019788526101608c019960e4358b525f52600960205260405f209b516001600160801b03166001600160801b03166001600160801b03198d5416178c55516001600160801b0316611d07908c906001600160801b0382549181199060801b169116179055565b9051905160801b6001600160801b0319166001600160801b039091161760018a015591519151905160809190911b67ffffffffffffffff60801b166001600160801b039092169190911760c09190911b6001600160c01b0319161760028701556003860192511515611d8590849060ff801983541691151516179055565b519360038510156115025760049461ff0084549160081b169061ff001916178355519062ff000063ff0000008454925160181b169260101b169063ffff000019161717905551910155602095604051611dde88826125a8565b5f81526001600160a01b0389169889156120b3575f88815260028a5260409020546001600160a01b03161515806120ab575b612041575b5f88815260028a5260409020546001600160a01b03168015159081612010575b8b5f5260038b5260405f2060018154019055895f5260028b5260405f208c6bffffffffffffffffffffffff60a01b825416179055898c827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a450611ffd573b611ee8575b509385937f85cd995777b00337b3904a8f6d51eec6e780443f335275baa3c2d709d4b700ac9360a0938a976040519485528a850152604084015260608301526080820152a3604051908152f35b87611f219160405180938192630a85bd0160e11b83523360048401525f60248401528b60448401526080606484015260848301906124a5565b03815f8d5af15f9181611fbd575b50611f845788883d15611f7c573d90611f4782612732565b91611f5560405193846125a8565b82523d5f8284013e5b81519182611f795783633250574960e11b5f5260045260245ffd5b01fd5b606090611f5e565b969795966001600160e01b03191663757a42ff60e11b01611faa579496959460a0611e9b565b85633250574960e11b5f5260045260245ffd5b9091508881813d8311611ff6575b611fd581836125a8565b8101031261015757516001600160e01b03198116810361015757908a611f2f565b503d611fcb565b6339e3563760e11b5f525f60045260245ffd5b5f8a81526004602052604080822080546001600160a01b031916905582825260038d52902080545f19019055611e35565b875f526009895260ff600360405f20015460081c16600381101561150257600103611e155760405162461bcd60e51b8152600481018a9052601b60248201527f48323a204e4654206c6f636b656420647572696e6720636c6f736500000000006044820152606490fd5b506001611e10565b633250574960e11b5f525f60045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b34610157576060366003190112610157576004356120f661271c565b60443580600f0b918282036101575761211a60018060a01b03600754163314612972565b835f52600960205260405f20926003840160ff815460081c166003811015611502578015908115612229575b50156121ed576001850180546001600160801b0316608085901b6001600160801b0319161790557f933e1d6f8069f0e5750aecaa3a26cbc6b6c46705dff7017b4038cceead71f565946040946121ca91600201805467ffffffffffffffff60801b166001600160801b03909216919091174260c01b6001600160c01b031916179055565b61020061ff00198254161790556001600160801b038351921682526020820152a2005b60405162461bcd60e51b815260206004820152601460248201527348323a206e6f74206f70656e2f636c6f73696e6760601b6044820152606490fd5b600191501487612146565b346101575760203660031901126101575760ff61224f61252f565b165f52600a6020526114a961191060405f2061267e565b346101575760203660031901126101575760206122846004356129b3565b6040516001600160a01b039091168152f35b34610157575f366003190112610157576020600854604051908152f35b34610157576115d06122c4366124f5565b90604051926122d46020856125a8565b5f84526115ca83838361274e565b34610157576115d06122f3366124f5565b9161274e565b34610157576040366003190112610157576123126124c9565b60243561231e816129b3565b331515806123d0575b806123a3575b6123905781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f80a45f90815260046020526040902080546001600160a01b0319166001600160a01b03909216919091179055005b63a9fbf51f60e01b5f523360045260245ffd5b506001600160a01b0381165f90815260056020908152604080832033845290915290205460ff161561232d565b506001600160a01b038116331415612327565b3461015757602036600319011261015757600435612400816129b3565b505f526004602052602060018060a01b0360405f205416604051908152f35b34610157575f366003190112610157576114a96119106125ca565b34610157576020366003190112610157576004359063ffffffff60e01b8216809203610157576020916380ac58cd60e01b8114908115612494575b8115612483575b5015158152f35b6301ffc9a760e01b1490508361247c565b635b5e139f60e01b81149150612475565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361015757565b602435906001600160a01b038216820361015757565b6060906003190112610157576004356001600160a01b038116810361015757906024356001600160a01b0381168103610157579060443590565b6004359060ff8216820361015757565b90600182811c9216801561256d575b602083101461255957565b634e487b7160e01b5f52602260045260245ffd5b91607f169161254e565b610180810190811067ffffffffffffffff82111761259457604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761259457604052565b604051905f825f54916125dc8361253f565b808352926001811690811561265f5750600114612602575b612600925003836125a8565b565b505f80805290917f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b818310612643575050906020612600928201016125f4565b602091935080600191548385890101520191019091849261262b565b6020925061260094915060ff191682840152151560051b8201016125f4565b9060405191825f8254926126918461253f565b80845293600181169081156126fa57506001146126b6575b50612600925003836125a8565b90505f9291925260205f20905f915b8183106126de575050906020612600928201015f6126a9565b60209193508060019154838589010152019101909184926126c5565b90506020925061260094915060ff191682840152151560051b8201015f6126a9565b602435906001600160801b038216820361015757565b67ffffffffffffffff811161259457601f01601f191660200190565b6001600160a01b03909116919082156120b3575f828152600260205260409020546001600160a01b031615158061296a575b6128ff575b5f828152600260205260409020546001600160a01b03169282903315158061286a575b5084612837575b805f52600360205260405f2060018154019055815f52600260205260405f20816bffffffffffffffffffffffff60a01b825416179055847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001600160a01b031680830361281f57505050565b6364283d7b60e01b5f5260045260245260445260645ffd5b5f82815260046020526040902080546001600160a01b0319169055845f52600360205260405f205f1981540190556127af565b909150806128ae575b156128805782905f6127a8565b828461289857637e27328960e01b5f5260045260245ffd5b63177e802f60e01b5f523360045260245260445ffd5b5033841480156128dd575b8061287357505f838152600460205260409020546001600160a01b03163314612873565b505f84815260056020908152604080832033845290915290205460ff166128b9565b815f52600960205260ff600360405f20015460081c166003811015611502576001036127855760405162461bcd60e51b815260206004820152601b60248201527f48323a204e4654206c6f636b656420647572696e6720636c6f736500000000006044820152606490fd5b506001612780565b1561297957565b60405162461bcd60e51b815260206004820152601260248201527124191d103737ba1031b7b73a3937b63632b960711b6044820152606490fd5b5f818152600260205260409020546001600160a01b03169081156129d5575090565b637e27328960e01b5f5260045260245ffd5b6006546001600160a01b031633036129fb57565b63118cdaa760e01b5f523360045260245ffd5b823b612a1c575b5050505050565b604051630a85bd0160e11b81526001600160a01b039182166004820152918116602483015260448201939093526080606482015291169160209082908190612a689060848301906124a5565b03815f865af15f9181612aff575b50612acb57503d15612ac4573d612a8c81612732565b90612a9a60405192836125a8565b81523d5f602083013e5b80519081612abf5782633250574960e11b5f5260045260245ffd5b602001fd5b6060612aa4565b6001600160e01b03191663757a42ff60e11b01612aed57505f80808080612a15565b633250574960e11b5f5260045260245ffd5b9091506020813d602011612b3c575b81612b1b602093836125a8565b8101031261015757516001600160e01b03198116810361015757905f612a76565b3d9150612b0e565b90815115612c63578151600281018091116120c65760039004600281901b91906001600160fe1b038116036120c657604051917f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f603f52602083018480518101602081018051915f82525b808910612c275750602095969750906003929152510680600114612c1257600214612c05575b50808452830101604052565b603d905f1901535f612bf9565b50603d90815f1982015360011901535f612bf9565b939760036004910198603f8a51818160121c165183538181600c1c16516001840153818160061c16516002840153165160038201530193612bd3565b9050604051612c736020826125a8565b5f815290565b805f9172184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b821015612dc3575b806d04ee2d6d415b85acef8100000000600a921015612da8575b662386f26fc10000811015612d94575b6305f5e100811015612d83575b612710811015612d74575b6064811015612d66575b1015612d5b575b600a60216001840193612d0085612732565b94612d0e60405196876125a8565b808652612d1d601f1991612732565b013660208701378401015b5f1901916f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353048015612d5657600a9091612d28565b505090565b600190910190612cee565b606460029104930192612ce7565b61271060049104930192612cdd565b6305f5e10060089104930192612cd2565b662386f26fc1000060109104930192612cc5565b6d04ee2d6d415b85acef810000000060209104930192612cb5565b506040915072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8104612c9b565b612e926001600160801b0360209216600183612e17670de0b6b3a7640000662386f26fc10000818606049404612c79565b92600a811015612e95578180612e46604051612e346040826125a8565b868152600360fc1b8382015293612c79565b9260405198878a985191829101848a015e870190601760f91b83830152805192839101602183015e0101908382015f8152815193849201905e01015f815203601f1981018352826125a8565b90565b8180612e46604051612ea783826125a8565b5f815293612c79565b60ff90911690811580612fa057612f8c576001600160801b031604905b600f0b905f82820192831291129080158216911516176120c6575f811215612f4457600160ff1b81146120c657612e926021612f156001600160801b036020945f0316612de6565b604051938491602d60f81b828401528051918291018484015e81015f838201520301601f1981018352826125a8565b612e926021612f5d6001600160801b0360209416612de6565b604051938491602b60f81b828401528051918291018484015e81015f838201520301601f1981018352826125a8565b634e487b7160e01b5f52601260045260245ffd5b5050505f90612ecd56fe3d226d6f6e6f73706163652220666f6e742d73697a653d223138222066696c6c793d226d6f6e6f73706163652220666f6e742d73697a653d223138222066696ca2646970667358221220aee5e951d32158881165c870d9175057b3b593bca6099f959a3a12baf0236a2364736f6c634300081a00330000000000000000000000009a7ae1492d303153c575b5a8081aa1b590fea951000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000f64657764657720506f736974696f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009646577646577504f530000000000000000000000000000000000000000000000
0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461243a5750806306fdde031461241f578063081812fc146123e3578063095ea7b3146122f957806323b872dd146122e257806342842e0e146122b357806361b8ce8c146122965780636352211e1461226657806363c76317146122345780636a8a02b1146120da5780636aec237014611b9457806370a0823114611b43578063715018a614611ae8578063755f71a814611a345780638da5cb5b14611a0c57806392eefe9b146119a657806395d89b41146118c857806399fbab88146117f75780639cccf2c41461168f578063a22cb465146115d2578063b88d4fde1461153c578063c87b56dd14610238578063e985e9c5146101e1578063f2fde38b1461015b5763f77c47911461012f575f80fd5b34610157575f366003190112610157576007546040516001600160a01b039091168152602090f35b5f80fd5b34610157576020366003190112610157576101746124c9565b61017c6129e7565b6001600160a01b031680156101ce57600680546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b631e4fbdf760e01b5f525f60045260245ffd5b34610157576040366003190112610157576101fa6124c9565b6102026124df565b9060018060a01b03165f52600560205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b3461015757602036600319011261015757600435610255816129b3565b50805f52600960205260405f209060405161026f81612577565b82546001600160801b038116825260801c602082015260018301546001600160801b038116604083015260801c6060820152600283015480600f0b608083015267ffffffffffffffff8160801c1660a083015260c01c60c0820152600383015460e082019060ff81161515825260ff8160081c169461010084019560038110156115025760049260ff918852818160101c1661012087015260181c1661014085015201546101608301525115155f14611516576040516103306040826125a8565b60048152634c4f4e4760e01b6020820152925b516003811015611502576114db5760405161035f6040826125a8565b600481526327a822a760e11b6020820152925b61037b83612c79565b604080517f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208083019182527f30302f737667222076696577426f783d223020302034303020343030223e0000938301939093527f3c646566733e3c6c696e6561724772616469656e742069643d2267222078313d605e8301527f2230222078323d2230222079313d2230222079323d2231223e00000000000000607e8301527f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d2223306097830152671b189a183091179f60c11b60b78301527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d2260bf830152691198199830981b11179f60b11b60df8301527f3c2f6c696e6561724772616469656e743e3c2f646566733e000000000000000060e98301527f3c726563742077696474683d2234303022206865696768743d223430302220666101018301526e34b6361e913ab9361411b39491179f60891b6101218301527f3c7465787420783d2232302220793d2234342220666f6e742d66616d696c793d6101308301527f226d6f6e6f73706163652220666f6e742d73697a653d223238222066696c6c3d610150830152731111a1a12321181c111f2461591e17ba32bc3a1f60611b6101708301527f3c7465787420783d2232302220793d2236382220666f6e742d66616d696c793d6101848301527f226d6f6e6f73706163652220666f6e742d73697a653d223131222066696c6c3d6101a48301527f2223366238613736223e484f4f44535155415245443c2f746578743e000000006101c48301527f3c7465787420783d223338302220793d2234342220666f6e742d66616d696c796101e08301527f3d226d6f6e6f73706163652220666f6e742d73697a653d223134222066696c6c6102008301527f3d22236436666665302220746578742d616e63686f723d22656e64223e230000610220830152835190939192839282910161023e84015e810161023e8101661e17ba32bc3a1f60c91b90520361023e016018198101825260070161068690826125a8565b61012084015160ff1661069890612c79565b8685516001600160801b03166106ad90612de6565b9160408701516001600160801b03166106c590612de6565b9260405193849160208301937f3c7465787420783d2232302220793d223134302220666f6e742d66616d696c798552604084015f80516020612fab8339815191529052751e9111b21b33333298111f29a4a2229e17ba32bc3a1f60511b6060850152607684017f3c7465787420783d223338302220793d223134302220666f6e742d66616d696c9052609684015f80516020612fcb833981519152905260b684017f6c3d22234342464230382220746578742d616e63686f723d22656e64223e0000905289518060208c0160d487015e661e17ba32bc3a1f60c91b60d4918601918201527f3c7465787420783d2232302220793d223137302220666f6e742d66616d696c7960db8201525f80516020612fab83398151915260fb8201527f3d2223643666666530223e4c455645524147453c2f746578743e00000000000061011b8201527f3c7465787420783d223338302220793d223137302220666f6e742d66616d696c6101358201525f80516020612fcb8339815191526101558201527f6c3d22236666643136362220746578742d616e63686f723d22656e64223e0000610175820152815191829060200161019383015e673c1e17ba32bc3a1f60c11b61019392909101918201527f3c7465787420783d2232302220793d223230302220666f6e742d66616d696c7961019b8201525f80516020612fab8339815191526101bb820152751e9111b21b33333298111f29a4ad229e17ba32bc3a1f60511b6101db8201527f3c7465787420783d223338302220793d223230302220666f6e742d66616d696c6101f18201525f80516020612fcb8339815191526102118201527f6c3d22234342464230382220746578742d616e63686f723d22656e64223e240061023182015281519160d4820191839160200190610250015e0160bf0160bd8101661e17ba32bc3a1f60c91b905260c481017f3c7465787420783d2232302220793d223234302220666f6e742d66616d696c79905260e481015f80516020612fab833981519152905261010481017f3d2223643666666530223e454e5452593c2f746578743e000000000000000000905261011b81017f3c7465787420783d223338302220793d223234302220666f6e742d66616d696c905261013b81015f80516020612fcb833981519152905261015b81017f6c3d22234342464230382220746578742d616e63686f723d22656e64223e000090528151602081930161017983015e0160bd0160bc8101661e17ba32bc3a1f60c91b90520360bc0160181981018452600701610a7790846125a8565b6080870151600f0b5f136114b357604051610a936040826125a8565b60078152662333346433393960c81b6020820152925b87516001600160801b031661012089015160ff1660808a0151600f0b90610acf92612eb0565b60405193849160208301967f3c7465787420783d2232302220793d223238302220666f6e742d66616d696c798852604084015f80516020612fab8339815191529052741e9111b21b33333298111f2827261e17ba32bc3a1f60591b6060850152607584017f3c7465787420783d223338302220793d223238302220666f6e742d66616d696c9052609584015f80516020612fcb833981519152905262361e9160e91b60b58501528051602081920160b886015e83017311103a32bc3a16b0b731b437b91e9132b732111f60611b60b88201528151602081930160cc83015e0160b80160148101661e17ba32bc3a1f60c91b9052601b81017f3c7465787420783d2232302220793d223336302220666f6e742d66616d696c799052603b81017f3d226d6f6e6f73706163652220666f6e742d73697a653d223131222066696c6c9052605b81017f3d2223366238613736223e53544154453c2f746578743e0000000000000000009052607281017f3c7465787420783d223338302220793d223336302220666f6e742d66616d696c9052609281017f793d226d6f6e6f73706163652220666f6e742d73697a653d223131222066696c905260b281017f6c3d22236436666665302220746578742d616e63686f723d22656e64223e000090528151602081930160d083015e0160140160bc8101661e17ba32bc3a1f60c91b905260c38101651e17b9bb339f60d11b90520360bc0160121981018452600d01610cf590846125a8565b604051958695518091602088015e85019060208201905f8252519283915e01602001905f8252518092825e015f815203601f1981018252610d3690826125a8565b610d3f90612b44565b92610d486125ca565b90610d5290612c79565b93604051948592683d913730b6b2911d1160b91b602085015280516020819201602986015e83016029810161202360f01b905281516020819301602b83015e7f222c226465736372697074696f6e223a2241206c697665206c6f747465727920602b92909101918201526903837b9b4ba34b7b717160b51b604b8201527f4561636820736c6f74206973206f70656e6564206f6e206120686f6c6465725c60558201527f75323031397320626568616c662062792074686520656e67696e652e2000000060758201527f546865204e465420747261636b7320746865206c69666574696d65206f66207460928201526a1a185d081cdb1bdd0b888b60aa1b60b28201527f22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261736560bd820152620d8d0b60ea1b60dd820152815191602982019183916020019060e0015e0160020161088b60f21b60b58201520360b501601d1981018452600201610ec090846125a8565b61014082015160ff165f52600a60205260405f20610edd9061267e565b80516114ad5750604051610ef26040826125a8565b600381526208aa8960eb1b6020820152905b604051928360208101936d2261747472696275746573223a5b60901b8552602e82017f7b2274726169745f74797065223a224173736574222c2276616c7565223a2200905280516020819201604d84015e810162089f4b60ea1b604d82015203604d01601c1981018552600301610f7b90856125a8565b61012081015160ff16610f8d90612c79565b9581516001600160801b0316610fa290612de6565b60208301516001600160801b0316610fb990612de6565b60408401516001600160801b0316610fd090612de6565b91604051998a9460208601977f7b2274726169745f74797065223a2253696465222c2276616c7565223a220000895280516020819201603e89015e860162089f4b60ea1b603e820152604181017f7b2274726169745f74797065223a225374617465222c2276616c7565223a2200905281516020819301606083015e01603e0162089f4b60ea1b6022820152602581017f7b2274726169745f74797065223a224c65766572616765222c2276616c7565229052611d1160f11b604582015281516020819301604783015e01602201631e089f4b60e21b6025820152602981017f7b2274726169745f74797065223a22536c6f742053697a65202855534429222c905268113b30b63ab2911d1160b91b604982015281516020819301605283015e0160250162089f4b60ea1b602d820152603081017f7b2274726169745f74797065223a22436f6c6c61746572616c2028555344292290526916113b30b63ab2911d1160b11b605082015281516020819301605a83015e01602d0162089f4b60ea1b602d820152603081017f7b2274726169745f74797065223a22456e747279204d61726b222c2276616c7590526332911d1160e11b605082015281516020819301605483015e01602d0162089f4b60ea1b602782015203602701601c19810187526003016111be90876125a8565b60608101516001600160801b03166111d590612de6565b9181516001600160801b031661012083015160ff166080840151600f0b906111fc92612eb0565b60a083015167ffffffffffffffff1661121490612c79565b9260c0015167ffffffffffffffff1661122c90612c79565b60405193849260208401967f7b2274726169745f74797065223a2245786974204d61726b222c2276616c7565885262111d1160e91b604086015280516020819201604387015e62089f4b60ea1b6043918601918201527f7b2274726169745f74797065223a22506e4c202855534429222c2276616c7565604682015262111d1160e91b60668201528151918290602001606983015e0160430162089f4b60ea1b6026820152602981017f7b2274726169745f74797065223a224f70656e6564222c22646973706c61795f9052743a3cb832911d113230ba329116113b30b63ab2911d60591b604982015281516020819301605e83015e0160260160388101611f4b60f21b9052603a81017f7b2274726169745f74797065223a22436c6f736564222c22646973706c61795f9052743a3cb832911d113230ba329116113b30b63ab2911d60591b605a82015281516020819301606f83015e0160380160378101607d60f81b905260388101615d7d60f01b905203603701601c19810183526003016113b690836125a8565b6040519687946020860196518091885e85019060208201905f8252519283915e01602001905f8252518092825e015f815203601f19810184526113f990846125a8565b60405192828493516020819201602086015e83019060208201905f8252519283915e016020015f815203601f198101825261143490826125a8565b61143d90612b44565b6040518091602082017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000905280516020819201603d84015e8101603d81015f905203603d01601f198101825261149390826125a8565b604051809160208252602082016114a9916124a5565b0390f35b90610f04565b6040516114c16040826125a8565b60078152662366383731373160c81b602082015292610aa9565b6040516114e96040826125a8565b600681526510d313d4d15160d21b602082015292610372565b634e487b7160e01b5f52602160045260245ffd5b6040516115246040826125a8565b600581526414d213d49560da1b602082015292610343565b34610157576080366003190112610157576115556124c9565b61155d6124df565b906044356064359267ffffffffffffffff841161015757366023850112156101575783600401359261158e84612732565b9361159c60405195866125a8565b8085523660248288010111610157576020815f9260246115d0990183890137860101526115ca83838361274e565b33612a0e565b005b34610157576040366003190112610157576115eb6124c9565b602435908115159081830361015757331561167c576001600160a01b03169182156116695761163b90335f52600560205260405f20845f5260205260405f209060ff801983541691151516179055565b6040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b82630b61174360e31b5f5260045260245ffd5b63a9fbf51f60e01b5f525f60045260245ffd5b34610157576040366003190112610157576116a861252f565b6024359067ffffffffffffffff821161015757366023830112156101575781600401359067ffffffffffffffff82116101575736602483850101116101575760ff906116f26129e7565b165f52600a60205260405f2090611709825461253f565b601f81116117b2575b505f601f821160011461174e578192935f92611740575b50505f19600383901b1c191660019190911b179055005b602492500101358380611729565b601f19821693835f5260205f20915f5b868110611797575083600195961061177b575b505050811b019055005b01602401355f19600384901b60f8161c19169055838080611771565b9092602060018192602487870101358155019401910161175e565b825f5260205f20601f830160051c810191602084106117ed575b601f0160051c01905b8181106117e25750611712565b5f81556001016117d5565b90915081906117cc565b34610157576020366003190112610157576004355f52600960205260405f2080546001820154600283015492600381015493600460ff8660081c1692015492604051946001600160801b038116865260801c60208601526001600160801b038116604086015260801c606085015280600f0b608085015267ffffffffffffffff8160801c1660a085015260c01c60c084015260ff8416151560e08401526003811015611502576101809360ff91610100850152818160101c1661012085015260181c16610140830152610160820152f35b34610157575f366003190112610157576040515f6001546118e88161253f565b80845290600181169081156119825750600114611924575b6114a983611910818503826125a8565b6040519182916020835260208301906124a5565b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b80821061196857509091508101602001611910611900565b919260018160209254838588010152019101909291611950565b60ff191660208086019190915291151560051b840190910191506119109050611900565b34610157576020366003190112610157576119bf6124c9565b6119c76129e7565b600780546001600160a01b0319166001600160a01b039290921691821790557f79f74fd5964b6943d8a1865abfb7f668c92fa3f32c0a2e3195da7d0946703ad75f80a2005b34610157575f366003190112610157576006546040516001600160a01b039091168152602090f35b3461015757602036600319011261015757600435611a5d60018060a01b03600754163314612972565b805f526009602052600360405f200160ff815460081c16600381101561150257611ab457805461ff0019166101001790557f688c236ac8ec6e00b8d8d254f775e751beada6524a40efeb8ea29c16380c6a085f80a2005b60405162461bcd60e51b815260206004820152600c60248201526b24191d103737ba1037b832b760a11b6044820152606490fd5b34610157575f36600319011261015757611b006129e7565b600680546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610157576020366003190112610157576001600160a01b03611b646124c9565b168015611b81575f526003602052602060405f2054604051908152f35b6322718ad960e21b5f525f60045260245ffd5b346101575761010036600319011261015757611bae6124c9565b611bb661271c565b604435906001600160801b03821680920361015757606435916001600160801b038316809303610157576084358015158091036101575760a43560ff81168091036101575760c4359160ff831680930361015757611c1f60018060a01b03600754163314612972565b600854945f1986146120c6576001860160085560405190611c3f82612577565b6001600160801b03169485825260208201908152866040830189815286606085015f8152608086015f815260a087014267ffffffffffffffff16815260c08801905f825260e08901958a87526101008a01945f86526101208b01998d8b526101408c019788526101608c019960e4358b525f52600960205260405f209b516001600160801b03166001600160801b03166001600160801b03198d5416178c55516001600160801b0316611d07908c906001600160801b0382549181199060801b169116179055565b9051905160801b6001600160801b0319166001600160801b039091161760018a015591519151905160809190911b67ffffffffffffffff60801b166001600160801b039092169190911760c09190911b6001600160c01b0319161760028701556003860192511515611d8590849060ff801983541691151516179055565b519360038510156115025760049461ff0084549160081b169061ff001916178355519062ff000063ff0000008454925160181b169260101b169063ffff000019161717905551910155602095604051611dde88826125a8565b5f81526001600160a01b0389169889156120b3575f88815260028a5260409020546001600160a01b03161515806120ab575b612041575b5f88815260028a5260409020546001600160a01b03168015159081612010575b8b5f5260038b5260405f2060018154019055895f5260028b5260405f208c6bffffffffffffffffffffffff60a01b825416179055898c827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a450611ffd573b611ee8575b509385937f85cd995777b00337b3904a8f6d51eec6e780443f335275baa3c2d709d4b700ac9360a0938a976040519485528a850152604084015260608301526080820152a3604051908152f35b87611f219160405180938192630a85bd0160e11b83523360048401525f60248401528b60448401526080606484015260848301906124a5565b03815f8d5af15f9181611fbd575b50611f845788883d15611f7c573d90611f4782612732565b91611f5560405193846125a8565b82523d5f8284013e5b81519182611f795783633250574960e11b5f5260045260245ffd5b01fd5b606090611f5e565b969795966001600160e01b03191663757a42ff60e11b01611faa579496959460a0611e9b565b85633250574960e11b5f5260045260245ffd5b9091508881813d8311611ff6575b611fd581836125a8565b8101031261015757516001600160e01b03198116810361015757908a611f2f565b503d611fcb565b6339e3563760e11b5f525f60045260245ffd5b5f8a81526004602052604080822080546001600160a01b031916905582825260038d52902080545f19019055611e35565b875f526009895260ff600360405f20015460081c16600381101561150257600103611e155760405162461bcd60e51b8152600481018a9052601b60248201527f48323a204e4654206c6f636b656420647572696e6720636c6f736500000000006044820152606490fd5b506001611e10565b633250574960e11b5f525f60045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b34610157576060366003190112610157576004356120f661271c565b60443580600f0b918282036101575761211a60018060a01b03600754163314612972565b835f52600960205260405f20926003840160ff815460081c166003811015611502578015908115612229575b50156121ed576001850180546001600160801b0316608085901b6001600160801b0319161790557f933e1d6f8069f0e5750aecaa3a26cbc6b6c46705dff7017b4038cceead71f565946040946121ca91600201805467ffffffffffffffff60801b166001600160801b03909216919091174260c01b6001600160c01b031916179055565b61020061ff00198254161790556001600160801b038351921682526020820152a2005b60405162461bcd60e51b815260206004820152601460248201527348323a206e6f74206f70656e2f636c6f73696e6760601b6044820152606490fd5b600191501487612146565b346101575760203660031901126101575760ff61224f61252f565b165f52600a6020526114a961191060405f2061267e565b346101575760203660031901126101575760206122846004356129b3565b6040516001600160a01b039091168152f35b34610157575f366003190112610157576020600854604051908152f35b34610157576115d06122c4366124f5565b90604051926122d46020856125a8565b5f84526115ca83838361274e565b34610157576115d06122f3366124f5565b9161274e565b34610157576040366003190112610157576123126124c9565b60243561231e816129b3565b331515806123d0575b806123a3575b6123905781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f80a45f90815260046020526040902080546001600160a01b0319166001600160a01b03909216919091179055005b63a9fbf51f60e01b5f523360045260245ffd5b506001600160a01b0381165f90815260056020908152604080832033845290915290205460ff161561232d565b506001600160a01b038116331415612327565b3461015757602036600319011261015757600435612400816129b3565b505f526004602052602060018060a01b0360405f205416604051908152f35b34610157575f366003190112610157576114a96119106125ca565b34610157576020366003190112610157576004359063ffffffff60e01b8216809203610157576020916380ac58cd60e01b8114908115612494575b8115612483575b5015158152f35b6301ffc9a760e01b1490508361247c565b635b5e139f60e01b81149150612475565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361015757565b602435906001600160a01b038216820361015757565b6060906003190112610157576004356001600160a01b038116810361015757906024356001600160a01b0381168103610157579060443590565b6004359060ff8216820361015757565b90600182811c9216801561256d575b602083101461255957565b634e487b7160e01b5f52602260045260245ffd5b91607f169161254e565b610180810190811067ffffffffffffffff82111761259457604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761259457604052565b604051905f825f54916125dc8361253f565b808352926001811690811561265f5750600114612602575b612600925003836125a8565b565b505f80805290917f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b818310612643575050906020612600928201016125f4565b602091935080600191548385890101520191019091849261262b565b6020925061260094915060ff191682840152151560051b8201016125f4565b9060405191825f8254926126918461253f565b80845293600181169081156126fa57506001146126b6575b50612600925003836125a8565b90505f9291925260205f20905f915b8183106126de575050906020612600928201015f6126a9565b60209193508060019154838589010152019101909184926126c5565b90506020925061260094915060ff191682840152151560051b8201015f6126a9565b602435906001600160801b038216820361015757565b67ffffffffffffffff811161259457601f01601f191660200190565b6001600160a01b03909116919082156120b3575f828152600260205260409020546001600160a01b031615158061296a575b6128ff575b5f828152600260205260409020546001600160a01b03169282903315158061286a575b5084612837575b805f52600360205260405f2060018154019055815f52600260205260405f20816bffffffffffffffffffffffff60a01b825416179055847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001600160a01b031680830361281f57505050565b6364283d7b60e01b5f5260045260245260445260645ffd5b5f82815260046020526040902080546001600160a01b0319169055845f52600360205260405f205f1981540190556127af565b909150806128ae575b156128805782905f6127a8565b828461289857637e27328960e01b5f5260045260245ffd5b63177e802f60e01b5f523360045260245260445ffd5b5033841480156128dd575b8061287357505f838152600460205260409020546001600160a01b03163314612873565b505f84815260056020908152604080832033845290915290205460ff166128b9565b815f52600960205260ff600360405f20015460081c166003811015611502576001036127855760405162461bcd60e51b815260206004820152601b60248201527f48323a204e4654206c6f636b656420647572696e6720636c6f736500000000006044820152606490fd5b506001612780565b1561297957565b60405162461bcd60e51b815260206004820152601260248201527124191d103737ba1031b7b73a3937b63632b960711b6044820152606490fd5b5f818152600260205260409020546001600160a01b03169081156129d5575090565b637e27328960e01b5f5260045260245ffd5b6006546001600160a01b031633036129fb57565b63118cdaa760e01b5f523360045260245ffd5b823b612a1c575b5050505050565b604051630a85bd0160e11b81526001600160a01b039182166004820152918116602483015260448201939093526080606482015291169160209082908190612a689060848301906124a5565b03815f865af15f9181612aff575b50612acb57503d15612ac4573d612a8c81612732565b90612a9a60405192836125a8565b81523d5f602083013e5b80519081612abf5782633250574960e11b5f5260045260245ffd5b602001fd5b6060612aa4565b6001600160e01b03191663757a42ff60e11b01612aed57505f80808080612a15565b633250574960e11b5f5260045260245ffd5b9091506020813d602011612b3c575b81612b1b602093836125a8565b8101031261015757516001600160e01b03198116810361015757905f612a76565b3d9150612b0e565b90815115612c63578151600281018091116120c65760039004600281901b91906001600160fe1b038116036120c657604051917f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f603f52602083018480518101602081018051915f82525b808910612c275750602095969750906003929152510680600114612c1257600214612c05575b50808452830101604052565b603d905f1901535f612bf9565b50603d90815f1982015360011901535f612bf9565b939760036004910198603f8a51818160121c165183538181600c1c16516001840153818160061c16516002840153165160038201530193612bd3565b9050604051612c736020826125a8565b5f815290565b805f9172184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b821015612dc3575b806d04ee2d6d415b85acef8100000000600a921015612da8575b662386f26fc10000811015612d94575b6305f5e100811015612d83575b612710811015612d74575b6064811015612d66575b1015612d5b575b600a60216001840193612d0085612732565b94612d0e60405196876125a8565b808652612d1d601f1991612732565b013660208701378401015b5f1901916f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353048015612d5657600a9091612d28565b505090565b600190910190612cee565b606460029104930192612ce7565b61271060049104930192612cdd565b6305f5e10060089104930192612cd2565b662386f26fc1000060109104930192612cc5565b6d04ee2d6d415b85acef810000000060209104930192612cb5565b506040915072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8104612c9b565b612e926001600160801b0360209216600183612e17670de0b6b3a7640000662386f26fc10000818606049404612c79565b92600a811015612e95578180612e46604051612e346040826125a8565b868152600360fc1b8382015293612c79565b9260405198878a985191829101848a015e870190601760f91b83830152805192839101602183015e0101908382015f8152815193849201905e01015f815203601f1981018352826125a8565b90565b8180612e46604051612ea783826125a8565b5f815293612c79565b60ff90911690811580612fa057612f8c576001600160801b031604905b600f0b905f82820192831291129080158216911516176120c6575f811215612f4457600160ff1b81146120c657612e926021612f156001600160801b036020945f0316612de6565b604051938491602d60f81b828401528051918291018484015e81015f838201520301601f1981018352826125a8565b612e926021612f5d6001600160801b0360209416612de6565b604051938491602b60f81b828401528051918291018484015e81015f838201520301601f1981018352826125a8565b634e487b7160e01b5f52601260045260245ffd5b5050505f90612ecd56fe3d226d6f6e6f73706163652220666f6e742d73697a653d223138222066696c6c793d226d6f6e6f73706163652220666f6e742d73697a653d223138222066696ca2646970667358221220aee5e951d32158881165c870d9175057b3b593bca6099f959a3a12baf0236a2364736f6c634300081a0033
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x3888a6…045b64 | 38 days agoFri, 10 Jul 2026 15:39:08 UTC | 0x933e1d…f565 | [0] 0x000000000000…00000001 data: 0x000000000000000000…a387b938 |
| 0x86d1fc…50179b | 38 days agoFri, 10 Jul 2026 15:38:55 UTC | 0x688c23…6a08 | [0] 0x000000000000…00000001 |
| 0x5724bd…c09fd4 | 38 days agoFri, 10 Jul 2026 15:37:50 UTC | 0x933e1d…f565 | [0] 0x000000000000…00000003 data: 0x000000000000000000…9b746f40 |
| 0x7437b1…9405aa | 38 days agoFri, 10 Jul 2026 15:37:37 UTC | 0x688c23…6a08 | [0] 0x000000000000…00000003 |
| 0x4d58ff…08eeb4 | 38 days agoFri, 10 Jul 2026 15:36:39 UTC | 0x933e1d…f565 | [0] 0x000000000000…00000002 data: 0x000000000000000000…402c3150 |
| 0x11951e…0faf28 | 38 days agoFri, 10 Jul 2026 15:36:26 UTC | 0x688c23…6a08 | [0] 0x000000000000…00000002 |
| 0xfa7379…78b9b8 | 38 days agoFri, 10 Jul 2026 15:34:17 UTC | 0x85cd99…00ac | [0] 0x000000000000…00000003 [1] 0x000000000000…56fd3d6c data: 0x000000000000000000…00000005 |
| 0xfa7379…78b9b8 | 38 days agoFri, 10 Jul 2026 15:34:17 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…56fd3d6c [2] 0x000000000000…00000003 |
| 0xfa7379…78b9b8 | 38 days agoFri, 10 Jul 2026 15:34:17 UTC | 0x85cd99…00ac | [0] 0x000000000000…00000002 [1] 0x000000000000…e594ab45 data: 0x000000000000000000…00000016 |
| 0xfa7379…78b9b8 | 38 days agoFri, 10 Jul 2026 15:34:17 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…e594ab45 [2] 0x000000000000…00000002 |
| 0xfa7379…78b9b8 | 38 days agoFri, 10 Jul 2026 15:34:17 UTC | 0x85cd99…00ac | [0] 0x000000000000…00000001 [1] 0x000000000000…968bbd7b data: 0x000000000000000000…0000000b |
| 0xfa7379…78b9b8 | 38 days agoFri, 10 Jul 2026 15:34:17 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…968bbd7b [2] 0x000000000000…00000001 |
| 0xcfc079…e5445f | 38 days agoFri, 10 Jul 2026 15:19:21 UTC | 0x79f74f…3ad7 | [0] 0x000000000000…538fe31c |
| 0x0cd9a9…15c638 | 38 days agoFri, 10 Jul 2026 15:19:13 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…90fea951 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xe4ffc8…5ae2e8 | setAssetSymbol | 6,183,352 | 38 days agoFri, 10 Jul 2026 15:21:15 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001463 | |
| 0x7ab474…fc3472 | setAssetSymbol | 6,183,314 | 38 days agoFri, 10 Jul 2026 15:21:11 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001464 | |
| 0x736109…5ef4e4 | setAssetSymbol | 6,183,282 | 38 days agoFri, 10 Jul 2026 15:21:08 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001454 | |
| 0xbe2e89…dccfe0 | setAssetSymbol | 6,183,244 | 38 days agoFri, 10 Jul 2026 15:21:04 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001498 | |
| 0x832ea3…40e99a | setAssetSymbol | 6,183,212 | 38 days agoFri, 10 Jul 2026 15:21:01 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001454 | |
| 0x2eab49…8848d6 | setAssetSymbol | 6,183,181 | 38 days agoFri, 10 Jul 2026 15:20:58 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001453 | |
| 0xeddffe…3a0eb4 | setAssetSymbol | 6,183,150 | 38 days agoFri, 10 Jul 2026 15:20:54 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001494 | |
| 0x1d444f…b082e6 | setAssetSymbol | 6,183,117 | 38 days agoFri, 10 Jul 2026 15:20:51 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001480 | |
| 0x33249a…c487e9 | setAssetSymbol | 6,183,079 | 38 days agoFri, 10 Jul 2026 15:20:47 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001508 | |
| 0x1584c0…34513b | setAssetSymbol | 6,183,047 | 38 days agoFri, 10 Jul 2026 15:20:44 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001477 | |
| 0x55da90…b4a9f9 | setAssetSymbol | 6,183,020 | 38 days agoFri, 10 Jul 2026 15:20:41 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001527 | |
| 0xe58038…89aa8c | setAssetSymbol | 6,182,982 | 38 days agoFri, 10 Jul 2026 15:20:38 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001454 | |
| 0x5f6a2e…e07a03 | setAssetSymbol | 6,182,955 | 38 days agoFri, 10 Jul 2026 15:20:35 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001463 | |
| 0x54ffcf…50806e | setAssetSymbol | 6,182,917 | 38 days agoFri, 10 Jul 2026 15:20:31 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001468 | |
| 0xdb11e1…a5a295 | setAssetSymbol | 6,182,890 | 38 days agoFri, 10 Jul 2026 15:20:28 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001500 | |
| 0xe7dd7f…4d713b | setAssetSymbol | 6,182,852 | 38 days agoFri, 10 Jul 2026 15:20:25 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001484 | |
| 0x311d31…2afd12 | setAssetSymbol | 6,182,820 | 38 days agoFri, 10 Jul 2026 15:20:21 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001473 | |
| 0xafb55e…9494de | setAssetSymbol | 6,182,788 | 38 days agoFri, 10 Jul 2026 15:20:18 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001488 | |
| 0x0e3140…c2203a | setAssetSymbol | 6,182,752 | 38 days agoFri, 10 Jul 2026 15:20:14 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001491 | |
| 0xf7449a…61e116 | setAssetSymbol | 6,182,720 | 38 days agoFri, 10 Jul 2026 15:20:11 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001487 | |
| 0x327869…e94a72 | setAssetSymbol | 6,182,688 | 38 days agoFri, 10 Jul 2026 15:20:08 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001479 | |
| 0xd615d0…3cee36 | setAssetSymbol | 6,182,651 | 38 days agoFri, 10 Jul 2026 15:20:04 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001519 | |
| 0xcb8723…0848fc | setAssetSymbol | 6,182,619 | 38 days agoFri, 10 Jul 2026 15:20:01 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001512 | |
| 0x6064af…212b26 | setAssetSymbol | 6,182,581 | 38 days agoFri, 10 Jul 2026 15:19:57 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001499 | |
| 0x2211fe…2d6f18 | setAssetSymbol | 6,182,550 | 38 days agoFri, 10 Jul 2026 15:19:54 UTC | 0x9a7a…a951 | IN | dewdew Position | $0.000 ETH | 0.00001472 |