ETH Price: $3,364.03 (-3.51%)

Contract

0xaf9CE4B327A3b690ABEA6F78eCCBfeFFfbEa9FDf
 

Overview

ETH Balance

0.14 ETH

Eth Value

$470.96 (@ $3,364.03/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer From193296452024-02-29 0:36:11301 days ago1709166971IN
0xaf9CE4B3...FfbEa9FDf
0 ETH0.0031024255.99535128
Claim Other188343892023-12-21 12:58:11370 days ago1703163491IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0038607939.15052715
Claim186584482023-11-26 21:13:35395 days ago1701033215IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.002700529.70261192
Transfer From186540722023-11-26 6:30:35396 days ago1700980235IN
0xaf9CE4B3...FfbEa9FDf
0 ETH0.0009650317.41780735
Set Approval For...169989382023-04-07 20:22:47628 days ago1680898967IN
0xaf9CE4B3...FfbEa9FDf
0 ETH0.0011129423.93487129
Transfer From169159232023-03-27 3:01:59640 days ago1679886119IN
0xaf9CE4B3...FfbEa9FDf
0 ETH0.0010575219.08711903
Claim165937382023-02-09 21:00:23685 days ago1675976423IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0047476152.21867116
Transfer From151023892022-07-08 14:18:13901 days ago1657289893IN
0xaf9CE4B3...FfbEa9FDf
0 ETH0.0008704934.20146066
Claim150781822022-07-04 20:21:33905 days ago1656966093IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0005633723.51611298
Claim150781812022-07-04 20:21:10905 days ago1656966070IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0019801721.77984555
Claim Other150585382022-07-01 19:43:25908 days ago1656704605IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0065638166.55258578
Claim148334702022-05-24 3:36:05947 days ago1653363365IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0017936819.72865237
Claim148086852022-05-20 3:07:14951 days ago1653016034IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0020916723.00617267
Claim147119102022-05-04 16:09:20966 days ago1651680560IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.00968308106.50349618
Set Approval For...146853052022-04-30 11:20:27970 days ago1651317627IN
0xaf9CE4B3...FfbEa9FDf
0 ETH0.0011631424.96930363
Claim Other146625782022-04-26 21:49:29974 days ago1651009769IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0056117256.89907578
Claim Other146625612022-04-26 21:46:03974 days ago1651009563IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0052386453.12276001
Claim Other146625522022-04-26 21:43:52974 days ago1651009432IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0031606438.77423682
Claim Other146625272022-04-26 21:38:19974 days ago1651009099IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0043448144.06950428
Claim146625092022-04-26 21:35:56974 days ago1651008956IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0051231556.3491723
Claim Other146060012022-04-18 0:30:35983 days ago1650241835IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0041422942
Transfer From145777672022-04-13 15:00:21987 days ago1649862021IN
0xaf9CE4B3...FfbEa9FDf
0 ETH0.0018917974.32792639
Transfer From145777502022-04-13 14:56:44987 days ago1649861804IN
0xaf9CE4B3...FfbEa9FDf
0 ETH0.0015682365.3433175
Claim145427852022-04-08 3:33:20993 days ago1649388800IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0065006371.5
Claim Other145394542022-04-07 15:08:02993 days ago1649344082IN
0xaf9CE4B3...FfbEa9FDf
0.02 ETH0.0192678195.38608276
View all transactions

Latest 4 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
147630182022-05-12 19:56:18958 days ago1652385378
0xaf9CE4B3...FfbEa9FDf
0.12 ETH
146174952022-04-19 19:35:57981 days ago1650396957
0xaf9CE4B3...FfbEa9FDf
0.2 ETH
142816092022-02-26 12:04:161033 days ago1645877056
0xaf9CE4B3...FfbEa9FDf
0.5 ETH
142813242022-02-26 11:02:221033 days ago1645873342
0xaf9CE4B3...FfbEa9FDf
0.5 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SyntheticPunks

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license
File 1 of 3 : SyntheticPunks.sol
//  ______     __  __     __   __     ______   __  __     ______     ______   __     ______        ______   __  __     __   __     __  __     ______    
// /\  ___\   /\ \_\ \   /\ "-.\ \   /\__  _\ /\ \_\ \   /\  ___\   /\__  _\ /\ \   /\  ___\      /\  == \ /\ \/\ \   /\ "-.\ \   /\ \/ /    /\  ___\   
// \ \___  \  \ \____ \  \ \ \-.  \  \/_/\ \/ \ \  __ \  \ \  __\   \/_/\ \/ \ \ \  \ \ \____     \ \  _-/ \ \ \_\ \  \ \ \-.  \  \ \  _"-.  \ \___  \  
//  \/\_____\  \/\_____\  \ \_\\"\_\    \ \_\  \ \_\ \_\  \ \_____\    \ \_\  \ \_\  \ \_____\     \ \_\    \ \_____\  \ \_\\"\_\  \ \_\ \_\  \/\_____\ 
//   \/_____/   \/_____/   \/_/ \/_/     \/_/   \/_/\/_/   \/_____/     \/_/   \/_/   \/_____/      \/_/     \/_____/   \/_/ \/_/   \/_/\/_/   \/_____/ 
                                                                                                                                                     

// ................................................................................
// .....................................,,,........................................
// ...............................,,,,,,,,,,,,,,,..................................
// ............................,7777777777777777777,...............................
// .........................,,,,7777777777777777777,,,,............................
// ......................,,,,777~~~~~~~~~~~~~~~~~~~777,,,..........................
// ....................,,,,,:777,,,,,,,,,,,,,,,,,,,III:,,,,,.......................
// ..................,,,,=III~~~,,,,,,,,,,,,,,,,,,,~~~III=,,,,.....................
// .................,,,,,=III:::::::::::::::::::::::::III=,,,,,....................
// ................,,,777777777777777777777777777777777777777,,,...................
// ...............,,,,777777777777777777777777777777777777777,,,...................
// ................,,,777777777777777777777777777777777777777,,,...................
// ................,,,777777777777777777777777777777777777777,,,...................
// ................,,,===?II?=~~~~~~~~~~~~~~~~~~~~~~~~777+~~~,,,...................
// ................,,,,,,?III::,,,,,,,,,,,,,,,,,,,,,::777=,,,,,....................
// .................,,,,,IIII,,,,,,,,,,,,,,,,,,,,,,,,,777=,,,,,....................
// .................,,,,,I77I,,,,,..............,,,,,,777=,,,,.....................
// .................,,777===~,,,,................,,,,,777=,,,......................
// .................,,777~,,,,,,..................,,,,777=,,.......................
// .................,,777~,,,,,,777.............7II,,,777=,,.......................
// .................,,777~,,,,,,777,............777,,,777=,,.......................
// .................,,777?777,,,===,............===,,,777=,,.......................
// .................,,777?777,,,.................,,,,,777=,,.......................
// .................,,=+=+777,,,.................,,,,,777=,,.......................
// ..................,,,,+777,,,.................,,,,,777=,,.......................
// ..................,,,,+777,,,.........=777....,,,,,777=,,.......................
// ...................,,,=777,,,.........+777..,,,,,,,777=,,.......................
// ...................,,,+777,,,,.......,~++=,,,,,,,,,777=,,.......................
// ....................,,+777,,,,.....,,,,,,,,,,,,,,,,777=,,.......................
// .....................,=777,,,,,,,,,I777777777,,,,,,777=,........................
// .....................,+777,,,,,,,,,I777777777,,,,,,777=,........................
// .....................,=+++~~~,,,,,,=+++++++++,,,~~~+++~.........................
// ......................,,,:777,,,,,,,,,,,,,,,,,,,777:,,..........................
// ......................,,,:777,,,:::,,,,,,,,,,:::III:,...........................
// ......................,,,:777,,,777:,,,,,,,,:777,,,.............................
// ......................,,,:777,,,777~,,,,,,,,:777,,,.............................
// ......................,,,:777,,,,,,III?77?777,,,,...............................
// ......................,,,:777,,,,,,III?77?77I,,,,...............................
// .......................,,:777,,,,,,,,,:77?,,,,,.................................
// .......................,,,777,,,,,,,,,:77?,,,,..................................
// .........................,???,,,,,,,,,:??=,,,...................................
// ............................,.........,,,.,.....................................
// ................................................................................

//SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

import "@rari-capital/solmate/src/tokens/ERC721.sol";
import "./interfaces/ISyntheticPunksAssets.sol";

abstract contract ReverseRecords {
  function getNames(address[] calldata addresses) external view virtual returns (string[] memory r);
}

contract SyntheticPunks is ERC721 {

  ISyntheticPunksAssets public assets;
  uint256 public immutable claimPrice = 0.02 ether;
  address public immutable withdrawAddress;
  address immutable ensReverseAddress;
  string public constant claimMessage = "Message to claim Synthetic Punk";

  mapping(address => bool) public claimed;

  enum Gender { Male, Female }

  constructor(
    string memory _name, 
    string memory _symbol, 
    address _assetsAddress,
    address _withdrawAddress,
    address _ensReverseAddress
  ) ERC721(_name, _symbol) {
    assets = ISyntheticPunksAssets(_assetsAddress);
    withdrawAddress = _withdrawAddress;
    ensReverseAddress = _ensReverseAddress;
  }

  function claim() public payable {
    require(msg.value >= claimPrice, "Insufficient payment");
    _safeMint(msg.sender, getTokenID(msg.sender));
    claimed[msg.sender] = true;
    uint256 refund = msg.value - claimPrice;
    if (refund > 0) {
      payable(msg.sender).transfer(refund);
    }
  }

  function claimOther(address _signer, bytes memory _signature) public payable {
    require(msg.value >= claimPrice, "Insufficient payment");
    require(verify(_signer, claimMessage, _signature), "Invalid signature");

    _safeMint(msg.sender, getTokenID(_signer));
    claimed[_signer] = true;
    uint256 refund = msg.value - claimPrice;
    if (refund > 0) {
      payable(_signer).transfer(refund);
    }
  }

  

  function withdraw() public {
    payable(withdrawAddress).transfer(address(this).balance);
  }

  function _tokenURI(address _address) public view returns (string memory) {
    return tokenURI(getTokenID(_address));
  }

  function getTokenID(address _address) public pure returns (uint256) {
    return uint256(uint160(_address));
  }

  function getAddress(uint256 id) public pure returns (address) {
    return address(uint160(id));
  }

  function tokenURI(uint256 id) public view override returns (string memory) {
    uint256[] memory layers = getAttributes(id);
    string memory punkSVG = generatePunkSVG(layers);

    address userAddress = getAddress(id);
    string memory ensName = reverseName(userAddress);  
    string memory addressOrENS = bytes(ensName).length == 0 ? truncateAddress(userAddress) : ensName;
    string memory addressFullorENS = bytes(ensName).length == 0 ? toString(userAddress) : ensName;
    
    string memory json = base64(bytes(abi.encodePacked('{"name": "', 'Synthetic CryptoPunk for ', addressOrENS, '", "description": "This is a unique Punk claimed by ', addressFullorENS,'.", "image": "data:image/svg+xml;base64,', base64(bytes(punkSVG)), '"}')));

    return string(abi.encodePacked('data:application/json;base64,', json));
  }

  // Entropy 0
  function getGender(uint256 id) public view returns (Gender) {
    return randomUint(id, 0) % 2 == 0 ? Gender.Male : Gender.Female;
  }

  // Entropy 1,2-9
  function getAttributeCategories(uint256 id) public view returns (uint256[] memory) {
    uint256[4][9] memory spritesheetRanges = assets.spritesheetRanges();
    uint256 checks = 2 + randomUint(id, 1) % (spritesheetRanges.length - 3); // Number of bytes to check
    uint256[] memory attributes = new uint256[](checks);
    uint256 length = 0;
    for (uint256 i; i < checks; i++) {
      uint256 newAttribute = randomUint(id, 2+i) % (spritesheetRanges.length - 2) + 1; // Skip base category
      
      bool added = contains(attributes, newAttribute);

      if (added) {
        continue;
      }

      if (getGender(id) == Gender.Female) {
        if (!(spritesheetRanges[newAttribute][3] - spritesheetRanges[newAttribute][1] == 0)) {
          attributes[length] = newAttribute;
          length++;
        }
      } else {
        if (!(spritesheetRanges[newAttribute][2] - spritesheetRanges[newAttribute][0] == 0)) {
          attributes[length] = newAttribute;
          length++;
        }
      }
    }

    uint256[] memory attributesResized = new uint256[](length+1);
    attributesResized[0] = 0;
    for (uint256 i; i < length; i++) {
      attributesResized[i+1] = attributes[i];
    }

    return attributesResized;
  }

  // Entropy 10
  function getAttribute(uint256 id, uint256 _attributeId) public view returns (uint256) {
    uint256[4] memory ranges = assets.spritesheetRanges()[_attributeId];
    Gender gender = getGender(id);
    if (gender == Gender.Female) {
      return ranges[1] + randomUint(id, 10+_attributeId) % (ranges[3] - ranges[1]);
    } else {
      return ranges[0] + randomUint(id, 10+_attributeId) % (ranges[2] - ranges[0]);
    }
  }

  function _getAttributes(address _address) public view returns (uint256[] memory) {
    return getAttributes(getTokenID(_address));
  }

  function getAttributes(uint256 id) public view returns (uint256[] memory) {
    uint256[] memory attributeCategories = getAttributeCategories(id);
    uint256[] memory layers = new uint256[](attributeCategories.length);
    for (uint256 i = 0; i < attributeCategories.length; i++) {
      layers[i] = getAttribute(id, attributeCategories[i]);
    }
    return layers;
  }

  function generatePunkSVG(uint256[] memory layers) public view returns (string memory) {
    string memory start1 = '<svg viewBox="0 0 24 24" width="1000" xmlns="http://www.w3.org/2000/svg" ><defs><style>#spritesheet { image-rendering: -webkit-optimize-contrast; image-rendering: crisp-edges; image-rendering: pixelated; } svg { background : #1A1A1A; }</style><svg width="24" height="24" viewBox="48 0 24 24"><image id="spritesheet" preserveAspectRatio="xMinYMin slice" href="';
    string memory start3 = '"></image></svg></defs><svg id="punk">';
    string memory end = '</svg></svg>';
    string memory layersSVG = '';

    // Render in order
    for (uint256 i = 0; i < assets.spritesheetRanges().length; i++) {
      for (uint256 j = 0; j < layers.length; j++) {
        if (assets.spritesheetRanges()[i][0] <= layers[j] && layers[j] < assets.spritesheetRanges()[i][3]) { // if layer is in range
          uint256 id = layers[j];
          uint256 x = (id % 24) * 24;
          uint256 y = (id / 24) * 24;
          layersSVG = string(abi.encodePacked(layersSVG, '<svg width="24" height="24" viewBox="', toString(x), ' ', toString(y), ' 24 24"><use href="#spritesheet"></use></svg>'));
          break;
        }
      }
    }

    return string(abi.encodePacked(start1, assets.spritesheetImageData(), start3, layersSVG, end)) ;
  }
  
  function reverseName(address _address) internal view returns (string memory name) {
    if (address(0) == ensReverseAddress) {
      return name;
    }
    ReverseRecords ens = ReverseRecords(ensReverseAddress);
    address[] memory t = new address[](1);
    t[0] = _address;
    name = ens.getNames(t)[0];
  }

  function contains(uint256[] memory arr, uint256 element) internal pure returns (bool) {
    for (uint256 i = 0; i < arr.length; i++) {
      if (arr[i] == element) {
        return true;
      }
    }
    return false;
  }

  function randomUint(uint256 seed, uint256 offset) public view returns (uint256) {
    require(offset < 32, "Offset out of bounds");
    bytes32 entropy = keccak256(abi.encodePacked(address(this), seed));
    bytes32 mask = bytes32(0xff << (offset * 8));
    uint256 out = uint256((entropy & mask) >> (offset * 8));
    return out;
  }

  function truncateAddress(address _address) internal pure returns (string memory) {
    string memory addressString = toString(_address);
    bytes memory addressBytes = bytes(addressString);
    bytes memory str = new bytes(13);
    uint count = 0;
    for (uint i = 0; i < 6; i++) {
      str[count++] = addressBytes[i];
    }
    for (uint256 i = 0; i < 3; i++) {
      str[count++] = ".";
    }
    for (uint i = addressBytes.length-4; i < addressBytes.length; i++) {
      str[count++] = addressBytes[i];
    }

    return string(str);
  }

  function toString(address account) internal pure returns(string memory) {
    return toString(abi.encodePacked(account));
  }

  function toString(bytes32 value) internal pure returns(string memory) {
    return toString(abi.encodePacked(value));
  }

  function toString(bytes memory data) internal pure returns(string memory) {
    bytes memory alphabet = "0123456789abcdef";

    bytes memory str = new bytes(2 + data.length * 2);
    str[0] = "0";
    str[1] = "x";
    for (uint i = 0; i < data.length; i++) {
        str[2+i*2] = alphabet[uint(uint8(data[i] >> 4))];
        str[3+i*2] = alphabet[uint(uint8(data[i] & 0x0f))];
    }
    return string(str);
  }

  function toString(uint256 n) 
      internal 
      pure 
      returns (string memory nstr) 
  {
    uint256 MAX_UINT256_STRING_LENGTH = 78;
    uint8 ASCII_DIGIT_OFFSET = 48;
    if (n == 0) {
        return "0";
    }
    // Overallocate memory
    nstr = new string(MAX_UINT256_STRING_LENGTH);
    uint256 k = MAX_UINT256_STRING_LENGTH;
    // Populate string from right to left (lsb to msb).
    while (n != 0) {
      assembly {
        let char := add(
          ASCII_DIGIT_OFFSET,
          mod(n, 10)
        )
        mstore(add(nstr, k), char)
        k := sub(k, 1)
        n := div(n, 10)
      }
    }
    assembly {
      // Shift pointer over to actual start of string.
      nstr := add(nstr, k)
      // Store actual string length.
      mstore(nstr, sub(MAX_UINT256_STRING_LENGTH, k))
    }
    return nstr;
  }

  /// @notice Encodes some bytes to the base64 representation
  function base64(bytes memory data) internal pure returns (string memory) {
    bytes memory TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    uint256 len = data.length;
    if (len == 0) return "";

    // multiply by 4/3 rounded up
    uint256 encodedLen = 4 * ((len + 2) / 3);

    // Add some extra buffer at the end
    bytes memory result = new bytes(encodedLen + 32);

    bytes memory table = TABLE;

    assembly {
      let tablePtr := add(table, 1)
      let resultPtr := add(result, 32)

      for {
        let i := 0
      } lt(i, len) {

      } {
        i := add(i, 3)
        let input := and(mload(add(data, i)), 0xffffff)

        let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
        out := shl(8, out)
        out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
        out := shl(8, out)
        out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
        out := shl(8, out)
        out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
        out := shl(224, out)

        mstore(resultPtr, out)

        resultPtr := add(resultPtr, 4)
      }

      switch mod(len, 3)
      case 1 {
          mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
      }
      case 2 {
          mstore(sub(resultPtr, 1), shl(248, 0x3d))
      }

      mstore(result, encodedLen)
    }

    return string(result);
  }

  // ECDSA

  function getMessageHash(
    string memory _message
  ) public pure returns (bytes32) {
    return keccak256(abi.encodePacked(_message));
  }

  function getEthSignedMessageHash(bytes32 _messageHash)
    public
    pure 
    returns (bytes32)
  {
    return
      keccak256(
        abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash)
      );
  }

  function verify(
    address _signer,
    string memory _message,
    bytes memory signature
  ) public pure returns (bool) {
    bytes32 messageHash = getMessageHash(_message);
    bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);

    return recoverSigner(ethSignedMessageHash, signature) == _signer;
  }

  function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature)
    public
    pure
    returns (address)
  {
    (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);

    return ecrecover(_ethSignedMessageHash, v, r, s);
  }

  function splitSignature(bytes memory sig)
    public
    pure
    returns (
        bytes32 r,
        bytes32 s,
        uint8 v
    )
  {
    require(sig.length == 65, "invalid signature length");

    assembly {
      // first 32 bytes, after the length prefix
      r := mload(add(sig, 32))
      // second 32 bytes
      s := mload(add(sig, 64))
      // final byte (first byte of the next 32 bytes)
      v := byte(0, mload(add(sig, 96)))
    }
  }
}

File 2 of 3 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
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 3 of 3 : ISyntheticPunksAssets.sol
//SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

interface ISyntheticPunksAssets {
  function spritesheetImageData() external view returns (string memory);
  function spritesheetRanges() external view returns (uint256[4][9] memory);
  function attributesContentURI() external view returns (string memory);
}

Settings
{
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_assetsAddress","type":"address"},{"internalType":"address","name":"_withdrawAddress","type":"address"},{"internalType":"address","name":"_ensReverseAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"_getAttributes","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"_tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assets","outputs":[{"internalType":"contract ISyntheticPunksAssets","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"claimOther","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"layers","type":"uint256[]"}],"name":"generatePunkSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"_attributeId","type":"uint256"}],"name":"getAttribute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getAttributeCategories","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getAttributes","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_messageHash","type":"bytes32"}],"name":"getEthSignedMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getGender","outputs":[{"internalType":"enum SyntheticPunks.Gender","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_message","type":"string"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"offset","type":"uint256"}],"name":"randomUint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_ethSignedMessageHash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"splitSignature","outputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"string","name":"_message","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60e060405266470de4df8200006080908152503480156200001f57600080fd5b50604051620062473803806200624783398181016040528101906200004591906200026e565b848481600090805190602001906200005f92919062000135565b5080600190805190602001906200007892919062000135565b50505082600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250505050505050620004a1565b8280546200014390620003f3565b90600052602060002090601f016020900481019282620001675760008555620001b3565b82601f106200018257805160ff1916838001178555620001b3565b82800160010185558215620001b3579182015b82811115620001b257825182559160200191906001019062000195565b5b509050620001c29190620001c6565b5090565b5b80821115620001e1576000816000905550600101620001c7565b5090565b6000620001fc620001f68462000356565b62000322565b9050828152602081018484840111156200021557600080fd5b62000222848285620003bd565b509392505050565b6000815190506200023b8162000487565b92915050565b600082601f8301126200025357600080fd5b815162000265848260208601620001e5565b91505092915050565b600080600080600060a086880312156200028757600080fd5b600086015167ffffffffffffffff811115620002a257600080fd5b620002b08882890162000241565b955050602086015167ffffffffffffffff811115620002ce57600080fd5b620002dc8882890162000241565b9450506040620002ef888289016200022a565b935050606062000302888289016200022a565b925050608062000315888289016200022a565b9150509295509295909350565b6000604051905081810181811067ffffffffffffffff821117156200034c576200034b62000458565b5b8060405250919050565b600067ffffffffffffffff82111562000374576200037362000458565b5b601f19601f8301169050602081019050919050565b600062000396826200039d565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620003dd578082015181840152602081019050620003c0565b83811115620003ed576000848401525b50505050565b600060028204905060018216806200040c57607f821691505b6020821081141562000423576200042262000429565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004928162000389565b81146200049e57600080fd5b50565b60805160a05160601c60c05160601c615d46620005016000396000818161314901526131a5015260008181610c9e015261117d015260008181610cc201528181611485015281816115540152818161271d015261286b0152615d466000f3fe60806040526004361061020f5760003560e01c806378619bdf11610118578063b88d4fde116100a0578063d61b051b1161006f578063d61b051b1461082f578063e06d2eb51461086c578063e985e9c5146108a9578063fa540801146108e6578063fe0bc600146109235761020f565b8063b88d4fde1461074f578063b93f9b0a14610778578063c87b56dd146107b5578063c884ef83146107f25761020f565b80639d4776b2116100e75780639d4776b214610651578063a22cb4651461066d578063a7bb580314610696578063af4fb353146106d5578063b446f3b2146107125761020f565b806378619bdf1461056f57806385d940ec146105ac57806395d89b41146105e957806397aba7f9146106145761020f565b80633ccfd60b1161019b5780636352211e1161016a5780636352211e1461045057806363f8071c1461048d57806370a08231146104ca57806371a97305146105075780637685945e146105325761020f565b80633ccfd60b146103c957806342842e0e146103e05780634378a6e3146104095780634e71d92d146104465761020f565b80631581b600116101e25780631581b600146102e257806315d655c91461030d57806323b872dd146103385780632dd34f0f146103615780633b85df721461039e5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061468e565b610960565b6040516102489190615275565b60405180910390f35b34801561025d57600080fd5b506102666109f2565b604051610273919061535d565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906147a3565b610a80565b6040516102b09190615180565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190614529565b610ab3565b005b3480156102ee57600080fd5b506102f7610c9c565b6040516103049190615180565b60405180910390f35b34801561031957600080fd5b50610322610cc0565b60405161032f919061549f565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a9190614350565b610ce4565b005b34801561036d57600080fd5b50610388600480360381019061038391906144aa565b6110e4565b6040516103959190615275565b60405180910390f35b3480156103aa57600080fd5b506103b3611142565b6040516103c0919061535d565b60405180910390f35b3480156103d557600080fd5b506103de61117b565b005b3480156103ec57600080fd5b5061040760048036038101906104029190614350565b6111e4565b005b34801561041557600080fd5b50610430600480360381019061042b91906147a3565b611347565b60405161043d9190615253565b60405180910390f35b61044e611483565b005b34801561045c57600080fd5b50610477600480360381019061047291906147a3565b6115d4565b6040516104849190615180565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af91906142eb565b611607565b6040516104c1919061549f565b60405180910390f35b3480156104d657600080fd5b506104f160048036038101906104ec91906142eb565b611627565b6040516104fe919061549f565b60405180910390f35b34801561051357600080fd5b5061051c61163f565b6040516105299190615327565b60405180910390f35b34801561053e57600080fd5b50610559600480360381019061055491906147cc565b611665565b604051610566919061549f565b60405180910390f35b34801561057b57600080fd5b50610596600480360381019061059191906145d0565b6119c3565b6040516105a3919061535d565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce91906147a3565b611f8e565b6040516105e09190615253565b60405180910390f35b3480156105f557600080fd5b506105fe61261e565b60405161060b919061535d565b60405180910390f35b34801561062057600080fd5b5061063b6004803603810190610636919061463a565b6126ac565b6040516106489190615180565b60405180910390f35b61066b60048036038101906106669190614456565b61271b565b005b34801561067957600080fd5b50610694600480360381019061068f919061441a565b6128ed565b005b3480156106a257600080fd5b506106bd60048036038101906106b891906146e0565b6129ea565b6040516106cc939291906152ab565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f791906142eb565b612a52565b604051610709919061535d565b60405180910390f35b34801561071e57600080fd5b5061073960048036038101906107349190614721565b612a6c565b6040516107469190615290565b60405180910390f35b34801561075b57600080fd5b506107766004803603810190610771919061439f565b612a9c565b005b34801561078457600080fd5b5061079f600480360381019061079a91906147a3565b612c02565b6040516107ac9190615180565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d791906147a3565b612c0c565b6040516107e9919061535d565b60405180910390f35b3480156107fe57600080fd5b50610819600480360381019061081491906142eb565b612ce0565b6040516108269190615275565b60405180910390f35b34801561083b57600080fd5b50610856600480360381019061085191906147cc565b612d00565b604051610863919061549f565b60405180910390f35b34801561087857600080fd5b50610893600480360381019061088e91906147a3565b612daf565b6040516108a09190615342565b60405180910390f35b3480156108b557600080fd5b506108d060048036038101906108cb9190614314565b612ddf565b6040516108dd9190615275565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190614611565b612e0e565b60405161091a9190615290565b60405180910390f35b34801561092f57600080fd5b5061094a600480360381019061094591906142eb565b612e3e565b6040516109579190615253565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109bb57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109eb5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600080546109ff906158cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2b906158cf565b8015610a785780601f10610a4d57610100808354040283529160200191610a78565b820191906000526020600020905b815481529060010190602001808311610a5b57829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610bab5750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be19061545f565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c9061547f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec9061539f565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e8d57506004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610f1e5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f549061545f565b60405180910390fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000806110f084612a6c565b905060006110fd82612e0e565b90508573ffffffffffffffffffffffffffffffffffffffff1661112082866126ac565b73ffffffffffffffffffffffffffffffffffffffff1614925050509392505050565b6040518060400160405280601f81526020017f4d65737361676520746f20636c61696d2053796e7468657469632050756e6b0081525081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111e1573d6000803e3d6000fd5b50565b6111ef838383610ce4565b60008273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c511480611303575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b8152600401611290939291906151e7565b602060405180830381600087803b1580156112aa57600080fd5b505af11580156112be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e291906146b7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611342576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611339906153df565b60405180910390fd5b505050565b6060600061135483611f8e565b90506000815167ffffffffffffffff811115611399577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156113c75781602001602082028036833780820191505090505b50905060005b82518110156114785761142085848381518110611413577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611665565b828281518110611459577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061147090615901565b9150506113cd565b508092505050919050565b7f00000000000000000000000000000000000000000000000000000000000000003410156114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd906153bf565b60405180910390fd5b6114f8336114f333611607565b612e58565b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060007f00000000000000000000000000000000000000000000000000000000000000003461157e9190615785565b905060008111156115d1573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115cf573d6000803e3d6000fd5b505b50565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff169050919050565b60026020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a161b7c6040518163ffffffff1660e01b81526004016104806040518083038186803b1580156116d157600080fd5b505afa1580156116e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117099190614565565b8360098110611741577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201519050600061175385612daf565b905060018081111561178e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160018111156117c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156118c75781600160048110611807577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015182600360048110611846577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516118559190615785565b61186b8686600a61186691906156a4565b612d00565b6118759190615982565b826001600481106118af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516118be91906156a4565b925050506119bd565b81600060048110611901577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015182600260048110611940577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015161194f9190615785565b6119658686600a61196091906156a4565b612d00565b61196f9190615982565b826000600481106119a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516119b891906156a4565b925050505b92915050565b60606000604051806101a001604052806101678152602001615baa610167913990506000604051806060016040528060268152602001615b8460269139905060006040518060400160405280600c81526020017f3c2f7376673e3c2f7376673e00000000000000000000000000000000000000008152509050600060405180602001604052806000815250905060005b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a161b7c6040518163ffffffff1660e01b81526004016104806040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af49190614565565b506009811015611eb65760005b8751811015611ea257878181518110611b43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a161b7c6040518163ffffffff1660e01b81526004016104806040518083038186803b158015611bb457600080fd5b505afa158015611bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bec9190614565565b8360098110611c24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600060048110611c62577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015111158015611dcf5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a161b7c6040518163ffffffff1660e01b81526004016104806040518083038186803b158015611cd957600080fd5b505afa158015611ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d119190614565565b8260098110611d49577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600360048110611d87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151888281518110611dc5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151105b15611e8f576000888281518110611e0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600060188083611e299190615982565b611e33919061572b565b9050600060188084611e4591906156fa565b611e4f919061572b565b905085611e5b83612fba565b611e6483612fba565b604051602001611e769392919061507e565b6040516020818303038152906040529550505050611ea2565b8080611e9a90615901565b915050611b01565b508080611eae90615901565b915050611a53565b5083600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166360787be36040518163ffffffff1660e01b815260040160006040518083038186803b158015611f2057600080fd5b505afa158015611f34573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f5d9190614762565b848385604051602001611f74959493929190615033565b604051602081830303815290604052945050505050919050565b60606000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a161b7c6040518163ffffffff1660e01b81526004016104806040518083038186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120339190614565565b90506000600360096120459190615785565b612050856001612d00565b61205a9190615982565b600261206691906156a4565b905060008167ffffffffffffffff8111156120aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156120d85781602001602082028036833780820191505090505b5090506000805b838110156124985760006001600260096120f99190615785565b61210f8a85600261210a91906156a4565b612d00565b6121199190615982565b61212391906156a4565b9050600061213185836130c3565b90508015612140575050612485565b600180811115612179577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6121828a612daf565b60018111156121ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156123235760008783600981106121fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600160048110612239577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151888460098110612277577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516003600481106122b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516122c49190615785565b1461231e5781858581518110612303577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050838061231a90615901565b9450505b612482565b600087836009811061235e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160006004811061239c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518884600981106123da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600260048110612418577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516124279190615785565b146124815781858581518110612466577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050838061247d90615901565b9450505b5b50505b808061249090615901565b9150506120df565b5060006001826124a891906156a4565b67ffffffffffffffff8111156124e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156125155781602001602082028036833780820191505090505b509050600081600081518110612554577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060005b82811015612610578381815181106125a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151826001836125ba91906156a4565b815181106125f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061260890615901565b915050612563565b508095505050505050919050565b6001805461262b906158cf565b80601f0160208091040260200160405190810160405280929190818152602001828054612657906158cf565b80156126a45780601f10612679576101008083540402835291602001916126a4565b820191906000526020600020905b81548152906001019060200180831161268757829003601f168201915b505050505081565b6000806000806126bb856129ea565b925092509250600186828585604051600081526020016040526040516126e494939291906152e2565b6020604051602081039080840390855afa158015612706573d6000803e3d6000fd5b50505060206040510351935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000034101561277e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612775906153bf565b60405180910390fd5b6127be826040518060400160405280601f81526020017f4d65737361676520746f20636c61696d2053796e7468657469632050756e6b00815250836110e4565b6127fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f49061537f565b60405180910390fd5b61280f3361280a84611607565b612e58565b6001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060007f0000000000000000000000000000000000000000000000000000000000000000346128959190615785565b905060008111156128e8578273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156128e6573d6000803e3d6000fd5b505b505050565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129de9190615275565b60405180910390a35050565b60008060006041845114612a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2a9061541f565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b6060612a65612a6083611607565b612c0c565b9050919050565b600081604051602001612a7f919061501c565b604051602081830303815290604052805190602001209050919050565b612aa7848484610ce4565b60008373ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c511480612bbd575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b8152600401612b4a949392919061519b565b602060405180830381600087803b158015612b6457600080fd5b505af1158015612b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9c91906146b7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b612bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf3906153df565b60405180910390fd5b50505050565b6000819050919050565b60606000612c1983611347565b90506000612c26826119c3565b90506000612c3385612c02565b90506000612c4082613145565b9050600080825114612c525781612c5c565b612c5b83613388565b5b9050600080835114612c6e5782612c78565b612c7784613696565b5b90506000612cb08383612c8a896136c7565b604051602001612c9c939291906150f6565b6040516020818303038152906040526136c7565b905080604051602001612cc3919061515e565b604051602081830303815290604052975050505050505050919050565b60076020528060005260406000206000915054906101000a900460ff1681565b600060208210612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c906153ff565b60405180910390fd5b60003084604051602001612d5a929190614ff0565b6040516020818303038152906040528051906020012090506000600884612d81919061572b565b60ff901b60001b90506000600885612d99919061572b565b828416901c60001c905080935050505092915050565b6000806002612dbf846000612d00565b612dc99190615982565b14612dd5576001612dd8565b60005b9050919050565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600081604051602001612e2191906150d0565b604051602081830303815290604052805190602001209050919050565b6060612e51612e4c83611607565b611347565b9050919050565b612e62828261388c565b60008273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c511480612f77575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a02336000856040518463ffffffff1660e01b8152600401612f04939291906151e7565b602060405180830381600087803b158015612f1e57600080fd5b505af1158015612f32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5691906146b7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b612fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fad906153df565b60405180910390fd5b5050565b60606000604e90506000603090506000841415613010576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250925050506130be565b8167ffffffffffffffff811115613050577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130825781602001600182028036833780820191505090505b50925060008290505b600085146130b057600a850682018082860152600182039150600a860495505061308b565b808401935080830384525050505b919050565b600080600090505b8351811015613139578284828151811061310e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151141561312657600191505061313f565b808061313190615901565b9150506130cb565b50600090505b92915050565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614156131a157613383565b60007f000000000000000000000000000000000000000000000000000000000000000090506000600167ffffffffffffffff811115613209577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156132375781602001602082028036833780820191505090505b5090508381600081518110613275577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1663cbf8b66c826040518263ffffffff1660e01b81526004016132e89190615231565b60006040518083038186803b15801561330057600080fd5b505afa158015613314573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061333d919061458f565b600081518110613376577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151925050505b919050565b6060600061339583613696565b905060008190506000600d67ffffffffffffffff8111156133df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134115781602001600182028036833780820191505090505b5090506000805b60068110156134ec5783818151811061345a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b83838061347190615901565b9450815181106134aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806134e490615901565b915050613418565b5060005b60038110156135a1577f2e0000000000000000000000000000000000000000000000000000000000000083838061352690615901565b94508151811061355f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061359990615901565b9150506134f0565b506000600484516135b29190615785565b90505b8351811015613689578381815181106135f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b83838061360e90615901565b945081518110613647577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061368190615901565b9150506135b5565b5081945050505050919050565b60606136c0826040516020016136ac9190614fd5565b604051602081830303815290604052613a9f565b9050919050565b60606000604051806060016040528060408152602001615b44604091399050600083519050600081141561370e576040518060200160405280600081525092505050613887565b6000600360028361371f91906156a4565b61372991906156fa565b6004613735919061572b565b9050600060208261374691906156a4565b67ffffffffffffffff811115613785577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137b75781602001600182028036833780820191505090505b5090506000849050600181016020830160005b868110156138435760038101905062ffffff818b015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506137ca565b50600386066001811461385d576002811461386d57613878565b613d3d60f01b6002830352613878565b603d60f81b60018303525b50848452505081955050505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f39061539f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461399e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139959061543f565b60405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606060006040518060400160405280601081526020017f30313233343536373839616263646566000000000000000000000000000000008152509050600060028451613aeb919061572b565b6002613af791906156a4565b67ffffffffffffffff811115613b36577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613b685781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613bc6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613c50577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b8451811015613ee457826004868381518110613cc7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff1681518110613d33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b82600283613d4c919061572b565b6002613d5891906156a4565b81518110613d8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535082600f60f81b868381518110613dfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b1660f81c60ff1681518110613e46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b82600283613e5f919061572b565b6003613e6b91906156a4565b81518110613ea2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080613edc90615901565b915050613c82565b508092505050919050565b6000613f02613efd846154eb565b6154ba565b90508082856080860282011115613f1857600080fd5b60005b85811015613f485781613f2e888261419e565b845260208401935060808301925050600181019050613f1b565b5050509392505050565b6000613f65613f6084615511565b6154ba565b9050808382526020820190508260005b85811015613fa55781518501613f8b8882614297565b845260208401935060208301925050600181019050613f75565b5050509392505050565b6000613fc2613fbd8461553d565b6154ba565b90508082856020860282011115613fd857600080fd5b60005b858110156140085781613fee88826142d6565b845260208401935060208301925050600181019050613fdb565b5050509392505050565b600061402561402084615563565b6154ba565b9050808382526020820190508285602086028201111561404457600080fd5b60005b85811015614074578161405a88826142c1565b845260208401935060208301925050600181019050614047565b5050509392505050565b600061409161408c8461558f565b6154ba565b9050828152602081018484840111156140a957600080fd5b6140b484828561588d565b509392505050565b60006140cf6140ca846155bf565b6154ba565b9050828152602081018484840111156140e757600080fd5b6140f284828561588d565b509392505050565b600061410d614108846155bf565b6154ba565b90508281526020810184848401111561412557600080fd5b61413084828561589c565b509392505050565b60008135905061414781615ad0565b92915050565b600082601f83011261415e57600080fd5b600961416b848285613eef565b91505092915050565b600082601f83011261418557600080fd5b8151614195848260208601613f52565b91505092915050565b600082601f8301126141af57600080fd5b60046141bc848285613faf565b91505092915050565b600082601f8301126141d657600080fd5b81356141e6848260208601614012565b91505092915050565b6000813590506141fe81615ae7565b92915050565b60008135905061421381615afe565b92915050565b60008135905061422881615b15565b92915050565b60008151905061423d81615b15565b92915050565b600082601f83011261425457600080fd5b813561426484826020860161407e565b91505092915050565b600082601f83011261427e57600080fd5b813561428e8482602086016140bc565b91505092915050565b600082601f8301126142a857600080fd5b81516142b88482602086016140fa565b91505092915050565b6000813590506142d081615b2c565b92915050565b6000815190506142e581615b2c565b92915050565b6000602082840312156142fd57600080fd5b600061430b84828501614138565b91505092915050565b6000806040838503121561432757600080fd5b600061433585828601614138565b925050602061434685828601614138565b9150509250929050565b60008060006060848603121561436557600080fd5b600061437386828701614138565b935050602061438486828701614138565b9250506040614395868287016142c1565b9150509250925092565b600080600080608085870312156143b557600080fd5b60006143c387828801614138565b94505060206143d487828801614138565b93505060406143e5878288016142c1565b925050606085013567ffffffffffffffff81111561440257600080fd5b61440e87828801614243565b91505092959194509250565b6000806040838503121561442d57600080fd5b600061443b85828601614138565b925050602061444c858286016141ef565b9150509250929050565b6000806040838503121561446957600080fd5b600061447785828601614138565b925050602083013567ffffffffffffffff81111561449457600080fd5b6144a085828601614243565b9150509250929050565b6000806000606084860312156144bf57600080fd5b60006144cd86828701614138565b935050602084013567ffffffffffffffff8111156144ea57600080fd5b6144f68682870161426d565b925050604084013567ffffffffffffffff81111561451357600080fd5b61451f86828701614243565b9150509250925092565b6000806040838503121561453c57600080fd5b600061454a85828601614138565b925050602061455b858286016142c1565b9150509250929050565b6000610480828403121561457857600080fd5b60006145868482850161414d565b91505092915050565b6000602082840312156145a157600080fd5b600082015167ffffffffffffffff8111156145bb57600080fd5b6145c784828501614174565b91505092915050565b6000602082840312156145e257600080fd5b600082013567ffffffffffffffff8111156145fc57600080fd5b614608848285016141c5565b91505092915050565b60006020828403121561462357600080fd5b600061463184828501614204565b91505092915050565b6000806040838503121561464d57600080fd5b600061465b85828601614204565b925050602083013567ffffffffffffffff81111561467857600080fd5b61468485828601614243565b9150509250929050565b6000602082840312156146a057600080fd5b60006146ae84828501614219565b91505092915050565b6000602082840312156146c957600080fd5b60006146d78482850161422e565b91505092915050565b6000602082840312156146f257600080fd5b600082013567ffffffffffffffff81111561470c57600080fd5b61471884828501614243565b91505092915050565b60006020828403121561473357600080fd5b600082013567ffffffffffffffff81111561474d57600080fd5b6147598482850161426d565b91505092915050565b60006020828403121561477457600080fd5b600082015167ffffffffffffffff81111561478e57600080fd5b61479a84828501614297565b91505092915050565b6000602082840312156147b557600080fd5b60006147c3848285016142c1565b91505092915050565b600080604083850312156147df57600080fd5b60006147ed858286016142c1565b92505060206147fe858286016142c1565b9150509250929050565b60006148148383614838565b60208301905092915050565b600061482c8383614f91565b60208301905092915050565b614841816157b9565b82525050565b614850816157b9565b82525050565b614867614862826157b9565b61594a565b82525050565b60006148788261560f565b6148828185615655565b935061488d836155ef565b8060005b838110156148be5781516148a58882614808565b97506148b08361563b565b925050600181019050614891565b5085935050505092915050565b60006148d68261561a565b6148e08185615666565b93506148eb836155ff565b8060005b8381101561491c5781516149038882614820565b975061490e83615648565b9250506001810190506148ef565b5085935050505092915050565b614932816157cb565b82525050565b614941816157d7565b82525050565b614958614953826157d7565b61595c565b82525050565b600061496982615625565b6149738185615677565b935061498381856020860161589c565b61498c81615a9e565b840191505092915050565b6149a081615857565b82525050565b6149af8161587b565b82525050565b60006149c082615630565b6149ca8185615688565b93506149da81856020860161589c565b6149e381615a9e565b840191505092915050565b60006149f982615630565b614a038185615699565b9350614a1381856020860161589c565b80840191505092915050565b6000614a2c601c83615699565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b6000614a6c601183615688565b91507f496e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000614aac602583615699565b91507f3c7376672077696474683d22323422206865696768743d22323422207669657760008301527f426f783d220000000000000000000000000000000000000000000000000000006020830152602582019050919050565b6000614b12601983615699565b91507f53796e7468657469632043727970746f50756e6b20666f7220000000000000006000830152601982019050919050565b6000614b52601183615688565b91507f494e56414c49445f524543495049454e540000000000000000000000000000006000830152602082019050919050565b6000614b92600183615699565b91507f20000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614bd2600283615699565b91507f227d0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000614c12601483615688565b91507f496e73756666696369656e74207061796d656e740000000000000000000000006000830152602082019050919050565b6000614c52603483615699565b91507f222c20226465736372697074696f6e223a202254686973206973206120756e6960008301527f7175652050756e6b20636c61696d6564206279200000000000000000000000006020830152603482019050919050565b6000614cb8601083615688565b91507f554e534146455f524543495049454e54000000000000000000000000000000006000830152602082019050919050565b6000614cf8600a83615699565b91507f7b226e616d65223a2022000000000000000000000000000000000000000000006000830152600a82019050919050565b6000614d38602883615699565b91507f2e222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c60008301527f3b6261736536342c0000000000000000000000000000000000000000000000006020830152602882019050919050565b6000614d9e601d83615699565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b6000614dde601483615688565b91507f4f6666736574206f7574206f6620626f756e64730000000000000000000000006000830152602082019050919050565b6000614e1e600083615677565b9150600082019050919050565b6000614e38602d83615699565b91507f203234203234223e3c75736520687265663d222373707269746573686565742260008301527f3e3c2f7573653e3c2f7376673e000000000000000000000000000000000000006020830152602d82019050919050565b6000614e9e601883615688565b91507f696e76616c6964207369676e6174757265206c656e67746800000000000000006000830152602082019050919050565b6000614ede600e83615688565b91507f414c52454144595f4d494e5445440000000000000000000000000000000000006000830152602082019050919050565b6000614f1e600e83615688565b91507f4e4f545f415554484f52495a45440000000000000000000000000000000000006000830152602082019050919050565b6000614f5e600a83615688565b91507f57524f4e475f46524f4d000000000000000000000000000000000000000000006000830152602082019050919050565b614f9a81615840565b82525050565b614fa981615840565b82525050565b614fc0614fbb82615840565b615978565b82525050565b614fcf8161584a565b82525050565b6000614fe18284614856565b60148201915081905092915050565b6000614ffc8285614856565b60148201915061500c8284614faf565b6020820191508190509392505050565b600061502882846149ee565b915081905092915050565b600061503f82886149ee565b915061504b82876149ee565b915061505782866149ee565b915061506382856149ee565b915061506f82846149ee565b91508190509695505050505050565b600061508a82866149ee565b915061509582614a9f565b91506150a182856149ee565b91506150ac82614b85565b91506150b882846149ee565b91506150c382614e2b565b9150819050949350505050565b60006150db82614a1f565b91506150e78284614947565b60208201915081905092915050565b600061510182614ceb565b915061510c82614b05565b915061511882866149ee565b915061512382614c45565b915061512f82856149ee565b915061513a82614d2b565b915061514682846149ee565b915061515182614bc5565b9150819050949350505050565b600061516982614d91565b915061517582846149ee565b915081905092915050565b60006020820190506151956000830184614847565b92915050565b60006080820190506151b06000830187614847565b6151bd6020830186614847565b6151ca6040830185614fa0565b81810360608301526151dc818461495e565b905095945050505050565b60006080820190506151fc6000830186614847565b6152096020830185614847565b6152166040830184614fa0565b818103606083015261522781614e11565b9050949350505050565b6000602082019050818103600083015261524b818461486d565b905092915050565b6000602082019050818103600083015261526d81846148cb565b905092915050565b600060208201905061528a6000830184614929565b92915050565b60006020820190506152a56000830184614938565b92915050565b60006060820190506152c06000830186614938565b6152cd6020830185614938565b6152da6040830184614fc6565b949350505050565b60006080820190506152f76000830187614938565b6153046020830186614fc6565b6153116040830185614938565b61531e6060830184614938565b95945050505050565b600060208201905061533c6000830184614997565b92915050565b600060208201905061535760008301846149a6565b92915050565b6000602082019050818103600083015261537781846149b5565b905092915050565b6000602082019050818103600083015261539881614a5f565b9050919050565b600060208201905081810360008301526153b881614b45565b9050919050565b600060208201905081810360008301526153d881614c05565b9050919050565b600060208201905081810360008301526153f881614cab565b9050919050565b6000602082019050818103600083015261541881614dd1565b9050919050565b6000602082019050818103600083015261543881614e91565b9050919050565b6000602082019050818103600083015261545881614ed1565b9050919050565b6000602082019050818103600083015261547881614f11565b9050919050565b6000602082019050818103600083015261549881614f51565b9050919050565b60006020820190506154b46000830184614fa0565b92915050565b6000604051905081810181811067ffffffffffffffff821117156154e1576154e0615a6f565b5b8060405250919050565b600067ffffffffffffffff82111561550657615505615a6f565b5b602082029050919050565b600067ffffffffffffffff82111561552c5761552b615a6f565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561555857615557615a6f565b5b602082029050919050565b600067ffffffffffffffff82111561557e5761557d615a6f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156155aa576155a9615a6f565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156155da576155d9615a6f565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006156af82615840565b91506156ba83615840565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156156ef576156ee6159b3565b5b828201905092915050565b600061570582615840565b915061571083615840565b9250826157205761571f6159e2565b5b828204905092915050565b600061573682615840565b915061574183615840565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561577a576157796159b3565b5b828202905092915050565b600061579082615840565b915061579b83615840565b9250828210156157ae576157ad6159b3565b5b828203905092915050565b60006157c482615820565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061581b82615abc565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061586282615869565b9050919050565b600061587482615820565b9050919050565b60006158868261580d565b9050919050565b82818337600083830152505050565b60005b838110156158ba57808201518184015260208101905061589f565b838111156158c9576000848401525b50505050565b600060028204905060018216806158e757607f821691505b602082108114156158fb576158fa615a40565b5b50919050565b600061590c82615840565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561593f5761593e6159b3565b5b600182019050919050565b600061595582615966565b9050919050565b6000819050919050565b600061597182615aaf565b9050919050565b6000819050919050565b600061598d82615840565b915061599883615840565b9250826159a8576159a76159e2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60028110615acd57615acc615a11565b5b50565b615ad9816157b9565b8114615ae457600080fd5b50565b615af0816157cb565b8114615afb57600080fd5b50565b615b07816157d7565b8114615b1257600080fd5b50565b615b1e816157e1565b8114615b2957600080fd5b50565b615b3581615840565b8114615b4057600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f223e3c2f696d6167653e3c2f7376673e3c2f646566733e3c7376672069643d2270756e6b223e3c7376672076696577426f783d22302030203234203234222077696474683d22313030302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722203e3c646566733e3c7374796c653e237370726974657368656574207b20696d6167652d72656e646572696e673a202d7765626b69742d6f7074696d697a652d636f6e74726173743b20696d6167652d72656e646572696e673a2063726973702d65646765733b20696d6167652d72656e646572696e673a20706978656c617465643b207d20737667207b206261636b67726f756e64203a20233141314131413b207d3c2f7374796c653e3c7376672077696474683d22323422206865696768743d223234222076696577426f783d2234382030203234203234223e3c696d6167652069643d22737072697465736865657422207072657365727665417370656374526174696f3d22784d696e594d696e20736c6963652220687265663d22a264697066735822122019e8a97e700092f7524391bbdbe5fd004d9f981c29ab8b0f1d9bd6ede1217aac64736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000852ac0a51c27670751499360935a739e11533fe0000000000000000000000000f5a1635d136f53d3518f38b163ccccdaead78eba0000000000000000000000003671ae578e63fdf66ad4f3e12cc0c0d71ac7510c000000000000000000000000000000000000000000000000000000000000001553796e7468657469632043727970746f50756e6b730000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7343525950544f50554e4b530000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806378619bdf11610118578063b88d4fde116100a0578063d61b051b1161006f578063d61b051b1461082f578063e06d2eb51461086c578063e985e9c5146108a9578063fa540801146108e6578063fe0bc600146109235761020f565b8063b88d4fde1461074f578063b93f9b0a14610778578063c87b56dd146107b5578063c884ef83146107f25761020f565b80639d4776b2116100e75780639d4776b214610651578063a22cb4651461066d578063a7bb580314610696578063af4fb353146106d5578063b446f3b2146107125761020f565b806378619bdf1461056f57806385d940ec146105ac57806395d89b41146105e957806397aba7f9146106145761020f565b80633ccfd60b1161019b5780636352211e1161016a5780636352211e1461045057806363f8071c1461048d57806370a08231146104ca57806371a97305146105075780637685945e146105325761020f565b80633ccfd60b146103c957806342842e0e146103e05780634378a6e3146104095780634e71d92d146104465761020f565b80631581b600116101e25780631581b600146102e257806315d655c91461030d57806323b872dd146103385780632dd34f0f146103615780633b85df721461039e5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061468e565b610960565b6040516102489190615275565b60405180910390f35b34801561025d57600080fd5b506102666109f2565b604051610273919061535d565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906147a3565b610a80565b6040516102b09190615180565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190614529565b610ab3565b005b3480156102ee57600080fd5b506102f7610c9c565b6040516103049190615180565b60405180910390f35b34801561031957600080fd5b50610322610cc0565b60405161032f919061549f565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a9190614350565b610ce4565b005b34801561036d57600080fd5b50610388600480360381019061038391906144aa565b6110e4565b6040516103959190615275565b60405180910390f35b3480156103aa57600080fd5b506103b3611142565b6040516103c0919061535d565b60405180910390f35b3480156103d557600080fd5b506103de61117b565b005b3480156103ec57600080fd5b5061040760048036038101906104029190614350565b6111e4565b005b34801561041557600080fd5b50610430600480360381019061042b91906147a3565b611347565b60405161043d9190615253565b60405180910390f35b61044e611483565b005b34801561045c57600080fd5b50610477600480360381019061047291906147a3565b6115d4565b6040516104849190615180565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af91906142eb565b611607565b6040516104c1919061549f565b60405180910390f35b3480156104d657600080fd5b506104f160048036038101906104ec91906142eb565b611627565b6040516104fe919061549f565b60405180910390f35b34801561051357600080fd5b5061051c61163f565b6040516105299190615327565b60405180910390f35b34801561053e57600080fd5b50610559600480360381019061055491906147cc565b611665565b604051610566919061549f565b60405180910390f35b34801561057b57600080fd5b50610596600480360381019061059191906145d0565b6119c3565b6040516105a3919061535d565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce91906147a3565b611f8e565b6040516105e09190615253565b60405180910390f35b3480156105f557600080fd5b506105fe61261e565b60405161060b919061535d565b60405180910390f35b34801561062057600080fd5b5061063b6004803603810190610636919061463a565b6126ac565b6040516106489190615180565b60405180910390f35b61066b60048036038101906106669190614456565b61271b565b005b34801561067957600080fd5b50610694600480360381019061068f919061441a565b6128ed565b005b3480156106a257600080fd5b506106bd60048036038101906106b891906146e0565b6129ea565b6040516106cc939291906152ab565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f791906142eb565b612a52565b604051610709919061535d565b60405180910390f35b34801561071e57600080fd5b5061073960048036038101906107349190614721565b612a6c565b6040516107469190615290565b60405180910390f35b34801561075b57600080fd5b506107766004803603810190610771919061439f565b612a9c565b005b34801561078457600080fd5b5061079f600480360381019061079a91906147a3565b612c02565b6040516107ac9190615180565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d791906147a3565b612c0c565b6040516107e9919061535d565b60405180910390f35b3480156107fe57600080fd5b50610819600480360381019061081491906142eb565b612ce0565b6040516108269190615275565b60405180910390f35b34801561083b57600080fd5b50610856600480360381019061085191906147cc565b612d00565b604051610863919061549f565b60405180910390f35b34801561087857600080fd5b50610893600480360381019061088e91906147a3565b612daf565b6040516108a09190615342565b60405180910390f35b3480156108b557600080fd5b506108d060048036038101906108cb9190614314565b612ddf565b6040516108dd9190615275565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190614611565b612e0e565b60405161091a9190615290565b60405180910390f35b34801561092f57600080fd5b5061094a600480360381019061094591906142eb565b612e3e565b6040516109579190615253565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109bb57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109eb5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600080546109ff906158cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2b906158cf565b8015610a785780601f10610a4d57610100808354040283529160200191610a78565b820191906000526020600020905b815481529060010190602001808311610a5b57829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610bab5750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be19061545f565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b7f000000000000000000000000f5a1635d136f53d3518f38b163ccccdaead78eba81565b7f00000000000000000000000000000000000000000000000000470de4df82000081565b6003600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7c9061547f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec9061539f565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e8d57506004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610f1e5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f549061545f565b60405180910390fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000806110f084612a6c565b905060006110fd82612e0e565b90508573ffffffffffffffffffffffffffffffffffffffff1661112082866126ac565b73ffffffffffffffffffffffffffffffffffffffff1614925050509392505050565b6040518060400160405280601f81526020017f4d65737361676520746f20636c61696d2053796e7468657469632050756e6b0081525081565b7f000000000000000000000000f5a1635d136f53d3518f38b163ccccdaead78eba73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111e1573d6000803e3d6000fd5b50565b6111ef838383610ce4565b60008273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c511480611303575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b8152600401611290939291906151e7565b602060405180830381600087803b1580156112aa57600080fd5b505af11580156112be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e291906146b7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611342576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611339906153df565b60405180910390fd5b505050565b6060600061135483611f8e565b90506000815167ffffffffffffffff811115611399577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156113c75781602001602082028036833780820191505090505b50905060005b82518110156114785761142085848381518110611413577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611665565b828281518110611459577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061147090615901565b9150506113cd565b508092505050919050565b7f00000000000000000000000000000000000000000000000000470de4df8200003410156114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd906153bf565b60405180910390fd5b6114f8336114f333611607565b612e58565b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060007f00000000000000000000000000000000000000000000000000470de4df8200003461157e9190615785565b905060008111156115d1573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115cf573d6000803e3d6000fd5b505b50565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff169050919050565b60026020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a161b7c6040518163ffffffff1660e01b81526004016104806040518083038186803b1580156116d157600080fd5b505afa1580156116e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117099190614565565b8360098110611741577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201519050600061175385612daf565b905060018081111561178e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160018111156117c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156118c75781600160048110611807577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015182600360048110611846577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516118559190615785565b61186b8686600a61186691906156a4565b612d00565b6118759190615982565b826001600481106118af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516118be91906156a4565b925050506119bd565b81600060048110611901577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015182600260048110611940577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015161194f9190615785565b6119658686600a61196091906156a4565b612d00565b61196f9190615982565b826000600481106119a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516119b891906156a4565b925050505b92915050565b60606000604051806101a001604052806101678152602001615baa610167913990506000604051806060016040528060268152602001615b8460269139905060006040518060400160405280600c81526020017f3c2f7376673e3c2f7376673e00000000000000000000000000000000000000008152509050600060405180602001604052806000815250905060005b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a161b7c6040518163ffffffff1660e01b81526004016104806040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af49190614565565b506009811015611eb65760005b8751811015611ea257878181518110611b43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a161b7c6040518163ffffffff1660e01b81526004016104806040518083038186803b158015611bb457600080fd5b505afa158015611bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bec9190614565565b8360098110611c24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600060048110611c62577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015111158015611dcf5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a161b7c6040518163ffffffff1660e01b81526004016104806040518083038186803b158015611cd957600080fd5b505afa158015611ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d119190614565565b8260098110611d49577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600360048110611d87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151888281518110611dc5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151105b15611e8f576000888281518110611e0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600060188083611e299190615982565b611e33919061572b565b9050600060188084611e4591906156fa565b611e4f919061572b565b905085611e5b83612fba565b611e6483612fba565b604051602001611e769392919061507e565b6040516020818303038152906040529550505050611ea2565b8080611e9a90615901565b915050611b01565b508080611eae90615901565b915050611a53565b5083600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166360787be36040518163ffffffff1660e01b815260040160006040518083038186803b158015611f2057600080fd5b505afa158015611f34573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f5d9190614762565b848385604051602001611f74959493929190615033565b604051602081830303815290604052945050505050919050565b60606000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a161b7c6040518163ffffffff1660e01b81526004016104806040518083038186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120339190614565565b90506000600360096120459190615785565b612050856001612d00565b61205a9190615982565b600261206691906156a4565b905060008167ffffffffffffffff8111156120aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156120d85781602001602082028036833780820191505090505b5090506000805b838110156124985760006001600260096120f99190615785565b61210f8a85600261210a91906156a4565b612d00565b6121199190615982565b61212391906156a4565b9050600061213185836130c3565b90508015612140575050612485565b600180811115612179577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6121828a612daf565b60018111156121ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156123235760008783600981106121fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600160048110612239577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151888460098110612277577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516003600481106122b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516122c49190615785565b1461231e5781858581518110612303577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050838061231a90615901565b9450505b612482565b600087836009811061235e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160006004811061239c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518884600981106123da577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600260048110612418577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516124279190615785565b146124815781858581518110612466577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050838061247d90615901565b9450505b5b50505b808061249090615901565b9150506120df565b5060006001826124a891906156a4565b67ffffffffffffffff8111156124e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156125155781602001602082028036833780820191505090505b509050600081600081518110612554577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060005b82811015612610578381815181106125a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151826001836125ba91906156a4565b815181106125f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061260890615901565b915050612563565b508095505050505050919050565b6001805461262b906158cf565b80601f0160208091040260200160405190810160405280929190818152602001828054612657906158cf565b80156126a45780601f10612679576101008083540402835291602001916126a4565b820191906000526020600020905b81548152906001019060200180831161268757829003601f168201915b505050505081565b6000806000806126bb856129ea565b925092509250600186828585604051600081526020016040526040516126e494939291906152e2565b6020604051602081039080840390855afa158015612706573d6000803e3d6000fd5b50505060206040510351935050505092915050565b7f00000000000000000000000000000000000000000000000000470de4df82000034101561277e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612775906153bf565b60405180910390fd5b6127be826040518060400160405280601f81526020017f4d65737361676520746f20636c61696d2053796e7468657469632050756e6b00815250836110e4565b6127fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f49061537f565b60405180910390fd5b61280f3361280a84611607565b612e58565b6001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060007f00000000000000000000000000000000000000000000000000470de4df820000346128959190615785565b905060008111156128e8578273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156128e6573d6000803e3d6000fd5b505b505050565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129de9190615275565b60405180910390a35050565b60008060006041845114612a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2a9061541f565b60405180910390fd5b6020840151925060408401519150606084015160001a90509193909250565b6060612a65612a6083611607565b612c0c565b9050919050565b600081604051602001612a7f919061501c565b604051602081830303815290604052805190602001209050919050565b612aa7848484610ce4565b60008373ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c511480612bbd575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b8152600401612b4a949392919061519b565b602060405180830381600087803b158015612b6457600080fd5b505af1158015612b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9c91906146b7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b612bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf3906153df565b60405180910390fd5b50505050565b6000819050919050565b60606000612c1983611347565b90506000612c26826119c3565b90506000612c3385612c02565b90506000612c4082613145565b9050600080825114612c525781612c5c565b612c5b83613388565b5b9050600080835114612c6e5782612c78565b612c7784613696565b5b90506000612cb08383612c8a896136c7565b604051602001612c9c939291906150f6565b6040516020818303038152906040526136c7565b905080604051602001612cc3919061515e565b604051602081830303815290604052975050505050505050919050565b60076020528060005260406000206000915054906101000a900460ff1681565b600060208210612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c906153ff565b60405180910390fd5b60003084604051602001612d5a929190614ff0565b6040516020818303038152906040528051906020012090506000600884612d81919061572b565b60ff901b60001b90506000600885612d99919061572b565b828416901c60001c905080935050505092915050565b6000806002612dbf846000612d00565b612dc99190615982565b14612dd5576001612dd8565b60005b9050919050565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600081604051602001612e2191906150d0565b604051602081830303815290604052805190602001209050919050565b6060612e51612e4c83611607565b611347565b9050919050565b612e62828261388c565b60008273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c511480612f77575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a02336000856040518463ffffffff1660e01b8152600401612f04939291906151e7565b602060405180830381600087803b158015612f1e57600080fd5b505af1158015612f32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5691906146b7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b612fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fad906153df565b60405180910390fd5b5050565b60606000604e90506000603090506000841415613010576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250925050506130be565b8167ffffffffffffffff811115613050577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130825781602001600182028036833780820191505090505b50925060008290505b600085146130b057600a850682018082860152600182039150600a860495505061308b565b808401935080830384525050505b919050565b600080600090505b8351811015613139578284828151811061310e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151141561312657600191505061313f565b808061313190615901565b9150506130cb565b50600090505b92915050565b60607f0000000000000000000000003671ae578e63fdf66ad4f3e12cc0c0d71ac7510c73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614156131a157613383565b60007f0000000000000000000000003671ae578e63fdf66ad4f3e12cc0c0d71ac7510c90506000600167ffffffffffffffff811115613209577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156132375781602001602082028036833780820191505090505b5090508381600081518110613275577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1663cbf8b66c826040518263ffffffff1660e01b81526004016132e89190615231565b60006040518083038186803b15801561330057600080fd5b505afa158015613314573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061333d919061458f565b600081518110613376577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151925050505b919050565b6060600061339583613696565b905060008190506000600d67ffffffffffffffff8111156133df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134115781602001600182028036833780820191505090505b5090506000805b60068110156134ec5783818151811061345a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b83838061347190615901565b9450815181106134aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806134e490615901565b915050613418565b5060005b60038110156135a1577f2e0000000000000000000000000000000000000000000000000000000000000083838061352690615901565b94508151811061355f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061359990615901565b9150506134f0565b506000600484516135b29190615785565b90505b8351811015613689578381815181106135f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b83838061360e90615901565b945081518110613647577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061368190615901565b9150506135b5565b5081945050505050919050565b60606136c0826040516020016136ac9190614fd5565b604051602081830303815290604052613a9f565b9050919050565b60606000604051806060016040528060408152602001615b44604091399050600083519050600081141561370e576040518060200160405280600081525092505050613887565b6000600360028361371f91906156a4565b61372991906156fa565b6004613735919061572b565b9050600060208261374691906156a4565b67ffffffffffffffff811115613785577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137b75781602001600182028036833780820191505090505b5090506000849050600181016020830160005b868110156138435760038101905062ffffff818b015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506137ca565b50600386066001811461385d576002811461386d57613878565b613d3d60f01b6002830352613878565b603d60f81b60018303525b50848452505081955050505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f39061539f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461399e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139959061543f565b60405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606060006040518060400160405280601081526020017f30313233343536373839616263646566000000000000000000000000000000008152509050600060028451613aeb919061572b565b6002613af791906156a4565b67ffffffffffffffff811115613b36577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613b685781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613bc6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613c50577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b8451811015613ee457826004868381518110613cc7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff1681518110613d33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b82600283613d4c919061572b565b6002613d5891906156a4565b81518110613d8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535082600f60f81b868381518110613dfd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b1660f81c60ff1681518110613e46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b82600283613e5f919061572b565b6003613e6b91906156a4565b81518110613ea2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080613edc90615901565b915050613c82565b508092505050919050565b6000613f02613efd846154eb565b6154ba565b90508082856080860282011115613f1857600080fd5b60005b85811015613f485781613f2e888261419e565b845260208401935060808301925050600181019050613f1b565b5050509392505050565b6000613f65613f6084615511565b6154ba565b9050808382526020820190508260005b85811015613fa55781518501613f8b8882614297565b845260208401935060208301925050600181019050613f75565b5050509392505050565b6000613fc2613fbd8461553d565b6154ba565b90508082856020860282011115613fd857600080fd5b60005b858110156140085781613fee88826142d6565b845260208401935060208301925050600181019050613fdb565b5050509392505050565b600061402561402084615563565b6154ba565b9050808382526020820190508285602086028201111561404457600080fd5b60005b85811015614074578161405a88826142c1565b845260208401935060208301925050600181019050614047565b5050509392505050565b600061409161408c8461558f565b6154ba565b9050828152602081018484840111156140a957600080fd5b6140b484828561588d565b509392505050565b60006140cf6140ca846155bf565b6154ba565b9050828152602081018484840111156140e757600080fd5b6140f284828561588d565b509392505050565b600061410d614108846155bf565b6154ba565b90508281526020810184848401111561412557600080fd5b61413084828561589c565b509392505050565b60008135905061414781615ad0565b92915050565b600082601f83011261415e57600080fd5b600961416b848285613eef565b91505092915050565b600082601f83011261418557600080fd5b8151614195848260208601613f52565b91505092915050565b600082601f8301126141af57600080fd5b60046141bc848285613faf565b91505092915050565b600082601f8301126141d657600080fd5b81356141e6848260208601614012565b91505092915050565b6000813590506141fe81615ae7565b92915050565b60008135905061421381615afe565b92915050565b60008135905061422881615b15565b92915050565b60008151905061423d81615b15565b92915050565b600082601f83011261425457600080fd5b813561426484826020860161407e565b91505092915050565b600082601f83011261427e57600080fd5b813561428e8482602086016140bc565b91505092915050565b600082601f8301126142a857600080fd5b81516142b88482602086016140fa565b91505092915050565b6000813590506142d081615b2c565b92915050565b6000815190506142e581615b2c565b92915050565b6000602082840312156142fd57600080fd5b600061430b84828501614138565b91505092915050565b6000806040838503121561432757600080fd5b600061433585828601614138565b925050602061434685828601614138565b9150509250929050565b60008060006060848603121561436557600080fd5b600061437386828701614138565b935050602061438486828701614138565b9250506040614395868287016142c1565b9150509250925092565b600080600080608085870312156143b557600080fd5b60006143c387828801614138565b94505060206143d487828801614138565b93505060406143e5878288016142c1565b925050606085013567ffffffffffffffff81111561440257600080fd5b61440e87828801614243565b91505092959194509250565b6000806040838503121561442d57600080fd5b600061443b85828601614138565b925050602061444c858286016141ef565b9150509250929050565b6000806040838503121561446957600080fd5b600061447785828601614138565b925050602083013567ffffffffffffffff81111561449457600080fd5b6144a085828601614243565b9150509250929050565b6000806000606084860312156144bf57600080fd5b60006144cd86828701614138565b935050602084013567ffffffffffffffff8111156144ea57600080fd5b6144f68682870161426d565b925050604084013567ffffffffffffffff81111561451357600080fd5b61451f86828701614243565b9150509250925092565b6000806040838503121561453c57600080fd5b600061454a85828601614138565b925050602061455b858286016142c1565b9150509250929050565b6000610480828403121561457857600080fd5b60006145868482850161414d565b91505092915050565b6000602082840312156145a157600080fd5b600082015167ffffffffffffffff8111156145bb57600080fd5b6145c784828501614174565b91505092915050565b6000602082840312156145e257600080fd5b600082013567ffffffffffffffff8111156145fc57600080fd5b614608848285016141c5565b91505092915050565b60006020828403121561462357600080fd5b600061463184828501614204565b91505092915050565b6000806040838503121561464d57600080fd5b600061465b85828601614204565b925050602083013567ffffffffffffffff81111561467857600080fd5b61468485828601614243565b9150509250929050565b6000602082840312156146a057600080fd5b60006146ae84828501614219565b91505092915050565b6000602082840312156146c957600080fd5b60006146d78482850161422e565b91505092915050565b6000602082840312156146f257600080fd5b600082013567ffffffffffffffff81111561470c57600080fd5b61471884828501614243565b91505092915050565b60006020828403121561473357600080fd5b600082013567ffffffffffffffff81111561474d57600080fd5b6147598482850161426d565b91505092915050565b60006020828403121561477457600080fd5b600082015167ffffffffffffffff81111561478e57600080fd5b61479a84828501614297565b91505092915050565b6000602082840312156147b557600080fd5b60006147c3848285016142c1565b91505092915050565b600080604083850312156147df57600080fd5b60006147ed858286016142c1565b92505060206147fe858286016142c1565b9150509250929050565b60006148148383614838565b60208301905092915050565b600061482c8383614f91565b60208301905092915050565b614841816157b9565b82525050565b614850816157b9565b82525050565b614867614862826157b9565b61594a565b82525050565b60006148788261560f565b6148828185615655565b935061488d836155ef565b8060005b838110156148be5781516148a58882614808565b97506148b08361563b565b925050600181019050614891565b5085935050505092915050565b60006148d68261561a565b6148e08185615666565b93506148eb836155ff565b8060005b8381101561491c5781516149038882614820565b975061490e83615648565b9250506001810190506148ef565b5085935050505092915050565b614932816157cb565b82525050565b614941816157d7565b82525050565b614958614953826157d7565b61595c565b82525050565b600061496982615625565b6149738185615677565b935061498381856020860161589c565b61498c81615a9e565b840191505092915050565b6149a081615857565b82525050565b6149af8161587b565b82525050565b60006149c082615630565b6149ca8185615688565b93506149da81856020860161589c565b6149e381615a9e565b840191505092915050565b60006149f982615630565b614a038185615699565b9350614a1381856020860161589c565b80840191505092915050565b6000614a2c601c83615699565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b6000614a6c601183615688565b91507f496e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000614aac602583615699565b91507f3c7376672077696474683d22323422206865696768743d22323422207669657760008301527f426f783d220000000000000000000000000000000000000000000000000000006020830152602582019050919050565b6000614b12601983615699565b91507f53796e7468657469632043727970746f50756e6b20666f7220000000000000006000830152601982019050919050565b6000614b52601183615688565b91507f494e56414c49445f524543495049454e540000000000000000000000000000006000830152602082019050919050565b6000614b92600183615699565b91507f20000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614bd2600283615699565b91507f227d0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000614c12601483615688565b91507f496e73756666696369656e74207061796d656e740000000000000000000000006000830152602082019050919050565b6000614c52603483615699565b91507f222c20226465736372697074696f6e223a202254686973206973206120756e6960008301527f7175652050756e6b20636c61696d6564206279200000000000000000000000006020830152603482019050919050565b6000614cb8601083615688565b91507f554e534146455f524543495049454e54000000000000000000000000000000006000830152602082019050919050565b6000614cf8600a83615699565b91507f7b226e616d65223a2022000000000000000000000000000000000000000000006000830152600a82019050919050565b6000614d38602883615699565b91507f2e222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c60008301527f3b6261736536342c0000000000000000000000000000000000000000000000006020830152602882019050919050565b6000614d9e601d83615699565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b6000614dde601483615688565b91507f4f6666736574206f7574206f6620626f756e64730000000000000000000000006000830152602082019050919050565b6000614e1e600083615677565b9150600082019050919050565b6000614e38602d83615699565b91507f203234203234223e3c75736520687265663d222373707269746573686565742260008301527f3e3c2f7573653e3c2f7376673e000000000000000000000000000000000000006020830152602d82019050919050565b6000614e9e601883615688565b91507f696e76616c6964207369676e6174757265206c656e67746800000000000000006000830152602082019050919050565b6000614ede600e83615688565b91507f414c52454144595f4d494e5445440000000000000000000000000000000000006000830152602082019050919050565b6000614f1e600e83615688565b91507f4e4f545f415554484f52495a45440000000000000000000000000000000000006000830152602082019050919050565b6000614f5e600a83615688565b91507f57524f4e475f46524f4d000000000000000000000000000000000000000000006000830152602082019050919050565b614f9a81615840565b82525050565b614fa981615840565b82525050565b614fc0614fbb82615840565b615978565b82525050565b614fcf8161584a565b82525050565b6000614fe18284614856565b60148201915081905092915050565b6000614ffc8285614856565b60148201915061500c8284614faf565b6020820191508190509392505050565b600061502882846149ee565b915081905092915050565b600061503f82886149ee565b915061504b82876149ee565b915061505782866149ee565b915061506382856149ee565b915061506f82846149ee565b91508190509695505050505050565b600061508a82866149ee565b915061509582614a9f565b91506150a182856149ee565b91506150ac82614b85565b91506150b882846149ee565b91506150c382614e2b565b9150819050949350505050565b60006150db82614a1f565b91506150e78284614947565b60208201915081905092915050565b600061510182614ceb565b915061510c82614b05565b915061511882866149ee565b915061512382614c45565b915061512f82856149ee565b915061513a82614d2b565b915061514682846149ee565b915061515182614bc5565b9150819050949350505050565b600061516982614d91565b915061517582846149ee565b915081905092915050565b60006020820190506151956000830184614847565b92915050565b60006080820190506151b06000830187614847565b6151bd6020830186614847565b6151ca6040830185614fa0565b81810360608301526151dc818461495e565b905095945050505050565b60006080820190506151fc6000830186614847565b6152096020830185614847565b6152166040830184614fa0565b818103606083015261522781614e11565b9050949350505050565b6000602082019050818103600083015261524b818461486d565b905092915050565b6000602082019050818103600083015261526d81846148cb565b905092915050565b600060208201905061528a6000830184614929565b92915050565b60006020820190506152a56000830184614938565b92915050565b60006060820190506152c06000830186614938565b6152cd6020830185614938565b6152da6040830184614fc6565b949350505050565b60006080820190506152f76000830187614938565b6153046020830186614fc6565b6153116040830185614938565b61531e6060830184614938565b95945050505050565b600060208201905061533c6000830184614997565b92915050565b600060208201905061535760008301846149a6565b92915050565b6000602082019050818103600083015261537781846149b5565b905092915050565b6000602082019050818103600083015261539881614a5f565b9050919050565b600060208201905081810360008301526153b881614b45565b9050919050565b600060208201905081810360008301526153d881614c05565b9050919050565b600060208201905081810360008301526153f881614cab565b9050919050565b6000602082019050818103600083015261541881614dd1565b9050919050565b6000602082019050818103600083015261543881614e91565b9050919050565b6000602082019050818103600083015261545881614ed1565b9050919050565b6000602082019050818103600083015261547881614f11565b9050919050565b6000602082019050818103600083015261549881614f51565b9050919050565b60006020820190506154b46000830184614fa0565b92915050565b6000604051905081810181811067ffffffffffffffff821117156154e1576154e0615a6f565b5b8060405250919050565b600067ffffffffffffffff82111561550657615505615a6f565b5b602082029050919050565b600067ffffffffffffffff82111561552c5761552b615a6f565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561555857615557615a6f565b5b602082029050919050565b600067ffffffffffffffff82111561557e5761557d615a6f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156155aa576155a9615a6f565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156155da576155d9615a6f565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006156af82615840565b91506156ba83615840565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156156ef576156ee6159b3565b5b828201905092915050565b600061570582615840565b915061571083615840565b9250826157205761571f6159e2565b5b828204905092915050565b600061573682615840565b915061574183615840565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561577a576157796159b3565b5b828202905092915050565b600061579082615840565b915061579b83615840565b9250828210156157ae576157ad6159b3565b5b828203905092915050565b60006157c482615820565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061581b82615abc565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061586282615869565b9050919050565b600061587482615820565b9050919050565b60006158868261580d565b9050919050565b82818337600083830152505050565b60005b838110156158ba57808201518184015260208101905061589f565b838111156158c9576000848401525b50505050565b600060028204905060018216806158e757607f821691505b602082108114156158fb576158fa615a40565b5b50919050565b600061590c82615840565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561593f5761593e6159b3565b5b600182019050919050565b600061595582615966565b9050919050565b6000819050919050565b600061597182615aaf565b9050919050565b6000819050919050565b600061598d82615840565b915061599883615840565b9250826159a8576159a76159e2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60028110615acd57615acc615a11565b5b50565b615ad9816157b9565b8114615ae457600080fd5b50565b615af0816157cb565b8114615afb57600080fd5b50565b615b07816157d7565b8114615b1257600080fd5b50565b615b1e816157e1565b8114615b2957600080fd5b50565b615b3581615840565b8114615b4057600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f223e3c2f696d6167653e3c2f7376673e3c2f646566733e3c7376672069643d2270756e6b223e3c7376672076696577426f783d22302030203234203234222077696474683d22313030302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722203e3c646566733e3c7374796c653e237370726974657368656574207b20696d6167652d72656e646572696e673a202d7765626b69742d6f7074696d697a652d636f6e74726173743b20696d6167652d72656e646572696e673a2063726973702d65646765733b20696d6167652d72656e646572696e673a20706978656c617465643b207d20737667207b206261636b67726f756e64203a20233141314131413b207d3c2f7374796c653e3c7376672077696474683d22323422206865696768743d223234222076696577426f783d2234382030203234203234223e3c696d6167652069643d22737072697465736865657422207072657365727665417370656374526174696f3d22784d696e594d696e20736c6963652220687265663d22a264697066735822122019e8a97e700092f7524391bbdbe5fd004d9f981c29ab8b0f1d9bd6ede1217aac64736f6c63430008000033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000852ac0a51c27670751499360935a739e11533fe0000000000000000000000000f5a1635d136f53d3518f38b163ccccdaead78eba0000000000000000000000003671ae578e63fdf66ad4f3e12cc0c0d71ac7510c000000000000000000000000000000000000000000000000000000000000001553796e7468657469632043727970746f50756e6b730000000000000000000000000000000000000000000000000000000000000000000000000000000000000c7343525950544f50554e4b530000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Synthetic CryptoPunks
Arg [1] : _symbol (string): sCRYPTOPUNKS
Arg [2] : _assetsAddress (address): 0x852aC0A51C27670751499360935a739E11533Fe0
Arg [3] : _withdrawAddress (address): 0xf5a1635d136F53d3518F38B163CcCcDaeAd78EbA
Arg [4] : _ensReverseAddress (address): 0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 000000000000000000000000852ac0a51c27670751499360935a739e11533fe0
Arg [3] : 000000000000000000000000f5a1635d136f53d3518f38b163ccccdaead78eba
Arg [4] : 0000000000000000000000003671ae578e63fdf66ad4f3e12cc0c0d71ac7510c
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [6] : 53796e7468657469632043727970746f50756e6b730000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [8] : 7343525950544f50554e4b530000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.